atmn 2.0.33 → 2.0.35

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 (40) hide show
  1. package/dist/bin.js +1409 -188
  2. package/dist/index.js +220 -19
  3. package/dist/tsconfig.tsbuildinfo +1 -1
  4. package/package.json +2 -2
  5. package/src/actions/pull/webhooks/appendWebhook.ts +84 -0
  6. package/src/actions/pull/webhooks/applyWebhooksPull.ts +111 -0
  7. package/src/actions/pull/webhooks/locateWebhook.ts +22 -0
  8. package/src/actions/pull/webhooks/removeWebhookEnv.ts +141 -0
  9. package/src/actions/pull/webhooks/types.ts +20 -0
  10. package/src/actions/pull/webhooks/updateWebhook.ts +138 -0
  11. package/src/actions/pull.ts +32 -2
  12. package/src/actions/push/pushLanesError.ts +47 -0
  13. package/src/actions/push.ts +220 -60
  14. package/src/actions/webhooks/applyWebhooks.ts +52 -0
  15. package/src/actions/webhooks/isDashboardWebhook.ts +9 -0
  16. package/src/actions/webhooks/newWebhookId.ts +4 -0
  17. package/src/actions/webhooks/previewWebhooks.ts +40 -0
  18. package/src/actions/webhooks/resolveWebhookEnv.ts +34 -0
  19. package/src/actions/webhooks/resolveWebhooksForEnv.ts +29 -0
  20. package/src/actions/webhooks/types/webhookEnv.ts +9 -0
  21. package/src/actions/webhooks/webhookSecretName.ts +22 -0
  22. package/src/actions/webhooks/writeWebhookSecrets.ts +55 -0
  23. package/src/cli.ts +20 -1
  24. package/src/config/loadConfig.ts +3 -0
  25. package/src/generated/apiRoutes.ts +165 -1
  26. package/src/generated/client.ts +239 -1
  27. package/src/generated/emit.ts +20 -1
  28. package/src/generated/emitRuntime.ts +8 -0
  29. package/src/generated/isLocalWebhookUrl.ts +64 -0
  30. package/src/generated/lintRules.ts +95 -0
  31. package/src/generated/lintRuntime.ts +113 -10
  32. package/src/generated/sandboxName.ts +52 -0
  33. package/src/generated/skills.ts +10 -10
  34. package/src/generated/webhooks.ts +36 -0
  35. package/src/generated/wire.ts +32 -5
  36. package/src/index.ts +1 -0
  37. package/src/render/renderPreview.ts +17 -2
  38. package/src/render/renderWebhooks.ts +92 -0
  39. package/src/surgery/appendPropertyEdit.ts +9 -3
  40. package/src/surgery/patchFixturePaths.ts +57 -5
package/dist/bin.js CHANGED
@@ -4,7 +4,7 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
4
4
 
5
5
  // src/cli.ts
6
6
  import { spawnSync as spawnSync3 } from "node:child_process";
7
- import { join as join14 } from "node:path";
7
+ import { join as join15 } from "node:path";
8
8
  import { Command } from "commander";
9
9
 
10
10
  // src/auth/oauthConfig.ts
@@ -3793,7 +3793,7 @@ var API_ROUTES = [
3793
3793
  name: "name",
3794
3794
  type: "string",
3795
3795
  required: true,
3796
- description: "A name for the sandbox, unique within your organization."
3796
+ description: "A name for the sandbox, unique within your organization. No spaces, and it can't be `live` or `sandbox`."
3797
3797
  },
3798
3798
  {
3799
3799
  name: "color",
@@ -3839,9 +3839,206 @@ var API_ROUTES = [
3839
3839
  description: "Wipes every customer, plan, feature and migration draft in the sandbox the calling key belongs to, leaving the sandbox itself, its secret keys and its settings in place. There is no id to pass: a sandbox's own key resets that sandbox, and an organization's test-mode key resets its default sandbox environment. Refused for live keys — only sandboxes can be reset. Cannot be undone.",
3840
3840
  body: "none",
3841
3841
  fields: []
3842
+ },
3843
+ {
3844
+ group: "webhooks",
3845
+ method: "create",
3846
+ path: "/v1/webhooks.create",
3847
+ description: "Creates a webhook: a URL Autumn sends the listed events to, in the environment of the calling key. You choose the `id`, and it can't be changed later. Returns the signing secret once, in this response — store it, it cannot be read back.",
3848
+ body: "object",
3849
+ fields: [
3850
+ {
3851
+ name: "id",
3852
+ type: "string",
3853
+ required: true,
3854
+ description: "Your ID for the webhook: letters, digits, `-` and `_`. It can't be changed after creation."
3855
+ },
3856
+ {
3857
+ name: "url",
3858
+ type: "string",
3859
+ required: true,
3860
+ description: "The https URL Autumn sends events to. Localhost and private-network addresses are rejected; tunnels such as ngrok work."
3861
+ },
3862
+ {
3863
+ name: "events",
3864
+ type: "json",
3865
+ required: true,
3866
+ description: "The events sent to this webhook. At least one. `vercel.*` events can't be mixed with other events."
3867
+ },
3868
+ {
3869
+ name: "description",
3870
+ type: "string",
3871
+ required: false,
3872
+ description: "A note for your own reference."
3873
+ },
3874
+ {
3875
+ name: "disabled",
3876
+ type: "boolean",
3877
+ required: false,
3878
+ description: "When true, no events are sent to the webhook."
3879
+ }
3880
+ ]
3881
+ },
3882
+ {
3883
+ group: "webhooks",
3884
+ method: "get",
3885
+ path: "/v1/webhooks.get",
3886
+ description: "Gets one webhook by ID. The signing secret is never returned here — only `webhooks.create` and `webhooks.sync` show one, when they create the webhook.",
3887
+ body: "object",
3888
+ fields: [
3889
+ {
3890
+ name: "id",
3891
+ type: "string",
3892
+ required: true,
3893
+ description: "The webhook's ID. Webhooks made in the dashboard use the `ep_…` ID shown by `webhooks.list`."
3894
+ }
3895
+ ]
3896
+ },
3897
+ {
3898
+ group: "webhooks",
3899
+ method: "list",
3900
+ path: "/v1/webhooks.list",
3901
+ description: "Lists every webhook in the environment of the calling key, including ones made in the dashboard (these show their `ep_…` ID).",
3902
+ body: "none",
3903
+ fields: []
3904
+ },
3905
+ {
3906
+ group: "webhooks",
3907
+ method: "update",
3908
+ path: "/v1/webhooks.update",
3909
+ description: "Updates a webhook's URL, events, description or disabled state. Only the fields you pass change. The ID can't be changed — to rename, create a new webhook.",
3910
+ body: "object",
3911
+ fields: [
3912
+ {
3913
+ name: "id",
3914
+ type: "string",
3915
+ required: true,
3916
+ description: "The webhook's ID. Webhooks made in the dashboard use the `ep_…` ID shown by `webhooks.list`."
3917
+ },
3918
+ {
3919
+ name: "url",
3920
+ type: "string",
3921
+ required: false,
3922
+ description: "The https URL Autumn sends events to. Localhost and private-network addresses are rejected; tunnels such as ngrok work."
3923
+ },
3924
+ {
3925
+ name: "events",
3926
+ type: "json",
3927
+ required: false,
3928
+ description: "The events sent to this webhook. At least one. `vercel.*` events can't be mixed with other events."
3929
+ },
3930
+ {
3931
+ name: "description",
3932
+ type: "string",
3933
+ required: false,
3934
+ description: "A note for your own reference."
3935
+ },
3936
+ {
3937
+ name: "disabled",
3938
+ type: "boolean",
3939
+ required: false,
3940
+ description: "When true, no events are sent to the webhook."
3941
+ }
3942
+ ]
3943
+ },
3944
+ {
3945
+ group: "webhooks",
3946
+ method: "delete",
3947
+ path: "/v1/webhooks.delete",
3948
+ description: "Permanently deletes a webhook. Autumn stops sending it events immediately. Cannot be undone.",
3949
+ body: "object",
3950
+ fields: [
3951
+ {
3952
+ name: "id",
3953
+ type: "string",
3954
+ required: true,
3955
+ description: "The webhook's ID. Webhooks made in the dashboard use the `ep_…` ID shown by `webhooks.list`."
3956
+ }
3957
+ ]
3958
+ },
3959
+ {
3960
+ group: "webhooks",
3961
+ method: "preview_sync",
3962
+ path: "/v1/webhooks.preview_sync",
3963
+ description: "Shows what `webhooks.sync` would do with the same body, without changing anything: which webhooks it would create or update, and which existing ones it would leave alone because the body doesn't list them.",
3964
+ body: "object",
3965
+ fields: [
3966
+ {
3967
+ name: "webhooks",
3968
+ type: "json",
3969
+ required: true,
3970
+ description: "The webhooks to create or update. Webhooks not listed are left alone; nothing is deleted."
3971
+ }
3972
+ ]
3973
+ },
3974
+ {
3975
+ group: "webhooks",
3976
+ method: "sync",
3977
+ path: "/v1/webhooks.sync",
3978
+ description: "Makes the listed webhooks exist as described: creates missing ones and updates ones that differ. Webhooks not listed are left alone — sync never deletes. Returns the signing secret of each webhook it created, once. Each webhook is applied on its own: failures are listed in `errors` while the rest still apply, and the request fails only when none could be applied.",
3979
+ body: "object",
3980
+ fields: [
3981
+ {
3982
+ name: "webhooks",
3983
+ type: "json",
3984
+ required: true,
3985
+ description: "The webhooks to create or update. Webhooks not listed are left alone; nothing is deleted."
3986
+ }
3987
+ ]
3842
3988
  }
3843
3989
  ];
3844
3990
 
3991
+ // src/generated/isLocalWebhookUrl.ts
3992
+ var PRIVATE_IPV4_RANGES = [
3993
+ [0, 32],
3994
+ [2130706432, 8],
3995
+ [167772160, 8],
3996
+ [2886729728, 12],
3997
+ [3232235520, 16],
3998
+ [2851995648, 16]
3999
+ ];
4000
+ var parseIpv4 = (host) => {
4001
+ const parts = host.split(".");
4002
+ if (parts.length !== 4)
4003
+ return null;
4004
+ if (parts.some((part) => !/^\d+$/.test(part) || Number(part) > 255)) {
4005
+ return null;
4006
+ }
4007
+ return parts.reduce((acc, part) => acc * 256 + Number(part), 0);
4008
+ };
4009
+ var isPrivateIpv4 = (address) => PRIVATE_IPV4_RANGES.some(([base, prefixBits]) => {
4010
+ const mask = prefixBits === 0 ? 0 : 4294967295 << 32 - prefixBits >>> 0;
4011
+ return (address & mask) >>> 0 === base;
4012
+ });
4013
+ var isLocalIpv6 = (host) => {
4014
+ if (host === "::1" || host === "::")
4015
+ return true;
4016
+ if (/^fe[89ab][0-9a-f]:/.test(host))
4017
+ return true;
4018
+ if (/^f[cd][0-9a-f]{0,2}:/.test(host))
4019
+ return true;
4020
+ const [, high, low] = host.match(/^::ffff:([0-9a-f]{1,4}):([0-9a-f]{1,4})$/) ?? [];
4021
+ if (!high || !low)
4022
+ return false;
4023
+ return isPrivateIpv4(Number.parseInt(high, 16) * 65536 + Number.parseInt(low, 16));
4024
+ };
4025
+ var isLocalWebhookUrl = (url) => {
4026
+ let hostname;
4027
+ try {
4028
+ hostname = new URL(url).hostname.toLowerCase().replace(/\.$/, "");
4029
+ } catch {
4030
+ return false;
4031
+ }
4032
+ if (hostname.startsWith("[") && hostname.endsWith("]")) {
4033
+ return isLocalIpv6(hostname.slice(1, -1));
4034
+ }
4035
+ if (hostname === "localhost" || hostname.endsWith(".localhost") || hostname.endsWith(".local")) {
4036
+ return true;
4037
+ }
4038
+ const ipv4 = parseIpv4(hostname);
4039
+ return ipv4 !== null && isPrivateIpv4(ipv4);
4040
+ };
4041
+
3845
4042
  // src/generated/lintRules.ts
