@hotcell/daemon 0.1.22 → 0.1.24

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 (45) hide show
  1. package/dist/api/server.d.ts +2 -0
  2. package/dist/api/server.js +145 -14
  3. package/dist/api/server.js.map +1 -1
  4. package/dist/audit-check.d.ts +1 -0
  5. package/dist/audit-check.js +113 -0
  6. package/dist/audit-check.js.map +1 -0
  7. package/dist/audit.d.ts +66 -0
  8. package/dist/audit.js +260 -0
  9. package/dist/audit.js.map +1 -0
  10. package/dist/boot-scheduler.d.ts +25 -0
  11. package/dist/boot-scheduler.js +81 -0
  12. package/dist/boot-scheduler.js.map +1 -0
  13. package/dist/config.d.ts +15 -3
  14. package/dist/config.js +22 -0
  15. package/dist/config.js.map +1 -1
  16. package/dist/driver/container.d.ts +15 -0
  17. package/dist/driver/container.js +70 -13
  18. package/dist/driver/container.js.map +1 -1
  19. package/dist/driver/router.d.ts +5 -0
  20. package/dist/driver/router.js +6 -0
  21. package/dist/driver/router.js.map +1 -1
  22. package/dist/driver/types.d.ts +2 -0
  23. package/dist/e2e-harness.js +39 -26
  24. package/dist/e2e-harness.js.map +1 -1
  25. package/dist/egress-check.js +7 -0
  26. package/dist/egress-check.js.map +1 -1
  27. package/dist/index.js +16 -4
  28. package/dist/index.js.map +1 -1
  29. package/dist/lifecycle.d.ts +1 -1
  30. package/dist/lifecycle.js +24 -2
  31. package/dist/lifecycle.js.map +1 -1
  32. package/dist/net/firewall.d.ts +26 -1
  33. package/dist/net/firewall.js +175 -35
  34. package/dist/net/firewall.js.map +1 -1
  35. package/dist/proxy/egress.js +25 -0
  36. package/dist/proxy/egress.js.map +1 -1
  37. package/dist/smoke.js +8 -0
  38. package/dist/smoke.js.map +1 -1
  39. package/dist/store.d.ts +8 -0
  40. package/dist/store.js +25 -0
  41. package/dist/store.js.map +1 -1
  42. package/dist/tracing.d.ts +1 -0
  43. package/dist/tracing.js +17 -3
  44. package/dist/tracing.js.map +1 -1
  45. package/package.json +2 -2
