@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.
Files changed (198) hide show
  1. package/README.md +523 -0
  2. package/dist/constants.d.ts +82 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +82 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/errors/certificate-error.d.ts +95 -0
  7. package/dist/errors/certificate-error.d.ts.map +1 -0
  8. package/dist/errors/certificate-error.js +111 -0
  9. package/dist/errors/certificate-error.js.map +1 -0
  10. package/dist/errors/deployment-error.d.ts +122 -0
  11. package/dist/errors/deployment-error.d.ts.map +1 -0
  12. package/dist/errors/deployment-error.js +185 -0
  13. package/dist/errors/deployment-error.js.map +1 -0
  14. package/dist/errors/index.d.ts +13 -0
  15. package/dist/errors/index.d.ts.map +1 -0
  16. package/dist/errors/index.js +18 -0
  17. package/dist/errors/index.js.map +1 -0
  18. package/dist/errors/profile-error.d.ts +106 -0
  19. package/dist/errors/profile-error.d.ts.map +1 -0
  20. package/dist/errors/profile-error.js +127 -0
  21. package/dist/errors/profile-error.js.map +1 -0
  22. package/dist/errors/provider-error.d.ts +104 -0
  23. package/dist/errors/provider-error.d.ts.map +1 -0
  24. package/dist/errors/provider-error.js +120 -0
  25. package/dist/errors/provider-error.js.map +1 -0
  26. package/dist/errors/wallet-error.d.ts +131 -0
  27. package/dist/errors/wallet-error.d.ts.map +1 -0
  28. package/dist/errors/wallet-error.js +154 -0
  29. package/dist/errors/wallet-error.js.map +1 -0
  30. package/dist/index.d.ts +49 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +53 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/targets/akash/bid-selectors.d.ts +251 -0
  35. package/dist/targets/akash/bid-selectors.d.ts.map +1 -0
  36. package/dist/targets/akash/bid-selectors.js +322 -0
  37. package/dist/targets/akash/bid-selectors.js.map +1 -0
  38. package/dist/targets/akash/bid-types.d.ts +297 -0
  39. package/dist/targets/akash/bid-types.d.ts.map +1 -0
  40. package/dist/targets/akash/bid-types.js +89 -0
  41. package/dist/targets/akash/bid-types.js.map +1 -0
  42. package/dist/targets/akash/blockchain-client.d.ts +577 -0
  43. package/dist/targets/akash/blockchain-client.d.ts.map +1 -0
  44. package/dist/targets/akash/blockchain-client.js +803 -0
  45. package/dist/targets/akash/blockchain-client.js.map +1 -0
  46. package/dist/targets/akash/certificate-manager.d.ts +228 -0
  47. package/dist/targets/akash/certificate-manager.d.ts.map +1 -0
  48. package/dist/targets/akash/certificate-manager.js +395 -0
  49. package/dist/targets/akash/certificate-manager.js.map +1 -0
  50. package/dist/targets/akash/constants.d.ts +231 -0
  51. package/dist/targets/akash/constants.d.ts.map +1 -0
  52. package/dist/targets/akash/constants.js +225 -0
  53. package/dist/targets/akash/constants.js.map +1 -0
  54. package/dist/targets/akash/deployer.d.ts +136 -0
  55. package/dist/targets/akash/deployer.d.ts.map +1 -0
  56. package/dist/targets/akash/deployer.js +599 -0
  57. package/dist/targets/akash/deployer.js.map +1 -0
  58. package/dist/targets/akash/environment.d.ts +241 -0
  59. package/dist/targets/akash/environment.d.ts.map +1 -0
  60. package/dist/targets/akash/environment.js +245 -0
  61. package/dist/targets/akash/environment.js.map +1 -0
  62. package/dist/targets/akash/index.d.ts +1113 -0
  63. package/dist/targets/akash/index.d.ts.map +1 -0
  64. package/dist/targets/akash/index.js +909 -0
  65. package/dist/targets/akash/index.js.map +1 -0
  66. package/dist/targets/akash/lease-monitor.d.ts +51 -0
  67. package/dist/targets/akash/lease-monitor.d.ts.map +1 -0
  68. package/dist/targets/akash/lease-monitor.js +110 -0
  69. package/dist/targets/akash/lease-monitor.js.map +1 -0
  70. package/dist/targets/akash/logs.d.ts +71 -0
  71. package/dist/targets/akash/logs.d.ts.map +1 -0
  72. package/dist/targets/akash/logs.js +311 -0
  73. package/dist/targets/akash/logs.js.map +1 -0
  74. package/dist/targets/akash/logs.types.d.ts +102 -0
  75. package/dist/targets/akash/logs.types.d.ts.map +1 -0
  76. package/dist/targets/akash/logs.types.js +9 -0
  77. package/dist/targets/akash/logs.types.js.map +1 -0
  78. package/dist/targets/akash/pricing.d.ts +247 -0
  79. package/dist/targets/akash/pricing.d.ts.map +1 -0
  80. package/dist/targets/akash/pricing.js +246 -0
  81. package/dist/targets/akash/pricing.js.map +1 -0
  82. package/dist/targets/akash/provider-client.d.ts +114 -0
  83. package/dist/targets/akash/provider-client.d.ts.map +1 -0
  84. package/dist/targets/akash/provider-client.js +318 -0
  85. package/dist/targets/akash/provider-client.js.map +1 -0
  86. package/dist/targets/akash/provider-metadata.d.ts +228 -0
  87. package/dist/targets/akash/provider-metadata.d.ts.map +1 -0
  88. package/dist/targets/akash/provider-metadata.js +14 -0
  89. package/dist/targets/akash/provider-metadata.js.map +1 -0
  90. package/dist/targets/akash/provider-service.d.ts +133 -0
  91. package/dist/targets/akash/provider-service.d.ts.map +1 -0
  92. package/dist/targets/akash/provider-service.js +391 -0
  93. package/dist/targets/akash/provider-service.js.map +1 -0
  94. package/dist/targets/akash/query-client.d.ts +125 -0
  95. package/dist/targets/akash/query-client.d.ts.map +1 -0
  96. package/dist/targets/akash/query-client.js +332 -0
  97. package/dist/targets/akash/query-client.js.map +1 -0
  98. package/dist/targets/akash/sdl-generator.d.ts +31 -0
  99. package/dist/targets/akash/sdl-generator.d.ts.map +1 -0
  100. package/dist/targets/akash/sdl-generator.js +279 -0
  101. package/dist/targets/akash/sdl-generator.js.map +1 -0
  102. package/dist/targets/akash/types.d.ts +285 -0
  103. package/dist/targets/akash/types.d.ts.map +1 -0
  104. package/dist/targets/akash/types.js +54 -0
  105. package/dist/targets/akash/types.js.map +1 -0
  106. package/dist/targets/akash/wallet-manager.d.ts +526 -0
  107. package/dist/targets/akash/wallet-manager.d.ts.map +1 -0
  108. package/dist/targets/akash/wallet-manager.js +953 -0
  109. package/dist/targets/akash/wallet-manager.js.map +1 -0
  110. package/dist/targets/local/compose-generator.d.ts +244 -0
  111. package/dist/targets/local/compose-generator.d.ts.map +1 -0
  112. package/dist/targets/local/compose-generator.js +324 -0
  113. package/dist/targets/local/compose-generator.js.map +1 -0
  114. package/dist/targets/local/deployer.d.ts +82 -0
  115. package/dist/targets/local/deployer.d.ts.map +1 -0
  116. package/dist/targets/local/deployer.js +367 -0
  117. package/dist/targets/local/deployer.js.map +1 -0
  118. package/dist/targets/local/engine-manager.d.ts +155 -0
  119. package/dist/targets/local/engine-manager.d.ts.map +1 -0
  120. package/dist/targets/local/engine-manager.js +250 -0
  121. package/dist/targets/local/engine-manager.js.map +1 -0
  122. package/dist/targets/local/index.d.ts +40 -0
  123. package/dist/targets/local/index.d.ts.map +1 -0
  124. package/dist/targets/local/index.js +43 -0
  125. package/dist/targets/local/index.js.map +1 -0
  126. package/dist/targets/local/network-manager.d.ts +160 -0
  127. package/dist/targets/local/network-manager.d.ts.map +1 -0
  128. package/dist/targets/local/network-manager.js +337 -0
  129. package/dist/targets/local/network-manager.js.map +1 -0
  130. package/dist/targets/local/types.d.ts +327 -0
  131. package/dist/targets/local/types.d.ts.map +1 -0
  132. package/dist/targets/local/types.js +9 -0
  133. package/dist/targets/local/types.js.map +1 -0
  134. package/dist/types/common.d.ts +585 -0
  135. package/dist/types/common.d.ts.map +1 -0
  136. package/dist/types/common.js +13 -0
  137. package/dist/types/common.js.map +1 -0
  138. package/dist/types/index.d.ts +15 -0
  139. package/dist/types/index.d.ts.map +1 -0
  140. package/dist/types/index.js +12 -0
  141. package/dist/types/index.js.map +1 -0
  142. package/dist/types/options.d.ts +329 -0
  143. package/dist/types/options.d.ts.map +1 -0
  144. package/dist/types/options.js +10 -0
  145. package/dist/types/options.js.map +1 -0
  146. package/dist/types/profiles.d.ts +329 -0
  147. package/dist/types/profiles.d.ts.map +1 -0
  148. package/dist/types/profiles.js +27 -0
  149. package/dist/types/profiles.js.map +1 -0
  150. package/dist/types/results.d.ts +443 -0
  151. package/dist/types/results.d.ts.map +1 -0
  152. package/dist/types/results.js +64 -0
  153. package/dist/types/results.js.map +1 -0
  154. package/dist/types/validators.d.ts +118 -0
  155. package/dist/types/validators.d.ts.map +1 -0
  156. package/dist/types/validators.js +198 -0
  157. package/dist/types/validators.js.map +1 -0
  158. package/dist/utils/command-runner.d.ts +128 -0
  159. package/dist/utils/command-runner.d.ts.map +1 -0
  160. package/dist/utils/command-runner.js +210 -0
  161. package/dist/utils/command-runner.js.map +1 -0
  162. package/dist/utils/index.d.ts +10 -0
  163. package/dist/utils/index.d.ts.map +1 -0
  164. package/dist/utils/index.js +10 -0
  165. package/dist/utils/index.js.map +1 -0
  166. package/dist/utils/logger.d.ts +68 -0
  167. package/dist/utils/logger.d.ts.map +1 -0
  168. package/dist/utils/logger.js +93 -0
  169. package/dist/utils/logger.js.map +1 -0
  170. package/dist/utils/profile-loader.d.ts +76 -0
  171. package/dist/utils/profile-loader.d.ts.map +1 -0
  172. package/dist/utils/profile-loader.js +194 -0
  173. package/dist/utils/profile-loader.js.map +1 -0
  174. package/dist/utils/registry/index.d.ts +27 -0
  175. package/dist/utils/registry/index.d.ts.map +1 -0
  176. package/dist/utils/registry/index.js +29 -0
  177. package/dist/utils/registry/index.js.map +1 -0
  178. package/dist/utils/registry/manager.d.ts +319 -0
  179. package/dist/utils/registry/manager.d.ts.map +1 -0
  180. package/dist/utils/registry/manager.js +671 -0
  181. package/dist/utils/registry/manager.js.map +1 -0
  182. package/dist/utils/registry/setup.d.ts +135 -0
  183. package/dist/utils/registry/setup.d.ts.map +1 -0
  184. package/dist/utils/registry/setup.js +207 -0
  185. package/dist/utils/registry/setup.js.map +1 -0
  186. package/dist/utils/registry/transformer.d.ts +92 -0
  187. package/dist/utils/registry/transformer.d.ts.map +1 -0
  188. package/dist/utils/registry/transformer.js +131 -0
  189. package/dist/utils/registry/transformer.js.map +1 -0
  190. package/dist/utils/registry/types.d.ts +241 -0
  191. package/dist/utils/registry/types.d.ts.map +1 -0
  192. package/dist/utils/registry/types.js +10 -0
  193. package/dist/utils/registry/types.js.map +1 -0
  194. package/docs/EXAMPLES.md +293 -0
  195. package/docs/PLACEMENT.md +433 -0
  196. package/docs/STORAGE.md +318 -0
  197. package/docs/building-provider-reliability-tracker.md +2581 -0
  198. package/package.json +109 -0
