@edgible-team/cli 1.2.15 → 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 (194) 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 +3 -1
  57. package/dist/commands/stack/deploy.d.ts.map +1 -1
  58. package/dist/commands/stack/deploy.js +5 -2
  59. package/dist/commands/stack/diff.d.ts +1 -1
  60. package/dist/commands/stack/diff.d.ts.map +1 -1
  61. package/dist/commands/stack/diff.js +4 -2
  62. package/dist/commands/stack/status.d.ts +1 -1
  63. package/dist/commands/stack/status.d.ts.map +1 -1
  64. package/dist/commands/stack/status.js +4 -2
  65. package/dist/commands/stack/teardown.d.ts +3 -1
  66. package/dist/commands/stack/teardown.d.ts.map +1 -1
  67. package/dist/commands/stack/teardown.js +5 -2
  68. package/dist/commands/stack/validate.d.ts +1 -1
  69. package/dist/commands/stack/validate.d.ts.map +1 -1
  70. package/dist/commands/stack/validate.js +4 -2
  71. package/dist/commands/stack.d.ts.map +1 -1
  72. package/dist/commands/stack.js +10 -5
  73. package/dist/commands/utils/auth-prompt.d.ts +25 -0
  74. package/dist/commands/utils/auth-prompt.d.ts.map +1 -0
  75. package/dist/commands/utils/auth-prompt.js +115 -0
  76. package/dist/commands/utils/device-prompt.d.ts +18 -0
  77. package/dist/commands/utils/device-prompt.d.ts.map +1 -0
  78. package/dist/commands/utils/device-prompt.js +58 -0
  79. package/dist/commands/utils/output-formatter.d.ts +13 -0
  80. package/dist/commands/utils/output-formatter.d.ts.map +1 -1
  81. package/dist/commands/utils/output-formatter.js +21 -0
  82. package/dist/index.js +2 -0
  83. package/dist/services/LocalAgentManager.d.ts +2 -1
  84. package/dist/services/LocalAgentManager.d.ts.map +1 -1
  85. package/dist/services/LocalAgentManager.js +6 -4
  86. package/dist/services/application/ApplicationService.d.ts +19 -0
  87. package/dist/services/application/ApplicationService.d.ts.map +1 -1
  88. package/dist/services/application/ApplicationService.js +14 -1
  89. package/dist/services/device/DeviceService.d.ts +62 -0
  90. package/dist/services/device/DeviceService.d.ts.map +1 -0
  91. package/dist/services/device/DeviceService.js +235 -0
  92. package/dist/services/edgible.d.ts +3 -1
  93. package/dist/services/edgible.d.ts.map +1 -1
  94. package/dist/services/edgible.js +5 -4
  95. package/dist/services/instances.d.ts +4 -1
  96. package/dist/services/instances.d.ts.map +1 -1
  97. package/dist/services/instances.js +8 -4
  98. package/dist/types/AgentConfig.d.ts +26 -0
  99. package/dist/types/AgentConfig.d.ts.map +1 -1
  100. package/dist/types/ApiRequests.d.ts +5 -1
  101. package/dist/types/ApiRequests.d.ts.map +1 -1
  102. package/dist/types/ApiResponses.d.ts +5 -0
  103. package/dist/types/ApiResponses.d.ts.map +1 -1
  104. package/dist/types/JobTypes.d.ts +103 -0
  105. package/dist/types/JobTypes.d.ts.map +1 -0
  106. package/dist/types/JobTypes.js +80 -0
  107. package/dist/types/WebSocketMessages.d.ts +89 -0
  108. package/dist/types/WebSocketMessages.d.ts.map +1 -0
  109. package/dist/types/WebSocketMessages.js +5 -0
  110. package/dist/types/backendJobs.d.ts +102 -0
  111. package/dist/types/backendJobs.d.ts.map +1 -0
  112. package/dist/types/backendJobs.js +5 -0
  113. package/dist/types/models/ApplicationData.d.ts +1 -1
  114. package/dist/types/models/ApplicationData.d.ts.map +1 -1
  115. package/dist/types/models/DeviceData.d.ts +4 -0
  116. package/dist/types/models/DeviceData.d.ts.map +1 -1
  117. package/dist/types/validation/schemas.d.ts +3 -3
  118. package/dist/types/validation/schemas.js +1 -1
  119. package/dist/utils/stack-file.d.ts +11 -0
  120. package/dist/utils/stack-file.d.ts.map +1 -0
  121. package/dist/utils/stack-file.js +66 -0
  122. package/package.json +1 -1
  123. package/dist/commands/agent/agent-handlers.d.ts +0 -45
  124. package/dist/commands/agent/agent-handlers.d.ts.map +0 -1
  125. package/dist/commands/agent/agent-handlers.js +0 -1159
  126. package/dist/commands/application/api-keys.d.ts +0 -3
  127. package/dist/commands/application/api-keys.d.ts.map +0 -1
  128. package/dist/commands/application/api-keys.js +0 -227
  129. package/dist/commands/application/create-compose.d.ts +0 -3
  130. package/dist/commands/application/create-compose.d.ts.map +0 -1
  131. package/dist/commands/application/create-compose.js +0 -381
  132. package/dist/commands/application/create-interactive.d.ts +0 -3
  133. package/dist/commands/application/create-interactive.d.ts.map +0 -1
  134. package/dist/commands/application/create-interactive.js +0 -326
  135. package/dist/commands/application/create-workload.d.ts +0 -5
  136. package/dist/commands/application/create-workload.d.ts.map +0 -1
  137. package/dist/commands/application/create-workload.js +0 -48
  138. package/dist/commands/application/short-codes.d.ts +0 -3
  139. package/dist/commands/application/short-codes.d.ts.map +0 -1
  140. package/dist/commands/application/short-codes.js +0 -226
  141. package/dist/commands/application/toggle.d.ts +0 -2
  142. package/dist/commands/application/toggle.d.ts.map +0 -1
  143. package/dist/commands/application/toggle.js +0 -78
  144. package/dist/commands/examples/migrated-command-example.d.ts +0 -31
  145. package/dist/commands/examples/migrated-command-example.d.ts.map +0 -1
  146. package/dist/commands/examples/migrated-command-example.js +0 -180
  147. package/dist/commands/managedGateway/create.d.ts +0 -6
  148. package/dist/commands/managedGateway/create.d.ts.map +0 -1
  149. package/dist/commands/managedGateway/create.js +0 -50
  150. package/dist/commands/managedGateway/delete.d.ts +0 -5
  151. package/dist/commands/managedGateway/delete.d.ts.map +0 -1
  152. package/dist/commands/managedGateway/delete.js +0 -57
  153. package/dist/commands/managedGateway/get.d.ts +0 -4
  154. package/dist/commands/managedGateway/get.d.ts.map +0 -1
  155. package/dist/commands/managedGateway/get.js +0 -71
  156. package/dist/commands/managedGateway/haproxy-stats.d.ts +0 -6
  157. package/dist/commands/managedGateway/haproxy-stats.d.ts.map +0 -1
  158. package/dist/commands/managedGateway/haproxy-stats.js +0 -131
  159. package/dist/commands/managedGateway/list.d.ts +0 -4
  160. package/dist/commands/managedGateway/list.d.ts.map +0 -1
  161. package/dist/commands/managedGateway/list.js +0 -50
  162. package/dist/commands/managedGateway/logs.d.ts +0 -10
  163. package/dist/commands/managedGateway/logs.d.ts.map +0 -1
  164. package/dist/commands/managedGateway/logs.js +0 -100
  165. package/dist/commands/managedGateway/reboot.d.ts +0 -5
  166. package/dist/commands/managedGateway/reboot.d.ts.map +0 -1
  167. package/dist/commands/managedGateway/reboot.js +0 -95
  168. package/dist/commands/managedGateway/resync.d.ts +0 -10
  169. package/dist/commands/managedGateway/resync.d.ts.map +0 -1
  170. package/dist/commands/managedGateway/resync.js +0 -69
  171. package/dist/commands/managedGateway/ssh.d.ts +0 -4
  172. package/dist/commands/managedGateway/ssh.d.ts.map +0 -1
  173. package/dist/commands/managedGateway/ssh.js +0 -130
  174. package/dist/commands/managedGateway/wipe-logs.d.ts +0 -4
  175. package/dist/commands/managedGateway/wipe-logs.d.ts.map +0 -1
  176. package/dist/commands/managedGateway/wipe-logs.js +0 -67
  177. package/dist/commands/managedGateway/wireguard.d.ts +0 -4
  178. package/dist/commands/managedGateway/wireguard.d.ts.map +0 -1
  179. package/dist/commands/managedGateway/wireguard.js +0 -68
  180. package/dist/di/bindings.d.ts +0 -15
  181. package/dist/di/bindings.d.ts.map +0 -1
  182. package/dist/di/bindings.js +0 -99
  183. package/dist/di/container.d.ts +0 -44
  184. package/dist/di/container.d.ts.map +0 -1
  185. package/dist/di/container.js +0 -88
  186. package/dist/di/types.d.ts +0 -23
  187. package/dist/di/types.d.ts.map +0 -1
  188. package/dist/di/types.js +0 -32
  189. package/dist/repositories/config-repository.d.ts +0 -46
  190. package/dist/repositories/config-repository.d.ts.map +0 -1
  191. package/dist/repositories/config-repository.js +0 -62
  192. package/dist/repositories/gateway-repository.d.ts +0 -37
  193. package/dist/repositories/gateway-repository.d.ts.map +0 -1
  194. package/dist/repositories/gateway-repository.js +0 -35
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function createApiKeysCommand(): Command;
3
- //# sourceMappingURL=api-keys.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-keys.d.ts","sourceRoot":"","sources":["../../../src/commands/application/api-keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,oBAAoB,IAAI,OAAO,CAuQ9C"}
@@ -1,227 +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.createApiKeysCommand = createApiKeysCommand;
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 createApiKeysCommand() {
13
- command('api-keys')
14
- .description('Manage application API keys')
15
- .alias('keys');
16
- apiKeysCommand
17
- .command('list')
18
- .description('List API keys 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 keys = await instances_1.applicationService.listApiKeys(appId);
51
- if (options.json) {
52
- console.log(JSON.stringify({ keys }, null, 2));
53
- return;
54
- }
55
- if (keys.length === 0) {
56
- console.log(chalk_1.default.yellow('⚠ No API keys configured'));
57
- console.log(chalk_1.default.gray('Use "edgible application api-keys create" to create an API key'));
58
- return;
59
- }
60
- console.log(chalk_1.default.bold('\nšŸ”‘ API Keys:\n'));
61
- keys.forEach((key, index) => {
62
- console.log(`${index + 1}. ${chalk_1.default.cyan(key.name)}`);
63
- console.log(` ID: ${chalk_1.default.gray(key.id)}`);
64
- console.log(` Prefix: ${chalk_1.default.gray(key.keyPrefix)}`);
65
- console.log(` Created: ${chalk_1.default.gray(new Date(key.createdAt).toLocaleString())}`);
66
- console.log(` Status: ${key.enabled ? chalk_1.default.green('Enabled') : chalk_1.default.red('Disabled')}`);
67
- if (key.expiresAt) {
68
- console.log(` Expires: ${chalk_1.default.gray(new Date(key.expiresAt).toLocaleString())}`);
69
- }
70
- if (key.lastUsedAt) {
71
- console.log(` Last used: ${chalk_1.default.gray(new Date(key.lastUsedAt).toLocaleString())}`);
72
- }
73
- console.log();
74
- });
75
- }, {
76
- requireAuth: true,
77
- requireOrganization: true,
78
- }));
79
- apiKeysCommand
80
- .command('create')
81
- .description('Create a new API key')
82
- .option('-i, --app-id <id>', 'Application ID')
83
- .option('-n, --name <name>', 'Key name')
84
- .option('--expires <date>', 'Expiration date (ISO format)')
85
- .alias('new')
86
- .action((0, command_wrapper_1.wrapCommand)(async (options) => {
87
- (0, config_validator_1.validateConfig)(instances_1.configManager, {
88
- requireAuth: true,
89
- requireOrganization: true,
90
- });
91
- let appId = options.appId;
92
- if (!appId) {
93
- const applications = await instances_1.applicationService.getApplications();
94
- if (applications.length === 0) {
95
- console.log(chalk_1.default.yellow('⚠ No applications configured'));
96
- return;
97
- }
98
- const { selectedAppId } = await inquirer_1.default.prompt([
99
- {
100
- type: 'list',
101
- name: 'selectedAppId',
102
- message: 'Select application:',
103
- choices: applications.map((app) => ({
104
- name: `${app.name} (${app.id})`,
105
- value: app.id,
106
- })),
107
- },
108
- ]);
109
- appId = selectedAppId;
110
- }
111
- if (!appId) {
112
- throw new Error('Application ID is required');
113
- }
114
- let name = options.name;
115
- if (!name) {
116
- const { keyName } = await inquirer_1.default.prompt([
117
- {
118
- type: 'input',
119
- name: 'keyName',
120
- message: 'Enter a name for this API key:',
121
- validate: (input) => input.trim().length > 0 || 'Name is required',
122
- },
123
- ]);
124
- name = keyName;
125
- }
126
- if (!name) {
127
- throw new Error('Name is required');
128
- }
129
- const result = await instances_1.applicationService.createApiKey(appId, name, options.expires);
130
- console.log(chalk_1.default.green('\nāœ“ API key created successfully!\n'));
131
- console.log(chalk_1.default.bold.red('āš ļø IMPORTANT: Save this API key now. It will not be shown again!\n'));
132
- console.log(chalk_1.default.cyan('API Key:'), chalk_1.default.bold(result.apiKey));
133
- console.log(chalk_1.default.gray('\nKey Details:'));
134
- console.log(` Name: ${result.keyData.name}`);
135
- console.log(` Key ID: ${result.keyData.id}`);
136
- console.log(` Key Prefix: ${result.keyData.keyPrefix}`);
137
- console.log(` Full ID: ${result.keyData.keyPrefix}-${result.keyData.id}`);
138
- if (result.keyData.expiresAt) {
139
- console.log(` Expires: ${new Date(result.keyData.expiresAt).toLocaleString()}`);
140
- }
141
- console.log();
142
- }, {
143
- requireAuth: true,
144
- requireOrganization: true,
145
- }));
146
- apiKeysCommand
147
- .command('delete')
148
- .description('Delete an API key')
149
- .option('-i, --app-id <id>', 'Application ID')
150
- .option('-k, --key-id <id>', 'API Key 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 keyId = options.keyId;
182
- if (!keyId) {
183
- const keys = await instances_1.applicationService.listApiKeys(appId);
184
- if (keys.length === 0) {
185
- console.log(chalk_1.default.yellow('⚠ No API keys configured'));
186
- return;
187
- }
188
- const { selectedKeyId } = await inquirer_1.default.prompt([
189
- {
190
- type: 'list',
191
- name: 'selectedKeyId',
192
- message: 'Select API key to delete:',
193
- choices: keys.map((key) => ({
194
- name: `${key.name} (${key.keyPrefix})`,
195
- value: key.id,
196
- })),
197
- },
198
- ]);
199
- keyId = selectedKeyId;
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 API key?',
207
- default: false,
208
- },
209
- ]);
210
- if (!confirm) {
211
- console.log(chalk_1.default.gray('Deletion cancelled'));
212
- return;
213
- }
214
- }
215
- if (!keyId) {
216
- throw new Error('Key ID is required');
217
- }
218
- await instances_1.applicationService.deleteApiKey(appId, keyId);
219
- console.log(chalk_1.default.green('\nāœ“ API key deleted successfully!'));
220
- }, {
221
- requireAuth: true,
222
- requireOrganization: true,
223
- }));
224
- // Short Codes subcommand group
225
- const shortCodesCommand = appCommand;
226
- }
227
- //# sourceMappingURL=api-keys.js.map
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function createComposeCommand(): Command;
3
- //# sourceMappingURL=create-compose.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-compose.d.ts","sourceRoot":"","sources":["../../../src/commands/application/create-compose.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,oBAAoB,IAAI,OAAO,CA0Z9C"}
@@ -1,381 +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.createComposeCommand = createComposeCommand;
7
- const commander_1 = require("commander");
8
- const inquirer_1 = __importDefault(require("inquirer"));
9
- const chalk_1 = __importDefault(require("chalk"));
10
- const command_wrapper_1 = require("../base/command-wrapper");
11
- const instances_1 = require("../../services/instances");
12
- const config_validator_1 = require("../utils/config-validator");
13
- const input_parser_1 = require("../utils/input-parser");
14
- function createComposeCommand() {
15
- action((0, command_wrapper_1.wrapCommand)(async (options) => {
16
- (0, config_validator_1.validateConfig)(instances_1.configManager, {
17
- requireAuth: true,
18
- requireOrganization: true,
19
- });
20
- // Application name
21
- let appName = options.name;
22
- if (!appName && !options.noInteractive) {
23
- const { name } = await inquirer_1.default.prompt([
24
- {
25
- type: 'input',
26
- name: 'name',
27
- message: 'Enter application name:',
28
- validate: (i) => !!i.trim() || 'Application name is required',
29
- },
30
- ]);
31
- appName = name.trim();
32
- }
33
- if (!appName) {
34
- throw new Error('Application name is required');
35
- }
36
- // Command
37
- let command = options.command;
38
- if (!command && !options.noInteractive) {
39
- const { cmd } = await inquirer_1.default.prompt([
40
- {
41
- type: 'input',
42
- name: 'cmd',
43
- message: 'Enter command to run:',
44
- validate: (i) => !!i.trim() || 'Command is required',
45
- },
46
- ]);
47
- command = cmd.trim();
48
- }
49
- if (!command) {
50
- throw new Error('Command is required');
51
- }
52
- // Port
53
- let port = options.port ? (0, input_parser_1.parsePort)(options.port) : undefined;
54
- if (!port && !options.noInteractive) {
55
- const { portInput } = await inquirer_1.default.prompt([
56
- {
57
- type: 'input',
58
- name: 'portInput',
59
- message: 'Enter port number the process will listen on:',
60
- default: '3000',
61
- validate: (i) => {
62
- const p = parseInt(i, 10);
63
- return (p > 0 && p <= 65535) || 'Port must be between 1 and 65535';
64
- },
65
- },
66
- ]);
67
- port = (0, input_parser_1.parsePort)(portInput);
68
- }
69
- if (!port) {
70
- throw new Error('Port is required');
71
- }
72
- // Working directory
73
- let workingDirectory = options.workingDir;
74
- if (!workingDirectory && !options.noInteractive) {
75
- const { dir } = await inquirer_1.default.prompt([
76
- {
77
- type: 'input',
78
- name: 'dir',
79
- message: 'Enter working directory (leave empty for current directory):',
80
- default: process.cwd(),
81
- },
82
- ]);
83
- workingDirectory = dir.trim();
84
- }
85
- // Environment variables
86
- let env = {};
87
- if (options.env) {
88
- // Parse format: KEY=VALUE,KEY2=VALUE2
89
- const pairs = options.env.split(',');
90
- for (const pair of pairs) {
91
- const [key, value] = pair.split('=');
92
- if (key && value) {
93
- env[key.trim()] = value.trim();
94
- }
95
- }
96
- }
97
- else if (!options.noInteractive) {
98
- const { addEnv } = await inquirer_1.default.prompt([
99
- {
100
- type: 'confirm',
101
- name: 'addEnv',
102
- message: 'Add environment variables?',
103
- default: false,
104
- },
105
- ]);
106
- if (addEnv) {
107
- let continueAdding = true;
108
- while (continueAdding) {
109
- const { key, value } = await inquirer_1.default.prompt([
110
- {
111
- type: 'input',
112
- name: 'key',
113
- message: 'Environment variable name:',
114
- },
115
- {
116
- type: 'input',
117
- name: 'value',
118
- message: 'Environment variable value:',
119
- },
120
- ]);
121
- if (key && value) {
122
- env[key.trim()] = value.trim();
123
- }
124
- const { more } = await inquirer_1.default.prompt([
125
- {
126
- type: 'confirm',
127
- name: 'more',
128
- message: 'Add another environment variable?',
129
- default: false,
130
- },
131
- ]);
132
- continueAdding = more;
133
- }
134
- }
135
- }
136
- // Log file
137
- let logFile = options.logFile;
138
- if (!logFile && !options.noInteractive) {
139
- const { addLog } = await inquirer_1.default.prompt([
140
- {
141
- type: 'confirm',
142
- name: 'addLog',
143
- message: 'Capture logs to file?',
144
- default: false,
145
- },
146
- ]);
147
- if (addLog) {
148
- const { path: logPath } = await inquirer_1.default.prompt([
149
- {
150
- type: 'input',
151
- name: 'path',
152
- message: 'Log file path:',
153
- default: `/var/log/${appName}.log`,
154
- },
155
- ]);
156
- logFile = logPath.trim();
157
- }
158
- }
159
- // Description
160
- const description = options.description || `Managed process application for ${appName}`;
161
- // Protocol
162
- const protocol = (0, input_parser_1.parseProtocol)(options.protocol);
163
- // Device IDs and Gateway IDs
164
- let deviceId = options.deviceId;
165
- let gatewayIds = (0, input_parser_1.parseGatewayIds)(options.gatewayIds);
166
- let hostnames = Array.isArray(options.hostnames)
167
- ? options.hostnames
168
- : (typeof options.hostnames === 'string' && options.hostnames.trim().length > 0
169
- ? options.hostnames.split(',').map(s => s.trim()).filter(Boolean)
170
- : []);
171
- let useManagedGateway = false;
172
- if (!options.noInteractive) {
173
- // Optional: prompt for additional hostnames
174
- const { addHostnames } = await inquirer_1.default.prompt([
175
- {
176
- type: 'input',
177
- name: 'addHostnames',
178
- message: 'Additional hostnames (comma-separated, optional):',
179
- when: () => hostnames.length === 0,
180
- },
181
- ]);
182
- if (addHostnames && typeof addHostnames === 'string') {
183
- hostnames = addHostnames.split(',').map((s) => s.trim()).filter((s) => s.length > 0);
184
- }
185
- // Prompt for managed gateway option
186
- if (gatewayIds.length === 0) {
187
- const { useManaged } = await inquirer_1.default.prompt([
188
- {
189
- type: 'confirm',
190
- name: 'useManaged',
191
- message: 'Use Edgible managed gateway?',
192
- default: false,
193
- },
194
- ]);
195
- useManagedGateway = useManaged;
196
- if (!useManagedGateway) {
197
- // Ask if they want to assign a gateway at all
198
- const { assignGateway } = await inquirer_1.default.prompt([
199
- {
200
- type: 'confirm',
201
- name: 'assignGateway',
202
- message: 'Assign a gateway to this application? (No = local/internal access only)',
203
- default: true,
204
- },
205
- ]);
206
- if (assignGateway) {
207
- // Try to offer a list of gateways (via service), else fallback to manual input
208
- try {
209
- const gatewaysResp = await instances_1.gatewayService.listGateways();
210
- const gatewayChoices = gatewaysResp.gateways.map((g) => ({
211
- name: `${g.device.name} (${g.device.id})`,
212
- value: g.device.id,
213
- }));
214
- if (gatewayChoices.length > 0) {
215
- const { selectedGateways } = await inquirer_1.default.prompt([
216
- {
217
- type: 'checkbox',
218
- name: 'selectedGateways',
219
- message: 'Select gateway device(s):',
220
- choices: gatewayChoices,
221
- validate: (vals) => vals.length > 0 ? true : 'Select at least one gateway',
222
- },
223
- ]);
224
- gatewayIds = selectedGateways;
225
- }
226
- }
227
- catch (error) {
228
- instances_1.logger.warn('Failed to list gateways', error);
229
- }
230
- if (gatewayIds.length === 0) {
231
- const ans2 = await inquirer_1.default.prompt([
232
- {
233
- type: 'input',
234
- name: 'gatewayIds',
235
- message: 'Enter comma-separated gateway device IDs (or leave empty for no gateway):',
236
- validate: (v) => true, // Allow empty input
237
- },
238
- ]);
239
- if (ans2.gatewayIds && ans2.gatewayIds.trim()) {
240
- gatewayIds = (0, input_parser_1.parseGatewayIds)(ans2.gatewayIds);
241
- }
242
- }
243
- }
244
- else {
245
- instances_1.logger.info('Application will be created without gateway assignment (local/internal access only)');
246
- }
247
- }
248
- }
249
- // Serving device selection
250
- if (!deviceId) {
251
- try {
252
- const servingDevicesResp = await instances_1.edgibleService.listServingDevices();
253
- const servingDeviceChoices = Array.isArray(servingDevicesResp?.devices)
254
- ? servingDevicesResp.devices.map((d) => ({
255
- name: `${d.name || d.id}${d.description ? ` - ${d.description}` : ''}`,
256
- value: d.id,
257
- }))
258
- : [];
259
- if (servingDeviceChoices.length > 0) {
260
- const { selectedDeviceId } = await inquirer_1.default.prompt([
261
- {
262
- type: 'list',
263
- name: 'selectedDeviceId',
264
- message: 'Select serving device:',
265
- choices: servingDeviceChoices,
266
- },
267
- ]);
268
- deviceId = selectedDeviceId;
269
- }
270
- else {
271
- // Fallback to manual input if no serving devices found
272
- const ans = await inquirer_1.default.prompt([
273
- {
274
- type: 'input',
275
- name: 'deviceId',
276
- message: 'Enter serving device ID:',
277
- validate: (v) => v && v.trim().length > 0 ? true : 'Serving device ID is required',
278
- },
279
- ]);
280
- deviceId = String(ans.deviceId).trim();
281
- }
282
- }
283
- catch (error) {
284
- instances_1.logger.warn('Failed to list serving devices', error);
285
- // Fallback to manual input if listing fails
286
- const ans = await inquirer_1.default.prompt([
287
- {
288
- type: 'input',
289
- name: 'deviceId',
290
- message: 'Enter serving device ID:',
291
- validate: (v) => v && v.trim().length > 0 ? true : 'Serving device ID is required',
292
- },
293
- ]);
294
- deviceId = String(ans.deviceId).trim();
295
- }
296
- }
297
- }
298
- if (!deviceId) {
299
- throw new Error('--device-id (serving) is required');
300
- }
301
- if (!useManagedGateway && gatewayIds.length === 0) {
302
- instances_1.logger.warn('No gateways assigned - application will only be accessible locally/internally');
303
- }
304
- // Build configuration
305
- const configuration = {
306
- command,
307
- };
308
- if (workingDirectory) {
309
- configuration.workingDirectory = workingDirectory;
310
- }
311
- if (Object.keys(env).length > 0) {
312
- configuration.env = env;
313
- }
314
- if (logFile) {
315
- configuration.logFile = logFile;
316
- }
317
- // Create application
318
- instances_1.logger.info('Creating managed process application', {
319
- name: appName,
320
- port,
321
- protocol,
322
- command,
323
- deviceId,
324
- gatewayIds,
325
- subtype: 'managed-process',
326
- });
327
- console.log(chalk_1.default.blue(`\nCreating managed process application: ${appName}`));
328
- console.log(chalk_1.default.gray(`Command: ${command}`));
329
- console.log(chalk_1.default.gray(`Port: ${port}`));
330
- console.log(chalk_1.default.gray(`Protocol: ${protocol.toUpperCase()}`));
331
- if (workingDirectory) {
332
- console.log(chalk_1.default.gray(`Working directory: ${workingDirectory}`));
333
- }
334
- if (Object.keys(env).length > 0) {
335
- console.log(chalk_1.default.gray(`Environment variables: ${Object.keys(env).length} variable(s)`));
336
- }
337
- if (logFile) {
338
- console.log(chalk_1.default.gray(`Log file: ${logFile}`));
339
- }
340
- console.log(chalk_1.default.gray(`Serving device: ${deviceId}`));
341
- if (useManagedGateway) {
342
- console.log(chalk_1.default.gray(`Using Edgible managed gateway`));
343
- }
344
- else {
345
- console.log(chalk_1.default.gray(`Gateways: ${gatewayIds.join(', ')}`));
346
- }
347
- if (hostnames.length > 0) {
348
- console.log(chalk_1.default.gray(`Additional hostnames: ${hostnames.join(', ')}`));
349
- }
350
- const result = await instances_1.applicationService.createApplicationProgrammatically({
351
- name: appName,
352
- description,
353
- port,
354
- protocol,
355
- hostnames,
356
- deviceIds: [deviceId],
357
- gatewayIds: useManagedGateway ? undefined : gatewayIds,
358
- useManagedGateway,
359
- subtype: 'managed-process',
360
- configuration,
361
- });
362
- console.log(chalk_1.default.green('\nāœ“ Managed process application created successfully!'));
363
- console.log(chalk_1.default.blue('\nšŸ“‹ Application Details:'));
364
- if (result && typeof result === 'object' && 'name' in result) {
365
- const app = result;
366
- console.log(chalk_1.default.white(` Name: ${app.name}`));
367
- console.log(chalk_1.default.white(` ID: ${app.id}`));
368
- if (app.url)
369
- console.log(chalk_1.default.white(` URL: ${chalk_1.default.cyan.bold(app.url)}`));
370
- console.log(chalk_1.default.white(` Status: ${app.status}`));
371
- }
372
- console.log(chalk_1.default.yellow('\n⚠ Note: The agent will start the process when it receives the configuration.'));
373
- }, {
374
- requireAuth: true,
375
- requireOrganization: true,
376
- }));
377
- // Stub subcommands for unimplemented workload types
378
- const createDockerCommand = new commander_1.Command('docker')
379
- .description('Create application from Docker container (not implemented)');
380
- }
381
- //# sourceMappingURL=create-compose.js.map
@@ -1,3 +0,0 @@
1
- import { Command } from 'commander';
2
- export declare function createInteractiveCommand(): Command;
3
- //# sourceMappingURL=create-interactive.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-interactive.d.ts","sourceRoot":"","sources":["../../../src/commands/application/create-interactive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYpC,wBAAgB,wBAAwB,IAAI,OAAO,CAqVlD"}