@sfdxy/anypoint-connect 0.15.0 → 0.16.3
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/README.md +32 -14
- package/dist/analysis/LogAnalyzer.d.ts +9 -3
- package/dist/analysis/LogAnalyzer.d.ts.map +1 -1
- package/dist/analysis/LogAnalyzer.js +28 -17
- package/dist/analysis/LogAnalyzer.js.map +1 -1
- package/dist/analysis/error-context.d.ts +2 -0
- package/dist/analysis/error-context.d.ts.map +1 -1
- package/dist/analysis/error-context.js +2 -1
- package/dist/analysis/error-context.js.map +1 -1
- package/dist/analysis/filter.d.ts +54 -0
- package/dist/analysis/filter.d.ts.map +1 -0
- package/dist/analysis/filter.js +100 -0
- package/dist/analysis/filter.js.map +1 -0
- package/dist/analysis/parser.d.ts.map +1 -1
- package/dist/analysis/parser.js +31 -14
- package/dist/analysis/parser.js.map +1 -1
- package/dist/analysis/stats.d.ts +25 -0
- package/dist/analysis/stats.d.ts.map +1 -1
- package/dist/analysis/stats.js +34 -0
- package/dist/analysis/stats.js.map +1 -1
- package/dist/analysis/summary.d.ts +51 -0
- package/dist/analysis/summary.d.ts.map +1 -0
- package/dist/analysis/summary.js +47 -0
- package/dist/analysis/summary.js.map +1 -0
- package/dist/analysis/types.d.ts +14 -0
- package/dist/analysis/types.d.ts.map +1 -1
- package/dist/api/ApiManagerApi.d.ts +53 -0
- package/dist/api/ApiManagerApi.d.ts.map +1 -1
- package/dist/api/ApiManagerApi.js +53 -2
- package/dist/api/ApiManagerApi.js.map +1 -1
- package/dist/api/CloudHub2Api.d.ts +24 -4
- package/dist/api/CloudHub2Api.d.ts.map +1 -1
- package/dist/api/CloudHub2Api.js +10 -22
- package/dist/api/CloudHub2Api.js.map +1 -1
- package/dist/api/ExchangeApi.d.ts +15 -0
- package/dist/api/ExchangeApi.d.ts.map +1 -1
- package/dist/api/ExchangeApi.js +51 -0
- package/dist/api/ExchangeApi.js.map +1 -1
- package/dist/api/LogsApi.d.ts +72 -19
- package/dist/api/LogsApi.d.ts.map +1 -1
- package/dist/api/LogsApi.js +116 -99
- package/dist/api/LogsApi.js.map +1 -1
- package/dist/api/RuntimesApi.d.ts +56 -0
- package/dist/api/RuntimesApi.d.ts.map +1 -0
- package/dist/api/RuntimesApi.js +58 -0
- package/dist/api/RuntimesApi.js.map +1 -0
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/client/AnypointClient.d.ts +2 -0
- package/dist/client/AnypointClient.d.ts.map +1 -1
- package/dist/client/AnypointClient.js +3 -0
- package/dist/client/AnypointClient.js.map +1 -1
- package/dist/client/smoke-test.d.ts +111 -0
- package/dist/client/smoke-test.d.ts.map +1 -0
- package/dist/client/smoke-test.js +275 -0
- package/dist/client/smoke-test.js.map +1 -0
- package/dist/commands/api.d.ts +1 -1
- package/dist/commands/api.d.ts.map +1 -1
- package/dist/commands/api.js +147 -10
- package/dist/commands/api.js.map +1 -1
- package/dist/commands/app-change-cli.d.ts +52 -0
- package/dist/commands/app-change-cli.d.ts.map +1 -0
- package/dist/commands/app-change-cli.js +149 -0
- package/dist/commands/app-change-cli.js.map +1 -0
- package/dist/commands/apps.d.ts +1 -1
- package/dist/commands/apps.d.ts.map +1 -1
- package/dist/commands/apps.js +198 -17
- package/dist/commands/apps.js.map +1 -1
- package/dist/commands/compare.d.ts +8 -0
- package/dist/commands/compare.d.ts.map +1 -0
- package/dist/commands/compare.js +104 -0
- package/dist/commands/compare.js.map +1 -0
- package/dist/commands/deploy.d.ts +4 -3
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +59 -33
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/logs.d.ts +3 -2
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +158 -17
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/runtimes.d.ts +7 -0
- package/dist/commands/runtimes.d.ts.map +1 -0
- package/dist/commands/runtimes.js +66 -0
- package/dist/commands/runtimes.js.map +1 -0
- package/dist/config/profiles.d.ts +8 -0
- package/dist/config/profiles.d.ts.map +1 -1
- package/dist/config/profiles.js.map +1 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +2 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tools/analysis.d.ts.map +1 -1
- package/dist/mcp/tools/analysis.js +74 -30
- package/dist/mcp/tools/analysis.js.map +1 -1
- package/dist/mcp/tools/anypoint-mq.d.ts.map +1 -1
- package/dist/mcp/tools/anypoint-mq.js +5 -2
- package/dist/mcp/tools/anypoint-mq.js.map +1 -1
- package/dist/mcp/tools/api-manager.d.ts +2 -1
- package/dist/mcp/tools/api-manager.d.ts.map +1 -1
- package/dist/mcp/tools/api-manager.js +127 -38
- package/dist/mcp/tools/api-manager.js.map +1 -1
- package/dist/mcp/tools/app-inputs.d.ts +92 -0
- package/dist/mcp/tools/app-inputs.d.ts.map +1 -0
- package/dist/mcp/tools/app-inputs.js +142 -0
- package/dist/mcp/tools/app-inputs.js.map +1 -0
- package/dist/mcp/tools/apps-deploy.d.ts +6 -1
- package/dist/mcp/tools/apps-deploy.d.ts.map +1 -1
- package/dist/mcp/tools/apps-deploy.js +279 -307
- package/dist/mcp/tools/apps-deploy.js.map +1 -1
- package/dist/mcp/tools/apps-lifecycle.d.ts +3 -0
- package/dist/mcp/tools/apps-lifecycle.d.ts.map +1 -1
- package/dist/mcp/tools/apps-lifecycle.js +105 -136
- package/dist/mcp/tools/apps-lifecycle.js.map +1 -1
- package/dist/mcp/tools/apps-read.d.ts +2 -1
- package/dist/mcp/tools/apps-read.d.ts.map +1 -1
- package/dist/mcp/tools/apps-read.js +177 -14
- package/dist/mcp/tools/apps-read.js.map +1 -1
- package/dist/mcp/tools/artifacts.d.ts +8 -0
- package/dist/mcp/tools/artifacts.d.ts.map +1 -0
- package/dist/mcp/tools/artifacts.js +81 -0
- package/dist/mcp/tools/artifacts.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +1 -0
- package/dist/mcp/tools/index.d.ts.map +1 -1
- package/dist/mcp/tools/index.js +1 -0
- package/dist/mcp/tools/index.js.map +1 -1
- package/dist/mcp/tools/logs.d.ts +50 -2
- package/dist/mcp/tools/logs.d.ts.map +1 -1
- package/dist/mcp/tools/logs.js +221 -38
- package/dist/mcp/tools/logs.js.map +1 -1
- package/dist/mcp/tools/shared.d.ts +27 -0
- package/dist/mcp/tools/shared.d.ts.map +1 -1
- package/dist/mcp/tools/shared.js +42 -0
- package/dist/mcp/tools/shared.js.map +1 -1
- package/dist/safety/deployment.d.ts +47 -2
- package/dist/safety/deployment.d.ts.map +1 -1
- package/dist/safety/deployment.js +148 -14
- package/dist/safety/deployment.js.map +1 -1
- package/dist/safety/paths.d.ts +29 -0
- package/dist/safety/paths.d.ts.map +1 -0
- package/dist/safety/paths.js +76 -0
- package/dist/safety/paths.js.map +1 -0
- package/dist/safety/runtime.d.ts +24 -0
- package/dist/safety/runtime.d.ts.map +1 -0
- package/dist/safety/runtime.js +59 -0
- package/dist/safety/runtime.js.map +1 -0
- package/dist/safety/secret-sources.d.ts +51 -0
- package/dist/safety/secret-sources.d.ts.map +1 -0
- package/dist/safety/secret-sources.js +124 -0
- package/dist/safety/secret-sources.js.map +1 -0
- package/dist/safety/secrets.d.ts +32 -0
- package/dist/safety/secrets.d.ts.map +1 -0
- package/dist/safety/secrets.js +91 -0
- package/dist/safety/secrets.js.map +1 -0
- package/dist/utils/errors.d.ts +2 -1
- package/dist/utils/errors.d.ts.map +1 -1
- package/dist/utils/errors.js +5 -3
- package/dist/utils/errors.js.map +1 -1
- package/dist/workflows/app-change.d.ts +124 -0
- package/dist/workflows/app-change.d.ts.map +1 -0
- package/dist/workflows/app-change.js +305 -0
- package/dist/workflows/app-change.js.map +1 -0
- package/dist/workflows/app-state.d.ts +60 -0
- package/dist/workflows/app-state.d.ts.map +1 -0
- package/dist/workflows/app-state.js +95 -0
- package/dist/workflows/app-state.js.map +1 -0
- package/dist/workflows/artifact-compare.d.ts +134 -0
- package/dist/workflows/artifact-compare.d.ts.map +1 -0
- package/dist/workflows/artifact-compare.js +419 -0
- package/dist/workflows/artifact-compare.js.map +1 -0
- package/dist/workflows/asset-naming.d.ts +72 -0
- package/dist/workflows/asset-naming.d.ts.map +1 -0
- package/dist/workflows/asset-naming.js +116 -0
- package/dist/workflows/asset-naming.js.map +1 -0
- package/dist/workflows/jar-deployment.d.ts +76 -39
- package/dist/workflows/jar-deployment.d.ts.map +1 -1
- package/dist/workflows/jar-deployment.js +125 -64
- package/dist/workflows/jar-deployment.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExchangeApi.d.ts","sourceRoot":"","sources":["../../src/api/ExchangeApi.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"ExchangeApi.d.ts","sourceRoot":"","sources":["../../src/api/ExchangeApi.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnD,KAAK,CAAC,EAAE,KAAK,CAAC;QACV,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;QAClB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,GAAG,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;IACH,YAAY,CAAC,EAAE;QACX,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC;CACL;AAED,MAAM,WAAW,mBAAoB,SAAQ,aAAa;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC5E,QAAQ,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACtD,SAAS,CAAC,EAAE,KAAK,CAAC;QACd,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;CACN;AAED,MAAM,WAAW,qBAAqB;IAClC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAOD,wDAAwD;AACxD,eAAO,MAAM,qBAAqB,QAAoB,CAAC;AASvD,qBAAa,WAAW;IAEhB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,KAAK;IAGjC;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,qBAA0B,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAWhG;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAUhG;;OAEG;IACG,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAK7G;;;;;;;;OAQG;IACG,eAAe,CACjB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,cAAc,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,qBAAqB,CAAC;IAuBjC;;;OAGG;IACG,YAAY,CACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAiCrE;;;;OAIG;IACG,cAAc,CAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAO,GACpC,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAwCrF,8FAA8F;IACxF,oBAAoB,CACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC;QACP,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,mBAAmB,EAAE,OAAO,CAAC;KAChC,CAAC;CAgBL"}
|
package/dist/api/ExchangeApi.js
CHANGED
|
@@ -5,10 +5,20 @@
|
|
|
5
5
|
import * as fs from 'fs';
|
|
6
6
|
import * as path from 'path';
|
|
7
7
|
import { createHash } from 'node:crypto';
|
|
8
|
+
import axios, { AxiosError } from 'axios';
|
|
8
9
|
import { verifyArtifactDigest } from '../safety/artifact.js';
|
|
9
10
|
const BASE = '/exchange/api/v2';
|
|
10
11
|
/** Upload timeout for artifact publish — jars are far larger than API calls (30–80 MB). */
|
|
11
12
|
const PUBLISH_TIMEOUT_MS = 300000;
|
|
13
|
+
/** Default ceiling for a downloaded application jar. */
|
|
14
|
+
export const DEFAULT_JAR_MAX_BYTES = 200 * 1024 * 1024;
|
|
15
|
+
/** True for an absolute URL outside the Anypoint control plane, such as presigned storage. */
|
|
16
|
+
function isForeignHost(link) {
|
|
17
|
+
if (!/^https?:\/\//i.test(link))
|
|
18
|
+
return false;
|
|
19
|
+
const host = new URL(link).hostname.toLowerCase();
|
|
20
|
+
return !(host === 'mulesoft.com' || host.endsWith('.mulesoft.com'));
|
|
21
|
+
}
|
|
12
22
|
export class ExchangeApi {
|
|
13
23
|
http;
|
|
14
24
|
cache;
|
|
@@ -103,6 +113,47 @@ export class ExchangeApi {
|
|
|
103
113
|
fileName: specFile.mainFile || `${assetId}.${specFile.classifier}`,
|
|
104
114
|
};
|
|
105
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Download the `mule-application` jar of an app asset, bounded by `maxBytes`. The link
|
|
118
|
+
* comes from the asset's files list. Links on another host (a presigned storage URL) are
|
|
119
|
+
* fetched without the platform token so it never leaves Anypoint.
|
|
120
|
+
*/
|
|
121
|
+
async downloadAppJar(orgId, groupId, artifactId, version, options = {}) {
|
|
122
|
+
const maxBytes = options.maxBytes ?? DEFAULT_JAR_MAX_BYTES;
|
|
123
|
+
const detail = await this.getAsset(groupId, artifactId, version);
|
|
124
|
+
const jarFile = detail.files?.find((file) => file.classifier === 'mule-application' && (!file.packaging || file.packaging === 'jar'));
|
|
125
|
+
const link = jarFile?.externalLink || jarFile?.downloadURL;
|
|
126
|
+
if (!jarFile || !link) {
|
|
127
|
+
throw new Error(`No mule-application jar found for ${groupId}/${artifactId}/${version} in organization ${orgId}. ` +
|
|
128
|
+
`Available files: ${(detail.files || []).map((f) => `${f.classifier}.${f.packaging}`).join(', ') || 'none'}`);
|
|
129
|
+
}
|
|
130
|
+
const config = { maxContentLength: maxBytes, timeout: PUBLISH_TIMEOUT_MS };
|
|
131
|
+
let buffer;
|
|
132
|
+
try {
|
|
133
|
+
if (isForeignHost(link)) {
|
|
134
|
+
const response = await axios.get(link, { ...config, responseType: 'arraybuffer' });
|
|
135
|
+
buffer = Buffer.from(response.data);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
buffer = await this.http.download(link, config);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
catch (error) {
|
|
142
|
+
if (error instanceof AxiosError && /maxContentLength/i.test(error.message)) {
|
|
143
|
+
throw new Error(`Application jar exceeds ${maxBytes} bytes`);
|
|
144
|
+
}
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
if (buffer.length > maxBytes)
|
|
148
|
+
throw new Error(`Application jar exceeds ${maxBytes} bytes`);
|
|
149
|
+
const md5 = createHash('md5').update(buffer).digest('hex');
|
|
150
|
+
return {
|
|
151
|
+
buffer,
|
|
152
|
+
sha256: createHash('sha256').update(buffer).digest('hex'),
|
|
153
|
+
md5Matches: jarFile.md5 ? jarFile.md5 === md5 : true,
|
|
154
|
+
fileName: `${artifactId}-${version}-mule-application.jar`,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
106
157
|
/** Download the published spec artifact and verify its Exchange-provided MD5 when present. */
|
|
107
158
|
async downloadSpecArtifact(groupId, assetId, version) {
|
|
108
159
|
const detail = await this.getAsset(groupId, assetId, version);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExchangeApi.js","sourceRoot":"","sources":["../../src/api/ExchangeApi.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ExchangeApi.js","sourceRoot":"","sources":["../../src/api/ExchangeApi.ts"],"names":[],"mappings":"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"}
|
package/dist/api/LogsApi.d.ts
CHANGED
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import type { HttpClient } from '../client/HttpClient.js';
|
|
7
7
|
import type { CloudHub2Api } from './CloudHub2Api.js';
|
|
8
|
+
import type { EnrichedLogEntry } from '../analysis/types.js';
|
|
9
|
+
import { type LogFilter, type LogSearchOptions } from '../analysis/filter.js';
|
|
10
|
+
export { MAX_LOG_LINES } from '../analysis/filter.js';
|
|
11
|
+
export type { LogFilter, LogSearchOptions } from '../analysis/filter.js';
|
|
8
12
|
export interface LogEntry {
|
|
9
13
|
timestamp: number;
|
|
10
14
|
message: string;
|
|
@@ -14,10 +18,43 @@ export interface LogEntry {
|
|
|
14
18
|
instanceId?: string;
|
|
15
19
|
deploymentId?: string;
|
|
16
20
|
}
|
|
21
|
+
/** Most earlier specs one read may include. */
|
|
22
|
+
export declare const MAX_PREVIOUS_SPECS = 10;
|
|
23
|
+
export interface LogReadOptions {
|
|
24
|
+
/**
|
|
25
|
+
* Also read this many specs before the desired one (0 to MAX_PREVIOUS_SPECS), so the generation
|
|
26
|
+
* replaced by an update stays visible. Default 0: the desired spec, or the last successful one.
|
|
27
|
+
*/
|
|
28
|
+
previousSpecs?: number;
|
|
29
|
+
}
|
|
30
|
+
/** Where a log file came from. */
|
|
31
|
+
export interface LogSource {
|
|
32
|
+
deploymentId: string;
|
|
33
|
+
/** The spec whose log file was read */
|
|
34
|
+
specId: string;
|
|
35
|
+
/** Set when the desired spec had no log file or an empty one, and the last successful spec was read instead */
|
|
36
|
+
fallbackFromSpecId?: string;
|
|
37
|
+
/** With previousSpecs: every spec whose log file was read, oldest first */
|
|
38
|
+
specIds?: string[];
|
|
39
|
+
}
|
|
40
|
+
export interface LogFile extends LogSource {
|
|
41
|
+
text: string;
|
|
42
|
+
}
|
|
17
43
|
export interface LogSearchResponse {
|
|
44
|
+
/** Matches before `limit` was applied */
|
|
18
45
|
total: number;
|
|
19
|
-
|
|
46
|
+
/** Entries returned */
|
|
47
|
+
returned: number;
|
|
48
|
+
truncated: boolean;
|
|
49
|
+
/** Newest first */
|
|
50
|
+
entries: EnrichedLogEntry[];
|
|
51
|
+
source: LogSource;
|
|
20
52
|
}
|
|
53
|
+
/**
|
|
54
|
+
* Parse a log file into entries, oldest first. A file read across several specs holds one
|
|
55
|
+
* block per spec, and replicas of two generations can overlap in time, so entries are sorted.
|
|
56
|
+
*/
|
|
57
|
+
export declare function parseLogFile(file: LogFile): EnrichedLogEntry[];
|
|
21
58
|
export declare class LogsApi {
|
|
22
59
|
private readonly http;
|
|
23
60
|
private readonly ch2?;
|
|
@@ -28,42 +65,58 @@ export declare class LogsApi {
|
|
|
28
65
|
*/
|
|
29
66
|
downloadLogFile(orgId: string, envId: string, deploymentId: string, specId: string): Promise<Buffer>;
|
|
30
67
|
/**
|
|
31
|
-
* Resolve an app name to its deployment
|
|
68
|
+
* Resolve an app name to its deployment and the specs whose logs to read, preferred first:
|
|
69
|
+
* the desired spec, then the last successful one when it differs.
|
|
32
70
|
*/
|
|
33
71
|
private resolveDeployment;
|
|
34
72
|
/**
|
|
35
|
-
*
|
|
36
|
-
*
|
|
73
|
+
* Fetch the log file for an app. Reads the desired spec's file; right after a change that
|
|
74
|
+
* file can be missing or empty while the platform starts the new replicas, so the last
|
|
75
|
+
* successful spec's file is read instead and `fallbackFromSpecId` says so.
|
|
37
76
|
*/
|
|
38
|
-
|
|
77
|
+
getLogFile(orgId: string, envId: string, appName: string, read?: LogReadOptions): Promise<LogFile>;
|
|
78
|
+
/**
|
|
79
|
+
* Read the desired spec and up to `count` specs before it, joined oldest first.
|
|
80
|
+
* Specs without a log file (never started, or expired) are skipped.
|
|
81
|
+
*/
|
|
82
|
+
private readSpecs;
|
|
39
83
|
/**
|
|
40
84
|
* Get raw log text for a CH2 application (for analysis pipeline).
|
|
41
85
|
* Returns the full log file as a string without parsing.
|
|
42
86
|
*/
|
|
43
|
-
getRawText(orgId: string, envId: string, appName: string): Promise<string>;
|
|
87
|
+
getRawText(orgId: string, envId: string, appName: string, read?: LogReadOptions): Promise<string>;
|
|
44
88
|
/**
|
|
45
|
-
*
|
|
46
|
-
*
|
|
89
|
+
* Search an app's log file. Multi-line entries (stack traces, error reports, JSON Logger
|
|
90
|
+
* bodies) are joined to the line that starts them and keep its timestamp and level.
|
|
91
|
+
* Returns the newest `limit` matches (default 100, at most MAX_LOG_LINES) and the full match count.
|
|
47
92
|
*/
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
93
|
+
searchLogs(orgId: string, envId: string, appName: string, options?: LogSearchOptions & LogReadOptions): Promise<LogSearchResponse>;
|
|
94
|
+
/**
|
|
95
|
+
* Get parsed log entries for a CH2 application, newest first.
|
|
96
|
+
* See `searchLogs` for the counts and the source spec.
|
|
97
|
+
*/
|
|
98
|
+
getLogs(orgId: string, envId: string, appName: string, options?: LogSearchOptions & LogReadOptions): Promise<EnrichedLogEntry[]>;
|
|
99
|
+
/**
|
|
100
|
+
* Every entry that passes a filter, oldest first, with no line cap.
|
|
101
|
+
*/
|
|
102
|
+
queryLogs(orgId: string, envId: string, appName: string, filter?: LogFilter, read?: LogReadOptions): Promise<{
|
|
103
|
+
entries: EnrichedLogEntry[];
|
|
104
|
+
source: LogSource;
|
|
105
|
+
}>;
|
|
55
106
|
/**
|
|
56
|
-
* Tail logs
|
|
57
|
-
* Polls the log file
|
|
107
|
+
* Tail logs: a generator that yields new log entries.
|
|
108
|
+
* Polls the log file and re-resolves the spec each time, so a restart is followed.
|
|
58
109
|
*/
|
|
59
110
|
tailLogs(orgId: string, envId: string, appName: string, options?: {
|
|
60
111
|
level?: string;
|
|
61
112
|
intervalMs?: number;
|
|
62
113
|
search?: string;
|
|
114
|
+
regex?: boolean;
|
|
115
|
+
logger?: string;
|
|
63
116
|
}): AsyncGenerator<LogEntry[], void, unknown>;
|
|
64
117
|
/**
|
|
65
|
-
* Get all logs for a time range.
|
|
118
|
+
* Get all logs for a time range, newest first.
|
|
66
119
|
*/
|
|
67
|
-
getLogsForPeriod(orgId: string, envId: string, appName: string, startTime: number, endTime: number, level?: string): Promise<
|
|
120
|
+
getLogsForPeriod(orgId: string, envId: string, appName: string, startTime: number, endTime: number, level?: string): Promise<EnrichedLogEntry[]>;
|
|
68
121
|
}
|
|
69
122
|
//# sourceMappingURL=LogsApi.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogsApi.d.ts","sourceRoot":"","sources":["../../src/api/LogsApi.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"LogsApi.d.ts","sourceRoot":"","sources":["../../src/api/LogsApi.ts"],"names":[],"mappings":"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"}
|
package/dist/api/LogsApi.js
CHANGED
|
@@ -3,17 +3,35 @@
|
|
|
3
3
|
* Log tailing, fetching, and downloading for CloudHub 2.0
|
|
4
4
|
* Uses the AMC log file download endpoint with spec ID resolution
|
|
5
5
|
*/
|
|
6
|
+
import { parseRawLogs } from '../analysis/parser.js';
|
|
7
|
+
import { buildFilter, searchEntries } from '../analysis/filter.js';
|
|
6
8
|
import { errorMessage } from '../utils/errors.js';
|
|
9
|
+
export { MAX_LOG_LINES } from '../analysis/filter.js';
|
|
10
|
+
/** Most earlier specs one read may include. */
|
|
11
|
+
export const MAX_PREVIOUS_SPECS = 10;
|
|
7
12
|
const AMC_BASE = '/amc/application-manager/api/v2';
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
13
|
+
function httpStatus(error) {
|
|
14
|
+
return error?.response?.status;
|
|
15
|
+
}
|
|
16
|
+
function sourceOf(file) {
|
|
17
|
+
const { text: _text, ...source } = file;
|
|
18
|
+
return source;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Parse a log file into entries, oldest first. A file read across several specs holds one
|
|
22
|
+
* block per spec, and replicas of two generations can overlap in time, so entries are sorted.
|
|
23
|
+
*/
|
|
24
|
+
export function parseLogFile(file) {
|
|
25
|
+
const entries = parseRawLogs(file.text);
|
|
26
|
+
// Stable sort: entries that share a timestamp keep their file order.
|
|
27
|
+
return (file.specIds?.length ?? 0) > 1 ? entries.sort((a, b) => a.timestamp - b.timestamp) : entries;
|
|
28
|
+
}
|
|
29
|
+
function checkPreviousSpecs(count) {
|
|
30
|
+
if (!Number.isInteger(count) || count < 0 || count > MAX_PREVIOUS_SPECS) {
|
|
31
|
+
throw new Error(`previousSpecs must be a whole number from 0 to ${MAX_PREVIOUS_SPECS}`);
|
|
32
|
+
}
|
|
33
|
+
return count;
|
|
34
|
+
}
|
|
17
35
|
export class LogsApi {
|
|
18
36
|
http;
|
|
19
37
|
ch2;
|
|
@@ -34,124 +52,126 @@ export class LogsApi {
|
|
|
34
52
|
});
|
|
35
53
|
}
|
|
36
54
|
/**
|
|
37
|
-
* Resolve an app name to its deployment
|
|
55
|
+
* Resolve an app name to its deployment and the specs whose logs to read, preferred first:
|
|
56
|
+
* the desired spec, then the last successful one when it differs.
|
|
38
57
|
*/
|
|
39
58
|
async resolveDeployment(orgId, envId, appName) {
|
|
40
59
|
if (!this.ch2) {
|
|
41
60
|
throw new Error('CloudHub2Api required for log operations');
|
|
42
61
|
}
|
|
43
|
-
// Get full deployment detail to access desiredVersion (spec ID)
|
|
44
62
|
const deployment = await this.ch2.findByName(orgId, envId, appName);
|
|
45
63
|
if (!deployment) {
|
|
46
64
|
throw new Error(`Application "${appName}" not found in environment`);
|
|
47
65
|
}
|
|
48
|
-
// Get detailed deployment info with desiredVersion
|
|
49
66
|
const detail = await this.ch2.getDeployment(orgId, envId, deployment.id);
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
throw new Error(`No spec version found for "${appName}" — app may not be fully deployed`);
|
|
67
|
+
const specIds = [detail.desiredVersion, detail.lastSuccessfulVersion].filter((id, i, all) => !!id && all.indexOf(id) === i);
|
|
68
|
+
if (specIds.length === 0) {
|
|
69
|
+
throw new Error(`No spec version found for "${appName}". The app may not be fully deployed yet`);
|
|
54
70
|
}
|
|
55
|
-
return { deploymentId: deployment.id,
|
|
71
|
+
return { deploymentId: deployment.id, specIds };
|
|
56
72
|
}
|
|
57
73
|
/**
|
|
58
|
-
*
|
|
59
|
-
*
|
|
74
|
+
* Fetch the log file for an app. Reads the desired spec's file; right after a change that
|
|
75
|
+
* file can be missing or empty while the platform starts the new replicas, so the last
|
|
76
|
+
* successful spec's file is read instead and `fallbackFromSpecId` says so.
|
|
60
77
|
*/
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
message: match[4],
|
|
72
|
-
};
|
|
78
|
+
async getLogFile(orgId, envId, appName, read = {}) {
|
|
79
|
+
const previousSpecs = checkPreviousSpecs(read.previousSpecs ?? 0);
|
|
80
|
+
const { deploymentId, specIds } = await this.resolveDeployment(orgId, envId, appName);
|
|
81
|
+
const [desired, previous] = specIds;
|
|
82
|
+
if (previousSpecs > 0) {
|
|
83
|
+
return this.readSpecs(orgId, envId, deploymentId, desired, previousSpecs);
|
|
84
|
+
}
|
|
85
|
+
let text = '';
|
|
86
|
+
try {
|
|
87
|
+
text = (await this.downloadLogFile(orgId, envId, deploymentId, desired)).toString('utf-8');
|
|
73
88
|
}
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
89
|
+
catch (error) {
|
|
90
|
+
if (!previous || httpStatus(error) !== 404)
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
if (text.trim() || !previous) {
|
|
94
|
+
return { deploymentId, specId: desired, text };
|
|
95
|
+
}
|
|
96
|
+
const fallback = (await this.downloadLogFile(orgId, envId, deploymentId, previous)).toString('utf-8');
|
|
97
|
+
return { deploymentId, specId: previous, fallbackFromSpecId: desired, text: fallback };
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Read the desired spec and up to `count` specs before it, joined oldest first.
|
|
101
|
+
* Specs without a log file (never started, or expired) are skipped.
|
|
102
|
+
*/
|
|
103
|
+
async readSpecs(orgId, envId, deploymentId, desired, count) {
|
|
104
|
+
if (!this.ch2)
|
|
105
|
+
throw new Error('CloudHub2Api required for log operations');
|
|
106
|
+
// The specs API lists newest first; start at the desired spec so a newer, unapplied one is not read.
|
|
107
|
+
const all = (await this.ch2.getDeploymentSpecs(orgId, envId, deploymentId)).map((s) => s.version);
|
|
108
|
+
const start = Math.max(all.indexOf(desired), 0);
|
|
109
|
+
const chosen = [desired, ...all.slice(start).filter((id) => id !== desired)].slice(0, count + 1).reverse();
|
|
110
|
+
const read = [];
|
|
111
|
+
const blocks = [];
|
|
112
|
+
for (const specId of chosen) {
|
|
113
|
+
try {
|
|
114
|
+
const text = (await this.downloadLogFile(orgId, envId, deploymentId, specId)).toString('utf-8');
|
|
115
|
+
read.push(specId);
|
|
116
|
+
if (text.trim())
|
|
117
|
+
blocks.push(text.endsWith('\n') ? text : `${text}\n`);
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
if (httpStatus(error) !== 404)
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return { deploymentId, specId: desired, specIds: read, text: blocks.join('') };
|
|
80
125
|
}
|
|
81
126
|
/**
|
|
82
127
|
* Get raw log text for a CH2 application (for analysis pipeline).
|
|
83
128
|
* Returns the full log file as a string without parsing.
|
|
84
129
|
*/
|
|
85
|
-
async getRawText(orgId, envId, appName) {
|
|
86
|
-
|
|
87
|
-
const buffer = await this.downloadLogFile(orgId, envId, deploymentId, specId);
|
|
88
|
-
return buffer.toString('utf-8');
|
|
130
|
+
async getRawText(orgId, envId, appName, read = {}) {
|
|
131
|
+
return (await this.getLogFile(orgId, envId, appName, read)).text;
|
|
89
132
|
}
|
|
90
133
|
/**
|
|
91
|
-
*
|
|
92
|
-
*
|
|
134
|
+
* Search an app's log file. Multi-line entries (stack traces, error reports, JSON Logger
|
|
135
|
+
* bodies) are joined to the line that starts them and keep its timestamp and level.
|
|
136
|
+
* Returns the newest `limit` matches (default 100, at most MAX_LOG_LINES) and the full match count.
|
|
137
|
+
*/
|
|
138
|
+
async searchLogs(orgId, envId, appName, options = {}) {
|
|
139
|
+
const file = await this.getLogFile(orgId, envId, appName, options);
|
|
140
|
+
return { ...searchEntries(parseLogFile(file), options), source: sourceOf(file) };
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Get parsed log entries for a CH2 application, newest first.
|
|
144
|
+
* See `searchLogs` for the counts and the source spec.
|
|
93
145
|
*/
|
|
94
146
|
async getLogs(orgId, envId, appName, options = {}) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
if (!entry)
|
|
104
|
-
continue;
|
|
105
|
-
// Filter by time
|
|
106
|
-
if (options.startTime && entry.timestamp < options.startTime)
|
|
107
|
-
continue;
|
|
108
|
-
if (options.endTime && entry.timestamp > options.endTime)
|
|
109
|
-
continue;
|
|
110
|
-
// Filter by level
|
|
111
|
-
if ((LEVEL_PRIORITY[entry.priority] ?? 0) < minLevel)
|
|
112
|
-
continue;
|
|
113
|
-
// Filter by search
|
|
114
|
-
if (options.search && !entry.message.toLowerCase().includes(options.search.toLowerCase()))
|
|
115
|
-
continue;
|
|
116
|
-
entries.push(entry);
|
|
117
|
-
}
|
|
118
|
-
// Sort descending by default (newest first), limit
|
|
119
|
-
entries.sort((a, b) => b.timestamp - a.timestamp);
|
|
120
|
-
if (options.limit) {
|
|
121
|
-
entries = entries.slice(0, options.limit);
|
|
122
|
-
}
|
|
123
|
-
return entries;
|
|
147
|
+
return (await this.searchLogs(orgId, envId, appName, options)).entries;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Every entry that passes a filter, oldest first, with no line cap.
|
|
151
|
+
*/
|
|
152
|
+
async queryLogs(orgId, envId, appName, filter = {}, read = {}) {
|
|
153
|
+
const file = await this.getLogFile(orgId, envId, appName, read);
|
|
154
|
+
return { entries: parseLogFile(file).filter(buildFilter(filter)), source: sourceOf(file) };
|
|
124
155
|
}
|
|
125
156
|
/**
|
|
126
|
-
* Tail logs
|
|
127
|
-
* Polls the log file
|
|
157
|
+
* Tail logs: a generator that yields new log entries.
|
|
158
|
+
* Polls the log file and re-resolves the spec each time, so a restart is followed.
|
|
128
159
|
*/
|
|
129
160
|
async *tailLogs(orgId, envId, appName, options = {}) {
|
|
130
161
|
const intervalMs = options.intervalMs || 5000;
|
|
131
|
-
const
|
|
162
|
+
const keep = buildFilter({
|
|
163
|
+
level: options.level,
|
|
164
|
+
search: options.search,
|
|
165
|
+
regex: options.regex,
|
|
166
|
+
logger: options.logger,
|
|
167
|
+
});
|
|
132
168
|
let lastTimestamp = Date.now() - 30000; // start from 30 seconds ago
|
|
133
169
|
while (true) {
|
|
134
170
|
try {
|
|
135
|
-
const
|
|
136
|
-
const text = buffer.toString('utf-8');
|
|
171
|
+
const { text } = await this.getLogFile(orgId, envId, appName);
|
|
137
172
|
// Only parse the last portion for performance (last 100KB)
|
|
138
173
|
const tail = text.length > 100000 ? text.substring(text.length - 100000) : text;
|
|
139
|
-
const
|
|
140
|
-
const levelPriority = LEVEL_PRIORITY;
|
|
141
|
-
const minLevel = options.level ? (levelPriority[options.level.toUpperCase()] ?? 0) : 0;
|
|
142
|
-
const newEntries = [];
|
|
143
|
-
for (const line of lines) {
|
|
144
|
-
const entry = this.parseLogLine(line);
|
|
145
|
-
if (!entry)
|
|
146
|
-
continue;
|
|
147
|
-
if (entry.timestamp <= lastTimestamp)
|
|
148
|
-
continue;
|
|
149
|
-
if ((levelPriority[entry.priority] ?? 0) < minLevel)
|
|
150
|
-
continue;
|
|
151
|
-
if (options.search && !entry.message.toLowerCase().includes(options.search.toLowerCase()))
|
|
152
|
-
continue;
|
|
153
|
-
newEntries.push(entry);
|
|
154
|
-
}
|
|
174
|
+
const newEntries = parseRawLogs(tail).filter((e) => e.timestamp > lastTimestamp && keep(e));
|
|
155
175
|
if (newEntries.length > 0) {
|
|
156
176
|
newEntries.sort((a, b) => a.timestamp - b.timestamp);
|
|
157
177
|
lastTimestamp = newEntries[newEntries.length - 1].timestamp;
|
|
@@ -165,14 +185,11 @@ export class LogsApi {
|
|
|
165
185
|
}
|
|
166
186
|
}
|
|
167
187
|
/**
|
|
168
|
-
* Get all logs for a time range.
|
|
188
|
+
* Get all logs for a time range, newest first.
|
|
169
189
|
*/
|
|
170
190
|
async getLogsForPeriod(orgId, envId, appName, startTime, endTime, level) {
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
endTime,
|
|
174
|
-
level,
|
|
175
|
-
});
|
|
191
|
+
const { entries } = await this.queryLogs(orgId, envId, appName, { startTime, endTime, level });
|
|
192
|
+
return entries.reverse();
|
|
176
193
|
}
|
|
177
194
|
}
|
|
178
195
|
//# sourceMappingURL=LogsApi.js.map
|
package/dist/api/LogsApi.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LogsApi.js","sourceRoot":"","sources":["../../src/api/LogsApi.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"LogsApi.js","sourceRoot":"","sources":["../../src/api/LogsApi.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAyC,MAAM,uBAAuB,CAAC;AAC1G,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAatD,+CAA+C;AAC/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAoCrC,MAAM,QAAQ,GAAG,iCAAiC,CAAC;AAEnD,SAAS,UAAU,CAAC,KAAc;IAC9B,OAAQ,KAAwD,EAAE,QAAQ,EAAE,MAAM,CAAC;AACvF,CAAC;AAED,SAAS,QAAQ,CAAC,IAAa;IAC3B,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,EAAE,GAAG,IAAI,CAAC;IACxC,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAa;IACtC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxC,qEAAqE;IACrE,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;AACzG,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAa;IACrC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,kBAAkB,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,kDAAkD,kBAAkB,EAAE,CAAC,CAAC;IAC5F,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,MAAM,OAAO,OAAO;IAEK;IACA;IAFrB,YACqB,IAAgB,EAChB,GAAkB;QADlB,SAAI,GAAJ,IAAI,CAAY;QAChB,QAAG,GAAH,GAAG,CAAe;IACpC,CAAC;IAEJ;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAC,KAAa,EAAE,KAAa,EAAE,YAAoB,EAAE,MAAc;QACpF,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CACrB,GAAG,QAAQ,kBAAkB,KAAK,iBAAiB,KAAK,gBAAgB,YAAY,UAAU,MAAM,YAAY,EAChH;YACI,OAAO,EAAE;gBACL,iBAAiB,EAAE,KAAK;gBACxB,iBAAiB,EAAE,KAAK;aAC3B;SACJ,CACJ,CAAC;IACN,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,iBAAiB,CAC3B,KAAa,EACb,KAAa,EACb,OAAe;QAEf,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACpE,IAAI,CAAC,UAAU,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,gBAAgB,OAAO,4BAA4B,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC,MAAM,CACxE,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,CAC9D,CAAC;QAEF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CAAC,8BAA8B,OAAO,0CAA0C,CAAC,CAAC;QACrG,CAAC;QAED,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,KAAa,EAAE,OAAe,EAAE,OAAuB,EAAE;QACrF,MAAM,aAAa,GAAG,kBAAkB,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC;QAClE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACtF,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,GAAG,OAAO,CAAC;QACpC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QAC9E,CAAC;QAED,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG;gBAAE,MAAM,KAAK,CAAC;QAC5D,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QACnD,CAAC;QAED,MAAM,QAAQ,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACtG,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC3F,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,SAAS,CACnB,KAAa,EACb,KAAa,EACb,YAAoB,EACpB,OAAe,EACf,KAAa;QAEb,IAAI,CAAC,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC3E,qGAAqG;QACrG,MAAM,GAAG,GAAG,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QAClG,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAE3G,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACD,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBAChG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClB,IAAI,IAAI,CAAC,IAAI,EAAE;oBAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;YAC3E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACb,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG;oBAAE,MAAM,KAAK,CAAC;YAC/C,CAAC;QACL,CAAC;QACD,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACnF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,KAAa,EAAE,KAAa,EAAE,OAAe,EAAE,OAAuB,EAAE;QACrF,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,UAAU,CACZ,KAAa,EACb,KAAa,EACb,OAAe,EACf,UAA6C,EAAE;QAE/C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACnE,OAAO,EAAE,GAAG,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IACrF,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CACT,KAAa,EACb,KAAa,EACb,OAAe,EACf,UAA6C,EAAE;QAE/C,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC3E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CACX,KAAa,EACb,KAAa,EACb,OAAe,EACf,SAAoB,EAAE,EACtB,OAAuB,EAAE;QAEzB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAChE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/F,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,CAAC,QAAQ,CACX,KAAa,EACb,KAAa,EACb,OAAe,EACf,UAMI,EAAE;QAEN,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC;QAC9C,MAAM,IAAI,GAAG,WAAW,CAAC;YACrB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,IAAI,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC,4BAA4B;QAEpE,OAAO,IAAI,EAAE,CAAC;YACV,IAAI,CAAC;gBACD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC9D,2DAA2D;gBAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAEhF,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE5F,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACxB,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC;oBACrD,aAAa,GAAG,UAAU,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;oBAC5D,MAAM,UAAU,CAAC;gBACrB,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,mBAAmB,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QACpE,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAClB,KAAa,EACb,KAAa,EACb,OAAe,EACf,SAAiB,EACjB,OAAe,EACf,KAAc;QAEd,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/F,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;CACJ"}
|