@kadi.build/deploy-ability 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +523 -0
- package/dist/constants.d.ts +82 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +82 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors/certificate-error.d.ts +95 -0
- package/dist/errors/certificate-error.d.ts.map +1 -0
- package/dist/errors/certificate-error.js +111 -0
- package/dist/errors/certificate-error.js.map +1 -0
- package/dist/errors/deployment-error.d.ts +122 -0
- package/dist/errors/deployment-error.d.ts.map +1 -0
- package/dist/errors/deployment-error.js +185 -0
- package/dist/errors/deployment-error.js.map +1 -0
- package/dist/errors/index.d.ts +13 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +18 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/profile-error.d.ts +106 -0
- package/dist/errors/profile-error.d.ts.map +1 -0
- package/dist/errors/profile-error.js +127 -0
- package/dist/errors/profile-error.js.map +1 -0
- package/dist/errors/provider-error.d.ts +104 -0
- package/dist/errors/provider-error.d.ts.map +1 -0
- package/dist/errors/provider-error.js +120 -0
- package/dist/errors/provider-error.js.map +1 -0
- package/dist/errors/wallet-error.d.ts +131 -0
- package/dist/errors/wallet-error.d.ts.map +1 -0
- package/dist/errors/wallet-error.js +154 -0
- package/dist/errors/wallet-error.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/targets/akash/bid-selectors.d.ts +251 -0
- package/dist/targets/akash/bid-selectors.d.ts.map +1 -0
- package/dist/targets/akash/bid-selectors.js +322 -0
- package/dist/targets/akash/bid-selectors.js.map +1 -0
- package/dist/targets/akash/bid-types.d.ts +297 -0
- package/dist/targets/akash/bid-types.d.ts.map +1 -0
- package/dist/targets/akash/bid-types.js +89 -0
- package/dist/targets/akash/bid-types.js.map +1 -0
- package/dist/targets/akash/blockchain-client.d.ts +577 -0
- package/dist/targets/akash/blockchain-client.d.ts.map +1 -0
- package/dist/targets/akash/blockchain-client.js +803 -0
- package/dist/targets/akash/blockchain-client.js.map +1 -0
- package/dist/targets/akash/certificate-manager.d.ts +228 -0
- package/dist/targets/akash/certificate-manager.d.ts.map +1 -0
- package/dist/targets/akash/certificate-manager.js +395 -0
- package/dist/targets/akash/certificate-manager.js.map +1 -0
- package/dist/targets/akash/constants.d.ts +231 -0
- package/dist/targets/akash/constants.d.ts.map +1 -0
- package/dist/targets/akash/constants.js +225 -0
- package/dist/targets/akash/constants.js.map +1 -0
- package/dist/targets/akash/deployer.d.ts +136 -0
- package/dist/targets/akash/deployer.d.ts.map +1 -0
- package/dist/targets/akash/deployer.js +599 -0
- package/dist/targets/akash/deployer.js.map +1 -0
- package/dist/targets/akash/environment.d.ts +241 -0
- package/dist/targets/akash/environment.d.ts.map +1 -0
- package/dist/targets/akash/environment.js +245 -0
- package/dist/targets/akash/environment.js.map +1 -0
- package/dist/targets/akash/index.d.ts +1113 -0
- package/dist/targets/akash/index.d.ts.map +1 -0
- package/dist/targets/akash/index.js +909 -0
- package/dist/targets/akash/index.js.map +1 -0
- package/dist/targets/akash/lease-monitor.d.ts +51 -0
- package/dist/targets/akash/lease-monitor.d.ts.map +1 -0
- package/dist/targets/akash/lease-monitor.js +110 -0
- package/dist/targets/akash/lease-monitor.js.map +1 -0
- package/dist/targets/akash/logs.d.ts +71 -0
- package/dist/targets/akash/logs.d.ts.map +1 -0
- package/dist/targets/akash/logs.js +311 -0
- package/dist/targets/akash/logs.js.map +1 -0
- package/dist/targets/akash/logs.types.d.ts +102 -0
- package/dist/targets/akash/logs.types.d.ts.map +1 -0
- package/dist/targets/akash/logs.types.js +9 -0
- package/dist/targets/akash/logs.types.js.map +1 -0
- package/dist/targets/akash/pricing.d.ts +247 -0
- package/dist/targets/akash/pricing.d.ts.map +1 -0
- package/dist/targets/akash/pricing.js +246 -0
- package/dist/targets/akash/pricing.js.map +1 -0
- package/dist/targets/akash/provider-client.d.ts +114 -0
- package/dist/targets/akash/provider-client.d.ts.map +1 -0
- package/dist/targets/akash/provider-client.js +318 -0
- package/dist/targets/akash/provider-client.js.map +1 -0
- package/dist/targets/akash/provider-metadata.d.ts +228 -0
- package/dist/targets/akash/provider-metadata.d.ts.map +1 -0
- package/dist/targets/akash/provider-metadata.js +14 -0
- package/dist/targets/akash/provider-metadata.js.map +1 -0
- package/dist/targets/akash/provider-service.d.ts +133 -0
- package/dist/targets/akash/provider-service.d.ts.map +1 -0
- package/dist/targets/akash/provider-service.js +391 -0
- package/dist/targets/akash/provider-service.js.map +1 -0
- package/dist/targets/akash/query-client.d.ts +125 -0
- package/dist/targets/akash/query-client.d.ts.map +1 -0
- package/dist/targets/akash/query-client.js +332 -0
- package/dist/targets/akash/query-client.js.map +1 -0
- package/dist/targets/akash/sdl-generator.d.ts +31 -0
- package/dist/targets/akash/sdl-generator.d.ts.map +1 -0
- package/dist/targets/akash/sdl-generator.js +279 -0
- package/dist/targets/akash/sdl-generator.js.map +1 -0
- package/dist/targets/akash/types.d.ts +285 -0
- package/dist/targets/akash/types.d.ts.map +1 -0
- package/dist/targets/akash/types.js +54 -0
- package/dist/targets/akash/types.js.map +1 -0
- package/dist/targets/akash/wallet-manager.d.ts +526 -0
- package/dist/targets/akash/wallet-manager.d.ts.map +1 -0
- package/dist/targets/akash/wallet-manager.js +953 -0
- package/dist/targets/akash/wallet-manager.js.map +1 -0
- package/dist/targets/local/compose-generator.d.ts +244 -0
- package/dist/targets/local/compose-generator.d.ts.map +1 -0
- package/dist/targets/local/compose-generator.js +324 -0
- package/dist/targets/local/compose-generator.js.map +1 -0
- package/dist/targets/local/deployer.d.ts +82 -0
- package/dist/targets/local/deployer.d.ts.map +1 -0
- package/dist/targets/local/deployer.js +367 -0
- package/dist/targets/local/deployer.js.map +1 -0
- package/dist/targets/local/engine-manager.d.ts +155 -0
- package/dist/targets/local/engine-manager.d.ts.map +1 -0
- package/dist/targets/local/engine-manager.js +250 -0
- package/dist/targets/local/engine-manager.js.map +1 -0
- package/dist/targets/local/index.d.ts +40 -0
- package/dist/targets/local/index.d.ts.map +1 -0
- package/dist/targets/local/index.js +43 -0
- package/dist/targets/local/index.js.map +1 -0
- package/dist/targets/local/network-manager.d.ts +160 -0
- package/dist/targets/local/network-manager.d.ts.map +1 -0
- package/dist/targets/local/network-manager.js +337 -0
- package/dist/targets/local/network-manager.js.map +1 -0
- package/dist/targets/local/types.d.ts +327 -0
- package/dist/targets/local/types.d.ts.map +1 -0
- package/dist/targets/local/types.js +9 -0
- package/dist/targets/local/types.js.map +1 -0
- package/dist/types/common.d.ts +585 -0
- package/dist/types/common.d.ts.map +1 -0
- package/dist/types/common.js +13 -0
- package/dist/types/common.js.map +1 -0
- package/dist/types/index.d.ts +15 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/options.d.ts +329 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/options.js +10 -0
- package/dist/types/options.js.map +1 -0
- package/dist/types/profiles.d.ts +329 -0
- package/dist/types/profiles.d.ts.map +1 -0
- package/dist/types/profiles.js +27 -0
- package/dist/types/profiles.js.map +1 -0
- package/dist/types/results.d.ts +443 -0
- package/dist/types/results.d.ts.map +1 -0
- package/dist/types/results.js +64 -0
- package/dist/types/results.js.map +1 -0
- package/dist/types/validators.d.ts +118 -0
- package/dist/types/validators.d.ts.map +1 -0
- package/dist/types/validators.js +198 -0
- package/dist/types/validators.js.map +1 -0
- package/dist/utils/command-runner.d.ts +128 -0
- package/dist/utils/command-runner.d.ts.map +1 -0
- package/dist/utils/command-runner.js +210 -0
- package/dist/utils/command-runner.js.map +1 -0
- package/dist/utils/index.d.ts +10 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +10 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +68 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +93 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/profile-loader.d.ts +76 -0
- package/dist/utils/profile-loader.d.ts.map +1 -0
- package/dist/utils/profile-loader.js +194 -0
- package/dist/utils/profile-loader.js.map +1 -0
- package/dist/utils/registry/index.d.ts +27 -0
- package/dist/utils/registry/index.d.ts.map +1 -0
- package/dist/utils/registry/index.js +29 -0
- package/dist/utils/registry/index.js.map +1 -0
- package/dist/utils/registry/manager.d.ts +319 -0
- package/dist/utils/registry/manager.d.ts.map +1 -0
- package/dist/utils/registry/manager.js +671 -0
- package/dist/utils/registry/manager.js.map +1 -0
- package/dist/utils/registry/setup.d.ts +135 -0
- package/dist/utils/registry/setup.d.ts.map +1 -0
- package/dist/utils/registry/setup.js +207 -0
- package/dist/utils/registry/setup.js.map +1 -0
- package/dist/utils/registry/transformer.d.ts +92 -0
- package/dist/utils/registry/transformer.d.ts.map +1 -0
- package/dist/utils/registry/transformer.js +131 -0
- package/dist/utils/registry/transformer.js.map +1 -0
- package/dist/utils/registry/types.d.ts +241 -0
- package/dist/utils/registry/types.d.ts.map +1 -0
- package/dist/utils/registry/types.js +10 -0
- package/dist/utils/registry/types.js.map +1 -0
- package/docs/EXAMPLES.md +293 -0
- package/docs/PLACEMENT.md +433 -0
- package/docs/STORAGE.md +318 -0
- package/docs/building-provider-reliability-tracker.md +2581 -0
- package/package.json +109 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/targets/akash/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lease Monitoring Helpers
|
|
3
|
+
*
|
|
4
|
+
* Polls the Akash blockchain and provider APIs until containers report as
|
|
5
|
+
* running. This mirrors the Akash Console behaviour but is packaged as a
|
|
6
|
+
* reusable library function with strong typing and explicit Result-based
|
|
7
|
+
* error handling.
|
|
8
|
+
*
|
|
9
|
+
* @module targets/akash/lease-monitor
|
|
10
|
+
*/
|
|
11
|
+
import type { Result } from '../../types/index.js';
|
|
12
|
+
import type { DeploymentLogger } from '../../types/common.js';
|
|
13
|
+
import { ProviderError } from '../../errors/index.js';
|
|
14
|
+
import type { AkashProviderTlsCertificate } from './types.js';
|
|
15
|
+
import type { AkashNetwork } from './environment.js';
|
|
16
|
+
import { type LeaseDetails } from './query-client.js';
|
|
17
|
+
import { type ProviderLeaseStatus } from './provider-client.js';
|
|
18
|
+
/**
|
|
19
|
+
* Options for waiting until provider containers are running
|
|
20
|
+
*/
|
|
21
|
+
export interface LeaseMonitorOptions {
|
|
22
|
+
/** Akash network in which the lease exists */
|
|
23
|
+
readonly network: AkashNetwork;
|
|
24
|
+
/** Lease identifiers (owner/provider/dseq/gseq/oseq) */
|
|
25
|
+
readonly lease: LeaseDetails;
|
|
26
|
+
/** Provider URI returned during deployment */
|
|
27
|
+
readonly providerUri: string;
|
|
28
|
+
/** TLS certificate bundle for mTLS authentication */
|
|
29
|
+
readonly certificate: AkashProviderTlsCertificate;
|
|
30
|
+
/**
|
|
31
|
+
* Poll interval in milliseconds
|
|
32
|
+
*
|
|
33
|
+
* @default 10000 (10 seconds)
|
|
34
|
+
*/
|
|
35
|
+
readonly pollIntervalMs?: number;
|
|
36
|
+
/**
|
|
37
|
+
* Maximum time to wait before timing out (milliseconds)
|
|
38
|
+
*
|
|
39
|
+
* @default 600000 (10 minutes)
|
|
40
|
+
*/
|
|
41
|
+
readonly maxWaitMs?: number;
|
|
42
|
+
/** Logger for human-friendly progress output */
|
|
43
|
+
readonly logger?: DeploymentLogger;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Polls both on-chain lease status and the provider status endpoint until all
|
|
47
|
+
* containers report `ready`. Returns the final provider status snapshot on
|
|
48
|
+
* success or a ProviderError on failure/timeout.
|
|
49
|
+
*/
|
|
50
|
+
export declare function waitForContainersRunning(options: LeaseMonitorOptions): Promise<Result<ProviderLeaseStatus, ProviderError>>;
|
|
51
|
+
//# sourceMappingURL=lease-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease-monitor.d.ts","sourceRoot":"","sources":["../../../src/targets/akash/lease-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,EACL,aAAa,EAGd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,sBAAsB,CAAC;AAE9B;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,8CAA8C;IAC9C,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC;IAC/B,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,8CAA8C;IAC9C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,qDAAqD;IACrD,QAAQ,CAAC,WAAW,EAAE,2BAA2B,CAAC;IAClD;;;;OAIG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,gDAAgD;IAChD,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;CACpC;AAED;;;;GAIG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,MAAM,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC,CAwFrD"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lease Monitoring Helpers
|
|
3
|
+
*
|
|
4
|
+
* Polls the Akash blockchain and provider APIs until containers report as
|
|
5
|
+
* running. This mirrors the Akash Console behaviour but is packaged as a
|
|
6
|
+
* reusable library function with strong typing and explicit Result-based
|
|
7
|
+
* error handling.
|
|
8
|
+
*
|
|
9
|
+
* @module targets/akash/lease-monitor
|
|
10
|
+
*/
|
|
11
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
12
|
+
import { success, failure } from '../../types/index.js';
|
|
13
|
+
import { defaultLogger } from '../../utils/logger.js';
|
|
14
|
+
import { ProviderError, ProviderErrorCodes, containerTimeoutError, } from '../../errors/index.js';
|
|
15
|
+
import { getLeaseById, } from './query-client.js';
|
|
16
|
+
import { fetchProviderLeaseStatus, } from './provider-client.js';
|
|
17
|
+
/**
|
|
18
|
+
* Polls both on-chain lease status and the provider status endpoint until all
|
|
19
|
+
* containers report `ready`. Returns the final provider status snapshot on
|
|
20
|
+
* success or a ProviderError on failure/timeout.
|
|
21
|
+
*/
|
|
22
|
+
export async function waitForContainersRunning(options) {
|
|
23
|
+
const { network, lease, providerUri, certificate, pollIntervalMs = 10_000, maxWaitMs = 600_000, logger = defaultLogger, } = options;
|
|
24
|
+
const start = Date.now();
|
|
25
|
+
let lastStatusSummary = '';
|
|
26
|
+
logger.log('🔍 Monitoring provider until containers report ready...');
|
|
27
|
+
while (Date.now() - start < maxWaitMs) {
|
|
28
|
+
// -----------------------------------------------------------------------
|
|
29
|
+
// Step 1: Confirm lease is still active on-chain
|
|
30
|
+
// -----------------------------------------------------------------------
|
|
31
|
+
const leaseResult = await getLeaseById(network, lease);
|
|
32
|
+
if (!leaseResult.success) {
|
|
33
|
+
return failure(new ProviderError('Failed to verify lease status on-chain', ProviderErrorCodes.PROVIDER_STATUS_ERROR, { network }, true, 'Retry the request after network connectivity is restored', 'error', leaseResult.error));
|
|
34
|
+
}
|
|
35
|
+
const currentLease = leaseResult.data;
|
|
36
|
+
if (currentLease.state.toLowerCase() === 'closed') {
|
|
37
|
+
return failure(new ProviderError('Lease has been closed while waiting for containers to start', ProviderErrorCodes.CONTAINER_START_FAILED, { lease: currentLease }, false, 'Inspect provider logs for failure details before retrying'));
|
|
38
|
+
}
|
|
39
|
+
// -----------------------------------------------------------------------
|
|
40
|
+
// Step 2: Query provider status endpoint via mTLS
|
|
41
|
+
// -----------------------------------------------------------------------
|
|
42
|
+
const statusResult = await fetchProviderLeaseStatus({
|
|
43
|
+
providerUri,
|
|
44
|
+
lease: toLeaseReference(lease),
|
|
45
|
+
certificate,
|
|
46
|
+
});
|
|
47
|
+
if (!statusResult.success) {
|
|
48
|
+
// Treat unreachable provider separately to surface clear cause
|
|
49
|
+
if (statusResult.error.code === ProviderErrorCodes.PROVIDER_UNREACHABLE) {
|
|
50
|
+
logger.warn('⚠️ Provider not yet reachable – retrying in a moment...');
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
logger.warn(`⚠️ Provider reported error: ${statusResult.error.message}`);
|
|
54
|
+
}
|
|
55
|
+
await delay(pollIntervalMs);
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const providerStatus = statusResult.data;
|
|
59
|
+
const summary = summariseServices(providerStatus);
|
|
60
|
+
if (summary !== lastStatusSummary && summary.length > 0) {
|
|
61
|
+
logger.log(` 📊 Service readiness: ${summary}`);
|
|
62
|
+
lastStatusSummary = summary;
|
|
63
|
+
}
|
|
64
|
+
if (allServicesReady(providerStatus)) {
|
|
65
|
+
logger.log('✅ Containers are reporting ready on the provider.');
|
|
66
|
+
return success(providerStatus);
|
|
67
|
+
}
|
|
68
|
+
await delay(pollIntervalMs);
|
|
69
|
+
}
|
|
70
|
+
// -------------------------------------------------------------------------
|
|
71
|
+
// Timeout reached without readiness
|
|
72
|
+
// -------------------------------------------------------------------------
|
|
73
|
+
return failure(containerTimeoutError('deployment', maxWaitMs));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Converts LeaseDetails into LeaseReference required by provider utilities.
|
|
77
|
+
*/
|
|
78
|
+
function toLeaseReference(lease) {
|
|
79
|
+
return {
|
|
80
|
+
dseq: lease.dseq,
|
|
81
|
+
gseq: lease.gseq,
|
|
82
|
+
oseq: lease.oseq,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Generates a human-readable readiness summary for logging.
|
|
87
|
+
*/
|
|
88
|
+
function summariseServices(status) {
|
|
89
|
+
const entries = Object.entries(status.services);
|
|
90
|
+
if (entries.length === 0) {
|
|
91
|
+
return '';
|
|
92
|
+
}
|
|
93
|
+
return entries
|
|
94
|
+
.map(([name, service]) => `${name}:${service.ready}/${Math.max(service.total, 1)}`)
|
|
95
|
+
.join(', ');
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Determines if all services meet their requested replica counts.
|
|
99
|
+
*/
|
|
100
|
+
function allServicesReady(status) {
|
|
101
|
+
const services = Object.values(status.services);
|
|
102
|
+
if (services.length === 0) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
return services.every((service) => {
|
|
106
|
+
const required = Math.max(service.total, 1);
|
|
107
|
+
return service.ready >= required;
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=lease-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lease-monitor.js","sourceRoot":"","sources":["../../../src/targets/akash/lease-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Akash Deployment Log Streaming
|
|
3
|
+
*
|
|
4
|
+
* Streams container logs from Akash provider using WebSocket with mTLS authentication.
|
|
5
|
+
* Inspired by Akash Console's log streaming implementation.
|
|
6
|
+
*
|
|
7
|
+
* @module targets/akash/logs
|
|
8
|
+
*/
|
|
9
|
+
import type { StreamLogsOptions, GetLogsOptions, LogEntry, LogStream } from './logs.types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Stream container logs from an Akash deployment in real-time
|
|
12
|
+
*
|
|
13
|
+
* Returns an EventEmitter that emits parsed log lines as they arrive.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const stream = streamDeploymentLogs({
|
|
18
|
+
* deployment: deploymentData,
|
|
19
|
+
* wallet: walletContext,
|
|
20
|
+
* certificate: certData,
|
|
21
|
+
* network: 'mainnet',
|
|
22
|
+
* services: ['ollama'],
|
|
23
|
+
* follow: true,
|
|
24
|
+
* tail: 100
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* stream.on('log', (log) => {
|
|
28
|
+
* console.log(`[${log.service}] ${log.message}`);
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* stream.on('connected', () => {
|
|
32
|
+
* console.log('Connected to provider');
|
|
33
|
+
* });
|
|
34
|
+
*
|
|
35
|
+
* stream.on('error', (error) => {
|
|
36
|
+
* console.error('Stream error:', error);
|
|
37
|
+
* });
|
|
38
|
+
*
|
|
39
|
+
* stream.on('end', () => {
|
|
40
|
+
* console.log('Stream ended');
|
|
41
|
+
* });
|
|
42
|
+
*
|
|
43
|
+
* // Stop streaming
|
|
44
|
+
* stream.close();
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function streamDeploymentLogs(options: StreamLogsOptions): LogStream;
|
|
48
|
+
/**
|
|
49
|
+
* Get deployment logs as a complete array (non-streaming)
|
|
50
|
+
*
|
|
51
|
+
* Useful for downloading full logs or one-time log retrieval.
|
|
52
|
+
* Connects, collects logs until maxLogs is reached or timeout occurs, then disconnects.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* const logs = await getDeploymentLogs({
|
|
57
|
+
* deployment: deploymentData,
|
|
58
|
+
* wallet: walletContext,
|
|
59
|
+
* certificate: certData,
|
|
60
|
+
* network: 'mainnet',
|
|
61
|
+
* tail: 1000,
|
|
62
|
+
* maxLogs: 1000
|
|
63
|
+
* });
|
|
64
|
+
*
|
|
65
|
+
* logs.forEach(log => {
|
|
66
|
+
* console.log(`[${log.service}] ${log.message}`);
|
|
67
|
+
* });
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export declare function getDeploymentLogs(options: GetLogsOptions): Promise<LogEntry[]>;
|
|
71
|
+
//# sourceMappingURL=logs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../../src/targets/akash/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,QAAQ,EACR,SAAS,EAEV,MAAM,iBAAiB,CAAC;AAmOzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAU1E;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,GACtB,OAAO,CAAC,QAAQ,EAAE,CAAC,CA0CrB"}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Akash Deployment Log Streaming
|
|
3
|
+
*
|
|
4
|
+
* Streams container logs from Akash provider using WebSocket with mTLS authentication.
|
|
5
|
+
* Inspired by Akash Console's log streaming implementation.
|
|
6
|
+
*
|
|
7
|
+
* @module targets/akash/logs
|
|
8
|
+
*/
|
|
9
|
+
import { EventEmitter } from 'node:events';
|
|
10
|
+
import WebSocket from 'ws';
|
|
11
|
+
import https from 'node:https';
|
|
12
|
+
import createDebug from 'debug';
|
|
13
|
+
import stripAnsi from 'strip-ansi';
|
|
14
|
+
// Initialize debug logging
|
|
15
|
+
// Usage: DEBUG=deploy-ability:logs:* to see log parsing details
|
|
16
|
+
const debug = createDebug('deploy-ability:logs');
|
|
17
|
+
/**
|
|
18
|
+
* Implementation of LogStream using EventEmitter
|
|
19
|
+
*/
|
|
20
|
+
class LogStreamImpl extends EventEmitter {
|
|
21
|
+
options;
|
|
22
|
+
ws = null;
|
|
23
|
+
connected = false;
|
|
24
|
+
logger;
|
|
25
|
+
constructor(options) {
|
|
26
|
+
super();
|
|
27
|
+
this.options = options;
|
|
28
|
+
this.logger = options.logger;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Start the WebSocket connection and begin streaming
|
|
32
|
+
*/
|
|
33
|
+
async start() {
|
|
34
|
+
const { deployment, certificate, services, follow, tail } = this.options;
|
|
35
|
+
// Extract lease information from deployment
|
|
36
|
+
const { dseq, gseq, oseq } = deployment;
|
|
37
|
+
const providerUri = deployment.providerUri;
|
|
38
|
+
// Build WebSocket URL
|
|
39
|
+
// Format: wss://{provider-host}/lease/{dseq}/{gseq}/{oseq}/logs
|
|
40
|
+
// Normalize provider URI by removing trailing slash to avoid double-slash path
|
|
41
|
+
// (e.g., "https://provider.example.com:8443/" → "wss://provider.example.com:8443")
|
|
42
|
+
const normalizedUri = providerUri.replace(/\/$/, ''); // Remove trailing slash
|
|
43
|
+
const wsUrl = normalizedUri.replace('https://', 'wss://');
|
|
44
|
+
let logsPath = `/lease/${dseq}/${gseq}/${oseq}/logs`;
|
|
45
|
+
// Add query parameters
|
|
46
|
+
const params = new URLSearchParams();
|
|
47
|
+
if (follow !== false) {
|
|
48
|
+
params.append('follow', 'true');
|
|
49
|
+
}
|
|
50
|
+
if (typeof tail === 'number') {
|
|
51
|
+
params.append('tail', tail.toString());
|
|
52
|
+
}
|
|
53
|
+
if (services && services.length > 0) {
|
|
54
|
+
params.append('service', services.join(','));
|
|
55
|
+
}
|
|
56
|
+
const fullUrl = `${wsUrl}${logsPath}?${params.toString()}`;
|
|
57
|
+
this.logger?.debug?.(`Connecting to: ${fullUrl}`);
|
|
58
|
+
// Create WebSocket with mTLS authentication
|
|
59
|
+
// We use the Akash certificate for client authentication
|
|
60
|
+
this.ws = new WebSocket(fullUrl, {
|
|
61
|
+
cert: certificate.cert,
|
|
62
|
+
key: certificate.privateKey,
|
|
63
|
+
agent: new https.Agent({
|
|
64
|
+
// Do not use TLS session resumption for websocket
|
|
65
|
+
sessionTimeout: 0,
|
|
66
|
+
// Accept self-signed certificates (Akash providers use self-signed certs)
|
|
67
|
+
rejectUnauthorized: false,
|
|
68
|
+
// Disable SNI for mTLS authentication
|
|
69
|
+
servername: ''
|
|
70
|
+
})
|
|
71
|
+
});
|
|
72
|
+
this.setupEventHandlers();
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Setup WebSocket event handlers
|
|
76
|
+
*/
|
|
77
|
+
setupEventHandlers() {
|
|
78
|
+
if (!this.ws)
|
|
79
|
+
return;
|
|
80
|
+
this.ws.on('open', () => {
|
|
81
|
+
this.logger?.debug?.('WebSocket connection established');
|
|
82
|
+
this.connected = true;
|
|
83
|
+
this.emit('connected');
|
|
84
|
+
});
|
|
85
|
+
this.ws.on('message', (data) => {
|
|
86
|
+
// handleMessage now handles parsing errors internally,
|
|
87
|
+
// so we don't need to wrap it in try/catch here
|
|
88
|
+
this.handleMessage(data);
|
|
89
|
+
});
|
|
90
|
+
this.ws.on('error', (error) => {
|
|
91
|
+
this.logger?.error?.(`WebSocket error: ${error.message}`);
|
|
92
|
+
this.emit('error', error);
|
|
93
|
+
});
|
|
94
|
+
this.ws.on('close', (code, reason) => {
|
|
95
|
+
this.logger?.debug?.(`WebSocket closed: ${code} ${reason.toString()}`);
|
|
96
|
+
this.connected = false;
|
|
97
|
+
this.emit('end');
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Handle incoming WebSocket message
|
|
102
|
+
*
|
|
103
|
+
* Akash providers send messages in the format:
|
|
104
|
+
* {"name":"service-xyz-replica-hash","message":"timestamp log-level: actual log message"}
|
|
105
|
+
*
|
|
106
|
+
* When using tail parameter, provider may send:
|
|
107
|
+
* - Sentinel null frame: "null"
|
|
108
|
+
* - Batched messages: "null\n{...}\n{...}"
|
|
109
|
+
* - Concatenated: null{"name":"...","message":"..."}
|
|
110
|
+
* We handle these gracefully by parsing each line separately.
|
|
111
|
+
*/
|
|
112
|
+
handleMessage(data) {
|
|
113
|
+
const text = data.toString().trim();
|
|
114
|
+
// Skip empty messages
|
|
115
|
+
if (!text) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// Log raw message for debugging
|
|
119
|
+
debug(`[RAW] ${text.substring(0, 200)}${text.length > 200 ? '...' : ''}`);
|
|
120
|
+
// Handle potentially batched messages (newline-separated)
|
|
121
|
+
// Provider may send multiple JSON objects separated by newlines
|
|
122
|
+
// When using tail, provider sends: null{"name":"...","message":"..."} (sentinel glued to JSON)
|
|
123
|
+
const lines = text.split('\n');
|
|
124
|
+
for (const line of lines) {
|
|
125
|
+
let trimmed = line.trim();
|
|
126
|
+
// Skip empty lines
|
|
127
|
+
if (!trimmed) {
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
// Strip leading "null" sentinel if present
|
|
131
|
+
// Provider concatenates null with first JSON chunk: null{"name":"...","message":"..."}
|
|
132
|
+
if (trimmed.startsWith('null')) {
|
|
133
|
+
debug(`[STRIP] Removing null prefix from: ${trimmed.substring(0, 50)}...`);
|
|
134
|
+
trimmed = trimmed.substring(4); // Remove "null" prefix
|
|
135
|
+
}
|
|
136
|
+
// Skip if nothing left after removing null
|
|
137
|
+
if (!trimmed) {
|
|
138
|
+
continue;
|
|
139
|
+
}
|
|
140
|
+
try {
|
|
141
|
+
// Parse JSON - provider sends: {"name":"service-replica","message":"log text"}
|
|
142
|
+
const logData = JSON.parse(trimmed);
|
|
143
|
+
if (!logData.name || !logData.message) {
|
|
144
|
+
debug('[SKIP] Missing name or message field');
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
// Strip ANSI color codes from message
|
|
148
|
+
// Provider logs contain codes like \u001b[32minfo\u001b[39m
|
|
149
|
+
const cleanMessage = stripAnsi(logData.message);
|
|
150
|
+
debug(`[PARSED] ${cleanMessage}`);
|
|
151
|
+
// Extract service name from full service name
|
|
152
|
+
// Format: "service-name-replica-hash" -> "service-name"
|
|
153
|
+
const serviceName = this.extractServiceName(logData.name);
|
|
154
|
+
// Create parsed log entry with cleaned message
|
|
155
|
+
const logEntry = {
|
|
156
|
+
service: serviceName,
|
|
157
|
+
message: cleanMessage,
|
|
158
|
+
raw: {
|
|
159
|
+
name: logData.name,
|
|
160
|
+
message: cleanMessage, // Use cleaned message
|
|
161
|
+
timestamp: logData.timestamp
|
|
162
|
+
},
|
|
163
|
+
receivedAt: new Date()
|
|
164
|
+
};
|
|
165
|
+
this.emit('log', logEntry);
|
|
166
|
+
}
|
|
167
|
+
catch (parseError) {
|
|
168
|
+
// Silently skip unparseable frames (e.g., null sentinel, malformed JSON)
|
|
169
|
+
// This matches Akash Console behavior
|
|
170
|
+
debug(`[ERROR] Skipping unparseable log frame: ${parseError instanceof Error ? parseError.message : 'Unknown error'}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Extract service name from full service name with replica suffix
|
|
176
|
+
*
|
|
177
|
+
* Examples:
|
|
178
|
+
* - "ollama-abc123" -> "ollama"
|
|
179
|
+
* - "vllm-xyz789" -> "vllm"
|
|
180
|
+
* - "gateway" -> "gateway"
|
|
181
|
+
*/
|
|
182
|
+
extractServiceName(fullName) {
|
|
183
|
+
// Split by hyphen and take first part
|
|
184
|
+
// This works because Kubernetes appends replica hash after hyphen
|
|
185
|
+
const parts = fullName.split('-');
|
|
186
|
+
return parts[0] || fullName;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Close the WebSocket connection
|
|
190
|
+
*/
|
|
191
|
+
close() {
|
|
192
|
+
if (this.ws) {
|
|
193
|
+
this.logger?.debug?.('Closing WebSocket connection');
|
|
194
|
+
this.ws.close();
|
|
195
|
+
this.ws = null;
|
|
196
|
+
this.connected = false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Check if stream is currently connected
|
|
201
|
+
*/
|
|
202
|
+
isConnected() {
|
|
203
|
+
return this.connected;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Stream container logs from an Akash deployment in real-time
|
|
208
|
+
*
|
|
209
|
+
* Returns an EventEmitter that emits parsed log lines as they arrive.
|
|
210
|
+
*
|
|
211
|
+
* @example
|
|
212
|
+
* ```typescript
|
|
213
|
+
* const stream = streamDeploymentLogs({
|
|
214
|
+
* deployment: deploymentData,
|
|
215
|
+
* wallet: walletContext,
|
|
216
|
+
* certificate: certData,
|
|
217
|
+
* network: 'mainnet',
|
|
218
|
+
* services: ['ollama'],
|
|
219
|
+
* follow: true,
|
|
220
|
+
* tail: 100
|
|
221
|
+
* });
|
|
222
|
+
*
|
|
223
|
+
* stream.on('log', (log) => {
|
|
224
|
+
* console.log(`[${log.service}] ${log.message}`);
|
|
225
|
+
* });
|
|
226
|
+
*
|
|
227
|
+
* stream.on('connected', () => {
|
|
228
|
+
* console.log('Connected to provider');
|
|
229
|
+
* });
|
|
230
|
+
*
|
|
231
|
+
* stream.on('error', (error) => {
|
|
232
|
+
* console.error('Stream error:', error);
|
|
233
|
+
* });
|
|
234
|
+
*
|
|
235
|
+
* stream.on('end', () => {
|
|
236
|
+
* console.log('Stream ended');
|
|
237
|
+
* });
|
|
238
|
+
*
|
|
239
|
+
* // Stop streaming
|
|
240
|
+
* stream.close();
|
|
241
|
+
* ```
|
|
242
|
+
*/
|
|
243
|
+
export function streamDeploymentLogs(options) {
|
|
244
|
+
const stream = new LogStreamImpl(options);
|
|
245
|
+
// Start connection asynchronously
|
|
246
|
+
// Errors will be emitted via 'error' event
|
|
247
|
+
stream.start().catch((error) => {
|
|
248
|
+
stream.emit('error', error);
|
|
249
|
+
});
|
|
250
|
+
return stream;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Get deployment logs as a complete array (non-streaming)
|
|
254
|
+
*
|
|
255
|
+
* Useful for downloading full logs or one-time log retrieval.
|
|
256
|
+
* Connects, collects logs until maxLogs is reached or timeout occurs, then disconnects.
|
|
257
|
+
*
|
|
258
|
+
* @example
|
|
259
|
+
* ```typescript
|
|
260
|
+
* const logs = await getDeploymentLogs({
|
|
261
|
+
* deployment: deploymentData,
|
|
262
|
+
* wallet: walletContext,
|
|
263
|
+
* certificate: certData,
|
|
264
|
+
* network: 'mainnet',
|
|
265
|
+
* tail: 1000,
|
|
266
|
+
* maxLogs: 1000
|
|
267
|
+
* });
|
|
268
|
+
*
|
|
269
|
+
* logs.forEach(log => {
|
|
270
|
+
* console.log(`[${log.service}] ${log.message}`);
|
|
271
|
+
* });
|
|
272
|
+
* ```
|
|
273
|
+
*/
|
|
274
|
+
export async function getDeploymentLogs(options) {
|
|
275
|
+
const { maxLogs = 1000, timeout = 30000 } = options;
|
|
276
|
+
const logs = [];
|
|
277
|
+
return new Promise((resolve, reject) => {
|
|
278
|
+
// Create stream with follow disabled
|
|
279
|
+
const stream = streamDeploymentLogs({
|
|
280
|
+
...options,
|
|
281
|
+
follow: false
|
|
282
|
+
});
|
|
283
|
+
// Set timeout
|
|
284
|
+
const timeoutId = setTimeout(() => {
|
|
285
|
+
stream.close();
|
|
286
|
+
resolve(logs);
|
|
287
|
+
}, timeout);
|
|
288
|
+
// Collect logs
|
|
289
|
+
stream.on('log', (log) => {
|
|
290
|
+
logs.push(log);
|
|
291
|
+
// Stop if we've collected enough logs
|
|
292
|
+
if (logs.length >= maxLogs) {
|
|
293
|
+
clearTimeout(timeoutId);
|
|
294
|
+
stream.close();
|
|
295
|
+
resolve(logs);
|
|
296
|
+
}
|
|
297
|
+
});
|
|
298
|
+
// Handle errors
|
|
299
|
+
stream.on('error', (error) => {
|
|
300
|
+
clearTimeout(timeoutId);
|
|
301
|
+
stream.close();
|
|
302
|
+
reject(error);
|
|
303
|
+
});
|
|
304
|
+
// Handle end (stream closed naturally)
|
|
305
|
+
stream.on('end', () => {
|
|
306
|
+
clearTimeout(timeoutId);
|
|
307
|
+
resolve(logs);
|
|
308
|
+
});
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=logs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/targets/akash/logs.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,WAAW,MAAM,OAAO,CAAC;AAChC,OAAO,SAAS,MAAM,YAAY,CAAC;AASnC,2BAA2B;AAC3B,gEAAgE;AAChE,MAAM,KAAK,GAAG,WAAW,CAAC,qBAAqB,CAAC,CAAC;AAEjD;;GAEG;AACH,MAAM,aAAc,SAAQ,YAAY;IAMnB;IALX,EAAE,GAAqB,IAAI,CAAC;IAC5B,SAAS,GAAG,KAAK,CAAC;IAClB,MAAM,CAA8B;IAE5C,YACmB,OAA0B;QAE3C,KAAK,EAAE,CAAC;QAFS,YAAO,GAAP,OAAO,CAAmB;QAG3C,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC/B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAEzE,4CAA4C;QAC5C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;QACxC,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;QAE3C,sBAAsB;QACtB,gEAAgE;QAChE,+EAA+E;QAC/E,mFAAmF;QACnF,MAAM,aAAa,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,wBAAwB;QAC9E,MAAM,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC1D,IAAI,QAAQ,GAAG,UAAU,IAAI,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC;QAErD,uBAAuB;QACvB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;YACrB,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,KAAK,GAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC3D,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;QAElD,4CAA4C;QAC5C,yDAAyD;QACzD,IAAI,CAAC,EAAE,GAAG,IAAI,SAAS,CAAC,OAAO,EAAE;YAC/B,IAAI,EAAE,WAAW,CAAC,IAAI;YACtB,GAAG,EAAE,WAAW,CAAC,UAAU;YAC3B,KAAK,EAAE,IAAI,KAAK,CAAC,KAAK,CAAC;gBACrB,kDAAkD;gBAClD,cAAc,EAAE,CAAC;gBACjB,0EAA0E;gBAC1E,kBAAkB,EAAE,KAAK;gBACzB,sCAAsC;gBACtC,UAAU,EAAE,EAAE;aACf,CAAC;SACH,CAAC,CAAC;QAEH,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC5B,CAAC;IAED;;OAEG;IACK,kBAAkB;QACxB,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO;QAErB,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACtB,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,kCAAkC,CAAC,CAAC;YACzD,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,IAAoB,EAAE,EAAE;YAC7C,uDAAuD;YACvD,gDAAgD;YAChD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;YACnC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,oBAAoB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAY,EAAE,MAAc,EAAE,EAAE;YACnD,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,qBAAqB,IAAI,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACvE,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;;;;;;;OAWG;IACK,aAAa,CAAC,IAAoB;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;QAEpC,sBAAsB;QACtB,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,gCAAgC;QAChC,KAAK,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAE1E,0DAA0D;QAC1D,gEAAgE;QAChE,+FAA+F;QAC/F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAE1B,mBAAmB;YACnB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;YAED,2CAA2C;YAC3C,uFAAuF;YACvF,IAAI,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC/B,KAAK,CAAC,sCAAsC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC;gBAC3E,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;YACzD,CAAC;YAED,2CAA2C;YAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,+EAA+E;gBAC/E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA0B,CAAC;gBAE7D,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;oBACtC,KAAK,CAAC,sCAAsC,CAAC,CAAC;oBAC9C,SAAS;gBACX,CAAC;gBAED,sCAAsC;gBACtC,4DAA4D;gBAC5D,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;gBAEhD,KAAK,CAAC,YAAY,YAAY,EAAE,CAAC,CAAC;gBAElC,8CAA8C;gBAC9C,wDAAwD;gBACxD,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBAE1D,+CAA+C;gBAC/C,MAAM,QAAQ,GAAa;oBACzB,OAAO,EAAE,WAAW;oBACpB,OAAO,EAAE,YAAY;oBACrB,GAAG,EAAE;wBACH,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,OAAO,EAAE,YAAY,EAAE,sBAAsB;wBAC7C,SAAS,EAAE,OAAO,CAAC,SAAS;qBAC7B;oBACD,UAAU,EAAE,IAAI,IAAI,EAAE;iBACvB,CAAC;gBAEF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,UAAU,EAAE,CAAC;gBACpB,yEAAyE;gBACzE,sCAAsC;gBACtC,KAAK,CACH,2CAA2C,UAAU,YAAY,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAChH,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,kBAAkB,CAAC,QAAgB;QACzC,sCAAsC;QACtC,kEAAkE;QAClE,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,KAAK,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,8BAA8B,CAAC,CAAC;YACrD,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,WAAW;QACT,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA0B;IAC7D,MAAM,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,CAAC;IAE1C,kCAAkC;IAClC,2CAA2C;IAC3C,MAAM,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC7B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAuB;IAEvB,MAAM,EAAE,OAAO,GAAG,IAAI,EAAE,OAAO,GAAG,KAAK,EAAE,GAAG,OAAO,CAAC;IACpD,MAAM,IAAI,GAAe,EAAE,CAAC;IAE5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,qCAAqC;QACrC,MAAM,MAAM,GAAG,oBAAoB,CAAC;YAClC,GAAG,OAAO;YACV,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;QAEH,cAAc;QACd,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,EAAE,OAAO,CAAC,CAAC;QAEZ,eAAe;QACf,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEf,sCAAsC;YACtC,IAAI,IAAI,CAAC,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC3B,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,gBAAgB;QAChB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;YAC3B,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QAEH,uCAAuC;QACvC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACpB,YAAY,CAAC,SAAS,CAAC,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|