@edgible-team/cli 1.2.13 → 1.2.17

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 (219) hide show
  1. package/README.md +5 -3
  2. package/dist/client/api-client.d.ts +13 -1
  3. package/dist/client/api-client.d.ts.map +1 -1
  4. package/dist/client/api-client.js +19 -0
  5. package/dist/commands/agent/install.d.ts +2 -1
  6. package/dist/commands/agent/install.d.ts.map +1 -1
  7. package/dist/commands/agent/install.js +24 -7
  8. package/dist/commands/agent/start.d.ts +5 -1
  9. package/dist/commands/agent/start.d.ts.map +1 -1
  10. package/dist/commands/agent/start.js +19 -280
  11. package/dist/commands/agent/uninstall.d.ts.map +1 -1
  12. package/dist/commands/agent/uninstall.js +14 -7
  13. package/dist/commands/agent.d.ts.map +1 -1
  14. package/dist/commands/agent.js +3 -2
  15. package/dist/commands/ai/setup.d.ts +1 -1
  16. package/dist/commands/ai/setup.d.ts.map +1 -1
  17. package/dist/commands/ai.js +1 -1
  18. package/dist/commands/application/create-docker-compose.d.ts +3 -1
  19. package/dist/commands/application/create-docker-compose.d.ts.map +1 -1
  20. package/dist/commands/application/create-docker-compose.js +25 -69
  21. package/dist/commands/application/create-existing.d.ts +2 -2
  22. package/dist/commands/application/create-existing.d.ts.map +1 -1
  23. package/dist/commands/application/create-existing.js +27 -132
  24. package/dist/commands/application/create-managed-process.d.ts +3 -1
  25. package/dist/commands/application/create-managed-process.d.ts.map +1 -1
  26. package/dist/commands/application/create-managed-process.js +31 -75
  27. package/dist/commands/application/delete.d.ts +2 -1
  28. package/dist/commands/application/delete.d.ts.map +1 -1
  29. package/dist/commands/application/delete.js +19 -5
  30. package/dist/commands/application/update.d.ts +3 -0
  31. package/dist/commands/application/update.d.ts.map +1 -1
  32. package/dist/commands/application/update.js +45 -1
  33. package/dist/commands/application.d.ts.map +1 -1
  34. package/dist/commands/application.js +33 -19
  35. package/dist/commands/auth.d.ts.map +1 -1
  36. package/dist/commands/auth.js +44 -0
  37. package/dist/commands/debug.js +1 -1
  38. package/dist/commands/device/application-health.d.ts +7 -0
  39. package/dist/commands/device/application-health.d.ts.map +1 -0
  40. package/dist/commands/device/application-health.js +103 -0
  41. package/dist/commands/device/delete.d.ts +7 -0
  42. package/dist/commands/device/delete.d.ts.map +1 -0
  43. package/dist/commands/device/delete.js +69 -0
  44. package/dist/commands/device/health.d.ts +7 -0
  45. package/dist/commands/device/health.d.ts.map +1 -0
  46. package/dist/commands/device/health.js +78 -0
  47. package/dist/commands/device/list.d.ts +5 -0
  48. package/dist/commands/device/list.d.ts.map +1 -0
  49. package/dist/commands/device/list.js +46 -0
  50. package/dist/commands/device/telemetry.d.ts +8 -0
  51. package/dist/commands/device/telemetry.d.ts.map +1 -0
  52. package/dist/commands/device/telemetry.js +59 -0
  53. package/dist/commands/device.d.ts +6 -0
  54. package/dist/commands/device.d.ts.map +1 -0
  55. package/dist/commands/device.js +86 -0
  56. package/dist/commands/stack/deploy.d.ts +8 -0
  57. package/dist/commands/stack/deploy.d.ts.map +1 -0
  58. package/dist/commands/stack/deploy.js +61 -0
  59. package/dist/commands/stack/diff.d.ts +7 -0
  60. package/dist/commands/stack/diff.d.ts.map +1 -0
  61. package/dist/commands/stack/diff.js +66 -0
  62. package/dist/commands/stack/status.d.ts +9 -0
  63. package/dist/commands/stack/status.d.ts.map +1 -0
  64. package/dist/commands/stack/status.js +55 -0
  65. package/dist/commands/stack/teardown.d.ts +8 -0
  66. package/dist/commands/stack/teardown.d.ts.map +1 -0
  67. package/dist/commands/stack/teardown.js +107 -0
  68. package/dist/commands/stack/validate.d.ts +7 -0
  69. package/dist/commands/stack/validate.d.ts.map +1 -0
  70. package/dist/commands/stack/validate.js +44 -0
  71. package/dist/commands/stack.d.ts +10 -0
  72. package/dist/commands/stack.d.ts.map +1 -0
  73. package/dist/commands/stack.js +117 -0
  74. package/dist/commands/utils/auth-prompt.d.ts +25 -0
  75. package/dist/commands/utils/auth-prompt.d.ts.map +1 -0
  76. package/dist/commands/utils/auth-prompt.js +115 -0
  77. package/dist/commands/utils/device-prompt.d.ts +18 -0
  78. package/dist/commands/utils/device-prompt.d.ts.map +1 -0
  79. package/dist/commands/utils/device-prompt.js +58 -0
  80. package/dist/commands/utils/output-formatter.d.ts +13 -0
  81. package/dist/commands/utils/output-formatter.d.ts.map +1 -1
  82. package/dist/commands/utils/output-formatter.js +21 -0
  83. package/dist/index.js +4 -0
  84. package/dist/services/LocalAgentManager.d.ts +2 -1
  85. package/dist/services/LocalAgentManager.d.ts.map +1 -1
  86. package/dist/services/LocalAgentManager.js +6 -4
  87. package/dist/services/application/ApplicationService.d.ts +19 -0
  88. package/dist/services/application/ApplicationService.d.ts.map +1 -1
  89. package/dist/services/application/ApplicationService.js +14 -1
  90. package/dist/services/device/DeviceService.d.ts +62 -0
  91. package/dist/services/device/DeviceService.d.ts.map +1 -0
  92. package/dist/services/device/DeviceService.js +235 -0
  93. package/dist/services/edgible.d.ts +3 -1
  94. package/dist/services/edgible.d.ts.map +1 -1
  95. package/dist/services/edgible.js +5 -4
  96. package/dist/services/instances.d.ts +27 -1
  97. package/dist/services/instances.d.ts.map +1 -1
  98. package/dist/services/instances.js +53 -4
  99. package/dist/services/stack/DependencyGraphManager.d.ts +69 -0
  100. package/dist/services/stack/DependencyGraphManager.d.ts.map +1 -0
  101. package/dist/services/stack/DependencyGraphManager.js +204 -0
  102. package/dist/services/stack/DeviceResolver.d.ts +63 -0
  103. package/dist/services/stack/DeviceResolver.d.ts.map +1 -0
  104. package/dist/services/stack/DeviceResolver.js +147 -0
  105. package/dist/services/stack/GatewayResolver.d.ts +84 -0
  106. package/dist/services/stack/GatewayResolver.d.ts.map +1 -0
  107. package/dist/services/stack/GatewayResolver.js +179 -0
  108. package/dist/services/stack/StackParser.d.ts +38 -0
  109. package/dist/services/stack/StackParser.d.ts.map +1 -0
  110. package/dist/services/stack/StackParser.js +234 -0
  111. package/dist/services/stack/StackService.d.ts +76 -0
  112. package/dist/services/stack/StackService.d.ts.map +1 -0
  113. package/dist/services/stack/StackService.js +476 -0
  114. package/dist/types/AgentConfig.d.ts +26 -0
  115. package/dist/types/AgentConfig.d.ts.map +1 -1
  116. package/dist/types/ApiRequests.d.ts +5 -1
  117. package/dist/types/ApiRequests.d.ts.map +1 -1
  118. package/dist/types/ApiResponses.d.ts +5 -0
  119. package/dist/types/ApiResponses.d.ts.map +1 -1
  120. package/dist/types/JobTypes.d.ts +103 -0
  121. package/dist/types/JobTypes.d.ts.map +1 -0
  122. package/dist/types/JobTypes.js +80 -0
  123. package/dist/types/WebSocketMessages.d.ts +89 -0
  124. package/dist/types/WebSocketMessages.d.ts.map +1 -0
  125. package/dist/types/WebSocketMessages.js +5 -0
  126. package/dist/types/backendJobs.d.ts +102 -0
  127. package/dist/types/backendJobs.d.ts.map +1 -0
  128. package/dist/types/backendJobs.js +5 -0
  129. package/dist/types/models/ApplicationData.d.ts +1 -1
  130. package/dist/types/models/ApplicationData.d.ts.map +1 -1
  131. package/dist/types/models/DeviceData.d.ts +4 -0
  132. package/dist/types/models/DeviceData.d.ts.map +1 -1
  133. package/dist/types/stack.d.ts +191 -0
  134. package/dist/types/stack.d.ts.map +1 -0
  135. package/dist/types/stack.js +5 -0
  136. package/dist/types/validation/schemas.d.ts +20 -20
  137. package/dist/types/validation/schemas.js +1 -1
  138. package/dist/utils/stack-errors.d.ts +103 -0
  139. package/dist/utils/stack-errors.d.ts.map +1 -0
  140. package/dist/utils/stack-errors.js +158 -0
  141. package/dist/utils/stack-file.d.ts +11 -0
  142. package/dist/utils/stack-file.d.ts.map +1 -0
  143. package/dist/utils/stack-file.js +66 -0
  144. package/dist/validation/stack-schemas.d.ts +535 -0
  145. package/dist/validation/stack-schemas.d.ts.map +1 -0
  146. package/dist/validation/stack-schemas.js +178 -0
  147. package/package.json +4 -2
  148. package/dist/commands/agent/agent-handlers.d.ts +0 -45
  149. package/dist/commands/agent/agent-handlers.d.ts.map +0 -1
  150. package/dist/commands/agent/agent-handlers.js +0 -1159
  151. package/dist/commands/application/api-keys.d.ts +0 -3
  152. package/dist/commands/application/api-keys.d.ts.map +0 -1
  153. package/dist/commands/application/api-keys.js +0 -227
  154. package/dist/commands/application/create-compose.d.ts +0 -3
  155. package/dist/commands/application/create-compose.d.ts.map +0 -1
  156. package/dist/commands/application/create-compose.js +0 -381
  157. package/dist/commands/application/create-interactive.d.ts +0 -3
  158. package/dist/commands/application/create-interactive.d.ts.map +0 -1
  159. package/dist/commands/application/create-interactive.js +0 -326
  160. package/dist/commands/application/create-workload.d.ts +0 -5
  161. package/dist/commands/application/create-workload.d.ts.map +0 -1
  162. package/dist/commands/application/create-workload.js +0 -48
  163. package/dist/commands/application/short-codes.d.ts +0 -3
  164. package/dist/commands/application/short-codes.d.ts.map +0 -1
  165. package/dist/commands/application/short-codes.js +0 -226
  166. package/dist/commands/application/toggle.d.ts +0 -2
  167. package/dist/commands/application/toggle.d.ts.map +0 -1
  168. package/dist/commands/application/toggle.js +0 -78
  169. package/dist/commands/examples/migrated-command-example.d.ts +0 -31
  170. package/dist/commands/examples/migrated-command-example.d.ts.map +0 -1
  171. package/dist/commands/examples/migrated-command-example.js +0 -180
  172. package/dist/commands/managedGateway/create.d.ts +0 -6
  173. package/dist/commands/managedGateway/create.d.ts.map +0 -1
  174. package/dist/commands/managedGateway/create.js +0 -50
  175. package/dist/commands/managedGateway/delete.d.ts +0 -5
  176. package/dist/commands/managedGateway/delete.d.ts.map +0 -1
  177. package/dist/commands/managedGateway/delete.js +0 -57
  178. package/dist/commands/managedGateway/get.d.ts +0 -4
  179. package/dist/commands/managedGateway/get.d.ts.map +0 -1
  180. package/dist/commands/managedGateway/get.js +0 -71
  181. package/dist/commands/managedGateway/haproxy-stats.d.ts +0 -6
  182. package/dist/commands/managedGateway/haproxy-stats.d.ts.map +0 -1
  183. package/dist/commands/managedGateway/haproxy-stats.js +0 -131
  184. package/dist/commands/managedGateway/list.d.ts +0 -4
  185. package/dist/commands/managedGateway/list.d.ts.map +0 -1
  186. package/dist/commands/managedGateway/list.js +0 -50
  187. package/dist/commands/managedGateway/logs.d.ts +0 -10
  188. package/dist/commands/managedGateway/logs.d.ts.map +0 -1
  189. package/dist/commands/managedGateway/logs.js +0 -100
  190. package/dist/commands/managedGateway/reboot.d.ts +0 -5
  191. package/dist/commands/managedGateway/reboot.d.ts.map +0 -1
  192. package/dist/commands/managedGateway/reboot.js +0 -95
  193. package/dist/commands/managedGateway/resync.d.ts +0 -10
  194. package/dist/commands/managedGateway/resync.d.ts.map +0 -1
  195. package/dist/commands/managedGateway/resync.js +0 -69
  196. package/dist/commands/managedGateway/ssh.d.ts +0 -4
  197. package/dist/commands/managedGateway/ssh.d.ts.map +0 -1
  198. package/dist/commands/managedGateway/ssh.js +0 -130
  199. package/dist/commands/managedGateway/wipe-logs.d.ts +0 -4
  200. package/dist/commands/managedGateway/wipe-logs.d.ts.map +0 -1
  201. package/dist/commands/managedGateway/wipe-logs.js +0 -67
  202. package/dist/commands/managedGateway/wireguard.d.ts +0 -4
  203. package/dist/commands/managedGateway/wireguard.d.ts.map +0 -1
  204. package/dist/commands/managedGateway/wireguard.js +0 -68
  205. package/dist/di/bindings.d.ts +0 -15
  206. package/dist/di/bindings.d.ts.map +0 -1
  207. package/dist/di/bindings.js +0 -99
  208. package/dist/di/container.d.ts +0 -44
  209. package/dist/di/container.d.ts.map +0 -1
  210. package/dist/di/container.js +0 -88
  211. package/dist/di/types.d.ts +0 -23
  212. package/dist/di/types.d.ts.map +0 -1
  213. package/dist/di/types.js +0 -32
  214. package/dist/repositories/config-repository.d.ts +0 -46
  215. package/dist/repositories/config-repository.d.ts.map +0 -1
  216. package/dist/repositories/config-repository.js +0 -62
  217. package/dist/repositories/gateway-repository.d.ts +0 -37
  218. package/dist/repositories/gateway-repository.d.ts.map +0 -1
  219. package/dist/repositories/gateway-repository.js +0 -35
