@camunda/ccma-shared-types 0.4.0 → 0.5.1

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 (78) hide show
  1. package/dist/_tests/constants/failoverRegionPairs.const.spec.d.ts +1 -0
  2. package/dist/_tests/search/compiler.spec.d.ts +1 -0
  3. package/dist/_tests/search/parser.spec.d.ts +1 -0
  4. package/dist/_tests/search/registry.spec.d.ts +1 -0
  5. package/dist/_tests/types/ClusterPlanFields.type.spec.d.ts +1 -0
  6. package/dist/_tests/utils/failoverKeyPolicy.utils.spec.d.ts +1 -0
  7. package/dist/constants/failoverRegionPairs.const.d.ts +8 -1
  8. package/dist/constants/failoverRegionPairs.const.js +9 -4
  9. package/dist/constants/failoverRegionPairs.const.js.map +2 -2
  10. package/dist/constants/misc.const.d.ts +0 -55
  11. package/dist/constants/misc.const.js +0 -82
  12. package/dist/constants/misc.const.js.map +2 -2
  13. package/dist/dtos/Backup.dto.d.ts +5 -0
  14. package/dist/dtos/ClusterPlan.dto.d.ts +5 -0
  15. package/dist/dtos/ClusterPlanType.dto.d.ts +6 -0
  16. package/dist/dtos/CommonCluster.dto.d.ts +18 -0
  17. package/dist/dtos/ControlV2.dto.d.ts +62 -14
  18. package/dist/dtos/K8sContext.dto.d.ts +6 -0
  19. package/dist/dtos/Organization.dto.d.ts +2 -0
  20. package/dist/dtos/Organization.dto.js.map +1 -1
  21. package/dist/dtos/ReleaseTrainSanity.dto.d.ts +51 -0
  22. package/dist/dtos/ReleaseTrainSanity.dto.js +1 -0
  23. package/dist/dtos/ReleaseTrainSanity.dto.js.map +7 -0
  24. package/dist/dtos/SalesPlan.dto.d.ts +11 -0
  25. package/dist/dtos/SalesPlan.dto.js +14 -0
  26. package/dist/dtos/SalesPlan.dto.js.map +2 -2
  27. package/dist/enums/OrganizationRole.enum.d.ts +1 -0
  28. package/dist/enums/OrganizationRole.enum.js +7 -0
  29. package/dist/enums/OrganizationRole.enum.js.map +2 -2
  30. package/dist/enums/SystemAuditEntity.enum.d.ts +7 -2
  31. package/dist/enums/SystemAuditEntity.enum.js +5 -0
  32. package/dist/enums/SystemAuditEntity.enum.js.map +2 -2
  33. package/dist/index.d.ts +8 -2
  34. package/dist/index.js +48 -2
  35. package/dist/index.js.map +2 -2
  36. package/dist/permissions/combo.js +3 -0
  37. package/dist/permissions/combo.js.map +2 -2
  38. package/dist/permissions/console.permissions.d.ts +2 -0
  39. package/dist/permissions/console.permissions.js +7 -0
  40. package/dist/permissions/console.permissions.js.map +2 -2
  41. package/dist/search/ast.d.ts +52 -0
  42. package/dist/search/ast.js +18 -0
  43. package/dist/search/ast.js.map +7 -0
  44. package/dist/search/cluster-search-fields.d.ts +11 -0
  45. package/dist/search/cluster-search-fields.js +136 -0
  46. package/dist/search/cluster-search-fields.js.map +7 -0
  47. package/dist/search/compiler.d.ts +48 -0
  48. package/dist/search/compiler.js +217 -0
  49. package/dist/search/compiler.js.map +7 -0
  50. package/dist/search/fields.d.ts +24 -0
  51. package/dist/search/fields.js +5 -0
  52. package/dist/search/fields.js.map +7 -0
  53. package/dist/search/index.d.ts +6 -0
  54. package/dist/search/index.js +33 -0
  55. package/dist/search/index.js.map +7 -0
  56. package/dist/search/organization-search-fields.d.ts +9 -0
  57. package/dist/search/organization-search-fields.js +50 -0
  58. package/dist/search/organization-search-fields.js.map +7 -0
  59. package/dist/search/parser.d.ts +7 -0
  60. package/dist/search/parser.js +324 -0
  61. package/dist/search/parser.js.map +7 -0
  62. package/dist/types/ClusterModification.type.d.ts +1 -0
  63. package/dist/types/ClusterPlanFields.type.d.ts +24 -0
  64. package/dist/types/ClusterPlanFields.type.js +591 -0
  65. package/dist/types/ClusterPlanFields.type.js.map +7 -0
  66. package/dist/types/ClusterPlanModification.type.d.ts +3 -0
  67. package/dist/types/EnterpriseIncludingValueMetrics.type.d.ts +1 -0
  68. package/dist/types/HdpTenantUsage.type.d.ts +4 -0
  69. package/dist/types/HdpTenantUsage.type.js +1 -0
  70. package/dist/types/HdpTenantUsage.type.js.map +7 -0
  71. package/dist/utils/enterpriseTerm.utils.d.ts +78 -0
  72. package/dist/utils/enterpriseTerm.utils.js +69 -0
  73. package/dist/utils/enterpriseTerm.utils.js.map +7 -0
  74. package/dist/utils/enterpriseTerm.utils.spec.d.ts +1 -0
  75. package/dist/utils/failoverKeyPolicy.utils.d.ts +26 -0
  76. package/dist/utils/failoverKeyPolicy.utils.js +15 -0
  77. package/dist/utils/failoverKeyPolicy.utils.js.map +7 -0
  78. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -4,8 +4,15 @@
4
4
  * one of these reverse-region pairs — cluster creation must be supported in
5
5
  * both directions. Both directions of each pair are listed.
6
6
  *
7
+ * This is the base set, enabled on every stage.
8
+ *
7
9
  * Shared between console-backend (FailoverRouter guard) and c4 (hiding the
8
10
  * failover action for unsupported pairs).
9
11
  */
