@miosa/cli 0.2.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 (294) hide show
  1. package/README.md +327 -0
  2. package/dist/bin/miosa.d.ts +3 -0
  3. package/dist/bin/miosa.d.ts.map +1 -0
  4. package/dist/bin/miosa.js +139 -0
  5. package/dist/bin/miosa.js.map +1 -0
  6. package/dist/client.d.ts +74 -0
  7. package/dist/client.d.ts.map +1 -0
  8. package/dist/client.js +523 -0
  9. package/dist/client.js.map +1 -0
  10. package/dist/commands/agent.d.ts +18 -0
  11. package/dist/commands/agent.d.ts.map +1 -0
  12. package/dist/commands/agent.js +468 -0
  13. package/dist/commands/agent.js.map +1 -0
  14. package/dist/commands/alerts.d.ts +3 -0
  15. package/dist/commands/alerts.d.ts.map +1 -0
  16. package/dist/commands/alerts.js +41 -0
  17. package/dist/commands/alerts.js.map +1 -0
  18. package/dist/commands/api-keys.d.ts +3 -0
  19. package/dist/commands/api-keys.d.ts.map +1 -0
  20. package/dist/commands/api-keys.js +119 -0
  21. package/dist/commands/api-keys.js.map +1 -0
  22. package/dist/commands/api-resource.d.ts +20 -0
  23. package/dist/commands/api-resource.d.ts.map +1 -0
  24. package/dist/commands/api-resource.js +120 -0
  25. package/dist/commands/api-resource.js.map +1 -0
  26. package/dist/commands/apps.d.ts +3 -0
  27. package/dist/commands/apps.d.ts.map +1 -0
  28. package/dist/commands/apps.js +218 -0
  29. package/dist/commands/apps.js.map +1 -0
  30. package/dist/commands/audit.d.ts +3 -0
  31. package/dist/commands/audit.d.ts.map +1 -0
  32. package/dist/commands/audit.js +25 -0
  33. package/dist/commands/audit.js.map +1 -0
  34. package/dist/commands/auth.d.ts +3 -0
  35. package/dist/commands/auth.d.ts.map +1 -0
  36. package/dist/commands/auth.js +363 -0
  37. package/dist/commands/auth.js.map +1 -0
  38. package/dist/commands/backups.d.ts +3 -0
  39. package/dist/commands/backups.d.ts.map +1 -0
  40. package/dist/commands/backups.js +23 -0
  41. package/dist/commands/backups.js.map +1 -0
  42. package/dist/commands/checkpoints.d.ts +3 -0
  43. package/dist/commands/checkpoints.d.ts.map +1 -0
  44. package/dist/commands/checkpoints.js +33 -0
  45. package/dist/commands/checkpoints.js.map +1 -0
  46. package/dist/commands/computers.d.ts +3 -0
  47. package/dist/commands/computers.d.ts.map +1 -0
  48. package/dist/commands/computers.js +118 -0
  49. package/dist/commands/computers.js.map +1 -0
  50. package/dist/commands/config.d.ts +3 -0
  51. package/dist/commands/config.d.ts.map +1 -0
  52. package/dist/commands/config.js +114 -0
  53. package/dist/commands/config.js.map +1 -0
  54. package/dist/commands/connect.d.ts +3 -0
  55. package/dist/commands/connect.d.ts.map +1 -0
  56. package/dist/commands/connect.js +96 -0
  57. package/dist/commands/connect.js.map +1 -0
  58. package/dist/commands/containers.d.ts +3 -0
  59. package/dist/commands/containers.d.ts.map +1 -0
  60. package/dist/commands/containers.js +20 -0
  61. package/dist/commands/containers.js.map +1 -0
  62. package/dist/commands/cp.d.ts +3 -0
  63. package/dist/commands/cp.d.ts.map +1 -0
  64. package/dist/commands/cp.js +102 -0
  65. package/dist/commands/cp.js.map +1 -0
  66. package/dist/commands/cron.d.ts +3 -0
  67. package/dist/commands/cron.d.ts.map +1 -0
  68. package/dist/commands/cron.js +65 -0
  69. package/dist/commands/cron.js.map +1 -0
  70. package/dist/commands/databases.d.ts +3 -0
  71. package/dist/commands/databases.d.ts.map +1 -0
  72. package/dist/commands/databases.js +222 -0
  73. package/dist/commands/databases.js.map +1 -0
  74. package/dist/commands/db.d.ts +3 -0
  75. package/dist/commands/db.d.ts.map +1 -0
  76. package/dist/commands/db.js +174 -0
  77. package/dist/commands/db.js.map +1 -0
  78. package/dist/commands/deploy.d.ts +3 -0
  79. package/dist/commands/deploy.d.ts.map +1 -0
  80. package/dist/commands/deploy.js +579 -0
  81. package/dist/commands/deploy.js.map +1 -0
  82. package/dist/commands/desktop.d.ts +3 -0
  83. package/dist/commands/desktop.d.ts.map +1 -0
  84. package/dist/commands/desktop.js +276 -0
  85. package/dist/commands/desktop.js.map +1 -0
  86. package/dist/commands/dev.d.ts +3 -0
  87. package/dist/commands/dev.d.ts.map +1 -0
  88. package/dist/commands/dev.js +246 -0
  89. package/dist/commands/dev.js.map +1 -0
  90. package/dist/commands/doctor.d.ts +3 -0
  91. package/dist/commands/doctor.d.ts.map +1 -0
  92. package/dist/commands/doctor.js +241 -0
  93. package/dist/commands/doctor.js.map +1 -0
  94. package/dist/commands/domains.d.ts +3 -0
  95. package/dist/commands/domains.d.ts.map +1 -0
  96. package/dist/commands/domains.js +31 -0
  97. package/dist/commands/domains.js.map +1 -0
  98. package/dist/commands/enterprise-util.d.ts +37 -0
  99. package/dist/commands/enterprise-util.d.ts.map +1 -0
  100. package/dist/commands/enterprise-util.js +185 -0
  101. package/dist/commands/enterprise-util.js.map +1 -0
  102. package/dist/commands/exec.d.ts +3 -0
  103. package/dist/commands/exec.d.ts.map +1 -0
  104. package/dist/commands/exec.js +68 -0
  105. package/dist/commands/exec.js.map +1 -0
  106. package/dist/commands/functions.d.ts +3 -0
  107. package/dist/commands/functions.d.ts.map +1 -0
  108. package/dist/commands/functions.js +47 -0
  109. package/dist/commands/functions.js.map +1 -0
  110. package/dist/commands/gha-runners.d.ts +3 -0
  111. package/dist/commands/gha-runners.d.ts.map +1 -0
  112. package/dist/commands/gha-runners.js +33 -0
  113. package/dist/commands/gha-runners.js.map +1 -0
  114. package/dist/commands/groups.d.ts +3 -0
  115. package/dist/commands/groups.d.ts.map +1 -0
  116. package/dist/commands/groups.js +38 -0
  117. package/dist/commands/groups.js.map +1 -0
  118. package/dist/commands/host.d.ts +3 -0
  119. package/dist/commands/host.d.ts.map +1 -0
  120. package/dist/commands/host.js +74 -0
  121. package/dist/commands/host.js.map +1 -0
  122. package/dist/commands/hosts.d.ts +3 -0
  123. package/dist/commands/hosts.d.ts.map +1 -0
  124. package/dist/commands/hosts.js +90 -0
  125. package/dist/commands/hosts.js.map +1 -0
  126. package/dist/commands/link.d.ts +8 -0
  127. package/dist/commands/link.d.ts.map +1 -0
  128. package/dist/commands/link.js +124 -0
  129. package/dist/commands/link.js.map +1 -0
  130. package/dist/commands/login.d.ts +3 -0
  131. package/dist/commands/login.d.ts.map +1 -0
  132. package/dist/commands/login.js +172 -0
  133. package/dist/commands/login.js.map +1 -0
  134. package/dist/commands/logout.d.ts +3 -0
  135. package/dist/commands/logout.d.ts.map +1 -0
  136. package/dist/commands/logout.js +17 -0
  137. package/dist/commands/logout.js.map +1 -0
  138. package/dist/commands/logs.d.ts +3 -0
  139. package/dist/commands/logs.d.ts.map +1 -0
  140. package/dist/commands/logs.js +94 -0
  141. package/dist/commands/logs.js.map +1 -0
  142. package/dist/commands/ls.d.ts +3 -0
  143. package/dist/commands/ls.d.ts.map +1 -0
  144. package/dist/commands/ls.js +67 -0
  145. package/dist/commands/ls.js.map +1 -0
  146. package/dist/commands/machines.d.ts +3 -0
  147. package/dist/commands/machines.d.ts.map +1 -0
  148. package/dist/commands/machines.js +29 -0
  149. package/dist/commands/machines.js.map +1 -0
  150. package/dist/commands/mcp.d.ts +21 -0
  151. package/dist/commands/mcp.d.ts.map +1 -0
  152. package/dist/commands/mcp.js +1021 -0
  153. package/dist/commands/mcp.js.map +1 -0
  154. package/dist/commands/meshes.d.ts +3 -0
  155. package/dist/commands/meshes.d.ts.map +1 -0
  156. package/dist/commands/meshes.js +27 -0
  157. package/dist/commands/meshes.js.map +1 -0
  158. package/dist/commands/network-policy.d.ts +3 -0
  159. package/dist/commands/network-policy.d.ts.map +1 -0
  160. package/dist/commands/network-policy.js +40 -0
  161. package/dist/commands/network-policy.js.map +1 -0
  162. package/dist/commands/project.d.ts +4 -0
  163. package/dist/commands/project.d.ts.map +1 -0
  164. package/dist/commands/project.js +25 -0
  165. package/dist/commands/project.js.map +1 -0
  166. package/dist/commands/pull.d.ts +3 -0
  167. package/dist/commands/pull.d.ts.map +1 -0
  168. package/dist/commands/pull.js +155 -0
  169. package/dist/commands/pull.js.map +1 -0
  170. package/dist/commands/regions.d.ts +3 -0
  171. package/dist/commands/regions.d.ts.map +1 -0
  172. package/dist/commands/regions.js +67 -0
  173. package/dist/commands/regions.js.map +1 -0
  174. package/dist/commands/releases.d.ts +3 -0
  175. package/dist/commands/releases.d.ts.map +1 -0
  176. package/dist/commands/releases.js +176 -0
  177. package/dist/commands/releases.js.map +1 -0
  178. package/dist/commands/rm.d.ts +3 -0
  179. package/dist/commands/rm.d.ts.map +1 -0
  180. package/dist/commands/rm.js +42 -0
  181. package/dist/commands/rm.js.map +1 -0
  182. package/dist/commands/run.d.ts +3 -0
  183. package/dist/commands/run.d.ts.map +1 -0
  184. package/dist/commands/run.js +131 -0
  185. package/dist/commands/run.js.map +1 -0
  186. package/dist/commands/sandbox.d.ts +3 -0
  187. package/dist/commands/sandbox.d.ts.map +1 -0
  188. package/dist/commands/sandbox.js +352 -0
  189. package/dist/commands/sandbox.js.map +1 -0
  190. package/dist/commands/schedules.d.ts +3 -0
  191. package/dist/commands/schedules.d.ts.map +1 -0
  192. package/dist/commands/schedules.js +37 -0
  193. package/dist/commands/schedules.js.map +1 -0
  194. package/dist/commands/secrets.d.ts +3 -0
  195. package/dist/commands/secrets.d.ts.map +1 -0
  196. package/dist/commands/secrets.js +194 -0
  197. package/dist/commands/secrets.js.map +1 -0
  198. package/dist/commands/services.d.ts +3 -0
  199. package/dist/commands/services.d.ts.map +1 -0
  200. package/dist/commands/services.js +70 -0
  201. package/dist/commands/services.js.map +1 -0
  202. package/dist/commands/shell.d.ts +16 -0
  203. package/dist/commands/shell.d.ts.map +1 -0
  204. package/dist/commands/shell.js +527 -0
  205. package/dist/commands/shell.js.map +1 -0
  206. package/dist/commands/snapshot.d.ts +10 -0
  207. package/dist/commands/snapshot.d.ts.map +1 -0
  208. package/dist/commands/snapshot.js +181 -0
  209. package/dist/commands/snapshot.js.map +1 -0
  210. package/dist/commands/ssh.d.ts +3 -0
  211. package/dist/commands/ssh.d.ts.map +1 -0
  212. package/dist/commands/ssh.js +37 -0
  213. package/dist/commands/ssh.js.map +1 -0
  214. package/dist/commands/status.d.ts +3 -0
  215. package/dist/commands/status.d.ts.map +1 -0
  216. package/dist/commands/status.js +300 -0
  217. package/dist/commands/status.js.map +1 -0
  218. package/dist/commands/storage.d.ts +3 -0
  219. package/dist/commands/storage.d.ts.map +1 -0
  220. package/dist/commands/storage.js +180 -0
  221. package/dist/commands/storage.js.map +1 -0
  222. package/dist/commands/tenant.d.ts +3 -0
  223. package/dist/commands/tenant.d.ts.map +1 -0
  224. package/dist/commands/tenant.js +87 -0
  225. package/dist/commands/tenant.js.map +1 -0
  226. package/dist/commands/tunnel.d.ts +3 -0
  227. package/dist/commands/tunnel.d.ts.map +1 -0
  228. package/dist/commands/tunnel.js +418 -0
  229. package/dist/commands/tunnel.js.map +1 -0
  230. package/dist/commands/up.d.ts +14 -0
  231. package/dist/commands/up.d.ts.map +1 -0
  232. package/dist/commands/up.js +703 -0
  233. package/dist/commands/up.js.map +1 -0
  234. package/dist/commands/util.d.ts +19 -0
  235. package/dist/commands/util.d.ts.map +1 -0
  236. package/dist/commands/util.js +116 -0
  237. package/dist/commands/util.js.map +1 -0
  238. package/dist/commands/volumes.d.ts +3 -0
  239. package/dist/commands/volumes.d.ts.map +1 -0
  240. package/dist/commands/volumes.js +196 -0
  241. package/dist/commands/volumes.js.map +1 -0
  242. package/dist/commands/watch.d.ts +3 -0
  243. package/dist/commands/watch.d.ts.map +1 -0
  244. package/dist/commands/watch.js +398 -0
  245. package/dist/commands/watch.js.map +1 -0
  246. package/dist/commands/webhooks.d.ts +3 -0
  247. package/dist/commands/webhooks.d.ts.map +1 -0
  248. package/dist/commands/webhooks.js +23 -0
  249. package/dist/commands/webhooks.js.map +1 -0
  250. package/dist/commands/whoami.d.ts +3 -0
  251. package/dist/commands/whoami.d.ts.map +1 -0
  252. package/dist/commands/whoami.js +84 -0
  253. package/dist/commands/whoami.js.map +1 -0
  254. package/dist/commands/workspaces.d.ts +3 -0
  255. package/dist/commands/workspaces.d.ts.map +1 -0
  256. package/dist/commands/workspaces.js +87 -0
  257. package/dist/commands/workspaces.js.map +1 -0
  258. package/dist/config.d.ts +28 -0
  259. package/dist/config.d.ts.map +1 -0
  260. package/dist/config.js +129 -0
  261. package/dist/config.js.map +1 -0
  262. package/dist/errors.d.ts +22 -0
  263. package/dist/errors.d.ts.map +1 -0
  264. package/dist/errors.js +62 -0
  265. package/dist/errors.js.map +1 -0
  266. package/dist/framework-detector.d.ts +22 -0
  267. package/dist/framework-detector.d.ts.map +1 -0
  268. package/dist/framework-detector.js +373 -0
  269. package/dist/framework-detector.js.map +1 -0
  270. package/dist/pty/raw-mode.d.ts +7 -0
  271. package/dist/pty/raw-mode.d.ts.map +1 -0
  272. package/dist/pty/raw-mode.js +22 -0
  273. package/dist/pty/raw-mode.js.map +1 -0
  274. package/dist/pty/ws-pty-client.d.ts +12 -0
  275. package/dist/pty/ws-pty-client.d.ts.map +1 -0
  276. package/dist/pty/ws-pty-client.js +69 -0
  277. package/dist/pty/ws-pty-client.js.map +1 -0
  278. package/dist/types.d.ts +326 -0
  279. package/dist/types.d.ts.map +1 -0
  280. package/dist/types.js +16 -0
  281. package/dist/types.js.map +1 -0
  282. package/dist/ui/progress.d.ts +10 -0
  283. package/dist/ui/progress.d.ts.map +1 -0
  284. package/dist/ui/progress.js +36 -0
  285. package/dist/ui/progress.js.map +1 -0
  286. package/dist/ui/spinner.d.ts +4 -0
  287. package/dist/ui/spinner.d.ts.map +1 -0
  288. package/dist/ui/spinner.js +7 -0
  289. package/dist/ui/spinner.js.map +1 -0
  290. package/dist/ui/table.d.ts +8 -0
  291. package/dist/ui/table.d.ts.map +1 -0
  292. package/dist/ui/table.js +46 -0
  293. package/dist/ui/table.js.map +1 -0
  294. package/package.json +53 -0
