feat: switch foundry backend from Bun to Node.js

- Replace Bun.serve() with @hono/node-server (already a dependency)
- Replace Bun-specific debug APIs (Bun.gc, Bun.heapStats,
  Bun.generateHeapSnapshot) with Node.js equivalents (globalThis.gc)
- Update all three Dockerfiles from oven/bun base images to
  node:22-bookworm-slim
- Remove @types/bun devDependency
- Update package.json scripts to use node/npx instead of bun

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nathan Flurry 2026-03-22 04:46:52 -07:00
parent 62d56fae64
commit bc872da6f2
6 changed files with 37 additions and 86 deletions

View file

@ -16,7 +16,7 @@ RUN SKIP_OPENAPI_GEN=1 pnpm --filter sandbox-agent build
RUN pnpm --filter @sandbox-agent/foundry-backend build RUN pnpm --filter @sandbox-agent/foundry-backend build
RUN pnpm --filter @sandbox-agent/foundry-backend deploy --prod /out RUN pnpm --filter @sandbox-agent/foundry-backend deploy --prod /out
FROM oven/bun:1.2 AS runtime FROM node:22-bookworm-slim AS runtime
ENV NODE_ENV=production ENV NODE_ENV=production
ENV HOME=/home/task ENV HOME=/home/task
ENV RIVET_RUNNER_VERSION_FILE=/etc/foundry/rivet-runner-version ENV RIVET_RUNNER_VERSION_FILE=/etc/foundry/rivet-runner-version
@ -37,4 +37,4 @@ RUN mkdir -p /etc/foundry \
COPY --from=build /out ./ COPY --from=build /out ./
USER task USER task
EXPOSE 7741 EXPOSE 7741
CMD ["bun", "dist/index.js", "start", "--host", "0.0.0.0"] CMD ["node", "dist/index.js", "start", "--host", "0.0.0.0"]

View file

@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1.7 # syntax=docker/dockerfile:1.7
FROM oven/bun:1.3 FROM node:22-bookworm-slim
ARG SANDBOX_AGENT_VERSION=0.3.0 ARG SANDBOX_AGENT_VERSION=0.3.0
@ -10,8 +10,6 @@ RUN apt-get update \
curl \ curl \
git \ git \
gh \ gh \
nodejs \
npm \
openssh-client \ openssh-client \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
@ -27,8 +25,4 @@ RUN mkdir -p /etc/foundry \
WORKDIR /app WORKDIR /app
# NOTE: Do NOT use `bun --hot` here. Bun's hot reloading re-initializes the CMD ["bash", "-lc", "git config --global --add safe.directory /app >/dev/null 2>&1 || true; pnpm install --frozen-lockfile --filter @sandbox-agent/foundry-backend... && pnpm --filter @sandbox-agent/foundry-shared build && pnpm --filter @sandbox-agent/foundry-backend build && exec node foundry/packages/backend/dist/index.js start --host 0.0.0.0 --port 7741"]
# server on a new port (e.g. 6421 instead of 6420) while the container still
# exposes the original port, breaking all client connections. Restart the
# backend container instead: `just foundry-dev-down && just foundry-dev`
CMD ["bash", "-lc", "git config --global --add safe.directory /app >/dev/null 2>&1 || true; pnpm install --frozen-lockfile --filter @sandbox-agent/foundry-backend... && exec bun foundry/packages/backend/src/index.ts start --host 0.0.0.0 --port 7741"]

View file

