@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
@@ -0,0 +1,69 @@
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.handleDeviceDelete = handleDeviceDelete;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const instances_1 = require("../../services/instances");
10
+ const config_validator_1 = require("../utils/config-validator");
11
+ const device_prompt_1 = require("../utils/device-prompt");
12
+ async function handleDeviceDelete(options) {
13
+ (0, config_validator_1.validateConfig)(instances_1.configManager, {
14
+ requireAuth: true,
15
+ requireOrganization: true,
16
+ });
17
+ const isInteractive = options.nonInteractive !== true;
18
+ let deviceId = null;
19
+ // If name is provided, resolve it to a device ID
20
+ if (options.name && !options.id) {
21
+ const { devices } = await instances_1.deviceService.listDevices();
22
+ const device = devices.find((d) => d.name === options.name);
23
+ if (!device) {
24
+ throw new Error(`Device with name "${options.name}" not found. Use "edgible device list" to see available devices.`);
25
+ }
26
+ deviceId = device.id;
27
+ instances_1.logger.debug('Resolved device name to ID', { name: options.name, deviceId });
28
+ }
29
+ else {
30
+ // Use ID if provided, or prompt if interactive
31
+ deviceId =
32
+ isInteractive
33
+ ? await (0, device_prompt_1.getDeviceId)(instances_1.deviceService, options.id, {
34
+ message: 'Select device to delete:',
35
+ required: true,
36
+ })
37
+ : options.id ?? null;
38
+ }
39
+ if (!deviceId) {
40
+ throw new Error('--id or --name is required in non-interactive mode. Usage: edgible device delete --id <device-id> or --name <device-name>');
41
+ }
42
+ instances_1.logger.debug('Deleting device', { deviceId });
43
+ const currentDeviceId = instances_1.configManager.getConfig().deviceId;
44
+ if (currentDeviceId === deviceId) {
45
+ console.log(chalk_1.default.yellow('⚠ You are deleting the device you are currently logged in as.'));
46
+ console.log(chalk_1.default.gray('Local device credentials will be cleared after deletion.'));
47
+ }
48
+ if (!options.force) {
49
+ const { devices } = await instances_1.deviceService.listDevices();
50
+ const device = devices.find((d) => d.id === deviceId);
51
+ const displayName = device ? `${device.name} (${deviceId})` : deviceId;
52
+ const { confirm } = await inquirer_1.default.prompt([
53
+ {
54
+ type: 'confirm',
55
+ name: 'confirm',
56
+ message: `Are you sure you want to delete device "${displayName}"?`,
57
+ default: false,
58
+ },
59
+ ]);
60
+ if (!confirm) {
61
+ instances_1.logger.info('Device deletion cancelled');
62
+ console.log(chalk_1.default.gray('Deletion cancelled'));
63
+ return;
64
+ }
65
+ }
66
+ await instances_1.deviceService.deleteDevice(deviceId);
67
+ console.log(chalk_1.default.green('✓ Device deleted successfully'));
68
+ }
69
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1,7 @@
1
+ export declare function handleDeviceHealth(options: {
2
+ deviceId?: string;
3
+ name?: string;
4
+ json?: boolean;
5
+ nonInteractive?: boolean;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../src/commands/device/health.ts"],"names":[],"mappings":"AAwCA,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAwChB"}
@@ -0,0 +1,78 @@
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.handleDeviceHealth = handleDeviceHealth;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const instances_1 = require("../../services/instances");
9
+ const config_validator_1 = require("../utils/config-validator");
10
+ const device_prompt_1 = require("../utils/device-prompt");
11
+ function formatUptime(ms) {
12
+ if (ms < 0 || !Number.isFinite(ms))
13
+ return '—';
14
+ const sec = Math.floor(ms / 1000);
15
+ if (sec < 60)
16
+ return `${sec}s`;
17
+ const min = Math.floor(sec / 60);
18
+ if (min < 60)
19
+ return `${min}m`;
20
+ const hr = Math.floor(min / 60);
21
+ if (hr < 24)
22
+ return `${hr}h ${min % 60}m`;
23
+ const d = Math.floor(hr / 24);
24
+ return `${d}d ${hr % 24}h`;
25
+ }
26
+ function formatPercent(value) {
27
+ if (typeof value !== 'number' || !Number.isFinite(value))
28
+ return '—';
29
+ return `${Math.round(value)}%`;
30
+ }
31
+ function prettyPrintHealth(deviceName, deviceId, health) {
32
+ const cpu = formatPercent(health.cpuUsage);
33
+ const mem = formatPercent(health.memoryUsage);
34
+ const disk = formatPercent(health.diskUsage);
35
+ const uptime = formatUptime(health.uptime);
36
+ const ts = health.timestamp ? new Date(health.timestamp).toLocaleString() : '—';
37
+ console.log(chalk_1.default.bold(`Device: ${deviceName} (${deviceId})`));
38
+ console.log(chalk_1.default.gray('—'));
39
+ console.log(chalk_1.default.white(` CPU: ${cpu}`));
40
+ console.log(chalk_1.default.white(` Memory: ${mem}`));
41
+ console.log(chalk_1.default.white(` Disk: ${disk}`));
42
+ console.log(chalk_1.default.white(` Uptime: ${uptime}`));
43
+ console.log(chalk_1.default.gray(` At: ${ts}`));
44
+ console.log(chalk_1.default.green('✓ Health check OK'));
45
+ }
46
+ async function handleDeviceHealth(options) {
47
+ (0, config_validator_1.validateConfig)(instances_1.configManager, {
48
+ requireAuth: true,
49
+ requireOrganization: true,
50
+ });
51
+ const isInteractive = options.nonInteractive !== true;
52
+ let deviceId = await instances_1.deviceService.resolveDeviceId({
53
+ deviceId: options.deviceId,
54
+ name: options.name,
55
+ interactive: isInteractive,
56
+ message: 'Select device to check health:',
57
+ });
58
+ if (!deviceId && isInteractive) {
59
+ deviceId = await (0, device_prompt_1.getDeviceId)(instances_1.deviceService, undefined, {
60
+ message: 'Select device to check health:',
61
+ required: true,
62
+ });
63
+ }
64
+ if (!deviceId) {
65
+ throw new Error('Device is required. Use --device-id <id>, --name <name>, or run interactively. Example: edgible device health --name my-laptop');
66
+ }
67
+ const device = await instances_1.deviceService.getDevice(deviceId);
68
+ if (!device) {
69
+ throw new Error(`Device not found: ${deviceId}`);
70
+ }
71
+ const health = await instances_1.deviceService.getDeviceHealth(deviceId);
72
+ if (options.json) {
73
+ console.log(JSON.stringify(health, null, 2));
74
+ return;
75
+ }
76
+ prettyPrintHealth(device.name ?? deviceId, deviceId, health);
77
+ }
78
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1,5 @@
1
+ export declare function handleDeviceList(options: {
2
+ json?: boolean;
3
+ type?: string;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/commands/device/list.ts"],"names":[],"mappings":"AAMA,wBAAsB,gBAAgB,CAAC,OAAO,EAAE;IAC9C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDhB"}
@@ -0,0 +1,46 @@
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.handleDeviceList = handleDeviceList;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const instances_1 = require("../../services/instances");
9
+ const config_validator_1 = require("../utils/config-validator");
10
+ const output_formatter_1 = require("../utils/output-formatter");
11
+ async function handleDeviceList(options) {
12
+ (0, config_validator_1.validateConfig)(instances_1.configManager, {
13
+ requireAuth: true,
14
+ requireOrganization: true,
15
+ });
16
+ instances_1.logger.debug('Listing devices');
17
+ const listOptions = options.type && (options.type === 'serving' || options.type === 'gateway')
18
+ ? { type: options.type }
19
+ : undefined;
20
+ const { devices } = await instances_1.deviceService.listDevices(listOptions);
21
+ if (devices.length === 0) {
22
+ console.log(chalk_1.default.yellow('⚠ No devices in organization'));
23
+ if (options.type) {
24
+ console.log(chalk_1.default.gray(`No devices with type "${options.type}"`));
25
+ }
26
+ return;
27
+ }
28
+ if (options.json) {
29
+ console.log(JSON.stringify({
30
+ devices: devices.map((d) => ({
31
+ id: d.id,
32
+ name: d.name,
33
+ type: d.type,
34
+ status: d.status,
35
+ organizationId: d.organizationId,
36
+ createdAt: d.createdAt,
37
+ updatedAt: d.updatedAt,
38
+ lastSeen: d.lastSeen,
39
+ description: d.description,
40
+ })),
41
+ }, null, 2));
42
+ return;
43
+ }
44
+ console.log((0, output_formatter_1.formatList)(devices, (device, index) => `${index + 1}. ${(0, output_formatter_1.formatDevice)(device)}`, '📱 Devices:', 'No devices in organization'));
45
+ }
46
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1,8 @@
1
+ export declare function handleDeviceTelemetry(options: {
2
+ deviceId?: string;
3
+ url?: string;
4
+ endpoint?: string;
5
+ json?: boolean;
6
+ nonInteractive?: boolean;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=telemetry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../../src/commands/device/telemetry.ts"],"names":[],"mappings":"AAOA,wBAAsB,qBAAqB,CAAC,OAAO,EAAE;IACnD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDhB"}
@@ -0,0 +1,59 @@
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.handleDeviceTelemetry = handleDeviceTelemetry;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const instances_1 = require("../../services/instances");
9
+ const config_validator_1 = require("../utils/config-validator");
10
+ const device_prompt_1 = require("../utils/device-prompt");
11
+ const DEFAULT_ENDPOINT = '/health/device';
12
+ async function handleDeviceTelemetry(options) {
13
+ // When using --url we only need auth (for the token). When using device-id we need org too.
14
+ const useUrl = Boolean(options.url?.trim());
15
+ (0, config_validator_1.validateConfig)(instances_1.configManager, {
16
+ requireAuth: true,
17
+ requireOrganization: !useUrl,
18
+ });
19
+ const isInteractive = options.nonInteractive !== true;
20
+ let telemetryBaseUrl;
21
+ if (useUrl) {
22
+ telemetryBaseUrl = options.url.trim();
23
+ if (!telemetryBaseUrl.startsWith('http://') && !telemetryBaseUrl.startsWith('https://')) {
24
+ telemetryBaseUrl = `https://${telemetryBaseUrl}`;
25
+ }
26
+ }
27
+ else {
28
+ const deviceId = isInteractive
29
+ ? await (0, device_prompt_1.getDeviceId)(instances_1.deviceService, options.deviceId, {
30
+ message: 'Select device to fetch telemetry from:',
31
+ required: true,
32
+ })
33
+ : options.deviceId;
34
+ if (!deviceId) {
35
+ throw new Error('--device-id is required when not using --url. Usage: edgible device telemetry --device-id <id>');
36
+ }
37
+ const device = await instances_1.deviceService.getDevice(deviceId);
38
+ if (!device) {
39
+ throw new Error(`Device not found: ${deviceId}`);
40
+ }
41
+ if (!device.telemetryUrl?.trim()) {
42
+ throw new Error(`No telemetry URL configured for device "${device.name}" (${deviceId}). Telemetry may not be set up for this device.`);
43
+ }
44
+ telemetryBaseUrl = device.telemetryUrl.trim();
45
+ if (!telemetryBaseUrl.startsWith('http://') && !telemetryBaseUrl.startsWith('https://')) {
46
+ telemetryBaseUrl = `https://${telemetryBaseUrl}`;
47
+ }
48
+ instances_1.logger.debug('Using device telemetry URL', { deviceId, telemetryUrl: telemetryBaseUrl });
49
+ }
50
+ const endpoint = options.endpoint?.trim() || DEFAULT_ENDPOINT;
51
+ const { data, status } = await instances_1.deviceService.fetchTelemetry(telemetryBaseUrl, endpoint);
52
+ if (options.json) {
53
+ console.log(JSON.stringify(data, null, 2));
54
+ return;
55
+ }
56
+ console.log(chalk_1.default.green(`✓ Telemetry (${status}) from ${telemetryBaseUrl}${endpoint}`));
57
+ console.log(JSON.stringify(data, null, 2));
58
+ }
59
+ //# sourceMappingURL=telemetry.js.map
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Device command group
4
+ */
5
+ export declare function setupDeviceCommands(program: Command): void;
6
+ //# sourceMappingURL=device.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/commands/device.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsG1D"}
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupDeviceCommands = setupDeviceCommands;
4
+ const command_wrapper_1 = require("./base/command-wrapper");
5
+ const list_1 = require("./device/list");
6
+ const delete_1 = require("./device/delete");
7
+ const telemetry_1 = require("./device/telemetry");
8
+ const health_1 = require("./device/health");
9
+ const application_health_1 = require("./device/application-health");
10
+ /**
11
+ * Device command group
12
+ */
13
+ function setupDeviceCommands(program) {
14
+ const deviceCommand = program
15
+ .command('device')
16
+ .description('List and manage devices in your organization')
17
+ .alias('dev');
18
+ deviceCommand
19
+ .command('list')
20
+ .description('List all devices in the organization')
21
+ .option('--json', 'Output as JSON')
22
+ .option('--type <type>', 'Filter by type: serving or gateway')
23
+ .alias('ls')
24
+ .action((0, command_wrapper_1.wrapCommand)(async (options) => {
25
+ await (0, list_1.handleDeviceList)(options);
26
+ }, {
27
+ requireAuth: true,
28
+ requireOrganization: true,
29
+ }));
30
+ deviceCommand
31
+ .command('delete')
32
+ .description('Delete a device')
33
+ .option('-i, --id <id>', 'Device ID to delete')
34
+ .option('-n, --name <name>', 'Device name to delete')
35
+ .option('-f, --force', 'Skip confirmation prompt')
36
+ .option('--non-interactive', 'Require --id or --name; do not prompt for device')
37
+ .alias('rm')
38
+ .action((0, command_wrapper_1.wrapCommand)(async (options) => {
39
+ await (0, delete_1.handleDeviceDelete)(options);
40
+ }, {
41
+ requireAuth: true,
42
+ requireOrganization: true,
43
+ }));
44
+ deviceCommand
45
+ .command('health')
46
+ .description('Check device health (CPU, memory, disk, uptime) via telemetry')
47
+ .option('-i, --device-id <id>', 'Device ID')
48
+ .option('-n, --name <name>', 'Device name (resolved to ID in your organization)')
49
+ .option('--json', 'Output raw JSON only')
50
+ .option('--non-interactive', 'Require --device-id or --name; do not prompt for device')
51
+ .action((0, command_wrapper_1.wrapCommand)(async (options) => {
52
+ await (0, health_1.handleDeviceHealth)(options);
53
+ }, {
54
+ requireAuth: true,
55
+ requireOrganization: true,
56
+ }));
57
+ deviceCommand
58
+ .command('application-health')
59
+ .description('Check application health (workload status, deployment) for applications running on a device')
60
+ .option('-i, --device-id <id>', 'Device ID')
61
+ .option('-n, --name <name>', 'Device name (resolved to ID in your organization)')
62
+ .option('--json', 'Output raw JSON only')
63
+ .option('--non-interactive', 'Require --device-id or --name; do not prompt for device')
64
+ .alias('app-health')
65
+ .action((0, command_wrapper_1.wrapCommand)(async (options) => {
66
+ await (0, application_health_1.handleDeviceApplicationHealth)(options);
67
+ }, {
68
+ requireAuth: true,
69
+ requireOrganization: true,
70
+ }));
71
+ deviceCommand
72
+ .command('telemetry')
73
+ .description('Get device data from the device telemetry/health endpoint')
74
+ .option('-i, --device-id <id>', 'Device ID (prompt if omitted and not using --url)')
75
+ .option('--url <url>', 'Telemetry base URL (e.g. https://mydevice-telemetry.example.com). Skips device lookup.')
76
+ .option('--endpoint <path>', 'Endpoint path (default: /health/device). Use /health/applications or /health/pools for other data.')
77
+ .option('--json', 'Output raw JSON only (no status line)')
78
+ .option('--non-interactive', 'Require --device-id when not using --url')
79
+ .action((0, command_wrapper_1.wrapCommand)(async (options) => {
80
+ await (0, telemetry_1.handleDeviceTelemetry)(options);
81
+ }, {
82
+ requireAuth: true,
83
+ requireOrganization: false,
84
+ }));
85
+ }
86
+ //# sourceMappingURL=device.js.map
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Stack deploy command handler
3
+ */
4
+ import { DeployOptions } from '../../types/stack';
5
+ export declare function handleStackDeploy(options: Omit<DeployOptions, 'file'> & {
6
+ file?: string;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../../src/commands/stack/deploy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGlD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwD/G"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /**
3
+ * Stack deploy command handler
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.handleStackDeploy = handleStackDeploy;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const instances_1 = require("../../services/instances");
12
+ const stack_file_1 = require("../../utils/stack-file");
13
+ async function handleStackDeploy(options) {
14
+ const { stackService, logger } = (0, instances_1.getServiceInstances)();
15
+ try {
16
+ const file = (0, stack_file_1.findStackFile)(options.file);
17
+ const deployOptions = { ...options, file };
18
+ logger.info(`Deploying stack from: ${file}`);
19
+ if (options.dryRun) {
20
+ console.log(chalk_1.default.cyan('Running in dry-run mode (no changes will be made)\n'));
21
+ }
22
+ const result = await stackService.deployStack(deployOptions);
23
+ // Display results
24
+ console.log('\n' + chalk_1.default.bold('Deployment Results:'));
25
+ console.log(chalk_1.default.gray('─'.repeat(50)));
26
+ if (result.deployed.length > 0) {
27
+ console.log(chalk_1.default.green('\n✓ Successfully deployed:'));
28
+ for (const app of result.deployed) {
29
+ console.log(chalk_1.default.green(` - ${app.name}`));
30
+ if (app.urls && app.urls.length > 0) {
31
+ for (const url of app.urls) {
32
+ console.log(chalk_1.default.gray(` ${url}`));
33
+ }
34
+ }
35
+ }
36
+ }
37
+ if (result.failed.length > 0) {
38
+ console.log(chalk_1.default.red('\n✗ Failed to deploy:'));
39
+ for (const app of result.failed) {
40
+ console.log(chalk_1.default.red(` - ${app.name}: ${app.error}`));
41
+ }
42
+ }
43
+ if (result.skipped.length > 0) {
44
+ console.log(chalk_1.default.yellow('\n⊘ Skipped:'));
45
+ for (const appName of result.skipped) {
46
+ console.log(chalk_1.default.yellow(` - ${appName}`));
47
+ }
48
+ }
49
+ console.log(chalk_1.default.gray('\n' + '─'.repeat(50)));
50
+ console.log(chalk_1.default.bold(`Total: ${result.deployed.length} deployed, ${result.failed.length} failed, ${result.skipped.length} skipped`));
51
+ if (!result.success) {
52
+ process.exit(1);
53
+ }
54
+ }
55
+ catch (error) {
56
+ logger.error(`Deployment error: ${error instanceof Error ? error.message : 'Unknown error'}`);
57
+ console.log(chalk_1.default.red(`\n✗ Deployment failed: ${error instanceof Error ? error.message : 'Unknown error'}`));
58
+ process.exit(1);
59
+ }
60
+ }
61
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Stack diff command handler
3
+ */
4
+ export declare function handleStackDiff(options: {
5
+ file?: string;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/commands/stack/diff.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6D/E"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ /**
3
+ * Stack diff command handler
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.handleStackDiff = handleStackDiff;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const instances_1 = require("../../services/instances");
12
+ const stack_file_1 = require("../../utils/stack-file");
13
+ async function handleStackDiff(options) {
14
+ const { stackService, logger } = (0, instances_1.getServiceInstances)();
15
+ try {
16
+ const file = (0, stack_file_1.findStackFile)(options.file);
17
+ logger.info(`Computing diff for stack: ${file}`);
18
+ const diff = await stackService.diffStack(file);
19
+ console.log(chalk_1.default.bold('\nStack Differences:'));
20
+ console.log(chalk_1.default.gray('─'.repeat(50)));
21
+ let hasChanges = false;
22
+ if (diff.toCreate.length > 0) {
23
+ hasChanges = true;
24
+ console.log(chalk_1.default.green('\n+ Applications to create:'));
25
+ for (const app of diff.toCreate) {
26
+ console.log(chalk_1.default.green(` + ${app.name} (${app.subtype})`));
27
+ }
28
+ }
29
+ if (diff.toUpdate.length > 0) {
30
+ hasChanges = true;
31
+ console.log(chalk_1.default.yellow('\n~ Applications to update:'));
32
+ for (const app of diff.toUpdate) {
33
+ console.log(chalk_1.default.yellow(` ~ ${app.name}`));
34
+ for (const change of app.changes) {
35
+ console.log(chalk_1.default.gray(` ${change.field}: ${change.oldValue} → ${change.newValue}`));
36
+ }
37
+ }
38
+ }
39
+ if (diff.toDelete.length > 0) {
40
+ hasChanges = true;
41
+ console.log(chalk_1.default.red('\n- Applications to delete:'));
42
+ for (const app of diff.toDelete) {
43
+ console.log(chalk_1.default.red(` - ${app.name}`));
44
+ }
45
+ }
46
+ if (diff.unchanged.length > 0) {
47
+ console.log(chalk_1.default.gray('\n= Unchanged applications:'));
48
+ for (const appName of diff.unchanged) {
49
+ console.log(chalk_1.default.gray(` = ${appName}`));
50
+ }
51
+ }
52
+ console.log(chalk_1.default.gray('\n' + '─'.repeat(50)));
53
+ if (!hasChanges) {
54
+ console.log(chalk_1.default.green('No changes detected. Stack is up to date.'));
55
+ }
56
+ else {
57
+ console.log(chalk_1.default.bold(`Summary: ${diff.toCreate.length} to create, ${diff.toUpdate.length} to update, ${diff.toDelete.length} to delete`));
58
+ }
59
+ }
60
+ catch (error) {
61
+ logger.error(`Diff error: ${error instanceof Error ? error.message : 'Unknown error'}`);
62
+ console.log(chalk_1.default.red(`\n✗ Failed to compute diff: ${error instanceof Error ? error.message : 'Unknown error'}`));
63
+ process.exit(1);
64
+ }
65
+ }
66
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Stack status command handler
3
+ */
4
+ export declare function handleStackStatus(options: {
5
+ file?: string;
6
+ json?: boolean;
7
+ app?: string;
8
+ }): Promise<void>;
9
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/stack/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmD/G"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ /**
3
+ * Stack status command handler
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.handleStackStatus = handleStackStatus;
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const instances_1 = require("../../services/instances");
12
+ const stack_file_1 = require("../../utils/stack-file");
13
+ async function handleStackStatus(options) {
14
+ const { stackService, logger } = (0, instances_1.getServiceInstances)();
15
+ try {
16
+ const file = (0, stack_file_1.findStackFile)(options.file);
17
+ logger.info(`Getting stack status from: ${file}`);
18
+ const status = await stackService.getStackStatus(file);
19
+ // Filter to single app if specified
20
+ const applications = options.app
21
+ ? status.applications.filter(app => app.name === options.app)
22
+ : status.applications;
23
+ if (options.json) {
24
+ console.log(JSON.stringify({ ...status, applications }, null, 2));
25
+ return;
26
+ }
27
+ // Display status
28
+ console.log(chalk_1.default.bold(`\nStack: ${status.stackName}`));
29
+ console.log(chalk_1.default.gray('─'.repeat(50)));
30
+ for (const app of applications) {
31
+ const statusIcon = app.status === 'deployed' ? chalk_1.default.green('✓') : chalk_1.default.gray('○');
32
+ const statusText = app.status === 'deployed' ? chalk_1.default.green('deployed') : chalk_1.default.gray('not deployed');
33
+ console.log(`\n${statusIcon} ${chalk_1.default.bold(app.name)} - ${statusText}`);
34
+ console.log(chalk_1.default.gray(` Device: ${app.deviceName}`));
35
+ if (app.published) {
36
+ console.log(chalk_1.default.gray(` Published: yes`));
37
+ }
38
+ if (app.urls && app.urls.length > 0) {
39
+ console.log(chalk_1.default.gray(` URLs:`));
40
+ for (const url of app.urls) {
41
+ console.log(chalk_1.default.cyan(` - ${url}`));
42
+ }
43
+ }
44
+ }
45
+ console.log(chalk_1.default.gray('\n' + '─'.repeat(50)));
46
+ const deployedCount = applications.filter(a => a.status === 'deployed').length;
47
+ console.log(chalk_1.default.bold(`Total: ${deployedCount}/${applications.length} deployed`));
48
+ }
49
+ catch (error) {
50
+ logger.error(`Status error: ${error instanceof Error ? error.message : 'Unknown error'}`);
51
+ console.log(chalk_1.default.red(`\n✗ Failed to get status: ${error instanceof Error ? error.message : 'Unknown error'}`));
52
+ process.exit(1);
53
+ }
54
+ }
55
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Stack teardown command handler
3
+ */
4
+ import { TeardownOptions } from '../../types/stack';
5
+ export declare function handleStackTeardown(options: Omit<TeardownOptions, 'file'> & {
6
+ file?: string;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=teardown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"teardown.d.ts","sourceRoot":"","sources":["../../../src/commands/stack/teardown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAiBpD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DnH"}