10
12
  export declare const SUPPORTED_FAILOVER_REGION_PAIRS: ReadonlySet<string>;
11
- export declare function isSupportedFailoverRegionPair(regionA: string | undefined, regionB: string | undefined): boolean;
13
+ /**
14
+ * `stage` mirrors the featureflags `onlyDev` gate: the EU test pairs unlock only
15
+ * on 'local'/'dev'. Omitting stage (or passing any non-dev stage) allows the
16
+ * base set only, so prod never sees the dev pairs.
17
+ */
18
+ export declare function isSupportedFailoverRegionPair(regionA: string | undefined, regionB: string | undefined, stage?: string): boolean;
@@ -4,11 +4,16 @@ const SUPPORTED_FAILOVER_REGION_PAIRS = /* @__PURE__ */ new Set([
4
4
  "us-east-2:us-east-1",
5
5
  "us-east-1:us-east-2"
6
6
  ]);
7
- function isSupportedFailoverRegionPair(regionA, regionB) {
7
+ const DEV_FAILOVER_REGION_PAIRS = /* @__PURE__ */ new Set([
8
+ "eu-west-1:eu-west-2",
9
+ "eu-west-2:eu-west-1"
10
+ ]);
11
+ function isSupportedFailoverRegionPair(regionA, regionB, stage) {
8
12
  if (!regionA || !regionB) return false;
9
- return SUPPORTED_FAILOVER_REGION_PAIRS.has(
10
- `${regionA.toLowerCase()}:${regionB.toLowerCase()}`
11
- );
13
+ const pair = `${regionA.toLowerCase()}:${regionB.toLowerCase()}`;
14
+ if (SUPPORTED_FAILOVER_REGION_PAIRS.has(pair)) return true;
15
+ const isDev = stage === "local" || stage === "dev";
16
+ return isDev && DEV_FAILOVER_REGION_PAIRS.has(pair);
12
17
  }
13
18
  export {
14
19
  SUPPORTED_FAILOVER_REGION_PAIRS,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/constants/failoverRegionPairs.const.ts"],
4
- "sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\n/**\n * Region pairs supported for cross-region failover (#9120). Failover is only\n * offered for dual-region clusters whose primary and secondary regions form\n * one of these reverse-region pairs \u2014 cluster creation must be supported in\n * both directions. Both directions of each pair are listed.\n *\n * Shared between console-backend (FailoverRouter guard) and c4 (hiding the\n * failover action for unsupported pairs).\n */\nexport const SUPPORTED_FAILOVER_REGION_PAIRS: ReadonlySet<string> = new Set([\n 'us-east-2:us-west-2',\n 'us-west-2:us-east-2',\n 'us-east-2:us-east-1',\n 'us-east-1:us-east-2',\n])\n\nexport function isSupportedFailoverRegionPair(\n regionA: string | undefined,\n regionB: string | undefined,\n): boolean {\n if (!regionA || !regionB) return false\n return SUPPORTED_FAILOVER_REGION_PAIRS.has(\n `${regionA.toLowerCase()}:${regionB.toLowerCase()}`,\n )\n}\n"],
5
- "mappings": "AAeO,MAAM,kCAAuD,oBAAI,IAAI;AAAA,EAC1E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,8BACd,SACA,SACS;AACT,MAAI,CAAC,WAAW,CAAC,QAAS,QAAO;AACjC,SAAO,gCAAgC;AAAA,IACrC,GAAG,QAAQ,YAAY,CAAC,IAAI,QAAQ,YAAY,CAAC;AAAA,EACnD;AACF;",
4
+ "sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\n/**\n * Region pairs supported for cross-region failover (#9120). Failover is only\n * offered for dual-region clusters whose primary and secondary regions form\n * one of these reverse-region pairs \u2014 cluster creation must be supported in\n * both directions. Both directions of each pair are listed.\n *\n * This is the base set, enabled on every stage.\n *\n * Shared between console-backend (FailoverRouter guard) and c4 (hiding the\n * failover action for unsupported pairs).\n */\nexport const SUPPORTED_FAILOVER_REGION_PAIRS: ReadonlySet<string> = new Set([\n 'us-east-2:us-west-2',\n 'us-west-2:us-east-2',\n 'us-east-2:us-east-1',\n 'us-east-1:us-east-2',\n])\n\n// Dev-only test pairs: EU failover validation on dev/local before prod rollout.\nconst DEV_FAILOVER_REGION_PAIRS: ReadonlySet<string> = new Set([\n 'eu-west-1:eu-west-2',\n 'eu-west-2:eu-west-1',\n])\n\n/**\n * `stage` mirrors the featureflags `onlyDev` gate: the EU test pairs unlock only\n * on 'local'/'dev'. Omitting stage (or passing any non-dev stage) allows the\n * base set only, so prod never sees the dev pairs.\n */\nexport function isSupportedFailoverRegionPair(\n regionA: string | undefined,\n regionB: string | undefined,\n stage?: string,\n): boolean {\n if (!regionA || !regionB) return false\n const pair = `${regionA.toLowerCase()}:${regionB.toLowerCase()}`\n if (SUPPORTED_FAILOVER_REGION_PAIRS.has(pair)) return true\n const isDev = stage === 'local' || stage === 'dev'\n return isDev && DEV_FAILOVER_REGION_PAIRS.has(pair)\n}\n"],
5
+ "mappings": "AAiBO,MAAM,kCAAuD,oBAAI,IAAI;AAAA,EAC1E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,MAAM,4BAAiD,oBAAI,IAAI;AAAA,EAC7D;AAAA,EACA;AACF,CAAC;AAOM,SAAS,8BACd,SACA,SACA,OACS;AACT,MAAI,CAAC,WAAW,CAAC,QAAS,QAAO;AACjC,QAAM,OAAO,GAAG,QAAQ,YAAY,CAAC,IAAI,QAAQ,YAAY,CAAC;AAC9D,MAAI,gCAAgC,IAAI,IAAI,EAAG,QAAO;AACtD,QAAM,QAAQ,UAAU,WAAW,UAAU;AAC7C,SAAO,SAAS,0BAA0B,IAAI,IAAI;AACpD;",
6
6
  "names": []
