@hotcell/daemon 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent-check.d.ts +1 -0
- package/dist/agent-check.js +105 -0
- package/dist/agent-check.js.map +1 -0
- package/dist/api/server.d.ts +64 -0
- package/dist/api/server.js +1368 -0
- package/dist/api/server.js.map +1 -0
- package/dist/api/ws.d.ts +14 -0
- package/dist/api/ws.js +214 -0
- package/dist/api/ws.js.map +1 -0
- package/dist/applevz-check.d.ts +1 -0
- package/dist/applevz-check.js +280 -0
- package/dist/applevz-check.js.map +1 -0
- package/dist/backups.d.ts +29 -0
- package/dist/backups.js +76 -0
- package/dist/backups.js.map +1 -0
- package/dist/capacity.d.ts +63 -0
- package/dist/capacity.js +95 -0
- package/dist/capacity.js.map +1 -0
- package/dist/config.d.ts +241 -0
- package/dist/config.js +152 -0
- package/dist/config.js.map +1 -0
- package/dist/cost.d.ts +9 -0
- package/dist/cost.js +19 -0
- package/dist/cost.js.map +1 -0
- package/dist/density-bench.d.ts +1 -0
- package/dist/density-bench.js +97 -0
- package/dist/density-bench.js.map +1 -0
- package/dist/driver/agent-driver.d.ts +67 -0
- package/dist/driver/agent-driver.js +197 -0
- package/dist/driver/agent-driver.js.map +1 -0
- package/dist/driver/agent.d.ts +94 -0
- package/dist/driver/agent.js +319 -0
- package/dist/driver/agent.js.map +1 -0
- package/dist/driver/applevz.d.ts +95 -0
- package/dist/driver/applevz.js +527 -0
- package/dist/driver/applevz.js.map +1 -0
- package/dist/driver/container.d.ts +99 -0
- package/dist/driver/container.js +733 -0
- package/dist/driver/container.js.map +1 -0
- package/dist/driver/fc-api.d.ts +85 -0
- package/dist/driver/fc-api.js +173 -0
- package/dist/driver/fc-api.js.map +1 -0
- package/dist/driver/firecracker.d.ts +126 -0
- package/dist/driver/firecracker.js +560 -0
- package/dist/driver/firecracker.js.map +1 -0
- package/dist/driver/index.d.ts +17 -0
- package/dist/driver/index.js +61 -0
- package/dist/driver/index.js.map +1 -0
- package/dist/driver/router.d.ts +82 -0
- package/dist/driver/router.js +159 -0
- package/dist/driver/router.js.map +1 -0
- package/dist/driver/types.d.ts +234 -0
- package/dist/driver/types.js +2 -0
- package/dist/driver/types.js.map +1 -0
- package/dist/driver/unsupported.d.ts +50 -0
- package/dist/driver/unsupported.js +81 -0
- package/dist/driver/unsupported.js.map +1 -0
- package/dist/driver/vz-image.d.ts +35 -0
- package/dist/driver/vz-image.js +75 -0
- package/dist/driver/vz-image.js.map +1 -0
- package/dist/e2e-harness.d.ts +1 -0
- package/dist/e2e-harness.js +99 -0
- package/dist/e2e-harness.js.map +1 -0
- package/dist/egress-check.d.ts +8 -0
- package/dist/egress-check.js +317 -0
- package/dist/egress-check.js.map +1 -0
- package/dist/fc-check.d.ts +1 -0
- package/dist/fc-check.js +113 -0
- package/dist/fc-check.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +114 -0
- package/dist/index.js.map +1 -0
- package/dist/kernels.d.ts +22 -0
- package/dist/kernels.js +134 -0
- package/dist/kernels.js.map +1 -0
- package/dist/lifecycle.d.ts +49 -0
- package/dist/lifecycle.js +111 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/logger.d.ts +16 -0
- package/dist/logger.js +67 -0
- package/dist/logger.js.map +1 -0
- package/dist/metrics.d.ts +46 -0
- package/dist/metrics.js +92 -0
- package/dist/metrics.js.map +1 -0
- package/dist/net/firewall.d.ts +4 -0
- package/dist/net/firewall.js +80 -0
- package/dist/net/firewall.js.map +1 -0
- package/dist/pricing.d.ts +36 -0
- package/dist/pricing.js +81 -0
- package/dist/pricing.js.map +1 -0
- package/dist/proxy/allowlist-default.d.ts +23 -0
- package/dist/proxy/allowlist-default.js +53 -0
- package/dist/proxy/allowlist-default.js.map +1 -0
- package/dist/proxy/allowlist.d.ts +43 -0
- package/dist/proxy/allowlist.js +87 -0
- package/dist/proxy/allowlist.js.map +1 -0
- package/dist/proxy/egress.d.ts +49 -0
- package/dist/proxy/egress.js +599 -0
- package/dist/proxy/egress.js.map +1 -0
- package/dist/proxy/ratelimit.d.ts +49 -0
- package/dist/proxy/ratelimit.js +74 -0
- package/dist/proxy/ratelimit.js.map +1 -0
- package/dist/proxy/server.d.ts +26 -0
- package/dist/proxy/server.js +202 -0
- package/dist/proxy/server.js.map +1 -0
- package/dist/router-check.d.ts +1 -0
- package/dist/router-check.js +97 -0
- package/dist/router-check.js.map +1 -0
- package/dist/smoke-fc.d.ts +1 -0
- package/dist/smoke-fc.js +183 -0
- package/dist/smoke-fc.js.map +1 -0
- package/dist/smoke-microvm.d.ts +1 -0
- package/dist/smoke-microvm.js +187 -0
- package/dist/smoke-microvm.js.map +1 -0
- package/dist/smoke-remote.d.ts +20 -0
- package/dist/smoke-remote.js +155 -0
- package/dist/smoke-remote.js.map +1 -0
- package/dist/smoke-vz.d.ts +1 -0
- package/dist/smoke-vz.js +161 -0
- package/dist/smoke-vz.js.map +1 -0
- package/dist/smoke.d.ts +7 -0
- package/dist/smoke.js +962 -0
- package/dist/smoke.js.map +1 -0
- package/dist/store.d.ts +124 -0
- package/dist/store.js +578 -0
- package/dist/store.js.map +1 -0
- package/dist/tracing.d.ts +45 -0
- package/dist/tracing.js +144 -0
- package/dist/tracing.js.map +1 -0
- package/dist/types.d.ts +274 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/util.d.ts +27 -0
- package/dist/util.js +63 -0
- package/dist/util.js.map +1 -0
- package/dist/warmpool-check.d.ts +1 -0
- package/dist/warmpool-check.js +83 -0
- package/dist/warmpool-check.js.map +1 -0
- package/dist/web/dashboard.d.ts +1 -0
- package/dist/web/dashboard.js +456 -0
- package/dist/web/dashboard.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker-free, VM-free check of the host↔guest agent protocol. Runs the real Go
|
|
3
|
+
* `sbx-agent` over a unix socket (its dev transport) and drives it through the TS
|
|
4
|
+
* `AgentConn` client — validating the wire protocol end-to-end on macOS with no
|
|
5
|
+
* microVM. The same client + protocol then carry every Driver op once the VZ
|
|
6
|
+
* helper relays a guest vsock to a unix socket. Run: `npm run check:agent`.
|
|
7
|
+
*/
|
|
8
|
+
import { spawn } from "node:child_process";
|
|
9
|
+
import { existsSync, mkdtempSync } from "node:fs";
|
|
10
|
+
import { createServer as createHttpServer } from "node:http";
|
|
11
|
+
import { tmpdir } from "node:os";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
import assert from "node:assert/strict";
|
|
14
|
+
import { setTimeout as sleep } from "node:timers/promises";
|
|
15
|
+
import { AgentConn } from "./driver/agent.js";
|
|
16
|
+
async function main() {
|
|
17
|
+
const bin = process.env.HOTCELL_AGENT_BIN ?? "/tmp/hotcell-agent-check";
|
|
18
|
+
const dir = mkdtempSync(join(tmpdir(), "hotcell-agent-"));
|
|
19
|
+
const sock = join(dir, "agent.sock");
|
|
20
|
+
const egressTargetSock = join(dir, "egress-target.sock");
|
|
21
|
+
const proc = spawn(bin, [], {
|
|
22
|
+
env: {
|
|
23
|
+
...process.env,
|
|
24
|
+
HOTCELL_AGENT_LISTEN: `unix://${sock}`,
|
|
25
|
+
// Egress relay test override: instead of vsock (no VM here), the agent
|
|
26
|
+
// dials this unix socket, where the check hosts a mock gateway.
|
|
27
|
+
HOTCELL_EGRESS_DIAL: `unix://${egressTargetSock}`,
|
|
28
|
+
},
|
|
29
|
+
stdio: ["ignore", "ignore", "inherit"],
|
|
30
|
+
});
|
|
31
|
+
let passed = 0;
|
|
32
|
+
const ok = (label) => {
|
|
33
|
+
passed++;
|
|
34
|
+
console.log(` ✓ ${label}`);
|
|
35
|
+
};
|
|
36
|
+
try {
|
|
37
|
+
for (let i = 0; i < 50 && !existsSync(sock); i++)
|
|
38
|
+
await sleep(100);
|
|
39
|
+
assert.ok(existsSync(sock), "agent unix socket should appear");
|
|
40
|
+
const conn = await AgentConn.connect({ path: sock });
|
|
41
|
+
assert.equal(conn.hello?.agent, "hotcell-agent", "Hello identifies the agent");
|
|
42
|
+
assert.equal(conn.hello?.proto, 1, "proto version");
|
|
43
|
+
ok(`Hello received (version ${conn.hello?.version})`);
|
|
44
|
+
// exec: stdout + stderr + exit code (cwd set since the guest default /workspace
|
|
45
|
+
// doesn't exist on the mac host running this check).
|
|
46
|
+
let out = "";
|
|
47
|
+
let err = "";
|
|
48
|
+
const code = await conn.exec("echo out-line && echo err-line >&2 && exit 3", { cwd: dir }, (e) => {
|
|
49
|
+
if (e.type === "stdout")
|
|
50
|
+
out += e.data;
|
|
51
|
+
if (e.type === "stderr")
|
|
52
|
+
err += e.data;
|
|
53
|
+
});
|
|
54
|
+
assert.equal(code, 3, "exec exit code");
|
|
55
|
+
assert.match(out, /out-line/, "exec stdout");
|
|
56
|
+
assert.match(err, /err-line/, "exec stderr");
|
|
57
|
+
ok("exec: stdout/stderr streaming + exit code");
|
|
58
|
+
// writeFile / readFile round-trip.
|
|
59
|
+
await conn.writeFile(join(dir, "f.txt"), "data-123");
|
|
60
|
+
assert.equal(await conn.readFile(join(dir, "f.txt")), "data-123");
|
|
61
|
+
ok("writeFile + readFile round-trip");
|
|
62
|
+
// mkdir + listFiles.
|
|
63
|
+
await conn.mkdir(join(dir, "sub"), true);
|
|
64
|
+
const files = await conn.listFiles(dir);
|
|
65
|
+
assert.ok(files.some((f) => f.name === "f.txt"), "listFiles sees the file");
|
|
66
|
+
assert.ok(files.some((f) => f.name === "sub" && f.isDirectory), "listFiles sees the dir");
|
|
67
|
+
ok("mkdir + listFiles");
|
|
68
|
+
// env overlay: setEnv then read it back via exec.
|
|
69
|
+
await conn.setEnv({ SBX_TEST_VAR: "xyz" });
|
|
70
|
+
let envOut = "";
|
|
71
|
+
await conn.exec("echo $SBX_TEST_VAR", { cwd: dir }, (e) => {
|
|
72
|
+
if (e.type === "stdout")
|
|
73
|
+
envOut += e.data;
|
|
74
|
+
});
|
|
75
|
+
assert.match(envOut, /xyz/, "setEnv applies to subsequent exec");
|
|
76
|
+
ok("setEnv overlay applies to exec");
|
|
77
|
+
// stats returns (a stub off-Linux, but the RPC round-trips).
|
|
78
|
+
assert.ok(await conn.stats(), "stats RPC returns");
|
|
79
|
+
ok("stats RPC");
|
|
80
|
+
// Egress relay: the agent listens on guest-loopback and forwards each
|
|
81
|
+
// connection out its dialer (vsock in production; HOTCELL_EGRESS_DIAL here).
|
|
82
|
+
// The check hosts the "gateway": an HTTP server on the dialed unix socket.
|
|
83
|
+
const gateway = createHttpServer((_req, res) => res.end("egress-pong"));
|
|
84
|
+
await new Promise((r) => gateway.listen(egressTargetSock, r));
|
|
85
|
+
const egressPort = 47521;
|
|
86
|
+
await conn.egressListen(egressPort);
|
|
87
|
+
const pong = await fetch(`http://127.0.0.1:${egressPort}/anything`);
|
|
88
|
+
assert.equal(await pong.text(), "egress-pong", "egress relay round-trip");
|
|
89
|
+
await conn.egressListen(egressPort); // idempotent re-arm (driver re-sends per boot)
|
|
90
|
+
const pong2 = await fetch(`http://127.0.0.1:${egressPort}/again`);
|
|
91
|
+
assert.equal(await pong2.text(), "egress-pong", "relay still serves after re-arm");
|
|
92
|
+
await new Promise((r) => gateway.close(() => r()));
|
|
93
|
+
ok("egress relay: loopback listener → dialer → mock gateway round-trip (idempotent)");
|
|
94
|
+
conn.close();
|
|
95
|
+
console.log(`\nagent-check: ${passed} checks passed`);
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
proc.kill();
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
main().then(() => process.exit(0), (err) => {
|
|
102
|
+
console.error("agent-check FAILED:", err);
|
|
103
|
+
process.exit(1);
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=agent-check.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-check.js","sourceRoot":"","sources":["../src/agent-check.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type IncomingMessage, type ServerResponse } from "node:http";
|
|
2
|
+
import { BackupRegistry } from "../backups.js";
|
|
3
|
+
import { type Config } from "../config.js";
|
|
4
|
+
import type { Driver } from "../driver/types.js";
|
|
5
|
+
import type { Capacity } from "../capacity.js";
|
|
6
|
+
import type { MetricsHistory } from "../metrics.js";
|
|
7
|
+
import { SandboxStore } from "../store.js";
|
|
8
|
+
interface Deps {
|
|
9
|
+
config: Config;
|
|
10
|
+
driver: Driver;
|
|
11
|
+
store: SandboxStore;
|
|
12
|
+
backups: BackupRegistry;
|
|
13
|
+
history?: MetricsHistory;
|
|
14
|
+
capacity?: Capacity;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Phase 0/1 REST surface:
|
|
18
|
+
* GET /healthz
|
|
19
|
+
* POST /sandboxes -> create
|
|
20
|
+
* GET /sandboxes -> list
|
|
21
|
+
* GET /sandboxes/:id -> get
|
|
22
|
+
* DELETE /sandboxes/:id -> destroy (removes volume too)
|
|
23
|
+
* GET /sandboxes/:id/metrics -> live stats + cumulative usage + cost
|
|
24
|
+
* POST /sandboxes/:id/stop -> stop (remove container, keep volume)
|
|
25
|
+
* POST /sandboxes/:id/pause -> fast-pause (memory snapshot on microVM drivers; else stop-with-volume); any op auto-resumes
|
|
26
|
+
* POST /sandboxes/:id/start -> start (recreate container, reattach volume)
|
|
27
|
+
* POST /sandboxes/:id/backups -> back up /workspace, returns BackupInfo
|
|
28
|
+
* GET /sandboxes/:id/backups -> list this sandbox's backups
|
|
29
|
+
* POST /sandboxes/:id/restore -> restore /workspace from {backupId}
|
|
30
|
+
* GET /backups -> list all backups
|
|
31
|
+
* DELETE /backups/:backupId -> delete a backup
|
|
32
|
+
* POST /sandboxes/:id/code-contexts -> create a code-interpreter context
|
|
33
|
+
* GET /sandboxes/:id/code-contexts -> list code contexts
|
|
34
|
+
* DELETE /sandboxes/:id/code-contexts/:ctxId -> destroy a code context
|
|
35
|
+
* POST /sandboxes/:id/run-code -> run code, returns CodeResult
|
|
36
|
+
* POST /sandboxes/:id/exec -> run command, stream output as SSE
|
|
37
|
+
* POST /sandboxes/:id/files/write -> write file
|
|
38
|
+
* POST /sandboxes/:id/files/read -> read file
|
|
39
|
+
* POST /sandboxes/:id/files/mkdir -> create directory
|
|
40
|
+
* POST /sandboxes/:id/files/list -> list directory
|
|
41
|
+
* GET /sandboxes/:id/watch -> stream file-change events (SSE)
|
|
42
|
+
* GET /sandboxes/:id/terminal -> interactive PTY shell (WebSocket upgrade)
|
|
43
|
+
* GET /sandboxes/:id/metrics/history -> recent live-metrics samples (sparklines)
|
|
44
|
+
* POST /sandboxes/:id/egress-tokens -> mint an egress (LLM gateway) token
|
|
45
|
+
* GET /sandboxes/:id/egress-tokens -> list egress tokens + provider URLs
|
|
46
|
+
* DELETE /sandboxes/:id/egress-tokens/:token -> revoke an egress token
|
|
47
|
+
* GET /traces -> recent finished trace spans
|
|
48
|
+
* POST /sandboxes/:id/processes -> start background process
|
|
49
|
+
* GET /sandboxes/:id/processes -> list processes
|
|
50
|
+
* DELETE /sandboxes/:id/processes/:procId -> signal/kill process
|
|
51
|
+
* GET /sandboxes/:id/processes/:procId/logs -> stream logs (SSE)
|
|
52
|
+
* POST /sandboxes/:id/wait-port -> wait for a TCP port
|
|
53
|
+
* POST /sandboxes/:id/expose -> expose a port (preview URL)
|
|
54
|
+
* GET /sandboxes/:id/expose -> list exposed ports
|
|
55
|
+
* DELETE /sandboxes/:id/expose/:port -> unexpose a port
|
|
56
|
+
* GET /sandboxes/:id/env -> get sandbox env vars
|
|
57
|
+
* POST /sandboxes/:id/env -> merge sandbox env vars
|
|
58
|
+
* POST /sandboxes/:id/sessions -> create a session
|
|
59
|
+
* GET /sandboxes/:id/sessions -> list sessions
|
|
60
|
+
* DELETE /sandboxes/:id/sessions/:sid -> delete a session
|
|
61
|
+
* POST /sandboxes/:id/sessions/:sid/env -> merge session env vars
|
|
62
|
+
*/
|
|
63
|
+
export declare function createApiServer(deps: Deps): import("http").Server<typeof IncomingMessage, typeof ServerResponse>;
|
|
64
|
+
export {};
|