@edgible-team/cli 1.2.15 → 1.2.19

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 (212) hide show
  1. package/README.md +5 -3
  2. package/dist/client/api-client.d.ts +26 -1
  3. package/dist/client/api-client.d.ts.map +1 -1
  4. package/dist/client/api-client.js +31 -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/create-stubs.d.ts +0 -1
  28. package/dist/commands/application/create-stubs.d.ts.map +1 -1
  29. package/dist/commands/application/create-stubs.js +0 -4
  30. package/dist/commands/application/create-vm.d.ts +19 -0
  31. package/dist/commands/application/create-vm.d.ts.map +1 -0
  32. package/dist/commands/application/create-vm.js +390 -0
  33. package/dist/commands/application/delete.d.ts +2 -1
  34. package/dist/commands/application/delete.d.ts.map +1 -1
  35. package/dist/commands/application/delete.js +19 -5
  36. package/dist/commands/application/get.d.ts.map +1 -1
  37. package/dist/commands/application/get.js +29 -1
  38. package/dist/commands/application/ssh.d.ts +7 -0
  39. package/dist/commands/application/ssh.d.ts.map +1 -0
  40. package/dist/commands/application/ssh.js +146 -0
  41. package/dist/commands/application/update.d.ts +3 -0
  42. package/dist/commands/application/update.d.ts.map +1 -1
  43. package/dist/commands/application/update.js +45 -1
  44. package/dist/commands/application.d.ts.map +1 -1
  45. package/dist/commands/application.js +81 -26
  46. package/dist/commands/auth.d.ts.map +1 -1
  47. package/dist/commands/auth.js +44 -0
  48. package/dist/commands/debug.js +1 -1
  49. package/dist/commands/device/application-health.d.ts +7 -0
  50. package/dist/commands/device/application-health.d.ts.map +1 -0
  51. package/dist/commands/device/application-health.js +103 -0
  52. package/dist/commands/device/delete.d.ts +7 -0
  53. package/dist/commands/device/delete.d.ts.map +1 -0
  54. package/dist/commands/device/delete.js +69 -0
  55. package/dist/commands/device/health.d.ts +7 -0
  56. package/dist/commands/device/health.d.ts.map +1 -0
  57. package/dist/commands/device/health.js +78 -0
  58. package/dist/commands/device/list.d.ts +5 -0
  59. package/dist/commands/device/list.d.ts.map +1 -0
  60. package/dist/commands/device/list.js +46 -0
  61. package/dist/commands/device/telemetry.d.ts +8 -0
  62. package/dist/commands/device/telemetry.d.ts.map +1 -0
  63. package/dist/commands/device/telemetry.js +59 -0
  64. package/dist/commands/device.d.ts +6 -0
  65. package/dist/commands/device.d.ts.map +1 -0
  66. package/dist/commands/device.js +86 -0
  67. package/dist/commands/stack/deploy.d.ts +3 -1
  68. package/dist/commands/stack/deploy.d.ts.map +1 -1
  69. package/dist/commands/stack/deploy.js +5 -2
  70. package/dist/commands/stack/diff.d.ts +1 -1
  71. package/dist/commands/stack/diff.d.ts.map +1 -1
  72. package/dist/commands/stack/diff.js +4 -2
  73. package/dist/commands/stack/status.d.ts +1 -1
  74. package/dist/commands/stack/status.d.ts.map +1 -1
  75. package/dist/commands/stack/status.js +4 -2
  76. package/dist/commands/stack/teardown.d.ts +3 -1
  77. package/dist/commands/stack/teardown.d.ts.map +1 -1
  78. package/dist/commands/stack/teardown.js +5 -2
  79. package/dist/commands/stack/validate.d.ts +1 -1
  80. package/dist/commands/stack/validate.d.ts.map +1 -1
  81. package/dist/commands/stack/validate.js +4 -2
  82. package/dist/commands/stack.d.ts.map +1 -1
  83. package/dist/commands/stack.js +10 -5
  84. package/dist/commands/utils/auth-prompt.d.ts +25 -0
  85. package/dist/commands/utils/auth-prompt.d.ts.map +1 -0
  86. package/dist/commands/utils/auth-prompt.js +115 -0
  87. package/dist/commands/utils/device-prompt.d.ts +18 -0
  88. package/dist/commands/utils/device-prompt.d.ts.map +1 -0
  89. package/dist/commands/utils/device-prompt.js +58 -0
  90. package/dist/commands/utils/output-formatter.d.ts +13 -0
  91. package/dist/commands/utils/output-formatter.d.ts.map +1 -1
  92. package/dist/commands/utils/output-formatter.js +21 -0
  93. package/dist/index.js +2 -0
  94. package/dist/services/LocalAgentManager.d.ts +2 -1
  95. package/dist/services/LocalAgentManager.d.ts.map +1 -1
  96. package/dist/services/LocalAgentManager.js +6 -4
  97. package/dist/services/application/ApplicationService.d.ts +41 -2
  98. package/dist/services/application/ApplicationService.d.ts.map +1 -1
  99. package/dist/services/application/ApplicationService.js +49 -1
  100. package/dist/services/device/DeviceService.d.ts +62 -0
  101. package/dist/services/device/DeviceService.d.ts.map +1 -0
  102. package/dist/services/device/DeviceService.js +235 -0
  103. package/dist/services/edgible.d.ts +3 -1
  104. package/dist/services/edgible.d.ts.map +1 -1
  105. package/dist/services/edgible.js +5 -4
  106. package/dist/services/instances.d.ts +4 -1
  107. package/dist/services/instances.d.ts.map +1 -1
  108. package/dist/services/instances.js +8 -4
  109. package/dist/types/AgentConfig.d.ts +26 -0
  110. package/dist/types/AgentConfig.d.ts.map +1 -1
  111. package/dist/types/ApiRequests.d.ts +5 -1
  112. package/dist/types/ApiRequests.d.ts.map +1 -1
  113. package/dist/types/ApiResponses.d.ts +9 -0
  114. package/dist/types/ApiResponses.d.ts.map +1 -1
  115. package/dist/types/JobTypes.d.ts +103 -0
  116. package/dist/types/JobTypes.d.ts.map +1 -0
  117. package/dist/types/JobTypes.js +80 -0
  118. package/dist/types/WebSocketMessages.d.ts +89 -0
  119. package/dist/types/WebSocketMessages.d.ts.map +1 -0
  120. package/dist/types/WebSocketMessages.js +5 -0
  121. package/dist/types/Workload.d.ts +1 -1
  122. package/dist/types/Workload.d.ts.map +1 -1
  123. package/dist/types/backendJobs.d.ts +102 -0
  124. package/dist/types/backendJobs.d.ts.map +1 -0
  125. package/dist/types/backendJobs.js +5 -0
  126. package/dist/types/models/ApplicationData.d.ts +1 -1
  127. package/dist/types/models/ApplicationData.d.ts.map +1 -1
  128. package/dist/types/models/DeviceData.d.ts +4 -0
  129. package/dist/types/models/DeviceData.d.ts.map +1 -1
  130. package/dist/types/stack.d.ts +9 -1
  131. package/dist/types/stack.d.ts.map +1 -1
  132. package/dist/types/validation/schemas.d.ts +5 -5
  133. package/dist/types/validation/schemas.js +1 -1
  134. package/dist/utils/stack-file.d.ts +11 -0
  135. package/dist/utils/stack-file.d.ts.map +1 -0
  136. package/dist/utils/stack-file.js +66 -0
  137. package/dist/validation/stack-schemas.d.ts +319 -27
  138. package/dist/validation/stack-schemas.d.ts.map +1 -1
  139. package/dist/validation/stack-schemas.js +20 -5
  140. package/package.json +1 -1
  141. package/dist/commands/agent/agent-handlers.d.ts +0 -45
  142. package/dist/commands/agent/agent-handlers.d.ts.map +0 -1
  143. package/dist/commands/agent/agent-handlers.js +0 -1159
  144. package/dist/commands/application/api-keys.d.ts +0 -3
  145. package/dist/commands/application/api-keys.d.ts.map +0 -1
  146. package/dist/commands/application/api-keys.js +0 -227
  147. package/dist/commands/application/create-compose.d.ts +0 -3
  148. package/dist/commands/application/create-compose.d.ts.map +0 -1
  149. package/dist/commands/application/create-compose.js +0 -381
  150. package/dist/commands/application/create-interactive.d.ts +0 -3
  151. package/dist/commands/application/create-interactive.d.ts.map +0 -1
  152. package/dist/commands/application/create-interactive.js +0 -326
  153. package/dist/commands/application/create-workload.d.ts +0 -5
  154. package/dist/commands/application/create-workload.d.ts.map +0 -1
  155. package/dist/commands/application/create-workload.js +0 -48
  156. package/dist/commands/application/short-codes.d.ts +0 -3
  157. package/dist/commands/application/short-codes.d.ts.map +0 -1
  158. package/dist/commands/application/short-codes.js +0 -226
  159. package/dist/commands/application/toggle.d.ts +0 -2
  160. package/dist/commands/application/toggle.d.ts.map +0 -1
  161. package/dist/commands/application/toggle.js +0 -78
  162. package/dist/commands/examples/migrated-command-example.d.ts +0 -31
  163. package/dist/commands/examples/migrated-command-example.d.ts.map +0 -1
  164. package/dist/commands/examples/migrated-command-example.js +0 -180
  165. package/dist/commands/managedGateway/create.d.ts +0 -6
  166. package/dist/commands/managedGateway/create.d.ts.map +0 -1
  167. package/dist/commands/managedGateway/create.js +0 -50
  168. package/dist/commands/managedGateway/delete.d.ts +0 -5
  169. package/dist/commands/managedGateway/delete.d.ts.map +0 -1
  170. package/dist/commands/managedGateway/delete.js +0 -57
  171. package/dist/commands/managedGateway/get.d.ts +0 -4
  172. package/dist/commands/managedGateway/get.d.ts.map +0 -1
  173. package/dist/commands/managedGateway/get.js +0 -71
  174. package/dist/commands/managedGateway/haproxy-stats.d.ts +0 -6
  175. package/dist/commands/managedGateway/haproxy-stats.d.ts.map +0 -1
  176. package/dist/commands/managedGateway/haproxy-stats.js +0 -131
  177. package/dist/commands/managedGateway/list.d.ts +0 -4
  178. package/dist/commands/managedGateway/list.d.ts.map +0 -1
  179. package/dist/commands/managedGateway/list.js +0 -50
  180. package/dist/commands/managedGateway/logs.d.ts +0 -10
  181. package/dist/commands/managedGateway/logs.d.ts.map +0 -1
  182. package/dist/commands/managedGateway/logs.js +0 -100
  183. package/dist/commands/managedGateway/reboot.d.ts +0 -5
  184. package/dist/commands/managedGateway/reboot.d.ts.map +0 -1
  185. package/dist/commands/managedGateway/reboot.js +0 -95
  186. package/dist/commands/managedGateway/resync.d.ts +0 -10
  187. package/dist/commands/managedGateway/resync.d.ts.map +0 -1
  188. package/dist/commands/managedGateway/resync.js +0 -69
  189. package/dist/commands/managedGateway/ssh.d.ts +0 -4
  190. package/dist/commands/managedGateway/ssh.d.ts.map +0 -1
  191. package/dist/commands/managedGateway/ssh.js +0 -130
  192. package/dist/commands/managedGateway/wipe-logs.d.ts +0 -4
  193. package/dist/commands/managedGateway/wipe-logs.d.ts.map +0 -1
  194. package/dist/commands/managedGateway/wipe-logs.js +0 -67
  195. package/dist/commands/managedGateway/wireguard.d.ts +0 -4
  196. package/dist/commands/managedGateway/wireguard.d.ts.map +0 -1
  197. package/dist/commands/managedGateway/wireguard.js +0 -68
  198. package/dist/di/bindings.d.ts +0 -15
  199. package/dist/di/bindings.d.ts.map +0 -1
  200. package/dist/di/bindings.js +0 -99
  201. package/dist/di/container.d.ts +0 -44
  202. package/dist/di/container.d.ts.map +0 -1
  203. package/dist/di/container.js +0 -88
  204. package/dist/di/types.d.ts +0 -23
  205. package/dist/di/types.d.ts.map +0 -1
  206. package/dist/di/types.js +0 -32
  207. package/dist/repositories/config-repository.d.ts +0 -46
  208. package/dist/repositories/config-repository.d.ts.map +0 -1
  209. package/dist/repositories/config-repository.js +0 -62
  210. package/dist/repositories/gateway-repository.d.ts +0 -37
  211. package/dist/repositories/gateway-repository.d.ts.map +0 -1
  212. package/dist/repositories/gateway-repository.js +0 -35