@ -1,6 +1,6 @@
# syntax=docker/dockerfile:1.7 # syntax=docker/dockerfile:1.7
FROM oven/bun:1.3 FROM node:22-bookworm-slim
ARG SANDBOX_AGENT_VERSION=0.3.0 ARG SANDBOX_AGENT_VERSION=0.3.0
@ -10,8 +10,6 @@ RUN apt-get update \
curl \ curl \
git \ git \
gh \ gh \
nodejs \
npm \
openssh-client \ openssh-client \
&& npm install -g pnpm@10.28.2 \ && npm install -g pnpm@10.28.2 \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
@ -33,4 +31,4 @@ RUN pnpm --filter @sandbox-agent/foundry-shared build
RUN pnpm --filter @sandbox-agent/foundry-client build RUN pnpm --filter @sandbox-agent/foundry-client build
RUN pnpm --filter @sandbox-agent/foundry-backend build RUN pnpm --filter @sandbox-agent/foundry-backend build
CMD ["bash", "-lc", "git config --global --add safe.directory /workspace/quebec >/dev/null 2>&1 || true; exec bun packages/backend/dist/index.js start --host 0.0.0.0 --port 7841"] CMD ["bash", "-lc", "git config --global --add safe.directory /workspace/quebec >/dev/null 2>&1 || true; exec node packages/backend/dist/index.js start --host 0.0.0.0 --port 7841"]

View file

@ -7,10 +7,10 @@
"types": "dist/index.d.ts", "types": "dist/index.d.ts",
"scripts": { "scripts": {
"build": "tsup src/index.ts --format esm", "build": "tsup src/index.ts --format esm",
"db:generate": "find src/actors -name drizzle.config.ts -exec pnpm exec drizzle-kit generate --config {} \\; && \"$HOME/.bun/bin/bun\" src/actors/_scripts/generate-actor-migrations.ts", "db:generate": "find src/actors -name drizzle.config.ts -exec pnpm exec drizzle-kit generate --config {} \\; && npx tsx src/actors/_scripts/generate-actor-migrations.ts",
"typecheck": "tsc --noEmit", "typecheck": "tsc --noEmit",
"test": "$HOME/.bun/bin/bun x vitest run", "test": "npx vitest run",
"start": "bun dist/index.js start" "start": "node dist/index.js start"
}, },
"dependencies": { "dependencies": {
"@e2b/code-interpreter": "^2.3.3", "@e2b/code-interpreter": "^2.3.3",
@ -31,7 +31,6 @@
"zod": "^4.1.5" "zod": "^4.1.5"
}, },
"devDependencies": { "devDependencies": {
"@types/bun": "^1.3.9",
"tsup": "^8.5.0" "tsup": "^8.5.0"
} }
} }

View file