7
7
  }
@@ -23,58 +23,3 @@ export declare const MAX_HARDWARE_PACKAGE_COUNT = 4;
23
23
  * where the exporter starts honoring the filters) — this is the product rollout gate.
24
24
  */
25
25
  export declare const OPTIMIZE_FILTERING_MIN_VERSION = "8.10.0-alpha1";
26
- export declare const SENTRY: {
27
- dsn: {
28
- trial: string;
29
- console: {
30
- frontend: string;
31
- backend: string;
32
- };
33
- accounts: {
34
- frontend: string;
35
- backend: string;
36
- };
37
- };
38
- applicationKey: {
39
- console: string;
40
- accounts: string;
41
- };
42
- enabled: string[];
43
- ignoreTransactions: string[];
44
- ignoreErrors: string[];
45
- config: {
46
- tracesSampleRate: {
47
- frontend: {
48
- accounts: number[];
49
- console: number[];
50
- };
51
- backend: {
52
- accounts: number[];
53
- console: number[];
54
- };
55
- };
56
- replaysSessionSampleRate: {
57
- frontend: {
58
- accounts: number[];
59
- console: number[];
60
- };
61
- };
62
- replaysOnErrorSampleRate: {
63
- frontend: {
64
- accounts: number[];
65
- console: number[];
66
- };
67
- };
68
- profilesSampleRate: {
69
- backend: {
70
- accounts: number[];
71
- console: number[];
72
- };
73
- frontend: {
74
- accounts: number[];
75
- console: number[];
76
- };
77
- };
78
- };
79
- configWeight: (env: string, values: number[]) => number;
80
- };
@@ -19,87 +19,6 @@ const MINIMUM_EYEPAIRS = {
19
19
  };
20
20
  const MAX_HARDWARE_PACKAGE_COUNT = 4;
21
21
  const OPTIMIZE_FILTERING_MIN_VERSION = "8.10.0-alpha1";
