atmn 2.0.33 → 2.0.34

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 +1408 -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 +100 -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.34";
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.34";
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.34",
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.34
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.34",
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.34
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.34",
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.34
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.34",
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.34
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,492 @@ 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 merge = (target, source) => {
22781
+ target.lines.push(...source.lines);
22782
+ target.warnings.push(...source.warnings);
22783
+ target.unlocated.push(...source.unlocated);
22784
+ };
22785
+ var applyWebhooksPull = ({
22786
+ pull,
22787
+ remote,
22788
+ stated: stated2,
22789
+ envKey,
22790
+ newId = newWebhookId
22791
+ }) => {
22792
+ const result = { lines: [], warnings: [], unlocated: [] };
22793
+ const statedById = new Map((stated2 ?? []).map((row) => [row.id, row]));
22794
+ const fromDashboard = (webhook) => !statedById.has(webhook.id) && isDashboardWebhook(webhook);
22795
+ const present = new Set;
22796
+ for (const webhook of remote) {
22797
+ if (fromDashboard(webhook)) {
22798
+ const represented = (stated2 ?? []).find((row2) => row2.url?.[envKey] === webhook.url);
22799
+ if (represented !== undefined) {
22800
+ present.add(represented.id);
22801
+ merge(result, updateWebhook({
22802
+ pull,
22803
+ webhook: { ...webhook, id: represented.id },
22804
+ stated: represented,
22805
+ envKey
22806
+ }));
22807
+ continue;
22808
+ }
22809
+ if (webhook.events.length === 0) {
22810
+ 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`);
22811
+ continue;
22812
+ }
22813
+ const id = newId();
22814
+ const failure2 = appendWebhook({
22815
+ pull,
22816
+ webhook: { ...webhook, id },
22817
+ envKey
22818
+ });
22819
+ if (failure2 === null)
22820
+ result.lines.push(`+ webhook ${id} (made in the dashboard; push adopts it by URL)`);
22821
+ else
22822
+ result.unlocated.push({ id, action: failure2 });
22823
+ continue;
22824
+ }
22825
+ present.add(webhook.id);
22826
+ const row = statedById.get(webhook.id);
22827
+ if (row !== undefined) {
22828
+ merge(result, updateWebhook({ pull, webhook, stated: row, envKey }));
22829
+ continue;
22830
+ }
22831
+ const failure = appendWebhook({ pull, webhook, envKey });
22832
+ if (failure === null)
22833
+ result.lines.push(`+ webhook ${webhook.id}`);
22834
+ else
22835
+ result.unlocated.push({ id: webhook.id, action: failure });
22836
+ }
22837
+ for (const row of stated2 ?? []) {
22838
+ if (present.has(row.id) || row.url?.[envKey] === undefined)
22839
+ continue;
22840
+ merge(result, removeWebhookEnv({ pull, stated: row, envKey }));
22841
+ }
22842
+ return result;
22843
+ };
22844
+
22845
+ // src/render/renderPreview.ts
22846
+ import chalk5 from "chalk";
22847
+
22848
+ // src/generated/labels.ts
22849
+ var PREVIOUS_ATTRIBUTE_LABELS = {
22850
+ name: "Name",
22851
+ description: "Description",
22852
+ group: "Group",
22853
+ add_on: "Add-on",
22854
+ auto_enable: "Default plan",
22855
+ free_trial: "Free trial",
22856
+ config: "Config",
22857
+ active: "Active version",
22858
+ billing_controls: "Billing controls",
22859
+ processors: "Processor mappings",
22860
+ base_variant_id: "Base plan",
22861
+ base_version: "Base version",
22862
+ base_version_slug: "Base version slug",
22863
+ cancel_on_past_due: "Cancel on past due",
22864
+ reverse_deduction_order: "Reverse deduction order",
22865
+ block_overdue_entitlements: "Block access while overdue",
22866
+ invoice_memos: "Invoice memos",
22867
+ disable_overage_billing: "Disable overage billing",
22868
+ persist_free_overage: "Pay down overages",
22043
22869
  automatic_tax: "Automatic tax",
22044
22870
  multi_currency: "Multi-currency",
22045
22871
  id: "ID"
22046
22872
  };
22047
22873
 
22874
+ // src/render/renderWebhooks.ts
22875
+ import chalk4 from "chalk";
22876
+ var webhooksHaveWork = ({
22877
+ webhooks
22878
+ }) => (webhooks?.changes ?? []).some((change) => change.action !== "unmanaged");
22879
+ var DETAIL_INDENT = " ";
22880
+ var list2 = (values) => values.length === 0 ? "(none)" : values.join(", ");
22881
+ var updateDetails = ({
22882
+ id,
22883
+ before,
22884
+ after
22885
+ }) => {
22886
+ const lines = [];
22887
+ if (before.url !== after.url)
22888
+ lines.push(`${id} url: ${before.url} → ${after.url}`);
22889
+ const events = (state) => [...state.events].sort();
22890
+ if (events(before).join() !== events(after).join())
22891
+ lines.push(`events: ${list2(events(before))} → ${list2(events(after))}`);
22892
+ if ((before.description ?? "") !== (after.description ?? ""))
22893
+ lines.push(`description: ${JSON.stringify(before.description ?? "")} → ${JSON.stringify(after.description ?? "")}`);
22894
+ if (before.disabled !== after.disabled)
22895
+ lines.push(`disabled: ${before.disabled} → ${after.disabled}`);
22896
+ return lines.map((line) => `${DETAIL_INDENT}${chalk4.yellow(line)}`);
22897
+ };
22898
+ var renderChange = ({ change }) => {
22899
+ if (change.action === "create")
22900
+ return [
22901
+ ` ${chalk4.green(`+ ${change.id}`)}${chalk4.dim(` ${change.webhook.url}`)}`,
22902
+ `${DETAIL_INDENT}${chalk4.dim(`events: ${list2(change.webhook.events)}`)}`
22903
+ ];
22904
+ if (change.action === "adopt")
22905
+ return [
22906
+ ` ${chalk4.yellow(`~ ${change.id}`)} ${chalk4.bold("adopt")} ${chalk4.dim("existing dashboard webhook · signing secret unchanged")}`,
22907
+ ...updateDetails({
22908
+ id: change.id,
22909
+ before: change.before,
22910
+ after: change.after
22911
+ })
22912
+ ];
22913
+ if (change.action === "update")
22914
+ return [
22915
+ ` ${chalk4.yellow(`~ ${change.id}`)}`,
22916
+ ...updateDetails({
22917
+ id: change.id,
22918
+ before: change.before,
22919
+ after: change.after
22920
+ })
22921
+ ];
22922
+ return [
22923
+ chalk4.dim(` · ${change.id} unmanaged (not in your config; atmn leaves it alone)`)
22924
+ ];
22925
+ };
22926
+ var renderWebhooks = ({
22927
+ webhooks
22928
+ }) => {
22929
+ const rows = webhooks.changes.flatMap((change) => renderChange({ change }));
22930
+ if (rows.length === 0)
22931
+ return null;
22932
+ const count = webhooks.changes.filter((change) => change.action !== "unmanaged").length;
22933
+ return [chalk4.bold(`Webhooks (${count})`), ...rows].join(`
22934
+ `);
22935
+ };
22936
+
22048
22937
  // src/render/renderPreview.ts
22049
22938
  var MARKERS = {
22050
- create: { symbol: "+", paint: chalk4.green },
22051
- update: { symbol: "~", paint: chalk4.yellow },
22052
- delete: { symbol: "-", paint: chalk4.red }
22939
+ create: { symbol: "+", paint: chalk5.green },
22940
+ update: { symbol: "~", paint: chalk5.yellow },
22941
+ delete: { symbol: "-", paint: chalk5.red }
22053
22942
  };
22054
22943
  var APPLIED_ACTIONS = new Set(["create", "update", "delete"]);
22055
22944
  var NESTED_ACTIONS = {
@@ -22060,7 +22949,7 @@ var NESTED_ACTIONS = {
22060
22949
  };
22061
22950
  var marker = (action) => MARKERS[NESTED_ACTIONS[action ?? ""] ?? action ?? ""] ?? {
22062
22951
  symbol: "?",
22063
- paint: chalk4.dim
22952
+ paint: chalk5.dim
22064
22953
  };
22065
22954
  var line = ({
22066
22955
  action,
@@ -22069,7 +22958,7 @@ var line = ({
22069
22958
  indent = " "
22070
22959
  }) => {
22071
22960
  const { symbol, paint } = marker(action);
22072
- const suffix = label && label !== id ? chalk4.dim(` ${label}`) : "";
22961
+ const suffix = label && label !== id ? chalk5.dim(` ${label}`) : "";
22073
22962
  return `${indent}${paint(`${symbol} ${id}`)}${suffix}`;
22074
22963
  };
22075
22964
  var formatValue = (value) => {
@@ -22214,7 +23103,7 @@ var renderLicenseChanges = ({
22214
23103
  }) => licenseChanges.flatMap((change) => {
22215
23104
  const id = change.version === undefined ? change.licensePlanId ?? "?" : `${change.licensePlanId}@v${change.version}`;
22216
23105
  return [
22217
- `${line({ action: change.action, id, indent })}${chalk4.dim(" (license)")}`,
23106
+ `${line({ action: change.action, id, indent })}${chalk5.dim(" (license)")}`,
22218
23107
  ...renderPreviousAttributes({
22219
23108
  attributes: change.previousAttributes,
22220
23109
  indent: `${indent} `,
@@ -22288,16 +23177,16 @@ var nestedRowHasWork = (entry) => {
22288
23177
  return false;
22289
23178
  };
22290
23179
  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;
23180
+ var DETAIL_INDENT2 = " ";
23181
+ var VARIANT_INDENT = DETAIL_INDENT2;
22293
23182
  var planRowId = (row) => row.version === undefined ? row.planId ?? "?" : `${row.planId}@v${row.version}`;
22294
23183
  var contextLine = ({
22295
23184
  id,
22296
23185
  label,
22297
23186
  indent = " "
22298
23187
  }) => {
22299
- const suffix = label && label !== id ? chalk4.dim(` ${label}`) : "";
22300
- return `${indent} ${chalk4.dim(id)}${suffix}`;
23188
+ const suffix = label && label !== id ? chalk5.dim(` ${label}`) : "";
23189
+ return `${indent} ${chalk5.dim(id)}${suffix}`;
22301
23190
  };
22302
23191
  var isVariantCreate = (variant) => variant.internalId === null || variant.internalId === undefined;
22303
23192
  var variantCreateLabel = (planChange) => {
@@ -22316,7 +23205,7 @@ var renderVariantRow = ({
22316
23205
  const nested = (variant.siblingVersions ?? []).filter(nestedRowHasWork).flatMap((sibling) => renderVariantRow({ variant: sibling, baseId, indent: detailIndent }));
22317
23206
  if (variant.variantAction === "propagated") {
22318
23207
  return [
22319
- `${line({ action: "update", id, indent })}${chalk4.dim(` follows ${baseId}`)}`,
23208
+ `${line({ action: "update", id, indent })}${chalk5.dim(` follows ${baseId}`)}`,
22320
23209
  ...nested
22321
23210
  ];
22322
23211
  }
@@ -22368,11 +23257,11 @@ var renderPlanRow = ({ plan }) => {
22368
23257
  const fresh = isFreshRow(plan);
22369
23258
  return [
22370
23259
  isChange(plan) ? line({ action: fresh ? "create" : plan.action, id, label: plan.name }) : contextLine({ id, label: plan.name }),
22371
- ...renderIdentityChanges({ row: plan, indent: DETAIL_INDENT }),
23260
+ ...renderIdentityChanges({ row: plan, indent: DETAIL_INDENT2 }),
22372
23261
  ...plan.planChange ? renderPlanChangeDetail({
22373
23262
  planChange: plan.planChange,
22374
23263
  current: currentAttributes(plan),
22375
- indent: DETAIL_INDENT,
23264
+ indent: DETAIL_INDENT2,
22376
23265
  fresh
22377
23266
  }) : [],
22378
23267
  ...renderVariantLanes({ plan })
@@ -22418,7 +23307,7 @@ var renderPlannedMigrations = ({
22418
23307
  migrations,
22419
23308
  plans
22420
23309
  }) => [
22421
- chalk4.bold(`Migrations (${migrations.length})`),
23310
+ chalk5.bold(`Migrations (${migrations.length})`),
22422
23311
  ...migrations.flatMap((migration) => (migration.plans ?? []).flatMap((target) => (target.versions ?? []).flatMap((version2) => {
22423
23312
  const row = planRowForTarget({
22424
23313
  plans,
@@ -22427,10 +23316,10 @@ var renderPlannedMigrations = ({
22427
23316
  });
22428
23317
  const custom = migration.includeCustom ? ", customized plans too" : "";
22429
23318
  return [
22430
- ` ${chalk4.cyan(`${target.planId} v${version2}`)}${customerCount({ row })}${custom}`,
23319
+ ` ${chalk5.cyan(`${target.planId} v${version2}`)}${customerCount({ row })}${custom}`,
22431
23320
  ...row?.planChange ? renderPlanChangeDetail({
22432
23321
  planChange: row.planChange,
22433
- indent: DETAIL_INDENT
23322
+ indent: DETAIL_INDENT2
22434
23323
  }) : []
22435
23324
  ];
22436
23325
  })))
@@ -22440,8 +23329,8 @@ var renderMigrationLinks = ({
22440
23329
  migrations,
22441
23330
  migrationLinkBase
22442
23331
  }) => [
22443
- chalk4.bold(`Draft migrations (${migrations.length})`),
22444
- ...migrations.map((migration) => migrationLinkBase && migration.id ? ` ${chalk4.cyan(`${migrationLinkBase}/migrations/${migration.id}`)}` : ` ${chalk4.cyan(migration.id ?? "?")}`)
23332
+ chalk5.bold(`Draft migrations (${migrations.length})`),
23333
+ ...migrations.map((migration) => migrationLinkBase && migration.id ? ` ${chalk5.cyan(`${migrationLinkBase}/migrations/${migration.id}`)}` : ` ${chalk5.cyan(migration.id ?? "?")}`)
22445
23334
  ].join(`
22446
23335
  `);
22447
23336
  var UNMANAGED_NOTE = "unmanaged (set false explicitly to disable; atmn won't override)";
@@ -22449,10 +23338,10 @@ var renderSettingChange = ({ change }) => {
22449
23338
  const label = labelFor(change.key ?? "?");
22450
23339
  if (change.action === "unmanaged") {
22451
23340
  const { symbol: symbol2, paint: paint2 } = marker("update");
22452
- return `${DETAIL_INDENT}${paint2(`${symbol2} ${label}: ${formatValue(change.previous)} -> ${UNMANAGED_NOTE}`)}`;
23341
+ return `${DETAIL_INDENT2}${paint2(`${symbol2} ${label}: ${formatValue(change.previous)} -> ${UNMANAGED_NOTE}`)}`;
22453
23342
  }
22454
23343
  const { symbol, paint } = marker("update");
22455
- return `${DETAIL_INDENT}${paint(`${symbol} ${label}: ${formatValue(change.previous)} -> ${formatValue(change.current)}`)}`;
23344
+ return `${DETAIL_INDENT2}${paint(`${symbol} ${label}: ${formatValue(change.previous)} -> ${formatValue(change.current)}`)}`;
22456
23345
  };
22457
23346
  var settingChanges = (settings) => settings?.config?.changes ?? [];
22458
23347
  var settingsHaveWork = ({
@@ -22468,20 +23357,21 @@ var renderPreview = ({
22468
23357
  const referralPrograms = (preview.referralPrograms ?? []).filter(rowHasWork);
22469
23358
  const migrations = preview.migrations ?? [];
22470
23359
  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.");
23360
+ const webhooks = preview.webhooks === undefined ? null : renderWebhooks({ webhooks: preview.webhooks });
23361
+ if (features.length === 0 && plans.length === 0 && rewards.length === 0 && referralPrograms.length === 0 && settings.length === 0 && webhooks === null) {
23362
+ return chalk5.dim("No changes. Your catalog matches your config.");
22473
23363
  }
22474
23364
  const sections = [];
22475
23365
  if (settings.length > 0) {
22476
23366
  sections.push([
22477
- chalk4.bold(`Settings (${settings.length})`),
23367
+ chalk5.bold(`Settings (${settings.length})`),
22478
23368
  ...settings.map((change) => renderSettingChange({ change }))
22479
23369
  ].join(`
22480
23370
  `));
22481
23371
  }
22482
23372
  if (features.length > 0) {
22483
23373
  sections.push([
22484
- chalk4.bold(`Features (${features.length})`),
23374
+ chalk5.bold(`Features (${features.length})`),
22485
23375
  ...features.flatMap((feature) => [
22486
23376
  line({
22487
23377
  action: feature.action,
@@ -22490,7 +23380,7 @@ var renderPreview = ({
22490
23380
  }),
22491
23381
  ...renderPreviousAttributes({
22492
23382
  attributes: feature.previousAttributes,
22493
- indent: DETAIL_INDENT
23383
+ indent: DETAIL_INDENT2
22494
23384
  })
22495
23385
  ])
22496
23386
  ].join(`
@@ -22498,14 +23388,14 @@ var renderPreview = ({
22498
23388
  }
22499
23389
  if (plans.length > 0) {
22500
23390
  sections.push([
22501
- chalk4.bold(`Plans (${plans.length})`),
23391
+ chalk5.bold(`Plans (${plans.length})`),
22502
23392
  ...plans.flatMap((plan) => renderPlanRow({ plan }))
22503
23393
  ].join(`
22504
23394
  `));
22505
23395
  }
22506
23396
  if (rewards.length > 0) {
22507
23397
  sections.push([
22508
- chalk4.bold(`Rewards (${rewards.length})`),
23398
+ chalk5.bold(`Rewards (${rewards.length})`),
22509
23399
  ...rewards.flatMap((reward) => [
22510
23400
  line({
22511
23401
  action: reward.action,
@@ -22514,7 +23404,7 @@ var renderPreview = ({
22514
23404
  }),
22515
23405
  ...renderPreviousAttributes({
22516
23406
  attributes: reward.previousAttributes,
22517
- indent: DETAIL_INDENT
23407
+ indent: DETAIL_INDENT2
22518
23408
  })
22519
23409
  ])
22520
23410
  ].join(`
@@ -22522,7 +23412,7 @@ var renderPreview = ({
22522
23412
  }
22523
23413
  if (referralPrograms.length > 0) {
22524
23414
  sections.push([
22525
- chalk4.bold(`Referral programs (${referralPrograms.length})`),
23415
+ chalk5.bold(`Referral programs (${referralPrograms.length})`),
22526
23416
  ...referralPrograms.flatMap((program) => [
22527
23417
  line({
22528
23418
  action: program.action,
@@ -22531,12 +23421,14 @@ var renderPreview = ({
22531
23421
  }),
22532
23422
  ...renderPreviousAttributes({
22533
23423
  attributes: program.previousAttributes,
22534
- indent: DETAIL_INDENT
23424
+ indent: DETAIL_INDENT2
22535
23425
  })
22536
23426
  ])
22537
23427
  ].join(`
22538
23428
  `));
22539
23429
  }
23430
+ if (webhooks !== null)
23431
+ sections.push(webhooks);
22540
23432
  if (migrations.length > 0) {
22541
23433
  sections.push(renderPlannedMigrations({ migrations, plans }));
22542
23434
  }
@@ -22546,7 +23438,7 @@ var renderPreview = ({
22546
23438
  };
22547
23439
  var previewIsEmpty = ({
22548
23440
  preview
22549
- }) => !(preview.features ?? []).some(rowHasWork) && !(preview.plans ?? []).some(rowHasWork) && !(preview.rewards ?? []).some(rowHasWork) && !(preview.referralPrograms ?? []).some(rowHasWork) && !settingsHaveWork({ settings: preview.settings });
23441
+ }) => !(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
23442
 
22551
23443
  // src/actions/push/backfillInternalIds.ts
22552
23444
  import { readFileSync as readFileSync12, writeFileSync as writeFileSync8 } from "node:fs";
@@ -22955,6 +23847,42 @@ var renderDeprecatedUses = ({
22955
23847
  }) => uses.map((use) => `note: ${use.collection} "${use.id}" states deprecated \`${use.path}\`. ${use.reason}`).join(`
22956
23848
  `);
22957
23849
 
23850
+ // src/actions/push/pushLanesError.ts
23851
+ var messageOf = (error) => error instanceof Error ? error.message : String(error);
23852
+
23853
+ class PushLanesError extends Error {
23854
+ failures;
23855
+ constructor({
23856
+ stage,
23857
+ failures
23858
+ }) {
23859
+ super([
23860
+ `push ${stage} failed in ${failures.length} of its lanes:`,
23861
+ ...failures.map(({ lane, error }) => `
23862
+ ${lane}
23863
+ ${messageOf(error).replace(/\n/g, `
23864
+ `)}`)
23865
+ ].join(`
23866
+ `));
23867
+ this.name = "PushLanesError";
23868
+ this.failures = failures;
23869
+ }
23870
+ }
23871
+ var settleLanes = async (lanes) => {
23872
+ const names = Object.keys(lanes);
23873
+ const settled = await Promise.allSettled(names.map((name) => lanes[name]));
23874
+ const values = {};
23875
+ const failures = [];
23876
+ settled.forEach((result, index) => {
23877
+ const lane = names[index];
23878
+ if (result.status === "fulfilled")
23879
+ values[lane] = result.value;
23880
+ else
23881
+ failures.push({ lane, error: result.reason });
23882
+ });
23883
+ return { values, failures };
23884
+ };
23885
+
22958
23886
  // src/actions/sandbox/withSandboxScopeHint.ts
22959
23887
  var SCOPE_REFUSAL = "Insufficient scopes";
22960
23888
  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 +23894,121 @@ var withScopeHint = ({
22966
23894
  hint: hint2
22967
23895
  }) => error instanceof AutumnApiError && error.message.includes(SCOPE_REFUSAL) ? new Error(hint2, { cause: error }) : error;
22968
23896
 
23897
+ // src/actions/webhooks/writeWebhookSecrets.ts
23898
+ import { existsSync as existsSync12, readFileSync as readFileSync13, writeFileSync as writeFileSync9 } from "node:fs";
23899
+ import { dirname as dirname11, join as join13, relative as relative6 } from "node:path";
23900
+
23901
+ // src/actions/webhooks/webhookSecretName.ts
23902
+ var envNameSegment = (value) => value.toUpperCase().replace(/-/g, "_");
23903
+ var webhookSecretName = ({
23904
+ id,
23905
+ orgId
23906
+ }) => {
23907
+ const org4 = orgId === undefined ? "" : `_${envNameSegment(orgId.replace(/^org_/, "").slice(0, 4))}`;
23908
+ return `AUTUMN_WEBHOOK_${envNameSegment(id)}${org4}_SECRET`;
23909
+ };
23910
+
23911
+ // src/actions/webhooks/writeWebhookSecrets.ts
23912
+ var PROD_ENV_FILE = ".env.prod";
23913
+ var prodEnvPath = ({ envDirs }) => {
23914
+ const nearest = findEnvFile({ dirs: envDirs });
23915
+ return join13(nearest === undefined ? envDirs[0] ?? process.cwd() : dirname11(nearest), PROD_ENV_FILE);
23916
+ };
23917
+ var writeWebhookSecrets = async ({
23918
+ secrets,
23919
+ env,
23920
+ envDirs,
23921
+ cwd
23922
+ }) => {
23923
+ if (secrets.length === 0)
23924
+ return [];
23925
+ const orgId = env.live ? undefined : await env.orgId();
23926
+ const values = Object.fromEntries(secrets.map(({ id, secret }) => [webhookSecretName({ id, orgId }), secret]));
23927
+ let path;
23928
+ if (env.live) {
23929
+ path = prodEnvPath({ envDirs });
23930
+ const content = existsSync12(path) ? readFileSync13(path, "utf8") : "";
23931
+ writeFileSync9(path, upsertEnvContent({ content, values }), { mode: 384 });
23932
+ } else {
23933
+ path = writeEnvValues({ dirs: envDirs, values });
23934
+ }
23935
+ const file = relative6(cwd, path) || path;
23936
+ return Object.keys(values).map((name) => `Saved webhook secret as ${name} in ${file}`);
23937
+ };
23938
+
23939
+ // src/actions/webhooks/applyWebhooks.ts
23940
+ var applyWebhooks = async ({
23941
+ client,
23942
+ lane,
23943
+ envDirs,
23944
+ cwd,
23945
+ write
23946
+ }) => {
23947
+ if (lane === undefined || !webhooksHaveWork({ webhooks: lane.preview }))
23948
+ return;
23949
+ const result = await client.syncWebhooks(lane.body);
23950
+ const saved = await writeWebhookSecrets({
23951
+ secrets: result.secrets,
23952
+ env: lane.env,
23953
+ envDirs,
23954
+ cwd
23955
+ });
23956
+ const failed = new Set([
23957
+ ...result.errors.map(({ id }) => id),
23958
+ ...result.secrets.map(({ id }) => id)
23959
+ ]);
23960
+ 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`);
23961
+ write(`
23962
+ Applied webhooks.
23963
+ ${[...adopted, ...saved].map((line2) => `${line2}
23964
+ `).join("")}`);
23965
+ if (result.errors.length > 0)
23966
+ throw new Error(result.errors.map(({ id, message }) => `${id}: ${message}`).join(`
23967
+ `));
23968
+ };
23969
+
23970
+ // src/actions/webhooks/resolveWebhooksForEnv.ts
23971
+ var resolveWebhooksForEnv = ({
23972
+ rows,
23973
+ envKey
23974
+ }) => {
23975
+ const { envKeyed } = SYNCED_LISTS.webhooks;
23976
+ const webhooks = [];
23977
+ for (const row of rows) {
23978
+ const values = envKeyed.map((field) => row[field]?.[envKey]);
23979
+ if (values.some((value) => typeof value !== "string"))
23980
+ continue;
23981
+ webhooks.push({
23982
+ ...row,
23983
+ ...Object.fromEntries(envKeyed.map((field, index) => [field, values[index]]))
23984
+ });
23985
+ }
23986
+ return webhooks;
23987
+ };
23988
+
23989
+ // src/actions/webhooks/previewWebhooks.ts
23990
+ var previewWebhooks = async ({
23991
+ client,
23992
+ rows,
23993
+ webhookEnv
23994
+ }) => {
23995
+ if (rows === undefined)
23996
+ return;
23997
+ if (webhookEnv === undefined)
23998
+ throw new Error("webhooks need the target environment to pick each url.");
23999
+ const env = await webhookEnv();
24000
+ const webhooks = resolveWebhooksForEnv({
24001
+ rows,
24002
+ envKey: env.key
24003
+ });
24004
+ const body = { webhooks };
24005
+ const { changes, errors } = await client.previewSyncWebhooks(body);
24006
+ if (errors.length > 0)
24007
+ throw new Error(errors.map(({ id, message }) => `${id}: ${message}`).join(`
24008
+ `));
24009
+ return { preview: { changes }, body, env };
24010
+ };
24011
+
22969
24012
  // src/actions/push.ts
22970
24013
  var previewSettings = async ({
22971
24014
  client,
@@ -23036,63 +24079,64 @@ var configSearchDirs = ({
23036
24079
  const project = resolveProject({ cwd, configFlag: configPath });
23037
24080
  return [...new Set([project.configDir, cwd, ...project.envDirs])];
23038
24081
  };
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
-
24082
+ var pushExitCode = ({
24083
+ apply,
24084
+ result
24085
+ }) => !apply && result.catalogDeferred === true ? 1 : 0;
24086
+ var renderCatalogDeferral = ({ error }) => [
24087
+ "Catalog: not previewed yet. It depends on the settings above, so it is previewed again once they apply.",
24088
+ ` Against the current settings it fails: ${error instanceof Error ? error.message : String(error)}`,
24089
+ " With --yes: settings apply, then the catalog is previewed again and applied if that preview passes."
24090
+ ].join(`
23059
24091
  `);
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 } })}
24092
+ var renderLintWarnings = ({ warnings }) => warnings.map((warning) => `⚠ ${warning.path}
24093
+ ${warning.message}`).join(`
23065
24094
  `);
23066
- if (!dryRun) {
23067
- try {
23068
- await client.updateOrganization(settingsBody);
23069
- } catch (error) {
23070
- throw withSettingsScopeHint({ error });
23071
- }
23072
- write(`
24095
+ var applySettings = async ({
24096
+ client,
24097
+ settingsBody,
24098
+ settings,
24099
+ catalogPreview,
24100
+ wire,
24101
+ write,
24102
+ migrationLinkBase,
24103
+ catalogDeferred
24104
+ }) => {
24105
+ if (settingsBody === undefined || !settingsHaveWork({ settings }))
24106
+ return catalogPreview;
24107
+ try {
24108
+ await client.updateOrganization(settingsBody);
24109
+ } catch (error) {
24110
+ throw withSettingsScopeHint({ error });
24111
+ }
24112
+ write(`
23073
24113
  Applied settings.
23074
-
23075
24114
  `);
23076
- }
24115
+ let preview;
24116
+ try {
24117
+ preview = await client.previewUpdate(wire);
24118
+ } catch (error) {
24119
+ if (!catalogDeferred)
24120
+ throw error;
24121
+ throw new Error(`Applied settings, but the catalog still fails its preview, so the catalog and webhooks were not applied:
24122
+ ${error instanceof Error ? error.message : String(error)}`, { cause: error });
23077
24123
  }
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
-
24124
+ if (catalogDeferred)
24125
+ write(`
24126
+ ${renderPreview({ preview, migrationLinkBase })}
23089
24127
  `);
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: [] };
24128
+ return preview;
24129
+ };
24130
+ var applyCatalog = async ({
24131
+ client,
24132
+ preview,
24133
+ wire,
24134
+ configPath,
24135
+ write,
24136
+ migrationLinkBase
24137
+ }) => {
24138
+ if (previewIsEmpty({ preview }))
24139
+ return { migrationIds: [] };
23096
24140
  const applied = await client.update(wire);
23097
24141
  const migrationIds = (applied.migrations ?? []).map((migration) => migration.id).filter((id) => typeof id === "string");
23098
24142
  write(`
@@ -23119,7 +24163,107 @@ Applied.
23119
24163
  if (backfilled.length > 0 || slugged.length > 0) {
23120
24164
  write(backfillSummary({ backfilled, slugged }));
23121
24165
  }
23122
- return { configPath, preview: fullPreview, applied, migrationIds };
24166
+ return { applied, migrationIds };
24167
+ };
24168
+ var runPush = async ({
24169
+ client,
24170
+ cwd = process.cwd(),
24171
+ configPath: configFlag,
24172
+ dryRun = false,
24173
+ write = (text) => process.stdout.write(text),
24174
+ migrationLinkBase,
24175
+ webhookEnv
24176
+ }) => {
24177
+ const project = resolveProject({ cwd, configFlag });
24178
+ const dirs = configSearchDirs({ cwd, configPath: configFlag });
24179
+ loadEnvFiles({ dirs: project.envDirs });
24180
+ const { path: configPath, wire: document } = await loadConfig({
24181
+ dirs,
24182
+ ...project.configPath === null ? {} : { configPath: project.configPath }
24183
+ });
24184
+ const { catalog: wire, singletons, lists, warnings } = splitWire(document);
24185
+ if (warnings.length > 0)
24186
+ write(`${renderLintWarnings({ warnings })}
24187
+
24188
+ `);
24189
+ const deprecated = deprecatedUsesIn({ wire });
24190
+ if (deprecated.length > 0)
24191
+ write(`${renderDeprecatedUses({ uses: deprecated })}
24192
+
24193
+ `);
24194
+ const settingsBody = singletons.settings;
24195
+ const previews = await settleLanes({
24196
+ settings: previewSettings({ client, body: settingsBody }),
24197
+ catalog: client.previewUpdate(wire),
24198
+ webhooks: previewWebhooks({
24199
+ client,
24200
+ rows: lists.webhooks,
24201
+ webhookEnv
24202
+ })
24203
+ });
24204
+ const { settings, webhooks } = previews.values;
24205
+ const catalogDeferral = settingsBody !== undefined && settingsHaveWork({ settings }) ? previews.failures.find((failure) => failure.lane === "catalog") : undefined;
24206
+ const failures = previews.failures.filter((failure) => failure !== catalogDeferral);
24207
+ if (failures.length > 0)
24208
+ throw new PushLanesError({ stage: "preview", failures });
24209
+ const catalogPreview = previews.values.catalog ?? {};
24210
+ const preview = {
24211
+ ...catalogPreview,
24212
+ settings,
24213
+ ...webhooks === undefined ? {} : { webhooks: webhooks.preview }
24214
+ };
24215
+ write(`${renderPreview({ preview, migrationLinkBase })}
24216
+ `);
24217
+ if (catalogDeferral !== undefined)
24218
+ write(`
24219
+ ${renderCatalogDeferral({ error: catalogDeferral.error })}
24220
+ `);
24221
+ const renameHint2 = possibleRenameHint({ preview, wire });
24222
+ if (renameHint2 !== null)
24223
+ write(`${renameHint2}
24224
+
24225
+ `);
24226
+ const catalogDeferred = catalogDeferral !== undefined;
24227
+ if (dryRun || previewIsEmpty({ preview }))
24228
+ return { configPath, preview, migrationIds: [], catalogDeferred };
24229
+ const settingsStep = () => applySettings({
24230
+ client,
24231
+ settingsBody,
24232
+ settings,
24233
+ catalogPreview,
24234
+ wire,
24235
+ write,
24236
+ migrationLinkBase,
24237
+ catalogDeferred
24238
+ });
24239
+ const catalogStep = (previewAfterSettings) => applyCatalog({
24240
+ client,
24241
+ preview: previewAfterSettings,
24242
+ wire,
24243
+ configPath,
24244
+ write,
24245
+ migrationLinkBase
24246
+ });
24247
+ const settled = catalogDeferred ? await settingsStep() : undefined;
24248
+ const applied = await settleLanes({
24249
+ catalog: settled === undefined ? settingsStep().then(catalogStep) : catalogStep(settled),
24250
+ webhooks: applyWebhooks({
24251
+ client,
24252
+ lane: webhooks,
24253
+ envDirs: project.envDirs,
24254
+ cwd,
24255
+ write
24256
+ })
24257
+ });
24258
+ if (applied.failures.length > 0)
24259
+ throw new PushLanesError({ stage: "apply", failures: applied.failures });
24260
+ return {
24261
+ configPath,
24262
+ preview,
24263
+ applied: applied.values.catalog?.applied,
24264
+ migrationIds: applied.values.catalog?.migrationIds ?? [],
24265
+ catalogDeferred
24266
+ };
23123
24267
  };
23124
24268
 
23125
24269
  // src/actions/pull.ts
@@ -23235,14 +24379,15 @@ var runPull = async ({
23235
24379
  imports,
23236
24380
  overwrite = false,
23237
24381
  yes = false,
23238
- prompter = createPrompter({ interactive: false, write })
24382
+ prompter = createPrompter({ interactive: false, write }),
24383
+ webhookEnv
23239
24384
  }) => {
23240
24385
  const project = resolveProject({ cwd, configFlag });
23241
24386
  if (overwrite && !yes) {
23242
24387
  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
24388
  `);
23244
24389
  return {
23245
- configPath: project.configPath ?? join13(project.configDir, "autumn.config.ts"),
24390
+ configPath: project.configPath ?? join14(project.configDir, "autumn.config.ts"),
23246
24391
  appended: [],
23247
24392
  replaced: [],
23248
24393
  deleted: []
@@ -23255,7 +24400,7 @@ var runPull = async ({
23255
24400
  if (project.configPath === null) {
23256
24401
  const chosen = await chooseConfigDir({ cwd, prompter });
23257
24402
  scaffoldDir = chosen.configDir;
23258
- scaffoldPath = join13(scaffoldDir, "autumn.config.ts");
24403
+ scaffoldPath = join14(scaffoldDir, "autumn.config.ts");
23259
24404
  if (scaffoldDir !== cwd && writeRootMarker({ repoRoot: chosen.repoRoot, configPath: scaffoldPath }))
23260
24405
  prompter.write(`${done("Recorded in package.json so atmn finds it from anywhere")}
23261
24406
  `);
@@ -23269,18 +24414,19 @@ var runPull = async ({
23269
24414
  overwrite,
23270
24415
  write
23271
24416
  });
23272
- const { catalog: wire, singletons } = splitWire(document);
23273
- const [preview, catalog, settingsPreview] = await Promise.all([
24417
+ const { catalog: wire, singletons, lists } = splitWire(document);
24418
+ const [preview, catalog, settingsPreview, webhooks] = await Promise.all([
23274
24419
  diffOrExplain({ client, wire }),
23275
24420
  client.get({ include_versions: true }),
23276
- client.previewUpdateOrganization(singletons.settings ?? { config: {} })
24421
+ client.previewUpdateOrganization(singletons.settings ?? { config: {} }),
24422
+ webhookEnv === undefined ? undefined : Promise.all([webhookEnv(), client.listWebhooks({})])
23277
24423
  ]);
23278
24424
  const files = new Map;
23279
- files.set(configPath, readFileSync13(configPath, "utf8"));
23280
- for (const file of listSourceFiles({ directory: dirname11(configPath) })) {
24425
+ files.set(configPath, readFileSync14(configPath, "utf8"));
24426
+ for (const file of listSourceFiles({ directory: dirname12(configPath) })) {
23281
24427
  if (file === configPath || files.has(file))
23282
24428
  continue;
23283
- files.set(file, readFileSync13(file, "utf8"));
24429
+ files.set(file, readFileSync14(file, "utf8"));
23284
24430
  }
23285
24431
  const originals = new Map(files);
23286
24432
  const appended = [];
@@ -23344,6 +24490,22 @@ var runPull = async ({
23344
24490
  action: `set by hand: \`${singleton}\` is not an object literal`
23345
24491
  })));
23346
24492
  }
24493
+ const webhookWarnings = [];
24494
+ if (webhooks !== undefined) {
24495
+ const [env, { list: list3 }] = webhooks;
24496
+ const applied = applyWebhooksPull({
24497
+ pull: { configPath, files },
24498
+ remote: list3,
24499
+ stated: lists.webhooks,
24500
+ envKey: env.key
24501
+ });
24502
+ lines.push(...applied.lines);
24503
+ webhookWarnings.push(...applied.warnings);
24504
+ unlocated.push(...applied.unlocated.map((entry) => ({
24505
+ collection: "webhooks",
24506
+ ...entry
24507
+ })));
24508
+ }
23347
24509
  if (includeMappings) {
23348
24510
  const managedCatalog = Object.fromEntries(Object.entries(COLLECTIONS).filter(([, spec]) => spec.wireKey !== undefined && wire[spec.wireKey] !== undefined).map(([collection]) => [collection, catalogRows[collection]]));
23349
24511
  const mapped = applyMappings({
@@ -23364,11 +24526,11 @@ var runPull = async ({
23364
24526
  for (const [file, source] of files) {
23365
24527
  if (source === originals.get(file))
23366
24528
  continue;
23367
- mkdirSync4(dirname11(file), { recursive: true });
23368
- writeFileSync9(file, source, "utf8");
24529
+ mkdirSync4(dirname12(file), { recursive: true });
24530
+ writeFileSync10(file, source, "utf8");
23369
24531
  if (!originals.has(file)) {
23370
- const keep = join13(dirname11(file), ".gitkeep");
23371
- if (existsSync12(keep))
24532
+ const keep = join14(dirname12(file), ".gitkeep");
24533
+ if (existsSync13(keep))
23372
24534
  unlinkSync(keep);
23373
24535
  }
23374
24536
  }
@@ -23380,6 +24542,12 @@ var runPull = async ({
23380
24542
  lines.push(`↳ wrote internalId into ${backfilled.length} fixture${backfilled.length === 1 ? "" : "s"}`);
23381
24543
  if (slugged.length > 0)
23382
24544
  lines.push(`↳ wrote versionSlug into ${slugged.length} fixture${slugged.length === 1 ? "" : "s"}`);
24545
+ if (webhookWarnings.length > 0)
24546
+ write(`${webhookWarnings.join(`
24547
+
24548
+ `)}
24549
+
24550
+ `);
23383
24551
  write(lines.length === 0 ? `Nothing to pull.
23384
24552
  ` : `${lines.join(`
23385
24553
  `)}
@@ -23511,8 +24679,8 @@ var runSandboxDelete = async ({
23511
24679
  write = (text) => process.stdout.write(text),
23512
24680
  writeError = (text) => process.stderr.write(text)
23513
24681
  }) => {
23514
- const { list: list2 } = await client.listSandboxes({});
23515
- const sandbox = list2.find((entry) => entry.id === id);
24682
+ const { list: list3 } = await client.listSandboxes({});
24683
+ const sandbox = list3.find((entry) => entry.id === id);
23516
24684
  if (sandbox === undefined) {
23517
24685
  throw new Error(`No sandbox with id ${id}. Run atmn sandbox list.`);
23518
24686
  }
@@ -23539,7 +24707,7 @@ var runSandboxDelete = async ({
23539
24707
  };
23540
24708
 
23541
24709
  // src/render/renderSandboxes.ts
23542
- import chalk5 from "chalk";
24710
+ import chalk6 from "chalk";
23543
24711
  var MINUTE = 60000;
23544
24712
  var HOUR = 60 * MINUTE;
23545
24713
  var DAY = 24 * HOUR;
@@ -23578,7 +24746,7 @@ var renderSandboxes = ({
23578
24746
  now = Date.now()
23579
24747
  }) => {
23580
24748
  if (sandboxes.length === 0)
23581
- return chalk5.dim(NO_SANDBOXES);
24749
+ return chalk6.dim(NO_SANDBOXES);
23582
24750
  const rows = sandboxes.map((sandbox) => [
23583
24751
  sandbox.id,
23584
24752
  stripTerminalControls(sandbox.name),
@@ -23586,11 +24754,11 @@ var renderSandboxes = ({
23586
24754
  ]);
23587
24755
  const widths = columnWidths({ rows });
23588
24756
  return [
23589
- chalk5.dim(tableLine({ cells: HEADERS, widths, marker: "" })),
24757
+ chalk6.dim(tableLine({ cells: HEADERS, widths, marker: "" })),
23590
24758
  ...rows.map((cells, index) => tableLine({
23591
24759
  cells,
23592
24760
  widths,
23593
- marker: sandboxes[index]?.id === currentSandboxId ? chalk5.dim(`${GAP2}${CURRENT_MARKER}`) : ""
24761
+ marker: sandboxes[index]?.id === currentSandboxId ? chalk6.dim(`${GAP2}${CURRENT_MARKER}`) : ""
23594
24762
  }))
23595
24763
  ].join(`
23596
24764
  `);
@@ -23615,7 +24783,7 @@ var runSandboxList = async ({
23615
24783
  };
23616
24784
 
23617
24785
  // src/prompt/select.ts
23618
- import chalk6 from "chalk";
24786
+ import chalk7 from "chalk";
23619
24787
  var PAGE_SIZE = 10;
23620
24788
  var CURRENT_MARKER2 = "← current";
23621
24789
  var renderChoices = ({
@@ -23628,14 +24796,14 @@ var renderChoices = ({
23628
24796
  const start = page * PAGE_SIZE;
23629
24797
  const rows = visible.slice(start, start + PAGE_SIZE).map((choice, index) => {
23630
24798
  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)}` : "";
24799
+ const pointer = selected ? chalk7.cyan("❯") : " ";
24800
+ const label = selected ? chalk7.bold(choice.label) : choice.label;
24801
+ const detail = choice.detail === undefined ? "" : ` ${chalk7.dim(`(${choice.detail})`)}`;
24802
+ const current = choice.current ? ` ${chalk7.dim(CURRENT_MARKER2)}` : "";
23635
24803
  return `${pointer} ${label}${detail}${current}`;
23636
24804
  });
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}`;
24805
+ const footer = visible.length > PAGE_SIZE ? chalk7.dim(` ${start + 1}-${Math.min(start + PAGE_SIZE, visible.length)} of ${visible.length}`) : "";
24806
+ const search = ` ${chalk7.dim("type to filter:")} ${filter}`;
23639
24807
  return [...rows, ...footer ? [footer] : [], search].join(`
23640
24808
  `);
23641
24809
  };
@@ -23771,9 +24939,9 @@ var runSandboxUse = async ({
23771
24939
  }
23772
24940
  if (client === undefined || org === undefined)
23773
24941
  throw new Error("sandbox use needs the main key to list sandboxes.");
23774
- const { list: list2 } = await client.listSandboxes({});
24942
+ const { list: list3 } = await client.listSandboxes({});
23775
24943
  const currentId = process.env[SANDBOX_PIN_NAME];
23776
- const choices = choicesOf({ sandboxes: list2, currentId });
24944
+ const choices = choicesOf({ sandboxes: list3, currentId });
23777
24945
  let picked;
23778
24946
  if (query !== undefined && query !== "") {
23779
24947
  picked = matchChoice({ choices, query });
@@ -23781,7 +24949,7 @@ var runSandboxUse = async ({
23781
24949
  throw new Error(`No sandbox named or with id ${JSON.stringify(query)}. Run atmn sandbox list.`);
23782
24950
  } else {
23783
24951
  if (!prompter.interactive)
23784
- prompter.write(`${renderSandboxes({ sandboxes: list2, currentSandboxId: currentId })}
24952
+ prompter.write(`${renderSandboxes({ sandboxes: list3, currentSandboxId: currentId })}
23785
24953
  `);
23786
24954
  picked = await select({
23787
24955
  prompter,
@@ -23792,7 +24960,7 @@ var runSandboxUse = async ({
23792
24960
  if (picked === null)
23793
24961
  return null;
23794
24962
  }
23795
- const sandbox = list2.find((row) => row.id === picked.value);
24963
+ const sandbox = list3.find((row) => row.id === picked.value);
23796
24964
  if (sandbox === undefined)
23797
24965
  throw new Error("Sandbox vanished from the list.");
23798
24966
  const keyName = sandboxKeyName({ sandboxId: sandbox.id });
@@ -23829,6 +24997,47 @@ var runSandboxUse = async ({
23829
24997
  return result;
23830
24998
  };
23831
24999
 
25000
+ // src/generated/sandboxName.ts
25001
+ var RESERVED_SANDBOX_SLUGS = new Set([
25002
+ "products",
25003
+ "customers",
25004
+ "features",
25005
+ "migrations",
25006
+ "dev",
25007
+ "analytics",
25008
+ "settings",
25009
+ "admin",
25010
+ "chat",
25011
+ "quickstart",
25012
+ "onboarding",
25013
+ "impersonate-redirect",
25014
+ "trmnl"
25015
+ ]);
25016
+ var ENV_SANDBOX_SLUGS = new Set(["live", "sandbox"]);
25017
+ var sandboxSlug = (name) => name.toLowerCase().replace(/ /g, "-").replace(/[^\w\s-]/g, "");
25018
+
25019
+ // src/actions/webhooks/resolveWebhookEnv.ts
25020
+ var memoized = (fetchOrgInfo2) => {
25021
+ let pending;
25022
+ return () => {
25023
+ pending ??= fetchOrgInfo2();
25024
+ return pending;
25025
+ };
25026
+ };
25027
+ var resolveWebhookEnv = async ({
25028
+ target,
25029
+ prod,
25030
+ fetchOrgInfo: fetchOrgInfo2
25031
+ }) => {
25032
+ const orgInfo = memoized(fetchOrgInfo2);
25033
+ const orgId = async () => (await orgInfo()).id;
25034
+ if (prod)
25035
+ return { key: "live", live: true, orgId };
25036
+ if (target.sandboxId === undefined)
25037
+ return { key: "sandbox", live: false, orgId };
25038
+ return { key: sandboxSlug((await orgInfo()).name), live: false, orgId };
25039
+ };
25040
+
23832
25041
  // src/cli.ts
23833
25042
  var normalizeVersionFlag = ({ argv }) => argv.map((token) => token === "-v" ? "--version" : token);
23834
25043
  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 +25064,11 @@ ${hint(flagHint)}
23855
25064
  `);
23856
25065
  throw new NeedsInputError(flagHint);
23857
25066
  }
23858
- return join14(project.configDir, SKILLS_DIR_NAME);
25067
+ return join15(project.configDir, SKILLS_DIR_NAME);
23859
25068
  };
23860
25069
  var writeStaleSkillsHint = ({ command }) => {
23861
25070
  const stale = staleSkillsHint({
23862
- dir: join14(projectOf({ command }).configDir, SKILLS_DIR_NAME)
25071
+ dir: join15(projectOf({ command }).configDir, SKILLS_DIR_NAME)
23863
25072
  });
23864
25073
  if (stale !== null)
23865
25074
  process.stdout.write(`${stale}
@@ -23913,13 +25122,21 @@ var pinnedSandboxName = async ({
23913
25122
  if (target.sandboxId === undefined)
23914
25123
  return {};
23915
25124
  try {
23916
- const { list: list2 } = await sandboxClientFor({ target }).listSandboxes({});
23917
- const name = list2.find((row) => row.id === target.sandboxId)?.name;
25125
+ const { list: list3 } = await sandboxClientFor({ target }).listSandboxes({});
25126
+ const name = list3.find((row) => row.id === target.sandboxId)?.name;
23918
25127
  return name === undefined ? {} : { sandboxName: name };
23919
25128
  } catch {
23920
25129
  return {};
23921
25130
  }
23922
25131
  };
25132
+ var webhookEnvFor = ({ target, command }) => () => resolveWebhookEnv({
25133
+ target,
25134
+ prod: command.optsWithGlobals().prod === true,
25135
+ fetchOrgInfo: () => fetchOrgInfo({
25136
+ baseUrl: targetBaseUrl({ target }),
25137
+ secretKey: requireSecretKey({ target })
25138
+ })
25139
+ });
23923
25140
  var mainOrgInfo = ({ target }) => {
23924
25141
  const main = managementTarget({ target });
23925
25142
  return fetchOrgInfo({
@@ -24017,8 +25234,10 @@ Linking a keyless org to an account:
24017
25234
  const result = await runPush({
24018
25235
  client: clientFor({ target }),
24019
25236
  configPath: configFlagOf({ command }),
24020
- dryRun: !apply
25237
+ dryRun: !apply,
25238
+ webhookEnv: webhookEnvFor({ target, command })
24021
25239
  });
25240
+ process.exitCode = pushExitCode({ apply, result });
24022
25241
  if (!apply && !previewIsEmpty({ preview: result.preview }))
24023
25242
  process.stdout.write(options.dryRun === true ? `
24024
25243
  Dry run — nothing applied.
@@ -24065,7 +25284,8 @@ Nothing applied. Re-run with --yes to apply these changes.
24065
25284
  includeMappings: options.includeMappings === true,
24066
25285
  overwrite: options.overwrite === true,
24067
25286
  yes: options.yes === true,
24068
- prompter: prompterFor({ command })
25287
+ prompter: prompterFor({ command }),
25288
+ webhookEnv: webhookEnvFor({ target, command })
24069
25289
  });
24070
25290
  writeStaleSkillsHint({ command });
24071
25291
  });