@ -1,5 +1,6 @@
import { Hono } from "hono"; import { Hono } from "hono";
import { cors } from "hono/cors"; import { cors } from "hono/cors";
import { serve } from "@hono/node-server";
import { randomUUID } from "node:crypto"; import { randomUUID } from "node:crypto";
import { initActorRuntimeContext } from "./actors/context.js"; import { initActorRuntimeContext } from "./actors/context.js";
import { registry } from "./actors/index.js"; import { registry } from "./actors/index.js";
@ -145,16 +146,13 @@ export async function startBackend(options: BackendStartOptions = {}): Promise<v
// On-demand memory snapshot endpoint for diagnosing spikes (dev only). // On-demand memory snapshot endpoint for diagnosing spikes (dev only).
// Usage: curl http://127.0.0.1:7741/debug/memory // Usage: curl http://127.0.0.1:7741/debug/memory
// Trigger GC first: curl http://127.0.0.1:7741/debug/memory?gc=1 // Trigger GC first: curl http://127.0.0.1:7741/debug/memory?gc=1
// Write JSC heap snapshot: curl http://127.0.0.1:7741/debug/memory?heap=1
// (writes /tmp/foundry-heap-<timestamp>.json, inspect with chrome://tracing)
app.get("/debug/memory", async (c) => { app.get("/debug/memory", async (c) => {
if (process.env.NODE_ENV !== "development") { if (process.env.NODE_ENV !== "development") {
return c.json({ error: "debug endpoints disabled in production" }, 403); return c.json({ error: "debug endpoints disabled in production" }, 403);
} }
const wantGc = c.req.query("gc") === "1"; const wantGc = c.req.query("gc") === "1";
if (wantGc && typeof Bun !== "undefined") { if (wantGc && globalThis.gc) {
// Bun.gc(true) triggers a synchronous full GC sweep in JavaScriptCore. globalThis.gc();
Bun.gc(true);
} }
const mem = process.memoryUsage(); const mem = process.memoryUsage();
const rssMb = Math.round(mem.rss / 1024 / 1024); const rssMb = Math.round(mem.rss / 1024 / 1024);
@ -162,12 +160,6 @@ export async function startBackend(options: BackendStartOptions = {}): Promise<v
const heapTotalMb = Math.round(mem.heapTotal / 1024 / 1024); const heapTotalMb = Math.round(mem.heapTotal / 1024 / 1024);
const externalMb = Math.round(mem.external / 1024 / 1024); const externalMb = Math.round(mem.external / 1024 / 1024);
const nonHeapMb = rssMb - heapUsedMb - externalMb; const nonHeapMb = rssMb - heapUsedMb - externalMb;
// Bun.heapStats() gives JSC-specific breakdown: object counts, typed array
// bytes, extra memory (native allocations tracked by JSC). Useful for
// distinguishing JS object bloat from native/WASM memory.
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const BunAny = Bun as any;
const heapStats = typeof BunAny.heapStats === "function" ? BunAny.heapStats() : null;
const snapshot = { const snapshot = {
rssMb, rssMb,
heapUsedMb, heapUsedMb,
@ -179,19 +171,9 @@ export async function startBackend(options: BackendStartOptions = {}): Promise<v
heapUsedBytes: mem.heapUsed, heapUsedBytes: mem.heapUsed,
heapTotalBytes: mem.heapTotal, heapTotalBytes: mem.heapTotal,
externalBytes: mem.external, externalBytes: mem.external,
...(heapStats ? { bunHeapStats: heapStats } : {}),
}; };
// Optionally write a full JSC heap snapshot for offline analysis.
let heapSnapshotPath: string | null = null;
const wantHeap = c.req.query("heap") === "1";
if (wantHeap && typeof Bun !== "undefined") {
heapSnapshotPath = `/tmp/foundry-heap-${Date.now()}.json`;
// Bun.generateHeapSnapshot("v8") returns a V8-compatible JSON string.
const heapJson = Bun.generateHeapSnapshot("v8");
await Bun.write(heapSnapshotPath, heapJson);
}
logger.info(snapshot, "memory_usage_debug"); logger.info(snapshot, "memory_usage_debug");
return c.json({ ...snapshot, ...(heapSnapshotPath ? { heapSnapshotPath } : {}) }); return c.json(snapshot);
}); });
app.use("*", async (c, next) => { app.use("*", async (c, next) => {
@ -398,20 +380,16 @@ export async function startBackend(options: BackendStartOptions = {}): Promise<v
return c.json({ ok: true }); return c.json({ ok: true });
}); });
const server = Bun.serve({ // Combine RivetKit registry handler with Hono app
fetch: (request) => { const combinedApp = new Hono();
if (isRivetRequest(request)) { combinedApp.all("/v1/rivet/*", (c) => registry.handler(c.req.raw));
return registry.handler(request); combinedApp.all("/v1/rivet", (c) => registry.handler(c.req.raw));
} combinedApp.route("/", app);
return app.fetch(request);
}, const server = serve({
fetch: combinedApp.fetch,
hostname: config.backend.host, hostname: config.backend.host,
port: config.backend.port, port: config.backend.port,
// Bun defaults to 10s idle timeout. Actor RPCs go through the gateway
// tunnel (not direct HTTP), and the SSE stream has a 1s ping interval
// (RUNNER_SSE_PING_INTERVAL in rivetkit), so the idle timeout likely
// never fires in practice. Set high as a safety net regardless.
idleTimeout: 255,
}); });
logger.info( logger.info(
@ -424,7 +402,7 @@ export async function startBackend(options: BackendStartOptions = {}): Promise<v
// Periodic memory usage reporting for diagnosing memory spikes (dev only). // Periodic memory usage reporting for diagnosing memory spikes (dev only).
// Logs JS heap, RSS, and external (native/WASM) separately so we can tell // Logs JS heap, RSS, and external (native/WASM) separately so we can tell
// whether spikes come from JS objects, Bun/JSC internals, or native addons // whether spikes come from JS objects, V8 internals, or native addons
// like SQLite/WASM. // like SQLite/WASM.
if (process.env.NODE_ENV === "development") { if (process.env.NODE_ENV === "development") {
let prevRss = 0; let prevRss = 0;
@ -436,7 +414,7 @@ export async function startBackend(options: BackendStartOptions = {}): Promise<v
const externalMb = Math.round(mem.external / 1024 / 1024); const externalMb = Math.round(mem.external / 1024 / 1024);
// Non-heap RSS: memory not accounted for by JS heap or external buffers. // Non-heap RSS: memory not accounted for by JS heap or external buffers.
// Large values here point to native allocations (WASM, mmap, child process // Large values here point to native allocations (WASM, mmap, child process
// bookkeeping, Bun's internal arena, etc.). // bookkeeping, etc.).
const nonHeapMb = rssMb - heapUsedMb - externalMb; const nonHeapMb = rssMb - heapUsedMb - externalMb;
const deltaRss = rssMb - prevRss; const deltaRss = rssMb - prevRss;
prevRss = rssMb; prevRss = rssMb;
@ -459,12 +437,12 @@ export async function startBackend(options: BackendStartOptions = {}): Promise<v
} }
process.on("SIGINT", async () => { process.on("SIGINT", async () => {
server.stop(); server.close();
process.exit(0); process.exit(0);
}); });
process.on("SIGTERM", async () => { process.on("SIGTERM", async () => {
server.stop(); server.close();
process.exit(0); process.exit(0);
}); });

42
pnpm-lock.yaml generated
View file

@ -494,7 +494,7 @@ importers:
version: link:../shared version: link:../shared
better-auth: better-auth:
specifier: ^1.5.5 specifier: ^1.5.5
version: 1.5.5(@cloudflare/workers-types@4.20260317.1)(drizzle-kit@0.31.9)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(bun-types@1.3.10)(kysely@0.28.11)(pg@8.20.0))(pg@8.20.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(solid-js@1.9.11)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.5.0)(jiti@1.21.7)(jsdom@26.1.0)(tsx@4.21.0)(yaml@2.8.2)) version: 1.5.5(@cloudflare/workers-types@4.20260317.1)(drizzle-kit@0.31.9)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(kysely@0.28.11)(pg@8.20.0))(pg@8.20.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(solid-js@1.9.11)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.5.0)(jiti@1.21.7)(jsdom@26.1.0)(tsx@4.21.0)(yaml@2.8.2))
dockerode: dockerode:
specifier: ^4.0.9 specifier: ^4.0.9
version: 4.0.9 version: 4.0.9
@ -503,7 +503,7 @@ importers:
version: 0.31.9 version: 0.31.9
drizzle-orm: drizzle-orm:
specifier: ^0.44.5 specifier: ^0.44.5
version: 0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(bun-types@1.3.10)(kysely@0.28.11)(pg@8.20.0) version: 0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(kysely@0.28.11)(pg@8.20.0)
hono: hono:
specifier: ^4.11.9 specifier: ^4.11.9
version: 4.12.2 version: 4.12.2
@ -512,7 +512,7 @@ importers:
version: 10.3.1 version: 10.3.1
rivetkit: rivetkit:
specifier: https://pkg.pr.new/rivet-dev/rivet/rivetkit@fc5f3b4 specifier: https://pkg.pr.new/rivet-dev/rivet/rivetkit@fc5f3b4
version: https://pkg.pr.new/rivet-dev/rivet/rivetkit@fc5f3b4(@cloudflare/sandbox@0.7.18(@opencode-ai/sdk@1.2.24))(@e2b/code-interpreter@2.3.3)(@standard-schema/spec@1.1.0)(@vercel/sandbox@1.8.1)(computesdk@2.5.1)(dockerode@4.0.9)(drizzle-kit@0.31.9)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(bun-types@1.3.10)(kysely@0.28.11)(pg@8.20.0))(modal@0.7.3)(ws@8.19.0) version: https://pkg.pr.new/rivet-dev/rivet/rivetkit@fc5f3b4(@cloudflare/sandbox@0.7.18(@opencode-ai/sdk@1.2.24))(@e2b/code-interpreter@2.3.3)(@standard-schema/spec@1.1.0)(@vercel/sandbox@1.8.1)(computesdk@2.5.1)(dockerode@4.0.9)(drizzle-kit@0.31.9)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(kysely@0.28.11)(pg@8.20.0))(modal@0.7.3)(ws@8.19.0)
sandbox-agent: sandbox-agent:
specifier: workspace:* specifier: workspace:*
version: link:../../../sdks/typescript version: link:../../../sdks/typescript
@ -526,9 +526,6 @@ importers:
specifier: ^4.1.5 specifier: ^4.1.5
version: 4.3.6 version: 4.3.6
devDependencies: devDependencies:
'@types/bun':
specifier: ^1.3.9
version: 1.3.10
tsup: tsup:
specifier: ^8.5.0 specifier: ^8.5.0
version: 8.5.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2) version: 8.5.1(jiti@1.21.7)(postcss@8.5.6)(tsx@4.21.0)(typescript@5.9.3)(yaml@2.8.2)
@ -543,7 +540,7 @@ importers:
version: 19.2.4 version: 19.2.4
rivetkit: rivetkit:
specifier: https://pkg.pr.new/rivet-dev/rivet/rivetkit@fc5f3b4 specifier: https://pkg.pr.new/rivet-dev/rivet/rivetkit@fc5f3b4
version: https://pkg.pr.new/rivet-dev/rivet/rivetkit@fc5f3b4(@cloudflare/sandbox@0.7.18(@opencode-ai/sdk@1.2.24))(@e2b/code-interpreter@2.3.3)(@standard-schema/spec@1.1.0)(@vercel/sandbox@1.8.1)(computesdk@2.5.1)(dockerode@4.0.9)(drizzle-kit@0.31.9)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(bun-types@1.3.10)(kysely@0.28.11)(pg@8.20.0))(modal@0.7.3)(ws@8.19.0) version: https://pkg.pr.new/rivet-dev/rivet/rivetkit@fc5f3b4(@cloudflare/sandbox@0.7.18(@opencode-ai/sdk@1.2.24))(@e2b/code-interpreter@2.3.3)(@standard-schema/spec@1.1.0)(@vercel/sandbox@1.8.1)(computesdk@2.5.1)(dockerode@4.0.9)(drizzle-kit@0.31.9)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(kysely@0.28.11)(pg@8.20.0))(modal@0.7.3)(ws@8.19.0)
sandbox-agent: sandbox-agent:
specifier: workspace:* specifier: workspace:*
version: link:../../../sdks/typescript version: link:../../../sdks/typescript
@ -3539,9 +3536,6 @@ packages:
'@types/better-sqlite3@7.6.13': '@types/better-sqlite3@7.6.13':
resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==}
'@types/bun@1.3.10':
resolution: {integrity: sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ==}
'@types/chai@5.2.3': '@types/chai@5.2.3':
resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==}
@ -3975,9 +3969,6 @@ packages:
resolution: {integrity: sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==} resolution: {integrity: sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==}
engines: {node: '>=10.0.0'} engines: {node: '>=10.0.0'}
bun-types@1.3.10:
resolution: {integrity: sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg==}
bundle-require@5.1.0: bundle-require@5.1.0:
resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@ -8319,12 +8310,12 @@ snapshots:
optionalDependencies: optionalDependencies:
'@cloudflare/workers-types': 4.20260317.1 '@cloudflare/workers-types': 4.20260317.1
'@better-auth/drizzle-adapter@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(bun-types@1.3.10)(kysely@0.28.11)(pg@8.20.0))': '@better-auth/drizzle-adapter@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(kysely@0.28.11)(pg@8.20.0))':
dependencies: dependencies:
'@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) '@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1)
'@better-auth/utils': 0.3.1 '@better-auth/utils': 0.3.1
optionalDependencies: optionalDependencies:
drizzle-orm: 0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(bun-types@1.3.10)(kysely@0.28.11)(pg@8.20.0) drizzle-orm: 0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(kysely@0.28.11)(pg@8.20.0)
'@better-auth/kysely-adapter@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(kysely@0.28.11)': '@better-auth/kysely-adapter@1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(kysely@0.28.11)':
dependencies: dependencies:
@ -10168,10 +10159,6 @@ snapshots:
dependencies: dependencies:
'@types/node': 24.10.9 '@types/node': 24.10.9
'@types/bun@1.3.10':
dependencies:
bun-types: 1.3.10
'@types/chai@5.2.3': '@types/chai@5.2.3':
dependencies: dependencies:
'@types/deep-eql': 4.0.2 '@types/deep-eql': 4.0.2
@ -10648,10 +10635,10 @@ snapshots:
dependencies: dependencies:
tweetnacl: 0.14.5 tweetnacl: 0.14.5
better-auth@1.5.5(@cloudflare/workers-types@4.20260317.1)(drizzle-kit@0.31.9)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(bun-types@1.3.10)(kysely@0.28.11)(pg@8.20.0))(pg@8.20.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(solid-js@1.9.11)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.5.0)(jiti@1.21.7)(jsdom@26.1.0)(tsx@4.21.0)(yaml@2.8.2)): better-auth@1.5.5(@cloudflare/workers-types@4.20260317.1)(drizzle-kit@0.31.9)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(kysely@0.28.11)(pg@8.20.0))(pg@8.20.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(solid-js@1.9.11)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.5.0)(jiti@1.21.7)(jsdom@26.1.0)(tsx@4.21.0)(yaml@2.8.2)):
dependencies: dependencies:
'@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1) '@better-auth/core': 1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1)
'@better-auth/drizzle-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(bun-types@1.3.10)(kysely@0.28.11)(pg@8.20.0)) '@better-auth/drizzle-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(kysely@0.28.11)(pg@8.20.0))
'@better-auth/kysely-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(kysely@0.28.11) '@better-auth/kysely-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)(kysely@0.28.11)
'@better-auth/memory-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1) '@better-auth/memory-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)
'@better-auth/mongo-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1) '@better-auth/mongo-adapter': 1.5.5(@better-auth/core@1.5.5(@better-auth/utils@0.3.1)(@better-fetch/fetch@1.1.21)(@cloudflare/workers-types@4.20260317.1)(better-call@1.3.2(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.1))(@better-auth/utils@0.3.1)
@ -10669,7 +10656,7 @@ snapshots:
zod: 4.3.6 zod: 4.3.6
optionalDependencies: optionalDependencies:
drizzle-kit: 0.31.9 drizzle-kit: 0.31.9
drizzle-orm: 0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(bun-types@1.3.10)(kysely@0.28.11)(pg@8.20.0) drizzle-orm: 0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(kysely@0.28.11)(pg@8.20.0)
pg: 8.20.0 pg: 8.20.0
react: 19.2.4 react: 19.2.4
react-dom: 19.2.4(react@19.2.4) react-dom: 19.2.4(react@19.2.4)
@ -10773,10 +10760,6 @@ snapshots:
buildcheck@0.0.7: buildcheck@0.0.7:
optional: true optional: true
bun-types@1.3.10:
dependencies:
'@types/node': 24.10.9
bundle-require@5.1.0(esbuild@0.27.3): bundle-require@5.1.0(esbuild@0.27.3):
dependencies: dependencies:
esbuild: 0.27.3 esbuild: 0.27.3
@ -11290,14 +11273,13 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(bun-types@1.3.10)(kysely@0.28.11)(pg@8.20.0): drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(kysely@0.28.11)(pg@8.20.0):
optionalDependencies: optionalDependencies:
'@cloudflare/workers-types': 4.20260317.1 '@cloudflare/workers-types': 4.20260317.1
'@opentelemetry/api': 1.9.0 '@opentelemetry/api': 1.9.0
'@types/better-sqlite3': 7.6.13 '@types/better-sqlite3': 7.6.13
'@types/pg': 8.18.0 '@types/pg': 8.18.0
better-sqlite3: 11.10.0 better-sqlite3: 11.10.0
bun-types: 1.3.10
kysely: 0.28.11 kysely: 0.28.11
pg: 8.20.0 pg: 8.20.0
@ -13433,7 +13415,7 @@ snapshots:
reusify@1.1.0: {} reusify@1.1.0: {}
rivetkit@https://pkg.pr.new/rivet-dev/rivet/rivetkit@fc5f3b4(@cloudflare/sandbox@0.7.18(@opencode-ai/sdk@1.2.24))(@e2b/code-interpreter@2.3.3)(@standard-schema/spec@1.1.0)(@vercel/sandbox@1.8.1)(computesdk@2.5.1)(dockerode@4.0.9)(drizzle-kit@0.31.9)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(bun-types@1.3.10)(kysely@0.28.11)(pg@8.20.0))(modal@0.7.3)(ws@8.19.0): rivetkit@https://pkg.pr.new/rivet-dev/rivet/rivetkit@fc5f3b4(@cloudflare/sandbox@0.7.18(@opencode-ai/sdk@1.2.24))(@e2b/code-interpreter@2.3.3)(@standard-schema/spec@1.1.0)(@vercel/sandbox@1.8.1)(computesdk@2.5.1)(dockerode@4.0.9)(drizzle-kit@0.31.9)(drizzle-orm@0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(kysely@0.28.11)(pg@8.20.0))(modal@0.7.3)(ws@8.19.0):
dependencies: dependencies:
'@hono/node-server': 1.19.9(hono@4.12.2) '@hono/node-server': 1.19.9(hono@4.12.2)
'@hono/node-ws': 1.3.0(@hono/node-server@1.19.9(hono@4.12.2))(hono@4.12.2) '@hono/node-ws': 1.3.0(@hono/node-server@1.19.9(hono@4.12.2))(hono@4.12.2)
@ -13464,7 +13446,7 @@ snapshots:
'@e2b/code-interpreter': 2.3.3 '@e2b/code-interpreter': 2.3.3
dockerode: 4.0.9 dockerode: 4.0.9
drizzle-kit: 0.31.9 drizzle-kit: 0.31.9
drizzle-orm: 0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(bun-types@1.3.10)(kysely@0.28.11)(pg@8.20.0) drizzle-orm: 0.44.7(@cloudflare/workers-types@4.20260317.1)(@opentelemetry/api@1.9.0)(@types/better-sqlite3@7.6.13)(@types/pg@8.18.0)(better-sqlite3@11.10.0)(kysely@0.28.11)(pg@8.20.0)
ws: 8.19.0 ws: 8.19.0
transitivePeerDependencies: transitivePeerDependencies:
- '@cloudflare/sandbox' - '@cloudflare/sandbox'