@edgible-team/cli 1.0.1 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/LICENSE +16 -0
  2. package/README.md +114 -1
  3. package/dist/client/api-client.d.ts +575 -0
  4. package/dist/client/api-client.d.ts.map +1 -0
  5. package/dist/client/api-client.js +196 -2
  6. package/dist/client/index.d.ts +10 -0
  7. package/dist/client/index.d.ts.map +1 -0
  8. package/dist/commands/agent.d.ts +3 -0
  9. package/dist/commands/agent.d.ts.map +1 -0
  10. package/dist/commands/agent.js +18 -34
  11. package/dist/commands/ai.d.ts +3 -0
  12. package/dist/commands/ai.d.ts.map +1 -0
  13. package/dist/commands/ai.js +1661 -275
  14. package/dist/commands/application.d.ts +6 -0
  15. package/dist/commands/application.d.ts.map +1 -0
  16. package/dist/commands/application.js +377 -0
  17. package/dist/commands/auth.d.ts +3 -0
  18. package/dist/commands/auth.d.ts.map +1 -0
  19. package/dist/commands/base/BaseCommand.d.ts +53 -0
  20. package/dist/commands/base/BaseCommand.d.ts.map +1 -0
  21. package/dist/commands/base/CommandHandler.d.ts +28 -0
  22. package/dist/commands/base/CommandHandler.d.ts.map +1 -0
  23. package/dist/commands/base/command-wrapper.d.ts +21 -0
  24. package/dist/commands/base/command-wrapper.d.ts.map +1 -0
  25. package/dist/commands/base/middleware.d.ts +34 -0
  26. package/dist/commands/base/middleware.d.ts.map +1 -0
  27. package/dist/commands/config.d.ts +3 -0
  28. package/dist/commands/config.d.ts.map +1 -0
  29. package/dist/commands/connectivity.d.ts +3 -0
  30. package/dist/commands/connectivity.d.ts.map +1 -0
  31. package/dist/commands/debug.d.ts +3 -0
  32. package/dist/commands/debug.d.ts.map +1 -0
  33. package/dist/commands/debug.js +336 -0
  34. package/dist/commands/discover.d.ts +3 -0
  35. package/dist/commands/discover.d.ts.map +1 -0
  36. package/dist/commands/examples/migrated-command-example.d.ts +31 -0
  37. package/dist/commands/examples/migrated-command-example.d.ts.map +1 -0
  38. package/dist/commands/gateway.d.ts +6 -0
  39. package/dist/commands/gateway.d.ts.map +1 -0
  40. package/dist/commands/managedGateway.d.ts +6 -0
  41. package/dist/commands/managedGateway.d.ts.map +1 -0
  42. package/dist/commands/managedGateway.js +132 -0
  43. package/dist/commands/utils/config-validator.d.ts +29 -0
  44. package/dist/commands/utils/config-validator.d.ts.map +1 -0
  45. package/dist/commands/utils/gateway-prompt.d.ts +23 -0
  46. package/dist/commands/utils/gateway-prompt.d.ts.map +1 -0
  47. package/dist/commands/utils/input-parser.d.ts +34 -0
  48. package/dist/commands/utils/input-parser.d.ts.map +1 -0
  49. package/dist/commands/utils/output-formatter.d.ts +62 -0
  50. package/dist/commands/utils/output-formatter.d.ts.map +1 -0
  51. package/dist/config/app-config.d.ts +44 -0
  52. package/dist/config/app-config.d.ts.map +1 -0
  53. package/dist/detection/SystemCapabilityDetector.d.ts +139 -0
  54. package/dist/detection/SystemCapabilityDetector.d.ts.map +1 -0
  55. package/dist/detection/ToolDetector.d.ts +16 -0
  56. package/dist/detection/ToolDetector.d.ts.map +1 -0
  57. package/dist/detection/WorkloadDetector.d.ts +62 -0
  58. package/dist/detection/WorkloadDetector.d.ts.map +1 -0
  59. package/dist/detection/tools.d.ts +16 -0
  60. package/dist/detection/tools.d.ts.map +1 -0
  61. package/dist/detection/tools.js +305 -0
  62. package/dist/di/bindings.d.ts +15 -0
  63. package/dist/di/bindings.d.ts.map +1 -0
  64. package/dist/di/container.d.ts +44 -0
  65. package/dist/di/container.d.ts.map +1 -0
  66. package/dist/di/types.d.ts +23 -0
  67. package/dist/di/types.d.ts.map +1 -0
  68. package/dist/index.d.ts +3 -0
  69. package/dist/index.d.ts.map +1 -0
  70. package/dist/index.js +8 -1
  71. package/dist/interfaces/IDaemonManager.d.ts +67 -0
  72. package/dist/interfaces/IDaemonManager.d.ts.map +1 -0
  73. package/dist/repositories/config-repository.d.ts +46 -0
  74. package/dist/repositories/config-repository.d.ts.map +1 -0
  75. package/dist/repositories/gateway-repository.d.ts +37 -0
  76. package/dist/repositories/gateway-repository.d.ts.map +1 -0
  77. package/dist/services/AgentStatusManager.d.ts +30 -0
  78. package/dist/services/AgentStatusManager.d.ts.map +1 -0
  79. package/dist/services/ConnectivityTester.d.ts +30 -0
  80. package/dist/services/ConnectivityTester.d.ts.map +1 -0
  81. package/dist/services/DependencyInstaller.d.ts +32 -0
  82. package/dist/services/DependencyInstaller.d.ts.map +1 -0
  83. package/dist/services/LocalAgentManager.d.ts +220 -0
  84. package/dist/services/LocalAgentManager.d.ts.map +1 -0
  85. package/dist/services/LocalAgentManager.js +3 -5
  86. package/dist/services/application/ApplicationService.d.ts +54 -0
  87. package/dist/services/application/ApplicationService.d.ts.map +1 -0
  88. package/dist/services/application/ApplicationService.js +10 -3
  89. package/dist/services/auth/AuthService.d.ts +42 -0
  90. package/dist/services/auth/AuthService.d.ts.map +1 -0
  91. package/dist/services/aws.d.ts +136 -0
  92. package/dist/services/aws.d.ts.map +1 -0
  93. package/dist/services/aws.js +2 -2
  94. package/dist/services/daemon/DaemonManagerFactory.d.ts +17 -0
  95. package/dist/services/daemon/DaemonManagerFactory.d.ts.map +1 -0
  96. package/dist/services/daemon/DockerDaemonManager.d.ts +26 -0
  97. package/dist/services/daemon/DockerDaemonManager.d.ts.map +1 -0
  98. package/dist/services/daemon/LaunchdDaemonManager.d.ts +20 -0
  99. package/dist/services/daemon/LaunchdDaemonManager.d.ts.map +1 -0
  100. package/dist/services/daemon/LaunchdDaemonManager.js +54 -6
  101. package/dist/services/daemon/PodmanDaemonManager.d.ts +24 -0
  102. package/dist/services/daemon/PodmanDaemonManager.d.ts.map +1 -0
  103. package/dist/services/daemon/SystemdDaemonManager.d.ts +20 -0
  104. package/dist/services/daemon/SystemdDaemonManager.d.ts.map +1 -0
  105. package/dist/services/daemon/WindowsServiceDaemonManager.d.ts +19 -0
  106. package/dist/services/daemon/WindowsServiceDaemonManager.d.ts.map +1 -0
  107. package/dist/services/daemon/index.d.ts +7 -0
  108. package/dist/services/daemon/index.d.ts.map +1 -0
  109. package/dist/services/edgible.d.ts +304 -0
  110. package/dist/services/edgible.d.ts.map +1 -0
  111. package/dist/services/edgible.js +53 -4
  112. package/dist/services/gateway/GatewayService.d.ts +88 -0
  113. package/dist/services/gateway/GatewayService.d.ts.map +1 -0
  114. package/dist/state/config.d.ts +96 -0
  115. package/dist/state/config.d.ts.map +1 -0
  116. package/dist/types/AgentConfig.d.ts +126 -0
  117. package/dist/types/AgentConfig.d.ts.map +1 -0
  118. package/dist/types/AgentStatus.d.ts +30 -0
  119. package/dist/types/AgentStatus.d.ts.map +1 -0
  120. package/dist/types/ApiClient.d.ts +36 -0
  121. package/dist/types/ApiClient.d.ts.map +1 -0
  122. package/dist/types/ApiRequests.d.ts +269 -0
  123. package/dist/types/ApiRequests.d.ts.map +1 -0
  124. package/dist/types/ApiResponses.d.ts +348 -0
  125. package/dist/types/ApiResponses.d.ts.map +1 -0
  126. package/dist/types/Application.d.ts +13 -0
  127. package/dist/types/Application.d.ts.map +1 -0
  128. package/dist/types/CaddyJson.d.ts +231 -0
  129. package/dist/types/CaddyJson.d.ts.map +1 -0
  130. package/dist/types/DeviceMetrics.d.ts +95 -0
  131. package/dist/types/DeviceMetrics.d.ts.map +1 -0
  132. package/dist/types/DeviceMetrics.js +5 -0
  133. package/dist/types/LogAggregation.d.ts +106 -0
  134. package/dist/types/LogAggregation.d.ts.map +1 -0
  135. package/dist/types/LogAggregation.js +5 -0
  136. package/dist/types/LogEntry.d.ts +60 -0
  137. package/dist/types/LogEntry.d.ts.map +1 -0
  138. package/dist/types/LogEntry.js +5 -0
  139. package/dist/types/UnifiedAgentStatus.d.ts +28 -0
  140. package/dist/types/UnifiedAgentStatus.d.ts.map +1 -0
  141. package/dist/types/WireGuard.d.ts +36 -0
  142. package/dist/types/WireGuard.d.ts.map +1 -0
  143. package/dist/types/Workload.d.ts +9 -0
  144. package/dist/types/Workload.d.ts.map +1 -0
  145. package/dist/types/agent.d.ts +120 -0
  146. package/dist/types/agent.d.ts.map +1 -0
  147. package/dist/types/command-options.d.ts +115 -0
  148. package/dist/types/command-options.d.ts.map +1 -0
  149. package/dist/types/connectivity.d.ts +80 -0
  150. package/dist/types/connectivity.d.ts.map +1 -0
  151. package/dist/types/errors.d.ts +97 -0
  152. package/dist/types/errors.d.ts.map +1 -0
  153. package/dist/types/gateway-types.d.ts +46 -0
  154. package/dist/types/gateway-types.d.ts.map +1 -0
  155. package/dist/types/index.d.ts +28 -0
  156. package/dist/types/index.d.ts.map +1 -0
  157. package/dist/types/models/ApplicationData.d.ts +78 -0
  158. package/dist/types/models/ApplicationData.d.ts.map +1 -0
  159. package/dist/types/models/CertificateData.d.ts +44 -0
  160. package/dist/types/models/CertificateData.d.ts.map +1 -0
  161. package/dist/types/models/DeviceData.d.ts +29 -0
  162. package/dist/types/models/DeviceData.d.ts.map +1 -0
  163. package/dist/types/models/DevicePoolData.d.ts +47 -0
  164. package/dist/types/models/DevicePoolData.d.ts.map +1 -0
  165. package/dist/types/models/LifecycleEvent.d.ts +27 -0
  166. package/dist/types/models/LifecycleEvent.d.ts.map +1 -0
  167. package/dist/types/models/LifecycleEvent.js +5 -0
  168. package/dist/types/models/OrganizationData.d.ts +53 -0
  169. package/dist/types/models/OrganizationData.d.ts.map +1 -0
  170. package/dist/types/models/OrganizationInviteData.d.ts +39 -0
  171. package/dist/types/models/OrganizationInviteData.d.ts.map +1 -0
  172. package/dist/types/models/ProviderConfiguration.d.ts +37 -0
  173. package/dist/types/models/ProviderConfiguration.d.ts.map +1 -0
  174. package/dist/types/models/ResourceData.d.ts +18 -0
  175. package/dist/types/models/ResourceData.d.ts.map +1 -0
  176. package/dist/types/models/ServiceResourceData.d.ts +5 -0
  177. package/dist/types/models/ServiceResourceData.d.ts.map +1 -0
  178. package/dist/types/models/UserData.d.ts +12 -0
  179. package/dist/types/models/UserData.d.ts.map +1 -0
  180. package/dist/types/route.d.ts +67 -0
  181. package/dist/types/route.d.ts.map +1 -0
  182. package/dist/types/validation/schemas.d.ts +606 -0
  183. package/dist/types/validation/schemas.d.ts.map +1 -0
  184. package/dist/types/validation/schemas.js +46 -4
  185. package/dist/types/validation.d.ts +68 -0
  186. package/dist/types/validation.d.ts.map +1 -0
  187. package/dist/utils/FileIntegrityManager.d.ts +37 -0
  188. package/dist/utils/FileIntegrityManager.d.ts.map +1 -0
  189. package/dist/utils/PathMigration.d.ts +45 -0
  190. package/dist/utils/PathMigration.d.ts.map +1 -0
  191. package/dist/utils/PathResolver.d.ts +76 -0
  192. package/dist/utils/PathResolver.d.ts.map +1 -0
  193. package/dist/utils/PlatformDetector.d.ts +60 -0
  194. package/dist/utils/PlatformDetector.d.ts.map +1 -0
  195. package/dist/utils/console-logger.d.ts +37 -0
  196. package/dist/utils/console-logger.d.ts.map +1 -0
  197. package/dist/utils/docker-compose-parser.d.ts +28 -0
  198. package/dist/utils/docker-compose-parser.d.ts.map +1 -0
  199. package/dist/utils/errors.d.ts +63 -0
  200. package/dist/utils/errors.d.ts.map +1 -0
  201. package/dist/utils/health-checker.d.ts +34 -0
  202. package/dist/utils/health-checker.d.ts.map +1 -0
  203. package/dist/utils/json-logger.d.ts +23 -0
  204. package/dist/utils/json-logger.d.ts.map +1 -0
  205. package/dist/utils/log-formatter.d.ts +85 -0
  206. package/dist/utils/log-formatter.d.ts.map +1 -0
  207. package/dist/utils/log-formatter.js +39 -11
  208. package/dist/utils/logger.d.ts +34 -0
  209. package/dist/utils/logger.d.ts.map +1 -0
  210. package/dist/utils/network-utils.d.ts +56 -0
  211. package/dist/utils/network-utils.d.ts.map +1 -0
  212. package/dist/utils/output.d.ts +73 -0
  213. package/dist/utils/output.d.ts.map +1 -0
  214. package/dist/utils/passwordValidation.d.ts +32 -0
  215. package/dist/utils/passwordValidation.d.ts.map +1 -0
  216. package/dist/utils/progress.d.ts +74 -0
  217. package/dist/utils/progress.d.ts.map +1 -0
  218. package/dist/utils/sudo-checker.d.ts +9 -0
  219. package/dist/utils/sudo-checker.d.ts.map +1 -0
  220. package/dist/utils/urls.d.ts +19 -0
  221. package/dist/utils/urls.d.ts.map +1 -0
  222. package/dist/utils/urls.js +3 -3
  223. package/dist/utils/validation.d.ts +19 -0
  224. package/dist/utils/validation.d.ts.map +1 -0
  225. package/dist/validation/schemas.d.ts +197 -0
  226. package/dist/validation/schemas.d.ts.map +1 -0
  227. package/dist/validation/schemas.js +1 -1
  228. package/dist/validation/validator.d.ts +22 -0
  229. package/dist/validation/validator.d.ts.map +1 -0
  230. package/package.json +9 -4
  231. package/recipes/compose/open-webui/.env +1 -0
  232. package/recipes/compose/open-webui/docker-compose.yml +17 -0
