@outlit/cli 3.2.2 → 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 +2529 -367
  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.2",
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.1",
150
+ "@outlit/tools": "^2.2.3",
151
151
  citty: "^0.2.1"
152
152
  },
153
153
  devDependencies: {
@@ -1742,6 +1742,7 @@ var init_dist4 = __esm(() => {
1742
1742
  "outlit_enable_destination",
1743
1743
  "outlit_disable_destination",
1744
1744
  "outlit_archive_destination",
1745
+ "outlit_submit_feedback",
1745
1746
  "outlit_get_integration_capabilities",
1746
1747
  "outlit_begin_integration_setup",
1747
1748
  "outlit_get_integration_setup_status",
@@ -1763,7 +1764,11 @@ var init_dist4 = __esm(() => {
1763
1764
  "outlit_list_identity_merge_suggestions",
1764
1765
  "outlit_reject_identity_merge_suggestion",
1765
1766
  "outlit_merge_customers",
1766
- "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"
1767
1772
  ];
1768
1773
  publicToolContracts = {
1769
1774
  outlit_list_customers: {
@@ -1772,7 +1777,11 @@ var init_dist4 = __esm(() => {
1772
1777
  commandVersion: 1,
1773
1778
  ownerDomain: "customers",
1774
1779
  title: "List Customers",
1775
- 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.",
1781
+ annotations: {
1782
+ readOnlyHint: true,
1783
+ destructiveHint: false
1784
+ },
1776
1785
  inputSchema: {
1777
1786
  $schema: "https://json-schema.org/draft/2020-12/schema",
1778
1787
  type: "object",
@@ -1815,12 +1824,12 @@ var init_dist4 = __esm(() => {
1815
1824
  ]
1816
1825
  },
1817
1826
  mrrAbove: {
1818
- 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)",
1819
1828
  type: "number",
1820
1829
  minimum: 0
1821
1830
  },
1822
1831
  mrrBelow: {
1823
- description: "Maximum MRR in cents",
1832
+ description: "Maximum MRR, in currentMrr's units",
1824
1833
  type: "number",
1825
1834
  minimum: 0
1826
1835
  },
@@ -1983,7 +1992,8 @@ var init_dist4 = __esm(() => {
1983
1992
  {
1984
1993
  type: "null"
1985
1994
  }
1986
- ]
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."
1987
1997
  },
1988
1998
  mrrCalculationStatus: {
1989
1999
  type: "string",
@@ -2094,6 +2104,10 @@ var init_dist4 = __esm(() => {
2094
2104
  ownerDomain: "users",
2095
2105
  title: "List Users",
2096
2106
  description: "Browse and filter users. Use this to find users by journey stage, activity recency, customer, or email/name. Returns a paginated list with activity info.",
2107
+ annotations: {
2108
+ readOnlyHint: true,
2109
+ destructiveHint: false
2110
+ },
2097
2111
  inputSchema: {
2098
2112
  $schema: "https://json-schema.org/draft/2020-12/schema",
2099
2113
  type: "object",
@@ -2374,6 +2388,10 @@ var init_dist4 = __esm(() => {
2374
2388
  ownerDomain: "users",
2375
2389
  title: "List Workspace Users",
2376
2390
  description: "List active workspace members who resolve to local Outlit users. Use this to discover exact user IDs for customer ownership and access commands or to browse account ownership.",
2391
+ annotations: {
2392
+ readOnlyHint: true,
2393
+ destructiveHint: false
2394
+ },
2377
2395
  inputSchema: {
2378
2396
  $schema: "https://json-schema.org/draft/2020-12/schema",
2379
2397
  type: "object",
@@ -2560,7 +2578,11 @@ var init_dist4 = __esm(() => {
2560
2578
  commandVersion: 1,
2561
2579
  ownerDomain: "customers",
2562
2580
  title: "Get Customer",
2563
- 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.",
2582
+ annotations: {
2583
+ readOnlyHint: true,
2584
+ destructiveHint: false
2585
+ },
2564
2586
  inputSchema: {
2565
2587
  $schema: "https://json-schema.org/draft/2020-12/schema",
2566
2588
  type: "object",
@@ -2826,7 +2848,8 @@ var init_dist4 = __esm(() => {
2826
2848
  {
2827
2849
  type: "null"
2828
2850
  }
2829
- ]
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."
2830
2853
  },
2831
2854
  mrrCalculationStatus: {
2832
2855
  type: "string",
@@ -2837,7 +2860,8 @@ var init_dist4 = __esm(() => {
2837
2860
  ]
2838
2861
  },
2839
2862
  lifetimeRevenue: {
2840
- 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."
2841
2865
  },
2842
2866
  activeSubscriptions: {
2843
2867
  type: "integer",
@@ -3363,6 +3387,10 @@ var init_dist4 = __esm(() => {
3363
3387
  ownerDomain: "customers",
3364
3388
  title: "Get Customer Relationship",
3365
3389
  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.",
3390
+ annotations: {
3391
+ readOnlyHint: true,
3392
+ destructiveHint: false
3393
+ },
3366
3394
  inputSchema: {
3367
3395
  $schema: "https://json-schema.org/draft/2020-12/schema",
3368
3396
  type: "object",
@@ -3514,6 +3542,10 @@ var init_dist4 = __esm(() => {
3514
3542
  ownerDomain: "customers",
3515
3543
  title: "Assign Customer Owner",
3516
3544
  description: "Assign an active workspace member as this customer’s primary owner. The former owner keeps Editor access.",
3545
+ annotations: {
3546
+ readOnlyHint: false,
3547
+ destructiveHint: false
3548
+ },
3517
3549
  inputSchema: {
3518
3550
  $schema: "https://json-schema.org/draft/2020-12/schema",
3519
3551
  type: "object",
@@ -3570,6 +3602,10 @@ var init_dist4 = __esm(() => {
3570
3602
  ownerDomain: "customers",
3571
3603
  title: "Grant Customer Access",
3572
3604
  description: "Share a customer with an active workspace member as a Viewer or Editor. The customer ID must be exact.",
3605
+ annotations: {
3606
+ readOnlyHint: false,
3607
+ destructiveHint: false
3608
+ },
3573
3609
  inputSchema: {
3574
3610
  $schema: "https://json-schema.org/draft/2020-12/schema",
3575
3611
  type: "object",
@@ -3651,6 +3687,10 @@ var init_dist4 = __esm(() => {
3651
3687
  ownerDomain: "customers",
3652
3688
  title: "Update Customer Access",
3653
3689
  description: "Change an existing customer collaborator between Viewer and Editor.",
3690
+ annotations: {
3691
+ readOnlyHint: false,
3692
+ destructiveHint: false
3693
+ },
3654
3694
  inputSchema: {
3655
3695
  $schema: "https://json-schema.org/draft/2020-12/schema",
3656
3696
  type: "object",
@@ -3732,6 +3772,10 @@ var init_dist4 = __esm(() => {
3732
3772
  ownerDomain: "customers",
3733
3773
  title: "Revoke Customer Access",
3734
3774
  description: "Remove a collaborator’s explicit access to a customer.",
3775
+ annotations: {
3776
+ readOnlyHint: false,
3777
+ destructiveHint: true
3778
+ },
3735
3779
  inputSchema: {
3736
3780
  $schema: "https://json-schema.org/draft/2020-12/schema",
3737
3781
  type: "object",
@@ -3776,7 +3820,11 @@ var init_dist4 = __esm(() => {
3776
3820
  commandVersion: 1,
3777
3821
  ownerDomain: "customer-context",
3778
3822
  title: "Get Customer Timeline",
3779
- description: "Get the chronological activity timeline for a customer. Use this to see what happened and when — emails, calls, Slack messages, billing events, etc. Supports channel and date filtering.",
3823
+ description: 'Get the chronological activity timeline for a customer — compact event entries by default, so unfiltered calls stay small. When channels is omitted the response covers the relationship chronology (communication, meetings, support, CRM, billing). Pass channels:["PRODUCT"] to add a weekly product-usage aggregate; set productDetail to "material" or "raw" to also return individual product events. Set includeMetadata:true only when a specific event metadata field is needed; pass sourceType/sourceId or sourceRef to outlit_get_source to read a full underlying record.',
3824
+ annotations: {
3825
+ readOnlyHint: true,
3826
+ destructiveHint: false
3827
+ },
3780
3828
  inputSchema: {
3781
3829
  $schema: "https://json-schema.org/draft/2020-12/schema",
3782
3830
  type: "object",
@@ -3788,7 +3836,7 @@ var init_dist4 = __esm(() => {
3788
3836
  description: "Customer ID or domain"
3789
3837
  },
3790
3838
  channels: {
3791
- description: "Filter by event channel. Use values such as PRODUCT, COMMUNICATION, MEETING, CRM, BILLING, SUPPORT, IDENTITY, DOCUMENT, or SYSTEM.",
3839
+ description: 'Filter by event channel. When omitted, defaults to the relationship channels COMMUNICATION, MEETING, SUPPORT, CRM, and BILLING. PRODUCT, IDENTITY, DOCUMENT, and SYSTEM are included only when listed here. Pass channels:["PRODUCT"] to read the weekly product usage aggregate, and combine with productDetail to also return individual product events.',
3792
3840
  type: "array",
3793
3841
  items: {
3794
3842
  type: "string",
@@ -3805,6 +3853,19 @@ var init_dist4 = __esm(() => {
3805
3853
  ]
3806
3854
  }
3807
3855
  },
3856
+ productDetail: {
3857
+ description: 'Controls whether PRODUCT-channel rows appear in `events` when channels includes PRODUCT. "none" (default): product activity is returned only as the `product` weekly usage aggregate — no product telemetry rows. "material": also include individual product events that match the organization\'s configured value-feature event names (each keeps an `id` usable for citations); when the organization has no configured value features this returns no product rows, but the `product` aggregate is still returned. "raw": include every product event, including autocapture, pageview, feature-flag, and identity telemetry — large; request only when the aggregate and material events are insufficient.',
3858
+ type: "string",
3859
+ enum: [
3860
+ "none",
3861
+ "material",
3862
+ "raw"
3863
+ ]
3864
+ },
3865
+ includeMetadata: {
3866
+ description: "Include each event's raw metadata/properties payload. Default false: events return compact fields only, keeping the response small. Pass true only when a specific metadata field is needed.",
3867
+ type: "boolean"
3868
+ },
3808
3869
  eventTypes: {
3809
3870
  description: "Filter by event type",
3810
3871
  type: "array",
@@ -3861,7 +3922,8 @@ var init_dist4 = __esm(() => {
3861
3922
  type: "object",
3862
3923
  properties: {
3863
3924
  id: {
3864
- type: "string"
3925
+ type: "string",
3926
+ description: "Stable event identifier. Pass as timeline_event eventId when citing this event."
3865
3927
  },
3866
3928
  eventType: {
3867
3929
  type: "string"
@@ -3901,7 +3963,8 @@ var init_dist4 = __esm(() => {
3901
3963
  {
3902
3964
  type: "null"
3903
3965
  }
3904
- ]
3966
+ ],
3967
+ description: "Bounded display summary, truncated past roughly 2 KB. Use outlit_get_source on sourceType/sourceId for the full underlying content."
3905
3968
  },
3906
3969
  occurredAt: {
3907
3970
  type: "string",
@@ -3939,6 +4002,7 @@ var init_dist4 = __esm(() => {
3939
4002
  ]
3940
4003
  },
3941
4004
  sourceRef: {
4005
+ description: "Canonical source handle for this event, emitted only when outlit_get_source can retrieve the underlying record; omitted when the event is marked unreadable.",
3942
4006
  type: "object",
3943
4007
  properties: {
3944
4008
  sourceType: {
@@ -3954,7 +4018,17 @@ var init_dist4 = __esm(() => {
3954
4018
  ],
3955
4019
  additionalProperties: false
3956
4020
  },
4021
+ unreadable: {
4022
+ description: "Present only when the event's underlying source record cannot be retrieved via outlit_get_source. Do not retry source lookups for this event.",
4023
+ type: "boolean",
4024
+ const: true
4025
+ },
4026
+ unreadableReason: {
4027
+ description: "Why the event's source is unreadable, e.g. unresolved_source or ambiguous_source.",
4028
+ type: "string"
4029
+ },
3957
4030
  metadata: {
4031
+ description: "Raw event properties. Present only when the request set includeMetadata:true.",
3958
4032
  type: "object",
3959
4033
  propertyNames: {
3960
4034
  type: "string"
@@ -3972,8 +4046,7 @@ var init_dist4 = __esm(() => {
3972
4046
  "occurredAt",
3973
4047
  "contact",
3974
4048
  "sourceType",
3975
- "sourceId",
3976
- "metadata"
4049
+ "sourceId"
3977
4050
  ],
3978
4051
  additionalProperties: false
3979
4052
  }
@@ -3993,11 +4066,112 @@ var init_dist4 = __esm(() => {
3993
4066
  type: "null"
3994
4067
  }
3995
4068
  ]
4069
+ },
4070
+ effectiveLimit: {
4071
+ type: "integer",
4072
+ minimum: 1,
4073
+ maximum: 9007199254740991,
4074
+ description: "The maximum number of events a page of this response can contain. Responses can hold fewer events than requested when hosted response-size limits apply; callers should rely on pagination.hasMore/nextCursor rather than event count to detect truncation."
3996
4075
  }
3997
4076
  },
3998
4077
  required: [
3999
4078
  "hasMore",
4000
- "nextCursor"
4079
+ "nextCursor",
4080
+ "effectiveLimit"
4081
+ ],
4082
+ additionalProperties: false
4083
+ },
4084
+ product: {
4085
+ description: 'Present when the request\'s channels include PRODUCT. Weekly product usage aggregate for the requested window: value-feature event counts and distinct active users per UTC week, plus the window\'s top value-feature event names. Individual product events appear in `events` only when productDetail is "material" or "raw".',
4086
+ type: "object",
4087
+ properties: {
4088
+ windowStartAt: {
4089
+ type: "string",
4090
+ format: "date-time",
4091
+ 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))$",
4092
+ description: "Start of the aggregate coverage window: the UTC week containing the requested start (or the earliest retained week)."
4093
+ },
4094
+ windowEndAt: {
4095
+ type: "string",
4096
+ format: "date-time",
4097
+ 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))$",
4098
+ description: "End of the aggregate coverage window (the request end bound)"
4099
+ },
4100
+ weeklyBuckets: {
4101
+ type: "array",
4102
+ items: {
4103
+ type: "object",
4104
+ properties: {
4105
+ weekStartAt: {
4106
+ type: "string",
4107
+ format: "date-time",
4108
+ 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))$",
4109
+ description: "Start of the bucket's UTC week (Monday 00:00:00Z)"
4110
+ },
4111
+ events: {
4112
+ type: "integer",
4113
+ minimum: 0,
4114
+ maximum: 9007199254740991,
4115
+ description: "Events in this week matching the organization's configured value features"
4116
+ },
4117
+ activeUsers: {
4118
+ type: "integer",
4119
+ minimum: 0,
4120
+ maximum: 9007199254740991,
4121
+ description: "Distinct users with product activity this week"
4122
+ }
4123
+ },
4124
+ required: [
4125
+ "weekStartAt",
4126
+ "events",
4127
+ "activeUsers"
4128
+ ],
4129
+ additionalProperties: false
4130
+ },
4131
+ description: "UTC week buckets covering the requested window, oldest first"
4132
+ },
4133
+ topEventNames: {
4134
+ type: "array",
4135
+ items: {
4136
+ type: "object",
4137
+ properties: {
4138
+ eventName: {
4139
+ type: "string"
4140
+ },
4141
+ events: {
4142
+ type: "integer",
4143
+ minimum: 0,
4144
+ maximum: 9007199254740991
4145
+ }
4146
+ },
4147
+ required: [
4148
+ "eventName",
4149
+ "events"
4150
+ ],
4151
+ additionalProperties: false
4152
+ },
4153
+ description: "Most frequent configured value-feature event names across the window"
4154
+ }
4155
+ },
4156
+ required: [
4157
+ "windowStartAt",
4158
+ "windowEndAt",
4159
+ "weeklyBuckets",
4160
+ "topEventNames"
4161
+ ],
4162
+ additionalProperties: false
4163
+ },
4164
+ productUnavailable: {
4165
+ description: "Present only when channels included PRODUCT but the weekly usage aggregate could not be computed. Report product usage as unavailable — never as zero or absent usage. When configured value-feature names are still known, material product events are returned in `events` instead of the aggregate.",
4166
+ type: "object",
4167
+ properties: {
4168
+ reason: {
4169
+ type: "string",
4170
+ description: "Machine-readable reason the usage aggregate could not be computed"
4171
+ }
4172
+ },
4173
+ required: [
4174
+ "reason"
4001
4175
  ],
4002
4176
  additionalProperties: false
4003
4177
  }
@@ -4016,6 +4190,10 @@ var init_dist4 = __esm(() => {
4016
4190
  ownerDomain: "customer-context",
4017
4191
  title: "List Customer Facts",
4018
4192
  description: "List structured facts known about a customer. Use filters like status, sourceTypes, factTypes, factCategories, and date bounds to narrow the result set. For topic-specific retrieval, use outlit_search_customer_context instead.",
4193
+ annotations: {
4194
+ readOnlyHint: true,
4195
+ destructiveHint: false
4196
+ },
4019
4197
  inputSchema: {
4020
4198
  $schema: "https://json-schema.org/draft/2020-12/schema",
4021
4199
  type: "object",
@@ -4702,6 +4880,10 @@ CHAMPION_RISK: Historical broad relationship-risk fact retained for existing row
4702
4880
  ownerDomain: "customer-context",
4703
4881
  title: "Get Customer Fact",
4704
4882
  description: "Get one exact fact by ID. Returns the canonical fact shape and optionally expands requested related data such as evidence.",
4883
+ annotations: {
4884
+ readOnlyHint: true,
4885
+ destructiveHint: false
4886
+ },
4705
4887
  inputSchema: {
4706
4888
  $schema: "https://json-schema.org/draft/2020-12/schema",
4707
4889
  type: "object",
@@ -5204,6 +5386,10 @@ CHAMPION_RISK: Historical broad relationship-risk fact retained for existing row
5204
5386
  ownerDomain: "customer-context",
5205
5387
  title: "Get Source",
5206
5388
  description: "Get one exact source record by generic sourceType and sourceId. Use this when you already know the concrete underlying source you want to inspect.",
5389
+ annotations: {
5390
+ readOnlyHint: true,
5391
+ destructiveHint: false
5392
+ },
5207
5393
  inputSchema: {
5208
5394
  $schema: "https://json-schema.org/draft/2020-12/schema",
5209
5395
  type: "object",
@@ -5584,6 +5770,10 @@ CHAMPION_RISK: Historical broad relationship-risk fact retained for existing row
5584
5770
  ownerDomain: "customer-context",
5585
5771
  title: "List Sources",
5586
5772
  description: "List concrete source records deterministically. Use this instead of semantic search when you need enumerated calls, emails, calendar events, support tickets, Slack conversations, or opportunities.",
5773
+ annotations: {
5774
+ readOnlyHint: true,
5775
+ destructiveHint: false
5776
+ },
5587
5777
  inputSchema: {
5588
5778
  $schema: "https://json-schema.org/draft/2020-12/schema",
5589
5779
  type: "object",
@@ -6027,6 +6217,10 @@ CHAMPION_RISK: Historical broad relationship-risk fact retained for existing row
6027
6217
  ownerDomain: "customer-context",
6028
6218
  title: "Search Customer Context",
6029
6219
  description: "Search across all known customer context using a natural-language query. Returns ranked artifact-level discovery previews with at most two matching excerpts per source or fact. Use outlit_get_source with a returned sourceType and sourceId when you need the canonical source contents. Omit customer to search across all customers in the organization.",
6220
+ annotations: {
6221
+ readOnlyHint: true,
6222
+ destructiveHint: false
6223
+ },
6030
6224
  inputSchema: {
6031
6225
  $schema: "https://json-schema.org/draft/2020-12/schema",
6032
6226
  type: "object",
@@ -6151,6 +6345,48 @@ CHAMPION_RISK: Historical broad relationship-risk fact retained for existing row
6151
6345
  score: {
6152
6346
  type: "number"
6153
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
+ },
6154
6390
  matchCount: {
6155
6391
  type: "integer",
6156
6392
  minimum: 0,
@@ -6681,6 +6917,48 @@ CHAMPION_RISK: Historical broad relationship-risk fact retained for existing row
6681
6917
  sourceId: {
6682
6918
  type: "string"
6683
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
+ },
6684
6962
  occurredAt: {
6685
6963
  anyOf: [
6686
6964
  {
@@ -6816,6 +7094,10 @@ Example queries:
6816
7094
  - SELECT event_name, count(*) FROM activity GROUP BY 1 ORDER BY 2 DESC LIMIT 10
6817
7095
  - SELECT billing_status, sum(mrr_cents)/100 as mrr FROM customers GROUP BY 1
6818
7096
  - SELECT * FROM activity WHERE customer_id = 'cust_123' ORDER BY occurred_at DESC LIMIT 50`,
7097
+ annotations: {
7098
+ readOnlyHint: true,
7099
+ destructiveHint: false
7100
+ },
6819
7101
  inputSchema: {
6820
7102
  $schema: "https://json-schema.org/draft/2020-12/schema",
6821
7103
  type: "object",
@@ -6898,6 +7180,10 @@ Example queries:
6898
7180
 
6899
7181
  Use this to discover column names, types, and descriptions before writing SQL queries.
6900
7182
  Returns column definitions and example queries for each view.`,
7183
+ annotations: {
7184
+ readOnlyHint: true,
7185
+ destructiveHint: false
7186
+ },
6901
7187
  inputSchema: {
6902
7188
  $schema: "https://json-schema.org/draft/2020-12/schema",
6903
7189
  type: "object",
@@ -7102,6 +7388,10 @@ Returns column definitions and example queries for each view.`,
7102
7388
  ownerDomain: "destinations",
7103
7389
  title: "List Destinations",
7104
7390
  description: "List configured destinations using safe status fields and masked configuration only.",
7391
+ annotations: {
7392
+ readOnlyHint: true,
7393
+ destructiveHint: false
7394
+ },
7105
7395
  inputSchema: {
7106
7396
  $schema: "https://json-schema.org/draft/2020-12/schema",
7107
7397
  type: "object",
@@ -7481,6 +7771,10 @@ Returns column definitions and example queries for each view.`,
7481
7771
  ownerDomain: "destinations",
7482
7772
  title: "Get Destination",
7483
7773
  description: "Get one destination using safe status fields and masked configuration only.",
7774
+ annotations: {
7775
+ readOnlyHint: true,
7776
+ destructiveHint: false
7777
+ },
7484
7778
  inputSchema: {
7485
7779
  $schema: "https://json-schema.org/draft/2020-12/schema",
7486
7780
  type: "object",
@@ -7866,6 +8160,10 @@ Returns column definitions and example queries for each view.`,
7866
8160
  ownerDomain: "destinations",
7867
8161
  title: "Create Destination",
7868
8162
  description: "Create a Slack channel destination from an available channel.",
8163
+ annotations: {
8164
+ readOnlyHint: false,
8165
+ destructiveHint: false
8166
+ },
7869
8167
  inputSchema: {
7870
8168
  $schema: "https://json-schema.org/draft/2020-12/schema",
7871
8169
  type: "object",
@@ -8270,6 +8568,10 @@ Returns column definitions and example queries for each view.`,
8270
8568
  ownerDomain: "destinations",
8271
8569
  title: "Update Destination",
8272
8570
  description: "Update ordinary destination metadata. Use the dedicated enable or disable tool for lifecycle state.",
8571
+ annotations: {
8572
+ readOnlyHint: false,
8573
+ destructiveHint: false
8574
+ },
8273
8575
  inputSchema: {
8274
8576
  $schema: "https://json-schema.org/draft/2020-12/schema",
8275
8577
  type: "object",
@@ -8669,6 +8971,10 @@ Returns column definitions and example queries for each view.`,
8669
8971
  ownerDomain: "destinations",
8670
8972
  title: "Enable Destination",
8671
8973
  description: "Enable an ordinary destination that is ready for delivery.",
8974
+ annotations: {
8975
+ readOnlyHint: false,
8976
+ destructiveHint: false
8977
+ },
8672
8978
  inputSchema: {
8673
8979
  $schema: "https://json-schema.org/draft/2020-12/schema",
8674
8980
  type: "object",
@@ -9054,6 +9360,10 @@ Returns column definitions and example queries for each view.`,
9054
9360
  ownerDomain: "destinations",
9055
9361
  title: "Disable Destination",
9056
9362
  description: "Disable an ordinary non-default destination.",
9363
+ annotations: {
9364
+ readOnlyHint: false,
9365
+ destructiveHint: false
9366
+ },
9057
9367
  inputSchema: {
9058
9368
  $schema: "https://json-schema.org/draft/2020-12/schema",
9059
9369
  type: "object",
@@ -9439,6 +9749,10 @@ Returns column definitions and example queries for each view.`,
9439
9749
  ownerDomain: "destinations",
9440
9750
  title: "Archive Destination",
9441
9751
  description: "Archive an ordinary destination.",
9752
+ annotations: {
9753
+ readOnlyHint: false,
9754
+ destructiveHint: true
9755
+ },
9442
9756
  inputSchema: {
9443
9757
  $schema: "https://json-schema.org/draft/2020-12/schema",
9444
9758
  type: "object",
@@ -9485,13 +9799,75 @@ Returns column definitions and example queries for each view.`,
9485
9799
  additionalProperties: false
9486
9800
  }
9487
9801
  },
9488
- outlit_get_integration_capabilities: {
9489
- toolName: "outlit_get_integration_capabilities",
9490
- commandId: "integration.capabilities.get",
9491
- commandVersion: 2,
9492
- ownerDomain: "integrations",
9493
- title: "Get Integration Capabilities",
9494
- description: "Describe safe integration setup modes without exposing credential fields or provider configuration.",
9802
+ outlit_submit_feedback: {
9803
+ toolName: "outlit_submit_feedback",
9804
+ commandId: "feedback.submit",
9805
+ commandVersion: 1,
9806
+ ownerDomain: "feedback",
9807
+ title: "Submit Product Feedback",
9808
+ description: "Submit product feedback to Outlit. This does not open a support ticket or promise a reply.",
9809
+ annotations: {
9810
+ readOnlyHint: false,
9811
+ destructiveHint: false
9812
+ },
9813
+ inputSchema: {
9814
+ $schema: "https://json-schema.org/draft/2020-12/schema",
9815
+ type: "object",
9816
+ properties: {
9817
+ body: {
9818
+ type: "string",
9819
+ minLength: 1,
9820
+ maxLength: 20000
9821
+ },
9822
+ area: {
9823
+ type: "string",
9824
+ minLength: 1,
9825
+ maxLength: 100
9826
+ },
9827
+ context: {
9828
+ type: "object",
9829
+ propertyNames: {
9830
+ type: "string"
9831
+ },
9832
+ additionalProperties: {}
9833
+ }
9834
+ },
9835
+ required: [
9836
+ "body"
9837
+ ],
9838
+ additionalProperties: false
9839
+ },
9840
+ outputSchema: {
9841
+ $schema: "https://json-schema.org/draft/2020-12/schema",
9842
+ type: "object",
9843
+ properties: {
9844
+ id: {
9845
+ type: "string"
9846
+ },
9847
+ createdAt: {
9848
+ type: "string",
9849
+ format: "date-time",
9850
+ 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))$"
9851
+ }
9852
+ },
9853
+ required: [
9854
+ "id",
9855
+ "createdAt"
9856
+ ],
9857
+ additionalProperties: false
9858
+ }
9859
+ },
9860
+ outlit_get_integration_capabilities: {
9861
+ toolName: "outlit_get_integration_capabilities",
9862
+ commandId: "integration.capabilities.get",
9863
+ commandVersion: 2,
9864
+ ownerDomain: "integrations",
9865
+ title: "Get Integration Capabilities",
9866
+ description: "Describe safe integration setup modes without exposing credential fields or provider configuration.",
9867
+ annotations: {
9868
+ readOnlyHint: true,
9869
+ destructiveHint: false
9870
+ },
9495
9871
  inputSchema: {
9496
9872
  $schema: "https://json-schema.org/draft/2020-12/schema",
9497
9873
  type: "object",
@@ -9584,6 +9960,10 @@ Returns column definitions and example queries for each view.`,
9584
9960
  ownerDomain: "integrations",
9585
9961
  title: "Begin Integration Setup",
9586
9962
  description: "Begin a short-lived browser handoff for an integration that supports browser authentication.",
9963
+ annotations: {
9964
+ readOnlyHint: false,
9965
+ destructiveHint: false
9966
+ },
9587
9967
  inputSchema: {
9588
9968
  $schema: "https://json-schema.org/draft/2020-12/schema",
9589
9969
  type: "object",
@@ -9668,6 +10048,10 @@ Returns column definitions and example queries for each view.`,
9668
10048
  ownerDomain: "integrations",
9669
10049
  title: "Get Integration Setup Status",
9670
10050
  description: "Check a browser setup handoff owned by the current actor.",
10051
+ annotations: {
10052
+ readOnlyHint: true,
10053
+ destructiveHint: false
10054
+ },
9671
10055
  inputSchema: {
9672
10056
  $schema: "https://json-schema.org/draft/2020-12/schema",
9673
10057
  type: "object",
@@ -9723,6 +10107,10 @@ Returns column definitions and example queries for each view.`,
9723
10107
  ownerDomain: "integrations",
9724
10108
  title: "Get Integration Status",
9725
10109
  description: "Get the configuration-readiness status for one integration or the public integration catalog.",
10110
+ annotations: {
10111
+ readOnlyHint: true,
10112
+ destructiveHint: false
10113
+ },
9726
10114
  inputSchema: {
9727
10115
  $schema: "https://json-schema.org/draft/2020-12/schema",
9728
10116
  type: "object",
@@ -9818,6 +10206,10 @@ Returns column definitions and example queries for each view.`,
9818
10206
  ownerDomain: "integrations",
9819
10207
  title: "Set Up Integration",
9820
10208
  description: "Continue integration setup through validated credentials, safe configuration, or a trusted browser handoff.",
10209
+ annotations: {
10210
+ readOnlyHint: false,
10211
+ destructiveHint: false
10212
+ },
9821
10213
  inputSchema: {
9822
10214
  $schema: "https://json-schema.org/draft/2020-12/schema",
9823
10215
  anyOf: [
@@ -10693,6 +11085,10 @@ Returns column definitions and example queries for each view.`,
10693
11085
  ownerDomain: "customer_activation",
10694
11086
  title: "Get Customer Activation",
10695
11087
  description: "Get the product event currently configured to activate customers and users.",
11088
+ annotations: {
11089
+ readOnlyHint: true,
11090
+ destructiveHint: false
11091
+ },
10696
11092
  inputSchema: {
10697
11093
  $schema: "https://json-schema.org/draft/2020-12/schema",
10698
11094
  type: "object",
@@ -10738,6 +11134,10 @@ Returns column definitions and example queries for each view.`,
10738
11134
  ownerDomain: "customer_activation",
10739
11135
  title: "Preview Customer Activation",
10740
11136
  description: "Preview the bounded recent impact of choosing a product event for customer activation without changing configuration.",
11137
+ annotations: {
11138
+ readOnlyHint: true,
11139
+ destructiveHint: false
11140
+ },
10741
11141
  inputSchema: {
10742
11142
  $schema: "https://json-schema.org/draft/2020-12/schema",
10743
11143
  type: "object",
@@ -10930,6 +11330,10 @@ Returns column definitions and example queries for each view.`,
10930
11330
  ownerDomain: "customer_activation",
10931
11331
  title: "Update Customer Activation",
10932
11332
  description: "Set the product event used for future customer activation, or disable event-based activation with null. This does not backfill history.",
11333
+ annotations: {
11334
+ readOnlyHint: false,
11335
+ destructiveHint: false
11336
+ },
10933
11337
  inputSchema: {
10934
11338
  $schema: "https://json-schema.org/draft/2020-12/schema",
10935
11339
  type: "object",
@@ -10994,7 +11398,11 @@ Returns column definitions and example queries for each view.`,
10994
11398
  commandVersion: 1,
10995
11399
  ownerDomain: "settings",
10996
11400
  title: "Get Workspace Settings",
10997
- description: "Get the workspace default timezone used by time-based product behavior.",
11401
+ description: "Get the workspace default timezone and the default customer owner used as the lowest-ranked ownership source.",
11402
+ annotations: {
11403
+ readOnlyHint: true,
11404
+ destructiveHint: false
11405
+ },
10998
11406
  inputSchema: {
10999
11407
  $schema: "https://json-schema.org/draft/2020-12/schema",
11000
11408
  type: "object",
@@ -11011,10 +11419,32 @@ Returns column definitions and example queries for each view.`,
11011
11419
  defaultTimezone: {
11012
11420
  type: "string",
11013
11421
  minLength: 1
11422
+ },
11423
+ customerOwnership: {
11424
+ type: "object",
11425
+ properties: {
11426
+ defaultOwnerUserId: {
11427
+ anyOf: [
11428
+ {
11429
+ type: "string",
11430
+ minLength: 1,
11431
+ maxLength: 191
11432
+ },
11433
+ {
11434
+ type: "null"
11435
+ }
11436
+ ]
11437
+ }
11438
+ },
11439
+ required: [
11440
+ "defaultOwnerUserId"
11441
+ ],
11442
+ additionalProperties: false
11014
11443
  }
11015
11444
  },
11016
11445
  required: [
11017
- "defaultTimezone"
11446
+ "defaultTimezone",
11447
+ "customerOwnership"
11018
11448
  ],
11019
11449
  additionalProperties: false
11020
11450
  }
@@ -11031,7 +11461,11 @@ Returns column definitions and example queries for each view.`,
11031
11461
  commandVersion: 1,
11032
11462
  ownerDomain: "settings",
11033
11463
  title: "Update Workspace Settings",
11034
- description: "Update the workspace default timezone using a valid IANA timezone.",
11464
+ description: "Update the workspace default timezone (a valid IANA timezone) and/or the default customer owner (an active workspace member, or null to clear).",
11465
+ annotations: {
11466
+ readOnlyHint: false,
11467
+ destructiveHint: false
11468
+ },
11035
11469
  inputSchema: {
11036
11470
  $schema: "https://json-schema.org/draft/2020-12/schema",
11037
11471
  type: "object",
@@ -11039,11 +11473,29 @@ Returns column definitions and example queries for each view.`,
11039
11473
  defaultTimezone: {
11040
11474
  type: "string",
11041
11475
  minLength: 1
11476
+ },
11477
+ customerOwnership: {
11478
+ type: "object",
11479
+ properties: {
11480
+ defaultOwnerUserId: {
11481
+ anyOf: [
11482
+ {
11483
+ type: "string",
11484
+ minLength: 1,
11485
+ maxLength: 191
11486
+ },
11487
+ {
11488
+ type: "null"
11489
+ }
11490
+ ]
11491
+ }
11492
+ },
11493
+ required: [
11494
+ "defaultOwnerUserId"
11495
+ ],
11496
+ additionalProperties: false
11042
11497
  }
11043
11498
  },
11044
- required: [
11045
- "defaultTimezone"
11046
- ],
11047
11499
  additionalProperties: false
11048
11500
  },
11049
11501
  outputSchema: {
@@ -11056,10 +11508,32 @@ Returns column definitions and example queries for each view.`,
11056
11508
  defaultTimezone: {
11057
11509
  type: "string",
11058
11510
  minLength: 1
11511
+ },
11512
+ customerOwnership: {
11513
+ type: "object",
11514
+ properties: {
11515
+ defaultOwnerUserId: {
11516
+ anyOf: [
11517
+ {
11518
+ type: "string",
11519
+ minLength: 1,
11520
+ maxLength: 191
11521
+ },
11522
+ {
11523
+ type: "null"
11524
+ }
11525
+ ]
11526
+ }
11527
+ },
11528
+ required: [
11529
+ "defaultOwnerUserId"
11530
+ ],
11531
+ additionalProperties: false
11059
11532
  }
11060
11533
  },
11061
11534
  required: [
11062
- "defaultTimezone"
11535
+ "defaultTimezone",
11536
+ "customerOwnership"
11063
11537
  ],
11064
11538
  additionalProperties: false
11065
11539
  }
@@ -11077,6 +11551,10 @@ Returns column definitions and example queries for each view.`,
11077
11551
  ownerDomain: "value_features",
11078
11552
  title: "List Features",
11079
11553
  description: "List configured features, exact historical usage, eligible sources, and observed event candidates.",
11554
+ annotations: {
11555
+ readOnlyHint: true,
11556
+ destructiveHint: false
11557
+ },
11080
11558
  inputSchema: {
11081
11559
  $schema: "https://json-schema.org/draft/2020-12/schema",
11082
11560
  type: "object",
@@ -11627,6 +12105,10 @@ Returns column definitions and example queries for each view.`,
11627
12105
  ownerDomain: "value_features",
11628
12106
  title: "Create Feature",
11629
12107
  description: "Create or idempotently return one customer-value Feature observed by one event rule.",
12108
+ annotations: {
12109
+ readOnlyHint: false,
12110
+ destructiveHint: false
12111
+ },
11630
12112
  inputSchema: {
11631
12113
  $schema: "https://json-schema.org/draft/2020-12/schema",
11632
12114
  type: "object",
@@ -11943,6 +12425,10 @@ Returns column definitions and example queries for each view.`,
11943
12425
  ownerDomain: "value_features",
11944
12426
  title: "Archive Feature",
11945
12427
  description: "Archive a Feature when at least one other active Feature remains.",
12428
+ annotations: {
12429
+ readOnlyHint: false,
12430
+ destructiveHint: true
12431
+ },
11946
12432
  inputSchema: {
11947
12433
  $schema: "https://json-schema.org/draft/2020-12/schema",
11948
12434
  type: "object",
@@ -12003,6 +12489,10 @@ Returns column definitions and example queries for each view.`,
12003
12489
  ownerDomain: "value_features",
12004
12490
  title: "Get Customer Features",
12005
12491
  description: "Read Outlit event evidence and stored non-credit Autumn feature quantities, frequency, recency, weekly coverage, and explicit links for one authorized customer. Provider totals and linked event counts remain separate.",
12492
+ annotations: {
12493
+ readOnlyHint: true,
12494
+ destructiveHint: false
12495
+ },
12006
12496
  inputSchema: {
12007
12497
  $schema: "https://json-schema.org/draft/2020-12/schema",
12008
12498
  type: "object",
@@ -13191,6 +13681,10 @@ Returns column definitions and example queries for each view.`,
13191
13681
  ownerDomain: "customers",
13192
13682
  title: "Get Customer Credits",
13193
13683
  description: "Read a customer's credit pools, remaining credits, provider reset dates, and deterministic daily burn rate, rate change, runway, and trend from stored data. Missing or stale evidence is explicit; no live provider calls. For individual product feature usage use outlit_get_customer_features.",
13684
+ annotations: {
13685
+ readOnlyHint: true,
13686
+ destructiveHint: false
13687
+ },
13194
13688
  inputSchema: {
13195
13689
  $schema: "https://json-schema.org/draft/2020-12/schema",
13196
13690
  type: "object",
@@ -13353,7 +13847,7 @@ Returns column definitions and example queries for each view.`,
13353
13847
  type: "null"
13354
13848
  }
13355
13849
  ],
13356
- description: "Average daily usage over the last seven complete UTC days. See scope before interpreting this as pool deductions."
13850
+ description: "Average daily usage over the trailing rate window (28 days, shrinking to the covered history with a seven-day floor). See scope before interpreting this as pool deductions."
13357
13851
  },
13358
13852
  scope: {
13359
13853
  type: "string",
@@ -13362,6 +13856,58 @@ Returns column definitions and example queries for each view.`,
13362
13856
  "account"
13363
13857
  ]
13364
13858
  },
13859
+ rateBasis: {
13860
+ description: "Length of the trailing window the forecast rate averages over.",
13861
+ anyOf: [
13862
+ {
13863
+ type: "object",
13864
+ properties: {
13865
+ kind: {
13866
+ type: "string",
13867
+ const: "trailing"
13868
+ },
13869
+ days: {
13870
+ type: "integer",
13871
+ exclusiveMinimum: 0,
13872
+ maximum: 9007199254740991
13873
+ }
13874
+ },
13875
+ required: [
13876
+ "kind",
13877
+ "days"
13878
+ ],
13879
+ additionalProperties: false
13880
+ },
13881
+ {
13882
+ type: "null"
13883
+ }
13884
+ ]
13885
+ },
13886
+ paceSinceReset: {
13887
+ description: "Context-only average daily usage since the current grant period started; never the forecast rate.",
13888
+ anyOf: [
13889
+ {
13890
+ type: "number",
13891
+ minimum: 0
13892
+ },
13893
+ {
13894
+ type: "null"
13895
+ }
13896
+ ]
13897
+ },
13898
+ periodStart: {
13899
+ description: "UTC day the current grant period started, when derivable from the reset interval.",
13900
+ anyOf: [
13901
+ {
13902
+ type: "string",
13903
+ format: "date",
13904
+ 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])))$"
13905
+ },
13906
+ {
13907
+ type: "null"
13908
+ }
13909
+ ]
13910
+ },
13365
13911
  change: {
13366
13912
  anyOf: [
13367
13913
  {
@@ -13371,7 +13917,20 @@ Returns column definitions and example queries for each view.`,
13371
13917
  type: "null"
13372
13918
  }
13373
13919
  ],
13374
- description: "Percentage change in customer-balance burn rate versus the preceding seven complete days. Null when either window is incomplete or the prior rate is zero."
13920
+ description: "Percentage change in customer-balance burn rate versus the preceding equal-length window. Null when either window is incomplete or the prior rate is zero."
13921
+ },
13922
+ changeDays: {
13923
+ description: "Days in each side of the percentage comparison: 28 when covered, else 7.",
13924
+ anyOf: [
13925
+ {
13926
+ type: "integer",
13927
+ exclusiveMinimum: 0,
13928
+ maximum: 9007199254740991
13929
+ },
13930
+ {
13931
+ type: "null"
13932
+ }
13933
+ ]
13375
13934
  },
13376
13935
  days: {
13377
13936
  anyOf: [
@@ -13445,7 +14004,7 @@ Returns column definitions and example queries for each view.`,
13445
14004
  "end"
13446
14005
  ],
13447
14006
  additionalProperties: false,
13448
- description: "UTC dates for the seven-day rate window; end is exclusive."
14007
+ description: "UTC dates for the rate window; end is exclusive."
13449
14008
  },
13450
14009
  trend: {
13451
14010
  maxItems: 14,
@@ -13560,6 +14119,10 @@ Returns column definitions and example queries for each view.`,
13560
14119
  ownerDomain: "attention",
13561
14120
  title: "List Attention Items",
13562
14121
  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.",
14122
+ annotations: {
14123
+ readOnlyHint: true,
14124
+ destructiveHint: false
14125
+ },
13563
14126
  inputSchema: {
13564
14127
  $schema: "https://json-schema.org/draft/2020-12/schema",
13565
14128
  type: "object",
@@ -13751,7 +14314,8 @@ Returns column definitions and example queries for each view.`,
13751
14314
  {
13752
14315
  type: "null"
13753
14316
  }
13754
- ]
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."
13755
14319
  },
13756
14320
  currency: {
13757
14321
  anyOf: [
@@ -13881,6 +14445,10 @@ Returns column definitions and example queries for each view.`,
13881
14445
  ownerDomain: "attention",
13882
14446
  title: "Get Attention Item",
13883
14447
  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.",
14448
+ annotations: {
14449
+ readOnlyHint: true,
14450
+ destructiveHint: false
14451
+ },
13884
14452
  inputSchema: {
13885
14453
  $schema: "https://json-schema.org/draft/2020-12/schema",
13886
14454
  type: "object",
@@ -14047,7 +14615,8 @@ Returns column definitions and example queries for each view.`,
14047
14615
  {
14048
14616
  type: "null"
14049
14617
  }
14050
- ]
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."
14051
14620
  },
14052
14621
  currency: {
14053
14622
  anyOf: [
@@ -14659,6 +15228,16 @@ Returns column definitions and example queries for each view.`,
14659
15228
  }
14660
15229
  ]
14661
15230
  },
15231
+ billingStatus: {
15232
+ anyOf: [
15233
+ {
15234
+ type: "string"
15235
+ },
15236
+ {
15237
+ type: "null"
15238
+ }
15239
+ ]
15240
+ },
14662
15241
  identifierCount: {
14663
15242
  type: "integer",
14664
15243
  minimum: 0,
@@ -14729,6 +15308,16 @@ Returns column definitions and example queries for each view.`,
14729
15308
  }
14730
15309
  ]
14731
15310
  },
15311
+ billingStatus: {
15312
+ anyOf: [
15313
+ {
15314
+ type: "string"
15315
+ },
15316
+ {
15317
+ type: "null"
15318
+ }
15319
+ ]
15320
+ },
14732
15321
  identifierCount: {
14733
15322
  type: "integer",
14734
15323
  minimum: 0,
@@ -14880,14 +15469,27 @@ Returns column definitions and example queries for each view.`,
14880
15469
  type: "integer",
14881
15470
  minimum: 0,
14882
15471
  maximum: 9007199254740991
14883
- }
14884
- },
14885
- required: [
14886
- "identifiers",
14887
- "users",
14888
- "activities",
14889
- "visitors",
14890
- "billingEvents",
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
15485
+ }
15486
+ },
15487
+ required: [
15488
+ "identifiers",
15489
+ "users",
15490
+ "activities",
15491
+ "visitors",
15492
+ "billingEvents",
14891
15493
  "facts",
14892
15494
  "supportTickets",
14893
15495
  "calls",
@@ -14897,102 +15499,1271 @@ Returns column definitions and example queries for each view.`,
14897
15499
  ],
14898
15500
  additionalProperties: false
14899
15501
  },
14900
- latestJob: {
15502
+ scope: {
15503
+ type: "object",
15504
+ properties: {
15505
+ survivor: {
15506
+ type: "object",
15507
+ properties: {
15508
+ shape: {
15509
+ type: "string",
15510
+ enum: [
15511
+ "provisional",
15512
+ "established",
15513
+ "unknown"
15514
+ ]
15515
+ },
15516
+ billingStatus: {
15517
+ anyOf: [
15518
+ {
15519
+ type: "string"
15520
+ },
15521
+ {
15522
+ type: "null"
15523
+ }
15524
+ ]
15525
+ },
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: {
15545
+ type: "string",
15546
+ enum: [
15547
+ "provisional",
15548
+ "established",
15549
+ "unknown"
15550
+ ]
15551
+ },
15552
+ billingStatus: {
15553
+ anyOf: [
15554
+ {
15555
+ type: "string"
15556
+ },
15557
+ {
15558
+ type: "null"
15559
+ }
15560
+ ]
15561
+ },
15562
+ hasIndependentCrmIdentity: {
15563
+ type: "boolean"
15564
+ },
15565
+ hasIndependentStripeIdentity: {
15566
+ type: "boolean"
15567
+ }
15568
+ },
15569
+ required: [
15570
+ "shape",
15571
+ "billingStatus",
15572
+ "hasIndependentCrmIdentity",
15573
+ "hasIndependentStripeIdentity"
15574
+ ],
15575
+ additionalProperties: false
15576
+ },
15577
+ payingAccountsAffected: {
15578
+ anyOf: [
15579
+ {
15580
+ type: "integer",
15581
+ minimum: 0,
15582
+ maximum: 9007199254740991
15583
+ },
15584
+ {
15585
+ type: "null"
15586
+ }
15587
+ ]
15588
+ },
15589
+ availability: {
15590
+ type: "object",
15591
+ properties: {
15592
+ currentCounts: {
15593
+ type: "boolean"
15594
+ },
15595
+ analytics: {
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
15612
+ },
15613
+ analyticsEvents: {
15614
+ anyOf: [
15615
+ {
15616
+ type: "integer",
15617
+ minimum: 0,
15618
+ maximum: 9007199254740991
15619
+ },
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
15680
+ }
15681
+ },
15682
+ required: [
15683
+ "contacts",
15684
+ "analyticsEvents",
15685
+ "analyticsDimensions",
15686
+ "billingEvents",
15687
+ "revenueSnapshots",
15688
+ "calls",
15689
+ "facts",
15690
+ "opportunities",
15691
+ "tickets"
15692
+ ],
15693
+ additionalProperties: false
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: {
14901
16649
  anyOf: [
14902
16650
  {
14903
- type: "object",
14904
- properties: {
14905
- id: {
14906
- type: "string",
14907
- minLength: 1,
14908
- maxLength: 191
14909
- },
14910
- operationId: {
14911
- anyOf: [
14912
- {
14913
- type: "string",
14914
- minLength: 1,
14915
- maxLength: 191
14916
- },
14917
- {
14918
- type: "null"
14919
- }
14920
- ],
14921
- description: "Pass to outlit_get_customer_merge_status. Null when this job has no matching tracked operation."
14922
- },
14923
- status: {
14924
- type: "string",
14925
- enum: [
14926
- "QUEUED",
14927
- "RUNNING",
14928
- "COMPLETED",
14929
- "FAILED"
14930
- ]
14931
- },
14932
- createdAt: {
14933
- type: "string",
14934
- format: "date-time",
14935
- 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))$"
14936
- },
14937
- updatedAt: {
14938
- type: "string",
14939
- format: "date-time",
14940
- 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))$"
14941
- }
14942
- },
14943
- required: [
14944
- "id",
14945
- "operationId",
14946
- "status",
14947
- "createdAt",
14948
- "updatedAt"
14949
- ],
14950
- additionalProperties: false
16651
+ type: "string",
16652
+ enum: [
16653
+ "rehome_contact",
16654
+ "rehome_crm_account",
16655
+ "reattribute_stripe_customer",
16656
+ "rehome_source_corpus"
16657
+ ]
14951
16658
  },
14952
16659
  {
14953
16660
  type: "null"
14954
16661
  }
14955
16662
  ]
14956
16663
  },
14957
- canMerge: {
14958
- type: "boolean"
16664
+ sourceCustomerId: {
16665
+ anyOf: [
16666
+ {
16667
+ type: "string",
16668
+ minLength: 1,
16669
+ maxLength: 191
16670
+ },
16671
+ {
16672
+ type: "null"
16673
+ }
16674
+ ]
14959
16675
  },
14960
- 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: {
14961
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
+ ]
14962
16735
  }
14963
16736
  },
14964
16737
  required: [
14965
- "id",
14966
- "status",
14967
- "proposalStatus",
14968
- "confidence",
14969
- "survivor",
14970
- "duplicate",
14971
- "reviewNotes",
14972
- "reviewedAt",
14973
- "reviewedByName",
14974
- "appliedAt",
14975
- "appliedByName",
14976
- "createdAt",
14977
- "explanation",
14978
- "impact",
14979
- "latestJob",
14980
- "canMerge",
14981
- "canReject"
16738
+ "findingId",
16739
+ "fingerprint",
16740
+ "state",
16741
+ "action",
16742
+ "sourceCustomerId",
16743
+ "targetCustomerId",
16744
+ "evidenceRef",
16745
+ "hasSavedCandidate",
16746
+ "planDigest",
16747
+ "manualReason",
16748
+ "nextStep"
14982
16749
  ],
14983
16750
  additionalProperties: false
14984
16751
  }
14985
16752
  },
14986
- canManageIdentityMerges: {
16753
+ scannedCount: {
16754
+ type: "integer",
16755
+ minimum: 0,
16756
+ maximum: 9007199254740991
16757
+ },
16758
+ hasMore: {
14987
16759
  type: "boolean"
14988
16760
  },
14989
16761
  nextCursor: {
14990
- default: null,
14991
16762
  anyOf: [
14992
16763
  {
14993
16764
  type: "string",
14994
16765
  minLength: 1,
14995
- maxLength: 2000
16766
+ maxLength: 191
14996
16767
  },
14997
16768
  {
14998
16769
  type: "null"
@@ -15001,20 +16772,21 @@ Returns column definitions and example queries for each view.`,
15001
16772
  }
15002
16773
  },
15003
16774
  required: [
15004
- "suggestions",
15005
- "canManageIdentityMerges",
16775
+ "items",
16776
+ "scannedCount",
16777
+ "hasMore",
15006
16778
  "nextCursor"
15007
16779
  ],
15008
16780
  additionalProperties: false
15009
16781
  }
15010
16782
  },
15011
- outlit_reject_identity_merge_suggestion: {
15012
- toolName: "outlit_reject_identity_merge_suggestion",
15013
- commandId: "identity.suggestions.reject",
16783
+ outlit_preview_scoped_repair: {
16784
+ toolName: "outlit_preview_scoped_repair",
16785
+ commandId: "integrity.scoped_repair.preview",
15014
16786
  commandVersion: 1,
15015
16787
  ownerDomain: "identity",
15016
- title: "Reject identity merge suggestion",
15017
- 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.",
15018
16790
  annotations: {
15019
16791
  readOnlyHint: false,
15020
16792
  destructiveHint: false
@@ -15023,18 +16795,74 @@ Returns column definitions and example queries for each view.`,
15023
16795
  $schema: "https://json-schema.org/draft/2020-12/schema",
15024
16796
  type: "object",
15025
16797
  properties: {
15026
- suggestionId: {
16798
+ findingId: {
15027
16799
  type: "string",
15028
16800
  minLength: 1,
15029
16801
  maxLength: 191
15030
16802
  },
15031
- reviewNotes: {
16803
+ expectedFingerprint: {
15032
16804
  type: "string",
15033
- maxLength: 1e4
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
15034
16861
  }
15035
16862
  },
15036
16863
  required: [
15037
- "suggestionId"
16864
+ "findingId",
16865
+ "expectedFingerprint"
15038
16866
  ],
15039
16867
  additionalProperties: false
15040
16868
  },
@@ -15042,30 +16870,132 @@ Returns column definitions and example queries for each view.`,
15042
16870
  $schema: "https://json-schema.org/draft/2020-12/schema",
15043
16871
  type: "object",
15044
16872
  properties: {
15045
- suggestionId: {
16873
+ findingId: {
15046
16874
  type: "string",
15047
16875
  minLength: 1,
15048
16876
  maxLength: 191
15049
16877
  },
15050
- status: {
16878
+ fingerprint: {
15051
16879
  type: "string",
15052
- const: "REJECTED"
16880
+ minLength: 1,
16881
+ maxLength: 191
16882
+ },
16883
+ state: {
16884
+ type: "string",
16885
+ const: "ready"
16886
+ },
16887
+ planDigest: {
16888
+ type: "string",
16889
+ pattern: "^[a-f0-9]{64}$"
16890
+ },
16891
+ action: {
16892
+ type: "string",
16893
+ enum: [
16894
+ "rehome_contact",
16895
+ "rehome_crm_account",
16896
+ "reattribute_stripe_customer",
16897
+ "rehome_source_corpus"
16898
+ ]
16899
+ },
16900
+ sourceCustomerId: {
16901
+ type: "string",
16902
+ minLength: 1,
16903
+ maxLength: 191
16904
+ },
16905
+ targetCustomerId: {
16906
+ type: "string",
16907
+ minLength: 1,
16908
+ maxLength: 191
16909
+ },
16910
+ impact: {
16911
+ type: "object",
16912
+ properties: {
16913
+ movedCounts: {
16914
+ type: "object",
16915
+ propertyNames: {
16916
+ type: "string"
16917
+ },
16918
+ additionalProperties: {
16919
+ type: "integer",
16920
+ minimum: 0,
16921
+ maximum: 9007199254740991
16922
+ }
16923
+ },
16924
+ protectedCustomerIds: {
16925
+ type: "array",
16926
+ items: {
16927
+ type: "string",
16928
+ minLength: 1,
16929
+ maxLength: 191
16930
+ }
16931
+ },
16932
+ conflictingProviderIdentities: {
16933
+ type: "array",
16934
+ items: {
16935
+ type: "string"
16936
+ }
16937
+ },
16938
+ baselineContext: {
16939
+ type: "object",
16940
+ properties: {
16941
+ v1MissingFacts: {
16942
+ type: "integer",
16943
+ minimum: 0,
16944
+ maximum: 9007199254740991
16945
+ },
16946
+ v1MissingSources: {
16947
+ type: "integer",
16948
+ minimum: 0,
16949
+ maximum: 9007199254740991
16950
+ },
16951
+ v2MissingFacts: {
16952
+ type: "integer",
16953
+ minimum: 0,
16954
+ maximum: 9007199254740991
16955
+ },
16956
+ v2MissingSources: {
16957
+ type: "integer",
16958
+ minimum: 0,
16959
+ maximum: 9007199254740991
16960
+ }
16961
+ },
16962
+ required: [
16963
+ "v1MissingFacts",
16964
+ "v1MissingSources",
16965
+ "v2MissingFacts",
16966
+ "v2MissingSources"
16967
+ ],
16968
+ additionalProperties: false
16969
+ }
16970
+ },
16971
+ required: [
16972
+ "movedCounts",
16973
+ "protectedCustomerIds",
16974
+ "conflictingProviderIdentities"
16975
+ ],
16976
+ additionalProperties: false
15053
16977
  }
15054
16978
  },
15055
16979
  required: [
15056
- "suggestionId",
15057
- "status"
16980
+ "findingId",
16981
+ "fingerprint",
16982
+ "state",
16983
+ "planDigest",
16984
+ "action",
16985
+ "sourceCustomerId",
16986
+ "targetCustomerId",
16987
+ "impact"
15058
16988
  ],
15059
16989
  additionalProperties: false
15060
16990
  }
15061
16991
  },
15062
- outlit_merge_customers: {
15063
- toolName: "outlit_merge_customers",
15064
- commandId: "customer.merge",
16992
+ outlit_execute_scoped_repair: {
16993
+ toolName: "outlit_execute_scoped_repair",
16994
+ commandId: "integrity.scoped_repair.execute",
15065
16995
  commandVersion: 1,
15066
16996
  ownerDomain: "identity",
15067
- title: "Merge customers",
15068
- 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.",
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.",
15069
16999
  annotations: {
15070
17000
  readOnlyHint: false,
15071
17001
  destructiveHint: true
@@ -15074,242 +17004,190 @@ Returns column definitions and example queries for each view.`,
15074
17004
  $schema: "https://json-schema.org/draft/2020-12/schema",
15075
17005
  type: "object",
15076
17006
  properties: {
15077
- survivingCustomerId: {
15078
- type: "string",
15079
- minLength: 1,
15080
- maxLength: 191
15081
- },
15082
- duplicateCustomerId: {
17007
+ findingId: {
15083
17008
  type: "string",
15084
17009
  minLength: 1,
15085
17010
  maxLength: 191
15086
17011
  },
15087
- suggestionId: {
17012
+ planDigest: {
15088
17013
  type: "string",
15089
- minLength: 1,
15090
- maxLength: 191,
15091
- description: "Eligible saved suggestion for this exact pair. Required if either record is INDIVIDUAL; optional for two COMPANY records."
17014
+ pattern: "^[a-f0-9]{64}$"
15092
17015
  },
15093
- reviewNotes: {
17016
+ reason: {
15094
17017
  type: "string",
15095
- maxLength: 1e4
17018
+ minLength: 10,
17019
+ maxLength: 2000
15096
17020
  },
15097
- dryRun: {
15098
- default: true,
17021
+ resume: {
17022
+ default: false,
15099
17023
  type: "boolean"
15100
- },
15101
- previewToken: {
15102
- type: "string",
15103
- minLength: 1,
15104
- maxLength: 4096
15105
- },
15106
- requestId: {
15107
- type: "string",
15108
- minLength: 1,
15109
- maxLength: 191
15110
17024
  }
15111
17025
  },
15112
17026
  required: [
15113
- "survivingCustomerId",
15114
- "duplicateCustomerId"
17027
+ "findingId",
17028
+ "planDigest",
17029
+ "reason"
15115
17030
  ],
15116
17031
  additionalProperties: false
15117
17032
  },
15118
17033
  outputSchema: {
15119
17034
  $schema: "https://json-schema.org/draft/2020-12/schema",
15120
- oneOf: [
15121
- {
15122
- type: "object",
15123
- properties: {
15124
- kind: {
15125
- type: "string",
15126
- const: "preview"
15127
- },
15128
- survivingCustomerId: {
15129
- type: "string",
15130
- minLength: 1,
15131
- maxLength: 191
15132
- },
15133
- duplicateCustomerId: {
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
+ {
15134
17057
  type: "string",
15135
17058
  minLength: 1,
15136
17059
  maxLength: 191
15137
17060
  },
15138
- previewToken: {
15139
- type: "string",
15140
- minLength: 1,
15141
- maxLength: 4096
15142
- },
15143
- evaluatedAt: {
17061
+ {
17062
+ type: "null"
17063
+ }
17064
+ ]
17065
+ },
17066
+ summary: {
17067
+ type: "string"
17068
+ },
17069
+ nextStep: {
17070
+ anyOf: [
17071
+ {
15144
17072
  type: "string",
15145
- format: "date-time",
15146
- 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)))$"
17073
+ maxLength: 200
15147
17074
  },
15148
- impact: {
17075
+ {
17076
+ type: "null"
17077
+ }
17078
+ ]
17079
+ },
17080
+ receipt: {
17081
+ anyOf: [
17082
+ {
15149
17083
  type: "object",
15150
17084
  properties: {
15151
- identifiers: {
15152
- type: "integer",
15153
- minimum: 0,
15154
- maximum: 9007199254740991
15155
- },
15156
- contacts: {
15157
- type: "integer",
15158
- minimum: 0,
15159
- maximum: 9007199254740991
17085
+ disposition: {
17086
+ type: "string",
17087
+ enum: [
17088
+ "moved",
17089
+ "resumed",
17090
+ "noop",
17091
+ "partial",
17092
+ "refused",
17093
+ "failed"
17094
+ ]
15160
17095
  },
15161
- facts: {
15162
- type: "integer",
15163
- minimum: 0,
15164
- maximum: 9007199254740991
17096
+ followThroughComplete: {
17097
+ type: "boolean"
15165
17098
  },
15166
- communications: {
15167
- type: "integer",
15168
- minimum: 0,
15169
- maximum: 9007199254740991
17099
+ admissionAuditIds: {
17100
+ type: "array",
17101
+ items: {
17102
+ type: "string",
17103
+ minLength: 1,
17104
+ maxLength: 191
17105
+ }
15170
17106
  },
15171
- accessEntries: {
15172
- type: "integer",
15173
- minimum: 0,
15174
- maximum: 9007199254740991
15175
- }
15176
- },
15177
- required: [
15178
- "identifiers",
15179
- "contacts",
15180
- "facts",
15181
- "communications",
15182
- "accessEntries"
15183
- ],
15184
- additionalProperties: false
15185
- },
15186
- warnings: {
15187
- maxItems: 30,
15188
- type: "array",
15189
- items: {
15190
- type: "object",
15191
- properties: {
15192
- code: {
17107
+ completionAuditIds: {
17108
+ type: "array",
17109
+ items: {
15193
17110
  type: "string",
15194
17111
  minLength: 1,
15195
- maxLength: 100
17112
+ maxLength: 191
17113
+ }
17114
+ },
17115
+ movedIds: {
17116
+ type: "object",
17117
+ propertyNames: {
17118
+ type: "string"
15196
17119
  },
15197
- message: {
15198
- type: "string",
15199
- maxLength: 1000
17120
+ additionalProperties: {
17121
+ type: "array",
17122
+ items: {
17123
+ type: "string",
17124
+ minLength: 1,
17125
+ maxLength: 191
17126
+ }
15200
17127
  }
15201
17128
  },
15202
- required: [
15203
- "code",
15204
- "message"
15205
- ],
15206
- additionalProperties: false
15207
- }
15208
- }
15209
- },
15210
- required: [
15211
- "kind",
15212
- "survivingCustomerId",
15213
- "duplicateCustomerId",
15214
- "previewToken",
15215
- "evaluatedAt",
15216
- "impact",
15217
- "warnings"
15218
- ],
15219
- additionalProperties: false
15220
- },
15221
- {
15222
- type: "object",
15223
- properties: {
15224
- kind: {
15225
- type: "string",
15226
- const: "operation"
15227
- },
15228
- operationId: {
15229
- type: "string",
15230
- minLength: 1,
15231
- maxLength: 191
15232
- },
15233
- survivingCustomerId: {
15234
- type: "string",
15235
- minLength: 1,
15236
- maxLength: 191
15237
- },
15238
- duplicateCustomerId: {
15239
- type: "string",
15240
- minLength: 1,
15241
- maxLength: 191
15242
- },
15243
- status: {
15244
- type: "string",
15245
- enum: [
15246
- "queued",
15247
- "running",
15248
- "completed",
15249
- "failed"
15250
- ]
15251
- },
15252
- phase: {
15253
- type: "string",
15254
- minLength: 1,
15255
- maxLength: 100
15256
- },
15257
- error: {
15258
- type: "object",
15259
- properties: {
15260
- code: {
15261
- type: "string",
15262
- minLength: 1,
15263
- maxLength: 100
17129
+ refusals: {
17130
+ type: "array",
17131
+ items: {
17132
+ type: "string"
17133
+ }
15264
17134
  },
15265
- message: {
15266
- type: "string",
15267
- maxLength: 1000
17135
+ informationalObservations: {
17136
+ type: "array",
17137
+ items: {
17138
+ type: "string"
17139
+ }
15268
17140
  }
15269
17141
  },
15270
17142
  required: [
15271
- "code",
15272
- "message"
17143
+ "disposition",
17144
+ "followThroughComplete",
17145
+ "admissionAuditIds",
17146
+ "completionAuditIds",
17147
+ "movedIds"
15273
17148
  ],
15274
17149
  additionalProperties: false
15275
- }
15276
- },
15277
- required: [
15278
- "kind",
15279
- "operationId",
15280
- "survivingCustomerId",
15281
- "duplicateCustomerId",
15282
- "status",
15283
- "phase"
15284
- ],
15285
- additionalProperties: false
17150
+ },
17151
+ {
17152
+ type: "null"
17153
+ }
17154
+ ]
15286
17155
  }
15287
- ]
17156
+ },
17157
+ required: [
17158
+ "findingId",
17159
+ "state",
17160
+ "operationId",
17161
+ "summary",
17162
+ "nextStep",
17163
+ "receipt"
17164
+ ],
17165
+ additionalProperties: false
15288
17166
  }
15289
17167
  },
15290
- outlit_get_customer_merge_status: {
15291
- toolName: "outlit_get_customer_merge_status",
15292
- commandId: "customer.merge.status",
17168
+ outlit_verify_scoped_repair: {
17169
+ toolName: "outlit_verify_scoped_repair",
17170
+ commandId: "integrity.scoped_repair.verify",
15293
17171
  commandVersion: 1,
15294
17172
  ownerDomain: "identity",
15295
- title: "Get customer merge status",
15296
- 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.",
15297
17175
  annotations: {
15298
- readOnlyHint: true,
17176
+ readOnlyHint: false,
15299
17177
  destructiveHint: false
15300
17178
  },
15301
17179
  inputSchema: {
15302
17180
  $schema: "https://json-schema.org/draft/2020-12/schema",
15303
17181
  type: "object",
15304
17182
  properties: {
15305
- operationId: {
17183
+ findingId: {
15306
17184
  type: "string",
15307
17185
  minLength: 1,
15308
17186
  maxLength: 191
15309
17187
  }
15310
17188
  },
15311
17189
  required: [
15312
- "operationId"
17190
+ "findingId"
15313
17191
  ],
15314
17192
  additionalProperties: false
15315
17193
  },
@@ -15317,66 +17195,191 @@ Returns column definitions and example queries for each view.`,
15317
17195
  $schema: "https://json-schema.org/draft/2020-12/schema",
15318
17196
  type: "object",
15319
17197
  properties: {
15320
- kind: {
15321
- type: "string",
15322
- const: "operation"
15323
- },
15324
- operationId: {
15325
- type: "string",
15326
- minLength: 1,
15327
- maxLength: 191
15328
- },
15329
- survivingCustomerId: {
15330
- type: "string",
15331
- minLength: 1,
15332
- maxLength: 191
15333
- },
15334
- duplicateCustomerId: {
17198
+ findingId: {
15335
17199
  type: "string",
15336
17200
  minLength: 1,
15337
17201
  maxLength: 191
15338
17202
  },
15339
- status: {
17203
+ state: {
15340
17204
  type: "string",
15341
17205
  enum: [
15342
- "queued",
15343
- "running",
15344
- "completed",
15345
- "failed"
17206
+ "ready",
17207
+ "admitted",
17208
+ "pending_verification",
17209
+ "recovery_needed",
17210
+ "manual_required",
17211
+ "blocked",
17212
+ "verified"
15346
17213
  ]
15347
17214
  },
15348
- phase: {
15349
- type: "string",
15350
- minLength: 1,
15351
- maxLength: 100
15352
- },
15353
- error: {
15354
- type: "object",
15355
- properties: {
15356
- code: {
17215
+ operationId: {
17216
+ anyOf: [
17217
+ {
15357
17218
  type: "string",
15358
17219
  minLength: 1,
15359
- maxLength: 100
17220
+ maxLength: 191
15360
17221
  },
15361
- message: {
17222
+ {
17223
+ type: "null"
17224
+ }
17225
+ ]
17226
+ },
17227
+ summary: {
17228
+ type: "string"
17229
+ },
17230
+ nextStep: {
17231
+ anyOf: [
17232
+ {
15362
17233
  type: "string",
15363
- maxLength: 1000
17234
+ maxLength: 200
17235
+ },
17236
+ {
17237
+ type: "null"
15364
17238
  }
15365
- },
15366
- required: [
15367
- "code",
15368
- "message"
15369
- ],
15370
- 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
+ ]
15371
17373
  }
15372
17374
  },
15373
17375
  required: [
15374
- "kind",
17376
+ "findingId",
17377
+ "state",
15375
17378
  "operationId",
15376
- "survivingCustomerId",
15377
- "duplicateCustomerId",
15378
- "status",
15379
- "phase"
17379
+ "summary",
17380
+ "nextStep",
17381
+ "receipt",
17382
+ "verification"
15380
17383
  ],
15381
17384
  additionalProperties: false
15382
17385
  }
@@ -15432,6 +17435,7 @@ Returns column definitions and example queries for each view.`,
15432
17435
  "outlit_enable_destination",
15433
17436
  "outlit_disable_destination",
15434
17437
  "outlit_archive_destination",
17438
+ "outlit_submit_feedback",
15435
17439
  "outlit_get_integration_capabilities",
15436
17440
  "outlit_begin_integration_setup",
15437
17441
  "outlit_get_integration_setup_status",
@@ -15453,7 +17457,11 @@ Returns column definitions and example queries for each view.`,
15453
17457
  "outlit_list_identity_merge_suggestions",
15454
17458
  "outlit_reject_identity_merge_suggestion",
15455
17459
  "outlit_merge_customers",
15456
- "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"
15457
17465
  ],
15458
17466
  cli: [
15459
17467
  "outlit_list_customers",
@@ -15480,6 +17488,7 @@ Returns column definitions and example queries for each view.`,
15480
17488
  "outlit_enable_destination",
15481
17489
  "outlit_disable_destination",
15482
17490
  "outlit_archive_destination",
17491
+ "outlit_submit_feedback",
15483
17492
  "outlit_get_integration_capabilities",
15484
17493
  "outlit_begin_integration_setup",
15485
17494
  "outlit_get_integration_setup_status",
@@ -15501,7 +17510,11 @@ Returns column definitions and example queries for each view.`,
15501
17510
  "outlit_list_identity_merge_suggestions",
15502
17511
  "outlit_reject_identity_merge_suggestion",
15503
17512
  "outlit_merge_customers",
15504
- "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"
15505
17518
  ]
15506
17519
  };
15507
17520
  toolGatewayTransport = {
@@ -17557,11 +19570,11 @@ var init_list2 = __esm(() => {
17557
19570
  },
17558
19571
  "mrr-above": {
17559
19572
  type: "string",
17560
- 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)"
17561
19574
  },
17562
19575
  "mrr-below": {
17563
19576
  type: "string",
17564
- description: "Filter by MRR below threshold in cents"
19577
+ description: "Filter by MRR below threshold, in currentMrr's units"
17565
19578
  },
17566
19579
  "owner-id": {
17567
19580
  type: "string",
@@ -20798,12 +22811,147 @@ var init_search = __esm(() => {
20798
22811
  });
20799
22812
  });
20800
22813
 
22814
+ // src/commands/feedback.ts
22815
+ var exports_feedback = {};
22816
+ __export(exports_feedback, {
22817
+ default: () => feedback_default
22818
+ });
22819
+ import { readFileSync as readFileSync4 } from "node:fs";
22820
+ function readTextFile(path, flag, json) {
22821
+ try {
22822
+ return readFileSync4(path, "utf-8");
22823
+ } catch (error) {
22824
+ return outputError({
22825
+ message: `Cannot read ${flag} file: ${errorMessage(error, "unknown error")}`,
22826
+ code: "file_error"
22827
+ }, json);
22828
+ }
22829
+ }
22830
+ function resolveBody(args, json) {
22831
+ if (args.body !== undefined && args.bodyFile !== undefined) {
22832
+ return outputError({ message: "Use either --body or --body-file, not both", code: "invalid_input" }, json);
22833
+ }
22834
+ const raw = args.bodyFile !== undefined ? readTextFile(args.bodyFile, "--body-file", json) : args.body;
22835
+ const trimmed = raw?.trim();
22836
+ if (!trimmed) {
22837
+ return outputError({ message: "Provide --body or --body-file", code: "missing_input" }, json);
22838
+ }
22839
+ if (trimmed.length > BODY_MAX_LENGTH) {
22840
+ return outputError({ message: `--body must be at most ${BODY_MAX_LENGTH} characters`, code: "invalid_input" }, json);
22841
+ }
22842
+ return trimmed;
22843
+ }
22844
+ function resolveArea(area, json) {
22845
+ if (area === undefined)
22846
+ return;
22847
+ const trimmed = area.trim();
22848
+ if (!trimmed) {
22849
+ return outputError({ message: "--area must be a non-empty string", code: "invalid_input" }, json);
22850
+ }
22851
+ if (trimmed.length > AREA_MAX_LENGTH) {
22852
+ return outputError({ message: `--area must be at most ${AREA_MAX_LENGTH} characters`, code: "invalid_input" }, json);
22853
+ }
22854
+ return trimmed;
22855
+ }
22856
+ function resolveContext(args, json) {
22857
+ if (args.context !== undefined && args.contextFile !== undefined) {
22858
+ return outputError({ message: "Use either --context or --context-file, not both", code: "invalid_input" }, json);
22859
+ }
22860
+ const raw = args.contextFile !== undefined ? readTextFile(args.contextFile, "--context-file", json) : args.context;
22861
+ if (raw === undefined)
22862
+ return;
22863
+ let parsed;
22864
+ try {
22865
+ parsed = JSON.parse(raw);
22866
+ } catch (error) {
22867
+ return outputError({
22868
+ message: `Invalid --context JSON: ${errorMessage(error, "parse failed")}`,
22869
+ code: "invalid_input"
22870
+ }, json);
22871
+ }
22872
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
22873
+ return outputError({ message: "--context must be a JSON object", code: "invalid_input" }, json);
22874
+ }
22875
+ if (Buffer.byteLength(JSON.stringify(parsed), "utf-8") > CONTEXT_MAX_BYTES) {
22876
+ return outputError({ message: "--context must serialize to at most 16 KiB", code: "invalid_input" }, json);
22877
+ }
22878
+ return parsed;
22879
+ }
22880
+ var BODY_MAX_LENGTH = 20000, AREA_MAX_LENGTH = 100, CONTEXT_MAX_BYTES, feedback_default;
22881
+ var init_feedback = __esm(() => {
22882
+ init_dist4();
22883
+ init_dist();
22884
+ init_auth();
22885
+ init_output2();
22886
+ init_api();
22887
+ init_output();
22888
+ CONTEXT_MAX_BYTES = 16 * 1024;
22889
+ feedback_default = defineCommand2({
22890
+ meta: {
22891
+ name: "feedback",
22892
+ description: [
22893
+ "Submit product feedback to the Outlit team: bugs, feature ideas, or agent friction.",
22894
+ "Feedback is product intake, not a support ticket, and does not guarantee a reply.",
22895
+ "Do not include secrets or unnecessary customer data.",
22896
+ "",
22897
+ "Examples:",
22898
+ " outlit feedback --body 'The customers merge preview did not list the losing record traits' --json",
22899
+ " outlit feedback --body 'Add a way to export attention items' --area attention --json",
22900
+ ` outlit feedback --body 'SQL tool rejected a valid LIMIT clause' --context '{"surface":"cli","command":"sql"}' --json`,
22901
+ " outlit feedback --body-file report.md --context-file diagnostics.json --json",
22902
+ "",
22903
+ AGENT_JSON_HINT
22904
+ ].join(`
22905
+ `)
22906
+ },
22907
+ args: {
22908
+ ...authArgs,
22909
+ ...outputArgs,
22910
+ body: {
22911
+ type: "string",
22912
+ description: "Feedback text: trimmed, non-empty, at most 20000 characters"
22913
+ },
22914
+ "body-file": {
22915
+ type: "string",
22916
+ description: "Path to a UTF-8 text file containing the feedback body"
22917
+ },
22918
+ area: {
22919
+ type: "string",
22920
+ description: "Optional product area label, at most 100 characters"
22921
+ },
22922
+ context: {
22923
+ type: "string",
22924
+ description: "Optional JSON object with diagnostic context, at most 16 KiB serialized. Never include secrets."
22925
+ },
22926
+ "context-file": {
22927
+ type: "string",
22928
+ description: "Path to a JSON file with diagnostic context (mutually exclusive with --context)"
22929
+ }
22930
+ },
22931
+ async run({ args }) {
22932
+ const json = !!args.json;
22933
+ const client = await getClientOrExit(args["api-key"], json);
22934
+ const body = resolveBody({ body: args.body, bodyFile: args["body-file"] }, json);
22935
+ const area = resolveArea(args.area, json);
22936
+ const context = resolveContext({ context: args.context, contextFile: args["context-file"] }, json);
22937
+ const input = { body };
22938
+ if (area !== undefined)
22939
+ input.area = area;
22940
+ if (context !== undefined)
22941
+ input.context = context;
22942
+ return runTool(client, publicToolContracts.outlit_submit_feedback.toolName, input, json, {
22943
+ spinnerMessage: "Submitting feedback..."
22944
+ });
22945
+ }
22946
+ });
22947
+ });
22948
+
20801
22949
  // src/commands/sql.ts
20802
22950
  var exports_sql = {};
20803
22951
  __export(exports_sql, {
20804
22952
  default: () => sql_default
20805
22953
  });
20806
- import { readFileSync as readFileSync4 } from "node:fs";
22954
+ import { readFileSync as readFileSync5 } from "node:fs";
20807
22955
  var publicSqlViews, sql_default;
20808
22956
  var init_sql = __esm(() => {
20809
22957
  init_dist4();
@@ -20857,7 +23005,7 @@ var init_sql = __esm(() => {
20857
23005
  let sql;
20858
23006
  if (args["query-file"]) {
20859
23007
  try {
20860
- sql = readFileSync4(args["query-file"], "utf-8");
23008
+ sql = readFileSync5(args["query-file"], "utf-8");
20861
23009
  } catch (err) {
20862
23010
  return outputError({
20863
23011
  message: `Cannot read file: ${errorMessage(err, "unknown error")}`,
@@ -22613,8 +24761,8 @@ var init_completions = __esm(() => {
22613
24761
  ...ACTIVITY_ORDER,
22614
24762
  { name: "--trait", desc: "Filter by trait key=value pairs" },
22615
24763
  { name: "--billing-status", desc: "Filter by billing status" },
22616
- { name: "--mrr-above", desc: "MRR above threshold (cents)" },
22617
- { 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)" },
22618
24766
  { name: "--owner-id", desc: "Filter by owner user ID" },
22619
24767
  { name: "--owner-email", desc: "Filter by owner email" },
22620
24768
  { name: "--has-owner", desc: "Only customers with an owner" },
@@ -22872,6 +25020,18 @@ var init_completions = __esm(() => {
22872
25020
  }
22873
25021
  ]
22874
25022
  },
25023
+ {
25024
+ name: "feedback",
25025
+ desc: "Submit product feedback",
25026
+ flags: [
25027
+ ...COMMON,
25028
+ { name: "--body", desc: "Feedback text (max 20000 chars)" },
25029
+ { name: "--body-file", desc: "Read feedback text from a file" },
25030
+ { name: "--area", desc: "Optional product area label" },
25031
+ { name: "--context", desc: "Optional JSON context object (max 16 KiB)" },
25032
+ { name: "--context-file", desc: "Read JSON context object from a file" }
25033
+ ]
25034
+ },
22875
25035
  {
22876
25036
  name: "search",
22877
25037
  desc: "Search customer context",
@@ -23832,6 +25992,7 @@ async function startCli() {
23832
25992
  " outlit features create --source metric_source_v1_0123456789abcdef0123456789abcdef --event report_exported --key reports_exported --name 'Reports exported' --json",
23833
25993
  " outlit customers features acme.com --weekly --json",
23834
25994
  " outlit customers credits acme.com --json",
25995
+ " outlit feedback --body 'The merge preview dropped trait history' --area customers --json",
23835
25996
  " outlit doctor --json",
23836
25997
  "",
23837
25998
  "For AI agents: commands auto-output JSON when stdout is piped. No --json flag needed."
@@ -23852,6 +26013,7 @@ async function startCli() {
23852
26013
  facts: () => Promise.resolve().then(() => (init_facts(), exports_facts)).then((m) => m.default),
23853
26014
  sources: () => Promise.resolve().then(() => (init_sources(), exports_sources)).then((m) => m.default),
23854
26015
  search: () => Promise.resolve().then(() => (init_search(), exports_search)).then((m) => m.default),
26016
+ feedback: () => Promise.resolve().then(() => (init_feedback(), exports_feedback)).then((m) => m.default),
23855
26017
  sql: () => Promise.resolve().then(() => (init_sql(), exports_sql)).then((m) => m.default),
23856
26018
  schema: () => Promise.resolve().then(() => (init_schema(), exports_schema)).then((m) => m.default),
23857
26019
  destinations: () => Promise.resolve().then(() => (init_destinations(), exports_destinations)).then((m) => m.default),