@camunda/ccma-shared-types 7.5.0 → 7.7.0

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 (31) hide show
  1. package/dist/_tests/utils/jvmOptions.spec.d.ts +1 -0
  2. package/dist/approvals/use-cases.const.d.ts +53 -0
  3. package/dist/approvals/use-cases.const.js +27 -1
  4. package/dist/approvals/use-cases.const.js.map +2 -2
  5. package/dist/dtos/ClusterPlanTypeChange.dto.d.ts +60 -0
  6. package/dist/dtos/ControlV2.dto.d.ts +49 -0
  7. package/dist/dtos/ControlV2.dto.js +9 -0
  8. package/dist/dtos/ControlV2.dto.js.map +3 -3
  9. package/dist/dtos/GenerationVersionsChange.dto.d.ts +51 -0
  10. package/dist/dtos/GenerationVersionsChange.dto.js +1 -0
  11. package/dist/dtos/GenerationVersionsChange.dto.js.map +7 -0
  12. package/dist/dtos/M2mTokenCount.dto.d.ts +41 -0
  13. package/dist/dtos/M2mTokenCount.dto.js +1 -0
  14. package/dist/dtos/M2mTokenCount.dto.js.map +7 -0
  15. package/dist/index.d.ts +11 -6
  16. package/dist/index.js +52 -0
  17. package/dist/index.js.map +2 -2
  18. package/dist/permissions/profile.permissions.js +7 -5
  19. package/dist/permissions/profile.permissions.js.map +2 -2
  20. package/dist/search/cluster-search-fields.js +24 -0
  21. package/dist/search/cluster-search-fields.js.map +2 -2
  22. package/dist/search/organization-search-fields.js +8 -0
  23. package/dist/search/organization-search-fields.js.map +2 -2
  24. package/dist/types/C8ClusterComponentVersions.type.d.ts +10 -0
  25. package/dist/types/C8ClusterComponentVersions.type.js +5 -0
  26. package/dist/types/C8ClusterComponentVersions.type.js.map +2 -2
  27. package/dist/types/ClusterUsageMetrics.type.d.ts +22 -0
  28. package/dist/utils/jvmOptions.d.ts +80 -0
  29. package/dist/utils/jvmOptions.js +120 -0
  30. package/dist/utils/jvmOptions.js.map +7 -0
  31. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ export {};