@@ -43,6 +43,7 @@ const child_process_1 = require("child_process");
43
43
  const command_wrapper_1 = require("./base/command-wrapper");
44
44
  const container_1 = require("../di/container");
45
45
  const types_1 = require("../di/types");
46
+ const urls_1 = require("../utils/urls");
46
47
  function setupDebugCommands(program) {
47
48
  const debugCommand = program
48
49
  .command('debug')
@@ -94,5 +95,340 @@ function setupDebugCommands(program) {
94
95
  }, {
95
96
  configRepository: (0, container_1.getContainer)().get(types_1.TYPES.ConfigRepository),
96
97
  }));
98
+ debugCommand
99
+ .command('stage')
100
+ .description('Show current stage and environment information')
101
+ .action((0, command_wrapper_1.wrapCommand)(async () => {
102
+ const container = (0, container_1.getContainer)();
103
+ const logger = container.get(types_1.TYPES.Logger);
104
+ logger.debug('Getting stage information');
105
+ const stage = (0, urls_1.getStage)();
106
+ const stageEnv = process.env['STAGE'];
107
+ const sstStageEnv = process.env['SST_STAGE'];
108
+ const nodeEnv = process.env['NODE_ENV'];
109
+ const apiBaseUrl = (0, urls_1.getApiBaseUrl)();
110
+ const distributionUrl = (0, urls_1.getDistributionUrl)();
111
+ console.log(chalk_1.default.blue('\nšŸ“Š Stage Information\n'));
112
+ console.log(chalk_1.default.cyan('Current Stage:'), chalk_1.default.white.bold(stage));
113
+ console.log();
114
+ console.log(chalk_1.default.cyan('Environment Variables:'));
115
+ console.log(chalk_1.default.gray(' STAGE: '), stageEnv || chalk_1.default.gray('(not set)'));
116
+ console.log(chalk_1.default.gray(' SST_STAGE: '), sstStageEnv || chalk_1.default.gray('(not set)'));
117
+ console.log(chalk_1.default.gray(' NODE_ENV: '), nodeEnv || chalk_1.default.gray('(not set)'));
118
+ console.log();
119
+ console.log(chalk_1.default.cyan('Computed URLs:'));
120
+ console.log(chalk_1.default.gray(' API: '), chalk_1.default.white(apiBaseUrl));
121
+ console.log(chalk_1.default.gray(' Distribution: '), chalk_1.default.white(distributionUrl));
122
+ console.log();
123
+ if (!stageEnv && !sstStageEnv) {
124
+ console.log(chalk_1.default.yellow('ℹ Using default stage (prod) - no STAGE or SST_STAGE env var set'));
125
+ console.log(chalk_1.default.gray(' To change: export STAGE=dev (or uat, staging, prod)'));
126
+ }
127
+ }, {
128
+ configRepository: (0, container_1.getContainer)().get(types_1.TYPES.ConfigRepository),
129
+ }));
130
+ debugCommand
131
+ .command('set-stage <stage>')
132
+ .description('Display command to set the stage (dev, uat, staging, prod)')
133
+ .action(async (stage) => {
134
+ try {
135
+ const container = (0, container_1.getContainer)();
136
+ const logger = container.get(types_1.TYPES.Logger);
137
+ const validStages = ['dev', 'uat', 'staging', 'prod', 'test'];
138
+ if (!validStages.includes(stage)) {
139
+ console.log(chalk_1.default.red(`āœ— Invalid stage: ${stage}`));
140
+ console.log(chalk_1.default.gray(` Valid stages: ${validStages.join(', ')}`));
141
+ return;
142
+ }
143
+ logger.debug('Setting stage', { stage });
144
+ console.log(chalk_1.default.blue('\nšŸ”§ Stage Configuration\n'));
145
+ console.log(chalk_1.default.cyan('To set the stage, run one of these commands:\n'));
146
+ console.log(chalk_1.default.white.bold('For current shell session:'));
147
+ console.log(chalk_1.default.green(` export STAGE=${stage}`));
148
+ console.log();
149
+ console.log(chalk_1.default.white.bold('For persistent configuration (bash):'));
150
+ console.log(chalk_1.default.green(` echo 'export STAGE=${stage}' >> ~/.bashrc`));
151
+ console.log(chalk_1.default.gray(' Then reload: source ~/.bashrc'));
152
+ console.log();
153
+ console.log(chalk_1.default.white.bold('For persistent configuration (zsh):'));
154
+ console.log(chalk_1.default.green(` echo 'export STAGE=${stage}' >> ~/.zshrc`));
155
+ console.log(chalk_1.default.gray(' Then reload: source ~/.zshrc'));
156
+ console.log();
157
+ const newApiUrl = `https://api.v2.${stage}.edgible.com`;
158
+ const newDistUrl = `https://distribution.${stage}.edgible.com`;
159
+ console.log(chalk_1.default.cyan('After setting, the CLI will use:'));
160
+ console.log(chalk_1.default.gray(' API: '), chalk_1.default.white(newApiUrl));
161
+ console.log(chalk_1.default.gray(' Distribution: '), chalk_1.default.white(newDistUrl));
162
+ console.log();
163
+ }
164
+ catch (error) {
165
+ const errorMessage = error instanceof Error ? error.message : String(error);
166
+ console.error(chalk_1.default.red('Error:'), errorMessage);
167
+ process.exit(1);
168
+ }
169
+ });
170
+ debugCommand
171
+ .command('application-metrics')
172
+ .description('Fetch and display application metrics')
173
+ .option('-a, --app-id <id>', 'Application ID')
174
+ .option('-o, --org-id <id>', 'Organization ID')
175
+ .option('--hours <hours>', 'Number of hours to look back (default: 24)', '24')
176
+ .option('--json', 'Output as JSON')
177
+ .action((0, command_wrapper_1.wrapCommand)(async (options) => {
178
+ const container = (0, container_1.getContainer)();
179
+ const logger = container.get(types_1.TYPES.Logger);
180
+ const configRepository = container.get(types_1.TYPES.ConfigRepository);
181
+ const config = configRepository.getConfig();
182
+ if (!config.organizationId && !options.orgId) {
183
+ throw new Error('Organization ID is required. Use --org-id or ensure you are logged in.');
184
+ }
185
+ if (!options.appId) {
186
+ throw new Error('Application ID is required. Use --app-id <id>');
187
+ }
188
+ const organizationId = options.orgId || config.organizationId;
189
+ const hours = parseInt(options.hours || '24', 10);
190
+ if (isNaN(hours) || hours <= 0) {
191
+ throw new Error('Hours must be a positive number');
192
+ }
193
+ logger.debug('Fetching application metrics', {
194
+ organizationId,
195
+ applicationId: options.appId,
196
+ hours
197
+ });
198
+ const edgibleService = container.get(types_1.TYPES.EdgibleService);
199
+ const endTime = Date.now();
200
+ const startTime = endTime - (hours * 60 * 60 * 1000);
201
+ try {
202
+ // First, try to get metrics files to debug the issue
203
+ console.log(chalk_1.default.blue('\nšŸ” Debugging Metrics Files Endpoint\n'));
204
+ console.log(chalk_1.default.gray('Testing metrics-files endpoint...'));
205
+ console.log(chalk_1.default.gray(` Organization ID: ${organizationId}`));
206
+ console.log(chalk_1.default.gray(` Application ID: ${options.appId}`));
207
+ console.log(chalk_1.default.gray(` Start Time: ${new Date(startTime).toISOString()} (${startTime})`));
208
+ console.log(chalk_1.default.gray(` End Time: ${new Date(endTime).toISOString()} (${endTime})`));
209
+ console.log();
210
+ let metricsFiles;
211
+ try {
212
+ metricsFiles = await edgibleService.getApplicationMetricsFiles(organizationId, options.appId, startTime, endTime);
213
+ console.log(chalk_1.default.green('āœ… Metrics Files Response:'));
214
+ console.log(chalk_1.default.gray(` Total Files: ${metricsFiles.totalFiles}`));
215
+ console.log(chalk_1.default.gray(` Total Size: ${formatBytes(metricsFiles.totalSizeBytes || 0)}`));
216
+ console.log(chalk_1.default.gray(` Strategy: ${metricsFiles.strategy}`));
217
+ console.log(chalk_1.default.gray(` Files Found: ${metricsFiles.files?.length || 0}`));
218
+ if (metricsFiles.files && metricsFiles.files.length > 0) {
219
+ console.log(chalk_1.default.gray('\n File Details:'));
220
+ metricsFiles.files.slice(0, 5).forEach((file, index) => {
221
+ console.log(chalk_1.default.gray(` ${index + 1}. ${file.type} - ${file.timeRange?.start} to ${file.timeRange?.end}`));
222
+ console.log(chalk_1.default.gray(` Size: ${formatBytes(file.sizeBytes || 0)}, URL: ${file.url?.substring(0, 60)}...`));
223
+ });
224
+ if (metricsFiles.files.length > 5) {
225
+ console.log(chalk_1.default.gray(` ... and ${metricsFiles.files.length - 5} more files`));
226
+ }
227
+ }
228
+ else {
229
+ console.log(chalk_1.default.yellow(' ⚠ No files found in S3 bucket'));
230
+ console.log(chalk_1.default.gray(' This could indicate:'));
231
+ console.log(chalk_1.default.gray(' - Metrics are not being sent to Firehose'));
232
+ console.log(chalk_1.default.gray(' - Files are stored in a different S3 prefix'));
233
+ console.log(chalk_1.default.gray(' - Time range does not match when files were created'));
234
+ console.log(chalk_1.default.gray(' - S3 bucket permissions issue'));
235
+ }
236
+ }
237
+ catch (filesError) {
238
+ console.log(chalk_1.default.red('āŒ Error fetching metrics files:'));
239
+ console.log(chalk_1.default.red(` ${filesError instanceof Error ? filesError.message : String(filesError)}`));
240
+ if (filesError instanceof Error && filesError.stack) {
241
+ console.log(chalk_1.default.gray(` Stack: ${filesError.stack}`));
242
+ }
243
+ }
244
+ console.log();
245
+ console.log(chalk_1.default.blue('šŸ“Š Fetching Aggregated Metrics\n'));
246
+ const metrics = await edgibleService.getApplicationMetrics(organizationId, options.appId, startTime, endTime);
247
+ if (options.json) {
248
+ console.log(JSON.stringify({ metrics, metricsFiles }, null, 2));
249
+ return;
250
+ }
251
+ // Format and display metrics
252
+ console.log(chalk_1.default.blue('šŸ“Š Application Metrics\n'));
253
+ console.log(chalk_1.default.cyan('Application:'), chalk_1.default.white(metrics.applicationName || options.appId));
254
+ console.log(chalk_1.default.cyan('Application ID:'), chalk_1.default.white(metrics.applicationId));
255
+ console.log(chalk_1.default.cyan('Status:'), chalk_1.default.white(metrics.status || 'unknown'));
256
+ console.log(chalk_1.default.cyan('Uptime:'), chalk_1.default.white(formatUptime(metrics.uptime || 0)));
257
+ console.log();
258
+ if (metrics.gateway) {
259
+ console.log(chalk_1.default.yellow('🌐 Gateway Metrics:'));
260
+ console.log(chalk_1.default.gray(' Total Requests:'), chalk_1.default.white(metrics.gateway.totalRequests?.toLocaleString() || '0'));
261
+ console.log(chalk_1.default.gray(' Active Connections:'), chalk_1.default.white(metrics.gateway.activeConnections?.toString() || '0'));
262
+ console.log(chalk_1.default.gray(' Request Rate:'), chalk_1.default.white(`${(metrics.gateway.requestRate || 0).toFixed(2)} req/s`));
263
+ console.log(chalk_1.default.gray(' Error Rate:'), chalk_1.default.white(`${((metrics.gateway.errorRate || 0) * 100).toFixed(2)}%`));
264
+ console.log(chalk_1.default.gray(' Avg Response Time:'), chalk_1.default.white(`${metrics.gateway.averageResponseTime || 0}ms`));
265
+ console.log(chalk_1.default.gray(' Ingress:'), chalk_1.default.white(formatBytes(metrics.gateway.ingressBytes || 0)));
266
+ console.log(chalk_1.default.gray(' Egress:'), chalk_1.default.white(formatBytes(metrics.gateway.egressBytes || 0)));
267
+ console.log(chalk_1.default.gray(' Status:'), chalk_1.default.white(metrics.gateway.status || 'unknown'));
268
+ console.log(chalk_1.default.gray(' Last Seen:'), chalk_1.default.white(new Date(metrics.gateway.lastSeen || Date.now()).toLocaleString()));
269
+ console.log();
270
+ }
271
+ if (metrics.serving) {
272
+ console.log(chalk_1.default.yellow('šŸ–„ļø Serving Device Metrics:'));
273
+ console.log(chalk_1.default.gray(' Health Status:'), chalk_1.default.white(metrics.serving.healthStatus || 'unknown'));
274
+ console.log(chalk_1.default.gray(' Avg Response Time:'), chalk_1.default.white(`${metrics.serving.averageResponseTime || 0}ms`));
275
+ console.log(chalk_1.default.gray(' CPU Usage:'), chalk_1.default.white(`${(metrics.serving.cpuUsage || 0).toFixed(2)}%`));
276
+ console.log(chalk_1.default.gray(' Memory Usage:'), chalk_1.default.white(`${(metrics.serving.memoryUsage || 0).toFixed(2)}%`));
277
+ console.log(chalk_1.default.gray(' Container Restarts:'), chalk_1.default.white((metrics.serving.containerRestarts || 0).toString()));
278
+ console.log(chalk_1.default.gray(' Status:'), chalk_1.default.white(metrics.serving.status || 'unknown'));
279
+ console.log(chalk_1.default.gray(' Last Seen:'), chalk_1.default.white(new Date(metrics.serving.lastSeen || Date.now()).toLocaleString()));
280
+ console.log();
281
+ }
282
+ if (metrics.events && metrics.events.length > 0) {
283
+ console.log(chalk_1.default.yellow('šŸ“… Recent Events:'));
284
+ metrics.events.slice(0, 10).forEach((event) => {
285
+ const timestamp = new Date(event.timestamp).toLocaleString();
286
+ console.log(chalk_1.default.gray(` [${timestamp}]`), chalk_1.default.white(`${event.deviceType}: ${event.message}`));
287
+ });
288
+ if (metrics.events.length > 10) {
289
+ console.log(chalk_1.default.gray(` ... and ${metrics.events.length - 10} more events`));
290
+ }
291
+ }
292
+ if (!metrics.gateway && !metrics.serving) {
293
+ console.log(chalk_1.default.yellow('⚠ No metrics data available for this time range'));
294
+ console.log(chalk_1.default.gray(' Metrics may take up to 1 minute to appear after application starts reporting.'));
295
+ }
296
+ }
297
+ catch (error) {
298
+ logger.error('Failed to fetch application metrics', error);
299
+ throw error;
300
+ }
301
+ }, {
302
+ configRepository: (0, container_1.getContainer)().get(types_1.TYPES.ConfigRepository),
303
+ requireAuth: true,
304
+ }));
305
+ debugCommand
306
+ .command('application-logs')
307
+ .description('Fetch and display application logs')
308
+ .option('-a, --app-id <id>', 'Application ID')
309
+ .option('-o, --org-id <id>', 'Organization ID')
310
+ .option('--hours <hours>', 'Number of hours to look back (default: 24)', '24')
311
+ .option('--level <level>', 'Filter by log level (error, warn, info, debug)')
312
+ .option('--event-type <type>', 'Filter by event type (lifecycle, health, traffic, error, metrics)')
313
+ .option('--json', 'Output as JSON')
314
+ .option('--limit <limit>', 'Maximum number of logs to display (default: 50)', '50')
315
+ .action((0, command_wrapper_1.wrapCommand)(async (options) => {
316
+ const container = (0, container_1.getContainer)();
317
+ const logger = container.get(types_1.TYPES.Logger);
318
+ const configRepository = container.get(types_1.TYPES.ConfigRepository);
319
+ const config = configRepository.getConfig();
320
+ if (!config.organizationId && !options.orgId) {
321
+ throw new Error('Organization ID is required. Use --org-id or ensure you are logged in.');
322
+ }
323
+ if (!options.appId) {
324
+ throw new Error('Application ID is required. Use --app-id <id>');
325
+ }
326
+ const organizationId = options.orgId || config.organizationId;
327
+ const hours = parseInt(options.hours || '24', 10);
328
+ const limit = parseInt(options.limit || '50', 10);
329
+ if (isNaN(hours) || hours <= 0) {
330
+ throw new Error('Hours must be a positive number');
331
+ }
332
+ if (isNaN(limit) || limit <= 0) {
333
+ throw new Error('Limit must be a positive number');
334
+ }
335
+ logger.debug('Fetching application logs', {
336
+ organizationId,
337
+ applicationId: options.appId,
338
+ hours,
339
+ level: options.level,
340
+ eventType: options.eventType,
341
+ limit
342
+ });
343
+ const edgibleService = container.get(types_1.TYPES.EdgibleService);
344
+ const endTime = Date.now();
345
+ const startTime = endTime - (hours * 60 * 60 * 1000);
346
+ try {
347
+ const logs = await edgibleService.getApplicationLogs(organizationId, options.appId, startTime, endTime, options.level, options.eventType);
348
+ if (options.json) {
349
+ console.log(JSON.stringify(logs, null, 2));
350
+ return;
351
+ }
352
+ // Format and display logs
353
+ console.log(chalk_1.default.blue('\nšŸ“‹ Application Logs\n'));
354
+ console.log(chalk_1.default.cyan('Application:'), chalk_1.default.white(logs.applicationName || options.appId));
355
+ console.log(chalk_1.default.cyan('Total Logs:'), chalk_1.default.white((logs.totalLogs || 0).toString()));
356
+ console.log();
357
+ if (!logs.logs || logs.logs.length === 0) {
358
+ console.log(chalk_1.default.yellow('⚠ No logs found for this time range'));
359
+ console.log(chalk_1.default.gray(' Logs may take up to 1 minute to appear after application starts reporting.'));
360
+ return;
361
+ }
362
+ const displayLogs = logs.logs.slice(0, limit);
363
+ displayLogs.forEach((log) => {
364
+ const timestamp = new Date(log.timestamp).toLocaleString();
365
+ const level = log.level || 'info';
366
+ const levelColor = getLevelColor(level);
367
+ const deviceType = log.sourceDetails?.deviceType || 'unknown';
368
+ console.log(chalk_1.default.gray(`[${timestamp}]`), levelColor(`[${level.toUpperCase()}]`), chalk_1.default.cyan(`[${deviceType}]`), chalk_1.default.white(log.message || ''));
369
+ if (log.eventType) {
370
+ console.log(chalk_1.default.gray(' Event Type:'), chalk_1.default.white(log.eventType));
371
+ }
372
+ if (log.eventAction) {
373
+ console.log(chalk_1.default.gray(' Action:'), chalk_1.default.white(log.eventAction));
374
+ }
375
+ if (log.metadata && Object.keys(log.metadata).length > 0) {
376
+ console.log(chalk_1.default.gray(' Metadata:'), chalk_1.default.white(JSON.stringify(log.metadata, null, 2).split('\n').map((l) => ' ' + l).join('\n')));
377
+ }
378
+ console.log();
379
+ });
380
+ if (logs.logs.length > limit) {
381
+ console.log(chalk_1.default.gray(`... and ${logs.logs.length - limit} more logs (use --limit to see more)`));
382
+ }
383
+ }
384
+ catch (error) {
385
+ logger.error('Failed to fetch application logs', error);
386
+ throw error;
387
+ }
388
+ }, {
389
+ configRepository: (0, container_1.getContainer)().get(types_1.TYPES.ConfigRepository),
390
+ requireAuth: true,
391
+ }));
392
+ }
393
+ function formatUptime(seconds) {
394
+ if (seconds < 60) {
395
+ return `${seconds}s`;
396
+ }
397
+ else if (seconds < 3600) {
398
+ const mins = Math.floor(seconds / 60);
399
+ return `${mins}m`;
400
+ }
401
+ else if (seconds < 86400) {
402
+ const hours = Math.floor(seconds / 3600);
403
+ const mins = Math.floor((seconds % 3600) / 60);
404
+ return `${hours}h ${mins}m`;
405
+ }
406
+ else {
407
+ const days = Math.floor(seconds / 86400);
408
+ const hours = Math.floor((seconds % 86400) / 3600);
409
+ return `${days}d ${hours}h`;
410
+ }
411
+ }
412
+ function formatBytes(bytes) {
413
+ if (bytes === 0)
414
+ return '0 B';
415
+ const k = 1024;
416
+ const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
417
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
418
+ return `${(bytes / Math.pow(k, i)).toFixed(2)} ${sizes[i]}`;
419
+ }
420
+ function getLevelColor(level) {
421
+ switch (level.toLowerCase()) {
422
+ case 'error':
423
+ return chalk_1.default.red;
424
+ case 'warn':
425
+ return chalk_1.default.yellow;
426
+ case 'info':
427
+ return chalk_1.default.blue;
428
+ case 'debug':
429
+ return chalk_1.default.gray;
430
+ default:
431
+ return chalk_1.default.white;
432
+ }
97
433
  }
