From 2427d1b4a3f11cffc56fd70489f1aa598c3e3ddf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20=C5=A0=C4=87eki=C4=87?= Date: Fri, 23 Oct 2026 14:58:01 +0200 Subject: [PATCH 1/4] fix(cloud-agent): move the sandbox runtime to Bun 1.4.4 Bun 1.3.14 bundles emSign ECC Root CA - G3, so a chain issued by any of the eight eMudhra intermediates revoked in October 2026 verifies (GHSA-26q8-h657-pf84, affected < 1.4.4). Sandboxes outside egress interception validate TLS themselves, so the wrapper and every bun install or bunx inside the container trust those keys. Bun 1.4.4 drops that root and rejects chains containing one of the compromised public keys, including chains that arrive through NODE_EXTRA_CA_CERTS or SSL_CERT_FILE, which the intercept path sets. Node needs no change: 24.22.1 already ships the blocked-public-key check from nodejs/node#66871. The Debian system store is unchanged. Bump the pin in the runtime distribution, the five cloud-agent images, CI, the runtime publisher, the cloud-agent setup script and the kiloclaw build stages. Align @types/bun with the runtime, which the image-version contract test asserts, and exempt that types-only version pair from minimumReleaseAge so the pair can move together. --- .github/workflows/ci.yml | 2 +- .../workflows/cloud-agent-runtime-publish.yml | 2 +- .kilo/cloud-agent-setup.sh | 2 +- pnpm-lock.yaml | 95 ++++++++++--------- pnpm-workspace.yaml | 6 ++ services/cloud-agent-next/Dockerfile | 2 +- .../cloud-agent-next/Dockerfile.containers | 2 +- .../Dockerfile.containers.runtime-free | 2 +- services/cloud-agent-next/Dockerfile.dev | 2 +- services/cloud-agent-next/Dockerfile.dind | 2 +- .../scripts/runtime-manifest.test.ts | 4 +- .../scripts/vercel-snapshot.test.ts | 2 +- .../sandbox-control/runtime-release.test.ts | 2 +- .../src/sandbox-image-versions.test.ts | 2 +- .../src/shared/runtime-distribution.ts | 2 +- .../cloud-agent-next/wrapper/package.json | 2 +- .../control/workload-isolation.real.test.ts | 2 +- services/gastown/container/package.json | 2 +- services/kiloclaw/Dockerfile | 2 +- services/kiloclaw/Dockerfile.local | 2 +- 20 files changed, 73 insertions(+), 66 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8a2a59a783b..abe86247aec 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -893,7 +893,7 @@ jobs: - name: Setup Bun uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2.2.0 with: - bun-version: 1.3.14 + bun-version: 1.4.4 - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/cloud-agent-runtime-publish.yml b/.github/workflows/cloud-agent-runtime-publish.yml index a4742313bca..11221d8ae3a 100644 --- a/.github/workflows/cloud-agent-runtime-publish.yml +++ b/.github/workflows/cloud-agent-runtime-publish.yml @@ -51,7 +51,7 @@ jobs: node-version-file: '.nvmrc' - uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 with: - bun-version: 1.3.14 + bun-version: 1.4.4 - run: pnpm install --frozen-lockfile - name: Publish verified runtime and exact-SHA handoff working-directory: services/cloud-agent-next diff --git a/.kilo/cloud-agent-setup.sh b/.kilo/cloud-agent-setup.sh index 4cfb9859b3b..a06777f6c68 100755 --- a/.kilo/cloud-agent-setup.sh +++ b/.kilo/cloud-agent-setup.sh @@ -143,7 +143,7 @@ if [[ ! -x $real_pnpm ]] || grep -qF "$pnpm_wrapper_marker" "$real_pnpm"; then fi tools=() -command -v bun >/dev/null || tools+=(bun@1.3.13) +command -v bun >/dev/null || tools+=(bun@1.4.4) command -v agent-browser >/dev/null || tools+=(agent-browser@0.38.2) if (( ${#tools[@]} )); then "${root[@]}" npm install --global --no-audit --no-fund "${tools[@]}" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dde3e0fbb99..81f56d5795b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -235,7 +235,7 @@ importers: version: 7.0.0-dev.20260707.2 drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) eslint-plugin-zod-utils: specifier: 1.0.11 version: 1.0.11(eslint@9.39.4(jiti@2.7.0))(typescript@7.0.2) @@ -583,7 +583,7 @@ importers: version: 2.1.1 drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(kysely@0.29.2)(pg@8.23.1) effect: specifier: 4.0.5 version: 4.0.5 @@ -1272,7 +1272,7 @@ importers: version: 14.25.1(bufferutil@4.1.0)(utf-8-validate@6.0.6) drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) emoji-mart: specifier: 5.6.0 version: 5.6.0 @@ -1531,7 +1531,7 @@ importers: version: link:../encryption drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) fflate: specifier: 0.8.3 version: 0.8.3 @@ -1633,7 +1633,7 @@ importers: version: link:../usage-contracts drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) pg: specifier: 8.23.1 version: 8.23.1 @@ -1707,7 +1707,7 @@ importers: version: 1.32.1(@cfworker/json-schema@4.1.1)(zod@4.6.7) drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(kysely@0.29.2)(pg@8.23.1) effect: specifier: 4.0.5 version: 4.0.5 @@ -1900,7 +1900,7 @@ importers: version: 11.0.0 drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) stripe: specifier: 'catalog:' version: 19.3.1(@types/node@25.5.2) @@ -2052,7 +2052,7 @@ importers: version: 1.11.20 drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) eventsource-parser: specifier: 3.0.8 version: 3.0.8 @@ -2183,7 +2183,7 @@ importers: version: 1.0.20 drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) hono: specifier: 4.13.13 version: 4.13.13 @@ -2211,7 +2211,7 @@ importers: version: link:../../packages/worker-utils drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) hono: specifier: 4.13.13 version: 4.13.13 @@ -2263,7 +2263,7 @@ importers: version: link:../../packages/worker-utils drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) hono: specifier: 4.13.13 version: 4.13.13 @@ -2306,7 +2306,7 @@ importers: version: link:../../packages/worker-utils drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) hono: specifier: 4.13.13 version: 4.13.13 @@ -2373,7 +2373,7 @@ importers: version: 11.19.0(typescript@7.0.2) drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) hono: specifier: 4.13.13 version: 4.13.13 @@ -2455,8 +2455,8 @@ importers: version: 4.6.7 devDependencies: '@types/bun': - specifier: 1.3.14 - version: 1.3.14 + specifier: 1.4.4 + version: 1.4.4 '@types/node': specifier: 20.19.41 version: 20.19.41 @@ -2511,7 +2511,7 @@ importers: version: link:../../packages/db drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) devDependencies: '@cloudflare/workers-types': specifier: 'catalog:' @@ -2548,7 +2548,7 @@ importers: version: link:../../packages/worker-utils drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) hono: specifier: 4.13.13 version: 4.13.13 @@ -2603,7 +2603,7 @@ importers: version: 11.19.0(typescript@7.0.2) drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) hono: specifier: 4.13.13 version: 4.13.13 @@ -2667,8 +2667,8 @@ importers: version: 4.6.7 devDependencies: '@types/bun': - specifier: 1.3.14 - version: 1.3.14 + specifier: 1.4.4 + version: 1.4.4 typescript: specifier: 'catalog:' version: 7.0.2 @@ -2698,7 +2698,7 @@ importers: version: 22.0.1 drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) zod: specifier: 'catalog:' version: 4.6.7 @@ -2775,7 +2775,7 @@ importers: version: 0.5.4 drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) hono: specifier: 4.13.13 version: 4.13.13 @@ -2830,7 +2830,7 @@ importers: version: 0.10.3 drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) zod: specifier: 'catalog:' version: 4.6.7 @@ -2913,7 +2913,7 @@ importers: version: 0.9.5 drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) hono: specifier: 4.13.13 version: 4.13.13 @@ -2962,7 +2962,7 @@ importers: version: 4.1.0 drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) jose: specifier: 'catalog:' version: 6.2.12 @@ -2996,7 +2996,7 @@ importers: version: link:../../packages/db drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) node-html-markdown: specifier: 2.0.0 version: 2.0.0 @@ -3123,7 +3123,7 @@ importers: version: link:../../packages/worker-utils drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) zod: specifier: 'catalog:' version: 4.6.7 @@ -3166,7 +3166,7 @@ importers: version: link:../../packages/worker-utils drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) expo-server-sdk: specifier: 6.1.0 version: 6.1.0(patch_hash=7850520582b5b394397b35d1ea195192fe78589d8a6a748fe15177b818c4ed0b) @@ -3209,7 +3209,7 @@ importers: version: link:../../packages/worker-utils drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) hono: specifier: 4.13.13 version: 4.13.13 @@ -3252,7 +3252,7 @@ importers: version: link:../../packages/worker-utils drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) workers-tagged-logger: specifier: 'catalog:' version: 1.0.0 @@ -3289,7 +3289,7 @@ importers: version: link:../../packages/worker-utils drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) zod: specifier: 'catalog:' version: 4.6.7 @@ -3338,7 +3338,7 @@ importers: version: 0.0.22 drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) hono: specifier: 4.13.13 version: 4.13.13 @@ -3415,7 +3415,7 @@ importers: version: link:../../packages/worker-utils drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) zod: specifier: 'catalog:' version: 4.6.7 @@ -3516,7 +3516,7 @@ importers: version: 10.0.1 drizzle-orm: specifier: 0.45.2 - version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) + version: 0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1) hono: specifier: 4.13.13 version: 4.13.13 @@ -10884,8 +10884,8 @@ packages: '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} - '@types/bun@1.3.14': - resolution: {integrity: sha512-h1hFqFVcvAvD9j9K7ZW7vd82aSA+rTdznZa+5bwvCwqSB1jmmfLcbIWhOLx1/+boy/xmjgCs/OMUL8hRJSmnPw==} + '@types/bun@1.4.4': + resolution: {integrity: sha512-9wkRDXUXK124pEnAutE6n/l18j+i9GC5IAHK8TmX/2nlySETmky0OU6yL5U8pW1AoKh++AN9auDCr647BfurjQ==} '@types/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -12456,8 +12456,8 @@ packages: builtin-status-codes@3.0.0: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} - bun-types@1.3.14: - resolution: {integrity: sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ==} + bun-types@1.4.4: + resolution: {integrity: sha512-yjrJh5oGX7mMPKGd19YXyIjmEuj4G4zNC30bs7PM9Az7NQ3ndF3j6hbeRdvJTRQEhJ/FYQwW0a2moweEi2hMxQ==} bundle-name@4.1.0: resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} @@ -29585,9 +29585,9 @@ snapshots: dependencies: '@babel/types': 7.29.7 - '@types/bun@1.3.14': + '@types/bun@1.4.4': dependencies: - bun-types: 1.3.14 + bun-types: 1.4.4 '@types/chai@5.2.3': dependencies: @@ -31233,9 +31233,10 @@ snapshots: builtin-status-codes@3.0.0: {} - bun-types@1.3.14: + bun-types@1.4.4: dependencies: '@types/node': 24.12.4 + undici-types: 7.18.2 bundle-name@4.1.0: dependencies: @@ -32231,35 +32232,35 @@ snapshots: esbuild: 0.28.2 tsx: 4.23.15 - drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1): + drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1): optionalDependencies: '@cloudflare/workers-types': 4.20260605.1 '@opentelemetry/api': 1.9.1 '@types/pg': 8.23.1 '@upstash/redis': 1.38.0 - bun-types: 1.3.14 + bun-types: 1.4.4 expo-sqlite: 58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.2.14)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6) kysely: 0.29.2 pg: 8.23.1 - drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1): + drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(kysely@0.29.2)(pg@8.23.1): optionalDependencies: '@cloudflare/workers-types': 4.20260605.1 '@opentelemetry/api': 1.9.1 '@types/pg': 8.23.1 '@upstash/redis': 1.38.0 - bun-types: 1.3.14 + bun-types: 1.4.4 expo-sqlite: 58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6) kysely: 0.29.2 pg: 8.23.1 - drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.3.14)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(kysely@0.29.2)(pg@8.23.1): + drizzle-orm@0.45.2(@cloudflare/workers-types@4.20260605.1)(@opentelemetry/api@1.9.1)(@types/pg@8.23.1)(@upstash/redis@1.38.0)(bun-types@1.4.4)(expo-sqlite@58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0))(kysely@0.29.2)(pg@8.23.1): optionalDependencies: '@cloudflare/workers-types': 4.20260605.1 '@opentelemetry/api': 1.9.1 '@types/pg': 8.23.1 '@upstash/redis': 1.38.0 - bun-types: 1.3.14 + bun-types: 1.4.4 expo-sqlite: 58.0.13(expo@58.0.10)(react-native@0.88.0(patch_hash=669a6f4d03c40d89282d44110f509cacdd63696eb7f7a55a07b0d760ef7f644c)(@types/react@19.3.0)(bufferutil@4.1.0)(react@19.3.0)(utf-8-validate@6.0.6))(react@19.3.0) kysely: 0.29.2 pg: 8.23.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index eed57d73ecc..1137e5b5c4c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -117,6 +117,12 @@ minimumReleaseAgeExclude: # Approved early exception; worklets 0.13.0 is its required pair and is old # enough on its own. - react-native-reanimated@4.7.1 + # @types/bun is DefinitelyTyped only: types, no runtime code, no install scripts. + # The wrapper and gastown dev types must equal the Bun the sandbox runs, which + # sandbox-image-versions.test.ts asserts. Bun 1.4.4 is the first release that + # rejects the compromised eMudhra chains, so the pair moves before the window. + - '@types/bun@1.4.4' + - bun-types@1.4.4 overrides: # One pg client in the tree: drizzle-orm's optional peers include pg, so two # pg versions split drizzle-orm into two packages and their SQL types stop diff --git a/services/cloud-agent-next/Dockerfile b/services/cloud-agent-next/Dockerfile index 91d8b3c983d..a7285100cbf 100644 --- a/services/cloud-agent-next/Dockerfile +++ b/services/cloud-agent-next/Dockerfile @@ -11,7 +11,7 @@ COPY --from=node-runtime /usr/local/lib/node_modules /usr/local/lib/node_modules ARG BUILD_DATE="" ARG VCS_REF="" ARG KILOCODE_CLI_VERSION="7.8.17" -ARG BUN_VERSION="1.3.14" +ARG BUN_VERSION="1.4.4" ARG PNPM_VERSION="12.14.0" ARG GLAB_VERSION="1.124.0" ARG GH_VERSION="2.102.0" diff --git a/services/cloud-agent-next/Dockerfile.containers b/services/cloud-agent-next/Dockerfile.containers index b7cc0e44cd8..711127ec938 100644 --- a/services/cloud-agent-next/Dockerfile.containers +++ b/services/cloud-agent-next/Dockerfile.containers @@ -5,7 +5,7 @@ ARG BUILD_DATE="" ARG VCS_REF="" ARG KILOCODE_CLI_VERSION="7.8.17" ARG NODE_VERSION="24.22.1" -ARG BUN_VERSION="1.3.14" +ARG BUN_VERSION="1.4.4" ARG PNPM_VERSION="12.14.0" ARG GLAB_VERSION="1.124.0" ARG GH_VERSION="2.102.0" diff --git a/services/cloud-agent-next/Dockerfile.containers.runtime-free b/services/cloud-agent-next/Dockerfile.containers.runtime-free index 0542876609c..c97358083b5 100644 --- a/services/cloud-agent-next/Dockerfile.containers.runtime-free +++ b/services/cloud-agent-next/Dockerfile.containers.runtime-free @@ -1,7 +1,7 @@ FROM docker.io/library/debian:trixie-slim ARG NODE_VERSION="24.22.1" -ARG BUN_VERSION="1.3.14" +ARG BUN_VERSION="1.4.4" ARG PNPM_VERSION="12.14.0" ARG GLAB_VERSION="1.124.0" ARG GH_VERSION="2.102.0" diff --git a/services/cloud-agent-next/Dockerfile.dev b/services/cloud-agent-next/Dockerfile.dev index 357e8acb9a0..9339ed60a1e 100644 --- a/services/cloud-agent-next/Dockerfile.dev +++ b/services/cloud-agent-next/Dockerfile.dev @@ -11,7 +11,7 @@ COPY --from=node-runtime /usr/local/lib/node_modules /usr/local/lib/node_modules ARG BUILD_DATE="" ARG VCS_REF="" ARG KILOCODE_CLI_VERSION="7.8.17" -ARG BUN_VERSION="1.3.14" +ARG BUN_VERSION="1.4.4" ARG PNPM_VERSION="12.14.0" ARG GLAB_VERSION="1.124.0" ARG GH_VERSION="2.102.0" diff --git a/services/cloud-agent-next/Dockerfile.dind b/services/cloud-agent-next/Dockerfile.dind index 8d255b04591..0aa3e8f9bd8 100644 --- a/services/cloud-agent-next/Dockerfile.dind +++ b/services/cloud-agent-next/Dockerfile.dind @@ -13,7 +13,7 @@ USER root ARG BUILD_DATE="" ARG VCS_REF="" ARG KILOCODE_CLI_VERSION="7.8.17" -ARG BUN_VERSION="1.3.14" +ARG BUN_VERSION="1.4.4" ARG PNPM_VERSION="12.14.0" ARG GH_VERSION="2.102.0" ARG GLAB_VERSION="1.124.0" diff --git a/services/cloud-agent-next/scripts/runtime-manifest.test.ts b/services/cloud-agent-next/scripts/runtime-manifest.test.ts index 83f179718bb..c2c2d1229c9 100644 --- a/services/cloud-agent-next/scripts/runtime-manifest.test.ts +++ b/services/cloud-agent-next/scripts/runtime-manifest.test.ts @@ -17,7 +17,7 @@ describe('runtime distribution contract', () => { it('pins the shared toolchain versions', () => { expect(RUNTIME_DISTRIBUTION).toEqual({ nodeMajor: '24', - bun: '1.3.14', + bun: '1.4.4', pnpm: '12.14.0', glab: '1.124.0', gh: '2.102.0', @@ -70,7 +70,7 @@ describe('runtime distribution contract', () => { })) ); const script = runtimeVerificationScript(artifacts); - expect(script).toContain(`test "$(bun --version)" = '1.3.14'`); + expect(script).toContain(`test "$(bun --version)" = '1.4.4'`); expect(script).toContain(`test "$(pnpm --version)" = '12.14.0'`); expect(script).toContain('grep -oE'); expect(script).not.toContain('grep -qF'); diff --git a/services/cloud-agent-next/scripts/vercel-snapshot.test.ts b/services/cloud-agent-next/scripts/vercel-snapshot.test.ts index 68704c31b98..3ff9575d9b7 100644 --- a/services/cloud-agent-next/scripts/vercel-snapshot.test.ts +++ b/services/cloud-agent-next/scripts/vercel-snapshot.test.ts @@ -55,7 +55,7 @@ describe('Vercel snapshot operator pure logic', () => { runtimeBuildId: 'cloud-agent-2026-06-10.1', wrapperVersion: '2.3.0', runtime: 'node24', - bunVersion: '1.3.14', + bunVersion: '1.4.4', controlPlaneWrapperSha256: '042faca14bb0e2ccbb0d1f7c3617f91df4254711df5d8fb54e66e64e39264908', controlPlaneSupervisorSha256: '0834c2d60725ac5902257b3b78dd161ad26d1c0290dbf1e47cc14add5b8c8142', diff --git a/services/cloud-agent-next/src/sandbox-control/runtime-release.test.ts b/services/cloud-agent-next/src/sandbox-control/runtime-release.test.ts index 3a4ad9e7401..f1dff71710f 100644 --- a/services/cloud-agent-next/src/sandbox-control/runtime-release.test.ts +++ b/services/cloud-agent-next/src/sandbox-control/runtime-release.test.ts @@ -64,7 +64,7 @@ function descriptor(): RuntimeReleaseDescriptor { format: 1, bootstrap: 1, platform: { os: 'linux', arch: 'x64', libc: 'glibc', cpu: 'baseline' }, - abi: 'bun-1.3.14', + abi: 'bun-1.4.4', cliVersion: '7.8.17', cliExecutable: 'package/bin/kilo', wrapperSdkVersion: '7.8.17', diff --git a/services/cloud-agent-next/src/sandbox-image-versions.test.ts b/services/cloud-agent-next/src/sandbox-image-versions.test.ts index b89fea09d01..4fff815106a 100644 --- a/services/cloud-agent-next/src/sandbox-image-versions.test.ts +++ b/services/cloud-agent-next/src/sandbox-image-versions.test.ts @@ -67,7 +67,7 @@ describe('runtime distribution packaging', () => { const dockerfiles = ['Dockerfile', 'Dockerfile.dev', 'Dockerfile.containers', 'Dockerfile.dind']; it('pins the shared toolchain versions', () => { - expect(RUNTIME_DISTRIBUTION.bun).toBe('1.3.14'); + expect(RUNTIME_DISTRIBUTION.bun).toBe('1.4.4'); expect(RUNTIME_DISTRIBUTION.pnpm).toBe('12.14.0'); expect(RUNTIME_DISTRIBUTION.glab).toBe('1.124.0'); expect(RUNTIME_DISTRIBUTION.gh).toBe('2.102.0'); diff --git a/services/cloud-agent-next/src/shared/runtime-distribution.ts b/services/cloud-agent-next/src/shared/runtime-distribution.ts index 82d42a8840a..9d631c48af6 100644 --- a/services/cloud-agent-next/src/shared/runtime-distribution.ts +++ b/services/cloud-agent-next/src/shared/runtime-distribution.ts @@ -1,6 +1,6 @@ export const RUNTIME_DISTRIBUTION = { nodeMajor: '24', - bun: '1.3.14', + bun: '1.4.4', pnpm: '12.14.0', glab: '1.124.0', gh: '2.102.0', diff --git a/services/cloud-agent-next/wrapper/package.json b/services/cloud-agent-next/wrapper/package.json index 59b86ef3b65..61e3d57609c 100644 --- a/services/cloud-agent-next/wrapper/package.json +++ b/services/cloud-agent-next/wrapper/package.json @@ -13,7 +13,7 @@ "zod": "4.6.7" }, "devDependencies": { - "@types/bun": "1.3.14", + "@types/bun": "1.4.4", "@types/node": "20.19.41", "@typescript/native-preview": "catalog:", "typescript": "catalog:" diff --git a/services/cloud-agent-next/wrapper/src/control/workload-isolation.real.test.ts b/services/cloud-agent-next/wrapper/src/control/workload-isolation.real.test.ts index b777c7cd1ec..1d3ed908d21 100644 --- a/services/cloud-agent-next/wrapper/src/control/workload-isolation.real.test.ts +++ b/services/cloud-agent-next/wrapper/src/control/workload-isolation.real.test.ts @@ -20,7 +20,7 @@ import { createOwnedProcessScope } from './owned-processes.js'; import { closeControlWorkload, initializeControlWorkload } from './workload-cgroup.js'; // Opt in only inside an isolated Linux container with a private, writable cgroup namespace. -// Use a 4 GiB container, no swap, the pinned Kilo CLI and Bun 1.3.14. Never run on a shared host cgroup. +// Use a 4 GiB container, no swap, the pinned Kilo CLI and Bun 1.4.4. Never run on a shared host cgroup. const suite = process.env.KILO_MEMORY_CGROUP_TEST === '1' ? describe : describe.skip; const MiB = 1024 * 1024; diff --git a/services/gastown/container/package.json b/services/gastown/container/package.json index d413c6091da..5bb527c2ea9 100644 --- a/services/gastown/container/package.json +++ b/services/gastown/container/package.json @@ -18,7 +18,7 @@ "zod": "catalog:" }, "devDependencies": { - "@types/bun": "1.3.14", + "@types/bun": "1.4.4", "typescript": "catalog:", "vitest": "catalog:" } diff --git a/services/kiloclaw/Dockerfile b/services/kiloclaw/Dockerfile index 9dd98abd11d..417ac204d05 100644 --- a/services/kiloclaw/Dockerfile +++ b/services/kiloclaw/Dockerfile @@ -237,7 +237,7 @@ RUN echo "apt cache bust: ${APT_CACHE_BUST}" \ && tar -xJf /tmp/node.tar.xz -C /usr/local --strip-components=1 \ && rm /tmp/node.tar.xz \ && npm install --global pnpm@11.1.2 \ - && curl -fsSL https://bun.sh/install | bash -s "bun-v1.3.13" \ + && curl -fsSL https://bun.sh/install | bash -s "bun-v1.4.4" \ && rm -rf /var/lib/apt/lists/* ENV PATH="/root/.bun/bin:$PATH" diff --git a/services/kiloclaw/Dockerfile.local b/services/kiloclaw/Dockerfile.local index 7ab89a9ce7c..b0daaada74e 100644 --- a/services/kiloclaw/Dockerfile.local +++ b/services/kiloclaw/Dockerfile.local @@ -99,7 +99,7 @@ RUN curl -LsSf https://astral.sh/uv/install.sh | env UV_INSTALL_DIR=/usr/local/b && uv --version # Install pinned Bun (build-time only) and compile the controller bundle. -ARG BUN_VERSION=1.3.13 +ARG BUN_VERSION=1.4.4 RUN curl -fsSL https://bun.sh/install | bash -s "bun-v${BUN_VERSION}" ENV PATH="/root/.bun/bin:$PATH" From 0b34917b34253b215a7e24f91efac5dd27951ca5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20=C5=A0=C4=87eki=C4=87?= Date: Fri, 23 Oct 2026 15:01:47 +0200 Subject: [PATCH 2/4] test(mobile): expect the Bun types release-age exemption The mobile dependency-contract guard asserts the exact exclusion list in pnpm-workspace.yaml, so the Bun types pair added with the runtime bump belongs in both expected arrays. --- apps/mobile/src/lib/minimum-release-age-policy.test.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/mobile/src/lib/minimum-release-age-policy.test.ts b/apps/mobile/src/lib/minimum-release-age-policy.test.ts index 98d544f5de8..e08d2a274e4 100644 --- a/apps/mobile/src/lib/minimum-release-age-policy.test.ts +++ b/apps/mobile/src/lib/minimum-release-age-policy.test.ts @@ -60,6 +60,11 @@ const MOBILE_EXACT_EXCLUDE_ENTRIES = [ '@shopify/flash-list@2.3.3', 'react-native-reanimated@4.7.1', ] as const; + +// Bun 1.4.4 rejects the compromised eMudhra chains, and the wrapper dev types +// must equal the runtime the image-version contract test pins, so the types +// pair moves with it. Types only: no runtime code and no install scripts. +const BUN_TYPES_EXACT_EXCLUDE_ENTRIES = ['@types/bun@1.4.4', 'bun-types@1.4.4'] as const; // Exact pnpm syntax for one pinned package version: bare or @scoped name, then // @ and a version starting with a digit. Rejects name-only entries, ranges, // wildcards, and future-version placeholders alike. @@ -103,13 +108,14 @@ describe('minimum release age policy contract', () => { expect(Number(match?.[1])).toBe(EXPECTED_MINIMUM_RELEASE_AGE_MINUTES); }); - it('excludes exactly the base list plus the container-runtime and mobile exact versions', () => { + it('excludes exactly the base list plus the container-runtime, mobile and Bun-types exact versions', () => { const expected = [ BASE_EXCLUDE_ENTRIES[0], ...CLOUDFLARE_SANDBOX_EXACT_EXCLUDE_ENTRIES, ...CLOUDFLARE_CONTAINER_RUNTIME_EXACT_EXCLUDE_ENTRIES, ...BASE_EXCLUDE_ENTRIES.slice(1), ...MOBILE_EXACT_EXCLUDE_ENTRIES, + ...BUN_TYPES_EXACT_EXCLUDE_ENTRIES, ]; expect(excludeEntries).toEqual(expected); }); @@ -119,6 +125,7 @@ describe('minimum release age policy contract', () => { ...CLOUDFLARE_SANDBOX_EXACT_EXCLUDE_ENTRIES, ...CLOUDFLARE_CONTAINER_RUNTIME_EXACT_EXCLUDE_ENTRIES, ...MOBILE_EXACT_EXCLUDE_ENTRIES, + ...BUN_TYPES_EXACT_EXCLUDE_ENTRIES, ]); for (const entry of newExclusions) { expect(entry).toMatch(EXACT_VERSION_PATTERN); From efd7e5fa610869b091ee96b1c632abc0943bb937 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20=C5=A0=C4=87eki=C4=87?= Date: Fri, 23 Oct 2026 15:10:33 +0200 Subject: [PATCH 3/4] fix(gastown): pin the runtime Bun image instead of the floating 1-slim tag The Gastown container runs bun at runtime, so a floating tag leaves its trust store undetermined. 1.4.4 is the first release that rejects the compromised eMudhra chains. --- services/gastown/container/Dockerfile | 2 +- services/gastown/container/Dockerfile.dev | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/gastown/container/Dockerfile b/services/gastown/container/Dockerfile index c6c12f47b87..b36af9c2bac 100644 --- a/services/gastown/container/Dockerfile +++ b/services/gastown/container/Dockerfile @@ -1,6 +1,6 @@ FROM node:24-bookworm-slim AS node-runtime -FROM oven/bun:1-slim +FROM oven/bun:1.4.4-slim COPY --from=node-runtime /usr/local/bin/node /usr/local/bin/node COPY --from=node-runtime /usr/local/lib/node_modules/npm /usr/local/lib/node_modules/npm diff --git a/services/gastown/container/Dockerfile.dev b/services/gastown/container/Dockerfile.dev index 8ed99f9724d..cf707d5fab5 100644 --- a/services/gastown/container/Dockerfile.dev +++ b/services/gastown/container/Dockerfile.dev @@ -1,4 +1,4 @@ -FROM --platform=linux/arm64 oven/bun:1-slim +FROM --platform=linux/arm64 oven/bun:1.4.4-slim ARG DEBIAN_FRONTEND=noninteractive @@ -73,7 +73,7 @@ RUN apt-get update && \ # npm's global install does not resolve optionalDependencies, so we must # explicitly install the platform-specific binary package alongside the CLI. # Install both glibc and musl variants — the CLI's binary resolver may -# pick either depending on the detected libc. bun:1-slim is Debian (glibc) +# pick either depending on the detected libc. bun:1.4.4-slim is Debian (glibc) # but the resolver sometimes misdetects; installing both is safe. # Also install pnpm — many projects use it as their package manager. RUN npm install -g @kilocode/cli@7.2.14 @kilocode/cli-linux-arm64@7.2.14 @kilocode/cli-linux-arm64-musl@7.2.14 @kilocode/plugin@7.2.14 pnpm && \ From d4a20f8fb2e918e74f797ef6ed06c0be5198e9a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Igor=20=C5=A0=C4=87eki=C4=87?= Date: Fri, 23 Oct 2026 15:54:04 +0200 Subject: [PATCH 4/4] test(cloud-agent): retry a dropped route-ready announce in the terminal suite markRouteReady sent one session.ready frame and waited the full integration budget. A frame that arrives before the sandbox DO records the socket as current is dropped without a reply, which failed the terminal suite intermittently. Announce again after half the budget; a stuck route still fails. --- .../control-plane-terminal-v2.test.ts | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/services/cloud-agent-next/test/integration/control-plane-terminal-v2.test.ts b/services/cloud-agent-next/test/integration/control-plane-terminal-v2.test.ts index bddde7f666f..bb3b0bc3842 100644 --- a/services/cloud-agent-next/test/integration/control-plane-terminal-v2.test.ts +++ b/services/cloud-agent-next/test/integration/control-plane-terminal-v2.test.ts @@ -32,6 +32,9 @@ const sessions = (env as unknown as { SANDBOX_SESSION: SessionNamespace }).SANDB const USER_ID = 'user_term'; const ORG_ID = 'org_term'; const WRAPPER_ID = 'wr_terminal'; +// Half the integration wait budget, so a dropped readiness frame is retried +// while a genuinely stuck route still fails within the normal timeout. +const ROUTE_READY_RETRY_MS = 5_000; type FakeProvider = { adapter: ProviderAdapter; launchEnvs: Record[] }; @@ -305,11 +308,23 @@ async function markRouteReady( wrapper: FakeWrapper, sessionId: string ): Promise { - wrapper.send({ type: 'session.ready', sessionId }); - await waitFor(async () => { + const isRouteReady = async (): Promise => { const snapshot = await sessionStub.getSession(); - expect(snapshot.type === 'found' && snapshot.route.state === 'ready').toBe(true); - }); + return snapshot.type === 'found' && snapshot.route.state === 'ready'; + }; + // The first announce can reach the sandbox DO before it records this socket + // as the current connection, and a frame from a superseded connection is + // dropped without a reply. Announce once more after a shorter wait, so one + // dropped frame does not fail a correct run while a stuck route still fails. + wrapper.send({ type: 'session.ready', sessionId }); + try { + await waitFor(async () => expect(await isRouteReady()).toBe(true), { + timeout: ROUTE_READY_RETRY_MS, + }); + } catch { + wrapper.send({ type: 'session.ready', sessionId }); + await waitFor(async () => expect(await isRouteReady()).toBe(true)); + } } async function startTerminalSession(): Promise<{