package/dist/audit.js ADDED
@@ -0,0 +1,260 @@
1
+ import { appendFile, mkdir } from "node:fs/promises";
2
+ import { readFileSync } from "node:fs";
3
+ import { dirname } from "node:path";
4
+ import { createHash } from "node:crypto";
5
+ import { hostname } from "node:os";
6
+ import { log } from "./logger.js";
7
+ export const AUDIT_LIMITS = {
8
+ maxQueueEvents: 2048,
9
+ maxBatchEvents: 128,
10
+ maxBatchBytes: 512 * 1024,
11
+ maxAttempts: 3,
12
+ };
13
+ const HOST_NAME = hostname();
14
+ const SERVICE_VERSION = (() => {
15
+ try {
16
+ const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
17
+ return typeof pkg.version === "string" ? pkg.version : "unknown";
18
+ }
19
+ catch {
20
+ return "unknown";
21
+ }
22
+ })();
23
+ let cfg = { path: "", endpoint: "", headers: {} };
24
+ let queue = [];
25
+ let timer;
26
+ let writes = Promise.resolve();
27
+ let flushInFlight;
28
+ let lastQueueWarningAt = 0;
29
+ export function configureAudit(config) {
30
+ cfg = config;
31
+ if (cfg.endpoint && !timer) {
32
+ timer = setInterval(() => void flushAudit(), 3000);
33
+ timer.unref?.();
34
+ }
35
+ }
36
+ /** Emit one best-effort local JSONL event and, when configured, queue it for OTLP. */
37
+ export function audit(event) {
38
+ const entry = buildAuditEntry(event);
39
+ if (cfg.path) {
40
+ const path = cfg.path;
41
+ writes = writes.then(async () => {
42
+ await mkdir(dirname(path), { recursive: true });
43
+ await appendFile(path, JSON.stringify(entry) + "\n", { mode: 0o600 });
44
+ }).catch((err) => log.warn("audit JSONL write failed", { error: String(err) }));
45
+ }
46
+ if (cfg.endpoint)
47
+ enqueue({ entry, attempts: 0, nextAttemptAt: 0 });
48
+ }
49
+ /** Build a stable local audit event; exported to keep serialization unit-testable. */
50
+ export function buildAuditEntry(event, at = new Date()) {
51
+ const rawToken = event.attributes?.["token.raw"];
52
+ const attributes = Object.fromEntries(Object.entries(event.attributes ?? {}).filter(([key]) => key !== "token.raw"));
53
+ const severity = event.severity ?? severityForEvent(event.event);
54
+ const action = event.action ?? actionForEvent(event.event);
55
+ return {
56
+ ...attributes,
57
+ timestamp: at.toISOString(),
58
+ schema_version: "1.0",
59
+ event: event.event,
60
+ "event.action": action,
61
+ "beacon.event.action": action,
62
+ "session.id": event.sandboxId ?? "",
63
+ "sandbox.id": event.sandboxId ?? "",
64
+ "token.id": typeof rawToken === "string"
65
+ ? createHash("sha256").update(rawToken).digest("hex")
66
+ : undefined,
67
+ driver: event.driver ?? "",
68
+ host: HOST_NAME,
69
+ "host.name": HOST_NAME,
70
+ severityText: severity,
71
+ severityNumber: severityNumber(severity),
72
+ };
73
+ }
74
+ /** Convert an OTLP AnyValue; JSON numbers with fractions must use doubleValue. */
75
+ export function toOtlpAnyValue(value) {
76
+ if (typeof value === "boolean")
77
+ return { boolValue: value };
78
+ if (typeof value === "number" && Number.isFinite(value)) {
79
+ return Number.isInteger(value) ? { intValue: value } : { doubleValue: value };
80
+ }
81
+ return { stringValue: String(value) };
82
+ }
83
+ /** Build an OTLP/JSON ExportLogsServiceRequest from already-normalized events. */
84
+ export function buildOtlpLogsPayload(entries) {
85
+ return {
86
+ resourceLogs: [{
87
+ resource: { attributes: [
88
+ { key: "service.name", value: { stringValue: "hotcell" } },
89
+ { key: "service.version", value: { stringValue: SERVICE_VERSION } },
90
+ { key: "host.name", value: { stringValue: HOST_NAME } },
91
+ ] },
92
+ scopeLogs: [{
93
+ scope: { name: "hotcell.audit", version: "1.0" },
94
+ logRecords: entries.map((entry) => ({
95
+ timeUnixNano: String(BigInt(Date.parse(String(entry.timestamp))) * 1000000n),
96
+ severityNumber: entry.severityNumber ?? 9,
97
+ severityText: entry.severityText ?? "INFO",
98
+ body: { stringValue: String(entry.event ?? "") },
99
+ attributes: Object.entries(entry)
100
+ .filter(([key, value]) => value !== undefined
101
+ && key !== "timestamp" && key !== "event"
102
+ && key !== "severityText" && key !== "severityNumber")
103
+ .map(([key, value]) => ({ key, value: toOtlpAnyValue(value) })),
104
+ })),
105
+ }],
106
+ }],
107
+ };
108
+ }
109
+ /** Best-effort bounded shutdown flush; a dead collector cannot hold shutdown forever. */
110
+ export async function stopAudit() {
111
+ if (timer)
112
+ clearInterval(timer);
113
+ timer = undefined;
114
+ await flushAudit();
115
+ await writes;
116
+ }
117
+ /** Flush at most one bounded batch. Failures are retried a limited number of times. */
118
+ export async function flushAudit() {
119
+ if (flushInFlight)
120
+ return flushInFlight;
121
+ if (!cfg.endpoint || !queue.length)
122
+ return;
123
+ const operation = deliverOneBatch();
124
+ flushInFlight = operation;
125
+ try {
126
+ await operation;
127
+ }
128
+ finally {
129
+ if (flushInFlight === operation)
130
+ flushInFlight = undefined;
131
+ }
132
+ }
133
+ async function deliverOneBatch() {
134
+ const batch = takeBatch();
135
+ if (batch.length === 0)
136
+ return;
137
+ try {
138
+ const response = await fetch(cfg.endpoint + "/v1/logs", {
139
+ method: "POST",
140
+ headers: { "content-type": "application/json", ...cfg.headers },
141
+ signal: AbortSignal.timeout(5000),
142
+ body: JSON.stringify(buildOtlpLogsPayload(batch.map((item) => item.entry))),
143
+ });
144
+ if (!response.ok)
145
+ throw new Error("status " + response.status);
146
+ }
147
+ catch (err) {
148
+ const now = Date.now();
149
+ let dropped = 0;
150
+ for (const item of batch) {
151
+ item.attempts += 1;
152
+ if (item.attempts >= AUDIT_LIMITS.maxAttempts) {
153
+ dropped += 1;
154
+ continue;
155
+ }
156
+ item.nextAttemptAt = now + Math.min(30_000, 1000 * 2 ** (item.attempts - 1));
157
+ enqueue(item);
158
+ }
159
+ log.warn("audit OTLP export failed", {
160
+ error: String(err), events: batch.length, retrying: batch.length - dropped, dropped,
161
+ });
162
+ }
163
+ }
164
+ function takeBatch() {
165
+ const batch = [];
166
+ let index = 0;
167
+ const now = Date.now();
168
+ while (index < queue.length && batch.length < AUDIT_LIMITS.maxBatchEvents) {
169
+ const item = queue[index];
170
+ if (item.nextAttemptAt > now) {
171
+ index += 1;
172
+ continue;
173
+ }
174
+ const candidateBody = JSON.stringify(buildOtlpLogsPayload([
175
+ ...batch.map((pending) => pending.entry), item.entry,
176
+ ]));
177
+ if (Buffer.byteLength(candidateBody, "utf8") > AUDIT_LIMITS.maxBatchBytes) {
178
+ if (batch.length > 0)
179
+ break;
180
+ queue.splice(index, 1);
181
+ log.warn("oversized audit event dropped from OTLP queue", {
182
+ maxBytes: AUDIT_LIMITS.maxBatchBytes,
183
+ });
184
+ continue;
185
+ }
186
+ queue.splice(index, 1);
187
+ batch.push(item);
188
+ }
189
+ return batch;
190
+ }
191
+ function enqueue(item) {
192
+ if (queue.length >= AUDIT_LIMITS.maxQueueEvents) {
193
+ queue.shift();
194
+ if (Date.now() - lastQueueWarningAt >= 60_000) {
195
+ lastQueueWarningAt = Date.now();
196
+ log.warn("audit OTLP queue full; oldest event dropped", {
197
+ maxQueueEvents: AUDIT_LIMITS.maxQueueEvents,
198
+ });
199
+ }
200
+ }
201
+ queue.push(item);
202
+ }
203
+ function actionForEvent(event) {
204
+ const known = {
205
+ "sandbox.create": "sandbox.created",
206
+ "sandbox.start": "sandbox.started",
207
+ "sandbox.stop": "sandbox.stopped",
208
+ "sandbox.pause": "sandbox.paused",
209
+ "sandbox.resume": "sandbox.resumed",
210
+ "sandbox.destroy": "sandbox.destroyed",
211
+ "sandbox.admission_denied": "sandbox.create.denied",
212
+ "sandbox.exec.start": "command.started",
213
+ "sandbox.exec": "command.executed",
214
+ "sandbox.process.start": "process.started",
215
+ "sandbox.file.read": "file.read",
216
+ "sandbox.file.write": "file.written",
217
+ "sandbox.file.mkdir": "file.directory_created",
218
+ "sandbox.terminal.open": "terminal.connected",
219
+ "sandbox.terminal.close": "terminal.disconnected",
220
+ "sandbox.preview.expose": "preview.port_exposed",
221
+ "sandbox.preview.unexpose": "preview.port_unexposed",
222
+ "sandbox.backup.create": "backup.created",
223
+ "sandbox.backup.restore": "backup.restored",
224
+ "sandbox.backup.delete": "backup.deleted",
225
+ "egress.firewall.drop": "egress.denied",
226
+ "egress.connection.allowed": "egress.allowed",
227
+ "egress.connection.denied": "egress.denied",
228
+ "gateway.call": "gateway.request.completed",
229
+ "gateway.policy.rejected": "egress.denied",
230
+ "gateway.spend_cap_reached": "spend.limit_reached",
231
+ "auth.rejected": "authentication.denied",
232
+ "auth.host_rejected": "authentication.host_denied",
233
+ };
234
+ return known[event] ?? event;
235
+ }
236
+ function severityForEvent(event) {
237
+ if (/\.(?:error|failed)$/.test(event))
238
+ return "ERROR";
239
+ if (/(?:denied|rejected|expired|drop|refused|spend_cap_reached|limit_reached)/i.test(event))
240
+ return "WARN";
241
+ return "INFO";
242
+ }
243
+ function severityNumber(severity) {
244
+ return severity === "ERROR" ? 17 : severity === "WARN" ? 13 : 9;
245
+ }
246
+ /** Redact likely credential forms from shell command strings before audit logging. */
247
+ export function redactCommandForAudit(command) {
248
+ return command
249
+ .replace(/\b([A-Za-z_][A-Za-z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD)[A-Za-z0-9_]*\s*=\s*)(?:"[^"]*"|'[^']*'|[^\s;&|]+)/gi, "$1[REDACTED]")
250
+ .replace(/((?:^|\s)(?:-H|--header)(?:\s+|=))(["'])(?:authorization|x-api-key)\s*:[\s\S]*?\2/gi, "$1$2[REDACTED]$2")
251
+ .replace(/((?:^|\s)(?:-H|--header)(?:\s+|=))(authorization|x-api-key)\s*:\s*(?:bearer\s+)?[^\s"';&|]+/gi, "$1$2: [REDACTED]")
252
+ .replace(/((?:^|\s)(?:--token|--api[-_]?key|--secret|--password|--auth)(?:=|\s+))(?:"[^"]*"|'[^']*'|[^\s;&|]+)/gi, "$1[REDACTED]")
253
+ .replace(/((?:^|\s)(?:-u|--user)(?:=|\s+))(?:"[^"]*"|'[^']*'|[^\s;&|]+)/gi, "$1[REDACTED]")
254
+ .replace(/(authorization\s*:\s*bearer\s+)[^\s"']+/gi, "$1[REDACTED]")
255
+ .replace(/(x-api-key\s*:\s*)[^\s"']+/gi, "$1[REDACTED]")
256
+ .replace(/\b(?:sk-[A-Za-z0-9_-]{12,}|gh[pousr]_[A-Za-z0-9]{20,}|AKIA[0-9A-Z]{16})\b/g, "[REDACTED]")
257
+ .replace(/(https?:\/\/)[^/@\s]+@/gi, "$1[REDACTED]@")
258
+ .slice(0, 512);
259
+ }
260
+ //# sourceMappingURL=audit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.js","sourceRoot":"","sources":["../src/audit.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ export interface BootSchedulerSnapshot {
2
+ limit: number;
3
+ active: number;
4
+ queued: number;
5
+ completed: number;
6
+ timedOut: number;
7
+ }
8
+ /** Bounds expensive VM boots without limiting cheap container creates. */
9
+ export declare class BootScheduler {
10
+ private readonly limit;
11
+ private readonly timeoutMs;
12
+ private active;
13
+ private completed;
14
+ private timedOut;
15
+ private readonly queue;
16
+ constructor(limit: number, timeoutMs: number);
17
+ run<T>(name: string, run: () => Promise<T>, onQueued?: () => void): Promise<T>;
18
+ snapshot(): BootSchedulerSnapshot;
19
+ private execute;
20
+ private drain;
21
+ }
22
+ export declare class BootQueueTimeoutError extends Error {
23
+ readonly code = "BOOT_QUEUE_TIMEOUT";
24
+ constructor(timeoutMs: number);
25
+ }
@@ -0,0 +1,81 @@
1
+ import { log } from "./logger.js";
2
+ /** Bounds expensive VM boots without limiting cheap container creates. */
3
+ export class BootScheduler {
4
+ limit;
5
+ timeoutMs;
6
+ active = 0;
7
+ completed = 0;
8
+ timedOut = 0;
9
+ queue = [];
10
+ constructor(limit, timeoutMs) {
11
+ this.limit = limit;
12
+ this.timeoutMs = timeoutMs;
13
+ }
14
+ run(name, run, onQueued) {
15
+ if (this.limit <= 0 || this.active < this.limit) {
16
+ this.active++;
17
+ return this.execute(name, run);
18
+ }
19
+ onQueued?.();
20
+ return new Promise((resolve, reject) => {
21
+ const waiter = { name, queuedAt: Date.now(), run, resolve, reject };
22
+ if (this.timeoutMs > 0) {
23
+ waiter.timer = setTimeout(() => {
24
+ const index = this.queue.indexOf(waiter);
25
+ if (index < 0)
26
+ return;
27
+ this.queue.splice(index, 1);
28
+ this.timedOut++;
29
+ reject(new BootQueueTimeoutError(this.timeoutMs));
30
+ log.warn("microVM boot queue timeout", { name, timeoutMs: this.timeoutMs });
31
+ }, this.timeoutMs);
32
+ waiter.timer.unref?.();
33
+ }
34
+ this.queue.push(waiter);
35
+ });
36
+ }
37
+ snapshot() {
38
+ return {
39
+ limit: this.limit,
40
+ active: this.active,
41
+ queued: this.queue.length,
42
+ completed: this.completed,
43
+ timedOut: this.timedOut,
44
+ };
45
+ }
46
+ async execute(name, run) {
47
+ const startedAt = Date.now();
48
+ try {
49
+ return await run();
50
+ }
51
+ finally {
52
+ this.active--;
53
+ this.completed++;
54
+ log.debug("microVM boot slot released", {
55
+ name,
56
+ durationMs: Date.now() - startedAt,
57
+ ...this.snapshot(),
58
+ });
59
+ this.drain();
60
+ }
61
+ }
62
+ drain() {
63
+ while (this.active < this.limit && this.queue.length > 0) {
64
+ const waiter = this.queue.shift();
65
+ if (waiter.timer)
66
+ clearTimeout(waiter.timer);
67
+ this.active++;
68
+ const waitMs = Date.now() - waiter.queuedAt;
69
+ log.debug("microVM boot dequeued", { name: waiter.name, waitMs, ...this.snapshot() });
70
+ this.execute(waiter.name, waiter.run).then(waiter.resolve, waiter.reject);
71
+ }
72
+ }
73
+ }
74
+ export class BootQueueTimeoutError extends Error {
75
+ code = "BOOT_QUEUE_TIMEOUT";
76
+ constructor(timeoutMs) {
77
+ super(`microVM boot queue timed out after ${timeoutMs}ms`);
78
+ this.name = "BootQueueTimeoutError";
79
+ }
80
+ }
81
+ //# sourceMappingURL=boot-scheduler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot-scheduler.js","sourceRoot":"","sources":["../src/boot-scheduler.ts"],"names":[],"mappings":"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"}
package/dist/config.d.ts CHANGED
@@ -36,6 +36,10 @@ export interface Config {
36
36
  defaultCpus: number;
37
37
  /** Default per-sandbox process/thread cap for new sandboxes (`0` = unlimited). */
38
38
  defaultPidsLimit: number;
39
+ /** Maximum simultaneous cold microVM creates (`0` = unlimited). */
40
+ microvmBootConcurrency: number;
41
+ /** Maximum time a microVM create waits for a boot slot (`0` = unlimited). */
42
+ microvmBootQueueTimeoutMs: number;
39
43
  /**
40
44
  * Admission control: `enforce` rejects `create` when the host's memory budget
41
45
  * is exhausted (prevents over-subscription / OOM when launching many
@@ -216,11 +220,19 @@ export interface Config {
216
220
  */
217
221
  apiKey: string;
218
222
  /**
219
- * OTLP/HTTP traces endpoint (e.g. `http://localhost:4318`). When set, spans are
220
- * batch-exported to `<endpoint>/v1/traces`. Empty disables export; recent spans
221
- * are always kept in-memory for `GET /traces` regardless.
223
+ * Shared OTLP/HTTP endpoint for traces and audit logs (e.g. `http://localhost:4318`).
224
+ * Spans export to `/v1/traces`; audit records export to `/v1/logs`. Empty disables
225
+ * trace export and is the audit fallback when no audit-specific override is set.
222
226
  */
223
227
  otlpEndpoint: string;
228
+ /** Headers shared by OTLP exporters, parsed from `HOTCELL_OTLP_HEADERS`. */
229
+ otlpHeaders: Record<string, string>;
230
+ /** Audit-only endpoint override; `HOTCELL_OTEL_ENDPOINT` remains a legacy alias. */
231
+ auditOtlpEndpoint: string;
232
+ /** Audit-only headers; `HOTCELL_OTEL_HEADERS` remains a legacy override. */
233
+ auditOtlpHeaders: Record<string, string>;
234
+ /** Local append-only JSONL audit log path; empty disables local persistence. */
235
+ auditPath: string;
224
236
  /** How many of the most recent metric samples per sandbox to retain in memory. */
225
237
  metricsHistory: number;
226
238
  /** How many of the most recent finished spans to retain in memory for `/traces`. */
package/dist/config.js CHANGED
@@ -89,6 +89,8 @@ export function loadConfig() {
89
89
  defaultMemoryMb: Number(env("DEFAULT_MEMORY_MB") ?? 0),
90
90
  defaultCpus: Number(env("DEFAULT_CPUS") ?? 0),
91
91
  defaultPidsLimit: Number(env("DEFAULT_PIDS") ?? 0),
92
+ microvmBootConcurrency: Number(env("MICROVM_BOOT_CONCURRENCY") ?? 4),
93
+ microvmBootQueueTimeoutMs: Number(env("MICROVM_BOOT_QUEUE_TIMEOUT_MS") ?? 120000),
92
94
  admission: env("ADMISSION") === "off" ? "off" : "enforce",
93
95
  hostMemoryMb: Number(env("HOST_MEMORY_MB") ?? 0),
94
96
  hostCpus: Number(env("HOST_CPUS") ?? 0),
@@ -139,6 +141,12 @@ export function loadConfig() {
139
141
  logFormat: env("LOG_FORMAT") === "json" ? "json" : "pretty",
140
142
  apiKey: env("API_KEY") ?? "",
141
143
  otlpEndpoint: (env("OTLP_ENDPOINT") ?? "").replace(/\/$/, ""),
144
+ otlpHeaders: parseHeaders(env("OTLP_HEADERS")),
145
+ // Canonical OTLP endpoint/headers are shared; the older OTEL_* settings
146
+ // remain audit-specific overrides for backward compatibility.
147
+ auditOtlpEndpoint: (env("OTEL_ENDPOINT") ?? env("OTLP_ENDPOINT") ?? "").replace(/\/$/, ""),
148
+ auditOtlpHeaders: parseHeaders(env("OTEL_HEADERS") ?? env("OTLP_HEADERS")),
149
+ auditPath: env("AUDIT_FILE") ?? join(stateRoot(), "audit.jsonl"),
142
150
  metricsHistory: Number(env("METRICS_HISTORY") ?? 60),
143
151
  traceRing: Number(env("TRACE_RING") ?? 200),
144
152
  maxBodyBytes: Number(env("MAX_BODY_BYTES") ?? 32 * 1024 * 1024),
@@ -195,6 +203,20 @@ export function loadProviderConfigs() {
195
203
  }
196
204
  return out;
197
205
  }
206
+ function parseHeaders(value) {
207
+ if (!value)
208
+ return {};
209
+ try {
210
+ const parsed = JSON.parse(value);
211
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
212
+ return {};
213
+ return Object.fromEntries(Object.entries(parsed).filter((entry) => typeof entry[1] === "string"));
214
+ }
215
+ catch {
216
+ console.error("[hotcell] ignoring malformed HOTCELL_OTEL_HEADERS (expected JSON object)");
217
+ return {};
218
+ }
219
+ }
198
220
  function parseLogLevel(value) {
199
221
  return value === "debug" || value === "info" || value === "warn" || value === "error"
200
222
  ? value
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,9 @@ export declare class ContainerDriver implements Driver {
25
25
  private ensured;
26
26
  private egress?;
27
27
  private egressNetReady;
28
+ private egressIpCache;
29
+ private egressIpCacheAt;
30
+ private egressIpRefresh?;
28
31
  constructor(docker?: Docker, egress?: EgressNetConfig);
29
32
  private containerName;
30
33
  /** Deterministic name for the sandbox's persistent workspace volume. */
@@ -38,6 +41,9 @@ export declare class ContainerDriver implements Driver {
38
41
  * load). No-op when enforcement is off.
39
42
  */
40
43
  initEgress(): Promise<void>;
44
+ /** Map a logged firewall source IP back to the sandbox id Docker labeled on create. */
45
+ sandboxIdForEgressIp(ip: string): Promise<string | undefined>;
46
+ private refreshEgressIpCache;
41
47
  /**
42
48
  * Ensure the egress-enforcement bridge network exists on the configured subnet
43
49
  * (idempotent). The subnet must match so the host firewall's `-s <subnet>` rules
@@ -77,6 +83,15 @@ export declare class ContainerDriver implements Driver {
77
83
  private runSetup;
78
84
  start(opts: CreateOptions): Promise<void>;
79
85
  stop(id: string): Promise<void>;
86
+ /**
87
+ * Force-remove a container, absorbing every "someone beat us to it" answer:
88
+ * 404 (already gone) and 409 (a removal is already in progress — the idle
89
+ * reaper and a client DELETE routinely race here, and surfacing that race as
90
+ * a 500 once made a client read its own successful run as failed). On 409 we
91
+ * wait for the winning removal to finish, so callers can safely reclaim
92
+ * dependent resources like the workspace volume.
93
+ */
94
+ private removeContainerIdempotent;
80
95
  /** Shared create/start path: ensure image (+volume), then run the container. */
81
96
  private launchContainer;
82
97
  exec(id: string, command: string, opts: ExecOptions, onEvent: (e: ExecEvent) => void): Promise<number>;