98
434
  //# sourceMappingURL=debug.js.map
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function setupDiscoverCommands(program: Command): void;
3
+ //# sourceMappingURL=discover.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discover.d.ts","sourceRoot":"","sources":["../../src/commands/discover.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4J5D"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Example of a migrated command using all the new infrastructure
3
+ * This demonstrates how to use:
4
+ * - Dependency injection
5
+ * - Logger abstraction
6
+ * - Validation with Zod
7
+ * - Command wrapper
8
+ * - Shared utilities
9
+ * - Proper TypeScript types
10
+ *
11
+ * This is a reference implementation for migrating other commands
12
+ */
13
+ import { Command } from 'commander';
14
+ /**
15
+ * Example: Migrated gateway create command
16
+ * This shows the pattern for all command migrations
17
+ */
18
+ export declare function setupExampleGatewayCreateCommand(program: Command): void;
19
+ /**
20
+ * Migration checklist:
21
+ *
22
+ * āœ… Use DI container to get services
23
+ * āœ… Use logger instead of console.log
24
+ * āœ… Validate inputs with Zod schemas
25
+ * āœ… Use wrapCommand for error handling
26
+ * āœ… Use shared utilities for common operations
27
+ * āœ… Use proper TypeScript types (no any)
28
+ * āœ… Validate configuration before execution
29
+ * āœ… Format output consistently
30
+ */
31
+ //# sourceMappingURL=migrated-command-example.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrated-command-example.d.ts","sourceRoot":"","sources":["../../../src/commands/examples/migrated-command-example.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC;;;GAGG;AACH,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+KvE;AAED;;;;;;;;;;;GAWG"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Gateway command group
4
+ */
5
+ export declare function setupGatewayCommands(program: Command): void;
6
+ //# sourceMappingURL=gateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway.d.ts","sourceRoot":"","sources":["../../src/commands/gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmjB3D"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Managed Gateway debug command group (admin only)
4
+ */
5
+ export declare function setupManagedGatewayCommands(program: Command): void;
6
+ //# sourceMappingURL=managedGateway.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managedGateway.d.ts","sourceRoot":"","sources":["../../src/commands/managedGateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA4hClE"}
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
37
  };
