From bc872da6f2f2ff66ff1366972d93ee73fd0c2495 Mon Sep 17 00:00:00 2001 From: Nathan Flurry Date: Sun, 22 Mar 2026 04:46:52 -0700 Subject: [PATCH] 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) --- foundry/docker/backend.Dockerfile | 4 +- foundry/docker/backend.dev.Dockerfile | 10 +---- foundry/docker/backend.preview.Dockerfile | 6 +-- foundry/packages/backend/package.json | 7 ++- foundry/packages/backend/src/index.ts | 54 +++++++---------------- pnpm-lock.yaml | 42 +++++------------- 6 files changed, 37 insertions(+), 86 deletions(-) diff --git a/foundry/docker/backend.Dockerfile b/foundry/docker/backend.Dockerfile index ae14ddf..22611c6 100644 --- a/foundry/docker/backend.Dockerfile +++ b/foundry/docker/backend.Dockerfile @@ -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 deploy --prod /out -FROM oven/bun:1.2 AS runtime +FROM node:22-bookworm-slim AS runtime ENV NODE_ENV=production ENV HOME=/home/task ENV RIVET_RUNNER_VERSION_FILE=/etc/foundry/rivet-runner-version @@ -37,4 +37,4 @@ RUN mkdir -p /etc/foundry \ COPY --from=build /out ./ USER task EXPOSE 7741 -CMD ["bun", "dist/index.js", "start", "--host", "0.0.0.0"] +CMD ["node", "dist/index.js", "start", "--host", "0.0.0.0"] diff --git a/foundry/docker/backend.dev.Dockerfile b/foundry/docker/backend.dev.Dockerfile index c4b6c3a..ac5b7d5 100644 --- a/foundry/docker/backend.dev.Dockerfile +++ b/foundry/docker/backend.dev.Dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1.7 -FROM oven/bun:1.3 +FROM node:22-bookworm-slim ARG SANDBOX_AGENT_VERSION=0.3.0 @@ -10,8 +10,6 @@ RUN apt-get update \ curl \ git \ gh \ - nodejs \ - npm \ openssh-client \ && rm -rf /var/lib/apt/lists/* @@ -27,8 +25,4 @@ RUN mkdir -p /etc/foundry \ WORKDIR /app -# NOTE: Do NOT use `bun --hot` here. Bun's hot reloading re-initializes the -# 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"] +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"] diff --git a/foundry/docker/backend.preview.Dockerfile b/foundry/docker/backend.preview.Dockerfile index 91cd7c7..a5d2b6f 100644 --- a/foundry/docker/backend.preview.Dockerfile +++ b/foundry/docker/backend.preview.Dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1.7 -FROM oven/bun:1.3 +FROM node:22-bookworm-slim ARG SANDBOX_AGENT_VERSION=0.3.0 @@ -10,8 +10,6 @@ RUN apt-get update \ curl \ git \ gh \ - nodejs \ - npm \ openssh-client \ && npm install -g pnpm@10.28.2 \ && 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-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"] diff --git a/foundry/packages/backend/package.json b/foundry/packages/backend/package.json index dcc80dd..7077b79 100644 --- a/foundry/packages/backend/package.json +++ b/foundry/packages/backend/package.json @@ -7,10 +7,10 @@ "types": "dist/index.d.ts", "scripts": { "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", - "test": "$HOME/.bun/bin/bun x vitest run", - "start": "bun dist/index.js start" + "test": "npx vitest run", + "start": "node dist/index.js start" }, "dependencies": { "@e2b/code-interpreter": "^2.3.3", @@ -31,7 +31,6 @@ "zod": "^4.1.5" }, "devDependencies": { - "@types/bun": "^1.3.9", "tsup": "^8.5.0" } } diff --git a/foundry/packages/backend/src/index.ts b/foundry/packages/backend/src/index.ts index 617bacc..6ca5ea0 100644 --- a/foundry/packages/backend/src/index.ts +++ b/foundry/packages/backend/src/index.ts @@ -1,5 +1,6 @@ import { Hono } from "hono"; import { cors } from "hono/cors"; +import { serve } from "@hono/node-server"; import { randomUUID } from "node:crypto"; import { initActorRuntimeContext } from "./actors/context.js"; import { registry } from "./actors/index.js"; @@ -145,16 +146,13 @@ export async function startBackend(options: BackendStartOptions = {}): Promise.json, inspect with chrome://tracing) app.get("/debug/memory", async (c) => { if (process.env.NODE_ENV !== "development") { return c.json({ error: "debug endpoints disabled in production" }, 403); } const wantGc = c.req.query("gc") === "1"; - if (wantGc && typeof Bun !== "undefined") { - // Bun.gc(true) triggers a synchronous full GC sweep in JavaScriptCore. - Bun.gc(true); + if (wantGc && globalThis.gc) { + globalThis.gc(); } const mem = process.memoryUsage(); const rssMb = Math.round(mem.rss / 1024 / 1024); @@ -162,12 +160,6 @@ export async function startBackend(options: BackendStartOptions = {}): Promise { @@ -398,20 +380,16 @@ export async function startBackend(options: BackendStartOptions = {}): Promise { - if (isRivetRequest(request)) { - return registry.handler(request); - } - return app.fetch(request); - }, + // Combine RivetKit registry handler with Hono app + const combinedApp = new Hono(); + combinedApp.all("/v1/rivet/*", (c) => registry.handler(c.req.raw)); + combinedApp.all("/v1/rivet", (c) => registry.handler(c.req.raw)); + combinedApp.route("/", app); + + const server = serve({ + fetch: combinedApp.fetch, hostname: config.backend.host, 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( @@ -424,7 +402,7 @@ export async function startBackend(options: BackendStartOptions = {}): Promise { - server.stop(); + server.close(); process.exit(0); }); process.on("SIGTERM", async () => { - server.stop(); + server.close(); process.exit(0); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 22d0118..006bc4f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -494,7 +494,7 @@ importers: version: link:../shared better-auth: 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: specifier: ^4.0.9 version: 4.0.9 @@ -503,7 +503,7 @@ importers: version: 0.31.9 drizzle-orm: 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: specifier: ^4.11.9 version: 4.12.2 @@ -512,7 +512,7 @@ importers: version: 10.3.1 rivetkit: 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: specifier: workspace:* version: link:../../../sdks/typescript @@ -526,9 +526,6 @@ importers: specifier: ^4.1.5 version: 4.3.6 devDependencies: - '@types/bun': - specifier: ^1.3.9 - version: 1.3.10 tsup: 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) @@ -543,7 +540,7 @@ importers: version: 19.2.4 rivetkit: 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: specifier: workspace:* version: link:../../../sdks/typescript @@ -3539,9 +3536,6 @@ packages: '@types/better-sqlite3@7.6.13': resolution: {integrity: sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==} - '@types/bun@1.3.10': - resolution: {integrity: sha512-0+rlrUrOrTSskibryHbvQkDOWRJwJZqZlxrUs1u4oOoTln8+WIXBPmAuCF35SWB2z4Zl3E84Nl/D0P7803nigQ==} - '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -3975,9 +3969,6 @@ packages: resolution: {integrity: sha512-lHblz4ahamxpTmnsk+MNTRWsjYKv965MwOrSJyeD588rR3Jcu7swE+0wN5F+PbL5cjgu/9ObkhfzEPuofEMwLA==} engines: {node: '>=10.0.0'} - bun-types@1.3.10: - resolution: {integrity: sha512-tcpfCCl6XWo6nCVnpcVrxQ+9AYN1iqMIzgrSKYMB/fjLtV2eyAVEg7AxQJuCq/26R6HpKWykQXuSOq/21RYcbg==} - bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -8319,12 +8310,12 @@ snapshots: optionalDependencies: '@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: '@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 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)': dependencies: @@ -10168,10 +10159,6 @@ snapshots: dependencies: '@types/node': 24.10.9 - '@types/bun@1.3.10': - dependencies: - bun-types: 1.3.10 - '@types/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -10648,10 +10635,10 @@ snapshots: dependencies: 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: '@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/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) @@ -10669,7 +10656,7 @@ snapshots: zod: 4.3.6 optionalDependencies: 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 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -10773,10 +10760,6 @@ snapshots: buildcheck@0.0.7: optional: true - bun-types@1.3.10: - dependencies: - '@types/node': 24.10.9 - bundle-require@5.1.0(esbuild@0.27.3): dependencies: esbuild: 0.27.3 @@ -11290,14 +11273,13 @@ snapshots: transitivePeerDependencies: - 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: '@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 @@ -13433,7 +13415,7 @@ snapshots: 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: '@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) @@ -13464,7 +13446,7 @@ snapshots: '@e2b/code-interpreter': 2.3.3 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) + 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 transitivePeerDependencies: - '@cloudflare/sandbox'