@camunda/ccma-api 7.6.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.
- package/dist/services/accounts/hdp.service.d.ts +11 -1
- package/dist/services/accounts/hdp.service.js +14 -1
- package/dist/services/accounts/hdp.service.js.map +2 -2
- package/dist/services/accounts/logs.service.d.ts +8 -1
- package/dist/services/accounts/logs.service.js +34 -0
- package/dist/services/accounts/logs.service.js.map +2 -2
- package/package.json +2 -2
|
@@ -145,8 +145,18 @@ export declare class HdpService {
|
|
|
145
145
|
* rows of deleted clusters, thus the caller matches `rows` against its own
|
|
146
146
|
* cluster list. A cluster with no row has no cost data. That is not a cost
|
|
147
147
|
* of 0.
|
|
148
|
+
*
|
|
149
|
+
* `days: 1` reads one measure day. `day` (`YYYY-MM-DD`) sets the last day
|
|
150
|
+
* of the window. Without `day`, the window ends at the latest loaded day,
|
|
151
|
+
* and `anchorDay` of the answer gives that day.
|
|
152
|
+
* A `day` after the latest loaded day gives 409: HDP did not load it yet.
|
|
148
153
|
*/
|
|
149
|
-
static getFleetHostingCost(params: RequestBaseParams
|
|
154
|
+
static getFleetHostingCost(params: RequestBaseParams & {
|
|
155
|
+
params?: {
|
|
156
|
+
days?: 1 | 30;
|
|
157
|
+
day?: string;
|
|
158
|
+
};
|
|
159
|
+
}): Promise<Hdp.FleetHostingCost>;
|
|
150
160
|
/**
|
|
151
161
|
* One chart of a Control dashboard: a query on one metric of HDP. Admin
|
|
152
162
|
* only, and only while `control.dashboardCharts` is on (404 otherwise). The
|
|
@@ -314,12 +314,25 @@ class HdpService {
|
|
|
314
314
|
* rows of deleted clusters, thus the caller matches `rows` against its own
|
|
315
315
|
* cluster list. A cluster with no row has no cost data. That is not a cost
|
|
316
316
|
* of 0.
|
|
317
|
+
*
|
|
318
|
+
* `days: 1` reads one measure day. `day` (`YYYY-MM-DD`) sets the last day
|
|
319
|
+
* of the window. Without `day`, the window ends at the latest loaded day,
|
|
320
|
+
* and `anchorDay` of the answer gives that day.
|
|
321
|
+
* A `day` after the latest loaded day gives 409: HDP did not load it yet.
|
|
317
322
|
*/
|
|
318
323
|
static async getFleetHostingCost(params) {
|
|
324
|
+
const queryParams = new URLSearchParams();
|
|
325
|
+
if (params.params?.days !== void 0) {
|
|
326
|
+
queryParams.append("days", String(params.params.days));
|
|
327
|
+
}
|
|
328
|
+
if (params.params?.day !== void 0) {
|
|
329
|
+
queryParams.append("day", params.params.day);
|
|
330
|
+
}
|
|
331
|
+
const queryString = queryParams.size > 0 ? `?${queryParams.toString()}` : "";
|
|
319
332
|
const serviceContext = {
|
|
320
333
|
method: {
|
|
321
334
|
name: `HdpService.getFleetHostingCost`,
|
|
322
|
-
url:
|
|
335
|
+
url: `api/hdp/hosting-cost${queryString}`,
|
|
323
336
|
normalizedUrl: "api/hdp/hosting-cost",
|
|
324
337
|
type: "get"
|
|
325
338
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/services/accounts/hdp.service.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 {\n ChartResult,\n ChartSpec,\n Hdp,\n HdpBackendChangeEvent,\n HdpDisk,\n HdpPrometheusDataCapacityDataPoint,\n HdpTenantUsageBreakdown,\n HdpTenantUsagePoint,\n} from '@camunda/ccma-shared-types'\nimport type {\n RequestBaseParams,\n RequestBaseServiceContext,\n} from '../../types/general.types.js'\nimport { request } from '../../utils/api.js'\nimport { HttpError } from '../../utils/errors.js'\n\nexport interface QueryChartRequest extends RequestBaseParams {\n params: {\n spec: ChartSpec\n }\n}\n\nexport interface GetClusterCapacityRequest extends RequestBaseParams {\n params: {\n orgId: string\n clusterId?: string\n clusterIds?: string[]\n operation: 'per-day' | 'latest' | '24h'\n }\n}\n\n/**\n * `per-day`/`24h` read one cluster and `latest` reads a set \u2014 the identifiers\n * are not interchangeable, so the discriminant carries only the one its\n * operation needs. A flat `{clusterId?, clusterIds?, operation}` shape let a\n * caller send `{operation: '24h', clusterIds: [...]}`, which reached the\n * accounts-backend route with an undefined `clusterId` and returned 200 with\n * `[]` instead of a 400.\n */\nexport type GetClusterDiskUsageParams = {\n /** The disk to read. Without it, the route reads Elasticsearch. */\n disk?: HdpDisk\n} & (\n | { orgId: string; operation: 'per-day' | '24h'; clusterId: string }\n | { orgId: string; operation: 'latest'; clusterIds: string[] }\n)\n\nexport type GetClusterDiskUsageRequest = RequestBaseParams & {\n params: GetClusterDiskUsageParams\n}\n\nexport interface GetTenantUsageRequest extends RequestBaseParams {\n params: {\n orgId: string\n /** Relative window, in days back from today. Ignored when `startDate` is set. */\n days?: number\n /** Inclusive `YYYY-MM-DD` lower bound. */\n startDate?: string\n /** Inclusive `YYYY-MM-DD` upper bound. Defaults to today. */\n endDate?: string\n }\n}\n\nexport interface GetBackendChangeEventsRequest extends RequestBaseParams {\n params: {\n entityId: string\n }\n}\n\nexport interface GetUsageMetricsRequest extends RequestBaseParams {\n params: {\n orgId: string\n queryRange?: string\n queryStartDate?: string\n /** Inclusive upper bound; without it the range is open-ended. */\n queryEndDate?: string\n queryLimit?: number\n }\n}\n\nexport interface GetUsageMetricsResponse {\n valueMetrics: Hdp.ValueMetrics\n}\n\nexport interface GetLlmUsageRequest extends RequestBaseParams {\n params: Record<string, never>\n}\n\nexport interface LlmUsageEntry {\n ts: number\n orgId: string\n orgName: string\n salesPlan: string\n spend: number\n maxBudget: number\n}\n\nexport interface GetActiveOrgsRequest extends RequestBaseParams {\n params: {\n metric: 'ProcessInstances' | 'DecisionInstances' | 'TaskUsers'\n }\n}\n\nexport interface GetActiveOrgsResponse {\n activeOrgs: Hdp.ActiveOrgByUsageMetric[]\n}\n\nexport interface GetClusterActivityRequest extends RequestBaseParams {\n params?: {\n /** The window to read, in days. accounts-backend bounds this value. */\n windowDays?: number\n }\n}\n\nexport interface GetClusterHostingCostRequest extends RequestBaseParams {\n params: {\n clusterId: string\n }\n}\n\nexport interface GetClusterHostingCostResponse {\n /** Absent when the cluster has no rows in the window. */\n hostingCost?: Hdp.ClusterHostingCost\n}\n\nexport class HdpService {\n public static async getClusterCapacity(\n params: GetClusterCapacityRequest,\n ): Promise<HdpPrometheusDataCapacityDataPoint[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterCapacity`,\n url: `api/hdp/${params.params.orgId}/clusters/capacity`,\n normalizedUrl: `api/hdp/:orgId/clusters/capacity`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpPrometheusDataCapacityDataPoint[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n /**\n * Used bytes of one cluster disk (Elasticsearch or Zeebe), as avg/min/max,\n * with the same shape and operations as `getClusterCapacity`. The value is\n * the total over all nodes of the disk. See\n * camunda/Holistic-Data-Platform#1923 for the ingestion side.\n */\n public static async getClusterDiskUsage(\n params: GetClusterDiskUsageRequest,\n ): Promise<HdpPrometheusDataCapacityDataPoint[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterDiskUsage`,\n url: `api/hdp/${params.params.orgId}/clusters/disk-usage`,\n normalizedUrl: `api/hdp/:orgId/clusters/disk-usage`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpPrometheusDataCapacityDataPoint[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n public static async getTenantUsage(\n params: GetTenantUsageRequest,\n ): Promise<HdpTenantUsagePoint[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getTenantUsage`,\n url: `api/hdp/${params.params.orgId}/tenants`,\n normalizedUrl: `api/hdp/:orgId/tenants`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpTenantUsagePoint[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n /**\n * Tenant usage broken down by cluster, plus the org roll-up of the same rows.\n * Use when a caller needs the per-cluster detail; `getTenantUsage` returns\n * just the org totals, which is all a billing figure needs.\n */\n public static async getTenantUsagePerCluster(\n params: GetTenantUsageRequest,\n ): Promise<HdpTenantUsageBreakdown> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getTenantUsagePerCluster`,\n url: `api/hdp/${params.params.orgId}/tenants/per-cluster`,\n normalizedUrl: `api/hdp/:orgId/tenants/per-cluster`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpTenantUsageBreakdown>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n public static async getBackendChangeEvents(\n params: GetBackendChangeEventsRequest,\n ): Promise<HdpBackendChangeEvent[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterCapacity`,\n url: `api/hdp/backend-events/${params.params.entityId}`,\n normalizedUrl: `api/hdp/backend-events/:entityId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpBackendChangeEvent[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n public static async getUsageMetrics(\n params: GetUsageMetricsRequest,\n ): Promise<GetUsageMetricsResponse> {\n const queryParams = new URLSearchParams()\n if (params.params.queryRange) {\n queryParams.append('range', params.params.queryRange)\n }\n if (params.params.queryStartDate) {\n queryParams.append('startDate', params.params.queryStartDate)\n }\n if (params.params.queryEndDate) {\n queryParams.append('endDate', params.params.queryEndDate)\n }\n if (params.params.queryLimit) {\n queryParams.append('limit', params.params.queryLimit.toString())\n }\n const queryString = queryParams.size > 0 ? `?${queryParams.toString()}` : ''\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getUsageMetrics`,\n url: `api/usage-metrics/${params.params.orgId}${queryString}`,\n normalizedUrl: `api/hdp/usage-metrics/:orgId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<GetUsageMetricsResponse>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n /**\n * The work of every cluster that HDP holds inside the window, for the whole\n * fleet (`GET /api/usage-metrics/cluster-activity`).\n *\n * Only accounts-backend can query HDP, thus console-backend reads the rows\n * from here. Call this with a service token: the response covers the whole\n * fleet, and the caller caches it for every user.\n */\n public static async getClusterActivity(\n params: GetClusterActivityRequest,\n ): Promise<Hdp.ClusterActivity> {\n const windowDays = params.params?.windowDays\n const queryString =\n windowDays === undefined ? '' : `?windowDays=${windowDays}`\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterActivity`,\n url: `api/usage-metrics/cluster-activity${queryString}`,\n normalizedUrl: `api/hdp/usage-metrics/cluster-activity`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<Hdp.ClusterActivity>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok || !response.body) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body\n }\n\n /**\n * One cluster's trailing 30-day hosting cost\n * (`GET /api/hdp/hosting-cost/:clusterId`).\n *\n * Only accounts-backend can query HDP, thus console-backend and\n * control-frontend both read it from here. The response's `hostingCost` is\n * absent when the cluster has no rows in the window, so the caller can show\n * \"no data\" rather than a false $0.\n */\n public static async getClusterHostingCost(\n params: GetClusterHostingCostRequest,\n ): Promise<GetClusterHostingCostResponse> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterHostingCost`,\n url: `api/hdp/hosting-cost/${encodeURIComponent(params.params.clusterId)}`,\n normalizedUrl: `api/hdp/hosting-cost/:clusterId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<GetClusterHostingCostResponse>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n /**\n * The trailing 30-day hosting cost of every cluster HDP holds, for\n * the whole fleet (`GET /api/hdp/hosting-cost`).\n *\n * accounts-backend answers only a caller with `admin.readAll`, and caches\n * the answer for one hour, thus a page can call this on load. HDP keeps the\n * rows of deleted clusters, thus the caller matches `rows` against its own\n * cluster list. A cluster with no row has no cost data. That is not a cost\n * of 0.\n */\n public static async getFleetHostingCost(\n params: RequestBaseParams,\n ): Promise<Hdp.FleetHostingCost> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getFleetHostingCost`,\n url: 'api/hdp/hosting-cost',\n normalizedUrl: 'api/hdp/hosting-cost',\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<Hdp.FleetHostingCost>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok || !response.body) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body\n }\n\n /**\n * One chart of a Control dashboard: a query on one metric of HDP. Admin\n * only, and only while `control.dashboardCharts` is on (404 otherwise). The\n * backend checks the spec against `CHART_METRICS` and answers 400 for a spec\n * it refuses, 422 when the query reads too many bytes, and 429 when the user\n * runs too many queries. The message of the thrown {@link HttpError} is the\n * reason that the backend gives.\n */\n public static async queryChart(\n params: QueryChartRequest,\n ): Promise<ChartResult> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.queryChart`,\n url: 'api/hdp/charts/query',\n normalizedUrl: 'api/hdp/charts/query',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<ChartResult>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params.spec,\n // No retry on a 429: a retry after the backoff starts a BigQuery job\n // that nobody asked for. The chart shows the limit at once.\n retry: { attempts: 1, remaining: 0 },\n })\n if (!response.ok || !response.body) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body\n }\n\n public static async getActiveOrgs(\n params: GetActiveOrgsRequest,\n ): Promise<GetActiveOrgsResponse> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getActiveOrgs`,\n url: `api/usage-metrics/active/${params.params.metric}`,\n normalizedUrl: `api/hdp/usage-metrics/active/:metric`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<GetActiveOrgsResponse>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n public static async getLlmUsage(\n params: GetLlmUsageRequest,\n ): Promise<LlmUsageEntry[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getLlmUsage`,\n url: `api/hdp/llm-usage`,\n normalizedUrl: `api/hdp/llm-usage`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<LlmUsageEntry[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
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 {\n ChartResult,\n ChartSpec,\n Hdp,\n HdpBackendChangeEvent,\n HdpDisk,\n HdpPrometheusDataCapacityDataPoint,\n HdpTenantUsageBreakdown,\n HdpTenantUsagePoint,\n} from '@camunda/ccma-shared-types'\nimport type {\n RequestBaseParams,\n RequestBaseServiceContext,\n} from '../../types/general.types.js'\nimport { request } from '../../utils/api.js'\nimport { HttpError } from '../../utils/errors.js'\n\nexport interface QueryChartRequest extends RequestBaseParams {\n params: {\n spec: ChartSpec\n }\n}\n\nexport interface GetClusterCapacityRequest extends RequestBaseParams {\n params: {\n orgId: string\n clusterId?: string\n clusterIds?: string[]\n operation: 'per-day' | 'latest' | '24h'\n }\n}\n\n/**\n * `per-day`/`24h` read one cluster and `latest` reads a set \u2014 the identifiers\n * are not interchangeable, so the discriminant carries only the one its\n * operation needs. A flat `{clusterId?, clusterIds?, operation}` shape let a\n * caller send `{operation: '24h', clusterIds: [...]}`, which reached the\n * accounts-backend route with an undefined `clusterId` and returned 200 with\n * `[]` instead of a 400.\n */\nexport type GetClusterDiskUsageParams = {\n /** The disk to read. Without it, the route reads Elasticsearch. */\n disk?: HdpDisk\n} & (\n | { orgId: string; operation: 'per-day' | '24h'; clusterId: string }\n | { orgId: string; operation: 'latest'; clusterIds: string[] }\n)\n\nexport type GetClusterDiskUsageRequest = RequestBaseParams & {\n params: GetClusterDiskUsageParams\n}\n\nexport interface GetTenantUsageRequest extends RequestBaseParams {\n params: {\n orgId: string\n /** Relative window, in days back from today. Ignored when `startDate` is set. */\n days?: number\n /** Inclusive `YYYY-MM-DD` lower bound. */\n startDate?: string\n /** Inclusive `YYYY-MM-DD` upper bound. Defaults to today. */\n endDate?: string\n }\n}\n\nexport interface GetBackendChangeEventsRequest extends RequestBaseParams {\n params: {\n entityId: string\n }\n}\n\nexport interface GetUsageMetricsRequest extends RequestBaseParams {\n params: {\n orgId: string\n queryRange?: string\n queryStartDate?: string\n /** Inclusive upper bound; without it the range is open-ended. */\n queryEndDate?: string\n queryLimit?: number\n }\n}\n\nexport interface GetUsageMetricsResponse {\n valueMetrics: Hdp.ValueMetrics\n}\n\nexport interface GetLlmUsageRequest extends RequestBaseParams {\n params: Record<string, never>\n}\n\nexport interface LlmUsageEntry {\n ts: number\n orgId: string\n orgName: string\n salesPlan: string\n spend: number\n maxBudget: number\n}\n\nexport interface GetActiveOrgsRequest extends RequestBaseParams {\n params: {\n metric: 'ProcessInstances' | 'DecisionInstances' | 'TaskUsers'\n }\n}\n\nexport interface GetActiveOrgsResponse {\n activeOrgs: Hdp.ActiveOrgByUsageMetric[]\n}\n\nexport interface GetClusterActivityRequest extends RequestBaseParams {\n params?: {\n /** The window to read, in days. accounts-backend bounds this value. */\n windowDays?: number\n }\n}\n\nexport interface GetClusterHostingCostRequest extends RequestBaseParams {\n params: {\n clusterId: string\n }\n}\n\nexport interface GetClusterHostingCostResponse {\n /** Absent when the cluster has no rows in the window. */\n hostingCost?: Hdp.ClusterHostingCost\n}\n\nexport class HdpService {\n public static async getClusterCapacity(\n params: GetClusterCapacityRequest,\n ): Promise<HdpPrometheusDataCapacityDataPoint[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterCapacity`,\n url: `api/hdp/${params.params.orgId}/clusters/capacity`,\n normalizedUrl: `api/hdp/:orgId/clusters/capacity`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpPrometheusDataCapacityDataPoint[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n /**\n * Used bytes of one cluster disk (Elasticsearch or Zeebe), as avg/min/max,\n * with the same shape and operations as `getClusterCapacity`. The value is\n * the total over all nodes of the disk. See\n * camunda/Holistic-Data-Platform#1923 for the ingestion side.\n */\n public static async getClusterDiskUsage(\n params: GetClusterDiskUsageRequest,\n ): Promise<HdpPrometheusDataCapacityDataPoint[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterDiskUsage`,\n url: `api/hdp/${params.params.orgId}/clusters/disk-usage`,\n normalizedUrl: `api/hdp/:orgId/clusters/disk-usage`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpPrometheusDataCapacityDataPoint[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n public static async getTenantUsage(\n params: GetTenantUsageRequest,\n ): Promise<HdpTenantUsagePoint[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getTenantUsage`,\n url: `api/hdp/${params.params.orgId}/tenants`,\n normalizedUrl: `api/hdp/:orgId/tenants`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpTenantUsagePoint[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n /**\n * Tenant usage broken down by cluster, plus the org roll-up of the same rows.\n * Use when a caller needs the per-cluster detail; `getTenantUsage` returns\n * just the org totals, which is all a billing figure needs.\n */\n public static async getTenantUsagePerCluster(\n params: GetTenantUsageRequest,\n ): Promise<HdpTenantUsageBreakdown> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getTenantUsagePerCluster`,\n url: `api/hdp/${params.params.orgId}/tenants/per-cluster`,\n normalizedUrl: `api/hdp/:orgId/tenants/per-cluster`,\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpTenantUsageBreakdown>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n public static async getBackendChangeEvents(\n params: GetBackendChangeEventsRequest,\n ): Promise<HdpBackendChangeEvent[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterCapacity`,\n url: `api/hdp/backend-events/${params.params.entityId}`,\n normalizedUrl: `api/hdp/backend-events/:entityId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<HdpBackendChangeEvent[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n public static async getUsageMetrics(\n params: GetUsageMetricsRequest,\n ): Promise<GetUsageMetricsResponse> {\n const queryParams = new URLSearchParams()\n if (params.params.queryRange) {\n queryParams.append('range', params.params.queryRange)\n }\n if (params.params.queryStartDate) {\n queryParams.append('startDate', params.params.queryStartDate)\n }\n if (params.params.queryEndDate) {\n queryParams.append('endDate', params.params.queryEndDate)\n }\n if (params.params.queryLimit) {\n queryParams.append('limit', params.params.queryLimit.toString())\n }\n const queryString = queryParams.size > 0 ? `?${queryParams.toString()}` : ''\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getUsageMetrics`,\n url: `api/usage-metrics/${params.params.orgId}${queryString}`,\n normalizedUrl: `api/hdp/usage-metrics/:orgId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<GetUsageMetricsResponse>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n /**\n * The work of every cluster that HDP holds inside the window, for the whole\n * fleet (`GET /api/usage-metrics/cluster-activity`).\n *\n * Only accounts-backend can query HDP, thus console-backend reads the rows\n * from here. Call this with a service token: the response covers the whole\n * fleet, and the caller caches it for every user.\n */\n public static async getClusterActivity(\n params: GetClusterActivityRequest,\n ): Promise<Hdp.ClusterActivity> {\n const windowDays = params.params?.windowDays\n const queryString =\n windowDays === undefined ? '' : `?windowDays=${windowDays}`\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterActivity`,\n url: `api/usage-metrics/cluster-activity${queryString}`,\n normalizedUrl: `api/hdp/usage-metrics/cluster-activity`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<Hdp.ClusterActivity>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok || !response.body) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body\n }\n\n /**\n * One cluster's trailing 30-day hosting cost\n * (`GET /api/hdp/hosting-cost/:clusterId`).\n *\n * Only accounts-backend can query HDP, thus console-backend and\n * control-frontend both read it from here. The response's `hostingCost` is\n * absent when the cluster has no rows in the window, so the caller can show\n * \"no data\" rather than a false $0.\n */\n public static async getClusterHostingCost(\n params: GetClusterHostingCostRequest,\n ): Promise<GetClusterHostingCostResponse> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getClusterHostingCost`,\n url: `api/hdp/hosting-cost/${encodeURIComponent(params.params.clusterId)}`,\n normalizedUrl: `api/hdp/hosting-cost/:clusterId`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<GetClusterHostingCostResponse>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n /**\n * The trailing 30-day hosting cost of every cluster HDP holds, for\n * the whole fleet (`GET /api/hdp/hosting-cost`).\n *\n * accounts-backend answers only a caller with `admin.readAll`, and caches\n * the answer for one hour, thus a page can call this on load. HDP keeps the\n * rows of deleted clusters, thus the caller matches `rows` against its own\n * cluster list. A cluster with no row has no cost data. That is not a cost\n * of 0.\n *\n * `days: 1` reads one measure day. `day` (`YYYY-MM-DD`) sets the last day\n * of the window. Without `day`, the window ends at the latest loaded day,\n * and `anchorDay` of the answer gives that day.\n * A `day` after the latest loaded day gives 409: HDP did not load it yet.\n */\n public static async getFleetHostingCost(\n params: RequestBaseParams & { params?: { days?: 1 | 30; day?: string } },\n ): Promise<Hdp.FleetHostingCost> {\n const queryParams = new URLSearchParams()\n if (params.params?.days !== undefined) {\n queryParams.append('days', String(params.params.days))\n }\n if (params.params?.day !== undefined) {\n queryParams.append('day', params.params.day)\n }\n const queryString = queryParams.size > 0 ? `?${queryParams.toString()}` : ''\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getFleetHostingCost`,\n url: `api/hdp/hosting-cost${queryString}`,\n normalizedUrl: 'api/hdp/hosting-cost',\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<Hdp.FleetHostingCost>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok || !response.body) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body\n }\n\n /**\n * One chart of a Control dashboard: a query on one metric of HDP. Admin\n * only, and only while `control.dashboardCharts` is on (404 otherwise). The\n * backend checks the spec against `CHART_METRICS` and answers 400 for a spec\n * it refuses, 422 when the query reads too many bytes, and 429 when the user\n * runs too many queries. The message of the thrown {@link HttpError} is the\n * reason that the backend gives.\n */\n public static async queryChart(\n params: QueryChartRequest,\n ): Promise<ChartResult> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.queryChart`,\n url: 'api/hdp/charts/query',\n normalizedUrl: 'api/hdp/charts/query',\n type: 'post',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<ChartResult>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n body: params.params.spec,\n // No retry on a 429: a retry after the backoff starts a BigQuery job\n // that nobody asked for. The chart shows the limit at once.\n retry: { attempts: 1, remaining: 0 },\n })\n if (!response.ok || !response.body) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body\n }\n\n public static async getActiveOrgs(\n params: GetActiveOrgsRequest,\n ): Promise<GetActiveOrgsResponse> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getActiveOrgs`,\n url: `api/usage-metrics/active/${params.params.metric}`,\n normalizedUrl: `api/hdp/usage-metrics/active/:metric`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<GetActiveOrgsResponse>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n\n public static async getLlmUsage(\n params: GetLlmUsageRequest,\n ): Promise<LlmUsageEntry[]> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: `HdpService.getLlmUsage`,\n url: `api/hdp/llm-usage`,\n normalizedUrl: `api/hdp/llm-usage`,\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: {\n name: 'accounts',\n type: 'internal',\n },\n }\n const response = await request<LlmUsageEntry[]>({\n ...params,\n base: {\n id: 'accounts',\n },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body!\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { M2mTokenCountsDto } from '@camunda/ccma-shared-types';
|
|
1
|
+
import type { ActiveUsersDto, M2mTokenCountsDto } from '@camunda/ccma-shared-types';
|
|
2
2
|
import type { RequestBaseParams } from '../../types/general.types.js';
|
|
3
3
|
export interface GetM2mTokenCountsRequest extends RequestBaseParams {
|
|
4
4
|
params: {
|
|
@@ -17,4 +17,11 @@ export declare class AccountsLogsService {
|
|
|
17
17
|
* stopped before the end of the range. See `M2mTokenCountsDto`.
|
|
18
18
|
*/
|
|
19
19
|
static getM2mTokenCounts(params: GetM2mTokenCountsRequest): Promise<M2mTokenCountsDto>;
|
|
20
|
+
/**
|
|
21
|
+
* The active user count of the Auth0 tenant: the users that logged in
|
|
22
|
+
* during the last 30 days. accounts-backend answers 502 when Auth0 refuses
|
|
23
|
+
* it: its Management API client has no `read:stats` scope, or its token is
|
|
24
|
+
* bad or expired.
|
|
25
|
+
*/
|
|
26
|
+
static getActiveUsers(params: RequestBaseParams): Promise<ActiveUsersDto>;
|
|
20
27
|
}
|
|
@@ -34,6 +34,40 @@ class AccountsLogsService {
|
|
|
34
34
|
}
|
|
35
35
|
return response.body ?? { clusters: [], counted: 0, total: 0, truncated: false };
|
|
36
36
|
}
|
|
37
|
+
/**
|
|
38
|
+
* The active user count of the Auth0 tenant: the users that logged in
|
|
39
|
+
* during the last 30 days. accounts-backend answers 502 when Auth0 refuses
|
|
40
|
+
* it: its Management API client has no `read:stats` scope, or its token is
|
|
41
|
+
* bad or expired.
|
|
42
|
+
*/
|
|
43
|
+
static async getActiveUsers(params) {
|
|
44
|
+
const serviceContext = {
|
|
45
|
+
method: {
|
|
46
|
+
name: "AccountsLogsService.getActiveUsers",
|
|
47
|
+
url: "api/logs/active-users",
|
|
48
|
+
normalizedUrl: "api/logs/active-users",
|
|
49
|
+
type: "get"
|
|
50
|
+
},
|
|
51
|
+
source: params.config.metrics?.source || "unset",
|
|
52
|
+
target: { name: "accounts", type: "internal" }
|
|
53
|
+
};
|
|
54
|
+
const response = await request({
|
|
55
|
+
config: params.config,
|
|
56
|
+
base: { id: "accounts" },
|
|
57
|
+
url: serviceContext.method.url,
|
|
58
|
+
method: serviceContext.method.type,
|
|
59
|
+
metricsDetails: serviceContext,
|
|
60
|
+
responseType: "json"
|
|
61
|
+
});
|
|
62
|
+
if (!response.ok || !response.body) {
|
|
63
|
+
throw new HttpError(
|
|
64
|
+
`${serviceContext.method.name}: ${response.status} ${response.statusText}`,
|
|
65
|
+
response.status,
|
|
66
|
+
response.statusText
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
return response.body;
|
|
70
|
+
}
|
|
37
71
|
}
|
|
38
72
|
export {
|
|
39
73
|
AccountsLogsService
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/services/accounts/logs.service.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 {
|
|
5
|
-
"mappings": "
|
|
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 {\n ActiveUsersDto,\n M2mTokenCountsDto,\n} from '@camunda/ccma-shared-types'\nimport type {\n RequestBaseParams,\n RequestBaseServiceContext,\n} from '../../types/general.types.js'\nimport { request } from '../../utils/api.js'\nimport { HttpError } from '../../utils/errors.js'\n\nexport interface GetM2mTokenCountsRequest extends RequestBaseParams {\n params: {\n /** How far back the Auth0 log is read, in hours. The accounts tool read 24. */\n rangeInHours: number\n }\n}\n\n/**\n * The log reads of accounts-backend (`api/logs`). They answer to\n * `admin.readAll` only.\n */\nexport class AccountsLogsService {\n /**\n * The machine-to-machine tokens that were taken for each cluster in the\n * range, one row for each cluster, and whether the read of the Auth0 log\n * stopped before the end of the range. See `M2mTokenCountsDto`.\n */\n public static async getM2mTokenCounts(\n params: GetM2mTokenCountsRequest,\n ): Promise<M2mTokenCountsDto> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'AccountsLogsService.getM2mTokenCounts',\n url: `api/logs/clients/tokens/count?rangeInHours=${encodeURIComponent(params.params.rangeInHours)}`,\n normalizedUrl: 'api/logs/clients/tokens/count',\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n const response = await request<M2mTokenCountsDto>({\n config: params.config,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n responseType: 'json',\n })\n if (!response.ok) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return (\n response.body ?? { clusters: [], counted: 0, total: 0, truncated: false }\n )\n }\n\n /**\n * The active user count of the Auth0 tenant: the users that logged in\n * during the last 30 days. accounts-backend answers 502 when Auth0 refuses\n * it: its Management API client has no `read:stats` scope, or its token is\n * bad or expired.\n */\n public static async getActiveUsers(\n params: RequestBaseParams,\n ): Promise<ActiveUsersDto> {\n const serviceContext: RequestBaseServiceContext = {\n method: {\n name: 'AccountsLogsService.getActiveUsers',\n url: 'api/logs/active-users',\n normalizedUrl: 'api/logs/active-users',\n type: 'get',\n },\n source: params.config.metrics?.source || 'unset',\n target: { name: 'accounts', type: 'internal' },\n }\n const response = await request<ActiveUsersDto>({\n config: params.config,\n base: { id: 'accounts' },\n url: serviceContext.method.url,\n method: serviceContext.method.type,\n metricsDetails: serviceContext,\n responseType: 'json',\n })\n if (!response.ok || !response.body) {\n throw new HttpError(\n `${serviceContext.method.name}: ${response.status} ${response.statusText}`,\n response.status,\n response.statusText,\n )\n }\n return response.body\n }\n}\n"],
|
|
5
|
+
"mappings": "AAcA,SAAS,eAAe;AACxB,SAAS,iBAAiB;AAanB,MAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAM/B,aAAoB,kBAClB,QAC4B;AAC5B,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,KAAK,8CAA8C,mBAAmB,OAAO,OAAO,YAAY,CAAC;AAAA,QACjG,eAAe;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,IAC/C;AACA,UAAM,WAAW,MAAM,QAA2B;AAAA,MAChD,QAAQ,OAAO;AAAA,MACf,MAAM,EAAE,IAAI,WAAW;AAAA,MACvB,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAChB,CAAC;AACD,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI;AAAA,QACR,GAAG,eAAe,OAAO,IAAI,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QACxE,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AACA,WACE,SAAS,QAAQ,EAAE,UAAU,CAAC,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,MAAM;AAAA,EAE5E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,aAAoB,eAClB,QACyB;AACzB,UAAM,iBAA4C;AAAA,MAChD,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,KAAK;AAAA,QACL,eAAe;AAAA,QACf,MAAM;AAAA,MACR;AAAA,MACA,QAAQ,OAAO,OAAO,SAAS,UAAU;AAAA,MACzC,QAAQ,EAAE,MAAM,YAAY,MAAM,WAAW;AAAA,IAC/C;AACA,UAAM,WAAW,MAAM,QAAwB;AAAA,MAC7C,QAAQ,OAAO;AAAA,MACf,MAAM,EAAE,IAAI,WAAW;AAAA,MACvB,KAAK,eAAe,OAAO;AAAA,MAC3B,QAAQ,eAAe,OAAO;AAAA,MAC9B,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAChB,CAAC;AACD,QAAI,CAAC,SAAS,MAAM,CAAC,SAAS,MAAM;AAClC,YAAM,IAAI;AAAA,QACR,GAAG,eAAe,OAAO,IAAI,KAAK,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QACxE,SAAS;AAAA,QACT,SAAS;AAAA,MACX;AAAA,IACF;AACA,WAAO,SAAS;AAAA,EAClB;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@camunda/ccma-api",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.7.0",
|
|
4
4
|
"description": "Centralized API service layer for Camunda Cloud Management Apps",
|
|
5
5
|
"bugs": {
|
|
6
6
|
"url": "https://github.com/camunda/camunda-cloud-management-apps/issues"
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
}
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@camunda/ccma-shared-types": "12.
|
|
44
|
+
"@camunda/ccma-shared-types": "12.8.0"
|
|
45
45
|
},
|
|
46
46
|
"scripts": {
|
|
47
47
|
"build": "node esbuild.mjs && tsc --emitDeclarationOnly --outDir dist",
|