@@ -783,5 +816,104 @@ Examples:
783
816
  configRepository: (0, container_1.getContainer)().get(types_1.TYPES.ConfigRepository),
784
817
  requireAuth: true,
785
818
  }));
819
+ managedGatewayCommand
820
+ .command('haproxy-stats')
821
+ .description('Download HAProxy stats HTML from a managed gateway')
822
+ .alias('stats')
823
+ .option('-i, --id <id>', 'Gateway ID to download stats from')
824
+ .option('-o, --output <file>', 'Output file path (default: haproxy-stats.html)')
825
+ .option('-p, --port <port>', 'HAProxy stats port (default: 8404)')
826
+ .action((0, command_wrapper_1.wrapCommand)(async (options) => {
827
+ const container = (0, container_1.getContainer)();
828
+ const logger = container.get(types_1.TYPES.Logger);
829
+ const configRepository = container.get(types_1.TYPES.ConfigRepository);
830
+ const edgibleService = container.get(types_1.TYPES.EdgibleService);
831
+ (0, config_validator_1.validateConfig)(configRepository, {
832
+ requireAuth: true,
833
+ });
834
+ let gatewayId = options.id;
835
+ // If no gateway ID provided, let user select
836
+ if (!gatewayId) {
837
+ const listResponse = await edgibleService.listManagedGateways();
838
+ if (!listResponse.success || !listResponse.gateways || listResponse.gateways.length === 0) {
839
+ console.log(chalk_1.default.yellow('⚠ No managed gateways found'));
840
+ return;
841
+ }
842
+ const choices = listResponse.gateways.map((gateway) => ({
843
+ name: `${gateway.name} (${gateway.id})`,
844
+ value: gateway.id,
845
+ }));
846
+ const answer = await inquirer_1.default.prompt([
847
+ {
848
+ type: 'list',
849
+ name: 'gatewayId',
850
+ message: 'Select managed gateway:',
851
+ choices,
852
+ },
853
+ ]);
854
+ gatewayId = answer.gatewayId;
855
+ }
856
+ const outputFile = options.output || 'haproxy-stats.html';
857
+ const statsPort = options.port || '8404';
858
+ logger.info('Downloading HAProxy stats', { gatewayId, outputFile, statsPort });
859
+ try {
860
+ if (!gatewayId) {
861
+ console.log(chalk_1.default.red('āœ— Gateway ID is required'));
862
+ return;
863
+ }
864
+ // First check if HAProxy is running and stats are available
865
+ const checkCommand = `curl -s -o /dev/null -w "%{http_code}" http://localhost:${statsPort}/stats`;
866
+ const checkResult = await edgibleService.executeManagedGatewayCommand(gatewayId, checkCommand);
867
+ if (!checkResult.success) {
868
+ console.log(chalk_1.default.red('āœ— Failed to check HAProxy stats availability'));
869
+ if (checkResult.error) {
870
+ console.log(chalk_1.default.red(` Error: ${checkResult.error}`));
871
+ }
872
+ return;
873
+ }
874
+ const httpCode = checkResult.output.trim();
875
+ if (httpCode !== '200') {
876
+ console.log(chalk_1.default.red(`āœ— HAProxy stats not accessible (HTTP ${httpCode})`));
877
+ console.log(chalk_1.default.yellow(` Hint: Check if HAProxy stats are enabled on port ${statsPort}`));
878
+ console.log(chalk_1.default.yellow(` Hint: Check HAPROXY_STATS_PORT environment variable on the gateway`));
879
+ console.log(chalk_1.default.yellow(` Hint: Verify HAProxy is running: edgible managed-gateway ssh --id ${gatewayId}`));
880
+ return;
881
+ }
882
+ console.log(chalk_1.default.blue('šŸ“Š Downloading HAProxy stats...'));
883
+ // Download the stats HTML
884
+ const downloadCommand = `curl -s http://localhost:${statsPort}/stats`;
885
+ const result = await edgibleService.executeManagedGatewayCommand(gatewayId, downloadCommand);
886
+ if (result.success) {
887
+ if (result.output.trim()) {
888
+ // Write to file
889
+ const fs = await Promise.resolve().then(() => __importStar(require('fs/promises')));
890
+ await fs.writeFile(outputFile, result.output, 'utf8');
891
+ console.log(chalk_1.default.green(`\nāœ“ HAProxy stats downloaded successfully!`));
892
+ console.log(chalk_1.default.white(` File: ${outputFile}`));
893
+ console.log(chalk_1.default.white(` Size: ${(result.output.length / 1024).toFixed(2)} KB`));
894
+ console.log(chalk_1.default.blue(`\nšŸ’” Open ${outputFile} in your browser to view the stats`));
895
+ }
896
+ else {
897
+ console.log(chalk_1.default.yellow('⚠ No stats data received'));
898
+ console.log(chalk_1.default.gray(' The stats page may be empty or HAProxy may not have any backends configured'));
899
+ }
900
+ }
901
+ else {
902
+ logger.error('Failed to download HAProxy stats', { error: result.error });
903
+ console.log(chalk_1.default.red('āœ— Failed to download HAProxy stats'));
904
+ if (result.error) {
905
+ console.log(chalk_1.default.red(` Error: ${result.error}`));
906
+ }
907
+ }
908
+ }
909
+ catch (error) {
910
+ logger.error('Error downloading HAProxy stats', error);
911
+ console.log(chalk_1.default.red('āœ— Error downloading HAProxy stats'));
912
+ throw error;
913
+ }
914
+ }, {
915
+ configRepository: (0, container_1.getContainer)().get(types_1.TYPES.ConfigRepository),
916
+ requireAuth: true,
917
+ }));
786
918
  }