@@ -0,0 +1,418 @@
1
+ import { createServer } from "node:net";
2
+ import * as http from "node:http";
3
+ import * as https from "node:https";
4
+ import chalk from "chalk";
5
+ import { loadConfig } from "../config.js";
6
+ import { MiosaClient } from "../client.js";
7
+ import { handleError } from "./util.js";
8
+ import { renderTable } from "../ui/table.js";
9
+ import { spin } from "../ui/spinner.js";
10
+ import { parseSse } from "../client.js";
11
+ import { formatBytes } from "../ui/progress.js";
12
+ function parsePortSpec(spec) {
13
+ const parts = spec.split(":");
14
+ if (parts.length === 1) {
15
+ const port = parseInt(spec, 10);
16
+ if (isNaN(port) || port < 1 || port > 65535) {
17
+ throw new Error(`Invalid port: ${spec}`);
18
+ }
19
+ return { remotePort: port, localPort: port };
20
+ }
21
+ if (parts.length === 2) {
22
+ const remote = parseInt(parts[0] ?? "", 10);
23
+ const local = parseInt(parts[1] ?? "", 10);
24
+ if (isNaN(remote) || remote < 1 || remote > 65535) {
25
+ throw new Error(`Invalid remote port in spec "${spec}"`);
26
+ }
27
+ if (isNaN(local) || local < 1 || local > 65535) {
28
+ throw new Error(`Invalid local port in spec "${spec}"`);
29
+ }
30
+ return { remotePort: remote, localPort: local };
31
+ }
32
+ throw new Error(`Invalid port spec "${spec}". Use "5432" or "5432:15432" (remote:local).`);
33
+ }
34
+ // ── HTTP proxy for a single TCP socket via the compute proxy ──────────────
35
+ //
36
+ // The compute proxy at {port}-{slug}.computer.miosa.ai already forwards HTTP
37
+ // requests to the VM's internal IP at the given port. Each incoming TCP
38
+ // connection is expected to speak HTTP. We relay it by acting as a transparent
39
+ // HTTP reverse proxy: buffer the incoming request, issue it to the upstream
40
+ // compute proxy URL, and pipe the response back.
41
+ //
42
+ // For WebSocket upgrade connections we handle the Upgrade header and pipe
43
+ // bidirectionally so that WS-based services (like noVNC, live-reload) work.
44
+ function proxySocket(socket, upstreamBase, apiKey, stats) {
45
+ stats.activeConnections++;
46
+ stats.totalConnections++;
47
+ let closed = false;
48
+ function cleanup() {
49
+ if (closed)
50
+ return;
51
+ closed = true;
52
+ stats.activeConnections = Math.max(0, stats.activeConnections - 1);
53
+ if (!socket.destroyed)
54
+ socket.destroy();
55
+ }
56
+ socket.on("close", cleanup);
57
+ socket.on("error", cleanup);
58
+ // Parse URL once — determine whether to use http or https module
59
+ const upstreamUrl = new URL(upstreamBase);
60
+ const isHttps = upstreamUrl.protocol === "https:";
61
+ const agent = isHttps
62
+ ? new https.Agent({ keepAlive: true })
63
+ : new http.Agent({ keepAlive: true });
64
+ // Read the raw incoming HTTP request from the local TCP socket, then replay
65
+ // it to the upstream compute proxy with the auth header injected.
66
+ //
67
+ // We collect the first chunk (which contains the HTTP request line + headers)
68
+ // and use Node's http.IncomingParser implicitly by building a one-shot server
69
+ // response for parsing. Instead, we create a temporary HTTP server bound to
70
+ // a pipe so Node parses the incoming request for us.
71
+ // Strategy: wrap the socket in a one-shot http.Server so Node parses the
72
+ // request headers; then replay to upstream.
73
+ const tempServer = http.createServer((req, res) => {
74
+ const targetUrl = new URL(req.url ?? "/", upstreamBase);
75
+ const options = {
76
+ hostname: upstreamUrl.hostname,
77
+ port: upstreamUrl.port || (isHttps ? 443 : 80),
78
+ path: `${targetUrl.pathname}${targetUrl.search}`,
79
+ method: req.method,
80
+ headers: {
81
+ ...req.headers,
82
+ host: upstreamUrl.host,
83
+ authorization: `Bearer ${apiKey}`,
84
+ },
85
+ agent,
86
+ };
87
+ // Handle WebSocket upgrade
88
+ if (req.headers.upgrade &&
89
+ req.headers.upgrade.toLowerCase() === "websocket") {
90
+ // Emit upgrade via the same request — handled below
91
+ return;
92
+ }
93
+ const proxyReq = (isHttps ? https : http).request(options, (proxyRes) => {
94
+ stats.bytesOut += 1;
95
+ res.writeHead(proxyRes.statusCode ?? 502, proxyRes.headers);
96
+ proxyRes.on("data", (chunk) => {
97
+ stats.bytesOut += chunk.length;
98
+ });
99
+ proxyRes.pipe(res, { end: true });
100
+ });
101
+ proxyReq.on("error", () => {
102
+ if (!res.headersSent) {
103
+ res.writeHead(502);
104
+ res.end("Bad Gateway");
105
+ }
106
+ cleanup();
107
+ });
108
+ req.on("data", (chunk) => {
109
+ stats.bytesIn += chunk.length;
110
+ });
111
+ req.pipe(proxyReq, { end: true });
112
+ });
113
+ // Handle WebSocket upgrades through the temp server
114
+ tempServer.on("upgrade", (req, clientSocket, head) => {
115
+ const options = {
116
+ hostname: upstreamUrl.hostname,
117
+ port: upstreamUrl.port || (isHttps ? 443 : 80),
118
+ path: req.url ?? "/",
119
+ method: "GET",
120
+ headers: {
121
+ ...req.headers,
122
+ host: upstreamUrl.host,
123
+ authorization: `Bearer ${apiKey}`,
124
+ },
125
+ agent,
126
+ };
127
+ const proxyReq = (isHttps ? https : http).request(options);
128
+ proxyReq.on("upgrade", (_proxyRes, proxySocket, proxyHead) => {
129
+ clientSocket.write("HTTP/1.1 101 Switching Protocols\r\n" +
130
+ "Upgrade: websocket\r\n" +
131
+ "Connection: Upgrade\r\n\r\n");
132
+ if (proxyHead && proxyHead.length)
133
+ proxySocket.unshift(proxyHead);
134
+ proxySocket.pipe(clientSocket);
135
+ clientSocket.pipe(proxySocket);
136
+ stats.bytesIn += head.length;
137
+ proxySocket.on("error", () => clientSocket.destroy());
138
+ clientSocket.on("error", () => proxySocket.destroy());
139
+ });
140
+ proxyReq.on("error", () => clientSocket.destroy());
141
+ if (head && head.length)
142
+ proxyReq.write(head);
143
+ proxyReq.end();
144
+ });
145
+ // Attach the raw socket to the temp HTTP server so Node parses the request
146
+ tempServer.emit("connection", socket);
147
+ }
148
+ // Build the compute proxy base URL for a given port and computer slug.
149
+ //
150
+ // The compute proxy router handles the pattern:
151
+ // {port}-{slug}.computer.miosa.ai → VM internal IP : <port> (HTTP)
152
+ //
153
+ // This is the only working path for computer port forwarding right now.
154
+ // The proxy speaks HTTP only — connections that arrive as raw TCP (postgres,
155
+ // redis, etc.) will not traverse it correctly. HTTP and WebSocket-based
156
+ // services (web apps, REST APIs, live-reload) work fine.
157
+ function buildProxyBaseUrl(slug, remotePort) {
158
+ return `https://${remotePort}-${slug}.computer.miosa.ai`;
159
+ }
160
+ async function runForward(computerId, portSpecs, opts) {
161
+ const config = loadConfig();
162
+ const client = new MiosaClient(config);
163
+ const apiKey = config.api_key;
164
+ if (!apiKey) {
165
+ throw new Error("Not authenticated. Run: miosa auth login");
166
+ }
167
+ // Resolve the computer record to get its slug, which drives the proxy URL.
168
+ const spinner = spin(`Resolving computer ${computerId}...`);
169
+ const record = await client.apiGet(`/api/v1/computers/${encodeURIComponent(computerId)}`);
170
+ spinner.stop();
171
+ const computer = record.data;
172
+ const slug = computer.slug ?? computer.id;
173
+ if (!slug) {
174
+ throw new Error(`Could not determine slug for computer ${computerId}. Ensure the computer exists and is running.`);
175
+ }
176
+ const allStats = portSpecs.map((spec) => ({
177
+ spec,
178
+ activeConnections: 0,
179
+ totalConnections: 0,
180
+ bytesIn: 0,
181
+ bytesOut: 0,
182
+ }));
183
+ const servers = await Promise.all(portSpecs.map(async (spec, idx) => {
184
+ const stats = allStats[idx];
185
+ // Build upstream URL: https://{port}-{slug}.computer.miosa.ai
186
+ // The compute proxy routes this to the VM's internal IP at `spec.remotePort`.
187
+ const upstreamBase = buildProxyBaseUrl(slug, spec.remotePort);
188
+ return new Promise((resolve, reject) => {
189
+ const server = createServer((socket) => {
190
+ proxySocket(socket, upstreamBase, String(apiKey), stats);
191
+ });
192
+ server.on("error", (err) => {
193
+ if (err.code === "EADDRINUSE") {
194
+ reject(new Error(`Port ${spec.localPort} is already in use. Use "remote:local" syntax to choose a different local port.`));
195
+ }
196
+ else {
197
+ reject(err);
198
+ }
199
+ });
200
+ server.listen(spec.localPort, "127.0.0.1", () => {
201
+ resolve(server);
202
+ });
203
+ });
204
+ }));
205
+ // Print the tunnel table
206
+ if (opts.json) {
207
+ console.log(JSON.stringify(portSpecs.map((s) => ({
208
+ computer_id: computerId,
209
+ remote_port: s.remotePort,
210
+ local_port: s.localPort,
211
+ local_url: `localhost:${s.localPort}`,
212
+ })), null, 2));
213
+ }
214
+ else {
215
+ if (portSpecs.length === 1) {
216
+ const spec = portSpecs[0];
217
+ console.log(`${chalk.green("Tunneling")} ${chalk.cyan(computerId)}:${chalk.bold(String(spec.remotePort))} ${chalk.dim("→")} ${chalk.cyan(`localhost:${spec.localPort}`)}`);
218
+ }
219
+ else {
220
+ console.log(`${chalk.green("Tunneling:")}`);
221
+ for (const spec of portSpecs) {
222
+ console.log(` ${chalk.cyan(computerId)}:${chalk.bold(String(spec.remotePort))} ${chalk.dim("→")} ${chalk.cyan(`localhost:${spec.localPort}`)}`);
223
+ }
224
+ }
225
+ console.log(chalk.dim("Press Ctrl+C to close\n"));
226
+ }
227
+ // Stats ticker — print connection/byte counts every 5s when there is activity
228
+ const ticker = setInterval(() => {
229
+ if (opts.json)
230
+ return;
231
+ const active = allStats.reduce((n, s) => n + s.activeConnections, 0);
232
+ if (active === 0)
233
+ return;
234
+ const totalIn = allStats.reduce((n, s) => n + s.bytesIn, 0);
235
+ const totalOut = allStats.reduce((n, s) => n + s.bytesOut, 0);
236
+ process.stderr.write(chalk.dim(`\r[${new Date().toLocaleTimeString()}] connections: ${active} ↑ ${formatBytes(totalIn)} ↓ ${formatBytes(totalOut)} `));
237
+ }, 5_000);
238
+ // Graceful shutdown — resolves the wait promise so the async function
239
+ // returns cleanly. process.exit(0) is called after so the real CLI exits,
240
+ // but in tests (where process.exit is mocked) the promise still settles.
241
+ let resolveWait;
242
+ const waitForSignal = new Promise((resolve) => {
243
+ resolveWait = resolve;
244
+ });
245
+ async function shutdown() {
246
+ clearInterval(ticker);
247
+ process.stderr.write("\n");
248
+ if (!opts.json) {
249
+ process.stdout.write(chalk.dim("\nClosing tunnels...\n"));
250
+ }
251
+ await Promise.all(servers.map((server) => new Promise((resolve) => server.close(() => resolve()))));
252
+ resolveWait();
253
+ process.exit(0);
254
+ }
255
+ process.on("SIGINT", () => void shutdown());
256
+ process.on("SIGTERM", () => void shutdown());
257
+ await waitForSignal;
258
+ }
259
+ // ── register ───────────────────────────────────────────────────────────────
260
+ export function register(program) {
261
+ const tunnelCmd = program
262
+ .command("tunnel")
263
+ .alias("tunnels")
264
+ .description("Manage tunnels and port forwarding");
265
+ // ── open (public host tunnel) ────────────────────────────────────────────
266
+ tunnelCmd
267
+ .command("open <host>")
268
+ .description("Open a public tunnel on a host port")
269
+ .requiredOption("--port <n>", "Local port on the host to expose", parseInt)
270
+ .option("--name <slug>", "Optional tunnel name/slug")
271
+ .option("--watch", "Stay open and stream live tunnel events")
272
+ .action(async (hostArg, opts) => {
273
+ try {
274
+ const config = loadConfig();
275
+ const client = new MiosaClient(config);
276
+ const spinner = spin(`Resolving host ${hostArg}...`);
277
+ const host = await client.getHost(hostArg);
278
+ spinner.text = "Opening tunnel...";
279
+ const tunnel = await client.createTunnel(host.id, {
280
+ port: opts.port,
281
+ name: opts.name,
282
+ });
283
+ spinner.succeed(`Tunnel open: ${chalk.cyan(tunnel.public_url)}`);
284
+ console.log(chalk.dim(` Slug: ${tunnel.slug} Port: ${tunnel.port}`));
285
+ if (opts.watch) {
286
+ console.log(chalk.dim("\nWatching for events (Ctrl+C to stop)..."));
287
+ const res = await client.watchEvents(host.id);
288
+ for await (const event of parseSse(res.body)) {
289
+ if (event.type === "heartbeat")
290
+ continue;
291
+ const ts = new Date().toLocaleTimeString();
292
+ console.log(`${chalk.dim(ts)} ${chalk.yellow(event.type)} ${formatEvent(event)}`);
293
+ }
294
+ }
295
+ }
296
+ catch (err) {
297
+ handleError(err);
298
+ }
299
+ });
300
+ // ── list ─────────────────────────────────────────────────────────────────
301
+ tunnelCmd
302
+ .command("list <host>")
303
+ .alias("ls")
304
+ .description("List tunnels on a host")
305
+ .option("--json", "Output as JSON")
306
+ .action(async (hostArg, opts) => {
307
+ try {
308
+ const config = loadConfig();
309
+ const client = new MiosaClient(config);
310
+ const host = await client.getHost(hostArg);
311
+ const tunnels = await client.listTunnels(host.id);
312
+ if (opts.json) {
313
+ console.log(JSON.stringify(tunnels, null, 2));
314
+ return;
315
+ }
316
+ if (tunnels.length === 0) {
317
+ console.log(chalk.dim("No tunnels."));
318
+ return;
319
+ }
320
+ renderTable(tunnels, [
321
+ { header: "SLUG", key: "slug", width: 20 },
322
+ { header: "PORT", key: (t) => String(t.port), width: 6 },
323
+ { header: "PUBLIC URL", key: "public_url", width: 40 },
324
+ { header: "STATE", key: "state", width: 8 },
325
+ ]);
326
+ }
327
+ catch (err) {
328
+ handleError(err);
329
+ }
330
+ });
331
+ // ── close ─────────────────────────────────────────────────────────────────
332
+ tunnelCmd
333
+ .command("close <host> <slug>")
334
+ .description("Close (revoke) a tunnel")
335
+ .action(async (hostArg, slug) => {
336
+ try {
337
+ const config = loadConfig();
338
+ const client = new MiosaClient(config);
339
+ const host = await client.getHost(hostArg);
340
+ const spinner = spin(`Closing tunnel ${slug}...`);
341
+ await client.closeTunnel(host.id, slug);
342
+ spinner.succeed(`Tunnel ${slug} closed.`);
343
+ }
344
+ catch (err) {
345
+ handleError(err);
346
+ }
347
+ });
348
+ // ── forward (local TCP → Computer port via API proxy) ────────────────────
349
+ tunnelCmd
350
+ .command("forward <computer-id> [ports...]")
351
+ .alias("proxy")
352
+ .description([
353
+ "Forward local port(s) to a Computer via the compute proxy.",
354
+ "",
355
+ "Traffic is routed through https://{port}-{slug}.computer.miosa.ai,",
356
+ "which the compute proxy forwards to the VM's internal port.",
357
+ "HTTP and WebSocket services work; raw TCP protocols (postgres, redis)",
358
+ "require the service to speak HTTP or use a separate relay.",
359
+ "",
360
+ "Ports can be specified as:",
361
+ " 8080 forward localhost:8080 → computer:8080",
362
+ " 8080:3000 forward localhost:3000 → computer:8080",
363
+ "",
364
+ "Examples:",
365
+ " miosa tunnel forward my-box 8080",
366
+ " miosa tunnel forward my-box 8080 3000",
367
+ " miosa tunnel forward my-box 8080:3000",
368
+ ].join("\n"))
369
+ .option("--local-port <port>", "Local port (only when forwarding a single remote port)", parseInt)
370
+ .option("--json", "Output as JSON")
371
+ .action(async (computerId, rawPorts, opts) => {
372
+ try {
373
+ if (rawPorts.length === 0) {
374
+ console.error(chalk.red("Provide at least one port. E.g.: miosa tunnel forward my-box 5432"));
375
+ process.exit(1);
376
+ }
377
+ let portSpecs;
378
+ if (rawPorts.length === 1 && opts.localPort !== undefined) {
379
+ // --local-port override for single-port case
380
+ const remote = parseInt(rawPorts[0] ?? "", 10);
381
+ if (isNaN(remote) || remote < 1 || remote > 65535) {
382
+ throw new Error(`Invalid remote port: ${rawPorts[0]}`);
383
+ }
384
+ portSpecs = [{ remotePort: remote, localPort: opts.localPort }];
385
+ }
386
+ else {
387
+ portSpecs = rawPorts.map(parsePortSpec);
388
+ }
389
+ await runForward(computerId, portSpecs, opts);
390
+ }
391
+ catch (err) {
392
+ handleError(err);
393
+ }
394
+ });
395
+ }
396
+ // ── helpers ────────────────────────────────────────────────────────────────
397
+ function formatEvent(event) {
398
+ switch (event.type) {
399
+ case "stdout":
400
+ case "stderr":
401
+ return event.data.trim();
402
+ case "error":
403
+ return chalk.red(event.message);
404
+ case "thought":
405
+ return chalk.italic(event.content);
406
+ case "tool_call":
407
+ return `${event.tool}(${JSON.stringify(event.input)})`;
408
+ case "tool_result":
409
+ return `${event.tool} → ${JSON.stringify(event.output)}`;
410
+ case "exit":
411
+ return `exit ${event.exit_code}`;
412
+ case "done":
413
+ return "done";
414
+ default:
415
+ return "";
416
+ }
417
+ }
418
+ //# sourceMappingURL=tunnel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * `miosa up` — smart context-aware launch command.
3
+ *
4
+ * Detects what you're working with and does the right thing:
5
+ * .miosa.json or miosa.json → redeploy existing project
6
+ * Dockerfile → build and deploy as container (not yet live — falls through to deploy)
7
+ * package.json / mix.exs / requirements.txt → detect framework, deploy
8
+ * --computer flag → create a desktop computer
9
+ * --sandbox flag → create a sandbox
10
+ * nothing → interactive mode to pick an action
11
+ */
12
+ import type { Command } from "commander";
13
+ export declare function register(program: Command): void;
14
+ //# sourceMappingURL=up.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"up.d.ts","sourceRoot":"","sources":["../../src/commands/up.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyzBzC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2E/C"}