22
- const SENTRY = {
23
- dsn: {
24
- trial: "https://a91625f8d3e1b34690588504ed020e14@o4507463051378688.ingest.de.sentry.io/4507463055376464",
25
- console: {
26
- frontend: "https://bbf8e6b13f91f7a49ab0b7f079ae8cc0@o132036.ingest.us.sentry.io/4507537062494208",
27
- backend: "https://43de708d3ad0199f8c23975a3fd43aa0@o132036.ingest.us.sentry.io/4507537080188928"
28
- },
29
- accounts: {
30
- frontend: "https://49c5d54e4d05418feb80cd4085fa32bd@o132036.ingest.us.sentry.io/4507537094541312",
31
- backend: "https://d120a5f0acbf132b1edf58008c674164@o132036.ingest.us.sentry.io/4507537100505088"
32
- }
33
- },
34
- applicationKey: {
35
- console: "ccma-console-frontend-0xDEADBEEF",
36
- accounts: "ccma-accounts-frontend-0xDEADBEEF"
37
- },
38
- enabled: ["dev", "int", "prod"],
39
- ignoreTransactions: ["/events", "/assets", "/metrics"],
40
- ignoreErrors: [
41
- "No activity within 120000 milliseconds. No response received. Reconnecting.",
42
- "network error",
43
- "Load failed",
44
- "Non-Error promise rejection captured with value: Could not clear consent from root domain.",
45
- "NetworkError when attempting to fetch resource.",
46
- "The initialization timeout of 3000ms has been hit before the network request has completed.",
47
- "Non-Error promise rejection captured with value: Object Not Found Matching Id:3, MethodName:update, ParamCount:4",
48
- "Non-Error promise rejection captured with value: Object Not Found Matching Id:3, MethodName:simulateEvent, ParamCount:1",
49
- `Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.`,
50
- `Failed to execute 'createPolicy' on 'TrustedTypePolicyFactory': Policy with name "default" already exists.`,
51
- // SSE errors after reload
52
- `TypeError: Error in input stream`,
53
- `TypeError: Failed to fetch`,
54
- `that is not 200. Aborting the connection.`,
55
- `chars received. Reconnecting.`
56
- ],
57
- // value pair: [preprod, prod]
58
- config: {
59
- tracesSampleRate: {
60
- frontend: {
61
- accounts: [0.1, 5e-3],
62
- console: [0.2, 0.01]
63
- },
64
- backend: {
65
- accounts: [0.1, 5e-3],
66
- console: [2e-4, 5e-4]
67
- }
68
- },
69
- replaysSessionSampleRate: {
70
- frontend: {
71
- accounts: [5e-3, 1e-3],
72
- console: [5e-3, 1e-3]
73
- }
74
- },
75
- replaysOnErrorSampleRate: {
76
- frontend: {
77
- accounts: [5e-3, 1e-3],
78
- console: [5e-3, 1e-3]
79
- }
80
- },
81
- profilesSampleRate: {
82
- backend: {
83
- accounts: [1e-3, 2e-4],
84
- console: [1e-3, 2e-4]
85
- },
86
- frontend: {
87
- accounts: [1e-3, 2e-4],
88
- console: [1e-3, 2e-4]
89
- }
90
- }
91
- },
92
- configWeight: (env, values) => {
93
- if (values && values.length === 2) {
94
- if (env === "prod") {
95
- return values[1];
96
- } else {
97
- return values[0];
98
- }
99
- }
100
- return 0.1;
101
- }
102
- };
103
22
  export {
104
23
  CONSOLE_API_USER_ID,
105
24
  FIRSTNAME_LASTNAME_MAX_LENGTH,
@@ -110,7 +29,6 @@ export {
110
29
  NAMES_OF_ENTERPRISE_SALESPLANS_WITH_SLEEPING_CLUSTERS,
111
30
  OPTIMIZE_FILTERING_MIN_VERSION,
112
31
  SECRETS_MAX_LENGTH,
113
- SENTRY,
114
32
  STARTING_PRICE_PER_MONTH_IN_EURO,
115
33
  TEMPORARY_CLUSTER_NAME
116
34
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/constants/misc.const.ts"],
4
- "sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nexport const CONSOLE_API_USER_ID = 'console-api'\nexport const TEMPORARY_CLUSTER_NAME = 'Get Started'\nexport type Stage = 'local' | 'dev' | 'int' | 'prod'\nexport const HOTBACKUP_MIN_CREATE_PERIOD = 1000 * 60 * 60 * 0.25 // 15 minutes\n\nexport const SECRETS_MAX_LENGTH = 4096\nexport const FIRSTNAME_LASTNAME_MAX_LENGTH = 255\n\nexport const STARTING_PRICE_PER_MONTH_IN_EURO = 99\n\nexport const MAX_LENGTH_CLUSTER_NAME = 50\n\nexport const NAMES_OF_ENTERPRISE_SALESPLANS_WITH_SLEEPING_CLUSTERS = [\n 'CELP with sleeping clusters',\n 'Camunda Partner',\n]\n\nexport const MINIMUM_EYEPAIRS = {\n CLUSTER_DELETION: 3,\n CLUSTER_GENERATION_UPDATE: 2,\n CLUSTER_PLAN_UPDATE: 2,\n CLUSTER_PLAN_TYPE_UPDATE: 2,\n CLUSTER_PLAN_MODIFICATION: 1,\n CLUSTER_MODIFICATION: 1,\n}\n\nexport const MAX_HARDWARE_PACKAGE_COUNT = 4\n\n/**\n * Minimum cluster (zeebe) version for the Optimize data-filters feature. Shared by\n * the c4 settings tile, the new-cluster default, and CRD spec generation so the gate\n * stays consistent. Stricter than the operator's own gate (Camunda >= 8.9.0-alpha1,\n * where the exporter starts honoring the filters) \u2014 this is the product rollout gate.\n */\nexport const OPTIMIZE_FILTERING_MIN_VERSION = '8.10.0-alpha1'\n\nexport const SENTRY = {\n dsn: {\n trial:\n 'https://a91625f8d3e1b34690588504ed020e14@o4507463051378688.ingest.de.sentry.io/4507463055376464',\n console: {\n frontend:\n 'https://bbf8e6b13f91f7a49ab0b7f079ae8cc0@o132036.ingest.us.sentry.io/4507537062494208',\n backend:\n 'https://43de708d3ad0199f8c23975a3fd43aa0@o132036.ingest.us.sentry.io/4507537080188928',\n },\n accounts: {\n frontend:\n 'https://49c5d54e4d05418feb80cd4085fa32bd@o132036.ingest.us.sentry.io/4507537094541312',\n backend:\n 'https://d120a5f0acbf132b1edf58008c674164@o132036.ingest.us.sentry.io/4507537100505088',\n },\n },\n applicationKey: {\n console: 'ccma-console-frontend-0xDEADBEEF',\n accounts: 'ccma-accounts-frontend-0xDEADBEEF',\n },\n enabled: ['dev', 'int', 'prod'],\n ignoreTransactions: ['/events', '/assets', '/metrics'],\n ignoreErrors: [\n 'No activity within 120000 milliseconds. No response received. Reconnecting.',\n 'network error',\n 'Load failed',\n 'Non-Error promise rejection captured with value: Could not clear consent from root domain.',\n 'NetworkError when attempting to fetch resource.',\n 'The initialization timeout of 3000ms has been hit before the network request has completed.',\n 'Non-Error promise rejection captured with value: Object Not Found Matching Id:3, MethodName:update, ParamCount:4',\n 'Non-Error promise rejection captured with value: Object Not Found Matching Id:3, MethodName:simulateEvent, ParamCount:1',\n `Failed to execute 'removeChild' on 'Node': The node to be removed is not a child of this node.`,\n `Failed to execute 'createPolicy' on 'TrustedTypePolicyFactory': Policy with name \"default\" already exists.`,\n // SSE errors after reload\n `TypeError: Error in input stream`,\n `TypeError: Failed to fetch`,\n `that is not 200. Aborting the connection.`,\n `chars received. Reconnecting.`,\n ],\n // value pair: [preprod, prod]\n config: {\n tracesSampleRate: {\n frontend: {\n accounts: [0.1, 0.005],\n console: [0.2, 0.01],\n },\n backend: {\n accounts: [0.1, 0.005],\n console: [0.0002, 0.0005],\n },\n },\n replaysSessionSampleRate: {\n frontend: {\n accounts: [0.005, 0.001],\n console: [0.005, 0.001],\n },\n },\n replaysOnErrorSampleRate: {\n frontend: {\n accounts: [0.005, 0.001],\n console: [0.005, 0.001],\n },\n },\n profilesSampleRate: {\n backend: {\n accounts: [0.001, 0.0002],\n console: [0.001, 0.0002],\n },\n frontend: {\n accounts: [0.001, 0.0002],\n console: [0.001, 0.0002],\n },\n },\n },\n configWeight: (env: string, values: number[]) => {\n if (values && values.length === 2) {\n if (env === 'prod') {\n return values[1]\n } else {\n return values[0]\n }\n }\n return 0.1\n },\n}\n"],
5
- "mappings": "AAMO,MAAM,sBAAsB;AAC5B,MAAM,yBAAyB;AAE/B,MAAM,8BAA8B,MAAO,KAAK,KAAK;AAErD,MAAM,qBAAqB;AAC3B,MAAM,gCAAgC;AAEtC,MAAM,mCAAmC;AAEzC,MAAM,0BAA0B;AAEhC,MAAM,wDAAwD;AAAA,EACnE;AAAA,EACA;AACF;AAEO,MAAM,mBAAmB;AAAA,EAC9B,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,qBAAqB;AAAA,EACrB,0BAA0B;AAAA,EAC1B,2BAA2B;AAAA,EAC3B,sBAAsB;AACxB;AAEO,MAAM,6BAA6B;AAQnC,MAAM,iCAAiC;AAEvC,MAAM,SAAS;AAAA,EACpB,KAAK;AAAA,IACH,OACE;AAAA,IACF,SAAS;AAAA,MACP,UACE;AAAA,MACF,SACE;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,MACR,UACE;AAAA,MACF,SACE;AAAA,IACJ;AAAA,EACF;AAAA,EACA,gBAAgB;AAAA,IACd,SAAS;AAAA,IACT,UAAU;AAAA,EACZ;AAAA,EACA,SAAS,CAAC,OAAO,OAAO,MAAM;AAAA,EAC9B,oBAAoB,CAAC,WAAW,WAAW,UAAU;AAAA,EACrD,cAAc;AAAA,IACZ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IAEA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;AAAA,EAEA,QAAQ;AAAA,IACN,kBAAkB;AAAA,MAChB,UAAU;AAAA,QACR,UAAU,CAAC,KAAK,IAAK;AAAA,QACrB,SAAS,CAAC,KAAK,IAAI;AAAA,MACrB;AAAA,MACA,SAAS;AAAA,QACP,UAAU,CAAC,KAAK,IAAK;AAAA,QACrB,SAAS,CAAC,MAAQ,IAAM;AAAA,MAC1B;AAAA,IACF;AAAA,IACA,0BAA0B;AAAA,MACxB,UAAU;AAAA,QACR,UAAU,CAAC,MAAO,IAAK;AAAA,QACvB,SAAS,CAAC,MAAO,IAAK;AAAA,MACxB;AAAA,IACF;AAAA,IACA,0BAA0B;AAAA,MACxB,UAAU;AAAA,QACR,UAAU,CAAC,MAAO,IAAK;AAAA,QACvB,SAAS,CAAC,MAAO,IAAK;AAAA,MACxB;AAAA,IACF;AAAA,IACA,oBAAoB;AAAA,MAClB,SAAS;AAAA,QACP,UAAU,CAAC,MAAO,IAAM;AAAA,QACxB,SAAS,CAAC,MAAO,IAAM;AAAA,MACzB;AAAA,MACA,UAAU;AAAA,QACR,UAAU,CAAC,MAAO,IAAM;AAAA,QACxB,SAAS,CAAC,MAAO,IAAM;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA,EACA,cAAc,CAAC,KAAa,WAAqB;AAC/C,QAAI,UAAU,OAAO,WAAW,GAAG;AACjC,UAAI,QAAQ,QAAQ;AAClB,eAAO,OAAO,CAAC;AAAA,MACjB,OAAO;AACL,eAAO,OAAO,CAAC;AAAA,MACjB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACF;",
4
+ "sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nexport const CONSOLE_API_USER_ID = 'console-api'\nexport const TEMPORARY_CLUSTER_NAME = 'Get Started'\nexport type Stage = 'local' | 'dev' | 'int' | 'prod'\nexport const HOTBACKUP_MIN_CREATE_PERIOD = 1000 * 60 * 60 * 0.25 // 15 minutes\n\nexport const SECRETS_MAX_LENGTH = 4096\nexport const FIRSTNAME_LASTNAME_MAX_LENGTH = 255\n\nexport const STARTING_PRICE_PER_MONTH_IN_EURO = 99\n\nexport const MAX_LENGTH_CLUSTER_NAME = 50\n\nexport const NAMES_OF_ENTERPRISE_SALESPLANS_WITH_SLEEPING_CLUSTERS = [\n 'CELP with sleeping clusters',\n 'Camunda Partner',\n]\n\nexport const MINIMUM_EYEPAIRS = {\n CLUSTER_DELETION: 3,\n CLUSTER_GENERATION_UPDATE: 2,\n CLUSTER_PLAN_UPDATE: 2,\n CLUSTER_PLAN_TYPE_UPDATE: 2,\n CLUSTER_PLAN_MODIFICATION: 1,\n CLUSTER_MODIFICATION: 1,\n}\n\nexport const MAX_HARDWARE_PACKAGE_COUNT = 4\n\n/**\n * Minimum cluster (zeebe) version for the Optimize data-filters feature. Shared by\n * the c4 settings tile, the new-cluster default, and CRD spec generation so the gate\n * stays consistent. Stricter than the operator's own gate (Camunda >= 8.9.0-alpha1,\n * where the exporter starts honoring the filters) \u2014 this is the product rollout gate.\n */\nexport const OPTIMIZE_FILTERING_MIN_VERSION = '8.10.0-alpha1'\n"],
5
+ "mappings": "AAMO,MAAM,sBAAsB;AAC5B,MAAM,yBAAyB;AAE/B,MAAM,8BAA8B,MAAO,KAAK,KAAK;AAErD,MAAM,qBAAqB;AAC3B,MAAM,gCAAgC;AAEtC,MAAM,mCAAmC;AAEzC,MAAM,0BAA0B;AAEhC,MAAM,wDAAwD;AAAA,EACnE;AAAA,EACA;AACF;AAEO,MAAM,mBAAmB;AAAA,EAC9B,kBAAkB;AAAA,EAClB,2BAA2B;AAAA,EAC3B,qBAAqB;AAAA,EACrB,0BAA0B;AAAA,EAC1B,2BAA2B;AAAA,EAC3B,sBAAsB;AACxB;AAEO,MAAM,6BAA6B;AAQnC,MAAM,iCAAiC;",
6
6
  "names": []
