@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.
- package/README.md +327 -0
- package/dist/bin/miosa.d.ts +3 -0
- package/dist/bin/miosa.d.ts.map +1 -0
- package/dist/bin/miosa.js +139 -0
- package/dist/bin/miosa.js.map +1 -0
- package/dist/client.d.ts +74 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +523 -0
- package/dist/client.js.map +1 -0
- package/dist/commands/agent.d.ts +18 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +468 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/alerts.d.ts +3 -0
- package/dist/commands/alerts.d.ts.map +1 -0
- package/dist/commands/alerts.js +41 -0
- package/dist/commands/alerts.js.map +1 -0
- package/dist/commands/api-keys.d.ts +3 -0
- package/dist/commands/api-keys.d.ts.map +1 -0
- package/dist/commands/api-keys.js +119 -0
- package/dist/commands/api-keys.js.map +1 -0
- package/dist/commands/api-resource.d.ts +20 -0
- package/dist/commands/api-resource.d.ts.map +1 -0
- package/dist/commands/api-resource.js +120 -0
- package/dist/commands/api-resource.js.map +1 -0
- package/dist/commands/apps.d.ts +3 -0
- package/dist/commands/apps.d.ts.map +1 -0
- package/dist/commands/apps.js +218 -0
- package/dist/commands/apps.js.map +1 -0
- package/dist/commands/audit.d.ts +3 -0
- package/dist/commands/audit.d.ts.map +1 -0
- package/dist/commands/audit.js +25 -0
- package/dist/commands/audit.js.map +1 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +363 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/backups.d.ts +3 -0
- package/dist/commands/backups.d.ts.map +1 -0
- package/dist/commands/backups.js +23 -0
- package/dist/commands/backups.js.map +1 -0
- package/dist/commands/checkpoints.d.ts +3 -0
- package/dist/commands/checkpoints.d.ts.map +1 -0
- package/dist/commands/checkpoints.js +33 -0
- package/dist/commands/checkpoints.js.map +1 -0
- package/dist/commands/computers.d.ts +3 -0
- package/dist/commands/computers.d.ts.map +1 -0
- package/dist/commands/computers.js +118 -0
- package/dist/commands/computers.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +114 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/connect.d.ts +3 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +96 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/containers.d.ts +3 -0
- package/dist/commands/containers.d.ts.map +1 -0
- package/dist/commands/containers.js +20 -0
- package/dist/commands/containers.js.map +1 -0
- package/dist/commands/cp.d.ts +3 -0
- package/dist/commands/cp.d.ts.map +1 -0
- package/dist/commands/cp.js +102 -0
- package/dist/commands/cp.js.map +1 -0
- package/dist/commands/cron.d.ts +3 -0
- package/dist/commands/cron.d.ts.map +1 -0
- package/dist/commands/cron.js +65 -0
- package/dist/commands/cron.js.map +1 -0
- package/dist/commands/databases.d.ts +3 -0
- package/dist/commands/databases.d.ts.map +1 -0
- package/dist/commands/databases.js +222 -0
- package/dist/commands/databases.js.map +1 -0
- package/dist/commands/db.d.ts +3 -0
- package/dist/commands/db.d.ts.map +1 -0
- package/dist/commands/db.js +174 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/deploy.d.ts +3 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +579 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/desktop.d.ts +3 -0
- package/dist/commands/desktop.d.ts.map +1 -0
- package/dist/commands/desktop.js +276 -0
- package/dist/commands/desktop.js.map +1 -0
- package/dist/commands/dev.d.ts +3 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +246 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/doctor.d.ts +3 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +241 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/domains.d.ts +3 -0
- package/dist/commands/domains.d.ts.map +1 -0
- package/dist/commands/domains.js +31 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/enterprise-util.d.ts +37 -0
- package/dist/commands/enterprise-util.d.ts.map +1 -0
- package/dist/commands/enterprise-util.js +185 -0
- package/dist/commands/enterprise-util.js.map +1 -0
- package/dist/commands/exec.d.ts +3 -0
- package/dist/commands/exec.d.ts.map +1 -0
- package/dist/commands/exec.js +68 -0
- package/dist/commands/exec.js.map +1 -0
- package/dist/commands/functions.d.ts +3 -0
- package/dist/commands/functions.d.ts.map +1 -0
- package/dist/commands/functions.js +47 -0
- package/dist/commands/functions.js.map +1 -0
- package/dist/commands/gha-runners.d.ts +3 -0
- package/dist/commands/gha-runners.d.ts.map +1 -0
- package/dist/commands/gha-runners.js +33 -0
- package/dist/commands/gha-runners.js.map +1 -0
- package/dist/commands/groups.d.ts +3 -0
- package/dist/commands/groups.d.ts.map +1 -0
- package/dist/commands/groups.js +38 -0
- package/dist/commands/groups.js.map +1 -0
- package/dist/commands/host.d.ts +3 -0
- package/dist/commands/host.d.ts.map +1 -0
- package/dist/commands/host.js +74 -0
- package/dist/commands/host.js.map +1 -0
- package/dist/commands/hosts.d.ts +3 -0
- package/dist/commands/hosts.d.ts.map +1 -0
- package/dist/commands/hosts.js +90 -0
- package/dist/commands/hosts.js.map +1 -0
- package/dist/commands/link.d.ts +8 -0
- package/dist/commands/link.d.ts.map +1 -0
- package/dist/commands/link.js +124 -0
- package/dist/commands/link.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +172 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.d.ts +3 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +17 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/logs.d.ts +3 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +94 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/ls.d.ts +3 -0
- package/dist/commands/ls.d.ts.map +1 -0
- package/dist/commands/ls.js +67 -0
- package/dist/commands/ls.js.map +1 -0
- package/dist/commands/machines.d.ts +3 -0
- package/dist/commands/machines.d.ts.map +1 -0
- package/dist/commands/machines.js +29 -0
- package/dist/commands/machines.js.map +1 -0
- package/dist/commands/mcp.d.ts +21 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +1021 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/meshes.d.ts +3 -0
- package/dist/commands/meshes.d.ts.map +1 -0
- package/dist/commands/meshes.js +27 -0
- package/dist/commands/meshes.js.map +1 -0
- package/dist/commands/network-policy.d.ts +3 -0
- package/dist/commands/network-policy.d.ts.map +1 -0
- package/dist/commands/network-policy.js +40 -0
- package/dist/commands/network-policy.js.map +1 -0
- package/dist/commands/project.d.ts +4 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +25 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/pull.d.ts +3 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +155 -0
- package/dist/commands/pull.js.map +1 -0
- package/dist/commands/regions.d.ts +3 -0
- package/dist/commands/regions.d.ts.map +1 -0
- package/dist/commands/regions.js +67 -0
- package/dist/commands/regions.js.map +1 -0
- package/dist/commands/releases.d.ts +3 -0
- package/dist/commands/releases.d.ts.map +1 -0
- package/dist/commands/releases.js +176 -0
- package/dist/commands/releases.js.map +1 -0
- package/dist/commands/rm.d.ts +3 -0
- package/dist/commands/rm.d.ts.map +1 -0
- package/dist/commands/rm.js +42 -0
- package/dist/commands/rm.js.map +1 -0
- package/dist/commands/run.d.ts +3 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +131 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/sandbox.d.ts +3 -0
- package/dist/commands/sandbox.d.ts.map +1 -0
- package/dist/commands/sandbox.js +352 -0
- package/dist/commands/sandbox.js.map +1 -0
- package/dist/commands/schedules.d.ts +3 -0
- package/dist/commands/schedules.d.ts.map +1 -0
- package/dist/commands/schedules.js +37 -0
- package/dist/commands/schedules.js.map +1 -0
- package/dist/commands/secrets.d.ts +3 -0
- package/dist/commands/secrets.d.ts.map +1 -0
- package/dist/commands/secrets.js +194 -0
- package/dist/commands/secrets.js.map +1 -0
- package/dist/commands/services.d.ts +3 -0
- package/dist/commands/services.d.ts.map +1 -0
- package/dist/commands/services.js +70 -0
- package/dist/commands/services.js.map +1 -0
- package/dist/commands/shell.d.ts +16 -0
- package/dist/commands/shell.d.ts.map +1 -0
- package/dist/commands/shell.js +527 -0
- package/dist/commands/shell.js.map +1 -0
- package/dist/commands/snapshot.d.ts +10 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +181 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/commands/ssh.d.ts +3 -0
- package/dist/commands/ssh.d.ts.map +1 -0
- package/dist/commands/ssh.js +37 -0
- package/dist/commands/ssh.js.map +1 -0
- package/dist/commands/status.d.ts +3 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +300 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/storage.d.ts +3 -0
- package/dist/commands/storage.d.ts.map +1 -0
- package/dist/commands/storage.js +180 -0
- package/dist/commands/storage.js.map +1 -0
- package/dist/commands/tenant.d.ts +3 -0
- package/dist/commands/tenant.d.ts.map +1 -0
- package/dist/commands/tenant.js +87 -0
- package/dist/commands/tenant.js.map +1 -0
- package/dist/commands/tunnel.d.ts +3 -0
- package/dist/commands/tunnel.d.ts.map +1 -0
- package/dist/commands/tunnel.js +418 -0
- package/dist/commands/tunnel.js.map +1 -0
- package/dist/commands/up.d.ts +14 -0
- package/dist/commands/up.d.ts.map +1 -0
- package/dist/commands/up.js +703 -0
- package/dist/commands/up.js.map +1 -0
- package/dist/commands/util.d.ts +19 -0
- package/dist/commands/util.d.ts.map +1 -0
- package/dist/commands/util.js +116 -0
- package/dist/commands/util.js.map +1 -0
- package/dist/commands/volumes.d.ts +3 -0
- package/dist/commands/volumes.d.ts.map +1 -0
- package/dist/commands/volumes.js +196 -0
- package/dist/commands/volumes.js.map +1 -0
- package/dist/commands/watch.d.ts +3 -0
- package/dist/commands/watch.d.ts.map +1 -0
- package/dist/commands/watch.js +398 -0
- package/dist/commands/watch.js.map +1 -0
- package/dist/commands/webhooks.d.ts +3 -0
- package/dist/commands/webhooks.d.ts.map +1 -0
- package/dist/commands/webhooks.js +23 -0
- package/dist/commands/webhooks.js.map +1 -0
- package/dist/commands/whoami.d.ts +3 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +84 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/commands/workspaces.d.ts +3 -0
- package/dist/commands/workspaces.d.ts.map +1 -0
- package/dist/commands/workspaces.js +87 -0
- package/dist/commands/workspaces.js.map +1 -0
- package/dist/config.d.ts +28 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +129 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +22 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +62 -0
- package/dist/errors.js.map +1 -0
- package/dist/framework-detector.d.ts +22 -0
- package/dist/framework-detector.d.ts.map +1 -0
- package/dist/framework-detector.js +373 -0
- package/dist/framework-detector.js.map +1 -0
- package/dist/pty/raw-mode.d.ts +7 -0
- package/dist/pty/raw-mode.d.ts.map +1 -0
- package/dist/pty/raw-mode.js +22 -0
- package/dist/pty/raw-mode.js.map +1 -0
- package/dist/pty/ws-pty-client.d.ts +12 -0
- package/dist/pty/ws-pty-client.d.ts.map +1 -0
- package/dist/pty/ws-pty-client.js +69 -0
- package/dist/pty/ws-pty-client.js.map +1 -0
- package/dist/types.d.ts +326 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +16 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/progress.d.ts +10 -0
- package/dist/ui/progress.d.ts.map +1 -0
- package/dist/ui/progress.js +36 -0
- package/dist/ui/progress.js.map +1 -0
- package/dist/ui/spinner.d.ts +4 -0
- package/dist/ui/spinner.d.ts.map +1 -0
- package/dist/ui/spinner.js +7 -0
- package/dist/ui/spinner.js.map +1 -0
- package/dist/ui/table.d.ts +8 -0
- package/dist/ui/table.d.ts.map +1 -0
- package/dist/ui/table.js +46 -0
- package/dist/ui/table.js.map +1 -0
- 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"}
|