@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.
Files changed (142) hide show
  1. package/dist/agent-check.d.ts +1 -0
  2. package/dist/agent-check.js +105 -0
  3. package/dist/agent-check.js.map +1 -0
  4. package/dist/api/server.d.ts +64 -0
  5. package/dist/api/server.js +1368 -0
  6. package/dist/api/server.js.map +1 -0
  7. package/dist/api/ws.d.ts +14 -0
  8. package/dist/api/ws.js +214 -0
  9. package/dist/api/ws.js.map +1 -0
  10. package/dist/applevz-check.d.ts +1 -0
  11. package/dist/applevz-check.js +280 -0
  12. package/dist/applevz-check.js.map +1 -0
  13. package/dist/backups.d.ts +29 -0
  14. package/dist/backups.js +76 -0
  15. package/dist/backups.js.map +1 -0
  16. package/dist/capacity.d.ts +63 -0
  17. package/dist/capacity.js +95 -0
  18. package/dist/capacity.js.map +1 -0
  19. package/dist/config.d.ts +241 -0
  20. package/dist/config.js +152 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/cost.d.ts +9 -0
  23. package/dist/cost.js +19 -0
  24. package/dist/cost.js.map +1 -0
  25. package/dist/density-bench.d.ts +1 -0
  26. package/dist/density-bench.js +97 -0
  27. package/dist/density-bench.js.map +1 -0
  28. package/dist/driver/agent-driver.d.ts +67 -0
  29. package/dist/driver/agent-driver.js +197 -0
  30. package/dist/driver/agent-driver.js.map +1 -0
  31. package/dist/driver/agent.d.ts +94 -0
  32. package/dist/driver/agent.js +319 -0
  33. package/dist/driver/agent.js.map +1 -0
  34. package/dist/driver/applevz.d.ts +95 -0
  35. package/dist/driver/applevz.js +527 -0
  36. package/dist/driver/applevz.js.map +1 -0
  37. package/dist/driver/container.d.ts +99 -0
  38. package/dist/driver/container.js +733 -0
  39. package/dist/driver/container.js.map +1 -0
  40. package/dist/driver/fc-api.d.ts +85 -0
  41. package/dist/driver/fc-api.js +173 -0
  42. package/dist/driver/fc-api.js.map +1 -0
  43. package/dist/driver/firecracker.d.ts +126 -0
  44. package/dist/driver/firecracker.js +560 -0
  45. package/dist/driver/firecracker.js.map +1 -0
  46. package/dist/driver/index.d.ts +17 -0
  47. package/dist/driver/index.js +61 -0
  48. package/dist/driver/index.js.map +1 -0
  49. package/dist/driver/router.d.ts +82 -0
  50. package/dist/driver/router.js +159 -0
  51. package/dist/driver/router.js.map +1 -0
  52. package/dist/driver/types.d.ts +234 -0
  53. package/dist/driver/types.js +2 -0
  54. package/dist/driver/types.js.map +1 -0
  55. package/dist/driver/unsupported.d.ts +50 -0
  56. package/dist/driver/unsupported.js +81 -0
  57. package/dist/driver/unsupported.js.map +1 -0
  58. package/dist/driver/vz-image.d.ts +35 -0
  59. package/dist/driver/vz-image.js +75 -0
  60. package/dist/driver/vz-image.js.map +1 -0
  61. package/dist/e2e-harness.d.ts +1 -0
  62. package/dist/e2e-harness.js +99 -0
  63. package/dist/e2e-harness.js.map +1 -0
  64. package/dist/egress-check.d.ts +8 -0
  65. package/dist/egress-check.js +317 -0
  66. package/dist/egress-check.js.map +1 -0
  67. package/dist/fc-check.d.ts +1 -0
  68. package/dist/fc-check.js +113 -0
  69. package/dist/fc-check.js.map +1 -0
  70. package/dist/index.d.ts +2 -0
  71. package/dist/index.js +114 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/kernels.d.ts +22 -0
  74. package/dist/kernels.js +134 -0
  75. package/dist/kernels.js.map +1 -0
  76. package/dist/lifecycle.d.ts +49 -0
  77. package/dist/lifecycle.js +111 -0
  78. package/dist/lifecycle.js.map +1 -0
  79. package/dist/logger.d.ts +16 -0
  80. package/dist/logger.js +67 -0
  81. package/dist/logger.js.map +1 -0
  82. package/dist/metrics.d.ts +46 -0
  83. package/dist/metrics.js +92 -0
  84. package/dist/metrics.js.map +1 -0
  85. package/dist/net/firewall.d.ts +4 -0
  86. package/dist/net/firewall.js +80 -0
  87. package/dist/net/firewall.js.map +1 -0
  88. package/dist/pricing.d.ts +36 -0
  89. package/dist/pricing.js +81 -0
  90. package/dist/pricing.js.map +1 -0
  91. package/dist/proxy/allowlist-default.d.ts +23 -0
  92. package/dist/proxy/allowlist-default.js +53 -0
  93. package/dist/proxy/allowlist-default.js.map +1 -0
  94. package/dist/proxy/allowlist.d.ts +43 -0
  95. package/dist/proxy/allowlist.js +87 -0
  96. package/dist/proxy/allowlist.js.map +1 -0
  97. package/dist/proxy/egress.d.ts +49 -0
  98. package/dist/proxy/egress.js +599 -0
  99. package/dist/proxy/egress.js.map +1 -0
  100. package/dist/proxy/ratelimit.d.ts +49 -0
  101. package/dist/proxy/ratelimit.js +74 -0
  102. package/dist/proxy/ratelimit.js.map +1 -0
  103. package/dist/proxy/server.d.ts +26 -0
  104. package/dist/proxy/server.js +202 -0
  105. package/dist/proxy/server.js.map +1 -0
  106. package/dist/router-check.d.ts +1 -0
  107. package/dist/router-check.js +97 -0
  108. package/dist/router-check.js.map +1 -0
  109. package/dist/smoke-fc.d.ts +1 -0
  110. package/dist/smoke-fc.js +183 -0
  111. package/dist/smoke-fc.js.map +1 -0
  112. package/dist/smoke-microvm.d.ts +1 -0
  113. package/dist/smoke-microvm.js +187 -0
  114. package/dist/smoke-microvm.js.map +1 -0
  115. package/dist/smoke-remote.d.ts +20 -0
  116. package/dist/smoke-remote.js +155 -0
  117. package/dist/smoke-remote.js.map +1 -0
  118. package/dist/smoke-vz.d.ts +1 -0
  119. package/dist/smoke-vz.js +161 -0
  120. package/dist/smoke-vz.js.map +1 -0
  121. package/dist/smoke.d.ts +7 -0
  122. package/dist/smoke.js +962 -0
  123. package/dist/smoke.js.map +1 -0
  124. package/dist/store.d.ts +124 -0
  125. package/dist/store.js +578 -0
  126. package/dist/store.js.map +1 -0
  127. package/dist/tracing.d.ts +45 -0
  128. package/dist/tracing.js +144 -0
  129. package/dist/tracing.js.map +1 -0
  130. package/dist/types.d.ts +274 -0
  131. package/dist/types.js +3 -0
  132. package/dist/types.js.map +1 -0
  133. package/dist/util.d.ts +27 -0
  134. package/dist/util.js +63 -0
  135. package/dist/util.js.map +1 -0
  136. package/dist/warmpool-check.d.ts +1 -0
  137. package/dist/warmpool-check.js +83 -0
  138. package/dist/warmpool-check.js.map +1 -0
  139. package/dist/web/dashboard.d.ts +1 -0
  140. package/dist/web/dashboard.js +456 -0
  141. package/dist/web/dashboard.js.map +1 -0
  142. 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 {};