@@ -0,0 +1,103 @@
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.handleDeviceApplicationHealth = handleDeviceApplicationHealth;
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 statusColor(status) {
12
+ switch (status) {
13
+ case 'healthy':
14
+ return chalk_1.default.green;
15
+ case 'unhealthy':
16
+ case 'timeout':
17
+ case 'error':
18
+ return chalk_1.default.red;
19
+ case 'pending':
20
+ return chalk_1.default.yellow;
21
+ default:
22
+ return chalk_1.default.white;
23
+ }
24
+ }
25
+ function prettyPrintApplicationHealth(deviceName, deviceId, payload) {
26
+ const apps = payload.applications ?? [];
27
+ console.log(chalk_1.default.bold(`Application health on device: ${deviceName} (${deviceId})`));
28
+ console.log(chalk_1.default.gray('—'));
29
+ if (apps.length === 0) {
30
+ console.log(chalk_1.default.gray(' No applications reported (or only telemetry app on this device).'));
31
+ return;
32
+ }
33
+ for (const app of apps) {
34
+ const health = app.health;
35
+ const statusStr = health?.status ?? 'unknown';
36
+ const color = statusColor(statusStr);
37
+ const name = app.name || app.appId;
38
+ const subtype = app.subtype ? chalk_1.default.gray(` [${app.subtype}]`) : '';
39
+ console.log(chalk_1.default.bold(` ${name}${subtype}`));
40
+ console.log(color(` Health: ${statusStr}`));
41
+ if (health?.responseTime != null) {
42
+ console.log(chalk_1.default.gray(` Response time: ${health.responseTime}ms`));
43
+ }
44
+ if (health?.error) {
45
+ console.log(chalk_1.default.red(` Error: ${health.error}`));
46
+ }
47
+ if (app.workload) {
48
+ const w = app.workload;
49
+ const runStr = w.running ? chalk_1.default.green('running') : chalk_1.default.red('not running');
50
+ const healthyStr = w.healthy ? chalk_1.default.green('healthy') : chalk_1.default.red('unhealthy');
51
+ console.log(chalk_1.default.gray(` Workload: ${runStr}, ${healthyStr}`));
52
+ if (w.port != null)
53
+ console.log(chalk_1.default.gray(` Port: ${w.port}`));
54
+ if (w.error)
55
+ console.log(chalk_1.default.red(` Workload error: ${w.error}`));
56
+ }
57
+ if (app.deploymentState) {
58
+ console.log(chalk_1.default.gray(` Deployment: ${app.deploymentState}`));
59
+ }
60
+ if (app.url) {
61
+ console.log(chalk_1.default.gray(` URL: ${app.url}`));
62
+ }
63
+ console.log();
64
+ }
65
+ const healthyCount = apps.filter((a) => a.health?.status === 'healthy').length;
66
+ const total = apps.length;
67
+ if (total > 0) {
68
+ console.log(chalk_1.default.gray(`— ${healthyCount}/${total} applications healthy`));
69
+ }
70
+ }
71
+ async function handleDeviceApplicationHealth(options) {
72
+ (0, config_validator_1.validateConfig)(instances_1.configManager, {
73
+ requireAuth: true,
74
+ requireOrganization: true,
75
+ });
76
+ const isInteractive = options.nonInteractive !== true;
77
+ let deviceId = await instances_1.deviceService.resolveDeviceId({
78
+ deviceId: options.deviceId,
79
+ name: options.name,
80
+ interactive: isInteractive,
81
+ message: 'Select device to check application health:',
82
+ });
83
+ if (!deviceId && isInteractive) {
84
+ deviceId = await (0, device_prompt_1.getDeviceId)(instances_1.deviceService, undefined, {
85
+ message: 'Select device to check application health:',
86
+ required: true,
87
+ });
88
+ }
89
+ if (!deviceId) {
90
+ throw new Error('Device is required. Use --device-id <id>, --name <name>, or run interactively. Example: edgible device application-health --name my-laptop');
91
+ }
92
+ const device = await instances_1.deviceService.getDevice(deviceId);
93
+ if (!device) {
94
+ throw new Error(`Device not found: ${deviceId}`);
95
+ }
96
+ const payload = await instances_1.deviceService.getDeviceApplicationHealth(deviceId);
97
+ if (options.json) {
98
+ console.log(JSON.stringify(payload, null, 2));
99
+ return;
100
+ }
101
+ prettyPrintApplicationHealth(device.name ?? deviceId, deviceId, payload);
102
+ }
103
+ //# sourceMappingURL=application-health.js.map
@@ -0,0 +1,7 @@
1
+ export declare function handleDeviceDelete(options: {
2
+ id?: string;
3
+ name?: string;
4
+ force?: boolean;
5
+ nonInteractive?: boolean;
6
+ }): Promise<void>;
7
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../src/commands/device/delete.ts"],"names":[],"mappings":"AAMA,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAChD,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAuEhB"}
@@ -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
@@ -2,5 +2,7 @@
2
2
  * Stack deploy command handler
