@phystack/cli 4.4.29

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 (192) hide show
  1. package/LICENSE.md +19 -0
  2. package/README.md +24 -0
  3. package/bin/index.js +2 -0
  4. package/dist/commands/app/build-apps.js +66 -0
  5. package/dist/commands/app/build-apps.js.map +1 -0
  6. package/dist/commands/app/build-container-remote.js +171 -0
  7. package/dist/commands/app/build-container-remote.js.map +1 -0
  8. package/dist/commands/app/build-container.js +322 -0
  9. package/dist/commands/app/build-container.js.map +1 -0
  10. package/dist/commands/app/build.js +375 -0
  11. package/dist/commands/app/build.js.map +1 -0
  12. package/dist/commands/app/create.js +409 -0
  13. package/dist/commands/app/create.js.map +1 -0
  14. package/dist/commands/app/deploy.js +176 -0
  15. package/dist/commands/app/deploy.js.map +1 -0
  16. package/dist/commands/app/device-picker.js +150 -0
  17. package/dist/commands/app/device-picker.js.map +1 -0
  18. package/dist/commands/app/import.js +303 -0
  19. package/dist/commands/app/import.js.map +1 -0
  20. package/dist/commands/app/list.js +26 -0
  21. package/dist/commands/app/list.js.map +1 -0
  22. package/dist/commands/app/publish.js +327 -0
  23. package/dist/commands/app/publish.js.map +1 -0
  24. package/dist/commands/app/settings.js +129 -0
  25. package/dist/commands/app/settings.js.map +1 -0
  26. package/dist/commands/app/types.js +13 -0
  27. package/dist/commands/app/types.js.map +1 -0
  28. package/dist/commands/app/upload-description.js +139 -0
  29. package/dist/commands/app/upload-description.js.map +1 -0
  30. package/dist/commands/app/upload-settings.js +29 -0
  31. package/dist/commands/app/upload-settings.js.map +1 -0
  32. package/dist/commands/app/utils.js +86 -0
  33. package/dist/commands/app/utils.js.map +1 -0
  34. package/dist/commands/auth/login.js +111 -0
  35. package/dist/commands/auth/login.js.map +1 -0
  36. package/dist/commands/auth/logout.js +19 -0
  37. package/dist/commands/auth/logout.js.map +1 -0
  38. package/dist/commands/descriptor/create.js +143 -0
  39. package/dist/commands/descriptor/create.js.map +1 -0
  40. package/dist/commands/descriptor/index.js +36 -0
  41. package/dist/commands/descriptor/index.js.map +1 -0
  42. package/dist/commands/descriptor/publish.js +163 -0
  43. package/dist/commands/descriptor/publish.js.map +1 -0
  44. package/dist/commands/descriptor/show.js +68 -0
  45. package/dist/commands/descriptor/show.js.map +1 -0
  46. package/dist/commands/dev/develop.js +175 -0
  47. package/dist/commands/dev/develop.js.map +1 -0
  48. package/dist/commands/dev/forward.js +118 -0
  49. package/dist/commands/dev/forward.js.map +1 -0
  50. package/dist/commands/dev/index.js +66 -0
  51. package/dist/commands/dev/index.js.map +1 -0
  52. package/dist/commands/dev/list.js +96 -0
  53. package/dist/commands/dev/list.js.map +1 -0
  54. package/dist/commands/dev/screen-devtools.js +156 -0
  55. package/dist/commands/dev/screen-devtools.js.map +1 -0
  56. package/dist/commands/dev/select.js +118 -0
  57. package/dist/commands/dev/select.js.map +1 -0
  58. package/dist/commands/dev/shell.js +171 -0
  59. package/dist/commands/dev/shell.js.map +1 -0
  60. package/dist/commands/dev/vnc.js +75 -0
  61. package/dist/commands/dev/vnc.js.map +1 -0
  62. package/dist/commands/device/select.js +118 -0
  63. package/dist/commands/device/select.js.map +1 -0
  64. package/dist/commands/flash.js +1120 -0
  65. package/dist/commands/flash.js.map +1 -0
  66. package/dist/commands/inst/create.js +55 -0
  67. package/dist/commands/inst/create.js.map +1 -0
  68. package/dist/commands/inst/index.js +15 -0
  69. package/dist/commands/inst/index.js.map +1 -0
  70. package/dist/commands/inst/list.js +26 -0
  71. package/dist/commands/inst/list.js.map +1 -0
  72. package/dist/commands/legacydev/debug.js +11 -0
  73. package/dist/commands/legacydev/debug.js.map +1 -0
  74. package/dist/commands/legacydev/deploy.js +15 -0
  75. package/dist/commands/legacydev/deploy.js.map +1 -0
  76. package/dist/commands/legacydev/dumpTwin.js +27 -0
  77. package/dist/commands/legacydev/dumpTwin.js.map +1 -0
  78. package/dist/commands/legacydev/forward.js +104 -0
  79. package/dist/commands/legacydev/forward.js.map +1 -0
  80. package/dist/commands/legacydev/index.js +188 -0
  81. package/dist/commands/legacydev/index.js.map +1 -0
  82. package/dist/commands/legacydev/invoke.js +29 -0
  83. package/dist/commands/legacydev/invoke.js.map +1 -0
  84. package/dist/commands/legacydev/js.js +69 -0
  85. package/dist/commands/legacydev/js.js.map +1 -0
  86. package/dist/commands/legacydev/list.js +196 -0
  87. package/dist/commands/legacydev/list.js.map +1 -0
  88. package/dist/commands/legacydev/logs.js +60 -0
  89. package/dist/commands/legacydev/logs.js.map +1 -0
  90. package/dist/commands/legacydev/modules.js +50 -0
  91. package/dist/commands/legacydev/modules.js.map +1 -0
  92. package/dist/commands/legacydev/move.js +23 -0
  93. package/dist/commands/legacydev/move.js.map +1 -0
  94. package/dist/commands/legacydev/ota.js +88 -0
  95. package/dist/commands/legacydev/ota.js.map +1 -0
  96. package/dist/commands/legacydev/patchTwin.js +21 -0
  97. package/dist/commands/legacydev/patchTwin.js.map +1 -0
  98. package/dist/commands/legacydev/pin.js +23 -0
  99. package/dist/commands/legacydev/pin.js.map +1 -0
  100. package/dist/commands/legacydev/pub.js +25 -0
  101. package/dist/commands/legacydev/pub.js.map +1 -0
  102. package/dist/commands/legacydev/rdp.js +64 -0
  103. package/dist/commands/legacydev/rdp.js.map +1 -0
  104. package/dist/commands/legacydev/screen-devtools.js +142 -0
  105. package/dist/commands/legacydev/screen-devtools.js.map +1 -0
  106. package/dist/commands/legacydev/settingsShow.js +89 -0
  107. package/dist/commands/legacydev/settingsShow.js.map +1 -0
  108. package/dist/commands/legacydev/settingsUpdate.js +114 -0
  109. package/dist/commands/legacydev/settingsUpdate.js.map +1 -0
  110. package/dist/commands/legacydev/shell.js +167 -0
  111. package/dist/commands/legacydev/shell.js.map +1 -0
  112. package/dist/commands/legacydev/showTwin.js +9 -0
  113. package/dist/commands/legacydev/showTwin.js.map +1 -0
  114. package/dist/commands/legacydev/statusLog.js +56 -0
  115. package/dist/commands/legacydev/statusLog.js.map +1 -0
  116. package/dist/commands/legacydev/sub.js +39 -0
  117. package/dist/commands/legacydev/sub.js.map +1 -0
  118. package/dist/commands/legacydev/vnc.js +61 -0
  119. package/dist/commands/legacydev/vnc.js.map +1 -0
  120. package/dist/commands/tenant/index.js +21 -0
  121. package/dist/commands/tenant/index.js.map +1 -0
  122. package/dist/commands/tenant/list.js +14 -0
  123. package/dist/commands/tenant/list.js.map +1 -0
  124. package/dist/commands/tenant/select.js +87 -0
  125. package/dist/commands/tenant/select.js.map +1 -0
  126. package/dist/commands/vm/create.js +718 -0
  127. package/dist/commands/vm/create.js.map +1 -0
  128. package/dist/commands/vm/index.js +130 -0
  129. package/dist/commands/vm/index.js.map +1 -0
  130. package/dist/commands/vm/list.js +124 -0
  131. package/dist/commands/vm/list.js.map +1 -0
  132. package/dist/commands/vm/logs.js +66 -0
  133. package/dist/commands/vm/logs.js.map +1 -0
  134. package/dist/commands/vm/remove.js +180 -0
  135. package/dist/commands/vm/remove.js.map +1 -0
  136. package/dist/commands/vm/shell.js +400 -0
  137. package/dist/commands/vm/shell.js.map +1 -0
  138. package/dist/commands/vm/start.js +861 -0
  139. package/dist/commands/vm/start.js.map +1 -0
  140. package/dist/commands/vm/stop.js +232 -0
  141. package/dist/commands/vm/stop.js.map +1 -0
  142. package/dist/index.js +158 -0
  143. package/dist/index.js.map +1 -0
  144. package/dist/services/admin-api/admin-api.types.js +3 -0
  145. package/dist/services/admin-api/admin-api.types.js.map +1 -0
  146. package/dist/services/admin-api/device-modules.admin-api.service.js +58 -0
  147. package/dist/services/admin-api/device-modules.admin-api.service.js.map +1 -0
  148. package/dist/services/admin-api/devices-admin-api.service.js +213 -0
  149. package/dist/services/admin-api/devices-admin-api.service.js.map +1 -0
  150. package/dist/services/admin-api/gridapps-admin-api.service.js +59 -0
  151. package/dist/services/admin-api/gridapps-admin-api.service.js.map +1 -0
  152. package/dist/services/admin-api/index.js +157 -0
  153. package/dist/services/admin-api/index.js.map +1 -0
  154. package/dist/services/admin-api/installations-admin-api.service.js +29 -0
  155. package/dist/services/admin-api/installations-admin-api.service.js.map +1 -0
  156. package/dist/services/admin-api/organizations-admin-api.service.js +53 -0
  157. package/dist/services/admin-api/organizations-admin-api.service.js.map +1 -0
  158. package/dist/services/auth/device-grant-auth.service.js +224 -0
  159. package/dist/services/auth/device-grant-auth.service.js.map +1 -0
  160. package/dist/services/phyhub/index.js +200 -0
  161. package/dist/services/phyhub/index.js.map +1 -0
  162. package/dist/services/phyhub/phyhub.types.js +3 -0
  163. package/dist/services/phyhub/phyhub.types.js.map +1 -0
  164. package/dist/utils/device-fetcher.js +92 -0
  165. package/dist/utils/device-fetcher.js.map +1 -0
  166. package/dist/utils/devices.js +41 -0
  167. package/dist/utils/devices.js.map +1 -0
  168. package/dist/utils/docker-credentials.js +546 -0
  169. package/dist/utils/docker-credentials.js.map +1 -0
  170. package/dist/utils/emulated-device.js +91 -0
  171. package/dist/utils/emulated-device.js.map +1 -0
  172. package/dist/utils/index.js +180 -0
  173. package/dist/utils/index.js.map +1 -0
  174. package/dist/utils/modules.js +36 -0
  175. package/dist/utils/modules.js.map +1 -0
  176. package/dist/utils/org-selector.js +108 -0
  177. package/dist/utils/org-selector.js.map +1 -0
  178. package/dist/utils/proxy.js +31 -0
  179. package/dist/utils/proxy.js.map +1 -0
  180. package/dist/utils/registry-credentials.js +113 -0
  181. package/dist/utils/registry-credentials.js.map +1 -0
  182. package/dist/utils/statuses.js +124 -0
  183. package/dist/utils/statuses.js.map +1 -0
  184. package/dist/utils/templates.js +189 -0
  185. package/dist/utils/templates.js.map +1 -0
  186. package/dist/utils/tenant-storage.js +88 -0
  187. package/dist/utils/tenant-storage.js.map +1 -0
  188. package/dist/utils/vm.js +434 -0
  189. package/dist/utils/vm.js.map +1 -0
  190. package/dist/utils/with-spinner.js +20 -0
  191. package/dist/utils/with-spinner.js.map +1 -0
  192. package/package.json +103 -0