7
7
  }
@@ -18,4 +18,9 @@ export interface BackupDto {
18
18
  * backup has no `generationUuid` at all (legacy backups).
19
19
  */
20
20
  generationName?: string;
21
+ /**
22
+ * Link to the incident Slack channel, from the `incident-link` annotation
23
+ * on the Backup CR. Only set on internal (incident) backups.
24
+ */
25
+ incidentLink?: string;
21
26
  }
@@ -7,4 +7,9 @@ export interface ClusterPlanDto {
7
7
  createdBy?: string;
8
8
  createdByName?: string;
9
9
  performanceExpectations?: string | null;
10
+ /**
11
+ * Number of clusters on this plan. Populated by the list endpoint
12
+ * (`GET api/plans`); absent on responses that don't compute it.
13
+ */
14
+ clusterCount?: number;
10
15
  }
@@ -1,5 +1,6 @@
1
1
  import type { ClusterPlanTypeCategory } from '../types/ClusterPlanTypeCategory.type.js';
2
2
  import type { ClusterPlanDto } from './ClusterPlan.dto.js';
3
+ import type { ClusterLimits } from './SalesPlan.dto.js';
3
4
  export interface ClusterPlanTypeDto {
4
5
  uuid: string;
5
6
  name: string;
@@ -12,4 +13,9 @@ export interface ClusterPlanTypeDto {
12
13
  availabilityClass?: string;
13
14
  deprecated?: boolean;
14
15
  category: ClusterPlanTypeCategory;
16
+ /**
17
+ * Per-component data-retention overrides, set via the Set Limits action.
18
+ * Returned by the plan-type endpoints (the entity column is `@Expose`d).
19
+ */
20
+ limits?: ClusterLimits;
15
21
  }
@@ -75,7 +75,12 @@ export interface CommonClusterDto {
75
75
  connectorsUrl?: string;
76
76
  conditions?: Array<{
77
77
  type: string;
78
+ /** k8s condition status: 'True' | 'False' | 'Unknown'. Present on the wire
79
+ * (the operator sets it); consumers use it to tell an active condition from
80
+ * a resolved one rather than relying on presence/absence alone. */
81
+ status?: string;
78
82
  reason?: string;
83
+ message?: string;
79
84
  lastTransitionTime?: string;
80
85
  }>;
81
86
  updateClusterStatus?: {
@@ -105,6 +110,17 @@ export interface CommonClusterDto {
105
110
  * completed. Failover is only offered when this is true.
106
111
  */
107
112
  secondaryBucketSyncCompleted?: boolean;
113
+ /**
114
+ * True once this cluster's reservation slot has been transferred to a
115
+ * failover cluster. It remains visible but can never be resumed again.
116
+ */
117
+ isFailoverSource?: boolean;
118
+ /**
119
+ * Stable durable identity shared by both halves of a failover pair. Used to
120
+ * pair a failover cluster with its source, and to derive the pre-staged
121
+ * `clone-backup-<stableId>` IAM role ARN.
122
+ */
123
+ stableId?: string;
108
124
  encryption?: string;
109
125
  primaryEncryptionKeyId?: string | null;
110
126
  secondaryEncryptionKeyId?: string | null;
@@ -138,6 +154,8 @@ export interface CommonClusterDto {
138
154
  planType: ClusterPlanTypeDto;
139
155
  numberOfAllocatedHwPackages?: number;
140
156
  restoreInProgress?: boolean;
157
+ restoreFailed?: boolean;
158
+ failedRestoreId?: string;
141
159
  overrideEnvVars?: {
142
160
  zeebeBroker: string | undefined;
143
161
  zeebeGateway: string | undefined;
@@ -39,17 +39,28 @@ export interface OrgListItemV2Dto {
39
39
  created: string;
40
40
  internal: boolean;
41
41
  salesPlanType?: SalesPlanType;
42
+ /** Concrete plan name (`SalesPlan.name`), distinct from the tier `salesPlanType`. */
43
+ salesPlanName?: string;
42
44
  salesForceId?: string;
43
- /** Batched per page (spec §9.4 B3); absent if the count lookup failed. */
44
- clusterCount?: number;
45
45
  }
46
46
  export interface ListOrganizationsV2Params extends CursorParams {
47
47
  q?: string;
48
+ /**
49
+ * Lucene-style query over the org fields (see `ORGANIZATION_SEARCH_FIELDS`).
50
+ * ANDed with `q`/`filter` server-side; a bare term behaves like `q`.
51
+ */
52
+ query?: string;
48
53
  sort?: 'name' | 'created' | 'internal';
49
54
  order?: 'asc' | 'desc';
50
55
  filter?: {
51
56
  internal?: boolean;
52
- salesPlanType?: SalesPlanType;
57
+ /** Sales plan tiers (`SalesPlanType`); multi-select, matched with `IN (...)`. */
58
+ salesPlanTypes?: SalesPlanType[];
59
+ /**
60
+ * Concrete plan names (`SalesPlan.name`, distinct from the tier); backs the
61
+ * "Sales plan name" filter. Multi-select, matched with `IN (...)`.
62
+ */
63
+ salesPlanNames?: string[];
53
64
  /** ISO-8601 lower bound on `created` (age-bucket filters). */
54
65
  createdAfter?: string;
55
66
  /** ISO-8601 upper bound on `created` (age-bucket filters). */
@@ -87,7 +98,10 @@ export interface ClusterListItemV2Dto {
87
98
  orgName: string;
88
99
  /** Normalized server-side; augmented on the fly from the K8s watcher (§9.4 B1). */
89
100
  status: string;
90
- plan: string;
101
+ /** Plan type name (`ClusterPlanType.name`). Backs the "Plan type" column. */
102
+ planTypeName: string;
103
+ /** Concrete plan name (`ClusterPlan.name`). Backs the "Plan" column. */
104
+ planName?: string;
91
105
  generation: string;
92
106
  region: string;
93
107
  /** Display-only; not a sort/filter key (§9.4 B2). */
@@ -104,18 +118,52 @@ export interface ClusterListItemV2Dto {
104
118
  export type ClusterDetailV2Dto = ClusterListItemV2Dto;
105
119
  export interface ListClustersV2Params extends CursorParams {
106
120
  q?: string;
107
- sort?: 'name' | 'created';
121
+ /**
122
+ * Lucene-style query over the cluster fields (see `CLUSTER_SEARCH_FIELDS`).
123
+ * ANDed with `q`/`filter` server-side; a bare term behaves like `q`.
124
+ */
125
+ query?: string;
126
+ /**
127
+ * Server-side sort key. Beyond `name`/`created`, the clusters list also sorts
128
+ * by the DB-backed columns behind these list columns (the values are the
129
+ * frontend column `key`s, mapped to SQL expressions in the controller):
130
+ * `orgName` (owner id), `autoUpdate`, `planName`, `planTypeName`, `generation`,
131
+ * `channel`. `status`/`region` are intentionally excluded — they're computed
132
+ * from live K8s state / context config, not SQL columns.
133
+ */
134
+ sort?: 'name' | 'created' | 'orgName' | 'autoUpdate' | 'planName' | 'planTypeName' | 'generation' | 'channel';
108
135
  order?: 'asc' | 'desc';
109
136
  filter?: {
110
137
  status?: string;
111
- /** Cluster plan TYPE name (maps to `planType.name`; legacy param name). */
138
+ /**
139
+ * Cluster plan TYPE name (maps to `planType.name`; legacy single-value
140
+ * param, still used by the plan-type detail page's cluster-distribution
141
+ * read — kept alongside `planTypeNames` rather than replaced).
142
+ */
112
143
  plan?: string;
113
- /** Cluster plan name (the concrete `plan.name`, not the type). */
114
- planName?: string;
115
- generation?: string;
116
- region?: string;
117
- /** Cloud provider (resolved via the k8s-context config, like `region`). */
118
- provider?: string;
144
+ /**
145
+ * Restrict to these plan TYPE names (`planType.name`); the Control
146
+ * clusters list's multi-select "Plan type" filter.
147
+ */
148
+ planTypeNames?: string[];
149
+ /**
150
+ * Restrict to these concrete plan names (`plan.name`, the `ClusterPlan`
151
+ * entity — NOT the plan type); backs the Control clusters list's "Plan"
152
+ * filter, whose dropdown is sourced from `ClusterPlan` via
153
+ * `/clusters/parameters`. Corrected in #9325 (second pass): a prior fix
154
+ * on this branch mistakenly repointed this at `planType.name` to match a
155
+ * dropdown that was, at the time, wrongly sourced from `ClusterPlanType`
156
+ * — but the dropdown was the actual bug. Both the dropdown and this query
157
+ * now consistently reference `ClusterPlan`. Distinct from `planTypeNames`
158
+ * above, which is the separate "Plan type" filter over `ClusterPlanType`.
159
+ */
160
+ planNames?: string[];
161
+ /** Restrict to these generation names (`generation.name`). */
162
+ generationNames?: string[];
163
+ /** Restrict to these region names (resolved via the k8s-context config). */
164
+ regions?: string[];
165
+ /** Restrict to these cloud providers (resolved via the k8s-context config). */
166
+ providers?: string[];
119
167
  /** Exact k8s context uuid. */
120
168
  k8sContext?: string;
121
169
  orgId?: string;
@@ -134,8 +182,8 @@ export interface ListClustersV2Params extends CursorParams {
134
182
  * "8.7" matches zeebe 8.7.x).
135
183
  */
136
184
  minorVersion?: string;
137
- /** Release channel name. */
138
- channel?: string;
185
+ /** Restrict to these release channel names. */
186
+ channels?: string[];
139
187
  /** ISO-8601 lower bound on `created` (e.g. "created in the last 7 days"). */
140
188
  createdAfter?: string;
141
189
  };
@@ -33,6 +33,12 @@ export interface K8sContext {
33
33
  project_id?: string;
34
34
  project_name?: string;
35
35
  tsuga_cluster_id?: string;
36
+ /**
37
+ * Number of clusters on this context. Set by `GET api/admin/k8sContexts` only
38
+ * when queried with `withClusterCounts` (requires the `multiCluster.admin`
39
+ * permission); absent otherwise.
40
+ */
41
+ clusterCount?: number;
36
42
  }
37
43
  export interface K8sConfig {
38
44
  kubernetes_context: {
@@ -15,6 +15,8 @@ export interface OrganizationMetadata {
15
15
  tenantKey: string;
16
16
  teamId: string;
17
17
  created: number;
18
+ /** Epoch ms of the last key rotation — set when the tenant key is regenerated. */
19
+ updated?: number;
18
20
  };
19
21
  }
20
22
  export interface AutoJoinAssignment {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/dtos/Organization.dto.ts"],
4
- "sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nimport type { OrganizationPermissions } from '../types/OrganizationPermission.type.js'\nimport type { SalesPlanType } from '../types/SalesPlanType.type.js'\nimport type { OrganizationToSalesPlanDto } from './OrganizationToSalesPlan.dto.js'\n\nexport type LicensingModelType = 'legacy' | '2025'\n\nexport const VALID_LICENSING_MODELS: readonly LicensingModelType[] = [\n 'legacy',\n '2025',\n] as const\n\nexport const LICENSING_MODEL_DISPLAY_NAMES: Record<LicensingModelType, string> =\n {\n legacy: 'Legacy (PI, DI, TU)',\n '2025': '2025 (PI+Tenant)',\n } as const\n\nexport interface OrganizationMetadata {\n clickedRequestPaidPlan?: boolean\n salesForceId?: string\n enterpriseDevOnly?: boolean\n awsOnly?: boolean\n licensingModel?: LicensingModelType\n autoJoin?: AutoJoinAssignment\n llm?: {\n tenantKey: string\n teamId: string\n created: number\n }\n}\n\nexport interface AutoJoinAssignment {\n departments: Array<{ hibobId: string; roles: string[] }>\n divisions: Array<{ hibobId: string; roles: string[] }>\n subdivisions: Array<{ hibobId: string; roles: string[] }>\n}\nexport interface OrganizationDto {\n uuid: string\n name: string\n organizationToSalesPlan?: OrganizationToSalesPlanDto\n permissions?: OrganizationPermissions\n metadata?: OrganizationMetadata\n created: Date\n internal: boolean\n}\n\nexport interface OrgOwner {\n owner: string\n email: string\n first: string\n last: string\n}\n\nexport interface OrgWithNameAndSalesPlan {\n uuid: string\n name: string | undefined\n salesPlanName: string | undefined\n salesPlanUuid: string | undefined\n salesPlanType: SalesPlanType | undefined\n}\n"],
4
+ "sourcesContent": ["/*\n * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH\n * under one or more contributor license agreements. Licensed under a commercial license.\n * You may not use this file except in compliance with the commercial license.\n */\n\nimport type { OrganizationPermissions } from '../types/OrganizationPermission.type.js'\nimport type { SalesPlanType } from '../types/SalesPlanType.type.js'\nimport type { OrganizationToSalesPlanDto } from './OrganizationToSalesPlan.dto.js'\n\nexport type LicensingModelType = 'legacy' | '2025'\n\nexport const VALID_LICENSING_MODELS: readonly LicensingModelType[] = [\n 'legacy',\n '2025',\n] as const\n\nexport const LICENSING_MODEL_DISPLAY_NAMES: Record<LicensingModelType, string> =\n {\n legacy: 'Legacy (PI, DI, TU)',\n '2025': '2025 (PI+Tenant)',\n } as const\n\nexport interface OrganizationMetadata {\n clickedRequestPaidPlan?: boolean\n salesForceId?: string\n enterpriseDevOnly?: boolean\n awsOnly?: boolean\n licensingModel?: LicensingModelType\n autoJoin?: AutoJoinAssignment\n llm?: {\n tenantKey: string\n teamId: string\n created: number\n /** Epoch ms of the last key rotation \u2014 set when the tenant key is regenerated. */\n updated?: number\n }\n}\n\nexport interface AutoJoinAssignment {\n departments: Array<{ hibobId: string; roles: string[] }>\n divisions: Array<{ hibobId: string; roles: string[] }>\n subdivisions: Array<{ hibobId: string; roles: string[] }>\n}\nexport interface OrganizationDto {\n uuid: string\n name: string\n organizationToSalesPlan?: OrganizationToSalesPlanDto\n permissions?: OrganizationPermissions\n metadata?: OrganizationMetadata\n created: Date\n internal: boolean\n}\n\nexport interface OrgOwner {\n owner: string\n email: string\n first: string\n last: string\n}\n\nexport interface OrgWithNameAndSalesPlan {\n uuid: string\n name: string | undefined\n salesPlanName: string | undefined\n salesPlanUuid: string | undefined\n salesPlanType: SalesPlanType | undefined\n}\n"],
5
5
  "mappings": "AAYO,MAAM,yBAAwD;AAAA,EACnE;AAAA,EACA;AACF;AAEO,MAAM,gCACX;AAAA,EACE,QAAQ;AAAA,EACR,QAAQ;AACV;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,51 @@
1
+ export type SanitySeverity = 'error' | 'warning';
2
+ /**
3
+ * Machine-applicable fix proposal attached to a violation. Edge fixes mutate
4
+ * `generationUuid`'s upgradeableFrom list; `edgeUuid` is the entry to
5
+ * add/remove. Names ride along for human-readable review UI.
6
+ */
7
+ export type SanityFix = {
8
+ type: 'remove-upgrade-edge';
9
+ generationUuid: string;
10
+ generationName: string;
11
+ edgeUuid: string;
12
+ edgeName: string;
13
+ } | {
14
+ type: 'add-upgrade-edge';
15
+ generationUuid: string;
16
+ generationName: string;
17
+ edgeUuid: string;
18
+ edgeName: string;
19
+ } | {
20
+ type: 'delete-generation';
21
+ generationUuid: string;
22
+ generationName: string;
23
+ /** When set, the delete must not be offered as selectable (e.g. clusters still run it). */
24
+ blockedReason?: string;
25
+ };
26
+ export interface SanityViolation {
27
+ ruleId: string;
28
+ severity: SanitySeverity;
29
+ message: string;
30
+ generationUuid?: string;
31
+ generationName?: string;
32
+ details?: Record<string, unknown>;
33
+ fix?: SanityFix;
34
+ }
35
+ export interface SanityRuleInfo {
36
+ id: string;
37
+ title: string;
38
+ severity: SanitySeverity;
39
+ }
40
+ export interface ReleaseTrainSanityReport {
41
+ /** ISO 8601 timestamp of when the check ran. */
42
+ checkedAt: string;
43
+ summary: {
44
+ errors: number;
45
+ warnings: number;
46
+ rules: number;
47
+ };
48
+ /** The rules that ran, in order. */
49
+ rules: SanityRuleInfo[];
50
+ violations: SanityViolation[];
51
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=ReleaseTrainSanity.dto.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -27,6 +27,17 @@ export interface ClusterLimits {
27
27
  export interface Limits extends ClusterLimits {
28
28
  maxMembers?: number;
29
29
  hotBackup?: boolean;
30
+ /**
31
+ * Overrides the operator's default retained count (3) for manual (on-demand)
32
+ * hot backups (ZeebeCluster spec.backup.retainedCount).
33
+ */
34
+ hotBackupManualRetainedCount?: number;
35
+ /**
36
+ * Overrides the operator's default retained count (3) for scheduled hot
37
+ * backups (BackupSchedule spec.successfulBackupsHistoryLimit /
38
+ * failedBackupsHistoryLimit).
39
+ */
40
+ hotBackupScheduledRetainedCount?: number;
30
41
  ipWhiteList?: boolean;
31
42
  secureConnectivity?: boolean;
32
43
  failover?: boolean;
@@ -71,6 +71,20 @@ function allSalesPlanLimits() {
71
71
  description: "used to activate the hot backup functionality in organizations. default = not active",
72
72
  isClusterBasedLimit: false
73
73
  },
74
+ {
75
+ key: "hotBackupManualRetainedCount",
76
+ type: "number",
77
+ description: "overrides how many manual (on-demand) hot backups the operator retains before deleting the oldest. default = 3",
78
+ isClusterBasedLimit: false,
79
+ validate: (input) => Number.isInteger(input) && input >= 1
80
+ },
81
+ {
82
+ key: "hotBackupScheduledRetainedCount",
83
+ type: "number",
84
+ description: "overrides how many scheduled hot backups the operator retains before deleting the oldest. default = 3",
85
+ isClusterBasedLimit: false,
86
+ validate: (input) => Number.isInteger(input) && input >= 1
87
+ },
74
88
  {
75
89
  key: "ipWhiteList",
76
90
  type: "boolean",