@@ -1,326 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createInteractiveCommand = createInteractiveCommand;
7
- const commander_1 = require("commander");
8
- const inquirer_1 = __importDefault(require("inquirer"));
9
- const chalk_1 = __importDefault(require("chalk"));
10
- const child_process_1 = require("child_process");
11
- const command_wrapper_1 = require("../base/command-wrapper");
12
- const instances_1 = require("../../services/instances");
13
- const config_validator_1 = require("../utils/config-validator");
14
- const input_parser_1 = require("../utils/input-parser");
15
- function createInteractiveCommand() {
16
- action((0, command_wrapper_1.wrapCommand)(async (options) => {
17
- (0, config_validator_1.validateConfig)(instances_1.configManager, {
18
- requireAuth: true,
19
- requireOrganization: true,
20
- });
21
- // Check sudo permissions
22
- if (!checkSudoPermissions()) {
23
- console.log(chalk_1.default.yellow('⚠ Warning: Not running as sudo. Docker commands may fail without proper permissions.'));
24
- }
25
- // Find docker-compose file
26
- let composeFilePath;
27
- try {
28
- composeFilePath = findDockerComposeFile(options.composeFile);
29
- }
30
- catch (error) {
31
- throw new Error(`Failed to find docker-compose file: ${error instanceof Error ? error.message : 'Unknown error'}`);
32
- }
33
- if (!composeFilePath) {
34
- throw new Error('Docker compose file not found. Please provide --compose-file or ensure docker-compose.yml or docker-compose.yaml exists in the current directory.');
35
- }
36
- console.log(chalk_1.default.blue(`Using docker-compose file: ${composeFilePath}`));
37
- console.log(chalk_1.default.gray('Note: Using Docker Compose v2 (docker compose command)'));
38
- // Parse compose file
39
- let composeData;
40
- try {
41
- composeData = parseDockerComposeFile(composeFilePath);
42
- }
43
- catch (error) {
44
- throw new Error(`Failed to parse docker-compose file: ${error instanceof Error ? error.message : 'Unknown error'}`);
45
- }
46
- if (composeData.containers.length === 0) {
47
- throw new Error('No containers with exposed ports found in docker-compose file');
48
- }
49
- // Build port selection choices
50
- const portChoices = [];
51
- for (const containerInfo of composeData.containers) {
52
- for (const portInfo of containerInfo.ports) {
53
- portChoices.push({
54
- name: `${containerInfo.name}:${portInfo.host}->${portInfo.container}/${portInfo.protocol}`,
55
- value: { container: containerInfo.name, port: portInfo.host },
56
- });
57
- }
58
- }
59
- if (portChoices.length === 0) {
60
- throw new Error('No ports found in docker-compose file');
61
- }
62
- // Get application name
63
- let appName = options.name;
64
- if (!appName && !options.noInteractive) {
65
- const { name } = await inquirer_1.default.prompt([
66
- {
67
- type: 'input',
68
- name: 'name',
69
- message: 'Enter application name:',
70
- validate: (i) => !!i.trim() || 'Application name is required',
71
- },
72
- ]);
73
- appName = name.trim();
74
- }
75
- if (!appName) {
76
- throw new Error('Application name is required');
77
- }
78
- // Select port
79
- let selectedPort;
80
- let selectedContainer;
81
- if (!options.noInteractive) {
82
- const { selected } = await inquirer_1.default.prompt([
83
- {
84
- type: 'list',
85
- name: 'selected',
86
- message: 'Select container and port to expose:',
87
- choices: portChoices,
88
- },
89
- ]);
90
- selectedPort = selected.port;
91
- selectedContainer = selected.container;
92
- }
93
- else {
94
- // In non-interactive mode, use first available port
95
- selectedPort = portChoices[0].value.port;
96
- selectedContainer = portChoices[0].value.container;
97
- }
98
- // Description
99
- const description = options.description || `Application for ${appName} (docker-compose: ${selectedContainer})`;
100
- // Device IDs and Gateway IDs
101
- let deviceId = options.deviceId;
102
- let gatewayIds = (0, input_parser_1.parseGatewayIds)(options.gatewayIds);
103
- let hostnames = Array.isArray(options.hostnames)
104
- ? options.hostnames
105
- : (typeof options.hostnames === 'string' && options.hostnames.trim().length > 0
106
- ? options.hostnames.split(',').map(s => s.trim()).filter(Boolean)
107
- : []);
108
- let useManagedGateway = false;
109
- if (!options.noInteractive) {
110
- // Optional: prompt for additional hostnames
111
- const { addHostnames } = await inquirer_1.default.prompt([
112
- {
113
- type: 'input',
114
- name: 'addHostnames',
115
- message: 'Additional hostnames (comma-separated, optional):',
116
- when: () => hostnames.length === 0,
117
- },
118
- ]);
119
- if (addHostnames && typeof addHostnames === 'string') {
120
- hostnames = addHostnames.split(',').map((s) => s.trim()).filter((s) => s.length > 0);
121
- }
122
- // Prompt for managed gateway option
123
- if (gatewayIds.length === 0) {
124
- const { useManaged } = await inquirer_1.default.prompt([
125
- {
126
- type: 'confirm',
127
- name: 'useManaged',
128
- message: 'Use Edgible managed gateway?',
129
- default: false,
130
- },
131
- ]);
132
- useManagedGateway = useManaged;
133
- if (!useManagedGateway) {
134
- // Ask if they want to assign a gateway at all
135
- const { assignGateway } = await inquirer_1.default.prompt([
136
- {
137
- type: 'confirm',
138
- name: 'assignGateway',
139
- message: 'Assign a gateway to this application? (No = local/internal access only)',
140
- default: true,
141
- },
142
- ]);
143
- if (assignGateway) {
144
- // Try to offer a list of gateways (via service), else fallback to manual input
145
- try {
146
- const gatewaysResp = await instances_1.gatewayService.listGateways();
147
- const gatewayChoices = gatewaysResp.gateways.map((g) => ({
148
- name: `${g.device.name} (${g.device.id})`,
149
- value: g.device.id,
150
- }));
151
- if (gatewayChoices.length > 0) {
152
- const { selectedGateways } = await inquirer_1.default.prompt([
153
- {
154
- type: 'checkbox',
155
- name: 'selectedGateways',
156
- message: 'Select gateway device(s):',
157
- choices: gatewayChoices,
158
- validate: (vals) => vals.length > 0 ? true : 'Select at least one gateway',
159
- },
160
- ]);
161
- gatewayIds = selectedGateways;
162
- }
163
- }
164
- catch (error) {
165
- instances_1.logger.warn('Failed to list gateways', error);
166
- }
167
- if (gatewayIds.length === 0) {
168
- const ans2 = await inquirer_1.default.prompt([
169
- {
170
- type: 'input',
171
- name: 'gatewayIds',
172
- message: 'Enter comma-separated gateway device IDs (or leave empty for no gateway):',
173
- validate: (v) => true, // Allow empty input
174
- },
175
- ]);
176
- if (ans2.gatewayIds && ans2.gatewayIds.trim()) {
177
- gatewayIds = (0, input_parser_1.parseGatewayIds)(ans2.gatewayIds);
178
- }
179
- }
180
- }
181
- else {
182
- instances_1.logger.info('Application will be created without gateway assignment (local/internal access only)');
183
- }
184
- }
185
- }
186
- // Serving device selection
187
- if (!deviceId) {
188
- try {
189
- const servingDevicesResp = await instances_1.edgibleService.listServingDevices();
190
- const servingDeviceChoices = Array.isArray(servingDevicesResp?.devices)
191
- ? servingDevicesResp.devices.map((d) => ({
192
- name: `${d.name || d.id}${d.description ? ` - ${d.description}` : ''}`,
193
- value: d.id,
194
- }))
195
- : [];
196
- if (servingDeviceChoices.length > 0) {
197
- const { selectedDeviceId } = await inquirer_1.default.prompt([
198
- {
199
- type: 'list',
200
- name: 'selectedDeviceId',
201
- message: 'Select serving device:',
202
- choices: servingDeviceChoices,
203
- },
204
- ]);
205
- deviceId = selectedDeviceId;
206
- }
207
- else {
208
- // Fallback to manual input if no serving devices found
209
- const ans = await inquirer_1.default.prompt([
210
- {
211
- type: 'input',
212
- name: 'deviceId',
213
- message: 'Enter serving device ID:',
214
- validate: (v) => v && v.trim().length > 0 ? true : 'Serving device ID is required',
215
- },
216
- ]);
217
- deviceId = String(ans.deviceId).trim();
218
- }
219
- }
220
- catch (error) {
221
- instances_1.logger.warn('Failed to list serving devices', error);
222
- // Fallback to manual input if listing fails
223
- const ans = await inquirer_1.default.prompt([
224
- {
225
- type: 'input',
226
- name: 'deviceId',
227
- message: 'Enter serving device ID:',
228
- validate: (v) => v && v.trim().length > 0 ? true : 'Serving device ID is required',
229
- },
230
- ]);
231
- deviceId = String(ans.deviceId).trim();
232
- }
233
- }
234
- }
235
- if (!deviceId) {
236
- throw new Error('--device-id (serving) is required');
237
- }
238
- if (!useManagedGateway && gatewayIds.length === 0) {
239
- instances_1.logger.warn('No gateways assigned - application will only be accessible locally/internally');
240
- }
241
- // Run docker compose up
242
- console.log(chalk_1.default.blue(`\nRunning docker compose up...`));
243
- try {
244
- const composeDir = path.dirname(composeFilePath);
245
- const composeFileName = path.basename(composeFilePath);
246
- (0, child_process_1.execSync)(`docker compose -f "${composeFileName}" up -d`, {
247
- cwd: composeDir,
248
- stdio: 'inherit',
249
- });
250
- console.log(chalk_1.default.green('✓ Docker compose up completed successfully'));
251
- }
252
- catch (error) {
253
- console.log(chalk_1.default.red('✗ Docker compose up failed'));
254
- throw new Error(`Failed to run docker compose up: ${error instanceof Error ? error.message : 'Unknown error'}`);
255
- }
256
- // Create application
257
- instances_1.logger.info('Creating application', {
258
- name: appName,
259
- port: selectedPort,
260
- protocol: 'https',
261
- deviceId,
262
- gatewayIds,
263
- subtype: 'docker-compose',
264
- });
265
- console.log(chalk_1.default.blue(`\nCreating application: ${appName}`));
266
- console.log(chalk_1.default.gray(`Port: ${selectedPort}`));
267
- console.log(chalk_1.default.gray(`Protocol: HTTPS`));
268
- console.log(chalk_1.default.gray(`Container: ${selectedContainer}`));
269
- console.log(chalk_1.default.gray(`Serving device: ${deviceId}`));
270
- if (useManagedGateway) {
271
- console.log(chalk_1.default.gray(`Using Edgible managed gateway`));
272
- }
273
- else {
274
- console.log(chalk_1.default.gray(`Gateways: ${gatewayIds.join(', ')}`));
275
- }
276
- if (hostnames.length > 0) {
277
- console.log(chalk_1.default.gray(`Additional hostnames: ${hostnames.join(', ')}`));
278
- }
279
- const result = await instances_1.applicationService.createApplicationProgrammatically({
280
- name: appName,
281
- description,
282
- port: selectedPort,
283
- protocol: 'https',
284
- hostnames,
285
- deviceIds: [deviceId],
286
- gatewayIds: useManagedGateway ? undefined : gatewayIds,
287
- useManagedGateway,
288
- subtype: 'docker-compose',
289
- });
290
- console.log(chalk_1.default.green('\n✓ Application created successfully!'));
291
- console.log(chalk_1.default.blue('\n📋 Application Details:'));
292
- if (result && typeof result === 'object' && 'name' in result) {
293
- const app = result;
294
- console.log(chalk_1.default.white(` Name: ${app.name}`));
295
- console.log(chalk_1.default.white(` ID: ${app.id}`));
296
- if (app.url)
297
- console.log(chalk_1.default.white(` URL: ${chalk_1.default.cyan.bold(app.url)}`));
298
- console.log(chalk_1.default.white(` Status: ${app.status}`));
299
- }
300
- }, {
301
- requireAuth: true,
302
- requireOrganization: true,
303
- }));
304
- // Managed Process subcommand
305
- const createManagedProcessCommand = new commander_1.Command('managed-process')
306
- .description('Create application from a managed process (agent runs the command)')
307
- .addHelpText('after', `
308
- Examples:
309
- $ edgible application create managed-process --name myapp --command "node server.js" --port 3000
310
- $ edgible application create managed-process --name myapp --command "python app.py" --port 8080 --working-dir /opt/myapp
311
- $ edgible application create managed-process --no-interactive --name myapp --command "npm start" --port 3000
312
- `)
313
- .option('-n, --name <name>', 'Application name')
314
- .option('-d, --description <description>', 'Application description')
315
- .option('-c, --command <command>', 'Command to execute')
316
- .option('-p, --port <port>', 'Port number the process will listen on')
317
- .option('--working-dir <dir>', 'Working directory for the process')
318
- .option('--env <vars>', 'Environment variables (format: KEY=VALUE,KEY2=VALUE2)')
319
- .option('--log-file <path>', 'Path to log file for stdout/stderr')
320
- .option('--protocol <protocol>', 'Protocol (http, https, tcp, udp)', 'http')
321
- .option('--device-id <id>', 'Serving device ID')
322
- .option('--gateway-ids <ids>', 'Comma-separated gateway device IDs')
323
- .option('--hostnames <hostnames>', 'Comma-separated additional hostnames')
324
- .option('--no-interactive', 'Run in non-interactive mode');
325
- }
326
- //# sourceMappingURL=create-interactive.js.map
@@ -1,5 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function createDockerCommand(): Command;
3
- export declare function createPodmanCommand(): Command;
4
- export declare function createAutoCommand(): Command;
5
- //# sourceMappingURL=create-workload.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-workload.d.ts","sourceRoot":"","sources":["../../../src/commands/application/create-workload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,mBAAmB,IAAI,OAAO,CAe7C;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CAe7C;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAsB3C"}
@@ -1,48 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createDockerCommand = createDockerCommand;
7
- exports.createPodmanCommand = createPodmanCommand;
8
- exports.createAutoCommand = createAutoCommand;
9
- const commander_1 = require("commander");
10
- const chalk_1 = __importDefault(require("chalk"));
11
- const command_wrapper_1 = require("../base/command-wrapper");
12
- function createDockerCommand() {
13
- action((0, command_wrapper_1.wrapCommand)(async () => {
14
- console.log(chalk_1.default.yellow('This workload type is currently not implemented.'));
15
- }, {
16
- requireAuth: false,
17
- requireOrganization: false,
18
- }));
19
- const createQemuCommand = new commander_1.Command('qemu')
20
- .description('Create application from QEMU VM (not implemented)');
21
- }
22
- function createPodmanCommand() {
23
- action((0, command_wrapper_1.wrapCommand)(async () => {
24
- console.log(chalk_1.default.yellow('This workload type is currently not implemented.'));
25
- }, {
26
- requireAuth: false,
27
- requireOrganization: false,
28
- }));
29
- const createPodmanCommand = new commander_1.Command('podman')
30
- .description('Create application from Podman container (not implemented)');
31
- }
32
- function createAutoCommand() {
33
- action((0, command_wrapper_1.wrapCommand)(async () => {
34
- console.log(chalk_1.default.yellow('This workload type is currently not implemented.'));
35
- }, {
36
- requireAuth: false,
37
- requireOrganization: false,
38
- }));
39
- // Add all subcommands to create command
40
- createCommand.addCommand(createExistingCommand);
41
- createCommand.addCommand(createDockerComposeCommand);
42
- createCommand.addCommand(createManagedProcessCommand);
43
- createCommand.addCommand(createDockerCommand);
44
- createCommand.addCommand(createQemuCommand);
45
- createCommand.addCommand(createPodmanCommand);
46
- appCommand;
47
- }
48
- //# sourceMappingURL=create-workload.js.map
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function createShortCodesCommand(): Command;
3
- //# sourceMappingURL=short-codes.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"short-codes.d.ts","sourceRoot":"","sources":["../../../src/commands/application/short-codes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,uBAAuB,IAAI,OAAO,CAqQjD"}
@@ -1,226 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.createShortCodesCommand = createShortCodesCommand;
7
- const inquirer_1 = __importDefault(require("inquirer"));
8
- const chalk_1 = __importDefault(require("chalk"));
9
- const command_wrapper_1 = require("../base/command-wrapper");
10
- const instances_1 = require("../../services/instances");
11
- const config_validator_1 = require("../utils/config-validator");
12
- function createShortCodesCommand() {
13
- command('short-codes')
14
- .description('Manage application short codes')
15
- .alias('codes');
16
- shortCodesCommand
17
- .command('list')
18
- .description('List short codes for an application')
19
- .option('-i, --app-id <id>', 'Application ID')
20
- .option('--json', 'Output as JSON')
21
- .alias('ls')
22
- .action((0, command_wrapper_1.wrapCommand)(async (options) => {
23
- (0, config_validator_1.validateConfig)(instances_1.configManager, {
24
- requireAuth: true,
25
- requireOrganization: true,
26
- });
27
- let appId = options.appId;
28
- if (!appId) {
29
- const applications = await instances_1.applicationService.getApplications();
30
- if (applications.length === 0) {
31
- console.log(chalk_1.default.yellow('⚠ No applications configured'));
32
- return;
33
- }
34
- const { selectedAppId } = await inquirer_1.default.prompt([
35
- {
36
- type: 'list',
37
- name: 'selectedAppId',
38
- message: 'Select application:',
39
- choices: applications.map((app) => ({
40
- name: `${app.name} (${app.id})`,
41
- value: app.id,
42
- })),
43
- },
44
- ]);
45
- appId = selectedAppId;
46
- }
47
- if (!appId) {
48
- throw new Error('Application ID is required');
49
- }
50
- const codes = await instances_1.applicationService.listShortCodes(appId);
51
- if (options.json) {
52
- console.log(JSON.stringify({ codes }, null, 2));
53
- return;
54
- }
55
- if (codes.length === 0) {
56
- console.log(chalk_1.default.yellow('⚠ No short codes configured'));
57
- console.log(chalk_1.default.gray('Use "edgible application short-codes create" to create a short code'));
58
- return;
59
- }
60
- console.log(chalk_1.default.bold('\n🔗 Short Codes:\n'));
61
- codes.forEach((code, index) => {
62
- console.log(`${index + 1}. ${chalk_1.default.cyan(code.name)}`);
63
- console.log(` Code: ${chalk_1.default.bold.green(code.code)}`);
64
- console.log(` ID: ${chalk_1.default.gray(code.id)}`);
65
- console.log(` Created: ${chalk_1.default.gray(new Date(code.createdAt).toLocaleString())}`);
66
- console.log(` Status: ${code.enabled ? chalk_1.default.green('Enabled') : chalk_1.default.red('Disabled')}`);
67
- console.log(` Uses: ${chalk_1.default.gray(code.usedCount)}${code.maxUses ? ` / ${code.maxUses}` : ''}`);
68
- if (code.expiresAt) {
69
- console.log(` Expires: ${chalk_1.default.gray(new Date(code.expiresAt).toLocaleString())}`);
70
- }
71
- console.log();
72
- });
73
- }, {
74
- requireAuth: true,
75
- requireOrganization: true,
76
- }));
77
- shortCodesCommand
78
- .command('create')
79
- .description('Create a new short code')
80
- .option('-i, --app-id <id>', 'Application ID')
81
- .option('-n, --name <name>', 'Code name/description')
82
- .option('--expires <date>', 'Expiration date (ISO format)')
83
- .option('--max-uses <number>', 'Maximum number of uses')
84
- .alias('new')
85
- .action((0, command_wrapper_1.wrapCommand)(async (options) => {
86
- (0, config_validator_1.validateConfig)(instances_1.configManager, {
87
- requireAuth: true,
88
- requireOrganization: true,
89
- });
90
- let appId = options.appId;
91
- if (!appId) {
92
- const applications = await instances_1.applicationService.getApplications();
93
- if (applications.length === 0) {
94
- console.log(chalk_1.default.yellow('⚠ No applications configured'));
95
- return;
96
- }
97
- const { selectedAppId } = await inquirer_1.default.prompt([
98
- {
99
- type: 'list',
100
- name: 'selectedAppId',
101
- message: 'Select application:',
102
- choices: applications.map((app) => ({
103
- name: `${app.name} (${app.id})`,
104
- value: app.id,
105
- })),
106
- },
107
- ]);
108
- appId = selectedAppId;
109
- }
110
- if (!appId) {
111
- throw new Error('Application ID is required');
112
- }
113
- let name = options.name;
114
- if (!name) {
115
- const { codeName } = await inquirer_1.default.prompt([
116
- {
117
- type: 'input',
118
- name: 'codeName',
119
- message: 'Enter a name/description for this short code:',
120
- validate: (input) => input.trim().length > 0 || 'Name is required',
121
- },
122
- ]);
123
- name = codeName;
124
- }
125
- if (!name) {
126
- throw new Error('Name is required');
127
- }
128
- const maxUses = options.maxUses ? parseInt(options.maxUses) : undefined;
129
- const code = await instances_1.applicationService.createShortCode(appId, name, options.expires, maxUses);
130
- console.log(chalk_1.default.green('\n✓ Short code created successfully!\n'));
131
- console.log(chalk_1.default.bold('Share this code:'), chalk_1.default.bold.green(code.code));
132
- console.log(chalk_1.default.gray('\nCode Details:'));
133
- console.log(` Name: ${code.name}`);
134
- console.log(` ID: ${code.id}`);
135
- if (code.maxUses) {
136
- console.log(` Max uses: ${code.maxUses}`);
137
- }
138
- if (code.expiresAt) {
139
- console.log(` Expires: ${new Date(code.expiresAt).toLocaleString()}`);
140
- }
141
- console.log();
142
- }, {
143
- requireAuth: true,
144
- requireOrganization: true,
145
- }));
146
- shortCodesCommand
147
- .command('delete')
148
- .description('Delete a short code')
149
- .option('-i, --app-id <id>', 'Application ID')
150
- .option('-c, --code-id <id>', 'Short Code ID')
151
- .option('-f, --force', 'Skip confirmation prompt')
152
- .alias('rm')
153
- .action((0, command_wrapper_1.wrapCommand)(async (options) => {
154
- (0, config_validator_1.validateConfig)(instances_1.configManager, {
155
- requireAuth: true,
156
- requireOrganization: true,
157
- });
158
- let appId = options.appId;
159
- if (!appId) {
160
- const applications = await instances_1.applicationService.getApplications();
161
- if (applications.length === 0) {
162
- console.log(chalk_1.default.yellow('⚠ No applications configured'));
163
- return;
164
- }
165
- const { selectedAppId } = await inquirer_1.default.prompt([
166
- {
167
- type: 'list',
168
- name: 'selectedAppId',
169
- message: 'Select application:',
170
- choices: applications.map((app) => ({
171
- name: `${app.name} (${app.id})`,
172
- value: app.id,
173
- })),
174
- },
175
- ]);
176
- appId = selectedAppId;
177
- }
178
- if (!appId) {
179
- throw new Error('Application ID is required');
180
- }
181
- let codeId = options.codeId;
182
- if (!codeId) {
183
- const codes = await instances_1.applicationService.listShortCodes(appId);
184
- if (codes.length === 0) {
185
- console.log(chalk_1.default.yellow('⚠ No short codes configured'));
186
- return;
187
- }
188
- const { selectedCodeId } = await inquirer_1.default.prompt([
189
- {
190
- type: 'list',
191
- name: 'selectedCodeId',
192
- message: 'Select short code to delete:',
193
- choices: codes.map((code) => ({
194
- name: `${code.name} (${code.code})`,
195
- value: code.id,
196
- })),
197
- },
198
- ]);
199
- codeId = selectedCodeId;
200
- }
201
- if (!options.force) {
202
- const { confirm } = await inquirer_1.default.prompt([
203
- {
204
- type: 'confirm',
205
- name: 'confirm',
206
- message: 'Are you sure you want to delete this short code?',
207
- default: false,
208
- },
209
- ]);
210
- if (!confirm) {
211
- console.log(chalk_1.default.gray('Deletion cancelled'));
212
- return;
213
- }
214
- }
215
- if (!codeId) {
216
- throw new Error('Code ID is required');
217
- }
218
- await instances_1.applicationService.deleteShortCode(appId, codeId);
219
- console.log(chalk_1.default.green('\n✓ Short code deleted successfully!'));
220
- }, {
221
- requireAuth: true,
222
- requireOrganization: true,
223
- }));
224
- shortCodesCommand;
225
- }
226
- //# sourceMappingURL=short-codes.js.map
@@ -1,2 +0,0 @@
1
- export declare function handleApplicationToggle(appId: string): Promise<void>;
2
- //# sourceMappingURL=toggle.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"toggle.d.ts","sourceRoot":"","sources":["../../../src/commands/application/toggle.ts"],"names":[],"mappings":"AAYA,wBAAsB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8E1E"}