3
3
  */
4
4
  import { DeployOptions } from '../../types/stack';
5
- export declare function handleStackDeploy(options: DeployOptions): Promise<void>;
5
+ export declare function handleStackDeploy(options: Omit<DeployOptions, 'file'> & {
6
+ file?: string;
7
+ }): Promise<void>;
6
8
  //# sourceMappingURL=deploy.d.ts.map
@@ -1 +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;AAElD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAqD7E"}
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"}
@@ -9,14 +9,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.handleStackDeploy = handleStackDeploy;
10
10
  const chalk_1 = __importDefault(require("chalk"));
11
11
  const instances_1 = require("../../services/instances");
12
+ const stack_file_1 = require("../../utils/stack-file");
12
13
  async function handleStackDeploy(options) {
13
14
  const { stackService, logger } = (0, instances_1.getServiceInstances)();
14
15
  try {
15
- logger.info(`Deploying stack from: ${options.file}`);
16
+ const file = (0, stack_file_1.findStackFile)(options.file);
17
+ const deployOptions = { ...options, file };
18
+ logger.info(`Deploying stack from: ${file}`);
16
19
  if (options.dryRun) {
17
20
  console.log(chalk_1.default.cyan('Running in dry-run mode (no changes will be made)\n'));
18
21
  }
19
- const result = await stackService.deployStack(options);
22
+ const result = await stackService.deployStack(deployOptions);
20
23
  // Display results
21
24
  console.log('\n' + chalk_1.default.bold('Deployment Results:'));
22
25
  console.log(chalk_1.default.gray('─'.repeat(50)));
@@ -2,6 +2,6 @@
2
2
  * Stack diff command handler
3
3
  */
4
4
  export declare function handleStackDiff(options: {
5
- file: string;
5
+ file?: string;
6
6
  }): Promise<void>;
7
7
  //# sourceMappingURL=diff.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../../src/commands/stack/diff.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,wBAAsB,eAAe,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2D9E"}
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"}
@@ -9,11 +9,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.handleStackDiff = handleStackDiff;
10
10
  const chalk_1 = __importDefault(require("chalk"));
11
11
  const instances_1 = require("../../services/instances");
12
+ const stack_file_1 = require("../../utils/stack-file");
12
13
  async function handleStackDiff(options) {
13
14
  const { stackService, logger } = (0, instances_1.getServiceInstances)();
14
15
  try {
15
- logger.info(`Computing diff for stack: ${options.file}`);
16
- const diff = await stackService.diffStack(options.file);
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);
17
19
  console.log(chalk_1.default.bold('\nStack Differences:'));
18
20
  console.log(chalk_1.default.gray('─'.repeat(50)));
19
21
  let hasChanges = false;
@@ -2,7 +2,7 @@
2
2
  * Stack status command handler
3
3
  */
4
4
  export declare function handleStackStatus(options: {
5
- file: string;
5
+ file?: string;
6
6
  json?: boolean;
7
7
  app?: string;
8
8
  }): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/stack/status.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiD9G"}
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"}
@@ -9,11 +9,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.handleStackStatus = handleStackStatus;
10
10
  const chalk_1 = __importDefault(require("chalk"));
11
11
  const instances_1 = require("../../services/instances");
12
+ const stack_file_1 = require("../../utils/stack-file");
12
13
  async function handleStackStatus(options) {
13
14
  const { stackService, logger } = (0, instances_1.getServiceInstances)();
14
15
  try {
15
- logger.info(`Getting stack status from: ${options.file}`);
16
- const status = await stackService.getStackStatus(options.file);
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);
17
19
  // Filter to single app if specified
18
20
  const applications = options.app
19
21
  ? status.applications.filter(app => app.name === options.app)
@@ -2,5 +2,7 @@
2
2
  * Stack teardown command handler
3
3
  */
4
4
  import { TeardownOptions } from '../../types/stack';
5
- export declare function handleStackTeardown(options: TeardownOptions): Promise<void>;
5
+ export declare function handleStackTeardown(options: Omit<TeardownOptions, 'file'> & {
6
+ file?: string;
7
+ }): Promise<void>;
6
8
  //# sourceMappingURL=teardown.d.ts.map
@@ -1 +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;AAgBpD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDjF"}
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"}