@phystack/cli 5.0.3 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (218) hide show
  1. package/bin/index.js +27 -1
  2. package/package.json +12 -65
  3. package/dist/commands/app/build-apps.js +0 -66
  4. package/dist/commands/app/build-apps.js.map +0 -1
  5. package/dist/commands/app/build-container-remote.js +0 -171
  6. package/dist/commands/app/build-container-remote.js.map +0 -1
  7. package/dist/commands/app/build-container.js +0 -330
  8. package/dist/commands/app/build-container.js.map +0 -1
  9. package/dist/commands/app/build.js +0 -398
  10. package/dist/commands/app/build.js.map +0 -1
  11. package/dist/commands/app/create.js +0 -463
  12. package/dist/commands/app/create.js.map +0 -1
  13. package/dist/commands/app/deploy.js +0 -176
  14. package/dist/commands/app/deploy.js.map +0 -1
  15. package/dist/commands/app/device-picker.js +0 -150
  16. package/dist/commands/app/device-picker.js.map +0 -1
  17. package/dist/commands/app/import.js +0 -336
  18. package/dist/commands/app/import.js.map +0 -1
  19. package/dist/commands/app/list.js +0 -26
  20. package/dist/commands/app/list.js.map +0 -1
  21. package/dist/commands/app/publish.js +0 -332
  22. package/dist/commands/app/publish.js.map +0 -1
  23. package/dist/commands/app/settings.js +0 -133
  24. package/dist/commands/app/settings.js.map +0 -1
  25. package/dist/commands/app/types.js +0 -14
  26. package/dist/commands/app/types.js.map +0 -1
  27. package/dist/commands/app/upload-description.js +0 -139
  28. package/dist/commands/app/upload-description.js.map +0 -1
  29. package/dist/commands/app/upload-settings.js +0 -29
  30. package/dist/commands/app/upload-settings.js.map +0 -1
  31. package/dist/commands/app/utils.js +0 -86
  32. package/dist/commands/app/utils.js.map +0 -1
  33. package/dist/commands/auth/login.js +0 -145
  34. package/dist/commands/auth/login.js.map +0 -1
  35. package/dist/commands/auth/logout.js +0 -19
  36. package/dist/commands/auth/logout.js.map +0 -1
  37. package/dist/commands/descriptor/create.js +0 -143
  38. package/dist/commands/descriptor/create.js.map +0 -1
  39. package/dist/commands/descriptor/index.js +0 -36
  40. package/dist/commands/descriptor/index.js.map +0 -1
  41. package/dist/commands/descriptor/publish.js +0 -163
  42. package/dist/commands/descriptor/publish.js.map +0 -1
  43. package/dist/commands/descriptor/show.js +0 -68
  44. package/dist/commands/descriptor/show.js.map +0 -1
  45. package/dist/commands/dev/cp.js +0 -764
  46. package/dist/commands/dev/cp.js.map +0 -1
  47. package/dist/commands/dev/develop.js +0 -175
  48. package/dist/commands/dev/develop.js.map +0 -1
  49. package/dist/commands/dev/forward.js +0 -132
  50. package/dist/commands/dev/forward.js.map +0 -1
  51. package/dist/commands/dev/index.js +0 -80
  52. package/dist/commands/dev/index.js.map +0 -1
  53. package/dist/commands/dev/list.js +0 -96
  54. package/dist/commands/dev/list.js.map +0 -1
  55. package/dist/commands/dev/screen-devtools.js +0 -156
  56. package/dist/commands/dev/screen-devtools.js.map +0 -1
  57. package/dist/commands/dev/select.js +0 -118
  58. package/dist/commands/dev/select.js.map +0 -1
  59. package/dist/commands/dev/shell.js +0 -186
  60. package/dist/commands/dev/shell.js.map +0 -1
  61. package/dist/commands/dev/vnc.js +0 -75
  62. package/dist/commands/dev/vnc.js.map +0 -1
  63. package/dist/commands/device/select.js +0 -118
  64. package/dist/commands/device/select.js.map +0 -1
  65. package/dist/commands/flash.js +0 -1120
  66. package/dist/commands/flash.js.map +0 -1
  67. package/dist/commands/inst/create.js +0 -55
  68. package/dist/commands/inst/create.js.map +0 -1
  69. package/dist/commands/inst/index.js +0 -15
  70. package/dist/commands/inst/index.js.map +0 -1
  71. package/dist/commands/inst/list.js +0 -26
  72. package/dist/commands/inst/list.js.map +0 -1
  73. package/dist/commands/legacydev/debug.js +0 -11
  74. package/dist/commands/legacydev/debug.js.map +0 -1
  75. package/dist/commands/legacydev/deploy.js +0 -15
  76. package/dist/commands/legacydev/deploy.js.map +0 -1
  77. package/dist/commands/legacydev/dumpTwin.js +0 -27
  78. package/dist/commands/legacydev/dumpTwin.js.map +0 -1
  79. package/dist/commands/legacydev/forward.js +0 -104
  80. package/dist/commands/legacydev/forward.js.map +0 -1
  81. package/dist/commands/legacydev/index.js +0 -188
  82. package/dist/commands/legacydev/index.js.map +0 -1
  83. package/dist/commands/legacydev/invoke.js +0 -29
  84. package/dist/commands/legacydev/invoke.js.map +0 -1
  85. package/dist/commands/legacydev/js.js +0 -69
  86. package/dist/commands/legacydev/js.js.map +0 -1
  87. package/dist/commands/legacydev/list.js +0 -196
  88. package/dist/commands/legacydev/list.js.map +0 -1
  89. package/dist/commands/legacydev/logs.js +0 -60
  90. package/dist/commands/legacydev/logs.js.map +0 -1
  91. package/dist/commands/legacydev/modules.js +0 -50
  92. package/dist/commands/legacydev/modules.js.map +0 -1
  93. package/dist/commands/legacydev/move.js +0 -23
  94. package/dist/commands/legacydev/move.js.map +0 -1
  95. package/dist/commands/legacydev/ota.js +0 -88
  96. package/dist/commands/legacydev/ota.js.map +0 -1
  97. package/dist/commands/legacydev/patchTwin.js +0 -21
  98. package/dist/commands/legacydev/patchTwin.js.map +0 -1
  99. package/dist/commands/legacydev/pin.js +0 -23
  100. package/dist/commands/legacydev/pin.js.map +0 -1
  101. package/dist/commands/legacydev/pub.js +0 -25
  102. package/dist/commands/legacydev/pub.js.map +0 -1
  103. package/dist/commands/legacydev/rdp.js +0 -64
  104. package/dist/commands/legacydev/rdp.js.map +0 -1
  105. package/dist/commands/legacydev/screen-devtools.js +0 -142
  106. package/dist/commands/legacydev/screen-devtools.js.map +0 -1
  107. package/dist/commands/legacydev/settingsShow.js +0 -89
  108. package/dist/commands/legacydev/settingsShow.js.map +0 -1
  109. package/dist/commands/legacydev/settingsUpdate.js +0 -114
  110. package/dist/commands/legacydev/settingsUpdate.js.map +0 -1
  111. package/dist/commands/legacydev/shell.js +0 -167
  112. package/dist/commands/legacydev/shell.js.map +0 -1
  113. package/dist/commands/legacydev/showTwin.js +0 -9
  114. package/dist/commands/legacydev/showTwin.js.map +0 -1
  115. package/dist/commands/legacydev/statusLog.js +0 -56
  116. package/dist/commands/legacydev/statusLog.js.map +0 -1
  117. package/dist/commands/legacydev/sub.js +0 -39
  118. package/dist/commands/legacydev/sub.js.map +0 -1
  119. package/dist/commands/legacydev/vnc.js +0 -61
  120. package/dist/commands/legacydev/vnc.js.map +0 -1
  121. package/dist/commands/simulator/index.js +0 -37
  122. package/dist/commands/simulator/index.js.map +0 -1
  123. package/dist/commands/simulator/list.js +0 -20
  124. package/dist/commands/simulator/list.js.map +0 -1
  125. package/dist/commands/simulator/remove.js +0 -19
  126. package/dist/commands/simulator/remove.js.map +0 -1
  127. package/dist/commands/simulator/run.js +0 -380
  128. package/dist/commands/simulator/run.js.map +0 -1
  129. package/dist/commands/simulator/start.js +0 -186
  130. package/dist/commands/simulator/start.js.map +0 -1
  131. package/dist/commands/tenant/index.js +0 -21
  132. package/dist/commands/tenant/index.js.map +0 -1
  133. package/dist/commands/tenant/list.js +0 -14
  134. package/dist/commands/tenant/list.js.map +0 -1
  135. package/dist/commands/tenant/select.js +0 -87
  136. package/dist/commands/tenant/select.js.map +0 -1
  137. package/dist/commands/vm/create.js +0 -959
  138. package/dist/commands/vm/create.js.map +0 -1
  139. package/dist/commands/vm/index.js +0 -130
  140. package/dist/commands/vm/index.js.map +0 -1
  141. package/dist/commands/vm/list.js +0 -124
  142. package/dist/commands/vm/list.js.map +0 -1
  143. package/dist/commands/vm/logs.js +0 -66
  144. package/dist/commands/vm/logs.js.map +0 -1
  145. package/dist/commands/vm/remove.js +0 -180
  146. package/dist/commands/vm/remove.js.map +0 -1
  147. package/dist/commands/vm/shell.js +0 -400
  148. package/dist/commands/vm/shell.js.map +0 -1
  149. package/dist/commands/vm/start.js +0 -861
  150. package/dist/commands/vm/start.js.map +0 -1
  151. package/dist/commands/vm/stop.js +0 -232
  152. package/dist/commands/vm/stop.js.map +0 -1
  153. package/dist/index.js +0 -169
  154. package/dist/index.js.map +0 -1
  155. package/dist/services/admin-api/admin-api.types.js +0 -3
  156. package/dist/services/admin-api/admin-api.types.js.map +0 -1
  157. package/dist/services/admin-api/device-modules.admin-api.service.js +0 -58
  158. package/dist/services/admin-api/device-modules.admin-api.service.js.map +0 -1
  159. package/dist/services/admin-api/devices-admin-api.service.js +0 -213
  160. package/dist/services/admin-api/devices-admin-api.service.js.map +0 -1
  161. package/dist/services/admin-api/gridapps-admin-api.service.js +0 -59
  162. package/dist/services/admin-api/gridapps-admin-api.service.js.map +0 -1
  163. package/dist/services/admin-api/index.js +0 -151
  164. package/dist/services/admin-api/index.js.map +0 -1
  165. package/dist/services/admin-api/installations-admin-api.service.js +0 -29
  166. package/dist/services/admin-api/installations-admin-api.service.js.map +0 -1
  167. package/dist/services/admin-api/organizations-admin-api.service.js +0 -53
  168. package/dist/services/admin-api/organizations-admin-api.service.js.map +0 -1
  169. package/dist/services/auth/device-grant-auth.service.js +0 -226
  170. package/dist/services/auth/device-grant-auth.service.js.map +0 -1
  171. package/dist/services/env.js +0 -21
  172. package/dist/services/env.js.map +0 -1
  173. package/dist/services/phyhub/index.js +0 -200
  174. package/dist/services/phyhub/index.js.map +0 -1
  175. package/dist/services/phyhub/phyhub.types.js +0 -3
  176. package/dist/services/phyhub/phyhub.types.js.map +0 -1
  177. package/dist/simulator/index.js +0 -162
  178. package/dist/simulator/index.js.map +0 -1
  179. package/dist/simulator/local-server.js +0 -147
  180. package/dist/simulator/local-server.js.map +0 -1
  181. package/dist/simulator/logger.js +0 -43
  182. package/dist/simulator/logger.js.map +0 -1
  183. package/dist/simulator/message-router.js +0 -379
  184. package/dist/simulator/message-router.js.map +0 -1
  185. package/dist/simulator/twin-cache.js +0 -58
  186. package/dist/simulator/twin-cache.js.map +0 -1
  187. package/dist/simulator/types.js +0 -16
  188. package/dist/simulator/types.js.map +0 -1
  189. package/dist/utils/device-fetcher.js +0 -92
  190. package/dist/utils/device-fetcher.js.map +0 -1
  191. package/dist/utils/devices.js +0 -41
  192. package/dist/utils/devices.js.map +0 -1
  193. package/dist/utils/docker-credentials.js +0 -720
  194. package/dist/utils/docker-credentials.js.map +0 -1
  195. package/dist/utils/emulated-device.js +0 -91
  196. package/dist/utils/emulated-device.js.map +0 -1
  197. package/dist/utils/index.js +0 -147
  198. package/dist/utils/index.js.map +0 -1
  199. package/dist/utils/modules.js +0 -36
  200. package/dist/utils/modules.js.map +0 -1
  201. package/dist/utils/org-selector.js +0 -108
  202. package/dist/utils/org-selector.js.map +0 -1
  203. package/dist/utils/proxy.js +0 -31
  204. package/dist/utils/proxy.js.map +0 -1
  205. package/dist/utils/registry-credentials.js +0 -113
  206. package/dist/utils/registry-credentials.js.map +0 -1
  207. package/dist/utils/simulator-config.js +0 -142
  208. package/dist/utils/simulator-config.js.map +0 -1
  209. package/dist/utils/statuses.js +0 -124
  210. package/dist/utils/statuses.js.map +0 -1
  211. package/dist/utils/templates.js +0 -197
  212. package/dist/utils/templates.js.map +0 -1
  213. package/dist/utils/tenant-storage.js +0 -88
  214. package/dist/utils/tenant-storage.js.map +0 -1
  215. package/dist/utils/vm.js +0 -434
  216. package/dist/utils/vm.js.map +0 -1
  217. package/dist/utils/with-spinner.js +0 -20
  218. package/dist/utils/with-spinner.js.map +0 -1