@@ -37,6 +37,8 @@ export declare const APPROVAL_USE_CASE_TYPES: {
37
37
  readonly createPersonalOrganisation: "create-personal-organisation";
38
38
  readonly createCustomHardwareSizing: "create-custom-hardware-sizing";
39
39
  readonly removeCustomHardwareSizing: "remove-custom-hardware-sizing";
40
+ readonly changeGenerationVersions: "change-generation-versions";
41
+ readonly automatedEnterpriseOnboarding: "automated-enterprise-onboarding";
40
42
  readonly createCustomGeneration: "create-custom-generation";
41
43
  readonly removeCustomGeneration: "remove-custom-generation";
42
44
  readonly onboardToEnterprise: "onboard-to-enterprise";
@@ -136,6 +138,35 @@ export declare const USER_METADATA_MAX_LENGTH = 16000;
136
138
  * bound, because the request keeps the copy in its row.
137
139
  */
138
140
  export declare const USER_METADATA_EXPECTED_MAX_LENGTH = 500000;
141
+ /**
142
+ * The bounds of an automated-enterprise-onboarding request.
143
+ *
144
+ * The accounts wizard holds the first four, and the schema of control-backend
145
+ * and the form of control-frontend read them here, so the form never sends
146
+ * what the service refuses.
147
+ */
148
+ export declare const ENTERPRISE_ONBOARDING_NAME_MAX_LENGTH = 50;
149
+ export declare const ENTERPRISE_ONBOARDING_SFDC_ID_MAX_LENGTH = 50;
150
+ export declare const ENTERPRISE_ONBOARDING_TERM_MIN_MONTHS = 1;
151
+ export declare const ENTERPRISE_ONBOARDING_TERM_MAX_MONTHS = 60;
152
+ /** The most of one value metric that a contract includes. */
153
+ export declare const ENTERPRISE_ONBOARDING_METRIC_MAX = 1000000000000;
154
+ /**
155
+ * The most clusters of one plan type that an onboarding reserves: the cap of
156
+ * the accounts wizard. Accounts checks the limit of the plan only when it
157
+ * reserves, after it created the two organizations, so the request must not
158
+ * carry a count that the plan refuses.
159
+ */
160
+ export declare const ENTERPRISE_ONBOARDING_RESERVATION_MAX = 20;
161
+ /**
162
+ * Whether a string is a calendar day, `YYYY-MM-DD`, that exists.
163
+ *
164
+ * The shape alone is not enough: `Date` rolls `2026-02-30` to March 2 with
165
+ * no error, and `2026-13-45` becomes an invalid date that a database refuses
166
+ * only at the write. A request carries the day for days before it runs, so
167
+ * the check is at the open, and in the form.
168
+ */
169
+ export declare const isCalendarDay: (value: string) => boolean;
139
170
  /** The longest email address that a change-user-email request carries. */
140
171
  export declare const APPROVAL_EMAIL_MAX_LENGTH = 320;
141
172
  /**
@@ -146,3 +177,25 @@ export declare const APPROVAL_EMAIL_MAX_LENGTH = 320;
146
177
  * and a form never sends an address that the service refuses.
147
178
  */
148
179
  export declare const APPROVAL_EMAIL_PATTERN: RegExp;
180
+ /**
181
+ * The most generations that one change-generation-versions request changes.
182
+ *
183
+ * Each generation restarts every cluster on it. A request over more
184
+ * generations than this is a request that no approver reads to the end.
185
+ *
186
+ * The two bounds of this use case also keep a request under the body limit
187
+ * of control-backend (1 MiB, `server-options.ts` of the shared Fastify
188
+ * layer): 20 generations, each with the expected value of the 2 image
189
+ * versions of 2000 characters, is 80 000 characters before the rest of the
190
+ * payload.
191
+ */
192
+ export declare const GENERATION_VERSIONS_MAX_GENERATIONS = 20;
193
+ /**
194
+ * The longest value of one mutable version of a generation.
195
+ *
196
+ * An image reference is short, and only the two image versions go through
197
+ * the use case (`GENERATION_IMAGE_VERSION_KEYS`). The bound keeps a request
198
+ * readable for the approver. See `GENERATION_VERSIONS_MAX_GENERATIONS` for
199
+ * the sum.
200
+ */
201
+ export declare const GENERATION_VERSION_VALUE_MAX_LENGTH = 2000;
@@ -33,6 +33,14 @@ const APPROVAL_USE_CASE_TYPES = {
33
33
  // use cases of custom hardware sizing.
34
34
  createCustomHardwareSizing: "create-custom-hardware-sizing",
35
35
  removeCustomHardwareSizing: "remove-custom-hardware-sizing",
36
+ // The mutable versions of one or more generations, behind
37
+ // `control.changeGenerationVersions`. Console restarts every cluster of
38
+ // each generation, which is why the write needs a second Camundi.
39
+ changeGenerationVersions: "change-generation-versions",
40
+ // A new enterprise customer: a production and a development organization
41
+ // in one step, behind `control.automatedEnterpriseOnboarding`. See
42
+ // `automated-enterprise-onboarding.ts` in control-backend.
43
+ automatedEnterpriseOnboarding: "automated-enterprise-onboarding",
36
44
  // Open to every Camundi, runs on dev only, and needs no approval. The two
37
45
  // use cases of custom generations.
38
46
  createCustomGeneration: "create-custom-generation",
@@ -66,18 +74,35 @@ const PURGE_USERS_REQUIRED_PERMISSIONS = [
66
74
  ];
67
75
  const USER_METADATA_MAX_LENGTH = 16e3;
68
76
  const USER_METADATA_EXPECTED_MAX_LENGTH = 5e5;
77
+ const ENTERPRISE_ONBOARDING_NAME_MAX_LENGTH = 50;
78
+ const ENTERPRISE_ONBOARDING_SFDC_ID_MAX_LENGTH = 50;
79
+ const ENTERPRISE_ONBOARDING_TERM_MIN_MONTHS = 1;
80
+ const ENTERPRISE_ONBOARDING_TERM_MAX_MONTHS = 60;
81
+ const ENTERPRISE_ONBOARDING_METRIC_MAX = 1e12;
82
+ const ENTERPRISE_ONBOARDING_RESERVATION_MAX = 20;
83
+ const isCalendarDay = (value) => /^\d{4}-\d{2}-\d{2}$/.test(value) && !Number.isNaN(Date.parse(value)) && new Date(value).toISOString().startsWith(value);
69
84
  const APPROVAL_EMAIL_MAX_LENGTH = 320;
70
85
  const APPROVAL_EMAIL_PATTERN = (
71
86
  // biome-ignore lint/complexity/noUselessEscapeInRegex: the same source as zod, character for character
72
87
  /^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/
73
88
  );
89
+ const GENERATION_VERSIONS_MAX_GENERATIONS = 20;
90
+ const GENERATION_VERSION_VALUE_MAX_LENGTH = 2e3;
74
91
  export {
75
92
  APPROVAL_EMAIL_MAX_LENGTH,
76
93
  APPROVAL_EMAIL_PATTERN,
77
94
  APPROVAL_USE_CASE_TYPES,
95
+ ENTERPRISE_ONBOARDING_METRIC_MAX,
96
+ ENTERPRISE_ONBOARDING_NAME_MAX_LENGTH,
97
+ ENTERPRISE_ONBOARDING_RESERVATION_MAX,
98
+ ENTERPRISE_ONBOARDING_SFDC_ID_MAX_LENGTH,
99
+ ENTERPRISE_ONBOARDING_TERM_MAX_MONTHS,
100
+ ENTERPRISE_ONBOARDING_TERM_MIN_MONTHS,
78
101
  EXTEND_TRIAL_MAX_DAYS,
79
102
  EXTEND_TRIAL_MIN_DAYS,
80
103
  FEATURE_FLAG_MIN_ACKS_PROD,
104
+ GENERATION_VERSIONS_MAX_GENERATIONS,
105
+ GENERATION_VERSION_VALUE_MAX_LENGTH,
81
106
  ORG_LIMIT_TEXT_MAX_LENGTH,
82
107
  PERSONAL_ORGANIZATION_MAX_PER_REQUESTER,
83
108
  PERSONAL_ORGANIZATION_NAME_MAX_LENGTH,
@@ -86,6 +111,7 @@ export {
86
111
  PURGE_USERS_MAX_USERS,
87
112
  PURGE_USERS_REQUIRED_PERMISSIONS,
88
113
  USER_METADATA_EXPECTED_MAX_LENGTH,
89
- USER_METADATA_MAX_LENGTH
114
+ USER_METADATA_MAX_LENGTH,
115
+ isCalendarDay
90
116
  };
91
117
  //# sourceMappingURL=use-cases.const.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/approvals/use-cases.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\nimport { AccountsPermissions } from '../permissions/accounts.permissions.js'\n\n/**\n * The names and the value ranges of the registered use cases.\n *\n * control-backend owns the registry, and a frontend reads it at run time\n * (`GET /api/approvals/use-cases`). Two things cannot wait for that answer:\n *\n * - **The identifier**, because a caller must NAME a use case to find it in the\n * registry, and to open a request of it.\n * - **The range of a payload field**, because a form holds the value before any\n * call goes out.\n *\n * Both live here, so the schema of the service and the form of the browser can\n * never hold different numbers.\n */\n\n/** The identifier of each use case, on the wire and in the table. */\nexport const APPROVAL_USE_CASE_TYPES = {\n sendToExpiredTrial: 'send-to-expired-trial',\n extendTrial: 'extend-trial',\n moveClusterOrg: 'move-cluster-org',\n // One use case for each type of a cluster bulk operation. The types need\n // different permissions and different approval counts, and a use case holds\n // one of each. See `cluster-bulk-operation.ts` beside this file.\n clusterBulkGenerationUpdate: 'cluster-bulk-generation-update',\n clusterBulkPlanUpdate: 'cluster-bulk-plan-update',\n clusterBulkPlanTypeUpdate: 'cluster-bulk-plan-type-update',\n clusterBulkSleepWakeup: 'cluster-bulk-sleep-wakeup',\n clusterBulkDeletion: 'cluster-bulk-deletion',\n clusterBulkSpecUpdate: 'cluster-bulk-spec-update',\n // The second group, behind `control.approvalAdminActions`.\n changePlatformRoles: 'change-platform-roles',\n deleteInternalBackup: 'delete-internal-backup',\n changeOrgLimits: 'change-org-limits',\n deleteSsoConnection: 'delete-sso-connection',\n changeSalesPlan: 'change-sales-plan',\n // The third group, behind `control.approvalAccountActions`.\n deleteOrganization: 'delete-organization',\n deleteUser: 'delete-user',\n changeUserEmail: 'change-user-email',\n purgeUsers: 'purge-users',\n updateUserMetadata: 'update-user-metadata',\n // A change of the feature flag table, on a stage where\n // `isFeatureFlagApprovalRequired` is true.\n changeFeatureFlag: 'change-feature-flag',\n // Open to every Camundi, and it needs no approval on any stage.\n createPersonalOrganisation: 'create-personal-organisation',\n // Open to every Camundi, runs on dev only, and needs no approval. The two\n // use cases of custom hardware sizing.\n createCustomHardwareSizing: 'create-custom-hardware-sizing',\n removeCustomHardwareSizing: 'remove-custom-hardware-sizing',\n // Open to every Camundi, runs on dev only, and needs no approval. The two\n // use cases of custom generations.\n createCustomGeneration: 'create-custom-generation',\n removeCustomGeneration: 'remove-custom-generation',\n // The enterprise onboarding of one organization, behind\n // `control.onboardToEnterpriseApproval`: the contract, the plan type of\n // each cluster, and the reservations, in one request.\n onboardToEnterprise: 'onboard-to-enterprise',\n // The plan type and the hardware packages of ONE cluster, behind\n // `control.changeClusterPlanType`. The bulk plan type update beside it\n // checks no reservation and moves no cluster plan, so this one is not a\n // duplicate of it. See `change-cluster-plan-type.ts` in control-backend.\n changeClusterPlanType: 'change-cluster-plan-type',\n // The deletion of one cluster whose TTL ran out. Only the delete cron of\n // console-backend opens it, and it needs no approval. It is a record of the\n // deletion. See `cluster-ttl-deletion.ts` in control-backend.\n clusterTtlDeletion: 'cluster-ttl-deletion',\n} as const\n\n/**\n * The approvals that a change of the feature flag table needs on prod.\n *\n * A flag there turns a feature on or off for every customer, and a person who\n * holds `aafw` could do it alone. Two other Camundis stand in every change,\n * the same floor as a cluster bulk operation on prod\n * (`CLUSTER_BULK_OPERATION_MIN_ACKS`). Int needs one.\n */\nexport const FEATURE_FLAG_MIN_ACKS_PROD = 2\n\n/**\n * The most personal organizations that one Camundi can request.\n *\n * The request runs with no approval, so this cap is the only guard against a\n * loop that creates organizations without end. It counts the requests that a\n * Camundi opened, and a person who needs more asks a Camundi who holds\n * `AccountsPermissions.CREATE_ORG`.\n */\nexport const PERSONAL_ORGANIZATION_MAX_PER_REQUESTER = 10\n\n/** The shortest and longest name of a personal organization. */\nexport const PERSONAL_ORGANIZATION_NAME_MIN_LENGTH = 3\nexport const PERSONAL_ORGANIZATION_NAME_MAX_LENGTH = 100\n\nexport type ApprovalUseCaseType =\n (typeof APPROVAL_USE_CASE_TYPES)[keyof typeof APPROVAL_USE_CASE_TYPES]\n\n/**\n * The shortest extension that accounts-backend accepts.\n *\n * `POST /:orgId/extendtrial` refuses a date that is less than 14 days away\n * when the body carries `onBehalfOf`, and it measures those 14 days when the\n * CALL arrives. The floor here is 15 and not 14, for two reasons:\n *\n * - The two clocks are not the same instant. Accounts builds its own \"14 days\n * from now\" a few milliseconds after control-backend builds the date, so a\n * date of exactly 14 days is already in the past for the comparison.\n * - Accounts counts with `setDate`, which is calendar arithmetic. A change of\n * the daylight saving time moves its limit by an hour.\n */\nexport const EXTEND_TRIAL_MIN_DAYS = 15\n\n/**\n * The longest extension that accounts-backend accepts.\n *\n * The same route refuses a date more than 62 days away. 61 keeps the same\n * margin as the floor above.\n */\nexport const EXTEND_TRIAL_MAX_DAYS = 61\n\n/**\n * The most roles that one change-platform-roles request adds, or removes.\n *\n * The form of control-frontend offers every platform role, and a person who\n * gives a Camundi a new position rarely changes more than a few. A request with\n * more roles than this is a request that nobody reads before they approve it.\n */\nexport const PLATFORM_ROLE_CHANGE_MAX_ROLES = 10\n\n/**\n * The longest text value that one change-org-limits request writes.\n *\n * A text limit holds a short value, such as a list of regions. The bound keeps\n * a request readable for the person who approves it.\n */\nexport const ORG_LIMIT_TEXT_MAX_LENGTH = 2000\n\n/**\n * The most users that one purge-users request deletes.\n *\n * The God Mode purge deletes one user after the other, and Auth0 limits how\n * fast that goes. A list longer than this is also a list that no approver\n * reads before they agree.\n */\nexport const PURGE_USERS_MAX_USERS = 1000\n\n/**\n * What a person must hold to open or to approve a purge-users request.\n *\n * The purge of God Mode is behind `GOD_PURGE_USERS`, and each deletion calls a\n * route behind `DELETE_USER`. The use case of control-backend returns this\n * list from `permissionsFor`, and the form passes it to `canCreate`, so the\n * button and the server never disagree.\n */\nexport const PURGE_USERS_REQUIRED_PERMISSIONS: readonly string[] = [\n AccountsPermissions.GOD_PURGE_USERS,\n AccountsPermissions.DELETE_USER,\n]\n\n/**\n * The largest metadata object that one update-user-metadata request writes,\n * in characters of its JSON text.\n *\n * This is a bound of the product, and not the limit of Auth0, which is far\n * larger. The approvers read the whole object before they agree, and an\n * object that is longer than this is an object that nobody reads.\n */\nexport const USER_METADATA_MAX_LENGTH = 16_000\n\n/**\n * The largest metadata object that a request carries as the object that the\n * person who asked READ.\n *\n * It is larger than `USER_METADATA_MAX_LENGTH`, so a user whose metadata grew\n * past that bound can still get an edit that makes it smaller. It still has a\n * bound, because the request keeps the copy in its row.\n */\nexport const USER_METADATA_EXPECTED_MAX_LENGTH = 500_000\n\n/** The longest email address that a change-user-email request carries. */\nexport const APPROVAL_EMAIL_MAX_LENGTH = 320\n\n/**\n * The email addresses that a change-user-email request accepts.\n *\n * It is the email pattern of zod 4.6. The pattern is here, so the schema of\n * control-backend and the form of control-frontend accept the same addresses,\n * and a form never sends an address that the service refuses.\n */\nexport const APPROVAL_EMAIL_PATTERN =\n // biome-ignore lint/complexity/noUselessEscapeInRegex: the same source as zod, character for character\n /^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$/\n"],
5
- "mappings": "AAMA,SAAS,2BAA2B;AAkB7B,MAAM,0BAA0B;AAAA,EACrC,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIhB,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA;AAAA,EAEvB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA;AAAA,EAEjB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,oBAAoB;AAAA;AAAA;AAAA,EAGpB,mBAAmB;AAAA;AAAA,EAEnB,4BAA4B;AAAA;AAAA;AAAA,EAG5B,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA;AAAA;AAAA,EAG5B,wBAAwB;AAAA,EACxB,wBAAwB;AAAA;AAAA;AAAA;AAAA,EAIxB,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKrB,uBAAuB;AAAA;AAAA;AAAA;AAAA,EAIvB,oBAAoB;AACtB;AAUO,MAAM,6BAA6B;AAUnC,MAAM,0CAA0C;AAGhD,MAAM,wCAAwC;AAC9C,MAAM,wCAAwC;AAkB9C,MAAM,wBAAwB;AAQ9B,MAAM,wBAAwB;AAS9B,MAAM,iCAAiC;AAQvC,MAAM,4BAA4B;AASlC,MAAM,wBAAwB;AAU9B,MAAM,mCAAsD;AAAA,EACjE,oBAAoB;AAAA,EACpB,oBAAoB;AACtB;AAUO,MAAM,2BAA2B;AAUjC,MAAM,oCAAoC;AAG1C,MAAM,4BAA4B;AASlC,MAAM;AAAA;AAAA,EAEX;AAAA;",
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 { AccountsPermissions } from '../permissions/accounts.permissions.js'\n\n/**\n * The names and the value ranges of the registered use cases.\n *\n * control-backend owns the registry, and a frontend reads it at run time\n * (`GET /api/approvals/use-cases`). Two things cannot wait for that answer:\n *\n * - **The identifier**, because a caller must NAME a use case to find it in the\n * registry, and to open a request of it.\n * - **The range of a payload field**, because a form holds the value before any\n * call goes out.\n *\n * Both live here, so the schema of the service and the form of the browser can\n * never hold different numbers.\n */\n\n/** The identifier of each use case, on the wire and in the table. */\nexport const APPROVAL_USE_CASE_TYPES = {\n sendToExpiredTrial: 'send-to-expired-trial',\n extendTrial: 'extend-trial',\n moveClusterOrg: 'move-cluster-org',\n // One use case for each type of a cluster bulk operation. The types need\n // different permissions and different approval counts, and a use case holds\n // one of each. See `cluster-bulk-operation.ts` beside this file.\n clusterBulkGenerationUpdate: 'cluster-bulk-generation-update',\n clusterBulkPlanUpdate: 'cluster-bulk-plan-update',\n clusterBulkPlanTypeUpdate: 'cluster-bulk-plan-type-update',\n clusterBulkSleepWakeup: 'cluster-bulk-sleep-wakeup',\n clusterBulkDeletion: 'cluster-bulk-deletion',\n clusterBulkSpecUpdate: 'cluster-bulk-spec-update',\n // The second group, behind `control.approvalAdminActions`.\n changePlatformRoles: 'change-platform-roles',\n deleteInternalBackup: 'delete-internal-backup',\n changeOrgLimits: 'change-org-limits',\n deleteSsoConnection: 'delete-sso-connection',\n changeSalesPlan: 'change-sales-plan',\n // The third group, behind `control.approvalAccountActions`.\n deleteOrganization: 'delete-organization',\n deleteUser: 'delete-user',\n changeUserEmail: 'change-user-email',\n purgeUsers: 'purge-users',\n updateUserMetadata: 'update-user-metadata',\n // A change of the feature flag table, on a stage where\n // `isFeatureFlagApprovalRequired` is true.\n changeFeatureFlag: 'change-feature-flag',\n // Open to every Camundi, and it needs no approval on any stage.\n createPersonalOrganisation: 'create-personal-organisation',\n // Open to every Camundi, runs on dev only, and needs no approval. The two\n // use cases of custom hardware sizing.\n createCustomHardwareSizing: 'create-custom-hardware-sizing',\n removeCustomHardwareSizing: 'remove-custom-hardware-sizing',\n // The mutable versions of one or more generations, behind\n // `control.changeGenerationVersions`. Console restarts every cluster of\n // each generation, which is why the write needs a second Camundi.\n changeGenerationVersions: 'change-generation-versions',\n // A new enterprise customer: a production and a development organization\n // in one step, behind `control.automatedEnterpriseOnboarding`. See\n // `automated-enterprise-onboarding.ts` in control-backend.\n automatedEnterpriseOnboarding: 'automated-enterprise-onboarding',\n // Open to every Camundi, runs on dev only, and needs no approval. The two\n // use cases of custom generations.\n createCustomGeneration: 'create-custom-generation',\n removeCustomGeneration: 'remove-custom-generation',\n // The enterprise onboarding of one organization, behind\n // `control.onboardToEnterpriseApproval`: the contract, the plan type of\n // each cluster, and the reservations, in one request.\n onboardToEnterprise: 'onboard-to-enterprise',\n // The plan type and the hardware packages of ONE cluster, behind\n // `control.changeClusterPlanType`. The bulk plan type update beside it\n // checks no reservation and moves no cluster plan, so this one is not a\n // duplicate of it. See `change-cluster-plan-type.ts` in control-backend.\n changeClusterPlanType: 'change-cluster-plan-type',\n // The deletion of one cluster whose TTL ran out. Only the delete cron of\n // console-backend opens it, and it needs no approval. It is a record of the\n // deletion. See `cluster-ttl-deletion.ts` in control-backend.\n clusterTtlDeletion: 'cluster-ttl-deletion',\n} as const\n\n/**\n * The approvals that a change of the feature flag table needs on prod.\n *\n * A flag there turns a feature on or off for every customer, and a person who\n * holds `aafw` could do it alone. Two other Camundis stand in every change,\n * the same floor as a cluster bulk operation on prod\n * (`CLUSTER_BULK_OPERATION_MIN_ACKS`). Int needs one.\n */\nexport const FEATURE_FLAG_MIN_ACKS_PROD = 2\n\n/**\n * The most personal organizations that one Camundi can request.\n *\n * The request runs with no approval, so this cap is the only guard against a\n * loop that creates organizations without end. It counts the requests that a\n * Camundi opened, and a person who needs more asks a Camundi who holds\n * `AccountsPermissions.CREATE_ORG`.\n */\nexport const PERSONAL_ORGANIZATION_MAX_PER_REQUESTER = 10\n\n/** The shortest and longest name of a personal organization. */\nexport const PERSONAL_ORGANIZATION_NAME_MIN_LENGTH = 3\nexport const PERSONAL_ORGANIZATION_NAME_MAX_LENGTH = 100\n\nexport type ApprovalUseCaseType =\n (typeof APPROVAL_USE_CASE_TYPES)[keyof typeof APPROVAL_USE_CASE_TYPES]\n\n/**\n * The shortest extension that accounts-backend accepts.\n *\n * `POST /:orgId/extendtrial` refuses a date that is less than 14 days away\n * when the body carries `onBehalfOf`, and it measures those 14 days when the\n * CALL arrives. The floor here is 15 and not 14, for two reasons:\n *\n * - The two clocks are not the same instant. Accounts builds its own \"14 days\n * from now\" a few milliseconds after control-backend builds the date, so a\n * date of exactly 14 days is already in the past for the comparison.\n * - Accounts counts with `setDate`, which is calendar arithmetic. A change of\n * the daylight saving time moves its limit by an hour.\n */\nexport const EXTEND_TRIAL_MIN_DAYS = 15\n\n/**\n * The longest extension that accounts-backend accepts.\n *\n * The same route refuses a date more than 62 days away. 61 keeps the same\n * margin as the floor above.\n */\nexport const EXTEND_TRIAL_MAX_DAYS = 61\n\n/**\n * The most roles that one change-platform-roles request adds, or removes.\n *\n * The form of control-frontend offers every platform role, and a person who\n * gives a Camundi a new position rarely changes more than a few. A request with\n * more roles than this is a request that nobody reads before they approve it.\n */\nexport const PLATFORM_ROLE_CHANGE_MAX_ROLES = 10\n\n/**\n * The longest text value that one change-org-limits request writes.\n *\n * A text limit holds a short value, such as a list of regions. The bound keeps\n * a request readable for the person who approves it.\n */\nexport const ORG_LIMIT_TEXT_MAX_LENGTH = 2000\n\n/**\n * The most users that one purge-users request deletes.\n *\n * The God Mode purge deletes one user after the other, and Auth0 limits how\n * fast that goes. A list longer than this is also a list that no approver\n * reads before they agree.\n */\nexport const PURGE_USERS_MAX_USERS = 1000\n\n/**\n * What a person must hold to open or to approve a purge-users request.\n *\n * The purge of God Mode is behind `GOD_PURGE_USERS`, and each deletion calls a\n * route behind `DELETE_USER`. The use case of control-backend returns this\n * list from `permissionsFor`, and the form passes it to `canCreate`, so the\n * button and the server never disagree.\n */\nexport const PURGE_USERS_REQUIRED_PERMISSIONS: readonly string[] = [\n AccountsPermissions.GOD_PURGE_USERS,\n AccountsPermissions.DELETE_USER,\n]\n\n/**\n * The largest metadata object that one update-user-metadata request writes,\n * in characters of its JSON text.\n *\n * This is a bound of the product, and not the limit of Auth0, which is far\n * larger. The approvers read the whole object before they agree, and an\n * object that is longer than this is an object that nobody reads.\n */\nexport const USER_METADATA_MAX_LENGTH = 16_000\n\n/**\n * The largest metadata object that a request carries as the object that the\n * person who asked READ.\n *\n * It is larger than `USER_METADATA_MAX_LENGTH`, so a user whose metadata grew\n * past that bound can still get an edit that makes it smaller. It still has a\n * bound, because the request keeps the copy in its row.\n */\nexport const USER_METADATA_EXPECTED_MAX_LENGTH = 500_000\n\n/**\n * The bounds of an automated-enterprise-onboarding request.\n *\n * The accounts wizard holds the first four, and the schema of control-backend\n * and the form of control-frontend read them here, so the form never sends\n * what the service refuses.\n */\nexport const ENTERPRISE_ONBOARDING_NAME_MAX_LENGTH = 50\nexport const ENTERPRISE_ONBOARDING_SFDC_ID_MAX_LENGTH = 50\nexport const ENTERPRISE_ONBOARDING_TERM_MIN_MONTHS = 1\nexport const ENTERPRISE_ONBOARDING_TERM_MAX_MONTHS = 60\n/** The most of one value metric that a contract includes. */\nexport const ENTERPRISE_ONBOARDING_METRIC_MAX = 1_000_000_000_000\n/**\n * The most clusters of one plan type that an onboarding reserves: the cap of\n * the accounts wizard. Accounts checks the limit of the plan only when it\n * reserves, after it created the two organizations, so the request must not\n * carry a count that the plan refuses.\n */\nexport const ENTERPRISE_ONBOARDING_RESERVATION_MAX = 20\n\n/**\n * Whether a string is a calendar day, `YYYY-MM-DD`, that exists.\n *\n * The shape alone is not enough: `Date` rolls `2026-02-30` to March 2 with\n * no error, and `2026-13-45` becomes an invalid date that a database refuses\n * only at the write. A request carries the day for days before it runs, so\n * the check is at the open, and in the form.\n */\nexport const isCalendarDay = (value: string): boolean =>\n /^\\d{4}-\\d{2}-\\d{2}$/.test(value) &&\n !Number.isNaN(Date.parse(value)) &&\n new Date(value).toISOString().startsWith(value)\n\n/** The longest email address that a change-user-email request carries. */\nexport const APPROVAL_EMAIL_MAX_LENGTH = 320\n\n/**\n * The email addresses that a change-user-email request accepts.\n *\n * It is the email pattern of zod 4.6. The pattern is here, so the schema of\n * control-backend and the form of control-frontend accept the same addresses,\n * and a form never sends an address that the service refuses.\n */\nexport const APPROVAL_EMAIL_PATTERN =\n // biome-ignore lint/complexity/noUselessEscapeInRegex: the same source as zod, character for character\n /^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$/\n\n/**\n * The most generations that one change-generation-versions request changes.\n *\n * Each generation restarts every cluster on it. A request over more\n * generations than this is a request that no approver reads to the end.\n *\n * The two bounds of this use case also keep a request under the body limit\n * of control-backend (1 MiB, `server-options.ts` of the shared Fastify\n * layer): 20 generations, each with the expected value of the 2 image\n * versions of 2000 characters, is 80 000 characters before the rest of the\n * payload.\n */\nexport const GENERATION_VERSIONS_MAX_GENERATIONS = 20\n\n/**\n * The longest value of one mutable version of a generation.\n *\n * An image reference is short, and only the two image versions go through\n * the use case (`GENERATION_IMAGE_VERSION_KEYS`). The bound keeps a request\n * readable for the approver. See `GENERATION_VERSIONS_MAX_GENERATIONS` for\n * the sum.\n */\nexport const GENERATION_VERSION_VALUE_MAX_LENGTH = 2000\n"],
5
+ "mappings": "AAMA,SAAS,2BAA2B;AAkB7B,MAAM,0BAA0B;AAAA,EACrC,oBAAoB;AAAA,EACpB,aAAa;AAAA,EACb,gBAAgB;AAAA;AAAA;AAAA;AAAA,EAIhB,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,qBAAqB;AAAA,EACrB,uBAAuB;AAAA;AAAA,EAEvB,qBAAqB;AAAA,EACrB,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,qBAAqB;AAAA,EACrB,iBAAiB;AAAA;AAAA,EAEjB,oBAAoB;AAAA,EACpB,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,oBAAoB;AAAA;AAAA;AAAA,EAGpB,mBAAmB;AAAA;AAAA,EAEnB,4BAA4B;AAAA;AAAA;AAAA,EAG5B,4BAA4B;AAAA,EAC5B,4BAA4B;AAAA;AAAA;AAAA;AAAA,EAI5B,0BAA0B;AAAA;AAAA;AAAA;AAAA,EAI1B,+BAA+B;AAAA;AAAA;AAAA,EAG/B,wBAAwB;AAAA,EACxB,wBAAwB;AAAA;AAAA;AAAA;AAAA,EAIxB,qBAAqB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKrB,uBAAuB;AAAA;AAAA;AAAA;AAAA,EAIvB,oBAAoB;AACtB;AAUO,MAAM,6BAA6B;AAUnC,MAAM,0CAA0C;AAGhD,MAAM,wCAAwC;AAC9C,MAAM,wCAAwC;AAkB9C,MAAM,wBAAwB;AAQ9B,MAAM,wBAAwB;AAS9B,MAAM,iCAAiC;AAQvC,MAAM,4BAA4B;AASlC,MAAM,wBAAwB;AAU9B,MAAM,mCAAsD;AAAA,EACjE,oBAAoB;AAAA,EACpB,oBAAoB;AACtB;AAUO,MAAM,2BAA2B;AAUjC,MAAM,oCAAoC;AAS1C,MAAM,wCAAwC;AAC9C,MAAM,2CAA2C;AACjD,MAAM,wCAAwC;AAC9C,MAAM,wCAAwC;AAE9C,MAAM,mCAAmC;AAOzC,MAAM,wCAAwC;AAU9C,MAAM,gBAAgB,CAAC,UAC5B,sBAAsB,KAAK,KAAK,KAChC,CAAC,OAAO,MAAM,KAAK,MAAM,KAAK,CAAC,KAC/B,IAAI,KAAK,KAAK,EAAE,YAAY,EAAE,WAAW,KAAK;AAGzC,MAAM,4BAA4B;AASlC,MAAM;AAAA;AAAA,EAEX;AAAA;AAcK,MAAM,sCAAsC;AAU5C,MAAM,sCAAsC;",
6
6
  "names": []
7
7
  }
@@ -20,4 +20,64 @@ export interface ChangeClusterPlanTypeResult {
20
20
  */
21
21
  clusterPlanUpdated: boolean;
22
22
  numberOfAllocatedHwPackages: number;
23
+ /**
24
+ * The packages before the change, 1 for a cluster that held none. Absent
25
+ * on an answer of an older console.
26
+ */
27
+ fromNumberOfAllocatedHwPackages?: number;
28
+ /**
29
+ * The cluster plan before and after the change. The same uuid when the
30
+ * plan did not move. Absent on an answer of an older console.
31
+ */
32
+ fromClusterPlanUuid?: string;
33
+ toClusterPlanUuid?: string;
34
+ /**
35
+ * The choice of the request: whether the active modification stays. Absent
36
+ * on an answer of an older console, which removed it.
37
+ */
38
+ keepModification?: boolean;
39
+ /**
40
+ * The active modification config that the change removed. Absent when the
41
+ * cluster had none, or when the request kept it.
42
+ */
43
+ removedModificationConfig?: ClusterModificationConfigRef;
44
+ /**
45
+ * The active modification config that stays on the cluster, because the
46
+ * request kept it. Absent when the cluster had none, or when the change
47
+ * removed it.
48
+ */
49
+ keptModificationConfig?: ClusterModificationConfigRef;
50
+ }
51
+ /** A modification config as a result names it: the id, and what it is for. */
52
+ export interface ClusterModificationConfigRef {
53
+ uuid: string;
54
+ description: string;
55
+ }
56
+ /**
57
+ * The cluster as a plan type change reads it, from
58
+ * `GET api/admin/approvals/clusters/:clusterId/plan-type-state`.
59
+ *
60
+ * control-backend reads it when a request is opened, and refuses a payload
61
+ * whose `expected…` fields differ from it. Without that read, a request
62
+ * that a script opened with stale values gets its approvals and fails on
63
+ * the stale guard of console, after the approvals were spent (#10569). The
64
+ * fields are the ones of the guard, so one read answers every comparison.
65
+ */
66
+ export interface ClusterPlanTypeStateDto {
67
+ clusterId: string;
68
+ orgId: string;
69
+ planTypeUuid: string;
70
+ /** The packages of the cluster, 1 when it holds none. */
71
+ numberOfAllocatedHwPackages: number;
72
+ /** The plan the cluster runs. Absent for a cluster that runs none. */
73
+ clusterPlanUuid?: string;
74
+ /** The active modification config, absent when the cluster has none. */
75
+ activeModificationConfigUuid?: string;
76
+ /** The active plan of the plan type of the question, absent for none. */
77
+ targetActivePlanUuid?: string;
78
+ /**
79
+ * Whether the cluster plan moves to that plan: it is another plan, and it
80
+ * is migratable from the plan of the cluster.
81
+ */
82
+ clusterPlanUpdate: boolean;
23
83
  }
@@ -1,4 +1,5 @@
1
1
  import type { CamundaClusterStage } from '../types/CamundaClusterLabels.type.js';
2
+ import type { ClusterPlanTypesToReserved } from '../types/ClusterPlanTypesToReserved.type.js';
2
3
  import type { ClusterTtlDto } from '../types/ClusterTtl.type.js';
3
4
  import type { SalesPlanType } from '../types/SalesPlanType.type.js';
4
5
  import type { LicensingModelType } from './Organization.dto.js';
@@ -58,6 +59,13 @@ export interface OrgListItemV2Dto {
58
59
  enterpriseDevOnly?: boolean;
59
60
  /** Org metadata: which licensing model prices the org. */
60
61
  licensingModel?: LicensingModelType;
62
+ /**
63
+ * The cluster plan types the org reserved, by plan type uuid, with the
64
+ * count. Absent when the org has no sales plan, and also when it has one
65
+ * that holds no reserved map (the column is nullable). The export of
66
+ * reservations and clusters of the Organizations page reads it.
67
+ */
68
+ clusterPlanTypesToReserved?: ClusterPlanTypesToReserved;
61
69
  }
62
70
  export interface ListOrganizationsV2Params extends CursorParams {
63
71
  q?: string;
@@ -87,6 +95,19 @@ export interface ListOrganizationsV2Params extends CursorParams {
87
95
  * here — spec §14.1 L).
88
96
  */
89
97
  ids?: string[];
98
+ /**
99
+ * Only organizations that can create clusters on AWS alone (true), or
100
+ * every other organization (false). Reads `metadata.awsOnly`; an
101
+ * organization with no value counts as not AWS-only, as the accounts
102
+ * tool reads it.
103
+ */
104
+ awsOnly?: boolean;
105
+ /**
106
+ * Only organizations that hold a reservation above zero for one of
107
+ * these cluster plan type uuids. Reads
108
+ * `organizationToSalesPlan.clusterPlanTypesToReserved`.
109
+ */
110
+ reservedPlanTypeIds?: string[];
90
111
  };
91
112
  }
92
113
  export interface OrgDetailV2Dto extends OrgListItemV2Dto {
@@ -252,6 +273,9 @@ export interface ClusterActivityV2Response {
252
273
  /** The number of days that the window covers. */
253
274
  windowDays: number;
254
275
  }
276
+ /** The modification state of a cluster, as the Clusters list filters it. */
277
+ export declare const CLUSTER_MODIFICATION_STATES: readonly ["active", "planned", "archived", "none"];
278
+ export type ClusterModificationState = (typeof CLUSTER_MODIFICATION_STATES)[number];
255
279
  export interface ListClustersV2Params extends CursorParams {
256
280
  q?: string;
257
281
  /**
@@ -323,6 +347,31 @@ export interface ListClustersV2Params extends CursorParams {
323
347
  internal?: boolean;
324
348
  /** Only clusters with (true) / without (false) an active modification. */
325
349
  hasActiveModification?: boolean;
350
+ /**
351
+ * Only clusters whose plan is (true) / is not (false) the active plan of
352
+ * their plan type. The accounts clusters list calls it "on most recent
353
+ * ClusterPlan"; a cluster that is not is one a plan update would move.
354
+ */
355
+ onActivePlan?: boolean;
356
+ /**
357
+ * Only clusters whose generation is (true) / is not (false) unsupported
358
+ * now: `isUnsupportedStarting` is set and in the past.
359
+ */
360
+ unsupportedGeneration?: boolean;
361
+ /**
362
+ * Only clusters with (true) / without (false) the legacy environment
363
+ * variable override of the cluster row (`overrideEnvVars`). Modification
364
+ * configs replaced it; a cluster that still has one needs a look.
365
+ */
366
+ legacyEnvVars?: boolean;
367
+ /**
368
+ * Restrict to clusters in one of these modification states. `active` is
369
+ * an active config, `planned` a modification with no active config that
370
+ * is not archived, `archived` only archived modifications, `none` no
371
+ * modification at all. The states are exclusive, so several select the
372
+ * union.
373
+ */
374
+ modificationStates?: ClusterModificationState[];
326
375
  /** Only clusters with (true) / without (false) the flag of the same name. */
327
376
  byokEnabled?: boolean;
328
377
  externalMonitoringEnabled?: boolean;
@@ -1 +1,10 @@
1
+ const CLUSTER_MODIFICATION_STATES = [
2
+ "active",
3
+ "planned",
4
+ "archived",
5
+ "none"
6
+ ];
7
+ export {
8
+ CLUSTER_MODIFICATION_STATES
9
+ };
1
10
  //# sourceMappingURL=ControlV2.dto.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
3
+ "sources": ["../../src/dtos/ControlV2.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 { CamundaClusterStage } from '../types/CamundaClusterLabels.type.js'\nimport type { ClusterPlanTypesToReserved } from '../types/ClusterPlanTypesToReserved.type.js'\nimport type { ClusterTtlDto } from '../types/ClusterTtl.type.js'\nimport type { SalesPlanType } from '../types/SalesPlanType.type.js'\nimport type { LicensingModelType } from './Organization.dto.js'\n\n// ============================================================================\n// Control (v2) API contract\n//\n// Purpose-built, list-optimized DTOs for the new Control frontend, served by the\n// `/v2` routers on accounts-backend and console-backend. Cursor-paginated, and\n// pre-shaped server-side so the client does no normalization. See\n// copilot/CONTROL_FRONTEND_SPEC.md \u00A710.\n// ============================================================================\n\n/** Generic cursor-paginated response. `nextCursor === null` on the last page. */\nexport interface CursorPage<T> {\n items: T[]\n nextCursor: string | null\n}\n\n/** Cursor pagination query params shared by all v2 list endpoints. */\nexport interface CursorParams {\n cursor?: string\n limit?: number\n}\n\n// ---- Session (GET /v2/session) -------------------------------------------\n\nexport interface ControlSessionUser {\n id: string\n email: string\n name: string\n}\n\n/**\n * Flat map of resolved capability flags for the signed-in user, computed\n * server-side from the existing JWT-claim + Auth0-metadata model (kept as-is,\n * spec Q12). The shell uses these to gate navigation; the backend flattens its\n * `Features` object into the subset the nav needs.\n */\nexport type ControlResolvedPermissions = Record<string, boolean>\n\nexport interface OrgSummaryV2Dto {\n id: string\n name: string\n role: string\n clusterCount: number\n}\n\nexport interface ControlSessionDto {\n user: ControlSessionUser\n permissions: ControlResolvedPermissions\n organizations: OrgSummaryV2Dto[]\n}\n\n// ---- Organizations (GET /v2/organizations) -------------------------------\n\nexport interface OrgListItemV2Dto {\n id: string\n name: string\n /** ISO-8601; part of the cursor key. */\n created: string\n internal: boolean\n salesPlanType?: SalesPlanType\n /** Concrete plan name (`SalesPlan.name`), distinct from the tier `salesPlanType`. */\n salesPlanName?: string\n salesForceId?: string\n /** ISO-8601 end of the trial, when the org is or was on a trial plan. */\n trialExpiresAt?: string\n /**\n * Persisted trial state: `true` when the trial ran out, `false` while it\n * runs. Absent when the org is not on a trial plan or the state is not set.\n */\n trialExpired?: boolean\n /** Org metadata flag: the org can only create clusters on AWS. */\n awsOnly?: boolean\n /** Org metadata flag: enterprise plan limited to development use. */\n enterpriseDevOnly?: boolean\n /** Org metadata: which licensing model prices the org. */\n licensingModel?: LicensingModelType\n /**\n * The cluster plan types the org reserved, by plan type uuid, with the\n * count. Absent when the org has no sales plan, and also when it has one\n * that holds no reserved map (the column is nullable). The export of\n * reservations and clusters of the Organizations page reads it.\n */\n clusterPlanTypesToReserved?: ClusterPlanTypesToReserved\n}\n\nexport interface ListOrganizationsV2Params extends CursorParams {\n q?: string\n /**\n * Lucene-style query over the org fields (see `ORGANIZATION_SEARCH_FIELDS`).\n * ANDed with `q`/`filter` server-side; a bare term behaves like `q`.\n */\n query?: string\n sort?: 'name' | 'created' | 'internal' | 'salesPlanType' | 'salesPlanName'\n order?: 'asc' | 'desc'\n filter?: {\n internal?: boolean\n /** Sales plan tiers (`SalesPlanType`); multi-select, matched with `IN (...)`. */\n salesPlanTypes?: SalesPlanType[]\n /**\n * Concrete plan names (`SalesPlan.name`, distinct from the tier); backs the\n * \"Sales plan name\" filter. Multi-select, matched with `IN (...)`.\n */\n salesPlanNames?: string[]\n /** ISO-8601 lower bound on `created` (age-bucket filters). */\n createdAfter?: string\n /** ISO-8601 upper bound on `created` (age-bucket filters). */\n createdBefore?: string\n /**\n * Restrict to these org uuids. Backs cross-backend lookups (e.g. org by\n * cluster name / client id: resolve owner ids on console, then filter\n * here \u2014 spec \u00A714.1 L).\n */\n ids?: string[]\n /**\n * Only organizations that can create clusters on AWS alone (true), or\n * every other organization (false). Reads `metadata.awsOnly`; an\n * organization with no value counts as not AWS-only, as the accounts\n * tool reads it.\n */\n awsOnly?: boolean\n /**\n * Only organizations that hold a reservation above zero for one of\n * these cluster plan type uuids. Reads\n * `organizationToSalesPlan.clusterPlanTypesToReserved`.\n */\n reservedPlanTypeIds?: string[]\n }\n}\n\nexport interface OrgDetailV2Dto extends OrgListItemV2Dto {\n /** Full detail fields are added as the detail page is built (Phase 3). */\n metadata?: Record<string, unknown>\n}\n\nexport interface OrgMemberV2Dto {\n userId: string\n email: string\n name?: string\n roles: string[]\n status: 'active' | 'invited'\n /** ISO-8601. */\n invitedAt?: string\n /** ISO-8601. */\n joinedAt?: string\n}\n\nexport interface ListOrgMembersV2Params extends CursorParams {\n q?: string\n}\n\n// ---- Clusters (GET /v2/clusters) -----------------------------------------\n\nexport interface ClusterListItemV2Dto {\n id: string\n name: string\n orgId: string\n orgName: string\n /** Normalized server-side; augmented on the fly from the K8s watcher (\u00A79.4 B1). */\n status: string\n /**\n * The `metadata.generation` of the ZeebeCluster CR, from the K8s watcher at\n * the time of the read, as in `ClusterLiveStateV2Entry`. A row thus carries\n * the baseline that a poll of `GET /v2/clusters/live-state` compares with.\n * Absent when the watcher does not know the cluster, or on an older\n * console-backend.\n */\n specGeneration?: number\n /**\n * Cluster environment stage (dev/test/stage/prod), from the single `camunda`\n * label. Absent when the cluster has no camunda label or more than one, so a\n * surface can only trust it when it is set \u2014 the same guard the cluster\n * detail page and accounts use.\n */\n stageTag?: CamundaClusterStage\n /** Plan type name (`ClusterPlanType.name`). Backs the \"Plan type\" column. */\n planTypeName: string\n /**\n * Plan type uuid (`ClusterPlanType.uuid`). The key that the org reserved map\n * (`clusterPlanTypesToReserved`) uses, so the Control org \"Reservations\" tab\n * can group clusters by plan type to compute the used count.\n */\n planTypeId?: string\n /**\n * Hardware-package count for the cluster (advanced offering). One cluster can\n * use more than one package, so the used-reservation total sums this value\n * across the org's clusters. Undefined when the source value is unknown; the\n * client then counts the cluster as one package.\n */\n numberOfAllocatedHwPackages?: number\n /** Concrete plan name (`ClusterPlan.name`). Backs the \"Plan\" column. */\n planName?: string\n /**\n * Concrete plan uuid (`ClusterPlan.uuid`). Names are not unique, so this is\n * the key to compare a cluster with a target plan.\n */\n planId?: string\n /** Generation name, for display. Group and filter by `generationId`. */\n generation: string\n /** Generation uuid. Names are not unique, so this is the grouping key. */\n generationId?: string\n region: string\n /** Display-only; not a sort/filter key (\u00A79.4 B2). */\n load?: number\n updateAvailable: boolean\n /** Auto-update setting (distinct from `updateAvailable`). */\n autoUpdate: boolean\n /** Release channel name, when the cluster is on one. */\n channel?: string\n /** ISO-8601; part of the cursor key. */\n created: string\n /**\n * User id of the creator, e.g. `samlp|Okta|jane.doe@camunda.com`. Absent\n * when a background flow created the cluster, for an old cluster that has\n * no record of its creator, or on an older console-backend. Also absent\n * for a caller without `canReadAllClusterInfo`: the org clusters route\n * serves members of the org too (see `canReadClusterCreator`).\n */\n createdBy?: string\n /**\n * ISO-8601 instant of the last suspend. Absent when the cluster is awake:\n * `Cluster.wakeUp()` clears the column, thus this is the time since the last\n * suspend and not the total time that the cluster was asleep.\n */\n suspendedAt?: string\n /** The \"Authorizations\" toggle of cluster create. */\n identityBackendChecksEnabled?: boolean\n multiTenancyEnabled?: boolean\n /** BYOIDP. */\n externalIdpEnabled?: boolean\n /** Session idle timeout. */\n sessionMaxInactiveIntervalMinutes?: number\n sessionHeartbeatEnabled?: boolean\n /** BYOK: `encryption` is `External`. The key can still be missing. */\n byokEnabled?: boolean\n /** The cluster has at least one external monitoring (BYOM) client. */\n externalMonitoringEnabled?: boolean\n /** The cluster has a `secure_connectivity` row (AWS PrivateLink). */\n privateConnectivityEnabled?: boolean\n /**\n * The cluster TTL. Absent where `CommonClusterDto.ttl` is absent for the\n * same reader: on every stage other than dev and int, prod included. Also\n * absent for a member of the org on the org clusters route, and on an older\n * console-backend.\n */\n ttl?: ClusterTtlDto\n}\n\n/** Detail extends the list shape; richer fields are added in Phase 3. */\nexport type ClusterDetailV2Dto = ClusterListItemV2Dto\n\n/**\n * How much work a cluster did, inside the 30-day activity window.\n *\n * `idle` and `unknown` are different facts and must stay apart. `idle` is\n * evidence that the cluster did no work. `unknown` is the absence of\n * evidence: on the dev stage most clusters have no row at all.\n *\n * The source is the Holistic Data Platform (HDP), which holds one row per\n * cluster, per day, per value metric. The window is 30 days, thus a bucket\n * for \"did work, but more than 30 days ago\" is not possible.\n */\nexport type ClusterActivityBucket =\n /** Work inside the 30-day window. */\n | 'active'\n /** Rows exist inside the window. All values are zero. */\n | 'idle'\n /** No row at all inside the window. */\n | 'unknown'\n\n/** Quick-filter tiles on the clusters list. */\nexport type ClusterActivityTile =\n | 'all'\n | 'active'\n | 'idle'\n | 'unknown'\n /** More than 90 days old, and not active. */\n | 'old-idle'\n /** No more than 30 days old, with no work and no data. */\n | 'new-idle'\n\nexport interface ClusterActivityV2Dto {\n clusterId: string\n /**\n * ISO-8601 instant of the last UTC day with work. HDP buckets by day, thus\n * the time part is always midnight. Absent when the cluster did no work\n * inside the window.\n */\n lastActiveAt?: string\n processInstances30d: number\n bucket: ClusterActivityBucket\n}\n\nexport interface ClusterActivityV2Response {\n /**\n * One entry per live cluster that has an HDP row inside the window. A\n * cluster in the `unknown` bucket has no entry, because the bucket means\n * that no row exists.\n */\n items: ClusterActivityV2Dto[]\n /** Fleet-wide tile counts. The server joins `cluster.created` for the age tiles. */\n counts: Record<ClusterActivityTile, number>\n /** ISO-8601 instant when the server assembled this response. */\n fetchedAt: string\n /** The number of days that the window covers. */\n windowDays: number\n}\n\n/** The modification state of a cluster, as the Clusters list filters it. */\nexport const CLUSTER_MODIFICATION_STATES = [\n 'active',\n 'planned',\n 'archived',\n 'none',\n] as const\nexport type ClusterModificationState =\n (typeof CLUSTER_MODIFICATION_STATES)[number]\n\nexport interface ListClustersV2Params extends CursorParams {\n q?: string\n /**\n * Lucene-style query over the cluster fields (see `CLUSTER_SEARCH_FIELDS`).\n * ANDed with `q`/`filter` server-side; a bare term behaves like `q`.\n */\n query?: string\n /**\n * Server-side sort key. Beyond `name`/`created`, the clusters list also sorts\n * by the DB-backed columns behind these list columns (the values are the\n * frontend column `key`s, mapped to SQL expressions in the controller):\n * `orgName` (owner id), `autoUpdate`, `planName`, `planTypeName`, `generation`,\n * `channel`, `stageTag` (the single `camunda` label). `status`/`region` are\n * intentionally excluded \u2014 they're computed from live K8s state / context\n * config, not SQL columns.\n */\n sort?:\n | 'name'\n | 'created'\n | 'orgName'\n | 'autoUpdate'\n | 'planName'\n | 'planTypeName'\n | 'generation'\n | 'channel'\n | 'stageTag'\n order?: 'asc' | 'desc'\n filter?: {\n status?: string\n /**\n * Cluster plan TYPE name (maps to `planType.name`; legacy single-value\n * param, still used by the plan-type detail page's cluster-distribution\n * read \u2014 kept alongside `planTypeNames` rather than replaced).\n */\n plan?: string\n /**\n * Restrict to these plan TYPE names (`planType.name`); the Control\n * clusters list's multi-select \"Plan type\" filter.\n */\n planTypeNames?: string[]\n /**\n * Restrict to these concrete plan names (`plan.name`, the `ClusterPlan`\n * entity \u2014 NOT the plan type); backs the Control clusters list's \"Plan\"\n * filter, whose dropdown is sourced from `ClusterPlan` via\n * `/clusters/parameters`. Corrected in #9325 (second pass): a prior fix\n * on this branch mistakenly repointed this at `planType.name` to match a\n * dropdown that was, at the time, wrongly sourced from `ClusterPlanType`\n * \u2014 but the dropdown was the actual bug. Both the dropdown and this query\n * now consistently reference `ClusterPlan`. Distinct from `planTypeNames`\n * above, which is the separate \"Plan type\" filter over `ClusterPlanType`.\n */\n planNames?: string[]\n /**\n * Restrict to these generation uuids (`generation.uuid`). Never by name:\n * a generation name is not unique, so one name can match two generations.\n */\n generationIds?: string[]\n /** Restrict to these cloud providers (resolved via the k8s-context config). */\n providers?: string[]\n /** Exact k8s context uuid. */\n k8sContext?: string\n /**\n * Restrict to these k8s context (datacenter) uuids; the Control clusters\n * list's multi-select \"Datacenter\" filter, which matches the context\n * identity, mirroring the accounts clusters list's \"Filter by Datacenter\".\n */\n k8sContexts?: string[]\n orgId?: string\n /** Restrict to these owner org uuids (cross-backend sales-plan filters). */\n orgIds?: string[]\n /** Restrict to these cluster uuids (prefilter-by-id). */\n ids?: string[]\n /** Restrict to clusters that these user ids created (`cluster.createdBy`). */\n createdBy?: string[]\n /** Auto-update on/off. */\n autoUpdate?: boolean\n /** Internal (Camunda-owned) clusters only / excluded. */\n internal?: boolean\n /** Only clusters with (true) / without (false) an active modification. */\n hasActiveModification?: boolean\n /**\n * Only clusters whose plan is (true) / is not (false) the active plan of\n * their plan type. The accounts clusters list calls it \"on most recent\n * ClusterPlan\"; a cluster that is not is one a plan update would move.\n */\n onActivePlan?: boolean\n /**\n * Only clusters whose generation is (true) / is not (false) unsupported\n * now: `isUnsupportedStarting` is set and in the past.\n */\n unsupportedGeneration?: boolean\n /**\n * Only clusters with (true) / without (false) the legacy environment\n * variable override of the cluster row (`overrideEnvVars`). Modification\n * configs replaced it; a cluster that still has one needs a look.\n */\n legacyEnvVars?: boolean\n /**\n * Restrict to clusters in one of these modification states. `active` is\n * an active config, `planned` a modification with no active config that\n * is not archived, `archived` only archived modifications, `none` no\n * modification at all. The states are exclusive, so several select the\n * union.\n */\n modificationStates?: ClusterModificationState[]\n /** Only clusters with (true) / without (false) the flag of the same name. */\n byokEnabled?: boolean\n externalMonitoringEnabled?: boolean\n privateConnectivityEnabled?: boolean\n /**\n * Zeebe minor-version prefix match on the generation's versions (e.g.\n * \"8.7\" matches zeebe 8.7.x).\n */\n minorVersion?: string\n /** Restrict to these release channel names. */\n channels?: string[]\n /**\n * ISO-8601 lower bound on `created` (e.g. \"created in the last 7 days\").\n * Inclusive: a cluster created at this instant matches.\n */\n createdAfter?: string\n /**\n * ISO-8601 upper bound on `created`. Pairs with `createdAfter` for the\n * age axis. Exclusive: a cluster created at this instant does not match.\n */\n createdBefore?: string\n /**\n * ISO-8601 upper bound on `suspendedAt`, thus \"asleep since at least N\n * days\". Exclusive, as `createdBefore` is. A cluster that is awake never\n * matches: `Cluster.wakeUp()` clears the column.\n *\n * The bound is the time since the last suspend. A cluster that woke up for\n * one minute and then slept again starts from zero, thus this filter finds\n * the clusters that nobody touched, not the clusters that did no work.\n */\n suspendedBefore?: string\n /**\n * ISO-8601 lower bound on `suspendedAt`, thus \"asleep for not more than N\n * days\". Inclusive, as `createdAfter` is. It makes the suspension-age\n * range together with `suspendedBefore`.\n *\n * A cluster that is awake never matches, for the same reason as\n * `suspendedBefore`.\n */\n suspendedAfter?: string\n /**\n * Restrict to these activity buckets. The controller resolves the buckets\n * to a cluster id set from the cached HDP activity map, the same way\n * `filter.status` resolves K8s state to a cluster id set.\n */\n activity?: ClusterActivityBucket[]\n /**\n * `expiring` keeps the clusters whose TTL has an expiry, `unlimited` the\n * clusters whose TTL is unlimited.\n */\n ttl?: ClusterTtlFilter\n /**\n * ISO-8601 upper bound on the TTL expiry. Exclusive, as `createdBefore`\n * is. A cluster with an unlimited TTL never matches.\n */\n ttlExpiresBefore?: string\n }\n}\n\n/** ClusterTtlFilter is the value of `ListClustersV2Params.filter.ttl`. */\nexport type ClusterTtlFilter = 'expiring' | 'unlimited'\n\nexport interface ClusterParameterOptionV2Dto {\n id: string\n name: string\n}\n\n/**\n * A datacenter (k8s context) option for the clusters list's \"Datacenter\" filter.\n * `id` is the context uuid (matched by `filter.k8sContexts`); `region`/`provider`\n * come from the context config and let the dropdown be grouped by provider and\n * show the region, mirroring the accounts clusters list.\n */\nexport interface ClusterDatacenterOptionV2Dto\n extends ClusterParameterOptionV2Dto {\n region?: string\n provider?: string\n}\n\nexport interface ClusterParametersV2Dto {\n plans: ClusterParameterOptionV2Dto[]\n generations: ClusterParameterOptionV2Dto[]\n datacenters: ClusterDatacenterOptionV2Dto[]\n}\n\n/**\n * One cluster in the watcher memory of console-backend: `[id, status,\n * specGeneration]`. `status` is lowercase, as in `ClusterListItemV2Dto`.\n * `specGeneration` is the `metadata.generation` of the ZeebeCluster CR.\n * Kubernetes increments it on each change of the spec, for example a new\n * generation or a new plan. It is `0` when the CR does not give one.\n */\nexport type ClusterLiveStateV2Entry = [\n id: string,\n status: string,\n specGeneration: number,\n]\n\n/**\n * The whole fleet as the watcher sees it (GET /v2/clusters/live-state). The\n * route reads memory only, never the database, thus a client can poll it every\n * second. The entries are sorted by id, thus two equal states give the same\n * body and the same ETag, also on two pods. A pod that is late gives a\n * different body until it gets the same watch events.\n */\nexport interface ClusterLiveStateV2Dto {\n items: ClusterLiveStateV2Entry[]\n}\n\n/**\n * Aggregated cluster distribution counts (GET /v2/clusters/facets), backing\n * the list page's distribution charts and quick-filter tiles without a\n * client-side full-table scan (spec \u00A714.0 hybrid model). SQL-backed facets\n * (generation/planType/channel/autoUpdate) come from GROUP BYs; status and\n * provider are aggregated in-app from the K8s watcher / context config.\n */\nexport interface ClusterFacetsV2Dto {\n total: number\n status: Record<string, number>\n /** Keyed by generation uuid, not name: names are not unique. */\n generation: Record<string, number>\n planType: Record<string, number>\n channel: Record<string, number>\n provider: Record<string, number>\n autoUpdate: { on: number; off: number }\n /** Clusters with an active (non-archived) modification. */\n activeModifications: number\n /**\n * Keyed by the user id of the creator. Only Camundi ids (see\n * `isCamundaUserId`): the \"Created by\" filter lists Camundis, and the id of\n * a customer does not belong in a fleet-wide facet. Absent on an older\n * console-backend.\n */\n createdBy?: Record<string, number>\n}\n\n/** Cluster/owner resolution for a Zeebe client id (cross-backend org search). */\nexport interface ClusterByClientV2Dto {\n clusterId: string\n orgId: string\n}\n"],
5
+ "mappings": "AA+TO,MAAM,8BAA8B;AAAA,EACzC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;",
6
6
  "names": []
7
7
  }
@@ -0,0 +1,51 @@
1
+ import type { GenerationImageVersionsDto } from '../types/C8ClusterComponentVersions.type.js';
2
+ /**
3
+ * What console-backend answers when an approved request changed the mutable
4
+ * versions of ONE generation
5
+ * (`PATCH api/admin/approvals/generations/:generationId/versions`).
6
+ *
7
+ * control-backend keeps one of these for each generation in the result of
8
+ * the request, so the person who asked can read how many clusters restarted.
9
+ */
10
+ export interface ChangeGenerationVersionsResult {
11
+ generationId: string;
12
+ name: string;
13
+ /**
14
+ * The clusters of the generation that console sent the spec to. Zero when
15
+ * the generation already held every requested value and no earlier call
16
+ * of the request wrote it: console then wrote nothing and sent nothing.
17
+ */
18
+ clusterCount: number;
19
+ /**
20
+ * The clusters of `clusterCount` that refused the spec: Kubernetes read
21
+ * the write and said no. They run the old spec until somebody applies it
22
+ * again, for example with a cluster bulk spec update, and a second call
23
+ * meets the same answer. A caller must not report the generation as done
24
+ * while this is above zero.
25
+ */
26
+ rejectedClusters: number;
27
+ /**
28
+ * The clusters of `clusterCount` whose write failed before or after
29
+ * Kubernetes read it, for example on a read of the cluster resource. A
30
+ * second call sends the spec again, see `reapplied`.
31
+ */
32
+ failedClusters: number;
33
+ /**
34
+ * True when the generation already held every requested value because an
35
+ * earlier call of the same request wrote it, and console sent the spec to
36
+ * the clusters again instead of writing. That is how a lost answer and a
37
+ * failed write are retried: the stale guard reads a value that moved TO
38
+ * the requested value as the request itself.
39
+ */
40
+ reapplied: boolean;
41
+ /**
42
+ * The keys that changed, with the value before and after. Empty when the
43
+ * generation already held every requested value. Only the two image
44
+ * versions can be here: a log line still carries the keys and never this
45
+ * object, because the shape is shared with the controller.
46
+ */
47
+ changed: Partial<Record<keyof GenerationImageVersionsDto, {
48
+ from?: string;
49
+ to?: string;
50
+ }>>;
51
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=GenerationVersionsChange.dto.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * The machine-to-machine tokens that were taken for one cluster in a time
3
+ * range, as accounts-backend counts them from the Auth0 log
4
+ * (`GET api/logs/clients/tokens/count`).
5
+ *
6
+ * One row for each cluster: `LogController.countTokenRequests` groups the
7
+ * log by the scope of the token, which is the cluster, and `count` is every
8
+ * token of that scope. `clientId` is the client of ONE of those tokens, and
9
+ * `clientName` repeats the scope. The accounts tool showed the count on its
10
+ * organization list; Camunda Control shows it on the Clusters tab of an
11
+ * organization.
12
+ */
13
+ export interface M2mTokenCountDto {
14
+ /** The client of one token of the cluster, not of every token. */
15
+ clientId: string;
16
+ /** The scope of the token, which is the cluster id again. */
17
+ clientName: string;
18
+ clusterId: string;
19
+ /** Every token of the cluster in the range. */
20
+ count: number;
21
+ orgId?: string;
22
+ }
23
+ /**
24
+ * The answer of `GET api/logs/clients/tokens/count`: the rows, and whether
25
+ * the Auth0 log read stopped before the end of the range. The read stops at
26
+ * `AUTH0_MAX_CAP` entries for the whole fleet, so a busy day gives a slice:
27
+ * each count is then a lower bound, and a cluster with no row can have
28
+ * tokens too.
29
+ */
30
+ export interface M2mTokenCountsDto {
31
+ clusters: M2mTokenCountDto[];
32
+ /** The log entries that the count read. */
33
+ counted: number;
34
+ /** The log entries of the range, as Auth0 reports them. */
35
+ total: number;
36
+ /**
37
+ * True when `counted` is below `total`, or when the read stopped at
38
+ * `AUTH0_MAX_CAP`: Auth0 can cap its `total` at that number too.
39
+ */
40
+ truncated: boolean;
41
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=M2mTokenCount.dto.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
package/dist/index.d.ts CHANGED
@@ -20,7 +20,7 @@ export { isSameApprovalValue, staleApprovalKeys, } from './approvals/expected-va
20
20
  export type { ApprovalActorView, ApprovalDecision, ApprovalDenialCode, } from './approvals/policy.js';
21
21
  export { approvalPermissionCheck, canAcknowledge, canCreate, canExecute, canReject, canView, canWithdraw, effectiveStatus, hasActorEmail, hasEveryPermission, isExpired, isSameActor, isSameActorEmail, remainingAcks, requiredPermissionsOf, resolveRequiredAcks, } from './approvals/policy.js';
22
22
  export type { ApprovalUseCaseType } from './approvals/use-cases.const.js';
23
- export { APPROVAL_EMAIL_MAX_LENGTH, APPROVAL_EMAIL_PATTERN, APPROVAL_USE_CASE_TYPES, EXTEND_TRIAL_MAX_DAYS, EXTEND_TRIAL_MIN_DAYS, FEATURE_FLAG_MIN_ACKS_PROD, ORG_LIMIT_TEXT_MAX_LENGTH, PERSONAL_ORGANIZATION_MAX_PER_REQUESTER, PERSONAL_ORGANIZATION_NAME_MAX_LENGTH, PERSONAL_ORGANIZATION_NAME_MIN_LENGTH, PLATFORM_ROLE_CHANGE_MAX_ROLES, PURGE_USERS_MAX_USERS, PURGE_USERS_REQUIRED_PERMISSIONS, USER_METADATA_EXPECTED_MAX_LENGTH, USER_METADATA_MAX_LENGTH, } from './approvals/use-cases.const.js';
23
+ export { APPROVAL_EMAIL_MAX_LENGTH, APPROVAL_EMAIL_PATTERN, APPROVAL_USE_CASE_TYPES, ENTERPRISE_ONBOARDING_METRIC_MAX, ENTERPRISE_ONBOARDING_NAME_MAX_LENGTH, ENTERPRISE_ONBOARDING_RESERVATION_MAX, ENTERPRISE_ONBOARDING_SFDC_ID_MAX_LENGTH, ENTERPRISE_ONBOARDING_TERM_MAX_MONTHS, ENTERPRISE_ONBOARDING_TERM_MIN_MONTHS, EXTEND_TRIAL_MAX_DAYS, EXTEND_TRIAL_MIN_DAYS, FEATURE_FLAG_MIN_ACKS_PROD, GENERATION_VERSION_VALUE_MAX_LENGTH, GENERATION_VERSIONS_MAX_GENERATIONS, isCalendarDay, ORG_LIMIT_TEXT_MAX_LENGTH, PERSONAL_ORGANIZATION_MAX_PER_REQUESTER, PERSONAL_ORGANIZATION_NAME_MAX_LENGTH, PERSONAL_ORGANIZATION_NAME_MIN_LENGTH, PLATFORM_ROLE_CHANGE_MAX_ROLES, PURGE_USERS_MAX_USERS, PURGE_USERS_REQUIRED_PERMISSIONS, USER_METADATA_EXPECTED_MAX_LENGTH, USER_METADATA_MAX_LENGTH, } from './approvals/use-cases.const.js';
24
24
  export { CHART_DAY_GRAIN_MAX_DAYS, CHART_FILTER_MAX_LENGTH, CHART_GRAIN_DEFAULT, CHART_GRAINS, CHART_ID_MAX_LENGTH, CHART_METRICS, CHART_OTHER_SERIES_KEY, CHART_QUERY_MAX_LENGTH, CHART_TOP_DEFAULT, CHART_TOP_MAX, CHART_UNKNOWN_SERIES_KEY, CHART_WINDOW_AMOUNT_MAX, CHART_WINDOW_DEFAULT, CHART_WINDOW_UNITS, type ChartDimensionSpec, type ChartGrain, type ChartMetricSpec, type ChartPoint, type ChartQueryCheck, ChartQueryError, type ChartQueryErrorKind, type ChartQueryOptions, type ChartResult, type ChartSeries, type ChartSpec, type ChartUnit, type ChartWindow, type ChartWindowUnit, chartBucketStart, chartToday, chartWindowRange, findChartDimension, findChartMetric, formatChartSpec, isChartQueryError, parseChartQuery, readChartSpec, validateChartSpec, } from './charts/index.js';
25
25
  export { DASHBOARD_TILE_DEFAULT_SIZE, dashboardDefinitionBytes, dashboardDefinitionFits, dashboardTileDefaultSize, emptyDashboardDefinition, isSafeDashboardLink, placeNewTile, placeNewTiles, tilesOverlap, toStoredDashboardDefinition, upgradeDashboardDefinition, } from './dashboards/definition.js';
26
26
  export type { ALERT_SUBSCRIPTION_REPORT_TYPES, ALERT_SUBSCRIPTION_TYPES, AlertSubscriptionDto, AlertSubscriptionEntryDto, AlertSubscriptionWebhookAuth, CheckFailedReason, } from './dtos/AlertSubscription.dto.js';
@@ -41,19 +41,22 @@ export type { ClusterIpWhitelistDto } from './dtos/ClusterIpWhitelist.dto.js';
41
41
  export type { MoveClusterOwnerResult, MoveClusterWarnings, } from './dtos/ClusterOwnerMove.dto.js';
42
42
  export type { ClusterPlanDto } from './dtos/ClusterPlan.dto.js';
43
43
  export type { ClusterPlanTypeDto } from './dtos/ClusterPlanType.dto.js';
44
- export type { ChangeClusterPlanTypeResult } from './dtos/ClusterPlanTypeChange.dto.js';
44
+ export type { ChangeClusterPlanTypeResult, ClusterModificationConfigRef, ClusterPlanTypeStateDto, } from './dtos/ClusterPlanTypeChange.dto.js';
45
45
  export type { ClusterSpecChange, ClusterSpecChangeActor, ClusterSpecHistory, } from './dtos/ClusterSpecHistory.dto.js';
46
46
  export type { CommonClusterDto, ExternalIdpConfig, OptimizeFilteringConfig, OptimizeFilteringIncludeExclude, OptimizeFilteringPatch, SecretsFilterMode, } from './dtos/CommonCluster.dto.js';
47
47
  export type { ConsoleClusterDto } from './dtos/ConsoleCluster.dto.js';
48
- export type { ClusterActivityBucket, ClusterActivityTile, ClusterActivityV2Dto, ClusterActivityV2Response, ClusterByClientV2Dto, ClusterDatacenterOptionV2Dto, ClusterDetailV2Dto, ClusterFacetsV2Dto, ClusterListItemV2Dto, ClusterLiveStateV2Dto, ClusterLiveStateV2Entry, ClusterParameterOptionV2Dto, ClusterParametersV2Dto, ClusterTtlFilter, ControlResolvedPermissions, ControlSessionDto, ControlSessionUser, CursorPage, CursorParams, ListClustersV2Params, ListOrganizationsV2Params, ListOrgMembersV2Params, OrgDetailV2Dto, OrgListItemV2Dto, OrgMemberV2Dto, OrgSummaryV2Dto, } from './dtos/ControlV2.dto.js';
48
+ export type { ClusterActivityBucket, ClusterActivityTile, ClusterActivityV2Dto, ClusterActivityV2Response, ClusterByClientV2Dto, ClusterDatacenterOptionV2Dto, ClusterDetailV2Dto, ClusterFacetsV2Dto, ClusterListItemV2Dto, ClusterLiveStateV2Dto, ClusterLiveStateV2Entry, ClusterModificationState, ClusterParameterOptionV2Dto, ClusterParametersV2Dto, ClusterTtlFilter, ControlResolvedPermissions, ControlSessionDto, ControlSessionUser, CursorPage, CursorParams, ListClustersV2Params, ListOrganizationsV2Params, ListOrgMembersV2Params, OrgDetailV2Dto, OrgListItemV2Dto, OrgMemberV2Dto, OrgSummaryV2Dto, } from './dtos/ControlV2.dto.js';
49
+ export { CLUSTER_MODIFICATION_STATES } from './dtos/ControlV2.dto.js';
49
50
  export type { DashboardActor, DashboardAnnotationsQuery, DashboardAnnotationsTile, DashboardAnnotationsTileV1, DashboardCatalogue, DashboardCatalogueChartMetric, DashboardCatalogueSearchField, DashboardChartQuery, DashboardChartRender, DashboardChartTile, DashboardChartTileV3, DashboardClusterCard, DashboardClusterDetailQuery, DashboardClusterDetailTile, DashboardClusterDetailTileV2, DashboardDefinition, DashboardDefinitionV1, DashboardDefinitionV2, DashboardDefinitionV3, DashboardDto, DashboardFleetQuery, DashboardFleetQueryTile, DashboardFleetQueryTileV1, DashboardHeadingTile, DashboardHeadingTileV2, DashboardLinkTile, DashboardLinkTileV2, DashboardListDto, DashboardNewTile, DashboardNoteTile, DashboardNoteTileV2, DashboardOrgCard, DashboardOrgDetailQuery, DashboardOrgDetailTile, DashboardOrgDetailTileV2, DashboardSummaryDto, DashboardTile, DashboardTileKind, DashboardTileLayout, DashboardTileV1, DashboardTileV2, DashboardTileV3, StoredDashboardDefinition, } from './dtos/Dashboard.dto.js';
50
51
  export { DASHBOARD_CHART_RENDERS, DASHBOARD_CLUSTER_CARDS, DASHBOARD_DEFINITION_BYTES_MAX, DASHBOARD_DEFINITION_VERSION, DASHBOARD_ENTITY_ID_MAX, DASHBOARD_GRID_COLUMNS, DASHBOARD_GRID_ROWS_MAX, DASHBOARD_LINK_URL_MAX, DASHBOARD_NOTE_MAX, DASHBOARD_ORG_CARDS, DASHBOARD_PAGE_SIZE_DEFAULT, DASHBOARD_PAGE_SIZE_MAX, DASHBOARD_TILE_KINDS, DASHBOARD_TILE_ROWS_MAX, DASHBOARD_TILES_MAX, DASHBOARD_TITLE_MAX, } from './dtos/Dashboard.dto.js';
51
52
  export type { EarlyAccessFeatureDto } from './dtos/EarlyAccessFeature.dto.js';
52
53
  export type { CamundaWebApp, CamundaWebAppWithZeebe, ExternalClickwrapConfigDto, ExternalClusterDto, ExternalOrganizationDto, } from './dtos/ExternalWebapp.dto.js';
53
54
  export type { CreateFeatureFlagDto, FeatureFlagAnswer, FeatureFlagDto, FeatureFlagListDto, UpdateFeatureFlagDto, } from './dtos/FeatureFlags.dto.js';
54
55
  export { activeGenerations, compareGenerationNamesNewestFirst, type GenerationDto, type GenerationWithClusterCountDto, sortGenerationBySemverOfZeebe, type UpgradableGenerationsDto, } from './dtos/Generations.dto.js';
56
+ export type { ChangeGenerationVersionsResult } from './dtos/GenerationVersionsChange.dto.js';
55
57
  export type { Hdp } from './dtos/Hdp.dto.js';
56
58
  export type { K8sBackupConfig, K8sConfig, K8sConfigLegacyFormat, K8sContext, K8sContextDto, } from './dtos/K8sContext.dto.js';
59
+ export type { M2mTokenCountDto, M2mTokenCountsDto, } from './dtos/M2mTokenCount.dto.js';
57
60
  export type { MetaDto } from './dtos/Meta.dto.js';
58
61
  export type { AutoJoinAssignment, LicensingModelType, LlmProviderName, OrganizationDto, OrganizationMetadata, OrgOwner, OrgWithNameAndSalesPlan, } from './dtos/Organization.dto.js';
59
62
  export { LICENSING_MODEL_DISPLAY_NAMES, VALID_LICENSING_MODELS, } from './dtos/Organization.dto.js';
@@ -102,8 +105,8 @@ export { INTERNAL_LOW_HARDWARE_PLAN_NAME, isActivitySleepEligible, isClusterTagE
102
105
  export type { BotContext, BotOptions, BotRequest, GetUserDetailsResponse, ListRolesForUserResponse, UpdateUserRolesRequest, UpdateUserRolesResponse, UserContext, UserDetails, } from './types/Bot.types.js';
103
106
  export type { BulkClusterDeletionContent, BulkClusterDeletionItem, BulkClusterGenerationUpdateItem, BulkClusterPlanTypeUpdateContent, BulkClusterPlanTypeUpdateItem, BulkClusterPlanUpdateContent, BulkClusterPlanUpdateItem, BulkGenerationUpdateContent, GenericBulkClusterOperationContent, GenericBulkOperationContent, GenericClusterBulkOperationItem, } from './types/BulkOperation.type.js';
104
107
  export { isBulkClusterDeletionItem, isBulkClusterPlanTypeUpdateItem, isBulkClusterPlanUpdateItem, isIsBulkClusterGenerationUpdateIten, } from './types/BulkOperation.type.js';
105
- export type { ImmutableZeebeClusterVersionsDto, MutableZeebeClusterVersionsDto, ZeebeClusterVersionsDto, } from './types/C8ClusterComponentVersions.type.js';
106
- export { AllThings, ImmutableThings, MutableThings, } from './types/C8ClusterComponentVersions.type.js';
108
+ export type { GenerationImageVersionsDto, ImmutableZeebeClusterVersionsDto, MutableZeebeClusterVersionsDto, ZeebeClusterVersionsDto, } from './types/C8ClusterComponentVersions.type.js';
109
+ export { AllThings, GENERATION_IMAGE_VERSION_KEYS, ImmutableThings, MutableThings, } from './types/C8ClusterComponentVersions.type.js';
107
110
  export type { CamundaClusterStage, CamundaClusterStageLabel, ClusterLabels, } from './types/CamundaClusterLabels.type.js';
108
111
  export { ALLOWED_CAMUNDA_LABELS, StageClusterLabels, } from './types/CamundaClusterLabels.type.js';
109
112
  export type { SubscriptionItem } from './types/Chargebee.type.js';
@@ -118,7 +121,7 @@ export type { ClusterPlanTypesToConfig } from './types/ClusterPlanTypesToConfig.
118
121
  export type { ClusterPlanTypesToReserved } from './types/ClusterPlanTypesToReserved.type.js';
119
122
  export type { ClusterTtlDeletionPayload, ClusterTtlDeletionResult, ClusterTtlDto, ClusterTtlDuration, ClusterTtlOption, ClusterTtlUnlimited, UpdateClusterTtlBody, } from './types/ClusterTtl.type.js';
120
123
  export { CLUSTER_TTL_BACKFILL_REASON, CLUSTER_TTL_DURATION_MS, CLUSTER_TTL_DURATIONS, CLUSTER_TTL_FEATURE_FLAG, CLUSTER_TTL_OPTIONS, CLUSTER_TTL_UNLIMITED_LINK_MAX_LENGTH, CLUSTER_TTL_UNLIMITED_REASON_MAX_LENGTH, clusterTtlExpiresAt, DEFAULT_CLUSTER_TTL_OPTION, extendClusterTtl, isClusterTtlDuration, isClusterTtlOption, isClusterTtlStage, isHttpUrl, isPastClusterTtl, validateClusterTtlUnlimited, } from './types/ClusterTtl.type.js';
121
- export type { ClusterUsageDataRequest, ClusterUsageMetricsAddRequestByMetricHeap, ClusterUsageMetricsData, ClusterUsageMetricsFilter, ClusterUsageOrgStartDate, } from './types/ClusterUsageMetrics.type.js';
124
+ export type { ClusterUsageDataRequest, ClusterUsageMetadataDto, ClusterUsageMetricsAddRequestByMetricHeap, ClusterUsageMetricsData, ClusterUsageMetricsFilter, ClusterUsageOrgStartDate, } from './types/ClusterUsageMetrics.type.js';
122
125
  export { ConsoleSM } from './types/ConsoleSelfManaged.type.js';
123
126
  export type { ConsoleSMAdminApi } from './types/ConsoleSelfManagedAdminApi.type.js';
124
127
  export type { DashboardConfig, DashboardMappingItem, DashboardMappingTarget, DashboardResultPrimitive, DashboardResultRow, EngineeringOperationsDashboardResponse, } from './types/Dashboard.types.js';
@@ -162,6 +165,8 @@ export { addMonthsClamped, DEFAULT_ENTERPRISE_DURATION_IN_MONTHS, diffInWholeMon
162
165
  export type { EnvVarEntry } from './utils/envVars.js';
163
166
  export { parseEnvVars, serializeEnvVars } from './utils/envVars.js';
164
167
  export { deriveFailoverKeyPolicyPrincipals, type FailoverKeyPolicyPrincipals, } from './utils/failoverKeyPolicy.utils.js';
168
+ export type { JvmOptionsModificationKey, ParsedJvmOption, } from './utils/jvmOptions.js';
169
+ export { addsEnvVarsOverrideValue, isJvmOptionsModificationKey, isUnderJvmSpec, JVM_OPTION_MAX_LENGTH, JVM_OPTION_PATTERN, JVM_OPTIONS_MAX_ITEMS, JVM_OPTIONS_MODIFICATION_KEYS, JVM_OPTIONS_TARGETS, joinJvmOptions, parseJvmOption, requiresEnvVarsOverride, splitJvmOptions, validateJvmOptions, validateJvmOptionsValue, } from './utils/jvmOptions.js';
165
170
  export { KMS_ARN, KMS_MRK_ARN, type KmsArnValidationError, type ParsedKmsArn, parseKmsArn, validateKmsArnForRegion, } from './utils/kmsArn.utils.js';
166
171
  export { validateLabels } from './utils/labelValidator.utils.js';
167
172
  export { ObjectMergeUtils } from './utils/objectMerge.utils.js';