@camunda/ccma-shared-types 0.2.0 → 0.5.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 (85) 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/constants/failoverRegionPairs.const.d.ts +18 -0
  7. package/dist/constants/failoverRegionPairs.const.js +22 -0
  8. package/dist/constants/failoverRegionPairs.const.js.map +7 -0
  9. package/dist/constants/misc.const.d.ts +7 -0
  10. package/dist/constants/misc.const.js +2 -0
  11. package/dist/constants/misc.const.js.map +2 -2
  12. package/dist/dtos/Backup.dto.d.ts +5 -0
  13. package/dist/dtos/ClusterPlan.dto.d.ts +5 -0
  14. package/dist/dtos/ClusterPlanType.dto.d.ts +6 -0
  15. package/dist/dtos/ClusterSpecHistory.dto.d.ts +24 -0
  16. package/dist/dtos/ClusterSpecHistory.dto.js +1 -0
  17. package/dist/dtos/ClusterSpecHistory.dto.js.map +7 -0
  18. package/dist/dtos/CommonCluster.dto.d.ts +71 -6
  19. package/dist/dtos/ConsoleCluster.dto.d.ts +7 -0
  20. package/dist/dtos/ControlV2.dto.d.ts +121 -7
  21. package/dist/dtos/ExternalWebapp.dto.d.ts +89 -0
  22. package/dist/dtos/ExternalWebapp.dto.js +1 -0
  23. package/dist/dtos/ExternalWebapp.dto.js.map +7 -0
  24. package/dist/dtos/K8sContext.dto.d.ts +7 -0
  25. package/dist/dtos/Organization.dto.d.ts +2 -0
  26. package/dist/dtos/Organization.dto.js.map +1 -1
  27. package/dist/dtos/ReleaseTrainSanity.dto.d.ts +51 -0
  28. package/dist/dtos/ReleaseTrainSanity.dto.js +1 -0
  29. package/dist/dtos/ReleaseTrainSanity.dto.js.map +7 -0
  30. package/dist/dtos/SalesPlan.dto.js +4 -2
  31. package/dist/dtos/SalesPlan.dto.js.map +2 -2
  32. package/dist/dtos/StorybookConfig.dto.d.ts +39 -0
  33. package/dist/dtos/StorybookConfig.dto.js +1 -0
  34. package/dist/dtos/StorybookConfig.dto.js.map +7 -0
  35. package/dist/enums/AuditEntity.enum.d.ts +1 -0
  36. package/dist/enums/AuditEntity.enum.js +1 -0
  37. package/dist/enums/AuditEntity.enum.js.map +2 -2
  38. package/dist/enums/OrganizationRole.enum.d.ts +1 -2
  39. package/dist/enums/OrganizationRole.enum.js +7 -2
  40. package/dist/enums/OrganizationRole.enum.js.map +2 -2
  41. package/dist/enums/SystemAuditEntity.enum.d.ts +7 -2
  42. package/dist/enums/SystemAuditEntity.enum.js +5 -0
  43. package/dist/enums/SystemAuditEntity.enum.js.map +2 -2
  44. package/dist/index.d.ts +13 -5
  45. package/dist/index.js +39 -17
  46. package/dist/index.js.map +2 -2
  47. package/dist/permissions/combo.js +3 -0
  48. package/dist/permissions/combo.js.map +2 -2
  49. package/dist/permissions/console.permissions.d.ts +2 -0
  50. package/dist/permissions/console.permissions.js +7 -0
  51. package/dist/permissions/console.permissions.js.map +2 -2
  52. package/dist/permissions/profile.permissions.d.ts +14 -8
  53. package/dist/permissions/profile.permissions.js +16 -123
  54. package/dist/permissions/profile.permissions.js.map +2 -2
  55. package/dist/search/ast.d.ts +52 -0
  56. package/dist/search/ast.js +18 -0
  57. package/dist/search/ast.js.map +7 -0
  58. package/dist/search/cluster-search-fields.d.ts +11 -0
  59. package/dist/search/cluster-search-fields.js +136 -0
  60. package/dist/search/cluster-search-fields.js.map +7 -0
  61. package/dist/search/compiler.d.ts +48 -0
  62. package/dist/search/compiler.js +217 -0
  63. package/dist/search/compiler.js.map +7 -0
  64. package/dist/search/fields.d.ts +24 -0
  65. package/dist/search/fields.js +5 -0
  66. package/dist/search/fields.js.map +7 -0
  67. package/dist/search/index.d.ts +6 -0
  68. package/dist/search/index.js +33 -0
  69. package/dist/search/index.js.map +7 -0
  70. package/dist/search/organization-search-fields.d.ts +9 -0
  71. package/dist/search/organization-search-fields.js +50 -0
  72. package/dist/search/organization-search-fields.js.map +7 -0
  73. package/dist/search/parser.d.ts +7 -0
  74. package/dist/search/parser.js +324 -0
  75. package/dist/search/parser.js.map +7 -0
  76. package/dist/types/ClusterModification.type.d.ts +1 -0
  77. package/dist/types/ClusterPlanFields.type.d.ts +24 -0
  78. package/dist/types/ClusterPlanFields.type.js +591 -0
  79. package/dist/types/ClusterPlanFields.type.js.map +7 -0
  80. package/dist/types/ClusterPlanModification.type.d.ts +1 -0
  81. package/dist/types/EnterpriseIncludingValueMetrics.type.d.ts +1 -0
  82. package/dist/types/HdpTenantUsage.type.d.ts +4 -0
  83. package/dist/types/HdpTenantUsage.type.js +1 -0
  84. package/dist/types/HdpTenantUsage.type.js.map +7 -0
  85. 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 {};
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Region pairs supported for cross-region failover (#9120). Failover is only
3
+ * offered for dual-region clusters whose primary and secondary regions form
4
+ * one of these reverse-region pairs — cluster creation must be supported in
5
+ * both directions. Both directions of each pair are listed.
6
+ *
7
+ * This is the base set, enabled on every stage.
8
+ *
9
+ * Shared between console-backend (FailoverRouter guard) and c4 (hiding the
10
+ * failover action for unsupported pairs).
11
+ */
12
+ export declare const SUPPORTED_FAILOVER_REGION_PAIRS: ReadonlySet<string>;
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;
@@ -0,0 +1,22 @@
1
+ const SUPPORTED_FAILOVER_REGION_PAIRS = /* @__PURE__ */ new Set([
2
+ "us-east-2:us-west-2",
3
+ "us-west-2:us-east-2",
4
+ "us-east-2:us-east-1",
5
+ "us-east-1:us-east-2"
6
+ ]);
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) {
12
+ if (!regionA || !regionB) return false;
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);
17
+ }
18
+ export {
19
+ SUPPORTED_FAILOVER_REGION_PAIRS,
20
+ isSupportedFailoverRegionPair
21
+ };
22
+ //# sourceMappingURL=failoverRegionPairs.const.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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 * 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
+ "names": []
7
+ }
@@ -16,6 +16,13 @@ export declare const MINIMUM_EYEPAIRS: {
16
16
  CLUSTER_MODIFICATION: number;
17
17
  };