@@ -1,56 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const devices_1 = require("../../utils/devices");
4
- const statuses_1 = require("../../utils/statuses");
5
- const admin_api_1 = require("../../services/admin-api");
6
- const printLine = (day, dayLogs) => {
7
- const e = [];
8
- for (let m = 0; m < 24 * 3; m += 1) {
9
- e.push('_');
10
- }
11
- for (const [n, st] of dayLogs) {
12
- const round20min = Math.floor(n / 20);
13
- e[round20min] = statuses_1.letters[st] || '?';
14
- }
15
- const applied = (0, statuses_1.applyUnderscores)(e);
16
- const c = (0, statuses_1.renderColorStatuses)(applied);
17
- console.log(day
18
- .toISOString()
19
- .split('T')
20
- .shift(), c);
21
- };
22
- async function statusLog(deviceName) {
23
- const device = await (0, devices_1.fetchDeviceByName)(deviceName);
24
- console.log('device:', device);
25
- if (!device)
26
- throw new Error('device not found');
27
- const data = await (0, admin_api_1.adminApi)().devices.getDeviceStatusLog(device.uuid);
28
- data.push([Date.now(), 'unknown']);
29
- const sorted = data.sort((a, b) => a[0] - b[0]);
30
- // console.log('GOT', data);
31
- let lastDay = 0;
32
- let lastDate = null;
33
- let daylogs = [];
34
- for (const [time, status] of sorted) {
35
- const date = new Date(time);
36
- const day = date.getFullYear() * 10000 + date.getMonth() * 100 + date.getDate();
37
- if (lastDay !== day) {
38
- if (lastDate)
39
- printLine(lastDate, daylogs);
40
- let last = 'offline';
41
- if (daylogs.length) {
42
- const [, lastStatus] = daylogs[daylogs.length - 1];
43
- last = lastStatus; // latest status of the day
44
- }
45
- daylogs = [[0, last]];
46
- lastDay = day;
47
- lastDate = date;
48
- }
49
- daylogs.push([date.getHours() * 60 + date.getMinutes(), status]);
50
- }
51
- if (daylogs && daylogs.length > 1) {
52
- printLine(lastDate, daylogs);
53
- }
54
- }
55
- exports.default = statusLog;
56
- //# sourceMappingURL=statusLog.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"statusLog.js","sourceRoot":"","sources":["../../../src/commands/legacydev/statusLog.ts"],"names":[],"mappings":"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"}
@@ -1,39 +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
- const chalk_1 = __importDefault(require("chalk"));
7
- const utils_1 = require("../../utils");
8
- const admin_api_1 = require("../../services/admin-api");
9
- async function sub(deviceName, { timestamps }) {
10
- const { stream } = (0, utils_1.openStream)(await (0, admin_api_1.adminApi)().devices.subscribeMessageBus(deviceName));
11
- console.log(chalk_1.default.dim('Dumping all events from message bus'));
12
- stream.on('data', (data) => {
13
- try {
14
- const { type, payload } = JSON.parse(data.toString());
15
- if (timestamps) {
16
- console.log(chalk_1.default.magenta(new Date().toISOString()), chalk_1.default.blue(type), payload);
17
- }
18
- else {
19
- console.log(chalk_1.default.blue(type), payload);
20
- }
21
- }
22
- catch (e) {
23
- if (timestamps) {
24
- console.log(chalk_1.default.red(new Date().toISOString()), e.toString());
25
- }
26
- else {
27
- console.log(chalk_1.default.red(e.toString()));
28
- }
29
- }
30
- });
31
- await new Promise((resolve) => {
32
- stream.on('end', () => {
33
- console.log(chalk_1.default.dim('Stream closed'));
34
- resolve();
35
- });
36
- });
37
- }
38
- exports.default = sub;
39
- //# sourceMappingURL=sub.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sub.js","sourceRoot":"","sources":["../../../src/commands/legacydev/sub.ts"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAE1B,uCAAyC;AACzC,wDAAoD;AAEpD,KAAK,UAAU,GAAG,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE;IAC3C,MAAM,EAAE,MAAM,EAAE,GAAG,IAAA,kBAAU,EAAC,MAAM,IAAA,oBAAQ,GAAE,CAAC,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC;IAExF,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC,CAAC;IAE9D,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;QACzB,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtD,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YAClF,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACzC,CAAC;QACH,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC;YACjE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACpB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;YACxC,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kBAAe,GAAG,CAAC"}
@@ -1,61 +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
- const chalk_1 = __importDefault(require("chalk"));
7
- const child_process_1 = __importDefault(require("child_process"));
8
- const fs_1 = __importDefault(require("fs"));
9
- const shell_1 = require("./shell");
10
- const VNC_PATH = {
11
- darwin: '/Applications/VNC Viewer.app',
12
- win32: 'c:\\Program Files\\RealVNC\\VNC Viewer\\vncviewer.exe',
13
- linux: '/usr/bin/vncviewer',
14
- };
15
- async function vnc(deviceName, options) {
16
- // Use the legacy VNC implementation for IoTHub devices
17
- const exeName = VNC_PATH[process.platform];
18
- // Verify VNC viewer is installed
19
- if (!exeName) {
20
- throw new Error(`VNC command is not supported on platform ${process.platform}`);
21
- }
22
- if (!fs_1.default.existsSync(exeName)) {
23
- throw new Error(`VNC Viewer not found, please install from ${chalk_1.default.blueBright('https://www.realvnc.com/en/connect/download/viewer/')}`);
24
- }
25
- // Generate random port for VNC forwarding
26
- const fwdPort = Math.floor(10000 + ((Math.random() * 100000) % 10000));
27
- console.log(chalk_1.default.dim('Starting VNC session via IoTHub...'));
28
- // Start shell with port forwarding and detached mode
29
- const { shellPromise, process: shellProcess } = await (0, shell_1.shellImpl)(deviceName, {
30
- L: `${fwdPort}:localhost:5900`,
31
- silent: true,
32
- detached: true,
33
- });
34
- // Unref the child process to prevent it from keeping the event loop running
35
- shellProcess?.unref();
36
- // Wait longer for the connection and port forwarding to establish
37
- await new Promise((resolve) => setTimeout(resolve, 8000));
38
- // Launch VNC viewer
39
- const vncTarget = `127.0.0.1:${fwdPort}`;
40
- console.log(chalk_1.default.dim(`Starting local VNC client pointing to ${vncTarget}...`));
41
- if (process.platform === 'darwin') {
42
- child_process_1.default.spawn('open', [
43
- '-n',
44
- exeName,
45
- '--args',
46
- 'WarnUnencrypted=0',
47
- 'SecurityNotificationTimeout=0',
48
- vncTarget,
49
- ]);
50
- }
51
- else if (process.platform === 'linux') {
52
- child_process_1.default.exec(`${exeName} WarnUnencrypted=0 SecurityNotificationTimeout=0 ${vncTarget}`);
53
- }
54
- else if (process.platform === 'win32') {
55
- child_process_1.default.spawn(exeName, ['WarnUnencrypted=0', 'SecurityNotificationTimeout=0', vncTarget]);
56
- }
57
- console.log(chalk_1.default.dim(`VNC connection established at ${vncTarget}. Press Ctrl+C when done.`));
58
- return shellPromise;
59
- }
60
- exports.default = vnc;
61
- //# sourceMappingURL=vnc.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vnc.js","sourceRoot":"","sources":["../../../src/commands/legacydev/vnc.ts"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAC1B,kEAA+B;AAC/B,4CAAoB;AACpB,mCAA6C;AAE7C,MAAM,QAAQ,GAAG;IACf,MAAM,EAAE,8BAA8B;IACtC,KAAK,EAAE,uDAAuD;IAC9D,KAAK,EAAE,oBAAoB;CAC5B,CAAC;AAEF,KAAK,UAAU,GAAG,CAAC,UAAU,EAAE,OAAO;IACpC,uDAAuD;IACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE3C,iCAAiC;IACjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4CAA4C,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CACb,6CAA6C,eAAK,CAAC,UAAU,CAC3D,qDAAqD,CACtD,EAAE,CACJ,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC;IAEvE,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC,CAAC;IAE7D,qDAAqD;IACrD,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,IAAA,iBAAK,EAAC,UAAU,EAAE;QACtE,CAAC,EAAE,GAAG,OAAO,iBAAiB;QAC9B,MAAM,EAAE,IAAI;QACZ,QAAQ,EAAE,IAAI;KACf,CAAC,CAAC;IAEH,4EAA4E;IAC5E,YAAY,EAAE,KAAK,EAAE,CAAC;IAEtB,kEAAkE;IAClE,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1D,oBAAoB;IACpB,MAAM,SAAS,GAAG,aAAa,OAAO,EAAE,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,yCAAyC,SAAS,KAAK,CAAC,CAAC,CAAC;IAEhF,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAClC,uBAAE,CAAC,KAAK,CAAC,MAAM,EAAE;YACf,IAAI;YACJ,OAAO;YACP,QAAQ;YACR,mBAAmB;YACnB,+BAA+B;YAC/B,SAAS;SACV,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,uBAAE,CAAC,IAAI,CAAC,GAAG,OAAO,oDAAoD,SAAS,EAAE,CAAC,CAAC;IACrF,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACxC,uBAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,mBAAmB,EAAE,+BAA+B,EAAE,SAAS,CAAC,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CAAC,iCAAiC,SAAS,2BAA2B,CAAC,CACjF,CAAC;IAEF,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,kBAAe,GAAG,CAAC"}
@@ -1,37 +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
- const commander_1 = __importDefault(require("commander"));
7
- const utils_1 = require("../../utils");
8
- const start_1 = __importDefault(require("./start"));
9
- const run_1 = __importDefault(require("./run"));
10
- const list_1 = __importDefault(require("./list"));
11
- const remove_1 = __importDefault(require("./remove"));
12
- const simulator = commander_1.default
13
- .command('simulator')
14
- .description('Local device simulator for app development');
15
- simulator
16
- .command('start')
17
- .description('Start the local simulator server')
18
- .option('-p, --port <port>', 'Port to listen on', '55000')
19
- .option('--connect <name>', 'Connect to phyhub as a provisioned device')
20
- .action((0, utils_1.handleError)(start_1.default));
21
- simulator
22
- .command('run <path>')
23
- .description('Run an app connected to the simulator (reconciles twin, spawns dev server)')
24
- .option('--type <type>', 'Override app type detection (screen or edge)')
25
- .option('--dev-command <command>', 'Override dev command (default: npm run dev)')
26
- .option('--settings-dir <path>', 'Settings directory path (default: src/settings)')
27
- .action((0, utils_1.handleError)(run_1.default));
28
- simulator
29
- .command('list')
30
- .description('List all provisioned simulator devices')
31
- .action(list_1.default);
32
- simulator
33
- .command('remove <name>')
34
- .description('Remove a saved simulator device')
35
- .action(remove_1.default);
36
- exports.default = simulator;
37
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/simulator/index.ts"],"names":[],"mappings":";;;;;AAAA,0DAAgC;AAChC,uCAA0C;AAC1C,oDAA4B;AAC5B,gDAAwB;AACxB,kDAAmC;AACnC,sDAAuC;AAEvC,MAAM,SAAS,GAAG,mBAAO;KACtB,OAAO,CAAC,WAAW,CAAC;KACpB,WAAW,CAAC,4CAA4C,CAAC,CAAC;AAE7D,SAAS;KACN,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,kCAAkC,CAAC;KAC/C,MAAM,CAAC,mBAAmB,EAAE,mBAAmB,EAAE,OAAO,CAAC;KACzD,MAAM,CAAC,kBAAkB,EAAE,2CAA2C,CAAC;KACvE,MAAM,CAAC,IAAA,mBAAW,EAAC,eAAK,CAAC,CAAC,CAAC;AAE9B,SAAS;KACN,OAAO,CAAC,YAAY,CAAC;KACrB,WAAW,CACV,4EAA4E,CAC7E;KACA,MAAM,CAAC,eAAe,EAAE,8CAA8C,CAAC;KACvE,MAAM,CAAC,yBAAyB,EAAE,6CAA6C,CAAC;KAChF,MAAM,CAAC,uBAAuB,EAAE,iDAAiD,CAAC;KAClF,MAAM,CAAC,IAAA,mBAAW,EAAC,aAAG,CAAC,CAAC,CAAC;AAE5B,SAAS;KACN,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,wCAAwC,CAAC;KACrD,MAAM,CAAC,cAAa,CAAC,CAAC;AAEzB,SAAS;KACN,OAAO,CAAC,eAAe,CAAC;KACxB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,gBAAe,CAAC,CAAC;AAE3B,kBAAe,SAAS,CAAC"}
@@ -1,20 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = simulatorList;
4
- const simulator_config_1 = require("../../utils/simulator-config");
5
- function simulatorList() {
6
- const devices = (0, simulator_config_1.listSimulators)();
7
- if (devices.length === 0) {
8
- console.log('No provisioned simulators. Use "phy simulator start --connect <name>" to create one.');
9
- return;
10
- }
11
- const header = `${'NAME'.padEnd(20)} ${'ENV'.padEnd(8)} ${'DEVICE ID'.padEnd(38)} PROVISIONED`;
12
- console.log(header);
13
- console.log('-'.repeat(header.length));
14
- for (const d of devices) {
15
- const envLabel = d.environment === 'prod' || !d.environment ? '' : d.environment;
16
- const date = d.provisionedAt ? d.provisionedAt.split('T')[0] : 'unknown';
17
- console.log(`${d.name.padEnd(20)} ${envLabel.padEnd(8)} ${d.deviceId.padEnd(38)} ${date}`);
18
- }
19
- }
20
- //# sourceMappingURL=list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/commands/simulator/list.ts"],"names":[],"mappings":";;AAGA,gCAiBC;AApBD,mEAA8D;AAG9D,SAAwB,aAAa;IACnC,MAAM,OAAO,GAAG,IAAA,iCAAc,GAAE,CAAC;IAEjC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,sFAAsF,CAAC,CAAC;QACpG,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC;IAC/F,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAEvC,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC;QACjF,MAAM,IAAI,GAAG,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC7F,CAAC;AACH,CAAC"}
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.default = simulatorRemove;
4
- const simulator_config_1 = require("../../utils/simulator-config");
5
- function simulatorRemove(name) {
6
- if (!name) {
7
- console.error('Usage: phy simulator remove <name>');
8
- process.exit(1);
9
- }
10
- const removed = (0, simulator_config_1.removeSimulator)(name);
11
- if (removed) {
12
- console.log(`Removed simulator "${name}".`);
13
- }
14
- else {
15
- console.error(`Simulator "${name}" not found.`);
16
- process.exit(1);
17
- }
18
- }
19
- //# sourceMappingURL=remove.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/commands/simulator/remove.ts"],"names":[],"mappings":";;AAEA,kCAaC;AAfD,mEAA+D;AAE/D,SAAwB,eAAe,CAAC,IAAY;IAClD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,kCAAe,EAAC,IAAI,CAAC,CAAC;IACtC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,IAAI,CAAC,CAAC;IAC9C,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,cAAc,IAAI,cAAc,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC"}
@@ -1,380 +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
- const chalk_1 = __importDefault(require("chalk"));
7
- const path_1 = __importDefault(require("path"));
8
- const fs_extra_1 = __importDefault(require("fs-extra"));
9
- const child_process_1 = require("child_process");
10
- const socket_io_client_1 = require("socket.io-client");
11
- const simulator_config_1 = require("../../utils/simulator-config");
12
- const types_1 = require("../../simulator/types");
13
- const SIMULATOR_URL = 'http://localhost:55000';
14
- const APP_TYPE_TO_TWIN_TYPE = {
15
- [types_1.AppTypeEnum.Screen]: types_1.TwinTypeEnum.Screen,
16
- [types_1.AppTypeEnum.Edge]: types_1.TwinTypeEnum.Edge,
17
- };
18
- const SUPPORTED_APP_TYPES = new Set(Object.values(types_1.AppTypeEnum));
19
- function resolveAppType(optionType, pkgType) {
20
- const raw = (optionType || pkgType || '').toLowerCase();
21
- if (!raw) {
22
- throw new Error('Cannot detect app type. Set "application-type" in package.json or pass --type.');
23
- }
24
- if (!SUPPORTED_APP_TYPES.has(raw)) {
25
- throw new Error(`Unsupported app type "${raw}". Supported types: ${[...SUPPORTED_APP_TYPES].join(', ')}`);
26
- }
27
- return raw;
28
- }
29
- async function tryReadSettingsFiles(appPath, files) {
30
- for (const settingsPath of files) {
31
- if (await fs_extra_1.default.pathExists(settingsPath)) {
32
- try {
33
- const data = await fs_extra_1.default.readJSON(settingsPath);
34
- const settings = data?.app?.gridApp?.settings;
35
- if (settings) {
36
- console.log(chalk_1.default.dim(`Read settings from ${path_1.default.relative(appPath, settingsPath)}`));
37
- return settings;
38
- }
39
- }
40
- catch (err) {
41
- console.log(`[simulator] Failed to read ${path_1.default.relative(appPath, settingsPath)}: ${err.message}`);
42
- }
43
- }
44
- }
45
- return null;
46
- }
47
- async function readLocalSettings(appPath, settingsDir = 'src/settings') {
48
- const settingsFiles = [
49
- path_1.default.join(appPath, settingsDir, 'index.json'),
50
- ];
51
- const settings = await tryReadSettingsFiles(appPath, settingsFiles);
52
- if (settings)
53
- return settings;
54
- // If neither exists, try running init-settings.js then retry
55
- const initScript = path_1.default.join(appPath, 'scripts', 'init-settings.js');
56
- if (await fs_extra_1.default.pathExists(initScript)) {
57
- console.log(chalk_1.default.dim('No settings found, running init-settings.js...'));
58
- try {
59
- (0, child_process_1.execSync)('node scripts/init-settings.js', { cwd: appPath, stdio: 'pipe' });
60
- }
61
- catch (err) {
62
- console.log(`[simulator] init-settings.js failed: ${err.message}`);
63
- }
64
- const retrySettings = await tryReadSettingsFiles(appPath, settingsFiles);
65
- if (retrySettings)
66
- return retrySettings;
67
- }
68
- return {};
69
- }
70
- function connectSimulator() {
71
- return new Promise((resolve, reject) => {
72
- const socket = (0, socket_io_client_1.io)(SIMULATOR_URL, {
73
- reconnectionAttempts: 1,
74
- timeout: 3000,
75
- });
76
- socket.on('connect', () => resolve(socket));
77
- socket.on('connect_error', (err) => {
78
- reject(new Error(`Cannot connect to simulator: ${err.message}`));
79
- });
80
- });
81
- }
82
- function sendSimulatorMessage(socket, payload) {
83
- return new Promise((resolve, reject) => {
84
- const timer = setTimeout(() => {
85
- reject(new Error('Timeout waiting for simulator response'));
86
- }, 10000);
87
- socket.emit('simulator', payload, (response) => {
88
- clearTimeout(timer);
89
- resolve(response);
90
- });
91
- });
92
- }
93
- async function createTwinViaSimulator(type, desiredProperties, reuseId) {
94
- const socket = await connectSimulator();
95
- try {
96
- const response = await sendSimulatorMessage(socket, {
97
- method: 'createInstanceTwin',
98
- data: { type, desiredProperties, id: reuseId },
99
- });
100
- if (response?.status === 'success' && response?.twin) {
101
- return response.twin;
102
- }
103
- throw new Error(response?.message || 'Failed to create twin');
104
- }
105
- finally {
106
- socket.disconnect();
107
- }
108
- }
109
- exports.default = async (appPath, options = {}) => {
110
- // 1. Resolve path
111
- const resolvedPath = path_1.default.resolve(appPath);
112
- if (!(await fs_extra_1.default.pathExists(resolvedPath))) {
113
- console.error(chalk_1.default.red(`Path does not exist: ${resolvedPath}`));
114
- process.exit(1);
115
- }
116
- // 2. Read package.json
117
- const pkgPath = path_1.default.join(resolvedPath, 'package.json');
118
- if (!(await fs_extra_1.default.pathExists(pkgPath))) {
119
- console.error(chalk_1.default.red('Only Node.js apps are supported for now. No package.json found at ' +
120
- resolvedPath));
121
- process.exit(1);
122
- }
123
- const pkg = await fs_extra_1.default.readJSON(pkgPath);
124
- const appName = pkg.name || path_1.default.basename(resolvedPath);
125
- // 3. Resolve app type
126
- const appType = resolveAppType(options.type, pkg['application-type']);
127
- const startCommand = resolveStartCommand(options, pkg, appType);
128
- // 4. Check simulator is running
129
- let isRunning = false;
130
- try {
131
- const socket = await connectSimulator();
132
- socket.disconnect();
133
- isRunning = true;
134
- }
135
- catch (err) {
136
- console.log(`[simulator] Connection check failed: ${err.message}`);
137
- isRunning = false;
138
- }
139
- if (!isRunning) {
140
- console.error(chalk_1.default.red('Simulator is not running. Start it first with `phy simulator start`.'));
141
- process.exit(1);
142
- }
143
- // 5. Twin reconciliation (use "local" as tenantId for config storage)
144
- const localTenantId = 'local';
145
- const appConfig = await (0, simulator_config_1.getAppConfigByPath)(localTenantId, resolvedPath);
146
- let twinId = appConfig?.twinId;
147
- const persistedTwinId = twinId;
148
- const localSettings = await readLocalSettings(resolvedPath, options.settingsDir);
149
- if (Object.keys(localSettings).length > 0) {
150
- console.log(chalk_1.default.green(`Loaded ${Object.keys(localSettings).length} settings from local files`));
151
- }
152
- // Always (re)create twin with fresh settings — reuse persisted ID for stable twin across restarts
153
- const twinType = APP_TYPE_TO_TWIN_TYPE[appType];
154
- if (persistedTwinId) {
155
- console.log(chalk_1.default.dim(`Reusing instance ID ${persistedTwinId} for ${appName}`));
156
- }
157
- else {
158
- console.log(chalk_1.default.dim(`Creating new ${appType} instance for ${appName}...`));
159
- }
160
- const twin = await createTwinViaSimulator(twinType, { settings: localSettings, appName, appVersion: pkg.version || '0.0.0' }, persistedTwinId);
161
- twinId = twin.id;
162
- if (persistedTwinId) {
163
- console.log(chalk_1.default.green(`Recreated twin with existing ID ${twinId}`));
164
- }
165
- else {
166
- console.log(chalk_1.default.green(`Created twin with new ID ${twinId}`));
167
- }
168
- // Save/update app config
169
- const newAppConfig = {
170
- name: appName,
171
- type: appType,
172
- path: resolvedPath,
173
- twinId,
174
- devCommand: startCommand || 'docker',
175
- };
176
- await (0, simulator_config_1.saveAppConfig)(localTenantId, newAppConfig);
177
- // 6. Type-specific launch
178
- if (appType === types_1.AppTypeEnum.Screen) {
179
- await launchWithStartCommand(resolvedPath, pkg, startCommand, twinId, appName, appType);
180
- }
181
- else if (appType === types_1.AppTypeEnum.Edge) {
182
- const dockerfilePath = path_1.default.join(resolvedPath, 'Dockerfile');
183
- if (await fs_extra_1.default.pathExists(dockerfilePath)) {
184
- await launchWithDocker(resolvedPath, pkg, twinId, appName);
185
- }
186
- else if (startCommand) {
187
- await launchWithStartCommand(resolvedPath, pkg, startCommand, twinId, appName, appType);
188
- }
189
- else {
190
- throw new Error('No Dockerfile or start script found. Add a Dockerfile or a "start" script in package.json.');
191
- }
192
- }
193
- };
194
- function resolveStartCommand(options, pkg, appType) {
195
- if (options.devCommand)
196
- return options.devCommand;
197
- if (pkg.scripts?.start)
198
- return 'npm start';
199
- // For edge apps with a Dockerfile, start command is optional
200
- if (appType === types_1.AppTypeEnum.Edge)
201
- return undefined;
202
- throw new Error('No start script found in package.json. Pass --dev-command to specify one.');
203
- }
204
- async function launchWithStartCommand(resolvedPath, pkg, startCommand, twinId, appName, appType) {
205
- console.log('');
206
- console.log(chalk_1.default.green.bold(`Starting ${appName}`));
207
- console.log(chalk_1.default.dim('─'.repeat(40)));
208
- console.log(` ${chalk_1.default.cyan('Type:')} ${appType}`);
209
- console.log(` ${chalk_1.default.cyan('Twin ID:')} ${twinId}`);
210
- console.log(` ${chalk_1.default.cyan('Path:')} ${resolvedPath}`);
211
- console.log(` ${chalk_1.default.cyan('Command:')} ${startCommand}`);
212
- console.log(chalk_1.default.dim('─'.repeat(40)));
213
- console.log('');
214
- const env = {
215
- ...process.env,
216
- TWIN_ID: twinId,
217
- PHYSTACK_SIMULATOR_URL: SIMULATOR_URL,
218
- };
219
- const child = (0, child_process_1.spawn)(startCommand, {
220
- cwd: resolvedPath,
221
- stdio: 'inherit',
222
- env,
223
- shell: true,
224
- });
225
- await new Promise((resolve, reject) => {
226
- child.on('close', (code) => {
227
- if (code === 0) {
228
- resolve();
229
- }
230
- else {
231
- reject(new Error(`Start command exited with code ${code}`));
232
- }
233
- });
234
- child.on('error', (err) => {
235
- reject(err);
236
- });
237
- });
238
- }
239
- async function readContainerConfig(appPath) {
240
- const settingsPath = path_1.default.join(appPath, 'settings.json');
241
- if (!(await fs_extra_1.default.pathExists(settingsPath)))
242
- return null;
243
- return fs_extra_1.default.readJSON(settingsPath);
244
- }
245
- function buildDockerRunArgs(config, image, twinId) {
246
- const args = ['run', '--rm', '--name', `simulator-${Date.now()}`];
247
- // --- Environment variables (mirrors device-phyos: TWIN_ID, TZ, custom Env) ---
248
- args.push('-e', `TWIN_ID=${twinId}`);
249
- args.push('-e', `PHYSTACK_SIMULATOR_URL=http://host.docker.internal:55000`);
250
- if (process.env.TZ) {
251
- args.push('-e', `TZ=${process.env.TZ}`);
252
- }
253
- // --- Network: mirrors device-phyos NetworkMode + ExtraHosts ---
254
- const isHostNetwork = config?.HostConfig?.NetworkMode === 'host';
255
- if (isHostNetwork) {
256
- args.push('--network', 'host');
257
- // In host mode, production maps phyos → 127.0.0.1
258
- args.push('--add-host', 'phyos:127.0.0.1');
259
- }
260
- else {
261
- // Bridge mode (default): simulator needs host.docker.internal for callback
262
- args.push('--add-host=host.docker.internal:host-gateway');
263
- // In bridge mode, production maps phyos → 172.26.128.1
264
- args.push('--add-host', 'phyos:host-gateway');
265
- }
266
- if (config) {
267
- // Custom env vars from settings.json
268
- for (const env of config.Env || []) {
269
- args.push('-e', env);
270
- }
271
- // --- Entrypoint (production passes Entrypoint from createOptions) ---
272
- if (config.Entrypoint) {
273
- const ep = Array.isArray(config.Entrypoint)
274
- ? config.Entrypoint
275
- : [config.Entrypoint];
276
- args.push('--entrypoint', ep[0]);
277
- }
278
- // --- Port bindings ---
279
- const ports = config.HostConfig?.PortBindings || {};
280
- for (const [containerPort, bindings] of Object.entries(ports)) {
281
- for (const binding of bindings) {
282
- args.push('-p', `${binding.HostPort}:${containerPort.replace('/tcp', '')}`);
283
- }
284
- }
285
- // --- Volume binds ---
286
- for (const bind of config.HostConfig?.Binds || []) {
287
- args.push('-v', bind);
288
- }
289
- // --- Devices ---
290
- for (const device of config.HostConfig?.Devices || []) {
291
- args.push('--device', device.PathOnHost);
292
- }
293
- // --- GPU / DeviceRequests (production detects nvidia runtime) ---
294
- for (const req of config.HostConfig?.DeviceRequests || []) {
295
- const isGpu = req.Capabilities &&
296
- req.Capabilities.some((cap) => cap.includes('gpu'));
297
- if (isGpu) {
298
- args.push('--gpus', 'all');
299
- }
300
- }
301
- // --- Privileged ---
302
- if (config.HostConfig?.Privileged) {
303
- args.push('--privileged');
304
- }
305
- // --- Resource limits ---
306
- if (config.HostConfig?.Memory > 0) {
307
- args.push('--memory', String(config.HostConfig.Memory));
308
- }
309
- if (config.HostConfig?.CpuShares > 0) {
310
- args.push('--cpu-shares', String(config.HostConfig.CpuShares));
311
- }
312
- // --- Ulimits ---
313
- for (const ulimit of config.HostConfig?.Ulimits || []) {
314
- args.push('--ulimit', `${ulimit.Name}=${ulimit.Soft}:${ulimit.Hard}`);
315
- }
316
- // --- Read-only root filesystem ---
317
- if (config.HostConfig?.ReadonlyRootfs) {
318
- args.push('--read-only');
319
- }
320
- }
321
- args.push(image);
322
- // --- Custom CMD (production passes Cmd from createOptions) ---
323
- if (config?.Cmd) {
324
- args.push(...config.Cmd);
325
- }
326
- return args;
327
- }
328
- async function launchWithDocker(appPath, pkg, twinId, appName) {
329
- const imageName = pkg.name.replace(/[^a-z0-9_.-]/g, '-');
330
- const imageTag = `${imageName}:${pkg.version || 'latest'}`;
331
- // Build
332
- console.log('');
333
- console.log(chalk_1.default.green.bold(`Building Docker image for ${appName}`));
334
- console.log(chalk_1.default.dim(`Image: ${imageTag}`));
335
- console.log('');
336
- const buildResult = (0, child_process_1.spawnSync)('docker', ['build', '-t', imageTag, '.'], {
337
- cwd: appPath,
338
- stdio: 'inherit',
339
- });
340
- if (buildResult.status !== 0) {
341
- throw new Error(`Docker build failed with exit code ${buildResult.status}`);
342
- }
343
- // Read container config from settings.json
344
- const containerConfig = await readContainerConfig(appPath);
345
- // Run
346
- const dockerArgs = buildDockerRunArgs(containerConfig, imageTag, twinId);
347
- console.log('');
348
- console.log(chalk_1.default.green.bold(`Starting ${appName}`));
349
- console.log(chalk_1.default.dim('─'.repeat(40)));
350
- console.log(` ${chalk_1.default.cyan('Type:')} edge (Docker)`);
351
- console.log(` ${chalk_1.default.cyan('Twin ID:')} ${twinId}`);
352
- console.log(` ${chalk_1.default.cyan('Path:')} ${appPath}`);
353
- console.log(` ${chalk_1.default.cyan('Image:')} ${imageTag}`);
354
- console.log(chalk_1.default.dim('─'.repeat(40)));
355
- console.log(chalk_1.default.dim(`docker ${dockerArgs.join(' ')}`));
356
- console.log('');
357
- const child = (0, child_process_1.spawn)('docker', dockerArgs, {
358
- cwd: appPath,
359
- stdio: 'inherit',
360
- });
361
- // Graceful shutdown
362
- const containerName = dockerArgs[dockerArgs.indexOf('--name') + 1];
363
- const cleanup = () => {
364
- (0, child_process_1.spawnSync)('docker', ['stop', containerName], { stdio: 'pipe' });
365
- };
366
- process.on('SIGINT', cleanup);
367
- process.on('SIGTERM', cleanup);
368
- await new Promise((resolve, reject) => {
369
- child.on('close', (code) => {
370
- if (code === 0) {
371
- resolve();
372
- }
373
- else {
374
- reject(new Error(`Docker exited with code ${code}`));
375
- }
376
- });
377
- child.on('error', reject);
378
- });
379
- }
380
- //# sourceMappingURL=run.js.map