@@ -0,0 +1,156 @@
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 ws_1 = __importDefault(require("ws"));
8
+ const shell_1 = require("./shell");
9
+ async function getWebSocketDebuggerUrl(port) {
10
+ const response = await fetch(`http://localhost:${port}/json`);
11
+ const targets = await response.json();
12
+ const pageTarget = targets.find((target) => {
13
+ const url = new URL(target.url);
14
+ return (target.type === 'page' &&
15
+ (url.protocol === 'http:' || url.protocol === 'https:' || url.protocol === 'file:'));
16
+ });
17
+ if (!pageTarget) {
18
+ throw new Error('No suitable page target found');
19
+ }
20
+ return pageTarget.webSocketDebuggerUrl;
21
+ }
22
+ async function screenDevTools(deviceName, options) {
23
+ try {
24
+ const { url, port } = options;
25
+ let originalUrl = null;
26
+ let debuggerWs = null;
27
+ // Use provided port or generate random port for DevTools forwarding
28
+ const remotePort = port || Math.floor(10000 + ((Math.random() * 100000) % 10000));
29
+ console.log(chalk_1.default.dim(`Starting Chrome DevTools session on port ${remotePort}...`));
30
+ // Start shell with port forwarding
31
+ try {
32
+ const { shellPromise, process: shellProcess } = await (0, shell_1.shellImpl)(deviceName, {
33
+ L: `${remotePort}:localhost:3000`,
34
+ silent: true,
35
+ detached: true,
36
+ });
37
+ // Unref the child process to prevent it from keeping the event loop running
38
+ shellProcess?.unref();
39
+ // Handle cleanup on process exit
40
+ async function cleanup() {
41
+ if (originalUrl && debuggerWs) {
42
+ console.log(chalk_1.default.dim('Restoring original URL...'));
43
+ try {
44
+ const navigateCommand = {
45
+ id: 1,
46
+ method: 'Page.navigate',
47
+ params: { url: originalUrl },
48
+ };
49
+ debuggerWs.send(JSON.stringify(navigateCommand));
50
+ // Poll the /json endpoint until URL changes back
51
+ const maxAttempts = 20; // 10 seconds total (20 * 500ms)
52
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
53
+ await new Promise((resolve) => setTimeout(resolve, 500));
54
+ try {
55
+ const response = await fetch(`http://localhost:${remotePort}/json`);
56
+ const targets = await response.json();
57
+ const pageTarget = targets.find((target) => target.type === 'page');
58
+ if (pageTarget && pageTarget.url === originalUrl) {
59
+ debuggerWs.close();
60
+ console.log(chalk_1.default.green('Successfully restored original URL'));
61
+ return;
62
+ }
63
+ }
64
+ catch (error) {
65
+ console.log(chalk_1.default.yellow(`Failed to check navigation status: ${error.message}`));
66
+ }
67
+ }
68
+ throw new Error('Navigation timeout');
69
+ }
70
+ catch (error) {
71
+ console.log(chalk_1.default.yellow(`Failed to restore original URL: ${error.message}`));
72
+ throw error;
73
+ }
74
+ }
75
+ }
76
+ process.on('SIGINT', async () => {
77
+ await cleanup();
78
+ shellProcess?.kill();
79
+ await new Promise((resolve) => setTimeout(resolve, 500));
80
+ process.exit();
81
+ });
82
+ // Wait for the connection and port forwarding to establish
83
+ await new Promise((resolve) => setTimeout(resolve, 3000));
84
+ // Launch Chrome/Chromium with inspect page
85
+ console.log(chalk_1.default.dim('Opening Chrome DevTools inspector...'));
86
+ console.log(chalk_1.default.yellow('\nTo debug the remote target:'));
87
+ console.log(chalk_1.default.yellow('1. Click "Configure..." next to "Discover network targets" in Chrome DevTools'));
88
+ console.log(chalk_1.default.yellow(`2. Add "localhost:${remotePort}" to the target discovery settings`));
89
+ console.log(chalk_1.default.yellow('3. Wait for the target to appear under "Remote Target"\n'));
90
+ if (url) {
91
+ console.log(chalk_1.default.dim(`Waiting for debugger to be available...`));
92
+ await new Promise((resolve) => setTimeout(resolve, 5000));
93
+ try {
94
+ const debuggerUrl = await getWebSocketDebuggerUrl(remotePort);
95
+ debuggerWs = new ws_1.default(debuggerUrl);
96
+ // Save current URL and establish WebSocket connection
97
+ await new Promise((resolve, reject) => {
98
+ debuggerWs?.on('open', () => {
99
+ console.log(chalk_1.default.dim('WebSocket connection opened'));
100
+ const getUrlCommand = {
101
+ id: 1,
102
+ method: 'Page.getNavigationHistory',
103
+ };
104
+ debuggerWs?.send(JSON.stringify(getUrlCommand));
105
+ });
106
+ const onMessage = (data) => {
107
+ const response = JSON.parse(data.toString());
108
+ if (response.id === 1 && response.result?.entries?.length > 0) {
109
+ const currentEntry = response.result.entries[response.result.currentIndex];
110
+ originalUrl = currentEntry.url;
111
+ console.log(chalk_1.default.dim(`Saved original URL: ${originalUrl}`));
112
+ // Now navigate to the new URL
113
+ const navigateCommand = {
114
+ id: 2,
115
+ method: 'Page.navigate',
116
+ params: { url },
117
+ };
118
+ debuggerWs?.send(JSON.stringify(navigateCommand));
119
+ }
120
+ else if (response.id === 2) {
121
+ debuggerWs?.removeListener('message', onMessage);
122
+ console.log(chalk_1.default.green(`Successfully navigated to ${url}`));
123
+ resolve();
124
+ }
125
+ };
126
+ debuggerWs?.on('message', onMessage);
127
+ debuggerWs?.on('error', (error) => {
128
+ console.log(chalk_1.default.red(`WebSocket error: ${error.message}`));
129
+ reject(error);
130
+ });
131
+ });
132
+ }
133
+ catch (error) {
134
+ console.log(chalk_1.default.yellow(`Failed to navigate to URL: ${error.message}`));
135
+ console.log(chalk_1.default.yellow('You may need to navigate manually.'));
136
+ }
137
+ }
138
+ console.log(chalk_1.default.dim('\nPress Ctrl+C when done.'));
139
+ // Await the shell promise
140
+ await shellPromise;
141
+ return shellPromise;
142
+ }
143
+ catch (shellError) {
144
+ if (shellError.message && shellError.message.includes('Unauthorized')) {
145
+ throw new Error(`Unauthorized. Please run "phy login" to use this command.`);
146
+ }
147
+ throw shellError;
148
+ }
149
+ }
150
+ catch (error) {
151
+ console.error(chalk_1.default.red(error.toString()));
152
+ process.exit(1);
153
+ }
154
+ }
155
+ exports.default = screenDevTools;
156
+ //# sourceMappingURL=screen-devtools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screen-devtools.js","sourceRoot":"","sources":["../../../src/commands/dev/screen-devtools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const chalk_1 = __importDefault(require("chalk"));
40
+ const device_picker_1 = require("../app/device-picker");
41
+ const org_selector_1 = require("../../utils/org-selector");
42
+ const tenant_storage_1 = require("../../utils/tenant-storage");
43
+ const emulated_device_1 = require("../../utils/emulated-device");
44
+ /**
45
+ * Command to select a device for emulation
46
+ */
47
+ exports.default = async (options = {}) => {
48
+ try {
49
+ // Check if we need to clear the saved device
50
+ if (options.clear) {
51
+ await (0, emulated_device_1.clearEmulatedDevice)();
52
+ console.log(chalk_1.default.green('Cleared saved device.'));
53
+ return;
54
+ }
55
+ // Check if we already have a saved device
56
+ const hasDevice = await (0, emulated_device_1.hasEmulatedDevice)();
57
+ if (hasDevice) {
58
+ const device = await (0, emulated_device_1.getEmulatedDevice)();
59
+ const deviceInfo = device.displayName || device.deviceSerial
60
+ ? `${device.name} (ID: ${device.id}${device.deviceSerial ? `, Serial: ${device.deviceSerial}` : ''})`
61
+ : `${device.name} (${device.id})`;
62
+ console.log(chalk_1.default.green(`Current device: ${chalk_1.default.blue(deviceInfo)}`));
63
+ // Ask if the user wants to change it
64
+ const inquirer = (await Promise.resolve().then(() => __importStar(require('inquirer')))).default;
65
+ const { changeDevice } = await inquirer.prompt([
66
+ {
67
+ type: 'confirm',
68
+ name: 'changeDevice',
69
+ message: 'Would you like to select a different device?',
70
+ default: false,
71
+ },
72
+ ]);
73
+ if (!changeDevice) {
74
+ return;
75
+ }
76
+ }
77
+ // First check if we have a saved tenant
78
+ let organization;
79
+ if (await (0, tenant_storage_1.hasTenant)()) {
80
+ organization = await (0, tenant_storage_1.getTenant)();
81
+ console.log(chalk_1.default.dim(`Using saved tenant: ${organization.displayName}`));
82
+ }
83
+ else {
84
+ // Select a tenant if not already saved
85
+ organization = await (0, org_selector_1.selectOrganization)('Select an organization to find devices:');
86
+ }
87
+ if (!organization) {
88
+ console.log(chalk_1.default.yellow('No organization selected. Exiting.'));
89
+ return;
90
+ }
91
+ // Select a device from the chosen organization
92
+ console.log(chalk_1.default.dim('Please select a device for emulation:'));
93
+ const device = await (0, device_picker_1.selectDevice)(organization.slug);
94
+ if (!device) {
95
+ console.log(chalk_1.default.yellow('No device selected. Operation cancelled.'));
96
+ return;
97
+ }
98
+ // Save the selected device with all information for legibility
99
+ await (0, emulated_device_1.saveEmulatedDevice)({
100
+ id: device.id,
101
+ name: device.name,
102
+ accessKey: device.accessKey,
103
+ displayName: device.displayName,
104
+ deviceSerial: device.deviceSerial,
105
+ });
106
+ // Show more detailed device info in the success message
107
+ const deviceInfo = device.displayName || device.deviceSerial
108
+ ? `${device.name} (ID: ${device.id}${device.deviceSerial ? `, Serial: ${device.deviceSerial}` : ''})`
109
+ : `${device.name} (${device.id})`;
110
+ console.log(chalk_1.default.green(`Successfully selected device: ${chalk_1.default.blue(deviceInfo)}`));
111
+ console.log(chalk_1.default.dim('This device will be used for emulation in all screen applications.'));
112
+ }
113
+ catch (error) {
114
+ console.error(chalk_1.default.red(`Error selecting device: ${error.message}`));
115
+ process.exit(1);
116
+ }
117
+ };
118
+ //# sourceMappingURL=select.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"select.js","sourceRoot":"","sources":["../../../src/commands/dev/select.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAC1B,wDAAoD;AACpD,2DAA8D;AAC9D,+DAAkE;AAClE,iEAKqC;AAErC;;GAEG;AACH,kBAAe,KAAK,EAAE,UAA+B,EAAE,EAAE,EAAE;IACzD,IAAI,CAAC;QACH,6CAA6C;QAC7C,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,MAAM,IAAA,qCAAmB,GAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;YAClD,OAAO;QACT,CAAC;QAED,0CAA0C;QAC1C,MAAM,SAAS,GAAG,MAAM,IAAA,mCAAiB,GAAE,CAAC;QAC5C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,IAAA,mCAAiB,GAAE,CAAC;YACzC,MAAM,UAAU,GACd,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,YAAY;gBACvC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,EAAE,GAC9B,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAC7D,GAAG;gBACL,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC;YAEtC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,mBAAmB,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;YAEtE,qCAAqC;YACrC,MAAM,QAAQ,GAAG,CAAC,wDAAa,UAAU,GAAC,CAAC,CAAC,OAAO,CAAC;YACpD,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;gBAC7C;oBACE,IAAI,EAAE,SAAS;oBACf,IAAI,EAAE,cAAc;oBACpB,OAAO,EAAE,8CAA8C;oBACvD,OAAO,EAAE,KAAK;iBACf;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,OAAO;YACT,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,IAAI,YAAY,CAAC;QACjB,IAAI,MAAM,IAAA,0BAAS,GAAE,EAAE,CAAC;YACtB,YAAY,GAAG,MAAM,IAAA,0BAAS,GAAE,CAAC;YACjC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,uBAAuB,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;aAAM,CAAC;YACN,uCAAuC;YACvC,YAAY,GAAG,MAAM,IAAA,iCAAkB,EAAC,yCAAyC,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QAED,+CAA+C;QAC/C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC,CAAC;QAChE,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAY,EAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAErD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;YACtE,OAAO;QACT,CAAC;QAED,+DAA+D;QAC/D,MAAM,IAAA,oCAAkB,EAAC;YACvB,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAC;QAEH,wDAAwD;QACxD,MAAM,UAAU,GACd,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,YAAY;YACvC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,SAAS,MAAM,CAAC,EAAE,GAC9B,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAC7D,GAAG;YACL,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,GAAG,CAAC;QAEtC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,KAAK,CAAC,iCAAiC,eAAK,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAChF,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,2BAA2B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC"}
@@ -0,0 +1,171 @@
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.shellImpl = shellImpl;
7
+ /* eslint-disable @typescript-eslint/no-explicit-any */
8
+ /* eslint-disable @typescript-eslint/no-unused-vars */
9
+ const child_process_1 = __importDefault(require("child_process"));
10
+ const net_1 = __importDefault(require("net"));
11
+ const fs_1 = __importDefault(require("fs"));
12
+ const chalk_1 = __importDefault(require("chalk"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const os_1 = __importDefault(require("os"));
15
+ const utils_1 = require("../../utils");
16
+ const admin_api_1 = require("../../services/admin-api");
17
+ async function shellImpl(deviceName, options) {
18
+ let forward = options.L;
19
+ const { silent, detached } = options;
20
+ if (!silent)
21
+ console.log(chalk_1.default.dim('> creating keypair'));
22
+ const keyfile = path_1.default.join(os_1.default.tmpdir(), `gridapp${Math.floor(Math.random() * 1000)}.key`);
23
+ if (fs_1.default.existsSync(keyfile)) {
24
+ fs_1.default.unlinkSync(keyfile);
25
+ }
26
+ if (fs_1.default.existsSync(`${keyfile}.pub`)) {
27
+ fs_1.default.unlinkSync(`${keyfile}.pub`);
28
+ }
29
+ child_process_1.default.execSync(`ssh-keygen -t ed25519 -f ${keyfile} -N ""`);
30
+ const key = fs_1.default.readFileSync(`${keyfile}.pub`).toString();
31
+ let stream;
32
+ let isPhyos = true;
33
+ try {
34
+ if (!silent)
35
+ console.log(chalk_1.default.dim(`Connecting to PhyHub for device: ${deviceName}`));
36
+ const { stream: curStream, isPhyos: isPhyosDevice } = (0, utils_1.openStream)(await (0, admin_api_1.adminApi)().devices.startPhyHubDeviceShellSession(deviceName, { key }));
37
+ stream = curStream;
38
+ isPhyos = isPhyosDevice;
39
+ }
40
+ catch (err) {
41
+ if (err.message && err.message.includes('Unauthorized')) {
42
+ throw new Error(`Unauthorized. Please run "phy login" to use this command.`);
43
+ }
44
+ throw new Error(`Unable to establish connection to the device. Please try again. ${err}`);
45
+ }
46
+ let socketDataCounter = 0;
47
+ const keepAliveDurationSeconds = 25;
48
+ const timeoutDuration = 1000 * (keepAliveDurationSeconds + 5);
49
+ // Each interval lasts 30 seconds (timeoutDuration)
50
+ // 15 minutes = 15 × 60 = 900 seconds -> 900 seconds ÷ 30 seconds/interval = 30 intervals
51
+ const maxInactivityCount = 30; // 15 mins
52
+ let inactivityFlagCounter = 0;
53
+ let activityCheckInterval;
54
+ function startActivityCheckInterval() {
55
+ // Don't start activity check if detached mode is enabled
56
+ if (detached) {
57
+ return;
58
+ }
59
+ clearInterval(activityCheckInterval);
60
+ activityCheckInterval = setInterval(() => {
61
+ if (socketDataCounter > 3) {
62
+ inactivityFlagCounter = 0;
63
+ socketDataCounter = 0;
64
+ return;
65
+ }
66
+ inactivityFlagCounter += 1;
67
+ if (inactivityFlagCounter >= maxInactivityCount) {
68
+ console.log(chalk_1.default.dim('> No activity for ~15 min, terminating connection.'));
69
+ stream.destroy();
70
+ clearInterval(activityCheckInterval);
71
+ }
72
+ socketDataCounter = 0;
73
+ }, timeoutDuration);
74
+ }
75
+ stream.on('data', () => {
76
+ socketDataCounter += 1;
77
+ });
78
+ stream.on('connect', () => {
79
+ startActivityCheckInterval();
80
+ });
81
+ const port = Math.floor(10000 + ((Math.random() * 100000) % 10000));
82
+ let fwdPort = Math.floor(10000 + ((Math.random() * 100000) % 10000));
83
+ // support for -L fwdPort:host:dstPort option
84
+ if (forward) {
85
+ const split = forward.split(':');
86
+ if (split.length === 3) {
87
+ fwdPort = split.shift();
88
+ forward = split.join(':');
89
+ }
90
+ }
91
+ if (!silent)
92
+ console.log(chalk_1.default.dim('> waiting for client'));
93
+ // wait for a single connection
94
+ const connPromise = new Promise((resolve) => {
95
+ const server = net_1.default.createServer((c) => {
96
+ server.close();
97
+ resolve(c);
98
+ });
99
+ server.listen(port, () => {
100
+ if (!silent)
101
+ console.log(chalk_1.default.dim(`> ssh listening on port ${chalk_1.default.blue(port)}`));
102
+ });
103
+ });
104
+ const fwdOptions = forward ? ['-L', `0.0.0.0:${fwdPort}:${forward}`] : [];
105
+ const sshProcess = child_process_1.default.spawn('ssh', [
106
+ '-qtt',
107
+ `${isPhyos ? 'phygrid' : 'ombori'}@localhost`,
108
+ ...fwdOptions,
109
+ '-p',
110
+ `${port}`,
111
+ '-o',
112
+ 'UserKnownHostsFile=/dev/null',
113
+ '-o',
114
+ 'StrictHostKeyChecking=no',
115
+ '-o',
116
+ `ServerAliveInterval=${keepAliveDurationSeconds}`,
117
+ '-i',
118
+ keyfile,
119
+ ], {
120
+ stdio: silent ? 'ignore' : 'inherit',
121
+ detached,
122
+ });
123
+ // Prevent the child from receiving SIGINT
124
+ process.removeAllListeners('SIGINT');
125
+ const conn = await connPromise;
126
+ if (forward && !silent) {
127
+ const prefix = /:443$/.test(forward) ? 'https://' : 'http://';
128
+ console.log(chalk_1.default.dim(`> port ${chalk_1.default.blue(`${prefix}${forward}`)} fowarded to ${chalk_1.default.bold(chalk_1.default.green(`${prefix}localhost:${fwdPort}`))}`));
129
+ }
130
+ if (!silent)
131
+ console.log(chalk_1.default.dim('> client connected'));
132
+ conn.on('end', () => {
133
+ if (!silent)
134
+ console.log(chalk_1.default.dim('> client disconnected'));
135
+ });
136
+ // removing key file
137
+ setTimeout(() => {
138
+ fs_1.default.unlinkSync(keyfile);
139
+ }, 10000);
140
+ return {
141
+ shellPromise: new Promise((resolve, reject) => {
142
+ conn.pipe(stream);
143
+ stream.pipe(conn);
144
+ stream.on('error', () => {
145
+ if (!silent)
146
+ console.log(chalk_1.default.red('> socket error'));
147
+ clearInterval(activityCheckInterval);
148
+ reject();
149
+ });
150
+ stream.on('close', (e) => {
151
+ if (!silent)
152
+ console.log(chalk_1.default.dim('> socket closed'));
153
+ clearInterval(activityCheckInterval);
154
+ resolve();
155
+ });
156
+ }),
157
+ process: sshProcess,
158
+ };
159
+ }
160
+ async function shell(deviceName, options) {
161
+ try {
162
+ const { shellPromise, process } = await shellImpl(deviceName, options);
163
+ await shellPromise;
164
+ }
165
+ catch (error) {
166
+ console.error(chalk_1.default.red(error.toString()));
167
+ process.exit(1);
168
+ }
169
+ }
170
+ exports.default = shell;
171
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../../src/commands/dev/shell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,75 @@
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
+ try {
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...'));
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, [
56
+ 'WarnUnencrypted=0',
57
+ 'SecurityNotificationTimeout=0',
58
+ vncTarget,
59
+ ]);
60
+ }
61
+ console.log(chalk_1.default.dim(`VNC connection established at ${vncTarget}. Press Ctrl+C when done.`));
62
+ return shellPromise;
63
+ }
64
+ catch (error) {
65
+ if (error.message && error.message.includes('Unauthorized')) {
66
+ console.error(chalk_1.default.red(`Unauthorized. Please run "phy login" to use this command.`));
67
+ }
68
+ else {
69
+ console.error(chalk_1.default.red(error.toString()));
70
+ }
71
+ process.exit(1);
72
+ }
73
+ }
74
+ exports.default = vnc;
75
+ //# sourceMappingURL=vnc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vnc.js","sourceRoot":"","sources":["../../../src/commands/dev/vnc.ts"],"names":[],"mappings":"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"}