18
18
  export declare const MAX_HARDWARE_PACKAGE_COUNT = 4;
19
+ /**
20
+ * Minimum cluster (zeebe) version for the Optimize data-filters feature. Shared by
21
+ * the c4 settings tile, the new-cluster default, and CRD spec generation so the gate
22
+ * stays consistent. Stricter than the operator's own gate (Camunda >= 8.9.0-alpha1,
23
+ * where the exporter starts honoring the filters) — this is the product rollout gate.
24
+ */
25
+ export declare const OPTIMIZE_FILTERING_MIN_VERSION = "8.10.0-alpha1";
19
26
  export declare const SENTRY: {
20
27
  dsn: {
21
28
  trial: string;
@@ -18,6 +18,7 @@ const MINIMUM_EYEPAIRS = {
18
18
  CLUSTER_MODIFICATION: 1
19
19
  };
20
20
  const MAX_HARDWARE_PACKAGE_COUNT = 4;
21
+ const OPTIMIZE_FILTERING_MIN_VERSION = "8.10.0-alpha1";
21
22
  const SENTRY = {
22
23
  dsn: {
23
24
  trial: "https://a91625f8d3e1b34690588504ed020e14@o4507463051378688.ingest.de.sentry.io/4507463055376464",
@@ -107,6 +108,7 @@ export {
107
108
  MAX_LENGTH_CLUSTER_NAME,
108
109
  MINIMUM_EYEPAIRS,
109
110
  NAMES_OF_ENTERPRISE_SALESPLANS_WITH_SLEEPING_CLUSTERS,
111
+ OPTIMIZE_FILTERING_MIN_VERSION,
110
112
  SECRETS_MAX_LENGTH,
111
113
  SENTRY,
112
114
  STARTING_PRICE_PER_MONTH_IN_EURO,
@@ -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\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;AAEnC,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\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;",
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
  }
@@ -0,0 +1,24 @@
1
+ /** Who made a cluster spec change (mirrors the console-backend entity). */
2
+ export interface ClusterSpecChangeActor {
3
+ type: 'user' | 'system' | 'migration';
4
+ id: string;
5
+ }
6
+ /**
7
+ * One entry in a cluster's spec-change history. `snapshot` carries a full spec
8
+ * in `data`; `diff` carries per-key `{ from, to }` changes.
9
+ */
10
+ export interface ClusterSpecChange {
11
+ timestamp: string;
12
+ type: 'snapshot' | 'diff';
13
+ actor: ClusterSpecChangeActor;
14
+ data: Record<string, unknown>;
15
+ }
16
+ /**
17
+ * Cluster spec-change history, exposed on the cluster detail read for callers
18
+ * with read-all-cluster-info. Populated by the console backend
19
+ * (`ClusterSpecHistoryData`).
20
+ */
21
+ export interface ClusterSpecHistory {
22
+ lastFullSpec: Record<string, unknown>;
23
+ changes: ClusterSpecChange[];
24
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=ClusterSpecHistory.dto.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -1,4 +1,59 @@
1
1
  import type { ClusterPlanTypeDto } from './ClusterPlanType.dto.js';
2
+ /** Inclusion/exclusion pattern lists. Exclusion takes precedence over inclusion;
3
+ * an empty inclusion list includes everything. */
4
+ export interface OptimizeFilteringIncludeExclude {
5
+ inclusion?: string[];
6
+ exclusion?: string[];
7
+ }
8
+ /**
9
+ * Optimize Elasticsearch-exporter record filters. Mirrors the operator CRD shape
10
+ * (`spec.zeebe.exporterFilters`, camunda-operator#5683) so it maps through 1:1.
11
+ * `variableName.startWith` matches variable names by prefix — the nesting keeps
12
+ * room for `endWith`/exact match types without a breaking change.
13
+ */
14
+ export interface OptimizeFilteringConfig {
15
+ processDefinition?: OptimizeFilteringIncludeExclude;
16
+ variableName?: {
17
+ startWith?: OptimizeFilteringIncludeExclude;
18
+ };
19
+ }
20
+ /**
21
+ * PATCH-request variant of OptimizeFilteringConfig. Lists may arrive as null (older
22
+ * clients sent null for empty lists); the controller coerces null to undefined and
23
+ * reconstructs a clean OptimizeFilteringConfig before persisting.
24
+ */
25
+ export interface OptimizeFilteringPatch {
26
+ processDefinition?: {
27
+ inclusion?: string[] | null;
28
+ exclusion?: string[] | null;
29
+ };
30
+ variableName?: {
31
+ startWith?: {
32
+ inclusion?: string[] | null;
33
+ exclusion?: string[] | null;
34
+ };
35
+ };
36
+ }
37
+ /**
38
+ * BYOIDP Phase 1 (#3190): non-secret config for one custom OIDC provider.
39
+ * The client secret is NEVER part of this shape — it is written as a K8s Secret
40
+ * (`idp-config-{clusterId}`, keyed by `name`) and referenced from the CR only.
41
+ */
42
+ export interface ExternalIdpConfig {
43
+ /** Registration id. Uppercase letters + digits, starts with a letter (`^[A-Z][A-Z0-9]*$`).
44
+ * Doubles as the Secret data key, the `..._OIDC_<NAME>_*` env-var segment, and `clientSecretRef.key`. */
45
+ name: string;
46
+ /** Friendly display name shown on the login picker. */
47
+ clientName: string;
48
+ issuerUri: string;
49
+ clientId: string;
50
+ scopes?: string[];
51
+ usernameClaim?: string;
52
+ groupsClaim?: string;
53
+ clientIdClaim?: string;
54
+ /** Rotation marker — bumped on every secret write so the CR changes and pods roll. */
55
+ secretUpdatedAt?: string;
56
+ }
2
57
  export interface CommonClusterDto {
3
58
  ownerId: string;
4
59
  uuid: string;
@@ -20,7 +75,12 @@ export interface CommonClusterDto {
20
75
  connectorsUrl?: string;
21
76
  conditions?: Array<{
22
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;
23
82
  reason?: string;
83
+ message?: string;
24
84
  lastTransitionTime?: string;
25
85
  }>;
26
86
  updateClusterStatus?: {
@@ -45,6 +105,11 @@ export interface CommonClusterDto {
45
105
  */
46
106
  backupRegionCodes?: string[];
47
107
  backupRegionId?: string | null;
108
+ /**
109
+ * True once the operator's initial primary→secondary bucket sync has
110
+ * completed. Failover is only offered when this is true.
111
+ */
112
+ secondaryBucketSyncCompleted?: boolean;
48
113
  encryption?: string;
49
114
  primaryEncryptionKeyId?: string | null;
50
115
  secondaryEncryptionKeyId?: string | null;
@@ -55,17 +120,15 @@ export interface CommonClusterDto {
55
120
  clientCategories?: string[];
56
121
  };
57
122
  swagger?: boolean;
123
+ appIntegrationsEnabled?: boolean;
58
124
  optimizeEnabled?: boolean;
59
- optimizeFiltering?: {
60
- includeProcessIds?: string[];
61
- excludeProcessIds?: string[];
62
- includeVariableNames?: string[];
63
- excludeVariableNames?: string[];
64
- };
125
+ optimizeFiltering?: OptimizeFilteringConfig;
65
126
  };
66
127
  rba?: boolean;
67
128
  identityBackendChecksEnabled?: boolean;
68
129
  multiTenancyEnabled?: boolean;
130
+ externalIdpEnabled?: boolean;
131
+ externalIdpConfig?: ExternalIdpConfig;
69
132
  enforceGroups?: boolean;
70
133
  playMode?: boolean;
71
134
  mcpEnabled?: boolean;
@@ -80,6 +143,8 @@ export interface CommonClusterDto {
80
143
  planType: ClusterPlanTypeDto;
81
144
  numberOfAllocatedHwPackages?: number;
82
145
  restoreInProgress?: boolean;
146
+ restoreFailed?: boolean;
147
+ failedRestoreId?: string;
83
148
  overrideEnvVars?: {
84
149
  zeebeBroker: string | undefined;
85
150
  zeebeGateway: string | undefined;
@@ -1,6 +1,7 @@
1
1
  import type { ClusterLabels } from '../types/CamundaClusterLabels.type.js';
2
2
  import type { ClusterIpWhitelistDto } from './ClusterIpWhitelist.dto.js';
3
3
  import type { ClusterPlanDto } from './ClusterPlan.dto.js';
4
+ import type { ClusterSpecHistory } from './ClusterSpecHistory.dto.js';
4
5
  import type { CommonClusterDto } from './CommonCluster.dto.js';
5
6
  import type { GenerationDto } from './Generations.dto.js';
6
7
  import type { K8sContextDto } from './K8sContext.dto.js';
@@ -13,4 +14,10 @@ export interface ConsoleClusterDto extends CommonClusterDto {
13
14
  hasOptimize?: boolean;
14
15
  hasIdentity?: boolean;
15
16
  ipWhitelist?: ClusterIpWhitelistDto[];
17
+ /**
18
+ * Spec-change history, present when the caller has read-all-cluster-info
19
+ * (the backend exposes it under that permission group). Backs the cluster
20
+ * "Spec Changes" tab.
21
+ */
22
+ specHistory?: ClusterSpecHistory;
16
23
  }
@@ -39,17 +39,38 @@ 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[];
64
+ /** ISO-8601 lower bound on `created` (age-bucket filters). */
65
+ createdAfter?: string;
66
+ /** ISO-8601 upper bound on `created` (age-bucket filters). */
67
+ createdBefore?: string;
68
+ /**
69
+ * Restrict to these org uuids. Backs cross-backend lookups (e.g. org by
70
+ * cluster name / client id: resolve owner ids on console, then filter
71
+ * here — spec §14.1 L).
72
+ */
73
+ ids?: string[];
53
74
  };
54
75
  }
55
76
  export interface OrgDetailV2Dto extends OrgListItemV2Dto {
@@ -77,12 +98,19 @@ export interface ClusterListItemV2Dto {
77
98
  orgName: string;
78
99
  /** Normalized server-side; augmented on the fly from the K8s watcher (§9.4 B1). */
79
100
  status: string;
80
- 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;
81
105
  generation: string;
82
106
  region: string;
83
107
  /** Display-only; not a sort/filter key (§9.4 B2). */
84
108
  load?: number;
85
109
  updateAvailable: boolean;
110
+ /** Auto-update setting (distinct from `updateAvailable`). */
111
+ autoUpdate: boolean;
112
+ /** Release channel name, when the cluster is on one. */
113
+ channel?: string;
86
114
  /** ISO-8601; part of the cursor key. */
87
115
  created: string;
88
116
  }
@@ -90,14 +118,74 @@ export interface ClusterListItemV2Dto {
90
118
  export type ClusterDetailV2Dto = ClusterListItemV2Dto;
91
119
  export interface ListClustersV2Params extends CursorParams {
92
120
  q?: string;
93
- 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';
94
135
  order?: 'asc' | 'desc';
95
136
  filter?: {
96
137
  status?: string;
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
+ */
97
143
  plan?: string;
98
- generation?: string;
99
- region?: 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[];
167
+ /** Exact k8s context uuid. */
168
+ k8sContext?: string;
100
169
  orgId?: string;
170
+ /** Restrict to these owner org uuids (cross-backend sales-plan filters). */
171
+ orgIds?: string[];
172
+ /** Restrict to these cluster uuids (prefilter-by-id). */
173
+ ids?: string[];
174
+ /** Auto-update on/off. */
175
+ autoUpdate?: boolean;
176
+ /** Internal (Camunda-owned) clusters only / excluded. */
177
+ internal?: boolean;
178
+ /** Only clusters with (true) / without (false) an active modification. */
179
+ hasActiveModification?: boolean;
180
+ /**
181
+ * Zeebe minor-version prefix match on the generation's versions (e.g.
182
+ * "8.7" matches zeebe 8.7.x).
183
+ */
184
+ minorVersion?: string;
185
+ /** Restrict to these release channel names. */
186
+ channels?: string[];
187
+ /** ISO-8601 lower bound on `created` (e.g. "created in the last 7 days"). */
188
+ createdAfter?: string;
101
189
  };
102
190
  }
103
191
  export interface ClusterParameterOptionV2Dto {
@@ -109,3 +197,29 @@ export interface ClusterParametersV2Dto {
109
197
  generations: ClusterParameterOptionV2Dto[];
110
198
  regions: ClusterParameterOptionV2Dto[];
111
199
  }
200
+ /**
201
+ * Aggregated cluster distribution counts (GET /v2/clusters/facets), backing
202
+ * the list page's distribution charts and quick-filter tiles without a
203
+ * client-side full-table scan (spec §14.0 hybrid model). SQL-backed facets
204
+ * (generation/planType/channel/autoUpdate) come from GROUP BYs; status and
205
+ * provider are aggregated in-app from the K8s watcher / context config.
206
+ */
207
+ export interface ClusterFacetsV2Dto {
208
+ total: number;
209
+ status: Record<string, number>;
210
+ generation: Record<string, number>;
211
+ planType: Record<string, number>;
212
+ channel: Record<string, number>;
213
+ provider: Record<string, number>;
214
+ autoUpdate: {
215
+ on: number;
216
+ off: number;
217
+ };
218
+ /** Clusters with an active (non-archived) modification. */
219
+ activeModifications: number;
220
+ }
221
+ /** Cluster/owner resolution for a Zeebe client id (cross-backend org search). */
222
+ export interface ClusterByClientV2Dto {
223
+ clusterId: string;
224
+ orgId: string;
225
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * DTOs for the Console/Accounts **external** API surface
3
+ * (`external/organizations/my`, `external/organizations/:orgId/clusters`).
4
+ *
5
+ * These are the cross-origin, CORS-enabled shapes a Camunda webapp
6
+ * (console, modeler, operate, …) receives when it builds navigation. They are
7
+ * intentionally *not* the internal `OrganizationDto` / `ConsoleClusterDto`
8
+ * (those carry admin-only fields and a different permission model). Keep these
9
+ * in sync with the console-backend `external/*` routers.
10
+ */
11
+ /**
12
+ * A navigable Camunda webapp. `identity` is the legacy alias of `admin`
13
+ * (renamed in 8.9.0-alpha5); both are kept so older clusters that still expose
14
+ * `identity` endpoints/status render correctly. Prefer `admin` for new code and
15
+ * resolve the display alias per cluster with `resolveAdminAppName`.
16
+ */
17
+ export type CamundaWebApp = 'console' | 'modeler' | 'tasklist' | 'operate' | 'optimize' | 'identity' | 'admin';
18
+ /**
19
+ * `CamundaWebApp` plus `zeebe`. Cluster health is keyed by this: admin/identity
20
+ * have no dedicated health status and ride zeebe's ingress, so navigation uses
21
+ * `zeebe` as their health proxy (see `isAppHealthyOnCluster`).
22
+ */
23
+ export type CamundaWebAppWithZeebe = CamundaWebApp | 'zeebe';
24
+ interface ExternalOrgClusterPermission {
25
+ read: boolean;
26
+ }
27
+ interface ExternalOrgCrudPermission {
28
+ read: boolean;
29
+ create: boolean;
30
+ update: boolean;
31
+ delete: boolean;
32
+ }
33
+ /**
34
+ * Organization as returned by `GET external/organizations/my`.
35
+ *
36
+ * Only the fields navigation needs are typed. `permissions` mirrors the
37
+ * external accounts shape and backs `hasReadPermissionForApp` and the
38
+ * cluster-create gate; every level is optional because the backend omits
39
+ * branches the caller has no access to.
40
+ */
41
+ export interface ExternalOrganizationDto {
42
+ uuid: string;
43
+ name: string;
44
+ salesPlan?: {
45
+ type: string;
46
+ trialExpired?: boolean;
47
+ };
48
+ permissions?: {
49
+ cluster?: Partial<Record<CamundaWebApp, ExternalOrgClusterPermission>>;
50
+ org?: {
51
+ billing?: ExternalOrgCrudPermission;
52
+ clusters?: ExternalOrgCrudPermission;
53
+ webide?: ExternalOrgCrudPermission;
54
+ settings?: ExternalOrgCrudPermission;
55
+ users?: {
56
+ owner?: ExternalOrgCrudPermission;
57
+ };
58
+ };
59
+ };
60
+ }
61
+ /**
62
+ * Cluster as returned by `GET external/organizations/:orgId/clusters`.
63
+ *
64
+ * `endpoints` and `status` are keyed per webapp; both are partial because a
65
+ * cluster only exposes the apps its generation/plan includes. `status` values
66
+ * are backend health strings (e.g. `'Healthy'`); navigation treats a link as
67
+ * usable only when the app (or its zeebe proxy) is `'Healthy'`. `labels.camunda`
68
+ * carries the stage tag (`[0]` is the `CamundaClusterStage`).
69
+ */
70
+ export interface ExternalClusterDto {
71
+ uuid: string;
72
+ name: string;
73
+ status?: Partial<Record<CamundaWebAppWithZeebe, string>>;
74
+ endpoints?: Partial<Record<CamundaWebApp, string>>;
75
+ labels?: {
76
+ camunda?: string[];
77
+ };
78
+ generation?: {
79
+ name?: string;
80
+ versions?: {
81
+ zeebe?: string;
82
+ operate?: string;
83
+ tasklist?: string;
84
+ optimize?: string;
85
+ connectors?: string;
86
+ };
87
+ };
88
+ }
89
+ export {};
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=ExternalWebapp.dto.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -32,6 +32,13 @@ export interface K8sContext {
32
32
  docker_registry: string;
33
33
  project_id?: string;
34
34
  project_name?: string;
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;
35
42
  }
36
43
  export interface K8sConfig {
37
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 {