@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,82 @@
1
+ /**
2
+ * Local Deployment Orchestrator
3
+ *
4
+ * Main orchestration logic for local Docker/Podman deployments.
5
+ * Coordinates engine management, network setup, compose generation,
6
+ * and container orchestration.
7
+ *
8
+ * This module ties together all the local deployment components:
9
+ * - Engine verification and startup
10
+ * - Network creation
11
+ * - Compose file generation
12
+ * - Container deployment
13
+ *
14
+ * @module targets/local/deployer
15
+ */
16
+ import { type LocalDeploymentOptions, type LocalDeploymentResult } from '../../types/index.js';
17
+ /**
18
+ * Performs a local deployment using Docker or Podman Compose
19
+ *
20
+ * This is the main orchestration function that executes a complete
21
+ * local deployment workflow:
22
+ *
23
+ * 1. **Profile Loading** - Load and validate deployment profile from agent.json
24
+ * 2. **Engine Verification** - Ensure container engine is running (auto-start Podman if needed)
25
+ * 3. **Network Setup** - Create required Docker network for inter-service communication
26
+ * 4. **Compose Generation** - Generate docker-compose.yml from service configurations
27
+ * 5. **File Writing** - Write compose file to disk
28
+ * 6. **Container Deployment** - Execute `docker compose up -d` to start services
29
+ *
30
+ * **Dry Run Mode:**
31
+ * When `dryRun: true` is set, all validation and generation steps are performed,
32
+ * but no actual deployment occurs. The generated compose file is returned in the
33
+ * result for inspection.
34
+ *
35
+ * **Progress Tracking:**
36
+ * Provide an `onProgress` callback to receive real-time updates about deployment
37
+ * progress. Events include phase, message, and optional metadata.
38
+ *
39
+ * @param options - Local deployment options
40
+ * @returns Result with deployment information or error
41
+ *
42
+ * @example Basic Usage
43
+ * ```typescript
44
+ * const result = await deployLocal({
45
+ * projectRoot: '/path/to/project',
46
+ * profile: 'local-dev'
47
+ * });
48
+ *
49
+ * if (result.success) {
50
+ * console.log('Deployed services:', result.data.services);
51
+ * console.log('Endpoints:', result.data.endpoints);
52
+ * } else {
53
+ * console.error('Deployment failed:', result.error.getUserMessage());
54
+ * }
55
+ * ```
56
+ *
57
+ * @example With Progress Tracking
58
+ * ```typescript
59
+ * const result = await deployLocal({
60
+ * projectRoot: process.cwd(),
61
+ * profile: 'production-local',
62
+ * onProgress: (event) => {
63
+ * console.log(`[${event.phase}] ${event.message}`);
64
+ * }
65
+ * });
66
+ * ```
67
+ *
68
+ * @example Dry Run
69
+ * ```typescript
70
+ * const result = await deployLocal({
71
+ * projectRoot: process.cwd(),
72
+ * dryRun: true
73
+ * });
74
+ *
75
+ * if (result.success) {
76
+ * console.log('Generated compose file:');
77
+ * console.log(result.data.composeFile);
78
+ * }
79
+ * ```
80
+ */
81
+ export declare function deployLocal(options: LocalDeploymentOptions): Promise<LocalDeploymentResult>;
82
+ //# sourceMappingURL=deployer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployer.d.ts","sourceRoot":"","sources":["../../../src/targets/local/deployer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAKH,OAAO,EAGL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,sBAAsB,CAAC;AAqF9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,qBAAqB,CAAC,CA0UhC"}
@@ -0,0 +1,367 @@
1
+ /**
2
+ * Local Deployment Orchestrator
3
+ *
4
+ * Main orchestration logic for local Docker/Podman deployments.
5
+ * Coordinates engine management, network setup, compose generation,
6
+ * and container orchestration.
7
+ *
8
+ * This module ties together all the local deployment components:
9
+ * - Engine verification and startup
10
+ * - Network creation
11
+ * - Compose file generation
12
+ * - Container deployment
13
+ *
14
+ * @module targets/local/deployer
15
+ */
16
+ import debug from 'debug';
17
+ import fs from 'node:fs/promises';
18
+ import path from 'node:path';
19
+ import { success, failure, } from '../../types/index.js';
20
+ import { DeploymentError } from '../../errors/index.js';
21
+ import { loadProfile } from '../../utils/profile-loader.js';
22
+ import { runCommand } from '../../utils/command-runner.js';
23
+ import { ensureEngineRunning } from './engine-manager.js';
24
+ import { ensureNetwork } from './network-manager.js';
25
+ import { generateComposeYAML, } from './compose-generator.js';
26
+ /**
27
+ * Debug logger for deployment orchestration
28
+ */
29
+ const log = debug('deploy-ability:local:deploy');
30
+ /**
31
+ * Default network name for KADI deployments
32
+ */
33
+ const DEFAULT_NETWORK = 'kadi-net';
34
+ /**
35
+ * Default compose file name
36
+ */
37
+ const DEFAULT_COMPOSE_FILE = 'docker-compose.yml';
38
+ /**
39
+ * Maps local deployment phase to general deployment phase
40
+ *
41
+ * @param phase - Local deployment phase
42
+ * @returns General deployment phase
43
+ *
44
+ * @internal
45
+ */
46
+ function mapLocalPhaseToDeploymentPhase(phase) {
47
+ switch (phase) {
48
+ case 'profile':
49
+ return 'loading-profile';
50
+ case 'engine':
51
+ case 'network':
52
+ return 'initializing';
53
+ case 'compose':
54
+ case 'deploy':
55
+ return 'creating-deployment';
56
+ case 'complete':
57
+ return 'completed';
58
+ }
59
+ }
60
+ /**
61
+ * Emits a progress event if onProgress callback is provided
62
+ *
63
+ * Converts local deployment phases to general deployment phases
64
+ * for compatibility with the common progress callback interface.
65
+ *
66
+ * @param options - Deployment options
67
+ * @param phase - Local deployment phase
68
+ * @param message - Progress message
69
+ * @param progress - Optional progress percentage (0-100)
70
+ *
71
+ * @internal
72
+ */
73
+ function emitProgress(options, phase, message, progress) {
74
+ if (options.onProgress) {
75
+ log('Progress: %s - %s', phase, message);
76
+ options.onProgress({
77
+ phase: mapLocalPhaseToDeploymentPhase(phase),
78
+ message,
79
+ progress,
80
+ data: {
81
+ localPhase: phase,
82
+ },
83
+ });
84
+ }
85
+ }
86
+ /**
87
+ * Performs a local deployment using Docker or Podman Compose
88
+ *
89
+ * This is the main orchestration function that executes a complete
90
+ * local deployment workflow:
91
+ *
92
+ * 1. **Profile Loading** - Load and validate deployment profile from agent.json
93
+ * 2. **Engine Verification** - Ensure container engine is running (auto-start Podman if needed)
94
+ * 3. **Network Setup** - Create required Docker network for inter-service communication
95
+ * 4. **Compose Generation** - Generate docker-compose.yml from service configurations
96
+ * 5. **File Writing** - Write compose file to disk
97
+ * 6. **Container Deployment** - Execute `docker compose up -d` to start services
98
+ *
99
+ * **Dry Run Mode:**
100
+ * When `dryRun: true` is set, all validation and generation steps are performed,
101
+ * but no actual deployment occurs. The generated compose file is returned in the
102
+ * result for inspection.
103
+ *
104
+ * **Progress Tracking:**
105
+ * Provide an `onProgress` callback to receive real-time updates about deployment
106
+ * progress. Events include phase, message, and optional metadata.
107
+ *
108
+ * @param options - Local deployment options
109
+ * @returns Result with deployment information or error
110
+ *
111
+ * @example Basic Usage
112
+ * ```typescript
113
+ * const result = await deployLocal({
114
+ * projectRoot: '/path/to/project',
115
+ * profile: 'local-dev'
116
+ * });
117
+ *
118
+ * if (result.success) {
119
+ * console.log('Deployed services:', result.data.services);
120
+ * console.log('Endpoints:', result.data.endpoints);
121
+ * } else {
122
+ * console.error('Deployment failed:', result.error.getUserMessage());
123
+ * }
124
+ * ```
125
+ *
126
+ * @example With Progress Tracking
127
+ * ```typescript
128
+ * const result = await deployLocal({
129
+ * projectRoot: process.cwd(),
130
+ * profile: 'production-local',
131
+ * onProgress: (event) => {
132
+ * console.log(`[${event.phase}] ${event.message}`);
133
+ * }
134
+ * });
135
+ * ```
136
+ *
137
+ * @example Dry Run
138
+ * ```typescript
139
+ * const result = await deployLocal({
140
+ * projectRoot: process.cwd(),
141
+ * dryRun: true
142
+ * });
143
+ *
144
+ * if (result.success) {
145
+ * console.log('Generated compose file:');
146
+ * console.log(result.data.composeFile);
147
+ * }
148
+ * ```
149
+ */
150
+ export async function deployLocal(options) {
151
+ const { projectRoot, profile: profileName, engine: engineOverride, network: networkOverride, composeOutputPath: composePathOverride, dryRun = false, verbose = false, logger, } = options;
152
+ log('Starting local deployment');
153
+ log('Project root: %s', projectRoot);
154
+ log('Profile: %s', profileName || '(default)');
155
+ log('Dry run: %s', dryRun);
156
+ // -------------------------------------------------------------------------
157
+ // Phase 1: Load and validate deployment profile
158
+ // -------------------------------------------------------------------------
159
+ emitProgress(options, 'profile', 'Loading deployment profile');
160
+ let loadedProfile;
161
+ try {
162
+ loadedProfile = await loadProfile(projectRoot, profileName, logger);
163
+ }
164
+ catch (error) {
165
+ log('Profile loading failed: %s', error.message);
166
+ return failure(new DeploymentError(`Failed to load deployment profile: ${error.message}`, 'PROFILE_LOAD_ERROR', {
167
+ projectRoot,
168
+ profileName,
169
+ error: error.message,
170
+ }, true, 'Check that agent.json exists and has valid deploy configuration', 'error', error));
171
+ }
172
+ const { name: selectedProfileName, profile } = loadedProfile;
173
+ // Validate this is a local profile
174
+ if (profile.target !== 'local') {
175
+ log('Profile is not a local target: %s', profile.target);
176
+ return failure(new DeploymentError(`Profile "${selectedProfileName}" is not a local deployment profile (target: "${profile.target}")`, 'PROFILE_INVALID', {
177
+ profileName: selectedProfileName,
178
+ target: profile.target,
179
+ }, true, 'Select a profile with target: "local"', 'error'));
180
+ }
181
+ // Extract configuration with overrides
182
+ const engine = engineOverride ?? profile.engine ?? 'docker';
183
+ const networkName = networkOverride ?? profile.network ?? DEFAULT_NETWORK;
184
+ const composePath = composePathOverride ?? path.join(projectRoot, DEFAULT_COMPOSE_FILE);
185
+ log('Configuration: engine=%s network=%s', engine, networkName);
186
+ const serviceNames = Object.keys(profile.services);
187
+ log('Services to deploy: %s', serviceNames.join(', '));
188
+ // -------------------------------------------------------------------------
189
+ // Phase 2: Dry run - preview without executing
190
+ // -------------------------------------------------------------------------
191
+ if (dryRun) {
192
+ log('Dry run mode - generating preview');
193
+ emitProgress(options, 'compose', 'Generating compose file (dry run)');
194
+ const composeResult = generateComposeYAML(profile.services, {
195
+ networkName,
196
+ containerPrefix: 'kadi',
197
+ });
198
+ if (!composeResult.success) {
199
+ log('Compose generation failed: %s', composeResult.error.message);
200
+ return failure(composeResult.error);
201
+ }
202
+ log('Dry run complete - returning preview data');
203
+ return success({
204
+ dryRun: true,
205
+ profile: selectedProfileName,
206
+ engine,
207
+ services: serviceNames,
208
+ composeFile: composeResult.data,
209
+ });
210
+ }
211
+ // -------------------------------------------------------------------------
212
+ // Phase 3: Ensure container engine is running
213
+ // -------------------------------------------------------------------------
214
+ emitProgress(options, 'engine', `Ensuring ${engine} is running`);
215
+ const engineResult = await ensureEngineRunning(engine, {
216
+ timeout: 60_000,
217
+ autoStart: true,
218
+ });
219
+ if (!engineResult.success) {
220
+ log('Engine check failed: %s', engineResult.error.message);
221
+ logger?.error(`❌ ${engine} is not available`);
222
+ return failure(engineResult.error);
223
+ }
224
+ log('Engine ready (autoStarted=%s)', engineResult.data.autoStarted);
225
+ // -------------------------------------------------------------------------
226
+ // Phase 4: Create or verify network
227
+ // -------------------------------------------------------------------------
228
+ emitProgress(options, 'network', `Setting up network: ${networkName}`);
229
+ const networkResult = await ensureNetwork(engine, networkName, {
230
+ timeout: 30_000,
231
+ driver: 'bridge',
232
+ });
233
+ if (!networkResult.success) {
234
+ log('Network setup failed: %s', networkResult.error.message);
235
+ logger?.error(`❌ Failed to create network ${networkName}`);
236
+ return failure(networkResult.error);
237
+ }
238
+ log('Network ready (preexisting=%s)', networkResult.data.preexisting);
239
+ // -------------------------------------------------------------------------
240
+ // Phase 5: Generate Docker Compose file
241
+ // -------------------------------------------------------------------------
242
+ emitProgress(options, 'compose', 'Generating docker-compose.yml');
243
+ const composeOptions = {
244
+ version: '3.9',
245
+ networkName,
246
+ containerPrefix: 'kadi',
247
+ tty: true,
248
+ stdinOpen: true,
249
+ };
250
+ const composeResult = generateComposeYAML(profile.services, composeOptions);
251
+ if (!composeResult.success) {
252
+ log('Compose generation failed: %s', composeResult.error.message);
253
+ logger?.error('❌ Failed to generate docker-compose.yml');
254
+ return failure(composeResult.error);
255
+ }
256
+ log('Compose file generated: %d bytes', composeResult.data.length);
257
+ // -------------------------------------------------------------------------
258
+ // Phase 6: Write compose file to disk
259
+ // -------------------------------------------------------------------------
260
+ emitProgress(options, 'compose', `Writing compose file to ${composePath}`);
261
+ try {
262
+ await fs.writeFile(composePath, composeResult.data, 'utf8');
263
+ log('Compose file written to: %s', composePath);
264
+ }
265
+ catch (error) {
266
+ log('Failed to write compose file: %s', error.message);
267
+ return failure(new DeploymentError(`Failed to write docker-compose.yml to ${composePath}`, 'FILE_WRITE_ERROR', {
268
+ path: composePath,
269
+ error: error.message,
270
+ }, true, 'Check file permissions and disk space', 'error', error));
271
+ }
272
+ // -------------------------------------------------------------------------
273
+ // Phase 7: Deploy services with docker compose
274
+ // -------------------------------------------------------------------------
275
+ emitProgress(options, 'deploy', 'Starting services');
276
+ // Use -d flag for detached mode (background)
277
+ const composeUpCommand = `${engine} compose up -d`;
278
+ log('Executing: %s', composeUpCommand);
279
+ const deployResult = await runCommand(composeUpCommand, {
280
+ cwd: projectRoot,
281
+ timeout: 300_000, // 5 minutes for container pulls
282
+ silent: !verbose,
283
+ });
284
+ if (!deployResult.success) {
285
+ log('Deployment failed: %s', deployResult.error.message);
286
+ logger?.error('❌ Deployment failed');
287
+ return failure(new DeploymentError('Failed to start services with docker compose', 'COMPOSE_UP_FAILED', {
288
+ engine,
289
+ command: composeUpCommand,
290
+ error: deployResult.error.message,
291
+ exitCode: deployResult.error.context.exitCode,
292
+ }, true, 'Check docker compose output for errors, ensure images exist', 'error', deployResult.error));
293
+ }
294
+ log('Deployment completed successfully');
295
+ // -------------------------------------------------------------------------
296
+ // Phase 8: Extract container information
297
+ // -------------------------------------------------------------------------
298
+ emitProgress(options, 'complete', 'Getting container information');
299
+ // Get container IDs from docker compose ps
300
+ const psCommand = `${engine} compose ps --quiet`;
301
+ log('Getting container IDs: %s', psCommand);
302
+ const psResult = await runCommand(psCommand, {
303
+ cwd: projectRoot,
304
+ timeout: 30_000,
305
+ silent: true,
306
+ });
307
+ const containersMap = {};
308
+ if (psResult.success) {
309
+ const containerIds = psResult.data.stdout.trim().split('\n').filter(id => id);
310
+ log('Found %d containers', containerIds.length);
311
+ // Map container IDs to service names
312
+ // Get full container info to match names
313
+ for (const containerId of containerIds) {
314
+ const inspectCmd = `${engine} inspect ${containerId} --format '{{.Name}}'`;
315
+ const inspectResult = await runCommand(inspectCmd, {
316
+ timeout: 10_000,
317
+ silent: true,
318
+ });
319
+ if (inspectResult.success) {
320
+ const containerName = inspectResult.data.stdout.trim().replace(/^\//, ''); // Remove leading /
321
+ // Match container name to service name
322
+ // Container names are typically: kadi-{serviceName} or {project}_{serviceName}_1
323
+ for (const serviceName of serviceNames) {
324
+ if (containerName.includes(serviceName)) {
325
+ containersMap[serviceName] = containerId.substring(0, 12); // Short ID
326
+ log('Mapped service %s to container %s', serviceName, containerId.substring(0, 12));
327
+ break;
328
+ }
329
+ }
330
+ }
331
+ }
332
+ }
333
+ else {
334
+ log('Failed to get container IDs: %s', psResult.error.message);
335
+ // Non-fatal - continue without container IDs
336
+ }
337
+ // -------------------------------------------------------------------------
338
+ // Phase 9: Build endpoint information
339
+ // -------------------------------------------------------------------------
340
+ // Extract endpoints from service configurations
341
+ const endpointsMap = {};
342
+ for (const [serviceName, serviceConfig] of Object.entries(profile.services)) {
343
+ const config = serviceConfig;
344
+ if (config.expose) {
345
+ for (const portConfig of config.expose) {
346
+ const externalPort = portConfig.as ?? portConfig.port;
347
+ // Use first exposed port as primary endpoint for this service
348
+ if (!endpointsMap[serviceName]) {
349
+ endpointsMap[serviceName] = `http://localhost:${externalPort}`;
350
+ }
351
+ }
352
+ }
353
+ }
354
+ log('Endpoints: %o', endpointsMap);
355
+ log('Containers: %o', containersMap);
356
+ return success({
357
+ profile: selectedProfileName,
358
+ engine,
359
+ network: networkResult.data.name,
360
+ services: serviceNames,
361
+ containers: containersMap,
362
+ endpoints: endpointsMap,
363
+ composePath,
364
+ deployedAt: new Date(),
365
+ });
366
+ }
367
+ //# sourceMappingURL=deployer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployer.js","sourceRoot":"","sources":["../../../src/targets/local/deployer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Container Engine Management Module
3
+ *
4
+ * Manages Docker and Podman container engine lifecycle, ensuring engines
5
+ * are running and accessible before deployment operations.
6
+ *
7
+ * Key Features:
8
+ * - Automatic Podman VM startup on macOS/Windows
9
+ * - Health checks and connectivity verification
10
+ * - Structured error handling with recovery suggestions
11
+ * - Type-safe Result returns (no throwing)
12
+ *
13
+ * @module targets/local/engine-manager
14
+ */
15
+ import { type Result, type ContainerEngine } from '../../types/index.js';
16
+ import { DeploymentError } from '../../errors/index.js';
17
+ import { type CommandOptions } from '../../utils/command-runner.js';
18
+ /**
19
+ * Container engine information
20
+ *
21
+ * Returned after successful engine verification, providing
22
+ * structured data about the running engine.
23
+ */
24
+ export interface EngineInfo {
25
+ /**
26
+ * Engine type
27
+ */
28
+ readonly engine: ContainerEngine;
29
+ /**
30
+ * Whether engine is running
31
+ */
32
+ readonly running: boolean;
33
+ /**
34
+ * Engine version string
35
+ */
36
+ readonly version?: string;
37
+ /**
38
+ * Whether this engine was auto-started by us
39
+ */
40
+ readonly autoStarted: boolean;
41
+ /**
42
+ * Platform the engine is running on
43
+ */
44
+ readonly platform?: string;
45
+ }
46
+ /**
47
+ * Options for engine verification
48
+ */
49
+ export interface EngineCheckOptions {
50
+ /**
51
+ * Timeout for engine operations in milliseconds
52
+ * @default 30000 (30 seconds)
53
+ */
54
+ readonly timeout?: number;
55
+ /**
56
+ * Whether to attempt auto-starting the engine
57
+ * @default true
58
+ */
59
+ readonly autoStart?: boolean;
60
+ /**
61
+ * Command execution options
62
+ */
63
+ readonly commandOptions?: CommandOptions;
64
+ }
65
+ /**
66
+ * Checks if a container engine is running and accessible
67
+ *
68
+ * Performs a health check by running `docker info` or `podman info`.
69
+ * Returns structured engine information if successful.
70
+ *
71
+ * **Does NOT auto-start the engine** - use `ensureEngineRunning` for that.
72
+ *
73
+ * @param engine - Container engine to check
74
+ * @param options - Check options
75
+ * @returns Result with engine info or error
76
+ *
77
+ * @example
78
+ * ```typescript
79
+ * const result = await checkEngineRunning('docker');
80
+ *
81
+ * if (result.success) {
82
+ * console.log(`Docker is running: v${result.data.version}`);
83
+ * } else {
84
+ * console.error('Docker not available:', result.error.message);
85
+ * }
86
+ * ```
87
+ */
88
+ export declare function checkEngineRunning(engine: ContainerEngine, options?: EngineCheckOptions): Promise<Result<EngineInfo, DeploymentError>>;
89
+ /**
90
+ * Ensures a container engine is running and accessible
91
+ *
92
+ * This is the main entry point for engine management. It will:
93
+ *
94
+ * **For Docker:**
95
+ * - Check if Docker daemon is running
96
+ * - Return error if not (cannot auto-start Docker)
97
+ * - Provide clear instructions for manual startup
98
+ *
99
+ * **For Podman:**
100
+ * - Check if Podman socket is available
101
+ * - Automatically start Podman VM if not running (macOS/Windows)
102
+ * - Wait for VM to become ready
103
+ * - Return error if auto-start fails
104
+ *
105
+ * This eliminates common "connection refused" errors and provides
106
+ * a better developer experience, especially with Podman's VM architecture.
107
+ *
108
+ * @param engine - Container engine to ensure is running
109
+ * @param options - Engine check options
110
+ * @returns Result with engine info or error
111
+ *
112
+ * @example
113
+ * ```typescript
114
+ * const result = await ensureEngineRunning('podman', { autoStart: true });
115
+ *
116
+ * if (result.success) {
117
+ * console.log('Engine ready:', result.data);
118
+ * if (result.data.autoStarted) {
119
+ * console.log('Podman VM was automatically started');
120
+ * }
121
+ * } else {
122
+ * console.error('Engine error:', result.error.getUserMessage());
123
+ * console.error('Suggestion:', result.error.suggestion);
124
+ * }
125
+ * ```
126
+ *
127
+ * @example With custom timeout
128
+ * ```typescript
129
+ * const result = await ensureEngineRunning('docker', {
130
+ * timeout: 10_000,
131
+ * autoStart: false
132
+ * });
133
+ * ```
134
+ */
135
+ export declare function ensureEngineRunning(engine: ContainerEngine, options?: EngineCheckOptions): Promise<Result<EngineInfo, DeploymentError>>;
136
+ /**
137
+ * Gets version information for a container engine
138
+ *
139
+ * Convenience function to extract just the version string from an engine.
140
+ *
141
+ * @param engine - Container engine to check
142
+ * @param options - Check options
143
+ * @returns Result with version string or error
144
+ *
145
+ * @example
146
+ * ```typescript
147
+ * const result = await getEngineVersion('docker');
148
+ *
149
+ * if (result.success) {
150
+ * console.log('Docker version:', result.data);
151
+ * }
152
+ * ```
153
+ */
154
+ export declare function getEngineVersion(engine: ContainerEngine, options?: EngineCheckOptions): Promise<Result<string, DeploymentError>>;
155
+ //# sourceMappingURL=engine-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine-manager.d.ts","sourceRoot":"","sources":["../../../src/targets/local/engine-manager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EACL,KAAK,MAAM,EAGX,KAAK,eAAe,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAc,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAOhF;;;;;GAKG;AACH,MAAM,WAAW,UAAU;IACzB;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAE7B;;OAEG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;CAC1C;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CAyD9C;AA+ED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC,CA4D9C;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,eAAe,EACvB,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAqB1C"}