3846
4043
  var LINT_RULES = {
3847
4044
  features: {
@@ -4145,6 +4342,10 @@ var LINT_RULES = {
4145
4342
  keys: {
4146
4343
  minLength: 1,
4147
4344
  maxLength: 64
4345
+ },
4346
+ values: {
4347
+ minLength: 1,
4348
+ maxLength: 128
4148
4349
  }
4149
4350
  },
4150
4351
  "plans.billingControls.usageLimits": {
@@ -4168,6 +4369,10 @@ var LINT_RULES = {
4168
4369
  keys: {
4169
4370
  minLength: 1,
4170
4371
  maxLength: 64
4372
+ },
4373
+ values: {
4374
+ minLength: 1,
4375
+ maxLength: 128
4171
4376
  }
4172
4377
  },
4173
4378
  "plans.freeTrial": {
@@ -5138,6 +5343,10 @@ var LINT_RULES = {
5138
5343
  keys: {
5139
5344
  minLength: 1,
5140
5345
  maxLength: 64
5346
+ },
5347
+ values: {
5348
+ minLength: 1,
5349
+ maxLength: 128
5141
5350
  }
5142
5351
  },
5143
5352
  "plans.variants.customize.billingControls.usageLimits": {
@@ -5161,6 +5370,10 @@ var LINT_RULES = {
5161
5370
  keys: {
5162
5371
  minLength: 1,
5163
5372
  maxLength: 64
5373
+ },
5374
+ values: {
5375
+ minLength: 1,
5376
+ maxLength: 128
5164
5377
  }
5165
5378
  },
5166
5379
  "plans.variants.customize.freeTrial": {
@@ -5987,6 +6200,80 @@ var LINT_RULES = {
5987
6200
  exclusiveMinimum: 0
5988
6201
  }
5989
6202
  }
6203
+ },
6204
+ webhooks: {
6205
+ label: "webhook",
6206
+ idField: "id",
6207
+ required: ["events", "id", "url"],
6208
+ fields: {
6209
+ id: {
6210
+ minLength: 1,
6211
+ maxLength: 256,
6212
+ pattern: "^[a-zA-Z0-9_-]+$"
6213
+ },
6214
+ events: {
6215
+ minItems: 1
6216
+ }
6217
+ },
6218
+ rules: [
6219
+ {
6220
+ kind: "unique",
6221
+ field: "id",
6222
+ because: "Two webhooks claiming one id race to define the same endpoint."
6223
+ },
6224
+ {
6225
+ kind: "unique",
6226
+ field: "id",
6227
+ asEnvName: true,
6228
+ because: "Each webhook's signing secret is saved as AUTUMN_WEBHOOK_<ID>_SECRET, so these two would overwrite each other's secret. Rename one."
6229
+ },
6230
+ {
6231
+ kind: "rejects",
6232
+ field: "url",
6233
+ check: "isLocalWebhookUrl",
6234
+ because: "Autumn delivers from the internet, so localhost and private-network addresses can never be reached. Use a public URL or a tunnel (e.g. ngrok)."
6235
+ },
6236
+ {
6237
+ kind: "uniformPrefix",
6238
+ field: "events",
6239
+ prefix: "vercel.",
6240
+ because: "vercel.* events can't be mixed with other events in one webhook: they're delivered from a separate app. Make one webhook for each."
6241
+ },
6242
+ {
6243
+ kind: "nonEmpty",
6244
+ field: "url",
6245
+ warning: true,
6246
+ because: "With no environment key the webhook is registered nowhere. Add `live`, `sandbox` or a sandbox's slug."
6247
+ },
6248
+ {
6249
+ kind: "knownValues",
6250
+ field: "events",
6251
+ values: [
6252
+ "customer.products.updated",
6253
+ "customer.threshold_reached",
6254
+ "balances.usage_alert_triggered",
6255
+ "balances.limit_reached",
6256
+ "billing.auto_topup_failed",
6257
+ "billing.auto_topup_succeeded",
6258
+ "billing.updated",
6259
+ "invoice.finalized",
6260
+ "vercel.resources.deleted",
6261
+ "vercel.resources.provisioned",
6262
+ "vercel.resources.rotate_secrets",
6263
+ "vercel.webhooks.event"
6264
+ ],
6265
+ warning: true,
6266
+ because: "isn't known to this atmn version; the server will check it."
6267
+ }
6268
+ ]
6269
+ },
6270
+ "webhooks.url": {
6271
+ keys: {
6272
+ pattern: "^[a-z0-9_-]+$"
6273
+ },
6274
+ values: {
6275
+ pattern: "^[Hh][Tt][Tt][Pp][Ss]:\\/\\/"
6276
+ }
5990
6277
  }
5991
6278
  };
5992
6279
 
@@ -6157,7 +6444,8 @@ var entryRuleFailures = ({
6157
6444
  entry,
6158
6445
  rule,
6159
6446
  document,
6160
- parent
6447
+ parent,
6448
+ checks
6161
6449
  }) => {
6162
6450
  switch (rule.kind) {
6163
6451
  case "requiredWhen": {
@@ -6197,9 +6485,29 @@ var entryRuleFailures = ({
6197
6485
  }
6198
6486
  case "nonEmpty": {
6199
6487
  const value = entry[rule.field];
6200
- if (!Array.isArray(value) || value.length > 0)
6488
+ const empty = Array.isArray(value) ? value.length === 0 : isEntry(value) && Object.keys(value).length === 0;
6489
+ return empty ? [`${rule.field} is empty. ${rule.because}`] : [];
6490
+ }
6491
+ case "knownValues": {
6492
+ const value = entry[rule.field];
6493
+ if (!Array.isArray(value))
6494
+ return [];
6495
+ return value.filter((item) => typeof item === "string" && !rule.values.includes(item)).map((item) => `\`${item}\` ${rule.because}`);
6496
+ }
6497
+ case "uniformPrefix": {
6498
+ const value = entry[rule.field];
6499
+ if (!Array.isArray(value))
6500
+ return [];
6501
+ const prefixed = value.filter((item) => typeof item === "string" && item.startsWith(rule.prefix)).length;
6502
+ return prefixed === 0 || prefixed === value.length ? [] : [rule.because];
6503
+ }
6504
+ case "rejects": {
6505
+ const value = entry[rule.field];
6506
+ const check = checks[rule.check];
6507
+ if (check === undefined)
6201
6508
  return [];
6202
- return [`${rule.field} is empty. ${rule.because}`];
6509
+ const stated = typeof value === "string" ? [value] : isEntry(value) ? Object.values(value).filter((item) => typeof item === "string") : [];
6510
+ return stated.filter((item) => check(item)).map((item) => `${rule.field} ${show(item)} is refused. ${rule.because}`);
6203
6511
  }
6204
6512
  case "compare": {
6205
6513
  const a = entry[rule.field];
@@ -6261,7 +6569,7 @@ var checkUnique = ({
6261
6569
  trail,
6262
6570
  issues
6263
6571
  }) => {
6264
- const seen = new Set;
6572
+ const seen = new Map;
6265
6573
  for (const [index, entry] of entries.entries()) {
6266
6574
  if (!isEntry(entry))
6267
6575
  continue;
@@ -6272,15 +6580,25 @@ var checkUnique = ({
6272
6580
  const pair = rule.alongside === undefined ? undefined : entry[rule.alongside];
6273
6581
  if (rule.alongside !== undefined && typeof pair !== "string")
6274
6582
  continue;
6275
- const composite = rule.alongside === undefined ? value : `${value}@${pair}`;
6276
- if (seen.has(composite)) {
6583
+ const normalized = rule.asEnvName ? value.toUpperCase().replace(/-/g, "_") : value;
6584
+ const composite = rule.alongside === undefined ? normalized : `${normalized}@${pair}`;
6585
+ const first = seen.get(composite);
6586
+ if (rule.asEnvName && first !== undefined) {
6587
+ if (first !== value)
6588
+ issues.push({
6589
+ path: render([...trail, crumbFor({ node, key, entry, index })]),
6590
+ message: `${fieldName} ${show(value)} and ${show(first)} both read as ${normalized} in an env var name. ${rule.because}`
6591
+ });
6592
+ continue;
6593
+ }
6594
+ if (first !== undefined) {
6277
6595
  const label = rule.alongside === undefined ? `${fieldName} ${show(value)}` : `${fieldName} ${show(value)} with ${rule.alongside} ${show(pair)}`;
6278
6596
  issues.push({
6279
6597
  path: render([...trail, crumbFor({ node, key, entry, index })]),
6280
6598
  message: `${label} is used more than once. ${rule.because}`
6281
6599
  });
6282
6600
  }
6283
- seen.add(composite);
6601
+ seen.set(composite, value);
6284
6602
  }
6285
6603
  };
6286
6604
  var pinOf = ({
@@ -6421,13 +6739,15 @@ var checkEntry = ({
6421
6739
  checkVariants({ entry, variants: node.variants, at, issues: walk.issues });
6422
6740
  }
6423
6741
  for (const rule of node.rules ?? []) {
6742
+ const warning = "warning" in rule && rule.warning === true;
6424
6743
  for (const message of entryRuleFailures({
6425
6744
  entry,
6426
6745
  rule,
6427
6746
  document: walk.document,
6428
- parent
6747
+ parent,
6748
+ checks: walk.checks
6429
6749
  })) {
6430
- walk.issues.push({ path: at, message });
6750
+ walk.issues.push({ path: at, message, ...warning ? { warning } : {} });
6431
6751
  }
6432
6752
  }
6433
6753
  };
@@ -6490,7 +6810,17 @@ var walkValue = ({
6490
6810
  return;
6491
6811
  if (walk.hints.recordPaths.has(path)) {
6492
6812
  const keys = walk.rules[path]?.keys;
6813
+ const values = walk.rules[path]?.values;
6493
6814
  for (const [recordKey, child] of Object.entries(value)) {
6815
+ if (values && !isEntry(child) && !Array.isArray(child)) {
6816
+ for (const message of constraintFailures({
6817
+ name: `${key}.${recordKey}`,
6818
+ value: child,
6819
+ constraints: values
6820
+ })) {
6821
+ walk.issues.push({ path: render(trail), message });
6822
+ }
6823
+ }
6494
6824
  if (keys) {
6495
6825
  for (const message of constraintFailures({
6496
6826
  name: `${key} key ${show(recordKey)}`,
@@ -6516,9 +6846,10 @@ var walkValue = ({
6516
6846
  var lintDocument = ({
6517
6847
  document,
6518
6848
  rules,
6519
- hints
6849
+ hints,
6850
+ checks = {}
6520
6851
  }) => {
6521
- const walk = { document, rules, hints, issues: [] };
6852
+ const walk = { document, rules, hints, checks, issues: [] };
6522
6853
  walkEntry({ entry: document, path: "", trail: [], walk });
6523
6854
  return walk.issues;
6524
6855
  };
@@ -6653,7 +6984,8 @@ var CATALOG_HINTS = hintsOf({
6653
6984
  "plans.variants.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers",
6654
6985
  "plans.variants.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match",
6655
6986
  "plans.variants.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups",
6656
- "plans.variants.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups"
6987
+ "plans.variants.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups",
6988
+ "webhooks.url"
6657
6989
  ],
6658
6990
  frozenPaths: [
6659
6991
  "plans.licenses.metadata",
@@ -6670,15 +7002,19 @@ var stated = (config) => ({
6670
7002
  } : {},
6671
7003
  ...config.rewards !== undefined ? { rewards: config.rewards } : {},
6672
7004
  ...config.referralPrograms !== undefined ? { referralPrograms: config.referralPrograms } : {},
6673
- ...config.settings !== undefined ? { settings: config.settings } : {}
7005
+ ...config.settings !== undefined ? { settings: config.settings } : {},
7006
+ ...config.webhooks !== undefined ? { webhooks: config.webhooks } : {}
6674
7007
  });
6675
7008
  var SINGLETON_KEYS = ["settings"];
7009
+ var LIST_KEYS = ["webhooks"];
7010
+ var WARNINGS_KEY = "lint_warnings";
6676
7011
  var CONFIG_KEYS = [
6677
7012
  "features",
6678
7013
  "plans",
6679
7014
  "rewards",
6680
7015
  "referralPrograms",
6681
- "settings"
7016
+ "settings",
7017
+ "webhooks"
6682
7018
  ];
6683
7019
  var unknownKeyIssue = (key) => key === "planVersions" ? {
6684
7020
  path: key,
@@ -6688,10 +7024,14 @@ var unknownKeyIssue = (key) => key === "planVersions" ? {
6688
7024
  message: `${key} is not a config field. The fields are ${CONFIG_KEYS.join(", ")}.`
6689
7025
  };
6690
7026
  var splitWire = (document) => ({
6691
- catalog: Object.fromEntries(Object.entries(document).filter(([key]) => !SINGLETON_KEYS.includes(key))),
7027
+ catalog: Object.fromEntries(Object.entries(document).filter(([key]) => !SINGLETON_KEYS.includes(key) && !LIST_KEYS.includes(key) && key !== WARNINGS_KEY)),
6692
7028
  singletons: {
6693
7029
  settings: document.settings === undefined ? undefined : { config: document.settings }
6694
- }
7030
+ },
7031
+ lists: {
7032
+ webhooks: document.webhooks
7033
+ },
7034
+ warnings: document[WARNINGS_KEY] ?? []
6695
7035
  });
6696
7036
  var atmn = (config) => {
6697
7037
  const unknownKeys = Object.keys(config).filter((key) => !CONFIG_KEYS.includes(key));
@@ -6701,16 +7041,20 @@ var atmn = (config) => {
6701
7041
  const issues = lintDocument({
6702
7042
  document,
6703
7043
  rules: LINT_RULES,
6704
- hints: CATALOG_HINTS
7044
+ hints: CATALOG_HINTS,
7045
+ checks: { isLocalWebhookUrl }
6705
7046
  });
6706
- if (issues.length > 0)
6707
- throw new ConfigError(issues);
7047
+ const errors = issues.filter((issue) => issue.warning !== true);
7048
+ if (errors.length > 0)
7049
+ throw new ConfigError(errors);
7050
+ const warnings = issues.filter((issue) => issue.warning === true);
6708
7051
  return {
6709
7052
  ...toWire({
6710
7053
  value: document,
6711
7054
  path: "",
6712
7055
  hints: CATALOG_HINTS
6713
7056
  }),
7057
+ ...warnings.length > 0 ? { [WARNINGS_KEY]: warnings } : {},
6714
7058
  skip_deletions: false,
6715
7059
  migration: { draft: true }
6716
7060
  };
@@ -6780,6 +7124,21 @@ var RESETSANDBOX_REQUEST_HINTS = hintsOf({
6780
7124
  frozenPaths: [],
6781
7125
  renamedPaths: {}
6782
7126
  });
7127
+ var LISTWEBHOOKS_REQUEST_HINTS = hintsOf({
7128
+ recordPaths: [],
7129
+ frozenPaths: [],
7130
+ renamedPaths: {}
7131
+ });
7132
+ var PREVIEWSYNCWEBHOOKS_REQUEST_HINTS = hintsOf({
7133
+ recordPaths: [],
7134
+ frozenPaths: [],
7135
+ renamedPaths: {}
7136
+ });
7137
+ var SYNCWEBHOOKS_REQUEST_HINTS = hintsOf({
7138
+ recordPaths: [],
7139
+ frozenPaths: [],
7140
+ renamedPaths: {}
7141
+ });
6783
7142
  var DIFF_RESPONSE_HINTS = hintsOf({
6784
7143
  recordPaths: ["migrations.operations.customer.customize.addItems.featureOverride.creditSchema.dimensions", "migrations.operations.customer.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "migrations.operations.customer.customize.addItems.featureOverride.creditSchema.multipliers", "migrations.operations.customer.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "migrations.operations.customer.customize.addItems.featureOverride.markups.modelMarkups", "migrations.operations.customer.customize.addItems.featureOverride.markups.providerMarkups", "migrations.operations.customer.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "migrations.operations.customer.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "migrations.operations.customer.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "migrations.operations.customer.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "migrations.operations.customer.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.plan.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.licenseParents.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.plan.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenseParents.siblingVersions.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.licenseParents.siblingVersions.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.licenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenses.plan.billingControls.usageAlerts.filter.properties", "plans.licenses.plan.billingControls.usageLimits.filter.properties", "plans.licenses.plan.items.featureOverride.creditSchema.dimensions", "plans.licenses.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.licenses.plan.items.featureOverride.creditSchema.multipliers", "plans.licenses.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.licenses.plan.items.featureOverride.markups.modelMarkups", "plans.licenses.plan.items.featureOverride.markups.providerMarkups", "plans.licenses.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenses.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenses.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenses.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenses.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenses.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.licenses.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.licenses.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.licenses.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.licenses.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenses.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.licenses.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenses.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.licenses.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.planChange.customize.billingControls.usageLimits.filter.properties", "plans.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.planChange.plan.billingControls.usageLimits.filter.properties", "plans.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.licenseParents.siblingVersions.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.licenseParents.siblingVersions.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.plan.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.siblingVersions.variants.siblingVersions.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.siblingVersions.variants.siblingVersions.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.variants.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.customize.billingControls.usageLimits.filter.properties", "plans.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.variants.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.variants.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.variants.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.variants.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.plan.billingControls.usageLimits.filter.properties", "plans.variants.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.variants.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.variants.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.variants.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.variants.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.customize.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.plan.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.plan.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.plan.items.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.plan.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.plan.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.plan.items.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.plan.items.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.plan.items.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.billingControls.usageLimits.filter.properties", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.modelMarkups", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.customize.addItems.featureOverride.markups.providerMarkups", "plans.variants.siblingVersions.planChange.previousAttributes.billingControls.usageAlerts.filter.properties", "plans.variants.siblingVersions.planChange.previousAttributes.billingControls.usageLimits.filter.properties"],
6785
7144
  frozenPaths: ["features.previousAttributes", "migrations.operations.customer.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "migrations.operations.customer.customize.upsertLicenses.metadata", "plans.licenseParents.planChange.customize.upsertLicenses.metadata", "plans.licenseParents.planChange.licenseChanges.metadata", "plans.licenseParents.planChange.licenseChanges.plan.metadata", "plans.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.licenseParents.planChange.licenseChanges.planChange.plan.metadata", "plans.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.licenseParents.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.licenseParents.planChange.plan.metadata", "plans.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.licenseParents.planChange.previousAttributes.metadata", "plans.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.customize.upsertLicenses.metadata", "plans.licenseParents.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.metadata", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.metadata", "plans.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.metadata", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.licenseParents.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.licenseParents.siblingVersions.planChange.plan.metadata", "plans.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.licenseParents.siblingVersions.planChange.previousAttributes.metadata", "plans.licenses.metadata", "plans.licenses.plan.metadata", "plans.licenses.plan.variantDetails.customize.upsertLicenses.metadata", "plans.planChange.customize.upsertLicenses.metadata", "plans.planChange.licenseChanges.metadata", "plans.planChange.licenseChanges.plan.metadata", "plans.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.planChange.licenseChanges.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.planChange.licenseChanges.planChange.plan.metadata", "plans.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.planChange.plan.metadata", "plans.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.planChange.previousAttributes.metadata", "plans.siblingVersions.licenseParents.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.metadata", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.metadata", "plans.siblingVersions.licenseParents.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.metadata", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.siblingVersions.licenseParents.planChange.plan.metadata", "plans.siblingVersions.licenseParents.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.planChange.previousAttributes.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.licenseParents.siblingVersions.planChange.previousAttributes.metadata", "plans.siblingVersions.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.planChange.licenseChanges.metadata", "plans.siblingVersions.planChange.licenseChanges.plan.metadata", "plans.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.metadata", "plans.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.siblingVersions.planChange.plan.metadata", "plans.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.planChange.previousAttributes.metadata", "plans.siblingVersions.variants.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.metadata", "plans.siblingVersions.variants.planChange.licenseChanges.plan.metadata", "plans.siblingVersions.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.metadata", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.siblingVersions.variants.planChange.plan.metadata", "plans.siblingVersions.variants.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.planChange.previousAttributes.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.itemChanges.item.featureOverride.creditSchema.dimensions.*.match", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.dimensions", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.plan.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.siblingVersions.variants.siblingVersions.planChange.previousAttributes.metadata", "plans.variants.planChange.customize.upsertLicenses.metadata", "plans.variants.planChange.licenseChanges.metadata", "plans.variants.planChange.licenseChanges.plan.metadata", "plans.variants.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.variants.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.variants.planChange.licenseChanges.planChange.plan.metadata", "plans.variants.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.variants.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.variants.planChange.plan.metadata", "plans.variants.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.variants.planChange.previousAttributes.metadata", "plans.variants.siblingVersions.planChange.customize.upsertLicenses.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.customize.upsertLicenses.metadata", "plans.variants.siblingVersions.planChange.licenseChanges.customize.addItems.featureOverride.creditSchema.dimensions.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.metadata", "plans.variants.siblingVersions.planChange.licenseChanges.plan.metadata", "plans.variants.siblingVersions.planChange.licenseChanges.plan.variantDetails.customize.upsertLicenses.metadata", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.addItems.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.customize.upsertLicenses.metadata", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.itemChanges.item.featureOverride.creditSchema.multipliers.*.match", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.metadata", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.variants.siblingVersions.planChange.licenseChanges.planChange.previousAttributes.metadata", "plans.variants.siblingVersions.planChange.plan.metadata", "plans.variants.siblingVersions.planChange.plan.variantDetails.customize.upsertLicenses.metadata", "plans.variants.siblingVersions.planChange.previousAttributes.metadata", "referralPrograms.previousAttributes", "rewards.previousAttributes"],
@@ -6835,6 +7194,21 @@ var RESETSANDBOX_RESPONSE_HINTS = hintsOf({
6835
7194
  frozenPaths: [],
6836
7195
  renamedPaths: {}
6837
7196
  });
7197
+ var LISTWEBHOOKS_RESPONSE_HINTS = hintsOf({
7198
+ recordPaths: [],
7199
+ frozenPaths: [],
7200
+ renamedPaths: {}
7201
+ });
7202
+ var PREVIEWSYNCWEBHOOKS_RESPONSE_HINTS = hintsOf({
7203
+ recordPaths: [],
7204
+ frozenPaths: [],
7205
+ renamedPaths: {}
7206
+ });
7207
+ var SYNCWEBHOOKS_RESPONSE_HINTS = hintsOf({
7208
+ recordPaths: [],
7209
+ frozenPaths: [],
7210
+ renamedPaths: {}
7211
+ });
6838
7212
  var createClient = (options) => ({
6839
7213
  diff: async (body) => toFixture({
6840
7214
  value: await post({ options, path: "/v1/catalogV2.diff", body }),
@@ -6890,11 +7264,26 @@ var createClient = (options) => ({
6890
7264
  value: await post({ options, path: "/v1/sandboxes.reset", body: toWire({ value: body, path: "", hints: RESETSANDBOX_REQUEST_HINTS }) }),
6891
7265
  path: "",
6892
7266
  hints: RESETSANDBOX_RESPONSE_HINTS
7267
+ }),
7268
+ listWebhooks: async (body) => toFixture({
7269
+ value: await post({ options, path: "/v1/webhooks.list", body: toWire({ value: body, path: "", hints: LISTWEBHOOKS_REQUEST_HINTS }) }),
7270
+ path: "",
7271
+ hints: LISTWEBHOOKS_RESPONSE_HINTS
7272
+ }),
7273
+ previewSyncWebhooks: async (body) => toFixture({
7274
+ value: await post({ options, path: "/v1/webhooks.preview_sync", body: toWire({ value: body, path: "", hints: PREVIEWSYNCWEBHOOKS_REQUEST_HINTS }) }),
7275
+ path: "",
7276
+ hints: PREVIEWSYNCWEBHOOKS_RESPONSE_HINTS
7277
+ }),
7278
+ syncWebhooks: async (body) => toFixture({
7279
+ value: await post({ options, path: "/v1/webhooks.sync", body: toWire({ value: body, path: "", hints: SYNCWEBHOOKS_REQUEST_HINTS }) }),
7280
+ path: "",
7281
+ hints: SYNCWEBHOOKS_RESPONSE_HINTS
6893
7282
  })
6894
7283
  });
6895
7284
 
6896
7285
  // src/version.ts
6897
- var version = "2.0.33";
7286
+ var version = "2.0.35";
6898
7287
 
6899
7288
  // src/http/autumnFetch.ts
6900
7289
  var runtime = typeof Bun !== "undefined" ? `bun ${Bun.version}` : `node ${process.versions.node}`;
@@ -9024,6 +9413,19 @@ var SINGLETONS = {
9024
9413
  ]
9025
9414
  }
9026
9415
  };
9416
+ var SYNCED_LISTS = {
9417
+ webhooks: {
9418
+ wireKey: "webhooks",
9419
+ builder: "webhook",
9420
+ idField: "id",
9421
+ responseIdField: "id",
9422
+ keys: ["id", "url", "events", "description", "disabled"],
9423
+ required: ["events", "id", "url"],
9424
+ paths: ["description", "disabled", "events", "id", "url"],
9425
+ pull: true,
9426
+ envKeyed: ["url"]
9427
+ }
9428
+ };
9027
9429
  var NESTED_FIXTURES = {
9028
9430
  variants: {
9029
9431
  builder: "variant",
@@ -9136,16 +9538,16 @@ import { dirname as dirname4, join as join7 } from "node:path";
9136
9538
  import chalk3 from "chalk";
9137
9539
 
9138
9540
  // src/generated/skills.ts
9139
- var SKILLS_VERSION = "2.0.33";
9541
+ var SKILLS_VERSION = "2.0.35";
9140
9542
  var SKILLS = [
9141
9543
  {
9142
9544
  name: "autumn-setup",
9143
9545
  description: "First-time Autumn setup — install the atmn CLI, connect to an org (sign in, or keyless with no account), turn the user's pricing into autumn.config.ts, and push it to a sandbox org. Use when the user is new to Autumn, pastes an Autumn setup prompt, or asks to set up Autumn, add billing, monetization, subscriptions, usage-based billing, pricing, or plans. If Autumn is already set up, use autumn-catalog instead.",
9144
- version: "2.0.33",
9546
+ version: "2.0.35",
9145
9547
  markdown: `---
9146
9548
  name: autumn-setup
9147
9549
  description: First-time Autumn setup — install the atmn CLI, connect to an org (sign in, or keyless with no account), turn the user's pricing into autumn.config.ts, and push it to a sandbox org. Use when the user is new to Autumn, pastes an Autumn setup prompt, or asks to set up Autumn, add billing, monetization, subscriptions, usage-based billing, pricing, or plans. If Autumn is already set up, use autumn-catalog instead.
9148
- version: 2.0.33
9550
+ version: 2.0.35
9149
9551
  ---
9150
9552
 
9151
9553
  # Setup
@@ -9303,11 +9705,11 @@ Then stop. Don't keep building, don't tour the dashboard, don't deploy anything.
9303
9705
  {
9304
9706
  name: "autumn-catalog",
9305
9707
  description: "Modeling a user's pricing into an Autumn catalog — deciding the structure (plans, variants, add-ons, licenses, credit systems, pooled balances) before writing config, then filling in the numbers. Use when the user describes their pricing or asks to model, change, or push a catalog.",
9306
- version: "2.0.33",
9708
+ version: "2.0.35",
9307
9709
  markdown: `---
9308
9710
  name: autumn-catalog
9309
9711
  description: Modeling a user's pricing into an Autumn catalog — deciding the structure (plans, variants, add-ons, licenses, credit systems, pooled balances) before writing config, then filling in the numbers. Use when the user describes their pricing or asks to model, change, or push a catalog.
9310
- version: 2.0.33
9712
+ version: 2.0.35
9311
9713
  ---
9312
9714
 
9313
9715
  # Catalog
@@ -13174,7 +13576,7 @@ Pitch: "Pro $20/mo or $200/yr — 1,000 messages per month either way."
13174
13576
  },
13175
13577
  {
13176
13578
  path: "references/atmn.md",
13177
- contents: "# atmn catalog flows\n\nContents: commands · when to use it · the config is the catalog's state (versions, renames, drafts) · variants and licenses · config shapes · splitting the config · update loop · pull · sandboxes and keys · what to show the user.\n\nUse `atmn` when a project has or should have an `autumn.config.ts` source of truth.\n\nCommands — these two, not `atmn preview` (that does not exist):\n\n```sh\natmn push # lints, then previews the diff; applies nothing\natmn push --yes # apply exactly what the preview showed\n```\n\n`push` without `--yes` is always a dry run, on a clean org too, and it never asks anything: `--yes` is the only gate. The commands that do ask (`init`, `login --keyless`, `sandbox use`, `skills install`) print the flag to pass instead whenever there is no TTY, which is every agent run; `--headless` forces that in a terminal.\n\n## When to use it\n\n- New project: run `atmn init`. It connects (sign in, or keyless), places the config, pulls whatever the org already holds, and installs these skills beside it.\n- Existing project: if `autumn.config.ts` exists, run `atmn pull` first so every row carries its server ids, then edit and push. Never rewrite a config that predates you from scratch.\n- Use MCP/API directly when the user wants dashboard/API-first changes or there is no local config workflow.\n\n## The config is the catalog's state\n\nThe document is the whole desired catalog for every collection it states. A plan or feature missing from a stated `plans` / `features` is a deletion (archived when customers depend on it). A collection left out entirely is not managed. That rule reaches down to versions: **a version row missing from `plans` is deleted too**.\n\nEvery version of a plan is a row in `plans`. Rows of one plan share a `planId`; each names its version with `versionSlug`; exactly one is `active: true` and the rest `active: false`. There is no history collection and no timeline — array order means nothing. What a version *is* (a group of customers, not a step in time) is the `autumn-concepts` skill's: read `references/plan.md` in the `autumn-concepts` skill. This file owns how rows express it.\n\nTwo fields make a row addressable:\n\n- `planId` + `versionSlug` — what you write. The pair names exactly one version. `versionSlug` is required on every plan row and every variant row, including a plan's only version; an omitted slug is a lint error, never an implicit `v1`.\n- `internalId` — the server's stable id. It is minted on the first `push --yes` and written back into the fixture; `pull` writes it for every row that lacks one. A fixture carrying it can be renamed (`planId`, `featureId`, `versionSlug`) and the server treats that as a rename, not a delete plus create.\n\n**This is where atmn differs from the API and the dashboard.** Those send one plan entry plus flags — `versioning`, `active`, `propagate` — as `references/catalog-update.md` describes. A config has none of those flags. The intent is read off the rows — which rows exist, which one is active, which carry an `internalId` — and the preview reports what the server derived. If the preview says something other than what you meant, change the rows and preview again; never look for a flag.\n\n| You want | Row edit | Preview shows |\n|---|---|---|\n| Change a version in place (active or history) | edit that row; keep its `versionSlug` and `internalId` | `~ pro@v1`, a migration for its customers |\n| The same change on every version | make the edit on every row of the plan | one `~` per row |\n| A new version; customers stay on the old one | add a row: same `planId`, new `versionSlug`, `active: true`, **no `internalId`**; flip the old row to `active: false` | `+ pro@v2`, and `active: true -> false` on the old row |\n| A draft nobody can buy yet | add the row with `active: false` beside the active one | `+` with no pointer move |\n| Rename the plan id | change `planId` on **every** row of the plan (all carry `internalId`) | a rename, not `-` + `+` |\n| Rename a version | change `versionSlug` on a row that carries `internalId` | `Version slug` rename |\n| Retire a version | remove its row | `-`; refused while customers are on it (it names both exits: migrate them, or archive the whole plan) |\n\nGuards the lint applies before anything is sent: a plan with no active row or two active rows (`mark the one customers can buy active: true and the rest active: false`), a missing `versionSlug`, the same `planId` + `versionSlug` twice. A plan whose only row is `active: false` is refused — a draft needs an active sibling.\n\nNumbers vs slugs: the server numbers versions in creation order and the preview labels rows with that number (`pro@v2`). The config never states numbers, only slugs. Push a `v1` row after `v2` already exists and the server numbers it higher; the slug still says `v1`. Never read a preview number back as the slug.\n\n## Variants and licenses\n\nWhat a variant's customize can change, when a base edit reaches a variant, and how a license link anchors to a child version are catalog-wide: `references/catalog-update.md`. What is atmn's:\n\n- A variant is an entry in its base row's `variants` array and a license link an entry in the parent row's `licenses` array: `variant({...})` and `license({...})` fixtures, inline or imported from their own files, edited in place there. Pull writes new ones in that form. Every entry the config lists is a declared overlay; there is no `propagate` in a config, so a base edit reaches a variant through the entry you write, not a follow flag.\n- Minting a base version means listing the variant entries again under the new base row, each with the new `versionSlug` and no `internalId`. The old entries stay under the old base row. One variant version cannot serve two base rows; the lint names both rows and says to version and relink the variant.\n- To retire a variant, set `archived: true` on its entry. A variant left out of the array is a deletion, refused while customers hold it.\n- Every `license({...})` states `versionSlug` — the lint refuses one without it — because the link is pinned to that child version and a config that names it links the same version in every environment. Pull writes it back. Minting a child version moves no parent; relinking a parent is editing that slug.\n\n## Config shapes\n\n`autumn.config.ts` uses the atmn package types, not raw API JSON. Field names are camelCase: `featureId`, `planId`, `billingMethod`, `billingUnits`, `freeTrial`, `intervalCount`, `versionSlug`. Follow the exported types from the package when editing config. Amounts are plain dollars: $20 is `20`, never `2000`.\n\nBuilders — `feature`, `plan`, `variant`, `license`. Items are plain objects on the plan; there is no `item()` builder and fixtures expose `featureId` / `planId`, never `.id`. A plan with an active `v2`, its `v1` kept for the customers still on it, each with an annual variant:\n\n```ts\nimport { atmn, feature, plan, variant } from \"atmn\";\n\nexport const messages = feature({\n featureId: \"messages\",\n name: \"Messages\",\n type: \"metered\",\n consumable: true,\n});\n\nexport const proAnnualV2 = variant({\n variantPlanId: \"pro_annual\",\n versionSlug: \"v2\",\n name: \"Pro Annual\",\n customize: { price: { amount: 250, interval: \"year\" } },\n});\n\nexport const proAnnualV1 = variant({\n variantPlanId: \"pro_annual\",\n versionSlug: \"v1\",\n name: \"Pro Annual\",\n customize: { price: { amount: 200, interval: \"year\" } },\n});\n\nexport const proV2 = plan({\n planId: \"pro\",\n versionSlug: \"v2\",\n active: true,\n name: \"Pro\",\n price: { amount: 25, interval: \"month\" },\n items: [{ featureId: messages.featureId, included: 10000, reset: { interval: \"month\" } }],\n variants: [proAnnualV2],\n});\n\nexport const proV1 = plan({\n internalId: \"prod_…\", // written back by push --yes / pull\n planId: \"pro\",\n versionSlug: \"v1\",\n active: false,\n name: \"Pro\",\n price: { amount: 20, interval: \"month\" },\n items: [{ featureId: messages.featureId, included: 5000, reset: { interval: \"month\" } }],\n variants: [proAnnualV1],\n});\n\nexport default atmn({ features: [messages], plans: [proV2, proV1] });\n```\n\nBefore `proV2` existed, `proV1` was the active row; minting `v2` was adding `proV2` without an `internalId` and flipping `proV1` to `active: false`.\n\nUsage-priced item:\n\n```ts\n{\n featureId: messages.featureId,\n included: 10000,\n reset: { interval: \"month\" },\n price: {\n amount: 0.9,\n billingMethod: \"usage_based\",\n billingUnits: 1000,\n interval: \"month\",\n },\n}\n```\n\n## Splitting the config\n\n`atmn init` scaffolds four files: `autumn.config.ts` (the root, `export default atmn({...})`), `features.ts`, `plans.ts`, `rewards.ts`. Every version of every plan lives in the `plans` array — active and history rows side by side. The config is ordinary TypeScript, so a row can be lifted into its own file under any export name and referenced from the array; `pull` follows imports and edits each fixture where it lives, and appends rows it has to add to the imported array. What it cannot do is edit a fixture that is not a plain literal — a spread, a helper call, a `.map()` — and it says so and writes nothing rather than guess.\n\n## Update loop\n\n1. Inspect or create `autumn.config.ts`.\n2. Edit the config to represent the desired catalog.\n3. Run `atmn push` to preview changes.\n4. Show the user the plan diffs, the customer impact, which plans mint a new version, and the draft migrations it would create. If the versioning is not what they meant, change the rows (table above) and preview again.\n5. Rerun `atmn push --yes` to apply the same preview.\n6. Report created/updated/deleted/archived features and plans, and the draft migrations the output lists. `push --yes` also writes `internalId` (and any `versionSlug` the server assigned) back into the fixtures — say so; those edits are expected.\n\nTwo notes push prints that are worth relaying: a plan removed while an id-less plan appears looks like a rename — pull first so the fixture carries its id; and a config still stating a deprecated field (`entityFeatureId`) gets a note naming the replacement.\n\n## Pull\n\n`atmn pull` writes the server's catalog back into the config in place: it flips `active` where the dashboard promoted a version, appends versions the config never mentioned, and backfills `internalId` and `versionSlug`. Run it after anyone touches the dashboard, and before editing a config you did not write. With no config yet, `pull` asks which folder to create it in; headless, it prints the `-c <dir>` hint and stops, so run `atmn init` or pass `-c` instead.\n\n`atmn pull --overwrite` is different: it rewrites `autumn.config.ts` and the `features.ts`, `plans.ts` and `rewards.ts` beside it from the server. It never deletes a file, and it leaves alone any file that does not import the package. It needs `--yes`, and it is the right move only when the config describes a different org than the key — the tell is `Your config no longer matches this org's catalog`. Anywhere else, a plain `pull` is what you want.\n\n## Sandboxes and keys\n\n- `atmn sandbox use <name>` pins a named sandbox; every command after it targets that sandbox until `atmn sandbox use --clear`.\n- `atmn reset --yes` empties the pinned sandbox; `atmn push --yes` rebuilds it from the config.\n- `atmn env --json` says which org, sandbox and key a command would hit, with `notes` on what to do when something is off.\n- A missing key fails fast and names the fix: `AUTUMN_SECRET_KEY is not set. Run atmn login, or atmn login --keyless if you don't have an account.` — hand that to the setup flow, don't ask the user to paste a key.\n\n## What to show the user\n\n- Which plans mint a new version, and the draft migrations that come with them.\n- Feature/plan/version deletions that will archive instead because dependencies or customers exist.\n- Which sandbox is pinned before applying anything."
13579
+ contents: "# atmn catalog flows\n\nContents: commands · when to use it · the config is the catalog's state (versions, renames, drafts) · variants and licenses · config shapes · splitting the config · update loop · pull · webhooks · sandboxes and keys · what to show the user.\n\nUse `atmn` when a project has or should have an `autumn.config.ts` source of truth.\n\nCommands — these two, not `atmn preview` (that does not exist):\n\n```sh\natmn push # lints, then previews the diff; applies nothing\natmn push --yes # apply exactly what the preview showed\n```\n\n`push` without `--yes` is always a dry run, on a clean org too, and it never asks anything: `--yes` is the only gate. The commands that do ask (`init`, `login --keyless`, `sandbox use`, `skills install`) print the flag to pass instead whenever there is no TTY, which is every agent run; `--headless` forces that in a terminal.\n\n## When to use it\n\n- New project: run `atmn init`. It connects (sign in, or keyless), places the config, pulls whatever the org already holds, and installs these skills beside it.\n- Existing project: if `autumn.config.ts` exists, run `atmn pull` first so every row carries its server ids, then edit and push. Never rewrite a config that predates you from scratch.\n- Use MCP/API directly when the user wants dashboard/API-first changes or there is no local config workflow.\n\n## The config is the catalog's state\n\nThe document is the whole desired catalog for every collection it states. A plan or feature missing from a stated `plans` / `features` is a deletion (archived when customers depend on it). A collection left out entirely is not managed. That rule reaches down to versions: **a version row missing from `plans` is deleted too**.\n\nEvery version of a plan is a row in `plans`. Rows of one plan share a `planId`; each names its version with `versionSlug`; exactly one is `active: true` and the rest `active: false`. There is no history collection and no timeline — array order means nothing. What a version *is* (a group of customers, not a step in time) is the `autumn-concepts` skill's: read `references/plan.md` in the `autumn-concepts` skill. This file owns how rows express it.\n\nTwo fields make a row addressable:\n\n- `planId` + `versionSlug` — what you write. The pair names exactly one version. `versionSlug` is required on every plan row and every variant row, including a plan's only version; an omitted slug is a lint error, never an implicit `v1`.\n- `internalId` — the server's stable id. It is minted on the first `push --yes` and written back into the fixture; `pull` writes it for every row that lacks one. A fixture carrying it can be renamed (`planId`, `featureId`, `versionSlug`) and the server treats that as a rename, not a delete plus create.\n\n**This is where atmn differs from the API and the dashboard.** Those send one plan entry plus flags — `versioning`, `active`, `propagate` — as `references/catalog-update.md` describes. A config has none of those flags. The intent is read off the rows — which rows exist, which one is active, which carry an `internalId` — and the preview reports what the server derived. If the preview says something other than what you meant, change the rows and preview again; never look for a flag.\n\n| You want | Row edit | Preview shows |\n|---|---|---|\n| Change a version in place (active or history) | edit that row; keep its `versionSlug` and `internalId` | `~ pro@v1`, a migration for its customers |\n| The same change on every version | make the edit on every row of the plan | one `~` per row |\n| A new version; customers stay on the old one | add a row: same `planId`, new `versionSlug`, `active: true`, **no `internalId`**; flip the old row to `active: false` | `+ pro@v2`, and `active: true -> false` on the old row |\n| A draft nobody can buy yet | add the row with `active: false` beside the active one | `+` with no pointer move |\n| Rename the plan id | change `planId` on **every** row of the plan (all carry `internalId`) | a rename, not `-` + `+` |\n| Rename a version | change `versionSlug` on a row that carries `internalId` | `Version slug` rename |\n| Retire a version | remove its row | `-`; refused while customers are on it (it names both exits: migrate them, or archive the whole plan) |\n\nGuards the lint applies before anything is sent: a plan with no active row or two active rows (`mark the one customers can buy active: true and the rest active: false`), a missing `versionSlug`, the same `planId` + `versionSlug` twice. A plan whose only row is `active: false` is refused — a draft needs an active sibling.\n\nNumbers vs slugs: the server numbers versions in creation order and the preview labels rows with that number (`pro@v2`). The config never states numbers, only slugs. Push a `v1` row after `v2` already exists and the server numbers it higher; the slug still says `v1`. Never read a preview number back as the slug.\n\n## Variants and licenses\n\nWhat a variant's customize can change, when a base edit reaches a variant, and how a license link anchors to a child version are catalog-wide: `references/catalog-update.md`. What is atmn's:\n\n- A variant is an entry in its base row's `variants` array and a license link an entry in the parent row's `licenses` array: `variant({...})` and `license({...})` fixtures, inline or imported from their own files, edited in place there. Pull writes new ones in that form. Every entry the config lists is a declared overlay; there is no `propagate` in a config, so a base edit reaches a variant through the entry you write, not a follow flag.\n- Minting a base version means listing the variant entries again under the new base row, each with the new `versionSlug` and no `internalId`. The old entries stay under the old base row. One variant version cannot serve two base rows; the lint names both rows and says to version and relink the variant.\n- To retire a variant, set `archived: true` on its entry. A variant left out of the array is a deletion, refused while customers hold it.\n- Every `license({...})` states `versionSlug` — the lint refuses one without it — because the link is pinned to that child version and a config that names it links the same version in every environment. Pull writes it back. Minting a child version moves no parent; relinking a parent is editing that slug.\n\n## Config shapes\n\n`autumn.config.ts` uses the atmn package types, not raw API JSON. Field names are camelCase: `featureId`, `planId`, `billingMethod`, `billingUnits`, `freeTrial`, `intervalCount`, `versionSlug`. Follow the exported types from the package when editing config. Amounts are plain dollars: $20 is `20`, never `2000`.\n\nBuilders — `feature`, `plan`, `variant`, `license`. Items are plain objects on the plan; there is no `item()` builder and fixtures expose `featureId` / `planId`, never `.id`. A plan with an active `v2`, its `v1` kept for the customers still on it, each with an annual variant:\n\n```ts\nimport { atmn, feature, plan, variant } from \"atmn\";\n\nexport const messages = feature({\n featureId: \"messages\",\n name: \"Messages\",\n type: \"metered\",\n consumable: true,\n});\n\nexport const proAnnualV2 = variant({\n variantPlanId: \"pro_annual\",\n versionSlug: \"v2\",\n name: \"Pro Annual\",\n customize: { price: { amount: 250, interval: \"year\" } },\n});\n\nexport const proAnnualV1 = variant({\n variantPlanId: \"pro_annual\",\n versionSlug: \"v1\",\n name: \"Pro Annual\",\n customize: { price: { amount: 200, interval: \"year\" } },\n});\n\nexport const proV2 = plan({\n planId: \"pro\",\n versionSlug: \"v2\",\n active: true,\n name: \"Pro\",\n price: { amount: 25, interval: \"month\" },\n items: [{ featureId: messages.featureId, included: 10000, reset: { interval: \"month\" } }],\n variants: [proAnnualV2],\n});\n\nexport const proV1 = plan({\n internalId: \"prod_…\", // written back by push --yes / pull\n planId: \"pro\",\n versionSlug: \"v1\",\n active: false,\n name: \"Pro\",\n price: { amount: 20, interval: \"month\" },\n items: [{ featureId: messages.featureId, included: 5000, reset: { interval: \"month\" } }],\n variants: [proAnnualV1],\n});\n\nexport default atmn({ features: [messages], plans: [proV2, proV1] });\n```\n\nBefore `proV2` existed, `proV1` was the active row; minting `v2` was adding `proV2` without an `internalId` and flipping `proV1` to `active: false`.\n\nUsage-priced item:\n\n```ts\n{\n featureId: messages.featureId,\n included: 10000,\n reset: { interval: \"month\" },\n price: {\n amount: 0.9,\n billingMethod: \"usage_based\",\n billingUnits: 1000,\n interval: \"month\",\n },\n}\n```\n\n## Splitting the config\n\n`atmn init` scaffolds four files: `autumn.config.ts` (the root, `export default atmn({...})`), `features.ts`, `plans.ts`, `rewards.ts`. Every version of every plan lives in the `plans` array — active and history rows side by side. The config is ordinary TypeScript, so a row can be lifted into its own file under any export name and referenced from the array; `pull` follows imports and edits each fixture where it lives, and appends rows it has to add to the imported array. What it cannot do is edit a fixture that is not a plain literal — a spread, a helper call, a `.map()` — and it says so and writes nothing rather than guess.\n\n## Update loop\n\n1. Inspect or create `autumn.config.ts`.\n2. Edit the config to represent the desired catalog.\n3. Run `atmn push` to preview changes.\n4. Show the user the plan diffs, the customer impact, which plans mint a new version, and the draft migrations it would create. If the versioning is not what they meant, change the rows (table above) and preview again.\n5. Rerun `atmn push --yes` to apply the same preview.\n6. Report created/updated/deleted/archived features and plans, and the draft migrations the output lists. `push --yes` also writes `internalId` (and any `versionSlug` the server assigned) back into the fixtures — say so; those edits are expected.\n\nTwo notes push prints that are worth relaying: a plan removed while an id-less plan appears looks like a rename — pull first so the fixture carries its id; and a config still stating a deprecated field (`entityFeatureId`) gets a note naming the replacement.\n\n## Pull\n\n`atmn pull` writes the server's catalog back into the config in place: it flips `active` where the dashboard promoted a version, appends versions the config never mentioned, and backfills `internalId` and `versionSlug`. Run it after anyone touches the dashboard, and before editing a config you did not write. With no config yet, `pull` asks which folder to create it in; headless, it prints the `-c <dir>` hint and stops, so run `atmn init` or pass `-c` instead.\n\n`atmn pull --overwrite` is different: it rewrites `autumn.config.ts` and the `features.ts`, `plans.ts` and `rewards.ts` beside it from the server. It never deletes a file, and it leaves alone any file that does not import the package. It needs `--yes`, and it is the right move only when the config describes a different org than the key — the tell is `Your config no longer matches this org's catalog`. Anywhere else, a plain `pull` is what you want.\n\n## Webhooks\n\n`webhooks` in the config lists the Autumn webhooks it manages, keyed by `id`. Unlike the catalog it is never a deletion list: `push` creates or updates the webhooks it states and leaves every other webhook alone (the preview shows them as `unmanaged`).\n\n`url` is a map keyed by environment, never one string. A missing key means \"don't register this webhook there\", which is not an error:\n\n```ts\nimport { atmn, webhook } from \"atmn\";\n\nexport default atmn({\n webhooks: [\n webhook({\n id: \"billing\",\n events: [\"billing.updated\", \"balances.limit_reached\"],\n url: {\n live: \"https://myapp.com/api/autumn\", // atmn push -p\n sandbox: \"https://staging.myapp.com/api/autumn\", // the default sandbox\n \"qa-team\": \"https://qa.myapp.com/api/autumn\", // atmn sandbox use qa-team\n },\n }),\n ],\n});\n```\n\n- Keys: `live` for `-p`, `sandbox` for the default sandbox, or a named sandbox's slug (its name lowercased; no spaces). Never copy a sandbox URL into `live`: ask the user for the production URL, or leave `live` out.\n- Every URL must be https and publicly reachable; localhost and private networks are refused, tunnels such as ngrok work. `events` needs at least one entry.\n- `id` is permanent: changing it registers a new webhook. Two ids that differ only by case or `-`/`_` are refused.\n- The preview gives a changed URL its own line (`billing url: old → new`). Read it out to the user before `--yes`.\n- `push --yes` writes each new webhook's signing secret once and prints exactly where: `AUTUMN_WEBHOOK_<ID>_SECRET` in `.env.prod` for `-p`, `AUTUMN_WEBHOOK_<ID>_<ORG4>_SECRET` in `.env.local` (or `.env`) for a sandbox. Relay the variable name and file; never print or read the secret.\n- `pull` edits only the target env's key: it adds webhooks it finds, sets a changed URL, removes the env's key when the server no longer has that webhook, and deletes a webhook whose map ends up empty. A URL written as code (`process.env.X`) is never rewritten; pull warns when it differs from the server. Webhooks already in the dashboard will be pulled and be editable in the config once you pull as usual. Since the dashboard doesn't let you set an ID, a permanent ID will be assigned to this for future reference.\n\n## Sandboxes and keys\n\n- `atmn sandbox use <name>` pins a named sandbox; every command after it targets that sandbox until `atmn sandbox use --clear`.\n- `atmn reset --yes` empties the pinned sandbox; `atmn push --yes` rebuilds it from the config.\n- `atmn env --json` says which org, sandbox and key a command would hit, with `notes` on what to do when something is off.\n- A missing key fails fast and names the fix: `AUTUMN_SECRET_KEY is not set. Run atmn login, or atmn login --keyless if you don't have an account.` — hand that to the setup flow, don't ask the user to paste a key.\n\n## What to show the user\n\n- Which plans mint a new version, and the draft migrations that come with them.\n- Feature/plan/version deletions that will archive instead because dependencies or customers exist.\n- Which sandbox is pinned before applying anything."
13178
13580
  },
13179
13581
  {
13180
13582
  path: "references/catalog-update.md",
@@ -13189,11 +13591,11 @@ Pitch: "Pro $20/mo or $200/yr — 1,000 messages per month either way."
13189
13591
  {
13190
13592
  name: "autumn-integrate",
13191
13593
  description: "Integrating Autumn into an app's backend — creating customers, billing flows (attach, checkout, upgrade, cancel), gating features with check, recording usage with track, and exposing billing data to the frontend. Use when the user asks to integrate Autumn, add billing/payments to their app, gate features, meter usage, or build checkout/upgrade flows. Requires a pushed catalog; use autumn-catalog first if plans don't exist yet.",
13192
- version: "2.0.33",
13594
+ version: "2.0.35",
13193
13595
  markdown: `---
13194
13596
  name: autumn-integrate
13195
13597
  description: Integrating Autumn into an app's backend — creating customers, billing flows (attach, checkout, upgrade, cancel), gating features with check, recording usage with track, and exposing billing data to the frontend. Use when the user asks to integrate Autumn, add billing/payments to their app, gate features, meter usage, or build checkout/upgrade flows. Requires a pushed catalog; use autumn-catalog first if plans don't exist yet.
13196
- version: 2.0.33
13598
+ version: 2.0.35
13197
13599
  ---
13198
13600
 
13199
13601
  # Integrate
@@ -17795,11 +18197,11 @@ Monitor your logs for this message. If you see it, check [status.useautumn.com](
17795
18197
  {
17796
18198
  name: "autumn-concepts",
17797
18199
  description: "Understanding Autumn's billing objects before acting on them — what a plan version is and what active means, when a trial starts or ends billing, how entity- and seat-scoped subscriptions differ from the customer's own, what a customize diff actually changes, and how caps, overage, and top-ups behave. Load before versioning, editing, or drafting a plan, or when a customer's state does not match the plain reading of their plan.",
17798
- version: "2.0.33",
18200
+ version: "2.0.35",
17799
18201
  markdown: `---
17800
18202
  name: autumn-concepts
17801
18203
  description: Understanding Autumn's billing objects before acting on them — what a plan version is and what active means, when a trial starts or ends billing, how entity- and seat-scoped subscriptions differ from the customer's own, what a customize diff actually changes, and how caps, overage, and top-ups behave. Load before versioning, editing, or drafting a plan, or when a customer's state does not match the plain reading of their plan.
17802
- version: 2.0.33
18204
+ version: 2.0.35
17803
18205
  ---
17804
18206
 
17805
18207
  # Concepts
@@ -19060,13 +19462,13 @@ Wrote ${writtenKeys.join(" and ")} to ${envPath}
19060
19462
 
19061
19463
  // src/actions/pull.ts
19062
19464
  import {
19063
- existsSync as existsSync12,
19465
+ existsSync as existsSync13,
19064
19466
  mkdirSync as mkdirSync4,
19065
- readFileSync as readFileSync13,
19467
+ readFileSync as readFileSync14,
19066
19468
  unlinkSync,
19067
- writeFileSync as writeFileSync9
19469
+ writeFileSync as writeFileSync10
19068
19470
  } from "node:fs";
19069
- import { basename as basename3, dirname as dirname11, join as join13 } from "node:path";
19471
+ import { basename as basename3, dirname as dirname12, join as join14 } from "node:path";
19070
19472
 
19071
19473
  // src/config/loadConfig.ts
19072
19474
  import { spawnSync as spawnSync2 } from "node:child_process";
@@ -19542,7 +19944,8 @@ var importConfigModule = async ({
19542
19944
  }) => {
19543
19945
  const result = spawnSync2(process.execPath, importConfigArgs({ path }), {
19544
19946
  cwd: dirname7(path),
19545
- encoding: "utf8"
19947
+ encoding: "utf8",
19948
+ env: process.env
19546
19949
  });
19547
19950
  if (result.status !== 0 || result.stdout.length === 0) {
19548
19951
  throw new Error(result.stderr.trim() || `Failed to load ${path}`);
@@ -20142,9 +20545,11 @@ var appendPropertyEdit = ({
20142
20545
  const afterComma = trailingComma ? lastEnd + between.indexOf(",") + 1 : lastEnd;
20143
20546
  if (multiline) {
20144
20547
  const indent = leadingIndentOfLine(source, last.range().start.index);
20548
+ const restOfLine = source.slice(afterComma, lineEndOf(source, afterComma));
20549
+ const at = trailingComma && /^\s*\/\/.*$/.test(restOfLine) ? afterComma + restOfLine.length : afterComma;
20145
20550
  return {
20146
- startPos: afterComma,
20147
- endPos: afterComma,
20551
+ startPos: at,
20552
+ endPos: at,
20148
20553
  insertedText: trailingComma ? `
20149
20554
  ${indent}${pair},` : `,
20150
20555
  ${indent}${pair},`
@@ -20258,12 +20663,42 @@ var matchesLiteral = ({
20258
20663
  const proposed = readFixtureValue({ node: literal[0] });
20259
20664
  return !isDynamic(proposed) && isDeepStrictEqual(value, proposed);
20260
20665
  };
20261
- var removeMemberEdits = ({ member }) => {
20666
+ var PLAIN_IDENTIFIER2 = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
20667
+ var keyText2 = ({
20668
+ key,
20669
+ bareKeys
20670
+ }) => bareKeys && PLAIN_IDENTIFIER2.test(key) ? key : JSON.stringify(key);
20671
+ var wholeLineEdit = ({
20672
+ source,
20673
+ member,
20674
+ comma
20675
+ }) => {
20676
+ const start = member.range().start.index;
20677
+ const lineStart = lineStartOf(source, start);
20678
+ if (source.slice(lineStart, start).trim() !== "")
20679
+ return null;
20680
+ const end = Math.max(member.range().end.index, comma?.range().end.index ?? 0);
20681
+ const lineEnd = lineEndOf(source, end);
20682
+ if (!/^\s*(\/\/.*)?$/.test(source.slice(end, lineEnd)))
20683
+ return null;
20684
+ return {
20685
+ startPos: lineStart,
20686
+ endPos: Math.min(lineEnd + 1, source.length),
20687
+ insertedText: ""
20688
+ };
20689
+ };
20690
+ var removeMemberEdits = ({
20691
+ source,
20692
+ member
20693
+ }) => {
20262
20694
  const siblings = member.parent()?.children() ?? [];
20263
20695
  const index = siblings.findIndex((sibling) => sibling.range().start.index === member.range().start.index);
20264
20696
  const next = siblings.slice(index + 1).find((sibling) => sibling.kind() !== "comment");
20265
20697
  const previous = siblings.slice(0, index).reverse().find((sibling) => sibling.kind() !== "comment");
20266
20698
  const comma = next?.kind() === "," ? next : previous?.kind() === "," ? previous : null;
20699
+ const line = comma === next || comma === null ? wholeLineEdit({ source, member, comma }) : null;
20700
+ if (line !== null)
20701
+ return [line];
20267
20702
  return [member, ...comma === null ? [] : [comma]].map((node) => ({
20268
20703
  startPos: node.range().start.index,
20269
20704
  endPos: node.range().end.index,
@@ -20275,7 +20710,8 @@ var pathEdits = ({
20275
20710
  object,
20276
20711
  path,
20277
20712
  text,
20278
- builders
20713
+ builders,
20714
+ bareKeys
20279
20715
  }) => {
20280
20716
  let current = object;
20281
20717
  for (let index = 0;index < path.length; index += 1) {
@@ -20317,8 +20753,8 @@ var pathEdits = ({
20317
20753
  return "missing-array-element";
20318
20754
  let inserted = text;
20319
20755
  for (const key of remaining.reverse())
20320
- inserted = `{ ${JSON.stringify(key)}: ${inserted} }`;
20321
- const pair = `${JSON.stringify(segment)}: ${inserted}`;
20756
+ inserted = `{ ${keyText2({ key: String(key), bareKeys })}: ${inserted} }`;
20757
+ const pair = `${keyText2({ key: segment, bareKeys })}: ${inserted}`;
20322
20758
  const members = current.namedChildren().filter((child) => child.kind() !== "comment");
20323
20759
  if (members.length === 0) {
20324
20760
  const closing = current.range().end.index - 1;
@@ -20340,7 +20776,7 @@ var pathEdits = ({
20340
20776
  if (isDynamic(currentValue))
20341
20777
  return "dynamic-value";
20342
20778
  if (text === null)
20343
- return member === undefined ? "array-element-removal" : removeMemberEdits({ member });
20779
+ return member === undefined ? "array-element-removal" : removeMemberEdits({ source, member });
20344
20780
  if (matchesLiteral({ value: currentValue, text }))
20345
20781
  return [];
20346
20782
  return [
@@ -20360,7 +20796,8 @@ var patchFixturePaths = ({
20360
20796
  id,
20361
20797
  where,
20362
20798
  assignments,
20363
- builders = []
20799
+ builders = [],
20800
+ bareKeys = false
20364
20801
  }) => {
20365
20802
  const selector = { builder, idField, id, where, allowDynamic: true };
20366
20803
  const initial = findFixtures({ source, ...selector });
@@ -20371,7 +20808,7 @@ var patchFixturePaths = ({
20371
20808
  const matches = findFixtures({ source, ...selector });
20372
20809
  const match = matches[0];
20373
20810
  const object = matches.length === 1 && match !== undefined ? fixtureObjectOf(match) : null;
20374
- const edits = object === null ? "ambiguous-fixture" : pathEdits({ source, object, builders, ...assignment });
20811
+ const edits = object === null ? "ambiguous-fixture" : pathEdits({ source, object, builders, bareKeys, ...assignment });
20375
20812
  if (typeof edits === "string") {
20376
20813
  skipped.push({ path: assignment.path, reason: edits });
20377
20814
  continue;
@@ -22016,40 +22453,493 @@ var rewriteConfig = ({
22016
22453
  return { rewritten: [configPath, ...rewritten], kept };
22017
22454
  };
22018
22455
 
22019
- // src/render/renderPreview.ts
22020
- import chalk4 from "chalk";
22456
+ // src/actions/webhooks/isDashboardWebhook.ts
22457
+ var SVIX_ENDPOINT_ID = /^ep_[0-9A-Za-z]{27}$/;
22458
+ var isDashboardWebhook = ({ id }) => SVIX_ENDPOINT_ID.test(id);
22021
22459
 
22022
- // src/generated/labels.ts
22023
- var PREVIOUS_ATTRIBUTE_LABELS = {
22024
- name: "Name",
22025
- description: "Description",
22026
- group: "Group",
22027
- add_on: "Add-on",
22028
- auto_enable: "Default plan",
22029
- free_trial: "Free trial",
22030
- config: "Config",
22031
- active: "Active version",
22032
- billing_controls: "Billing controls",
22033
- processors: "Processor mappings",
22034
- base_variant_id: "Base plan",
22035
- base_version: "Base version",
22036
- base_version_slug: "Base version slug",
22037
- cancel_on_past_due: "Cancel on past due",
22038
- reverse_deduction_order: "Reverse deduction order",
22039
- block_overdue_entitlements: "Block access while overdue",
22040
- invoice_memos: "Invoice memos",
22041
- disable_overage_billing: "Disable overage billing",
22042
- persist_free_overage: "Pay down overages",
22460
+ // ../ksuid/src/base62.ts
22461
+ var ALPHABET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
22462
+ var base62Encode = ({
22463
+ bytes,
22464
+ padTo
22465
+ }) => {
22466
+ const digits = [];
22467
+ const working = new Uint8Array(bytes);
22468
+ let allZero = false;
22469
+ while (!allZero) {
22470
+ allZero = true;
22471
+ let remainder = 0;
22472
+ for (let i = 0;i < working.length; i++) {
22473
+ const accumulator = remainder * 256 + working[i];
22474
+ working[i] = Math.floor(accumulator / 62);
22475
+ remainder = accumulator % 62;
22476
+ if (working[i] !== 0)
22477
+ allZero = false;
22478
+ }
22479
+ digits.push(remainder);
22480
+ }
22481
+ digits.reverse();
22482
+ while (digits.length < padTo) {
22483
+ digits.unshift(0);
22484
+ }
22485
+ return digits.map((d) => ALPHABET[d]).join("");
22486
+ };
22487
+
22488
+ // ../ksuid/src/random.ts
22489
+ var getRandomBytes = ({ size }) => {
22490
+ const buffer = new Uint8Array(size);
22491
+ globalThis.crypto.getRandomValues(buffer);
22492
+ return buffer;
22493
+ };
22494
+
22495
+ // ../ksuid/src/index.ts
22496
+ var KSUID_EPOCH = 1400000000;
22497
+ var PAYLOAD_BYTES = 20;
22498
+ var ENCODED_LENGTH = 27;
22499
+ var generateKsuid = ({ prefix = "" } = {}) => {
22500
+ const payload = new Uint8Array(PAYLOAD_BYTES);
22501
+ const timestamp = Math.floor(Date.now() / 1000) - KSUID_EPOCH;
22502
+ payload[0] = timestamp >>> 24 & 255;
22503
+ payload[1] = timestamp >>> 16 & 255;
22504
+ payload[2] = timestamp >>> 8 & 255;
22505
+ payload[3] = timestamp & 255;
22506
+ const randomBytes = getRandomBytes({ size: 16 });
22507
+ payload.set(randomBytes, 4);
22508
+ const encoded = base62Encode({ bytes: payload, padTo: ENCODED_LENGTH });
22509
+ return `${prefix}${encoded}`;
22510
+ };
22511
+
22512
+ // src/actions/webhooks/newWebhookId.ts
22513
+ var newWebhookId = () => generateKsuid({ prefix: "wh_" });
22514
+
22515
+ // src/actions/pull/webhooks/appendWebhook.ts
22516
+ var SPEC = SYNCED_LISTS.webhooks;
22517
+ var COLLECTION = "webhooks";
22518
+ var fixtureRowOf = ({
22519
+ webhook,
22520
+ envKey
22521
+ }) => ({
22522
+ id: webhook.id,
22523
+ url: { [envKey]: webhook.url },
22524
+ events: webhook.events,
22525
+ ...webhook.description ? { description: webhook.description } : {},
22526
+ ...webhook.disabled ? { disabled: true } : {}
22527
+ });
22528
+ var appendWebhook = ({
22529
+ pull,
22530
+ webhook,
22531
+ envKey
22532
+ }) => {
22533
+ const { configPath, files } = pull;
22534
+ const configSource = files.get(configPath) ?? "";
22535
+ const withKey = insertCollection({
22536
+ source: configSource,
22537
+ collection: COLLECTION
22538
+ });
22539
+ if (withKey === null)
22540
+ return "append to `webhooks` by hand: no atmn({...}) call";
22541
+ const spreads = rootSpreadNames({ source: configSource });
22542
+ if (withKey !== configSource && spreads.length > 0)
22543
+ return `append to \`webhooks\` by hand: atmn() spreads \`${spreads.join("`, `")}\`, which may already hold it`;
22544
+ files.set(configPath, withKey);
22545
+ const target = resolveCollectionTarget({
22546
+ configPath,
22547
+ files,
22548
+ collection: COLLECTION
22549
+ });
22550
+ if (target === null)
22551
+ return "append to `webhooks` by hand: it is not an array literal";
22552
+ const text = (indent) => emitFixture({
22553
+ spec: SPEC,
22554
+ row: fixtureRowOf({ webhook, envKey }),
22555
+ includeMappings: false,
22556
+ indent
22557
+ });
22558
+ const source = files.get(target.file) ?? "";
22559
+ const updated = target.kind === "inline" ? appendToCollection({ source, collection: COLLECTION, text }) : appendToBinding({ source, name: target.name, text });
22560
+ if (updated === null)
22561
+ return "append to `webhooks` by hand: it is not an array literal";
22562
+ files.set(target.file, ensureBuilderImport({
22563
+ source: updated,
22564
+ builder: SPEC.builder,
22565
+ collection: COLLECTION
22566
+ }));
22567
+ return null;
22568
+ };
22569
+
22570
+ // src/actions/pull/webhooks/locateWebhook.ts
22571
+ var SPEC2 = SYNCED_LISTS.webhooks;
22572
+ var locateWebhook = ({
22573
+ pull,
22574
+ id
22575
+ }) => locateFixture({
22576
+ configPath: pull.configPath,
22577
+ files: pull.files,
22578
+ builder: SPEC2.builder,
22579
+ idField: SPEC2.idField,
22580
+ id,
22581
+ allowDynamic: true
22582
+ });
22583
+
22584
+ // src/actions/pull/webhooks/updateWebhook.ts
22585
+ import { isDeepStrictEqual as isDeepStrictEqual2 } from "node:util";
22586
+ var SPEC3 = SYNCED_LISTS.webhooks;
22587
+ var sameEvents = (left, right) => Array.isArray(left) && isDeepStrictEqual2([...left].sort(), [...right].sort());
22588
+ var fieldAssignments = ({
22589
+ webhook,
22590
+ stated: stated2
22591
+ }) => {
22592
+ const assignments = [];
22593
+ if (webhook.events.length > 0 && !sameEvents(stated2.events, webhook.events))
22594
+ assignments.push({
22595
+ path: ["events"],
22596
+ text: `[${webhook.events.map((event) => JSON.stringify(event)).join(", ")}]`
22597
+ });
22598
+ if ((stated2.description ?? "") !== (webhook.description ?? ""))
22599
+ assignments.push({
22600
+ path: ["description"],
22601
+ text: webhook.description ? JSON.stringify(webhook.description) : null
22602
+ });
22603
+ if (stated2.disabled === true !== webhook.disabled)
22604
+ assignments.push({
22605
+ path: ["disabled"],
22606
+ text: webhook.disabled ? "true" : null
22607
+ });
22608
+ return assignments;
22609
+ };
22610
+ var nonLiteralUrlWarning = ({
22611
+ id,
22612
+ envKey,
22613
+ server,
22614
+ config
22615
+ }) => {
22616
+ const pad = " ".repeat(id.length + 4);
22617
+ return [
22618
+ `⚠ ${id} url.${envKey} isn't a plain string, so pull left it untouched`,
22619
+ `${pad}server: ${server ?? "(not registered)"}`,
22620
+ `${pad}your config: ${typeof config === "string" ? config : "(no value)"}`,
22621
+ `${pad}Update it by hand, or make it a string and pull will manage it.`
22622
+ ].join(`
22623
+ `);
22624
+ };
22625
+ var updateWebhook = ({
22626
+ pull,
22627
+ webhook,
22628
+ stated: stated2,
22629
+ envKey
22630
+ }) => {
22631
+ const result = { lines: [], warnings: [], unlocated: [] };
22632
+ if (webhook.events.length === 0 && Array.isArray(stated2.events))
22633
+ result.warnings.push(`⚠ ${webhook.id} the dashboard webhook at this url receives every event; your next push narrows it to ${stated2.events.join(", ")}`);
22634
+ const located = locateWebhook({ pull, id: webhook.id });
22635
+ if (located === null) {
22636
+ result.unlocated.push({
22637
+ id: webhook.id,
22638
+ action: "update from the server by hand"
22639
+ });
22640
+ return result;
22641
+ }
22642
+ const patched = patchFixturePaths({
22643
+ source: located.source,
22644
+ builder: SPEC3.builder,
22645
+ idField: SPEC3.idField,
22646
+ id: webhook.id,
22647
+ assignments: [
22648
+ { path: ["url", envKey], text: JSON.stringify(webhook.url) },
22649
+ ...fieldAssignments({ webhook, stated: stated2 })
22650
+ ],
22651
+ bareKeys: true
22652
+ });
22653
+ if (patched === null) {
22654
+ result.unlocated.push({
22655
+ id: webhook.id,
22656
+ action: "update from the server by hand"
22657
+ });
22658
+ return result;
22659
+ }
22660
+ for (const { path } of patched.skipped) {
22661
+ const field = path.join(".");
22662
+ if (field !== `url.${envKey}`) {
22663
+ result.warnings.push(`⚠ ${webhook.id} ${field} isn't a plain literal, so pull left it untouched`);
22664
+ continue;
22665
+ }
22666
+ const config = stated2.url?.[envKey];
22667
+ if (config === webhook.url)
22668
+ continue;
22669
+ result.warnings.push(nonLiteralUrlWarning({
22670
+ id: webhook.id,
22671
+ envKey,
22672
+ server: webhook.url,
22673
+ config
22674
+ }));
22675
+ }
22676
+ if (patched.source === located.source)
22677
+ return result;
22678
+ pull.files.set(located.file, patched.source);
22679
+ result.lines.push(`~ webhook ${webhook.id}`);
22680
+ return result;
22681
+ };
22682
+
22683
+ // src/actions/pull/webhooks/removeWebhookEnv.ts
22684
+ var SPEC4 = SYNCED_LISTS.webhooks;
22685
+ var urlMapIsEmpty = ({
22686
+ pull,
22687
+ id
22688
+ }) => {
22689
+ const located = locateWebhook({ pull, id });
22690
+ const object = located === null ? null : fixtureObjectOf(located.node);
22691
+ const member = object?.namedChildren().find((child) => child.kind() === "pair" && child.field("key") !== null && fixtureKeyOf({ node: child.field("key") }) === "url");
22692
+ const value = member?.field("value");
22693
+ if (value === null || value === undefined)
22694
+ return false;
22695
+ const read = readFixtureValue({ node: value });
22696
+ return typeof read === "object" && read !== null && Object.keys(read).length === 0;
22697
+ };
22698
+ var deleteWebhook = ({
22699
+ pull,
22700
+ id
22701
+ }) => {
22702
+ const located = locateWebhook({ pull, id });
22703
+ if (located === null)
22704
+ return false;
22705
+ const removed = deleteFixtureLiteral({
22706
+ source: located.source,
22707
+ builder: SPEC4.builder,
22708
+ idField: SPEC4.idField,
22709
+ id
22710
+ });
22711
+ if (removed === null)
22712
+ return false;
22713
+ pull.files.set(located.file, removed.source);
22714
+ if (removed.exportedName !== undefined) {
22715
+ const referenceFiles = new Set([pull.configPath]);
22716
+ const target = resolveCollectionTarget({
22717
+ configPath: pull.configPath,
22718
+ files: pull.files,
22719
+ collection: "webhooks"
22720
+ });
22721
+ if (target !== null)
22722
+ referenceFiles.add(target.file);
22723
+ for (const file of referenceFiles)
22724
+ pull.files.set(file, deleteReference({
22725
+ source: pull.files.get(file) ?? "",
22726
+ name: removed.exportedName
22727
+ }));
22728
+ }
22729
+ return true;
22730
+ };
22731
+ var removeWebhookEnv = ({
22732
+ pull,
22733
+ stated: stated2,
22734
+ envKey
22735
+ }) => {
22736
+ const result = { lines: [], warnings: [], unlocated: [] };
22737
+ const located = locateWebhook({ pull, id: stated2.id });
22738
+ const patched = located === null ? null : patchFixturePaths({
22739
+ source: located.source,
22740
+ builder: SPEC4.builder,
22741
+ idField: SPEC4.idField,
22742
+ id: stated2.id,
22743
+ assignments: [{ path: ["url", envKey], text: null }]
22744
+ });
22745
+ if (located === null || patched === null) {
22746
+ result.unlocated.push({
22747
+ id: stated2.id,
22748
+ action: `remove url.${envKey} by hand`
22749
+ });
22750
+ return result;
22751
+ }
22752
+ if (patched.skipped.length > 0) {
22753
+ result.warnings.push(nonLiteralUrlWarning({
22754
+ id: stated2.id,
22755
+ envKey,
22756
+ server: undefined,
22757
+ config: stated2.url?.[envKey]
22758
+ }));
22759
+ return result;
22760
+ }
22761
+ if (patched.source === located.source)
22762
+ return result;
22763
+ pull.files.set(located.file, patched.source);
22764
+ if (urlMapIsEmpty({ pull, id: stated2.id })) {
22765
+ if (deleteWebhook({ pull, id: stated2.id })) {
22766
+ result.lines.push(`- webhook ${stated2.id}`);
22767
+ return result;
22768
+ }
22769
+ result.unlocated.push({
22770
+ id: stated2.id,
22771
+ action: "delete the webhook by hand: its url map is now empty"
22772
+ });
22773
+ return result;
22774
+ }
22775
+ result.lines.push(`- webhook ${stated2.id} url.${envKey}`);
22776
+ return result;
22777
+ };
22778
+
22779
+ // src/actions/pull/webhooks/applyWebhooksPull.ts
22780
+ var isVercelWebhook = (events) => Array.isArray(events) && events.length > 0 && events.every((event) => typeof event === "string" && event.startsWith("vercel."));
22781
+ var merge = (target, source) => {
22782
+ target.lines.push(...source.lines);
22783
+ target.warnings.push(...source.warnings);
22784
+ target.unlocated.push(...source.unlocated);
22785
+ };
22786
+ var applyWebhooksPull = ({
22787
+ pull,
22788
+ remote,
22789
+ stated: stated2,
22790
+ envKey,
22791
+ newId = newWebhookId
22792
+ }) => {
22793
+ const result = { lines: [], warnings: [], unlocated: [] };
22794
+ const statedById = new Map((stated2 ?? []).map((row) => [row.id, row]));
22795
+ const fromDashboard = (webhook) => !statedById.has(webhook.id) && isDashboardWebhook(webhook);
22796
+ const present = new Set;
22797
+ for (const webhook of remote) {
22798
+ if (fromDashboard(webhook)) {
22799
+ const represented = (stated2 ?? []).find((row2) => row2.url?.[envKey] === webhook.url && isVercelWebhook(row2.events) === isVercelWebhook(webhook.events));
22800
+ if (represented !== undefined) {
22801
+ present.add(represented.id);
22802
+ merge(result, updateWebhook({
22803
+ pull,
22804
+ webhook: { ...webhook, id: represented.id },
22805
+ stated: represented,
22806
+ envKey
22807
+ }));
22808
+ continue;
22809
+ }
22810
+ if (webhook.events.length === 0) {
22811
+ result.lines.push(`· webhook ${webhook.id} receives every event; give it an event list in the dashboard, or add it to your config, to manage it here`);
22812
+ continue;
22813
+ }
22814
+ const id = newId();
22815
+ const failure2 = appendWebhook({
22816
+ pull,
22817
+ webhook: { ...webhook, id },
22818
+ envKey
22819
+ });
22820
+ if (failure2 === null)
22821
+ result.lines.push(`+ webhook ${id} (made in the dashboard; push adopts it by URL)`);
22822
+ else
22823
+ result.unlocated.push({ id, action: failure2 });
22824
+ continue;
22825
+ }
22826
+ present.add(webhook.id);
22827
+ const row = statedById.get(webhook.id);
22828
+ if (row !== undefined) {
22829
+ merge(result, updateWebhook({ pull, webhook, stated: row, envKey }));
22830
+ continue;
22831
+ }
22832
+ const failure = appendWebhook({ pull, webhook, envKey });
22833
+ if (failure === null)
22834
+ result.lines.push(`+ webhook ${webhook.id}`);
22835
+ else
22836
+ result.unlocated.push({ id: webhook.id, action: failure });
22837
+ }
22838
+ for (const row of stated2 ?? []) {
22839
+ if (present.has(row.id) || row.url?.[envKey] === undefined)
22840
+ continue;
22841
+ merge(result, removeWebhookEnv({ pull, stated: row, envKey }));
22842
+ }
22843
+ return result;
22844
+ };
22845
+
22846
+ // src/render/renderPreview.ts
22847
+ import chalk5 from "chalk";
22848
+
22849
+ // src/generated/labels.ts
22850
+ var PREVIOUS_ATTRIBUTE_LABELS = {
22851
+ name: "Name",
22852
+ description: "Description",
22853
+ group: "Group",
22854
+ add_on: "Add-on",
22855
+ auto_enable: "Default plan",
22856
+ free_trial: "Free trial",
22857
+ config: "Config",
22858
+ active: "Active version",
22859
+ billing_controls: "Billing controls",
22860
+ processors: "Processor mappings",
22861
+ base_variant_id: "Base plan",
22862
+ base_version: "Base version",
22863
+ base_version_slug: "Base version slug",
22864
+ cancel_on_past_due: "Cancel on past due",
22865
+ reverse_deduction_order: "Reverse deduction order",
22866
+ block_overdue_entitlements: "Block access while overdue",
22867
+ invoice_memos: "Invoice memos",
22868
+ disable_overage_billing: "Disable overage billing",
22869
+ persist_free_overage: "Pay down overages",
22043
22870
  automatic_tax: "Automatic tax",
22044
22871
  multi_currency: "Multi-currency",
22045
22872
  id: "ID"
22046
22873
  };
22047
22874
 
22875
+ // src/render/renderWebhooks.ts
22876
+ import chalk4 from "chalk";
22877
+ var webhooksHaveWork = ({
22878
+ webhooks
22879
+ }) => (webhooks?.changes ?? []).some((change) => change.action !== "unmanaged");
22880
+ var DETAIL_INDENT = " ";
22881
+ var list2 = (values) => values.length === 0 ? "(none)" : values.join(", ");
22882
+ var updateDetails = ({
22883
+ id,
22884
+ before,
22885
+ after
22886
+ }) => {
22887
+ const lines = [];
22888
+ if (before.url !== after.url)
22889
+ lines.push(`${id} url: ${before.url} → ${after.url}`);
22890
+ const events = (state) => [...state.events].sort();
22891
+ if (events(before).join() !== events(after).join())
22892
+ lines.push(`events: ${list2(events(before))} → ${list2(events(after))}`);
22893
+ if ((before.description ?? "") !== (after.description ?? ""))
22894
+ lines.push(`description: ${JSON.stringify(before.description ?? "")} → ${JSON.stringify(after.description ?? "")}`);
22895
+ if (before.disabled !== after.disabled)
22896
+ lines.push(`disabled: ${before.disabled} → ${after.disabled}`);
22897
+ return lines.map((line) => `${DETAIL_INDENT}${chalk4.yellow(line)}`);
22898
+ };
22899
+ var renderChange = ({ change }) => {
22900
+ if (change.action === "create")
22901
+ return [
22902
+ ` ${chalk4.green(`+ ${change.id}`)}${chalk4.dim(` ${change.webhook.url}`)}`,
22903
+ `${DETAIL_INDENT}${chalk4.dim(`events: ${list2(change.webhook.events)}`)}`
22904
+ ];
22905
+ if (change.action === "adopt")
22906
+ return [
22907
+ ` ${chalk4.yellow(`~ ${change.id}`)} ${chalk4.bold("adopt")} ${chalk4.dim("existing dashboard webhook · signing secret unchanged")}`,
22908
+ ...updateDetails({
22909
+ id: change.id,
22910
+ before: change.before,
22911
+ after: change.after
22912
+ })
22913
+ ];
22914
+ if (change.action === "update")
22915
+ return [
22916
+ ` ${chalk4.yellow(`~ ${change.id}`)}`,
22917
+ ...updateDetails({
22918
+ id: change.id,
22919
+ before: change.before,
22920
+ after: change.after
22921
+ })
22922
+ ];
22923
+ return [
22924
+ chalk4.dim(` · ${change.id} unmanaged (not in your config; atmn leaves it alone)`)
22925
+ ];
22926
+ };
22927
+ var renderWebhooks = ({
22928
+ webhooks
22929
+ }) => {
22930
+ const rows = webhooks.changes.flatMap((change) => renderChange({ change }));
22931
+ if (rows.length === 0)
22932
+ return null;
22933
+ const count = webhooks.changes.filter((change) => change.action !== "unmanaged").length;
22934
+ return [chalk4.bold(`Webhooks (${count})`), ...rows].join(`
22935
+ `);
22936
+ };
22937
+
22048
22938
  // src/render/renderPreview.ts
22049
22939
  var MARKERS = {
22050
- create: { symbol: "+", paint: chalk4.green },
22051
- update: { symbol: "~", paint: chalk4.yellow },
22052
- delete: { symbol: "-", paint: chalk4.red }
22940
+ create: { symbol: "+", paint: chalk5.green },
22941
+ update: { symbol: "~", paint: chalk5.yellow },
22942
+ delete: { symbol: "-", paint: chalk5.red }
22053
22943
  };
22054
22944
  var APPLIED_ACTIONS = new Set(["create", "update", "delete"]);
22055
22945
  var NESTED_ACTIONS = {
@@ -22060,7 +22950,7 @@ var NESTED_ACTIONS = {
22060
22950
  };
22061
22951
  var marker = (action) => MARKERS[NESTED_ACTIONS[action ?? ""] ?? action ?? ""] ?? {
22062
22952
  symbol: "?",
22063
- paint: chalk4.dim
22953
+ paint: chalk5.dim
22064
22954
  };
22065
22955
  var line = ({
22066
22956
  action,
@@ -22069,7 +22959,7 @@ var line = ({
22069
22959
  indent = " "
22070
22960
  }) => {
22071
22961
  const { symbol, paint } = marker(action);
22072
- const suffix = label && label !== id ? chalk4.dim(` ${label}`) : "";
22962
+ const suffix = label && label !== id ? chalk5.dim(` ${label}`) : "";
22073
22963
  return `${indent}${paint(`${symbol} ${id}`)}${suffix}`;
22074
22964
  };
22075
22965
  var formatValue = (value) => {
@@ -22214,7 +23104,7 @@ var renderLicenseChanges = ({
22214
23104
  }) => licenseChanges.flatMap((change) => {
22215
23105
  const id = change.version === undefined ? change.licensePlanId ?? "?" : `${change.licensePlanId}@v${change.version}`;
22216
23106
  return [
22217
- `${line({ action: change.action, id, indent })}${chalk4.dim(" (license)")}`,
23107
+ `${line({ action: change.action, id, indent })}${chalk5.dim(" (license)")}`,
22218
23108
  ...renderPreviousAttributes({
22219
23109
  attributes: change.previousAttributes,
22220
23110
  indent: `${indent} `,
@@ -22288,16 +23178,16 @@ var nestedRowHasWork = (entry) => {
22288
23178
  return false;
22289
23179
  };
22290
23180
  var rowHasWork = (row) => isChange(row) || Object.values(row).some((value) => Array.isArray(value) && value.some(nestedRowHasWork));
22291
- var DETAIL_INDENT = " ";
22292
- var VARIANT_INDENT = DETAIL_INDENT;
23181
+ var DETAIL_INDENT2 = " ";
23182
+ var VARIANT_INDENT = DETAIL_INDENT2;
22293
23183
  var planRowId = (row) => row.version === undefined ? row.planId ?? "?" : `${row.planId}@v${row.version}`;
22294
23184
  var contextLine = ({
22295
23185
  id,
22296
23186
  label,
22297
23187
  indent = " "
22298
23188
  }) => {
22299
- const suffix = label && label !== id ? chalk4.dim(` ${label}`) : "";
22300
- return `${indent} ${chalk4.dim(id)}${suffix}`;
23189
+ const suffix = label && label !== id ? chalk5.dim(` ${label}`) : "";
23190
+ return `${indent} ${chalk5.dim(id)}${suffix}`;
22301
23191
  };
22302
23192
  var isVariantCreate = (variant) => variant.internalId === null || variant.internalId === undefined;
22303
23193
  var variantCreateLabel = (planChange) => {
@@ -22316,7 +23206,7 @@ var renderVariantRow = ({
22316
23206
  const nested = (variant.siblingVersions ?? []).filter(nestedRowHasWork).flatMap((sibling) => renderVariantRow({ variant: sibling, baseId, indent: detailIndent }));
22317
23207
  if (variant.variantAction === "propagated") {
22318
23208
  return [
22319
- `${line({ action: "update", id, indent })}${chalk4.dim(` follows ${baseId}`)}`,
23209
+ `${line({ action: "update", id, indent })}${chalk5.dim(` follows ${baseId}`)}`,
22320
23210
  ...nested
22321
23211
  ];
22322
23212
  }
@@ -22368,11 +23258,11 @@ var renderPlanRow = ({ plan }) => {
22368
23258
  const fresh = isFreshRow(plan);
22369
23259
  return [
22370
23260
  isChange(plan) ? line({ action: fresh ? "create" : plan.action, id, label: plan.name }) : contextLine({ id, label: plan.name }),
22371
- ...renderIdentityChanges({ row: plan, indent: DETAIL_INDENT }),
23261
+ ...renderIdentityChanges({ row: plan, indent: DETAIL_INDENT2 }),
22372
23262
  ...plan.planChange ? renderPlanChangeDetail({
22373
23263
  planChange: plan.planChange,
22374
23264
  current: currentAttributes(plan),
22375
- indent: DETAIL_INDENT,
23265
+ indent: DETAIL_INDENT2,
22376
23266
  fresh
22377
23267
  }) : [],
22378
23268
  ...renderVariantLanes({ plan })
@@ -22418,7 +23308,7 @@ var renderPlannedMigrations = ({
22418
23308
  migrations,
22419
23309
  plans
22420
23310
  }) => [
22421
- chalk4.bold(`Migrations (${migrations.length})`),
23311
+ chalk5.bold(`Migrations (${migrations.length})`),
22422
23312
  ...migrations.flatMap((migration) => (migration.plans ?? []).flatMap((target) => (target.versions ?? []).flatMap((version2) => {
22423
23313
  const row = planRowForTarget({
22424
23314
  plans,
@@ -22427,10 +23317,10 @@ var renderPlannedMigrations = ({
22427
23317
  });
22428
23318
  const custom = migration.includeCustom ? ", customized plans too" : "";
22429
23319
  return [
22430
- ` ${chalk4.cyan(`${target.planId} v${version2}`)}${customerCount({ row })}${custom}`,
23320
+ ` ${chalk5.cyan(`${target.planId} v${version2}`)}${customerCount({ row })}${custom}`,
22431
23321
  ...row?.planChange ? renderPlanChangeDetail({
22432
23322
  planChange: row.planChange,
22433
- indent: DETAIL_INDENT
23323
+ indent: DETAIL_INDENT2
22434
23324
  }) : []
22435
23325
  ];
22436
23326
  })))
@@ -22440,8 +23330,8 @@ var renderMigrationLinks = ({
22440
23330
  migrations,
22441
23331
  migrationLinkBase
22442
23332
  }) => [
22443
- chalk4.bold(`Draft migrations (${migrations.length})`),
22444
- ...migrations.map((migration) => migrationLinkBase && migration.id ? ` ${chalk4.cyan(`${migrationLinkBase}/migrations/${migration.id}`)}` : ` ${chalk4.cyan(migration.id ?? "?")}`)
23333
+ chalk5.bold(`Draft migrations (${migrations.length})`),
23334
+ ...migrations.map((migration) => migrationLinkBase && migration.id ? ` ${chalk5.cyan(`${migrationLinkBase}/migrations/${migration.id}`)}` : ` ${chalk5.cyan(migration.id ?? "?")}`)
22445
23335
  ].join(`
22446
23336
  `);
22447
23337
  var UNMANAGED_NOTE = "unmanaged (set false explicitly to disable; atmn won't override)";
@@ -22449,10 +23339,10 @@ var renderSettingChange = ({ change }) => {
22449
23339
  const label = labelFor(change.key ?? "?");
22450
23340
  if (change.action === "unmanaged") {
22451
23341
  const { symbol: symbol2, paint: paint2 } = marker("update");
22452
- return `${DETAIL_INDENT}${paint2(`${symbol2} ${label}: ${formatValue(change.previous)} -> ${UNMANAGED_NOTE}`)}`;
23342
+ return `${DETAIL_INDENT2}${paint2(`${symbol2} ${label}: ${formatValue(change.previous)} -> ${UNMANAGED_NOTE}`)}`;
22453
23343
  }
22454
23344
  const { symbol, paint } = marker("update");
22455
- return `${DETAIL_INDENT}${paint(`${symbol} ${label}: ${formatValue(change.previous)} -> ${formatValue(change.current)}`)}`;
23345
+ return `${DETAIL_INDENT2}${paint(`${symbol} ${label}: ${formatValue(change.previous)} -> ${formatValue(change.current)}`)}`;
22456
23346
  };
22457
23347
  var settingChanges = (settings) => settings?.config?.changes ?? [];
22458
23348
  var settingsHaveWork = ({
@@ -22468,20 +23358,21 @@ var renderPreview = ({
22468
23358
  const referralPrograms = (preview.referralPrograms ?? []).filter(rowHasWork);
22469
23359
  const migrations = preview.migrations ?? [];
22470
23360
  const settings = settingChanges(preview.settings);
22471
- if (features.length === 0 && plans.length === 0 && rewards.length === 0 && referralPrograms.length === 0 && settings.length === 0) {
22472
- return chalk4.dim("No changes. Your catalog matches your config.");
23361
+ const webhooks = preview.webhooks === undefined ? null : renderWebhooks({ webhooks: preview.webhooks });
23362
+ if (features.length === 0 && plans.length === 0 && rewards.length === 0 && referralPrograms.length === 0 && settings.length === 0 && webhooks === null) {
23363
+ return chalk5.dim("No changes. Your catalog matches your config.");
22473
23364
  }
22474
23365
  const sections = [];
22475
23366
  if (settings.length > 0) {
22476
23367
  sections.push([
22477
- chalk4.bold(`Settings (${settings.length})`),
23368
+ chalk5.bold(`Settings (${settings.length})`),
22478
23369
  ...settings.map((change) => renderSettingChange({ change }))
22479
23370
  ].join(`
22480
23371
  `));
22481
23372
  }
22482
23373
  if (features.length > 0) {
22483
23374
  sections.push([
22484
- chalk4.bold(`Features (${features.length})`),
23375
+ chalk5.bold(`Features (${features.length})`),
22485
23376
  ...features.flatMap((feature) => [
22486
23377
  line({
22487
23378
  action: feature.action,
@@ -22490,7 +23381,7 @@ var renderPreview = ({
22490
23381
  }),
22491
23382
  ...renderPreviousAttributes({
22492
23383
  attributes: feature.previousAttributes,
22493
- indent: DETAIL_INDENT
23384
+ indent: DETAIL_INDENT2
22494
23385
  })
22495
23386
  ])
22496
23387
  ].join(`
@@ -22498,14 +23389,14 @@ var renderPreview = ({
22498
23389
  }
22499
23390
  if (plans.length > 0) {
22500
23391
  sections.push([
22501
- chalk4.bold(`Plans (${plans.length})`),
23392
+ chalk5.bold(`Plans (${plans.length})`),
22502
23393
  ...plans.flatMap((plan) => renderPlanRow({ plan }))
22503
23394
  ].join(`
22504
23395
  `));
22505
23396
  }
22506
23397
  if (rewards.length > 0) {
22507
23398
  sections.push([
22508
- chalk4.bold(`Rewards (${rewards.length})`),
23399
+ chalk5.bold(`Rewards (${rewards.length})`),
22509
23400
  ...rewards.flatMap((reward) => [
22510
23401
  line({
22511
23402
  action: reward.action,
@@ -22514,7 +23405,7 @@ var renderPreview = ({
22514
23405
  }),
22515
23406
  ...renderPreviousAttributes({
22516
23407
  attributes: reward.previousAttributes,
22517
- indent: DETAIL_INDENT
23408
+ indent: DETAIL_INDENT2
22518
23409
  })
22519
23410
  ])
22520
23411
  ].join(`
@@ -22522,7 +23413,7 @@ var renderPreview = ({
22522
23413
  }
22523
23414
  if (referralPrograms.length > 0) {
22524
23415
  sections.push([
22525
- chalk4.bold(`Referral programs (${referralPrograms.length})`),
23416
+ chalk5.bold(`Referral programs (${referralPrograms.length})`),
22526
23417
  ...referralPrograms.flatMap((program) => [
22527
23418
  line({
22528
23419
  action: program.action,
@@ -22531,12 +23422,14 @@ var renderPreview = ({
22531
23422
  }),
22532
23423
  ...renderPreviousAttributes({
22533
23424
  attributes: program.previousAttributes,
22534
- indent: DETAIL_INDENT
23425
+ indent: DETAIL_INDENT2
22535
23426
  })
22536
23427
  ])
22537
23428
  ].join(`
22538
23429
  `));
22539
23430
  }
23431
+ if (webhooks !== null)
23432
+ sections.push(webhooks);
22540
23433
  if (migrations.length > 0) {
22541
23434
  sections.push(renderPlannedMigrations({ migrations, plans }));
22542
23435
  }
@@ -22546,7 +23439,7 @@ var renderPreview = ({
22546
23439
  };
22547
23440
  var previewIsEmpty = ({
22548
23441
  preview
22549
- }) => !(preview.features ?? []).some(rowHasWork) && !(preview.plans ?? []).some(rowHasWork) && !(preview.rewards ?? []).some(rowHasWork) && !(preview.referralPrograms ?? []).some(rowHasWork) && !settingsHaveWork({ settings: preview.settings });
23442
+ }) => !(preview.features ?? []).some(rowHasWork) && !(preview.plans ?? []).some(rowHasWork) && !(preview.rewards ?? []).some(rowHasWork) && !(preview.referralPrograms ?? []).some(rowHasWork) && !settingsHaveWork({ settings: preview.settings }) && !webhooksHaveWork({ webhooks: preview.webhooks });
22550
23443
 
22551
23444
  // src/actions/push/backfillInternalIds.ts
22552
23445
  import { readFileSync as readFileSync12, writeFileSync as writeFileSync8 } from "node:fs";
@@ -22955,6 +23848,42 @@ var renderDeprecatedUses = ({
22955
23848
  }) => uses.map((use) => `note: ${use.collection} "${use.id}" states deprecated \`${use.path}\`. ${use.reason}`).join(`
22956
23849
  `);
22957
23850
 
23851
+ // src/actions/push/pushLanesError.ts
23852
+ var messageOf = (error) => error instanceof Error ? error.message : String(error);
23853
+
23854
+ class PushLanesError extends Error {
23855
+ failures;
23856
+ constructor({
23857
+ stage,
23858
+ failures
23859
+ }) {
23860
+ super([
23861
+ `push ${stage} failed in ${failures.length} of its lanes:`,
23862
+ ...failures.map(({ lane, error }) => `
23863
+ ${lane}
23864
+ ${messageOf(error).replace(/\n/g, `
23865
+ `)}`)
23866
+ ].join(`
23867
+ `));
23868
+ this.name = "PushLanesError";
23869
+ this.failures = failures;
23870
+ }
23871
+ }
23872
+ var settleLanes = async (lanes) => {
23873
+ const names = Object.keys(lanes);
23874
+ const settled = await Promise.allSettled(names.map((name) => lanes[name]));
23875
+ const values = {};
23876
+ const failures = [];
23877
+ settled.forEach((result, index) => {
23878
+ const lane = names[index];
23879
+ if (result.status === "fulfilled")
23880
+ values[lane] = result.value;
23881
+ else
23882
+ failures.push({ lane, error: result.reason });
23883
+ });
23884
+ return { values, failures };
23885
+ };
23886
+
22958
23887
  // src/actions/sandbox/withSandboxScopeHint.ts
22959
23888
  var SCOPE_REFUSAL = "Insufficient scopes";
22960
23889
  var SANDBOX_LOGIN_HINT = "Your key can't manage sandboxes: it was minted before atmn asked for platform:write. Run atmn login again to mint one that can.";
@@ -22966,6 +23895,121 @@ var withScopeHint = ({
22966
23895
  hint: hint2
22967
23896
  }) => error instanceof AutumnApiError && error.message.includes(SCOPE_REFUSAL) ? new Error(hint2, { cause: error }) : error;
22968
23897
 
23898
+ // src/actions/webhooks/writeWebhookSecrets.ts
23899
+ import { existsSync as existsSync12, readFileSync as readFileSync13, writeFileSync as writeFileSync9 } from "node:fs";
23900
+ import { dirname as dirname11, join as join13, relative as relative6 } from "node:path";
23901
+
23902
+ // src/actions/webhooks/webhookSecretName.ts
23903
+ var envNameSegment = (value) => value.toUpperCase().replace(/-/g, "_");
23904
+ var webhookSecretName = ({
23905
+ id,
23906
+ orgId
23907
+ }) => {
23908
+ const org4 = orgId === undefined ? "" : `_${envNameSegment(orgId.replace(/^org_/, "").slice(0, 4))}`;
23909
+ return `AUTUMN_WEBHOOK_${envNameSegment(id)}${org4}_SECRET`;
23910
+ };
23911
+
23912
+ // src/actions/webhooks/writeWebhookSecrets.ts
23913
+ var PROD_ENV_FILE = ".env.prod";
23914
+ var prodEnvPath = ({ envDirs }) => {
23915
+ const nearest = findEnvFile({ dirs: envDirs });
23916
+ return join13(nearest === undefined ? envDirs[0] ?? process.cwd() : dirname11(nearest), PROD_ENV_FILE);
23917
+ };
23918
+ var writeWebhookSecrets = async ({
23919
+ secrets,
23920
+ env,
23921
+ envDirs,
23922
+ cwd
23923
+ }) => {
23924
+ if (secrets.length === 0)
23925
+ return [];
23926
+ const orgId = env.live ? undefined : await env.orgId();
23927
+ const values = Object.fromEntries(secrets.map(({ id, secret }) => [webhookSecretName({ id, orgId }), secret]));
23928
+ let path;
23929
+ if (env.live) {
23930
+ path = prodEnvPath({ envDirs });
23931
+ const content = existsSync12(path) ? readFileSync13(path, "utf8") : "";
23932
+ writeFileSync9(path, upsertEnvContent({ content, values }), { mode: 384 });
23933
+ } else {
23934
+ path = writeEnvValues({ dirs: envDirs, values });
23935
+ }
23936
+ const file = relative6(cwd, path) || path;
23937
+ return Object.keys(values).map((name) => `Saved webhook secret as ${name} in ${file}`);
23938
+ };
23939
+
23940
+ // src/actions/webhooks/applyWebhooks.ts
23941
+ var applyWebhooks = async ({
23942
+ client,
23943
+ lane,
23944
+ envDirs,
23945
+ cwd,
23946
+ write
23947
+ }) => {
23948
+ if (lane === undefined || !webhooksHaveWork({ webhooks: lane.preview }))
23949
+ return;
23950
+ const result = await client.syncWebhooks(lane.body);
23951
+ const saved = await writeWebhookSecrets({
23952
+ secrets: result.secrets,
23953
+ env: lane.env,
23954
+ envDirs,
23955
+ cwd
23956
+ });
23957
+ const failed = new Set([
23958
+ ...result.errors.map(({ id }) => id),
23959
+ ...result.secrets.map(({ id }) => id)
23960
+ ]);
23961
+ const adopted = lane.preview.changes.filter((change) => change.action === "adopt" && !failed.has(change.id)).map((change) => `Adopted ${change.id} (existing dashboard webhook); its signing secret is unchanged, nothing written`);
23962
+ write(`
23963
+ Applied webhooks.
23964
+ ${[...adopted, ...saved].map((line2) => `${line2}
23965
+ `).join("")}`);
23966
+ if (result.errors.length > 0)
23967
+ throw new Error(result.errors.map(({ id, message }) => `${id}: ${message}`).join(`
23968
+ `));
23969
+ };
23970
+
23971
+ // src/actions/webhooks/resolveWebhooksForEnv.ts
23972
+ var resolveWebhooksForEnv = ({
23973
+ rows,
23974
+ envKey
23975
+ }) => {
23976
+ const { envKeyed } = SYNCED_LISTS.webhooks;
23977
+ const webhooks = [];
23978
+ for (const row of rows) {
23979
+ const values = envKeyed.map((field) => row[field]?.[envKey]);
23980
+ if (values.some((value) => typeof value !== "string"))
23981
+ continue;
23982
+ webhooks.push({
23983
+ ...row,
23984
+ ...Object.fromEntries(envKeyed.map((field, index) => [field, values[index]]))
23985
+ });
23986
+ }
23987
+ return webhooks;
23988
+ };
23989
+
23990
+ // src/actions/webhooks/previewWebhooks.ts
23991
+ var previewWebhooks = async ({
23992
+ client,
23993
+ rows,
23994
+ webhookEnv
23995
+ }) => {
23996
+ if (rows === undefined)
23997
+ return;
23998
+ if (webhookEnv === undefined)
23999
+ throw new Error("webhooks need the target environment to pick each url.");
24000
+ const env = await webhookEnv();
24001
+ const webhooks = resolveWebhooksForEnv({
24002
+ rows,
24003
+ envKey: env.key
24004
+ });
24005
+ const body = { webhooks };
24006
+ const { changes, errors } = await client.previewSyncWebhooks(body);
24007
+ if (errors.length > 0)
24008
+ throw new Error(errors.map(({ id, message }) => `${id}: ${message}`).join(`
24009
+ `));
24010
+ return { preview: { changes }, body, env };
24011
+ };
24012
+
22969
24013
  // src/actions/push.ts
22970
24014
  var previewSettings = async ({
22971
24015
  client,
@@ -23036,63 +24080,64 @@ var configSearchDirs = ({
23036
24080
  const project = resolveProject({ cwd, configFlag: configPath });
23037
24081
  return [...new Set([project.configDir, cwd, ...project.envDirs])];
23038
24082
  };
23039
- var runPush = async ({
23040
- client,
23041
- cwd = process.cwd(),
23042
- configPath: configFlag,
23043
- dryRun = false,
23044
- write = (text) => process.stdout.write(text),
23045
- migrationLinkBase
23046
- }) => {
23047
- const project = resolveProject({ cwd, configFlag });
23048
- const dirs = configSearchDirs({ cwd, configPath: configFlag });
23049
- loadEnvFiles({ dirs: project.envDirs });
23050
- const { path: configPath, wire: document } = await loadConfig({
23051
- dirs,
23052
- ...project.configPath === null ? {} : { configPath: project.configPath }
23053
- });
23054
- const { catalog: wire, singletons } = splitWire(document);
23055
- const deprecated = deprecatedUsesIn({ wire });
23056
- if (deprecated.length > 0)
23057
- write(`${renderDeprecatedUses({ uses: deprecated })}
23058
-
24083
+ var pushExitCode = ({
24084
+ apply,
24085
+ result
24086
+ }) => !apply && result.catalogDeferred === true ? 1 : 0;
24087
+ var renderCatalogDeferral = ({ error }) => [
24088
+ "Catalog: not previewed yet. It depends on the settings above, so it is previewed again once they apply.",
24089
+ ` Against the current settings it fails: ${error instanceof Error ? error.message : String(error)}`,
24090
+ " With --yes: settings apply, then the catalog is previewed again and applied if that preview passes."
24091
+ ].join(`
23059
24092
  `);
23060
- const settingsBody = singletons.settings;
23061
- const settings = await previewSettings({ client, body: settingsBody });
23062
- const settingsWork = settingsBody !== undefined && settingsHaveWork({ settings });
23063
- if (settingsWork) {
23064
- write(`${renderPreview({ preview: { settings } })}
24093
+ var renderLintWarnings = ({ warnings }) => warnings.map((warning) => `⚠ ${warning.path}
24094
+ ${warning.message}`).join(`
23065
24095
  `);
23066
- if (!dryRun) {
23067
- try {
23068
- await client.updateOrganization(settingsBody);
23069
- } catch (error) {
23070
- throw withSettingsScopeHint({ error });
23071
- }
23072
- write(`
24096
+ var applySettings = async ({
24097
+ client,
24098
+ settingsBody,
24099
+ settings,
24100
+ catalogPreview,
24101
+ wire,
24102
+ write,
24103
+ migrationLinkBase,
24104
+ catalogDeferred
24105
+ }) => {
24106
+ if (settingsBody === undefined || !settingsHaveWork({ settings }))
24107
+ return catalogPreview;
24108
+ try {
24109
+ await client.updateOrganization(settingsBody);
24110
+ } catch (error) {
24111
+ throw withSettingsScopeHint({ error });
24112
+ }
24113
+ write(`
23073
24114
  Applied settings.
23074
-
23075
24115
  `);
23076
- }
24116
+ let preview;
24117
+ try {
24118
+ preview = await client.previewUpdate(wire);
24119
+ } catch (error) {
24120
+ if (!catalogDeferred)
24121
+ throw error;
24122
+ throw new Error(`Applied settings, but the catalog still fails its preview, so the catalog and webhooks were not applied:
24123
+ ${error instanceof Error ? error.message : String(error)}`, { cause: error });
23077
24124
  }
23078
- const catalogPreview = await client.previewUpdate(wire);
23079
- const preview = {
23080
- ...catalogPreview,
23081
- ...settingsWork ? {} : { settings }
23082
- };
23083
- write(`${renderPreview({ preview, migrationLinkBase })}
23084
- `);
23085
- const renameHint2 = possibleRenameHint({ preview, wire });
23086
- if (renameHint2 !== null)
23087
- write(`${renameHint2}
23088
-
24125
+ if (catalogDeferred)
24126
+ write(`
24127
+ ${renderPreview({ preview, migrationLinkBase })}
23089
24128
  `);
23090
- const fullPreview = { ...catalogPreview, settings };
23091
- if (previewIsEmpty({ preview: catalogPreview })) {
23092
- return { configPath, preview: fullPreview, migrationIds: [] };
23093
- }
23094
- if (dryRun)
23095
- return { configPath, preview: fullPreview, migrationIds: [] };
24129
+ return preview;
24130
+ };
24131
+ var applyCatalog = async ({
24132
+ client,
24133
+ preview,
24134
+ wire,
24135
+ configPath,
24136
+ write,
24137
+ migrationLinkBase
24138
+ }) => {
24139
+ if (previewIsEmpty({ preview }))
24140
+ return { migrationIds: [] };
23096
24141
  const applied = await client.update(wire);
23097
24142
  const migrationIds = (applied.migrations ?? []).map((migration) => migration.id).filter((id) => typeof id === "string");
23098
24143
  write(`
@@ -23119,7 +24164,107 @@ Applied.
23119
24164
  if (backfilled.length > 0 || slugged.length > 0) {
23120
24165
  write(backfillSummary({ backfilled, slugged }));
23121
24166
  }
23122
- return { configPath, preview: fullPreview, applied, migrationIds };
24167
+ return { applied, migrationIds };
24168
+ };
24169
+ var runPush = async ({
24170
+ client,
24171
+ cwd = process.cwd(),
24172
+ configPath: configFlag,
24173
+ dryRun = false,
24174
+ write = (text) => process.stdout.write(text),
24175
+ migrationLinkBase,
24176
+ webhookEnv
24177
+ }) => {
24178
+ const project = resolveProject({ cwd, configFlag });
24179
+ const dirs = configSearchDirs({ cwd, configPath: configFlag });
24180
+ loadEnvFiles({ dirs: project.envDirs });
24181
+ const { path: configPath, wire: document } = await loadConfig({
24182
+ dirs,
24183
+ ...project.configPath === null ? {} : { configPath: project.configPath }
24184
+ });
24185
+ const { catalog: wire, singletons, lists, warnings } = splitWire(document);
24186
+ if (warnings.length > 0)
24187
+ write(`${renderLintWarnings({ warnings })}
24188
+
24189
+ `);
24190
+ const deprecated = deprecatedUsesIn({ wire });
24191
+ if (deprecated.length > 0)
24192
+ write(`${renderDeprecatedUses({ uses: deprecated })}
24193
+
24194
+ `);
24195
+ const settingsBody = singletons.settings;
24196
+ const previews = await settleLanes({
24197
+ settings: previewSettings({ client, body: settingsBody }),
24198
+ catalog: client.previewUpdate(wire),
24199
+ webhooks: previewWebhooks({
24200
+ client,
24201
+ rows: lists.webhooks,
24202
+ webhookEnv
24203
+ })
24204
+ });
24205
+ const { settings, webhooks } = previews.values;
24206
+ const catalogDeferral = settingsBody !== undefined && settingsHaveWork({ settings }) ? previews.failures.find((failure) => failure.lane === "catalog") : undefined;
24207
+ const failures = previews.failures.filter((failure) => failure !== catalogDeferral);
24208
+ if (failures.length > 0)
24209
+ throw new PushLanesError({ stage: "preview", failures });
24210
+ const catalogPreview = previews.values.catalog ?? {};
24211
+ const preview = {
24212
+ ...catalogPreview,
24213
+ settings,
24214
+ ...webhooks === undefined ? {} : { webhooks: webhooks.preview }
24215
+ };
24216
+ write(`${renderPreview({ preview, migrationLinkBase })}
24217
+ `);
24218
+ if (catalogDeferral !== undefined)
24219
+ write(`
24220
+ ${renderCatalogDeferral({ error: catalogDeferral.error })}
24221
+ `);
24222
+ const renameHint2 = possibleRenameHint({ preview, wire });
24223
+ if (renameHint2 !== null)
24224
+ write(`${renameHint2}
24225
+
24226
+ `);
24227
+ const catalogDeferred = catalogDeferral !== undefined;
24228
+ if (dryRun || previewIsEmpty({ preview }))
24229
+ return { configPath, preview, migrationIds: [], catalogDeferred };
24230
+ const settingsStep = () => applySettings({
24231
+ client,
24232
+ settingsBody,
24233
+ settings,
24234
+ catalogPreview,
24235
+ wire,
24236
+ write,
24237
+ migrationLinkBase,
24238
+ catalogDeferred
24239
+ });
24240
+ const catalogStep = (previewAfterSettings) => applyCatalog({
24241
+ client,
24242
+ preview: previewAfterSettings,
24243
+ wire,
24244
+ configPath,
24245
+ write,
24246
+ migrationLinkBase
24247
+ });
24248
+ const settled = catalogDeferred ? await settingsStep() : undefined;
24249
+ const applied = await settleLanes({
24250
+ catalog: settled === undefined ? settingsStep().then(catalogStep) : catalogStep(settled),
24251
+ webhooks: applyWebhooks({
24252
+ client,
24253
+ lane: webhooks,
24254
+ envDirs: project.envDirs,
24255
+ cwd,
24256
+ write
24257
+ })
24258
+ });
24259
+ if (applied.failures.length > 0)
24260
+ throw new PushLanesError({ stage: "apply", failures: applied.failures });
24261
+ return {
24262
+ configPath,
24263
+ preview,
24264
+ applied: applied.values.catalog?.applied,
24265
+ migrationIds: applied.values.catalog?.migrationIds ?? [],
24266
+ catalogDeferred
24267
+ };
23123
24268
  };
23124
24269
 
23125
24270
  // src/actions/pull.ts
@@ -23235,14 +24380,15 @@ var runPull = async ({
23235
24380
  imports,
23236
24381
  overwrite = false,
23237
24382
  yes = false,
23238
- prompter = createPrompter({ interactive: false, write })
24383
+ prompter = createPrompter({ interactive: false, write }),
24384
+ webhookEnv
23239
24385
  }) => {
23240
24386
  const project = resolveProject({ cwd, configFlag });
23241
24387
  if (overwrite && !yes) {
23242
24388
  write(`This rewrites autumn.config.ts and the features.ts, plans.ts and rewards.ts beside it from your org's catalog. Other files are left alone. Re-run with --yes to overwrite.
23243
24389
  `);
23244
24390
  return {
23245
- configPath: project.configPath ?? join13(project.configDir, "autumn.config.ts"),
24391
+ configPath: project.configPath ?? join14(project.configDir, "autumn.config.ts"),
23246
24392
  appended: [],
23247
24393
  replaced: [],
23248
24394
  deleted: []
@@ -23255,7 +24401,7 @@ var runPull = async ({
23255
24401
  if (project.configPath === null) {
23256
24402
  const chosen = await chooseConfigDir({ cwd, prompter });
23257
24403
  scaffoldDir = chosen.configDir;
23258
- scaffoldPath = join13(scaffoldDir, "autumn.config.ts");
24404
+ scaffoldPath = join14(scaffoldDir, "autumn.config.ts");
23259
24405
  if (scaffoldDir !== cwd && writeRootMarker({ repoRoot: chosen.repoRoot, configPath: scaffoldPath }))
23260
24406
  prompter.write(`${done("Recorded in package.json so atmn finds it from anywhere")}
23261
24407
  `);
@@ -23269,18 +24415,19 @@ var runPull = async ({
23269
24415
  overwrite,
23270
24416
  write
23271
24417
  });
23272
- const { catalog: wire, singletons } = splitWire(document);
23273
- const [preview, catalog, settingsPreview] = await Promise.all([
24418
+ const { catalog: wire, singletons, lists } = splitWire(document);
24419
+ const [preview, catalog, settingsPreview, webhooks] = await Promise.all([
23274
24420
  diffOrExplain({ client, wire }),
23275
24421
  client.get({ include_versions: true }),
23276
- client.previewUpdateOrganization(singletons.settings ?? { config: {} })
24422
+ client.previewUpdateOrganization(singletons.settings ?? { config: {} }),
24423
+ webhookEnv === undefined ? undefined : Promise.all([webhookEnv(), client.listWebhooks({})])
23277
24424
  ]);
23278
24425
  const files = new Map;
23279
- files.set(configPath, readFileSync13(configPath, "utf8"));
23280
- for (const file of listSourceFiles({ directory: dirname11(configPath) })) {
24426
+ files.set(configPath, readFileSync14(configPath, "utf8"));
24427
+ for (const file of listSourceFiles({ directory: dirname12(configPath) })) {
23281
24428
  if (file === configPath || files.has(file))
23282
24429
  continue;
23283
- files.set(file, readFileSync13(file, "utf8"));
24430
+ files.set(file, readFileSync14(file, "utf8"));
23284
24431
  }
23285
24432
  const originals = new Map(files);
23286
24433
  const appended = [];
@@ -23344,6 +24491,22 @@ var runPull = async ({
23344
24491
  action: `set by hand: \`${singleton}\` is not an object literal`
23345
24492
  })));
23346
24493
  }
24494
+ const webhookWarnings = [];
24495
+ if (webhooks !== undefined) {
24496
+ const [env, { list: list3 }] = webhooks;
24497
+ const applied = applyWebhooksPull({
24498
+ pull: { configPath, files },
24499
+ remote: list3,
24500
+ stated: lists.webhooks,
24501
+ envKey: env.key
24502
+ });
24503
+ lines.push(...applied.lines);
24504
+ webhookWarnings.push(...applied.warnings);
24505
+ unlocated.push(...applied.unlocated.map((entry) => ({
24506
+ collection: "webhooks",
24507
+ ...entry
24508
+ })));
24509
+ }
23347
24510
  if (includeMappings) {
23348
24511
  const managedCatalog = Object.fromEntries(Object.entries(COLLECTIONS).filter(([, spec]) => spec.wireKey !== undefined && wire[spec.wireKey] !== undefined).map(([collection]) => [collection, catalogRows[collection]]));
23349
24512
  const mapped = applyMappings({
@@ -23364,11 +24527,11 @@ var runPull = async ({
23364
24527
  for (const [file, source] of files) {
23365
24528
  if (source === originals.get(file))
23366
24529
  continue;
23367
- mkdirSync4(dirname11(file), { recursive: true });
23368
- writeFileSync9(file, source, "utf8");
24530
+ mkdirSync4(dirname12(file), { recursive: true });
24531
+ writeFileSync10(file, source, "utf8");
23369
24532
  if (!originals.has(file)) {
23370
- const keep = join13(dirname11(file), ".gitkeep");
23371
- if (existsSync12(keep))
24533
+ const keep = join14(dirname12(file), ".gitkeep");
24534
+ if (existsSync13(keep))
23372
24535
  unlinkSync(keep);
23373
24536
  }
23374
24537
  }
@@ -23380,6 +24543,12 @@ var runPull = async ({
23380
24543
  lines.push(`↳ wrote internalId into ${backfilled.length} fixture${backfilled.length === 1 ? "" : "s"}`);
23381
24544
  if (slugged.length > 0)
23382
24545
  lines.push(`↳ wrote versionSlug into ${slugged.length} fixture${slugged.length === 1 ? "" : "s"}`);
24546
+ if (webhookWarnings.length > 0)
24547
+ write(`${webhookWarnings.join(`
24548
+
24549
+ `)}
24550
+
24551
+ `);
23383
24552
  write(lines.length === 0 ? `Nothing to pull.
23384
24553
  ` : `${lines.join(`
23385
24554
  `)}
@@ -23511,8 +24680,8 @@ var runSandboxDelete = async ({
23511
24680
  write = (text) => process.stdout.write(text),
23512
24681
  writeError = (text) => process.stderr.write(text)
23513
24682
  }) => {
23514
- const { list: list2 } = await client.listSandboxes({});
23515
- const sandbox = list2.find((entry) => entry.id === id);
24683
+ const { list: list3 } = await client.listSandboxes({});
24684
+ const sandbox = list3.find((entry) => entry.id === id);
23516
24685
  if (sandbox === undefined) {
23517
24686
  throw new Error(`No sandbox with id ${id}. Run atmn sandbox list.`);
23518
24687
  }
@@ -23539,7 +24708,7 @@ var runSandboxDelete = async ({
23539
24708
  };
23540
24709
 
23541
24710
  // src/render/renderSandboxes.ts
23542
- import chalk5 from "chalk";
24711
+ import chalk6 from "chalk";
23543
24712
  var MINUTE = 60000;
23544
24713
  var HOUR = 60 * MINUTE;
23545
24714
  var DAY = 24 * HOUR;
@@ -23578,7 +24747,7 @@ var renderSandboxes = ({
23578
24747
  now = Date.now()
23579
24748
  }) => {
23580
24749
  if (sandboxes.length === 0)
23581
- return chalk5.dim(NO_SANDBOXES);
24750
+ return chalk6.dim(NO_SANDBOXES);
23582
24751
  const rows = sandboxes.map((sandbox) => [
23583
24752
  sandbox.id,
23584
24753
  stripTerminalControls(sandbox.name),
@@ -23586,11 +24755,11 @@ var renderSandboxes = ({
23586
24755
  ]);
23587
24756
  const widths = columnWidths({ rows });
23588
24757
  return [
23589
- chalk5.dim(tableLine({ cells: HEADERS, widths, marker: "" })),
24758
+ chalk6.dim(tableLine({ cells: HEADERS, widths, marker: "" })),
23590
24759
  ...rows.map((cells, index) => tableLine({
23591
24760
  cells,
23592
24761
  widths,
23593
- marker: sandboxes[index]?.id === currentSandboxId ? chalk5.dim(`${GAP2}${CURRENT_MARKER}`) : ""
24762
+ marker: sandboxes[index]?.id === currentSandboxId ? chalk6.dim(`${GAP2}${CURRENT_MARKER}`) : ""
23594
24763
  }))
23595
24764
  ].join(`
23596
24765
  `);
@@ -23615,7 +24784,7 @@ var runSandboxList = async ({
23615
24784
  };
23616
24785
 
23617
24786
  // src/prompt/select.ts
23618
- import chalk6 from "chalk";
24787
+ import chalk7 from "chalk";
23619
24788
  var PAGE_SIZE = 10;
23620
24789
  var CURRENT_MARKER2 = "← current";
23621
24790
  var renderChoices = ({
@@ -23628,14 +24797,14 @@ var renderChoices = ({
23628
24797
  const start = page * PAGE_SIZE;
23629
24798
  const rows = visible.slice(start, start + PAGE_SIZE).map((choice, index) => {
23630
24799
  const selected = start + index === cursor;
23631
- const pointer = selected ? chalk6.cyan("❯") : " ";
23632
- const label = selected ? chalk6.bold(choice.label) : choice.label;
23633
- const detail = choice.detail === undefined ? "" : ` ${chalk6.dim(`(${choice.detail})`)}`;
23634
- const current = choice.current ? ` ${chalk6.dim(CURRENT_MARKER2)}` : "";
24800
+ const pointer = selected ? chalk7.cyan("❯") : " ";
24801
+ const label = selected ? chalk7.bold(choice.label) : choice.label;
24802
+ const detail = choice.detail === undefined ? "" : ` ${chalk7.dim(`(${choice.detail})`)}`;
24803
+ const current = choice.current ? ` ${chalk7.dim(CURRENT_MARKER2)}` : "";
23635
24804
  return `${pointer} ${label}${detail}${current}`;
23636
24805
  });
23637
- const footer = visible.length > PAGE_SIZE ? chalk6.dim(` ${start + 1}-${Math.min(start + PAGE_SIZE, visible.length)} of ${visible.length}`) : "";
23638
- const search = ` ${chalk6.dim("type to filter:")} ${filter}`;
24806
+ const footer = visible.length > PAGE_SIZE ? chalk7.dim(` ${start + 1}-${Math.min(start + PAGE_SIZE, visible.length)} of ${visible.length}`) : "";
24807
+ const search = ` ${chalk7.dim("type to filter:")} ${filter}`;
23639
24808
  return [...rows, ...footer ? [footer] : [], search].join(`
23640
24809
  `);
23641
24810
  };
@@ -23771,9 +24940,9 @@ var runSandboxUse = async ({
23771
24940
  }
23772
24941
  if (client === undefined || org === undefined)
23773
24942
  throw new Error("sandbox use needs the main key to list sandboxes.");
23774
- const { list: list2 } = await client.listSandboxes({});
24943
+ const { list: list3 } = await client.listSandboxes({});
23775
24944
  const currentId = process.env[SANDBOX_PIN_NAME];
23776
- const choices = choicesOf({ sandboxes: list2, currentId });
24945
+ const choices = choicesOf({ sandboxes: list3, currentId });
23777
24946
  let picked;
23778
24947
  if (query !== undefined && query !== "") {
23779
24948
  picked = matchChoice({ choices, query });
@@ -23781,7 +24950,7 @@ var runSandboxUse = async ({
23781
24950
  throw new Error(`No sandbox named or with id ${JSON.stringify(query)}. Run atmn sandbox list.`);
23782
24951
  } else {
23783
24952
  if (!prompter.interactive)
23784
- prompter.write(`${renderSandboxes({ sandboxes: list2, currentSandboxId: currentId })}
24953
+ prompter.write(`${renderSandboxes({ sandboxes: list3, currentSandboxId: currentId })}
23785
24954
  `);
23786
24955
  picked = await select({
23787
24956
  prompter,
@@ -23792,7 +24961,7 @@ var runSandboxUse = async ({
23792
24961
  if (picked === null)
23793
24962
  return null;
23794
24963
  }
23795
- const sandbox = list2.find((row) => row.id === picked.value);
24964
+ const sandbox = list3.find((row) => row.id === picked.value);
23796
24965
  if (sandbox === undefined)
23797
24966
  throw new Error("Sandbox vanished from the list.");
23798
24967
  const keyName = sandboxKeyName({ sandboxId: sandbox.id });
@@ -23829,6 +24998,47 @@ var runSandboxUse = async ({
23829
24998
  return result;
23830
24999
  };
23831
25000
 
25001
+ // src/generated/sandboxName.ts
25002
+ var RESERVED_SANDBOX_SLUGS = new Set([
25003
+ "products",
25004
+ "customers",
25005
+ "features",
25006
+ "migrations",
25007
+ "dev",
25008
+ "analytics",
25009
+ "settings",
25010
+ "admin",
25011
+ "chat",
25012
+ "quickstart",
25013
+ "onboarding",
25014
+ "impersonate-redirect",
25015
+ "trmnl"
25016
+ ]);
25017
+ var ENV_SANDBOX_SLUGS = new Set(["live", "sandbox"]);
25018
+ var sandboxSlug = (name) => name.toLowerCase().replace(/ /g, "-").replace(/[^\w\s-]/g, "");
25019
+
25020
+ // src/actions/webhooks/resolveWebhookEnv.ts
25021
+ var memoized = (fetchOrgInfo2) => {
25022
+ let pending;
25023
+ return () => {
25024
+ pending ??= fetchOrgInfo2();
25025
+ return pending;
25026
+ };
25027
+ };
25028
+ var resolveWebhookEnv = async ({
25029
+ target,
25030
+ prod,
25031
+ fetchOrgInfo: fetchOrgInfo2
25032
+ }) => {
25033
+ const orgInfo = memoized(fetchOrgInfo2);
25034
+ const orgId = async () => (await orgInfo()).id;
25035
+ if (prod)
25036
+ return { key: "live", live: true, orgId };
25037
+ if (target.sandboxId === undefined)
25038
+ return { key: "sandbox", live: false, orgId };
25039
+ return { key: sandboxSlug((await orgInfo()).name), live: false, orgId };
25040
+ };
25041
+
23832
25042
  // src/cli.ts
23833
25043
  var normalizeVersionFlag = ({ argv }) => argv.map((token) => token === "-v" ? "--version" : token);
23834
25044
  var withTargetFlags = (program) => program.option("-p, --prod", "target production instead of sandbox").option("--sandbox <sandboxId>", "target a specific sandbox").option("-l, --local", "target a local server (default port 8080)").option("--port <port>", "port of a local server (implies --local)").option("-b, --base-url <url>", "send to this URL instead").option("--client-id <id>", "OAuth client id the CLI identifies as").option("-c, --config <path>", "autumn.config.ts, or the folder holding it (default: found from cwd or the root package.json)").option("--headless", "never prompt: print what a command needs and stop (default when not a TTY)");
@@ -23855,11 +25065,11 @@ ${hint(flagHint)}
23855
25065
  `);
23856
25066
  throw new NeedsInputError(flagHint);
23857
25067
  }
23858
- return join14(project.configDir, SKILLS_DIR_NAME);
25068
+ return join15(project.configDir, SKILLS_DIR_NAME);
23859
25069
  };
23860
25070
  var writeStaleSkillsHint = ({ command }) => {
23861
25071
  const stale = staleSkillsHint({
23862
- dir: join14(projectOf({ command }).configDir, SKILLS_DIR_NAME)
25072
+ dir: join15(projectOf({ command }).configDir, SKILLS_DIR_NAME)
23863
25073
  });
23864
25074
  if (stale !== null)
23865
25075
  process.stdout.write(`${stale}
@@ -23913,13 +25123,21 @@ var pinnedSandboxName = async ({
23913
25123
  if (target.sandboxId === undefined)
23914
25124
  return {};
23915
25125
  try {
23916
- const { list: list2 } = await sandboxClientFor({ target }).listSandboxes({});
23917
- const name = list2.find((row) => row.id === target.sandboxId)?.name;
25126
+ const { list: list3 } = await sandboxClientFor({ target }).listSandboxes({});
25127
+ const name = list3.find((row) => row.id === target.sandboxId)?.name;
23918
25128
  return name === undefined ? {} : { sandboxName: name };
23919
25129
  } catch {
23920
25130
  return {};
23921
25131
  }
23922
25132
  };
25133
+ var webhookEnvFor = ({ target, command }) => () => resolveWebhookEnv({
25134
+ target,
25135
+ prod: command.optsWithGlobals().prod === true,
25136
+ fetchOrgInfo: () => fetchOrgInfo({
25137
+ baseUrl: targetBaseUrl({ target }),
25138
+ secretKey: requireSecretKey({ target })
25139
+ })
25140
+ });
23923
25141
  var mainOrgInfo = ({ target }) => {
23924
25142
  const main = managementTarget({ target });
23925
25143
  return fetchOrgInfo({
@@ -24017,8 +25235,10 @@ Linking a keyless org to an account:
24017
25235
  const result = await runPush({
24018
25236
  client: clientFor({ target }),
24019
25237
  configPath: configFlagOf({ command }),
24020
- dryRun: !apply
25238
+ dryRun: !apply,
25239
+ webhookEnv: webhookEnvFor({ target, command })
24021
25240
  });
25241
+ process.exitCode = pushExitCode({ apply, result });
24022
25242
  if (!apply && !previewIsEmpty({ preview: result.preview }))
24023
25243
  process.stdout.write(options.dryRun === true ? `
24024
25244
  Dry run — nothing applied.
@@ -24065,7 +25285,8 @@ Nothing applied. Re-run with --yes to apply these changes.
24065
25285
  includeMappings: options.includeMappings === true,
24066
25286
  overwrite: options.overwrite === true,
24067
25287
  yes: options.yes === true,
24068
- prompter: prompterFor({ command })
25288
+ prompter: prompterFor({ command }),
25289
+ webhookEnv: webhookEnvFor({ target, command })
24069
25290
  });
24070
25291
  writeStaleSkillsHint({ command });
24071
25292
  });