787
919
  //# sourceMappingURL=managedGateway.js.map
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Configuration validation utilities
3
+ * Centralizes config validation logic
4
+ */
5
+ import { ConfigRepository } from '../../repositories/config-repository';
6
+ export interface ValidationOptions {
7
+ requireAuth?: boolean;
8
+ requireOrganization?: boolean;
9
+ requireDeviceId?: boolean;
10
+ requireEmail?: boolean;
11
+ requireAwsProfile?: boolean;
12
+ }
13
+ /**
14
+ * Validate configuration based on requirements
15
+ */
16
+ export declare function validateConfig(configRepository: ConfigRepository, options?: ValidationOptions): void;
17
+ /**
18
+ * Get organization ID or throw error
19
+ */
20
+ export declare function requireOrganizationId(configRepository: ConfigRepository): string;
21
+ /**
22
+ * Get device ID or throw error
23
+ */
24
+ export declare function requireDeviceId(configRepository: ConfigRepository): string;
25
+ /**
26
+ * Get email or throw error
27
+ */
28
+ export declare function requireEmail(configRepository: ConfigRepository): string;
29
+ //# sourceMappingURL=config-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-validator.d.ts","sourceRoot":"","sources":["../../../src/commands/utils/config-validator.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sCAAsC,CAAC;AAGxE,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,gBAAgB,EAAE,gBAAgB,EAClC,OAAO,GAAE,iBAAsB,GAC9B,IAAI,CA2CN;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,MAAM,CAMhF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,MAAM,CAM1E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,MAAM,CAMvE"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Shared gateway selection utilities
3
+ * Eliminates duplication across commands
4
+ */
5
+ import { GatewayService } from '../../services/gateway/GatewayService';
6
+ export interface GatewaySelectionOptions {
7
+ allowNone?: boolean;
8
+ message?: string;
9
+ required?: boolean;
10
+ }
11
+ /**
12
+ * Prompt user to select a gateway from available gateways
13
+ */
14
+ export declare function promptGatewaySelection(gatewayService: GatewayService, options?: GatewaySelectionOptions): Promise<string | null>;
15
+ /**
16
+ * Get gateway by ID, or prompt if not provided
17
+ */
18
+ export declare function getGatewayId(gatewayService: GatewayService, providedId: string | undefined, options?: GatewaySelectionOptions): Promise<string | null>;
19
+ /**
20
+ * Validate gateway exists
21
+ */
22
+ export declare function validateGatewayExists(gatewayService: GatewayService, gatewayId: string): Promise<boolean>;
23
+ //# sourceMappingURL=gateway-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gateway-prompt.d.ts","sourceRoot":"","sources":["../../../src/commands/utils/gateway-prompt.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,cAAc,EAAqB,MAAM,uCAAuC,CAAC;AAE1F,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,cAAc,EAAE,cAAc,EAC9B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4CxB;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,cAAc,EAAE,cAAc,EAC9B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAMxB;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,OAAO,CAAC,CAOlB"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Input parsing utilities
3
+ * Converts string inputs to proper types and validates them
4
+ */
5
+ import { z } from 'zod';
6
+ /**
7
+ * Parse port from string
8
+ */
9
+ export declare function parsePort(value: string | number | undefined): number;
10
+ /**
11
+ * Parse protocol from string
12
+ */
13
+ export declare function parseProtocol(value: string | undefined): 'http' | 'https' | 'tcp' | 'udp';
14
+ /**
15
+ * Parse device ID from string
16
+ */
17
+ export declare function parseDeviceId(value: string | undefined): string;
18
+ /**
19
+ * Parse gateway IDs from comma-separated string
20
+ */
21
+ export declare function parseGatewayIds(value: string | undefined): string[];
22
+ /**
23
+ * Parse boolean from string or boolean
24
+ */
25
+ export declare function parseBoolean(value: string | boolean | undefined): boolean;
26
+ /**
27
+ * Parse number from string with validation
28
+ */
29
+ export declare function parseNumber(value: string | number | undefined, min?: number, max?: number): number;
30
+ /**
31
+ * Parse and validate command options
32
+ */
33
+ export declare function parseCommandOptions<T>(schema: z.ZodSchema<T>, options: Record<string, unknown>): T;
34
+ //# sourceMappingURL=input-parser.d.ts.map