@@ -0,0 +1,599 @@
1
+ /**
2
+ * Akash Deployment Orchestrator
3
+ *
4
+ * High-level helper that glues together the lower-level modules:
5
+ * - profile loading
6
+ * - SDL generation
7
+ * - blockchain deployment workflow (create deployment → wait for bids → create lease)
8
+ * - provider manifest delivery and optional readiness monitoring
9
+ *
10
+ * This mirrors the legacy kadi-deploy deployment flow while embracing the
11
+ * composable building blocks exposed by deploy-ability.
12
+ *
13
+ * @module targets/akash/deployer
14
+ */
15
+ import Long from 'long';
16
+ import { success, failure, createWalletAddress, createDeploymentSequence, } from '../../types/index.js';
17
+ import { defaultLogger } from '../../utils/logger.js';
18
+ import { loadProfile } from '../../utils/profile-loader.js';
19
+ import { createSigningClient, createDeployment, waitForBids, createLease, closeDeployment, } from './blockchain-client.js';
20
+ import { sendManifestToProvider, fetchProviderLeaseStatus, } from './provider-client.js';
21
+ import { getProviderMetadata, getLeaseById, getDeploymentDetails, } from './query-client.js';
22
+ import { waitForContainersRunning } from './lease-monitor.js';
23
+ import { LeasePrice } from './pricing.js';
24
+ import { generateAkashSdl, createSdlObject, } from './sdl-generator.js';
25
+ import { DeploymentError } from '../../errors/index.js';
26
+ /**
27
+ * Executes a full Akash deployment.
28
+ */
29
+ export async function deployToAkash(params) {
30
+ const { wallet, certificate, bidSelector, logger: customLogger, dryRun = false, ...options } = params;
31
+ const logger = customLogger ?? defaultLogger;
32
+ // ---------------------------------------------------------------------------
33
+ // Load and validate deployment profile
34
+ // Use pre-loaded profile if provided (e.g., with registry URL transformations),
35
+ // otherwise load from disk
36
+ // ---------------------------------------------------------------------------
37
+ let loadedProfile;
38
+ if (options.loadedProfile) {
39
+ loadedProfile = options.loadedProfile;
40
+ }
41
+ else {
42
+ try {
43
+ loadedProfile = await loadProfile(options.projectRoot, options.profile, logger);
44
+ }
45
+ catch (error) {
46
+ return failure(new DeploymentError(`Failed to load deployment profile '${options.profile}'`, 'PROFILE_LOAD_FAILED', { error: String(error) }));
47
+ }
48
+ }
49
+ if (loadedProfile.profile.target !== 'akash') {
50
+ return failure(new DeploymentError(`Profile '${loadedProfile.name}' is not an Akash deployment profile`, 'INVALID_PROFILE_TARGET', { profile: loadedProfile.name }));
51
+ }
52
+ // Type assertion: we've verified target === 'akash' above
53
+ const akashProfile = loadedProfile.profile;
54
+ const akashLoadedProfile = loadedProfile;
55
+ const selectedNetwork = (options.network ?? akashProfile.network);
56
+ if (selectedNetwork !== 'mainnet' && selectedNetwork !== 'testnet') {
57
+ return failure(new DeploymentError(`Unsupported Akash network '${selectedNetwork}'`, 'INVALID_NETWORK', { selectedNetwork }));
58
+ }
59
+ const network = selectedNetwork;
60
+ // ---------------------------------------------------------------------------
61
+ // Generate SDL (Akash manifest)
62
+ // ---------------------------------------------------------------------------
63
+ const sdlYaml = generateAkashSdl(akashLoadedProfile);
64
+ const sdlDocument = createSdlObject(akashLoadedProfile);
65
+ if (dryRun) {
66
+ const dryRunResult = {
67
+ dryRun: true,
68
+ sdl: sdlYaml,
69
+ profile: loadedProfile.name,
70
+ network,
71
+ };
72
+ return success(dryRunResult);
73
+ }
74
+ // ---------------------------------------------------------------------------
75
+ // Runtime validation: wallet and certificate required for actual deployment
76
+ // ---------------------------------------------------------------------------
77
+ if (!wallet) {
78
+ return failure(new DeploymentError('Wallet is required for deployment (not dry-run)', 'WALLET_REQUIRED', {}, false, 'Connect wallet using wallet-manager before deployment'));
79
+ }
80
+ if (!certificate) {
81
+ return failure(new DeploymentError('TLS certificate is required to communicate with the provider', 'CERTIFICATE_REQUIRED', {}, false, 'Generate or load a certificate using certificate-manager before deployment'));
82
+ }
83
+ if (!bidSelector) {
84
+ return failure(new DeploymentError('Bid selector function is required for deployment', 'BID_SELECTOR_REQUIRED', {}, false, 'Provide a bidSelector function to choose which provider bid to accept. ' +
85
+ 'Use pre-built selectors like selectCheapestBid, selectMostReliableBid, or implement custom logic.'));
86
+ }
87
+ // -----------------------------------------------------------------------
88
+ // Start blockchain workflow
89
+ // -----------------------------------------------------------------------
90
+ const signingClientResult = await createSigningClient(wallet, network);
91
+ if (!signingClientResult.success) {
92
+ return signingClientResult;
93
+ }
94
+ const depositAkt = determineDeposit(options, akashProfile);
95
+ logger.log('📝 Creating deployment on blockchain...');
96
+ const deploymentResult = await createDeployment(signingClientResult.data, wallet, sdlDocument, depositAkt);
97
+ if (!deploymentResult.success) {
98
+ return deploymentResult;
99
+ }
100
+ logger.debug?.(`Deployment created: DSEQ ${deploymentResult.data.dseq}`);
101
+ logger.log('💰 Waiting for provider bids...');
102
+ const bidTimeoutMs = options.bidTimeout ?? 180000; // 3 minutes default
103
+ const bidsResult = await waitForBids(wallet, network, deploymentResult.data.dseq, {
104
+ customBlacklist: options.blacklist ? [...options.blacklist] : undefined,
105
+ timeoutMs: bidTimeoutMs,
106
+ });
107
+ if (!bidsResult.success) {
108
+ // Cleanup: close deployment to return escrow
109
+ logger.warn('⚠️ No bids received, closing deployment to return escrow...');
110
+ const closeResult = await closeDeployment(signingClientResult.data, wallet, deploymentResult.data.dseq);
111
+ if (closeResult.success) {
112
+ logger.log('✅ Deployment closed, escrow returned');
113
+ }
114
+ else {
115
+ logger.warn('⚠️ Failed to close deployment automatically:', closeResult.error.message);
116
+ }
117
+ // Return enhanced error with cleanup info
118
+ return failure(new DeploymentError(`No provider bids received within ${bidTimeoutMs / 1000}s. Deployment closed, escrow returned.`, 'BID_TIMEOUT', {
119
+ dseq: deploymentResult.data.dseq,
120
+ timeoutMs: bidTimeoutMs,
121
+ cleaned: closeResult.success,
122
+ originalError: bidsResult.error
123
+ }, true, 'Try: 1) Increase bidTimeout, 2) Reduce resource requirements, 3) Increase deposit amount'));
124
+ }
125
+ const bids = bidsResult.data;
126
+ logger.debug?.(`Received ${bids.length} bid(s) from providers`);
127
+ // Call user's bid selector to choose which provider to use
128
+ logger.log('🎯 Selecting provider...');
129
+ let selectedBid;
130
+ try {
131
+ selectedBid = await bidSelector(bids);
132
+ }
133
+ catch (error) {
134
+ return failure(new DeploymentError(`Bid selector function threw an error: ${error}`, 'BID_SELECTOR_ERROR', { error: String(error) }, true, 'Check your bidSelector implementation for errors'));
135
+ }
136
+ if (!selectedBid) {
137
+ return failure(new DeploymentError('Bid selector returned null - no acceptable bids found', 'NO_ACCEPTABLE_BIDS', { bidCount: bids.length }, true, 'Adjust your bid selection criteria or wait for more provider bids'));
138
+ }
139
+ logger.debug?.(`Selected provider: ${selectedBid.provider.name || selectedBid.provider.owner} ` +
140
+ `(${selectedBid.pricing.akt.perMonth.toFixed(2)} AKT/month)`);
141
+ logger.log('📋 Creating lease with provider...');
142
+ const leaseResult = await createLease(signingClientResult.data, selectedBid.bid);
143
+ if (!leaseResult.success) {
144
+ return leaseResult;
145
+ }
146
+ logger.debug?.('Lease created successfully');
147
+ const lease = leaseResult.data.leaseId;
148
+ // ---------------------------------------------------------------------------
149
+ // Provider manifest delivery
150
+ // ---------------------------------------------------------------------------
151
+ const providerMetadataResult = await getProviderMetadata(network, lease.provider);
152
+ if (!providerMetadataResult.success) {
153
+ return failure(new DeploymentError('Failed to retrieve provider metadata', 'PROVIDER_METADATA_ERROR', { provider: lease.provider }, true, 'Retry deployment or choose a different provider', 'error', providerMetadataResult.error));
154
+ }
155
+ const providerMetadata = providerMetadataResult.data;
156
+ const providerUri = providerMetadata?.hostUri;
157
+ if (!providerUri) {
158
+ return failure(new DeploymentError('Selected provider does not expose a host URI', 'PROVIDER_URI_MISSING', { provider: lease.provider }, true, 'Select a different provider or verify on-chain provider records'));
159
+ }
160
+ // ---------------------------------------------------------------------------
161
+ // Send manifest to provider with delay + retry
162
+ // ---------------------------------------------------------------------------
163
+ // Wait 5s before first attempt to give provider time to register the lease
164
+ // Retry up to 3 times on 4xx errors (especially 401 "no lease for deployment")
165
+ // Use exponential backoff (6s, 8s) to match Akash Console behavior
166
+ // Total worst case: 5s + 0s + 6s + 8s = 19s before third attempt
167
+ logger.log('📤 Sending manifest to provider...');
168
+ logger.log('⏳ Waiting 5s for provider to register lease...');
169
+ await new Promise(resolve => setTimeout(resolve, 5000)); // 5 second delay
170
+ const maxAttempts = 5; // Increased for slow GPU providers
171
+ let manifestResult;
172
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
173
+ if (attempt > 1) {
174
+ logger.log(`🔄 Retry attempt ${attempt}/${maxAttempts}...`);
175
+ }
176
+ manifestResult = await sendManifestToProvider({
177
+ providerUri,
178
+ lease: {
179
+ // Long types from protobuf need explicit toString() conversion
180
+ dseq: Long.isLong(lease.dseq) ? lease.dseq.toString() : lease.dseq,
181
+ gseq: lease.gseq,
182
+ oseq: lease.oseq,
183
+ },
184
+ manifest: sdlDocument.manifestSortedJSON(),
185
+ certificate,
186
+ });
187
+ // Success - break out of retry loop
188
+ if (manifestResult.success) {
189
+ logger.log('✅ Manifest sent successfully');
190
+ break;
191
+ }
192
+ // Check if error is retryable (4xx status codes)
193
+ const error = manifestResult.error;
194
+ const statusCode = error.context?.statusCode;
195
+ const isRetryable = typeof statusCode === 'number' && statusCode >= 400 && statusCode < 500;
196
+ // If not retryable or last attempt, return the error
197
+ if (!isRetryable || attempt === maxAttempts) {
198
+ logger.log(`❌ Manifest send failed (status: ${statusCode}): ${error.message}`);
199
+ if (error.context?.body) {
200
+ logger.log(`📄 Provider response: ${error.context.body}`);
201
+ }
202
+ return manifestResult;
203
+ }
204
+ // Exponential backoff: 6s for first retry, 8s for second retry
205
+ // Mirrors Akash Console's ~6s delay between attempts
206
+ const retryDelayMs = 4000 + (attempt * 2000); // 6s, 8s
207
+ logger.log(`⏱️ Got ${statusCode} error, retrying in ${retryDelayMs / 1000}s...`);
208
+ await new Promise(resolve => setTimeout(resolve, retryDelayMs));
209
+ }
210
+ // Should not reach here, but TypeScript needs this
211
+ if (!manifestResult.success) {
212
+ return manifestResult;
213
+ }
214
+ // ---------------------------------------------------------------------------
215
+ // Query additional deployment information
216
+ // ---------------------------------------------------------------------------
217
+ // Fetch detailed lease information (price, createdAt)
218
+ // Create a minimal lease identifier object for the query
219
+ // Validate blockchain addresses using Zod schemas
220
+ let validatedOwner;
221
+ let validatedProvider;
222
+ try {
223
+ validatedOwner = createWalletAddress(lease.owner);
224
+ validatedProvider = createWalletAddress(lease.provider);
225
+ }
226
+ catch (error) {
227
+ return failure(new DeploymentError('Invalid wallet addresses received from blockchain', 'INVALID_BLOCKCHAIN_DATA', { owner: lease.owner, provider: lease.provider, error: String(error) }, false, 'This indicates malformed blockchain data. Please report this issue.'));
228
+ }
229
+ const leaseIdentifier = {
230
+ owner: validatedOwner,
231
+ provider: validatedProvider,
232
+ // Convert Long to string for query
233
+ dseq: Long.isLong(lease.dseq) ? lease.dseq.toString() : String(lease.dseq),
234
+ gseq: lease.gseq,
235
+ oseq: lease.oseq,
236
+ };
237
+ const leaseDetailsResult = await getLeaseById(network, leaseIdentifier);
238
+ if (!leaseDetailsResult.success) {
239
+ logger.warn(`Could not fetch lease details: ${leaseDetailsResult.error.message}`);
240
+ }
241
+ // Fetch deployment information (status, services, resources)
242
+ const deploymentDetailsResult = await getDeploymentDetails(network, lease.owner, Long.isLong(lease.dseq) ? lease.dseq.toString() : String(lease.dseq));
243
+ if (!deploymentDetailsResult.success) {
244
+ logger.warn(`Could not fetch deployment details: ${deploymentDetailsResult.error.message}`);
245
+ }
246
+ // ---------------------------------------------------------------------------
247
+ // Optional readiness monitoring
248
+ // ---------------------------------------------------------------------------
249
+ let providerStatus;
250
+ if (options.containerTimeout && options.containerTimeout > 0) {
251
+ // Build lease details with validation
252
+ let leaseDetails;
253
+ try {
254
+ leaseDetails = buildLeaseDetails(selectedBid.bid, leaseResult.data);
255
+ }
256
+ catch (error) {
257
+ return failure(new DeploymentError('Invalid wallet addresses in lease data', 'INVALID_BLOCKCHAIN_DATA', { error: String(error) }, false, 'This indicates malformed blockchain data. Please report this issue.'));
258
+ }
259
+ const monitorResult = await waitForContainersRunning({
260
+ network,
261
+ lease: leaseDetails,
262
+ providerUri,
263
+ certificate,
264
+ pollIntervalMs: 10_000,
265
+ maxWaitMs: options.containerTimeout,
266
+ logger,
267
+ });
268
+ if (!monitorResult.success) {
269
+ // Cleanup: close deployment to return escrow
270
+ logger.warn('⚠️ Containers failed to start, closing deployment...');
271
+ const closeResult = await closeDeployment(signingClientResult.data, wallet, deploymentResult.data.dseq);
272
+ if (closeResult.success) {
273
+ logger.log('✅ Deployment closed, escrow returned');
274
+ }
275
+ else {
276
+ logger.warn('⚠️ Failed to close deployment automatically:', closeResult.error.message);
277
+ }
278
+ // Return enhanced error with cleanup info
279
+ return failure(new DeploymentError(`Containers failed to start within ${options.containerTimeout / 1000}s. Deployment closed, escrow returned.`, 'CONTAINER_TIMEOUT', {
280
+ dseq: deploymentResult.data.dseq,
281
+ timeoutMs: options.containerTimeout,
282
+ cleaned: closeResult.success,
283
+ originalError: monitorResult.error
284
+ }, true, 'Try: 1) Increase containerTimeout for large images, 2) Check provider logs, 3) Try different provider'));
285
+ }
286
+ providerStatus = monitorResult.data;
287
+ }
288
+ else {
289
+ const statusResult = await fetchProviderLeaseStatus({
290
+ providerUri,
291
+ lease: {
292
+ // Long types from protobuf need explicit toString() conversion
293
+ dseq: Long.isLong(lease.dseq) ? lease.dseq.toString() : lease.dseq,
294
+ gseq: lease.gseq,
295
+ oseq: lease.oseq,
296
+ },
297
+ certificate,
298
+ });
299
+ if (statusResult.success) {
300
+ providerStatus = statusResult.data;
301
+ }
302
+ }
303
+ // ---------------------------------------------------------------------------
304
+ // Compose deployment result
305
+ // ---------------------------------------------------------------------------
306
+ try {
307
+ const deploymentData = createDeploymentData({
308
+ deployment: deploymentResult.data,
309
+ lease: leaseResult.data,
310
+ leaseDetails: leaseDetailsResult.success ? leaseDetailsResult.data : undefined,
311
+ deploymentDetails: deploymentDetailsResult.success
312
+ ? deploymentDetailsResult.data
313
+ : undefined,
314
+ providerUri,
315
+ profileName: loadedProfile.name,
316
+ network,
317
+ certificate,
318
+ providerStatus,
319
+ });
320
+ return success(deploymentData);
321
+ }
322
+ catch (error) {
323
+ // Validation error from Zod schemas (malformed blockchain data)
324
+ return failure(new DeploymentError('Failed to validate deployment data from blockchain', 'INVALID_BLOCKCHAIN_DATA', { error: String(error) }, false, 'This indicates malformed blockchain data. Please report this issue.'));
325
+ }
326
+ }
327
+ /** Determines deposit in AKT to use for deployment. */
328
+ function determineDeposit(options, profile) {
329
+ // Check CLI options first (takes precedence)
330
+ if (typeof options.deposit === 'number' && options.deposit > 0) {
331
+ return options.deposit; // Already in AKT
332
+ }
333
+ // Check profile deposit
334
+ if (typeof profile.deposit === 'number' && profile.deposit > 0) {
335
+ return profile.deposit; // Already in AKT
336
+ }
337
+ return 5; // Default deposit in AKT
338
+ }
339
+ /**
340
+ * Normalises deployment data into the published AkashDeploymentData structure.
341
+ *
342
+ * This function combines data from multiple sources:
343
+ * - Blockchain deployment transaction (dseq, owner, etc.)
344
+ * - Lease creation result (gseq, oseq, provider)
345
+ * - Lease details query (price, createdAt)
346
+ * - Deployment details query (status, services, resources)
347
+ * - Provider status (service endpoints)
348
+ *
349
+ * The lease details and deployment details are optional because they come from
350
+ * additional RPC queries that might fail. When available, they enrich the result
351
+ * with pricing information, deployment status, and resource allocations.
352
+ */
353
+ function createDeploymentData(params) {
354
+ const { deployment, lease, leaseDetails, deploymentDetails, providerUri, profileName, network, certificate, providerStatus, } = params;
355
+ const endpoints = providerStatus
356
+ ? buildEndpointMap(providerStatus)
357
+ : undefined;
358
+ // Create LeasePrice instance from lease details
359
+ // If lease details weren't fetched successfully, create from a zero price
360
+ const leasePrice = leaseDetails
361
+ ? new LeasePrice(leaseDetails.price)
362
+ : new LeasePrice({ denom: 'uakt', amount: '0' });
363
+ // Extract deployment status (active or closed)
364
+ // Default to 'active' if deployment details weren't fetched
365
+ const status = deploymentDetails?.state === 'closed' ? 'closed' : 'active';
366
+ // Extract services with their resource allocations from deployment groups
367
+ const services = deploymentDetails
368
+ ? buildServicesFromGroups(deploymentDetails.groups)
369
+ : undefined;
370
+ // Extract lease created timestamp
371
+ // This is the block height or timestamp when the lease was created on-chain
372
+ const leaseCreatedAt = leaseDetails?.createdAt ?? '0';
373
+ // Validate branded types from blockchain data
374
+ // If validation fails, throw error (will be caught by deployToAkash)
375
+ const validatedDseq = createDeploymentSequence(deployment.dseq);
376
+ const validatedOwner = createWalletAddress(lease.leaseId.owner);
377
+ const validatedProvider = createWalletAddress(lease.leaseId.provider);
378
+ return {
379
+ dseq: validatedDseq,
380
+ owner: validatedOwner,
381
+ provider: validatedProvider,
382
+ providerUri,
383
+ gseq: lease.leaseId.gseq,
384
+ oseq: lease.leaseId.oseq,
385
+ network,
386
+ endpoints,
387
+ certificate: {
388
+ cert: certificate.cert,
389
+ privateKey: certificate.privateKey,
390
+ },
391
+ profile: profileName,
392
+ deployedAt: new Date(),
393
+ // New fields with complete deployment information
394
+ status,
395
+ leasePrice,
396
+ leaseCreatedAt,
397
+ services,
398
+ };
399
+ }
400
+ /**
401
+ * Builds a simple service → URI mapping from provider lease status.
402
+ *
403
+ * Tries service URIs first, then falls back to synthesizing URLs from forwarded ports.
404
+ * When synthesizing from forwarded ports, uses http:// unless the external port is
405
+ * a typical TLS port (443 or 8443), in which case https:// is used.
406
+ */
407
+ function buildEndpointMap(status) {
408
+ const entries = [];
409
+ for (const [name, service] of Object.entries(status.services)) {
410
+ // 1. Try URIs first (provider-published endpoints)
411
+ const uri = service.uris?.[0];
412
+ if (uri) {
413
+ entries.push([name, uri]);
414
+ continue;
415
+ }
416
+ // 2. Fallback: synthesize URL from forwarded ports
417
+ const ports = status.forwardedPorts?.[name];
418
+ const port = ports?.[0];
419
+ if (port) {
420
+ // Use https only for typical TLS ports (443, 8443)
421
+ const protocol = port.externalPort === 443 || port.externalPort === 8443
422
+ ? 'https'
423
+ : 'http';
424
+ const synthesizedUrl = `${protocol}://${port.host}:${port.externalPort}/`;
425
+ entries.push([name, synthesizedUrl]);
426
+ }
427
+ }
428
+ return entries.length > 0 ? Object.freeze(Object.fromEntries(entries)) : undefined;
429
+ }
430
+ /**
431
+ * Extracts services with complete resource allocations from deployment groups
432
+ *
433
+ * Provides both aggregated totals and detailed resource specifications for each service.
434
+ * Each deployment group may contain multiple resource specs (e.g., different replica
435
+ * configurations), and this function processes ALL of them to give a complete picture.
436
+ *
437
+ * **How it works:**
438
+ * 1. Processes ALL resource specs in each group (not just the first)
439
+ * 2. Calculates aggregated totals: sum of (count × resources) for all specs
440
+ * 3. Preserves detailed specs with individual replica counts
441
+ *
442
+ * **Resource Format from Blockchain:**
443
+ * - CPU: Raw micro-units as strings (1,000,000 = 1 CPU core)
444
+ * - Memory: Raw bytes as strings (converted to Mi/Gi for display)
445
+ * - Storage: Array of raw bytes as strings (summed and converted to Mi/Gi)
446
+ *
447
+ * **Output Format:**
448
+ * - CPU: Decimal string (e.g., "5.0" = 5 CPU cores)
449
+ * - Memory: Human-readable with unit (e.g., "10Gi", "512Mi")
450
+ * - Storage: Human-readable with unit (e.g., "5Gi", "1Ti")
451
+ *
452
+ * @param groups - Deployment groups from blockchain query
453
+ * @returns Array of services with aggregated totals and detailed resource specs
454
+ *
455
+ * @example Single resource spec (most common)
456
+ * ```typescript
457
+ * {
458
+ * name: "web",
459
+ * totalResources: { cpu: "1.0", memory: "2Gi", storage: "1Gi" },
460
+ * replicaCount: 1,
461
+ * resourceSpecs: [
462
+ * { count: 1, cpu: "1.0", memory: "2Gi", storage: "1Gi" }
463
+ * ]
464
+ * }
465
+ * ```
466
+ *
467
+ * @example Multiple resource specs (advanced deployment)
468
+ * ```typescript
469
+ * {
470
+ * name: "api",
471
+ * totalResources: { cpu: "5.0", memory: "10Gi", storage: "5Gi" },
472
+ * replicaCount: 4,
473
+ * resourceSpecs: [
474
+ * { count: 3, cpu: "1.0", memory: "2Gi", storage: "1Gi" }, // 3 standard replicas
475
+ * { count: 1, cpu: "2.0", memory: "4Gi", storage: "2Gi" } // 1 high-perf replica
476
+ * ]
477
+ * }
478
+ * ```
479
+ */
480
+ function buildServicesFromGroups(groups) {
481
+ const services = [];
482
+ for (const group of groups) {
483
+ if (group.resources.length === 0) {
484
+ continue; // Skip groups with no resources
485
+ }
486
+ // Process ALL resource specs (not just the first)
487
+ const resourceSpecs = [];
488
+ let totalCpuMicroUnits = 0;
489
+ let totalMemoryBytes = 0;
490
+ let totalStorageBytes = 0;
491
+ let totalReplicas = 0;
492
+ for (const resource of group.resources) {
493
+ const count = resource.count;
494
+ const cpuMicroUnits = parseFloat(resource.cpuUnits || '0');
495
+ const memoryBytes = parseFloat(resource.memoryQuantity || '0');
496
+ // Storage is an array - sum all storage quantities
497
+ const storageBytes = resource.storageQuantities
498
+ .map(s => parseFloat(s || '0'))
499
+ .reduce((a, b) => a + b, 0);
500
+ // Accumulate totals (count × resource value)
501
+ totalCpuMicroUnits += count * cpuMicroUnits;
502
+ totalMemoryBytes += count * memoryBytes;
503
+ totalStorageBytes += count * storageBytes;
504
+ totalReplicas += count;
505
+ // Format individual spec resources
506
+ resourceSpecs.push({
507
+ count,
508
+ cpu: formatCpu(cpuMicroUnits),
509
+ memory: formatBytes(memoryBytes),
510
+ storage: formatBytes(storageBytes),
511
+ });
512
+ }
513
+ services.push({
514
+ name: group.name,
515
+ totalResources: {
516
+ cpu: formatCpu(totalCpuMicroUnits),
517
+ memory: formatBytes(totalMemoryBytes),
518
+ storage: formatBytes(totalStorageBytes),
519
+ },
520
+ replicaCount: totalReplicas,
521
+ resourceSpecs: Object.freeze(resourceSpecs),
522
+ });
523
+ }
524
+ return Object.freeze(services);
525
+ }
526
+ /**
527
+ * Formats CPU micro-units to human-readable CPU cores
528
+ *
529
+ * Akash stores CPU in micro-units where 1,000,000 = 1 CPU core
530
+ *
531
+ * @param microUnits - CPU in micro-units (e.g., 1000000 = 1.0 CPU)
532
+ * @returns Formatted CPU string (e.g., "1.0", "0.5", "2.5")
533
+ */
534
+ function formatCpu(microUnits) {
535
+ const cpuCores = microUnits / 1_000_000;
536
+ // Use up to 2 decimal places, remove trailing zeros
537
+ return cpuCores.toFixed(2).replace(/\.?0+$/, '');
538
+ }
539
+ /**
540
+ * Formats bytes to human-readable storage/memory with appropriate unit
541
+ *
542
+ * Converts raw bytes to Mi (MiB) or Gi (GiB) using binary units (1024-based).
543
+ * Uses the smallest unit that results in a value >= 1.
544
+ *
545
+ * @param bytes - Raw bytes value
546
+ * @returns Formatted string with unit (e.g., "512Mi", "2Gi", "1Ti")
547
+ *
548
+ * @example
549
+ * ```typescript
550
+ * formatBytes(536870912) // "512Mi"
551
+ * formatBytes(2147483648) // "2Gi"
552
+ * formatBytes(1099511627776) // "1Ti"
553
+ * ```
554
+ */
555
+ function formatBytes(bytes) {
556
+ if (bytes === 0)
557
+ return '0';
558
+ const units = ['', 'Ki', 'Mi', 'Gi', 'Ti', 'Pi'];
559
+ let unitIndex = 0;
560
+ let value = bytes;
561
+ // Find appropriate unit (prefer larger units for readability)
562
+ // Use 1024 for binary units (Mi, Gi, etc.)
563
+ while (value >= 1024 && unitIndex < units.length - 1) {
564
+ value /= 1024;
565
+ unitIndex++;
566
+ }
567
+ // Format with up to 2 decimal places, remove trailing zeros
568
+ const formatted = value.toFixed(2).replace(/\.?0+$/, '');
569
+ return `${formatted}${units[unitIndex]}`;
570
+ }
571
+ /**
572
+ * Constructs LeaseDetails for monitoring using bid and lease information.
573
+ *
574
+ * Validates wallet addresses from blockchain data using Zod schemas.
575
+ * Throws if validation fails (indicating malformed blockchain data).
576
+ */
577
+ function buildLeaseDetails(bid, lease) {
578
+ // Validate wallet addresses - throws ZodError if invalid
579
+ const validatedOwner = createWalletAddress(lease.leaseId.owner);
580
+ const validatedProvider = createWalletAddress(lease.leaseId.provider);
581
+ return {
582
+ owner: validatedOwner,
583
+ provider: validatedProvider,
584
+ // Long types from protobuf need explicit toString() conversion
585
+ dseq: Long.isLong(lease.leaseId.dseq)
586
+ ? lease.leaseId.dseq.toString()
587
+ : String(lease.leaseId.dseq),
588
+ gseq: lease.leaseId.gseq,
589
+ oseq: lease.leaseId.oseq,
590
+ state: 'active',
591
+ price: {
592
+ // Bid price is optional in SDK type, provide fallback
593
+ denom: bid.price?.denom ?? 'uakt',
594
+ amount: bid.price?.amount ?? '0',
595
+ },
596
+ createdAt: new Date().toISOString(),
597
+ };
598
+ }
599
+ //# sourceMappingURL=deployer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployer.js","sourceRoot":"","sources":["../../../src/targets/akash/deployer.ts"],"names":[],"mappings":"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"}