authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-10-03 22:46:09-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-10-03 22:46:09-07:00
log40596072ebabf045414f54ca6ffec3911543d8ff
tree43d99d58d7c304a4821140b4872e4deaccf6aec7
parent930aec13da56f83c404bc00d92486b2409a5cac0
signature Signed by PGP key B5690EEEBB952194

fix(relay): T3 Connect links no longer fail on colliding prepared statements (#15411)

Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>

5 files changed, 115 insertions(+), 4 deletions(-)

infra/relay/src/environments/ManagedEndpointProvider.test.ts+3
...@@ -1280,6 +1280,7 @@ describe("ManagedEndpointProvider", () => {...@@ -1280,6 +1280,7 @@ describe("ManagedEndpointProvider", () => {
1280 expect(error).toMatchObject({1280 expect(error).toMatchObject({
1281 _tag: "ManagedEndpointProvisioningFailed",1281 _tag: "ManagedEndpointProvisioningFailed",
1282 stage: "record-tunnel",1282 stage: "record-tunnel",
1283 reason: "claim-lost",
1283 });1284 });
1284 expect(tunnelCalls.map((call) => call.operation)).toEqual(["list", "create"]);1285 expect(tunnelCalls.map((call) => call.operation)).toEqual(["list", "create"]);
1285 expect((yield* provider.provision(input)).runtime.tunnelId).toBe("tunnel-id");1286 expect((yield* provider.provision(input)).runtime.tunnelId).toBe("tunnel-id");
...@@ -1336,6 +1337,7 @@ describe("ManagedEndpointProvider", () => {...@@ -1336,6 +1337,7 @@ describe("ManagedEndpointProvider", () => {
1336 expect(error).toMatchObject({1337 expect(error).toMatchObject({
1337 _tag: "ManagedEndpointProvisioningFailed",1338 _tag: "ManagedEndpointProvisioningFailed",
1338 stage: "configure-tunnel",1339 stage: "configure-tunnel",
1340 reason: "claim-lost",
1339 });1341 });
1340 expect(tunnelCalls.map((call) => call.operation)).not.toContain("putConfiguration");1342 expect(tunnelCalls.map((call) => call.operation)).not.toContain("putConfiguration");
1341 }).pipe(Effect.provide(layer));1343 }).pipe(Effect.provide(layer));
...@@ -1391,6 +1393,7 @@ describe("ManagedEndpointProvider", () => {...@@ -1391,6 +1393,7 @@ describe("ManagedEndpointProvider", () => {
1391 expect(error).toMatchObject({1393 expect(error).toMatchObject({
1392 _tag: "ManagedEndpointProvisioningFailed",1394 _tag: "ManagedEndpointProvisioningFailed",
1393 stage: "mark-allocation-ready",1395 stage: "mark-allocation-ready",
1396 reason: "claim-lost",
1394 });1397 });
1395 }).pipe(Effect.provide(layer));1398 }).pipe(Effect.provide(layer));
1396 });1399 });
infra/relay/src/environments/ManagedEndpointProvider.ts+18
...@@ -58,10 +58,20 @@ const ManagedEndpointProvisioningStage = Schema.Literals([...@@ -58,10 +58,20 @@ const ManagedEndpointProvisioningStage = Schema.Literals([
58 "sync-origin",58 "sync-origin",
59]);59]);
6060
61// Why a stage failed without an underlying error. `claim-lost` means another
62// provision, release, or deprovision changed the allocation's generation or
63// tunnel after this one loaded it.
64const ManagedEndpointProvisioningFailureReason = Schema.Literals([
65 "claim-lost",
66 "endpoint-mismatch",
67 "invalid-tunnel-response",
68]);
69
61export class ManagedEndpointProvisioningFailed extends Schema.TaggedError<ManagedEndpointProvisioningFailed>()(70export class ManagedEndpointProvisioningFailed extends Schema.TaggedError<ManagedEndpointProvisioningFailed>()(
62 "ManagedEndpointProvisioningFailed",71 "ManagedEndpointProvisioningFailed",
63 {72 {
64 stage: ManagedEndpointProvisioningStage,73 stage: ManagedEndpointProvisioningStage,
74 reason: Schema.optionalKey(ManagedEndpointProvisioningFailureReason),
65 userId: Schema.String,75 userId: Schema.String,
66 environmentId: Schema.String,76 environmentId: Schema.String,
67 hostname: Schema.optionalKey(Schema.String),77 hostname: Schema.optionalKey(Schema.String),
...@@ -543,6 +553,7 @@ export const make = Effect.gen(function* () {...@@ -543,6 +553,7 @@ export const make = Effect.gen(function* () {
543 return yield* new ManagedEndpointProvisioningFailed({553 return yield* new ManagedEndpointProvisioningFailed({
544 ...input,554 ...input,
545 stage: "verify-endpoint",555 stage: "verify-endpoint",
556 reason: "endpoint-mismatch",
546 hostname: allocation.hostname,557 hostname: allocation.hostname,
547 });558 });
548 }559 }
...@@ -609,6 +620,7 @@ export const make = Effect.gen(function* () {...@@ -609,6 +620,7 @@ export const make = Effect.gen(function* () {
609 return yield* new ManagedEndpointProvisioningFailed({620 return yield* new ManagedEndpointProvisioningFailed({
610 ...input,621 ...input,
611 stage: "sync-origin",622 stage: "sync-origin",
623 reason: "claim-lost",
612 });624 });
613 }625 }
614 return updated.value === "configured" ? "ready" : "recovery_required";626 return updated.value === "configured" ? "ready" : "recovery_required";
...@@ -995,6 +1007,7 @@ export const make = Effect.gen(function* () {...@@ -995,6 +1007,7 @@ export const make = Effect.gen(function* () {
995 userId: input.userId,1007 userId: input.userId,
996 environmentId: input.environmentId,1008 environmentId: input.environmentId,
997 stage: "validate-tunnel-response",1009 stage: "validate-tunnel-response",
1010 reason: "invalid-tunnel-response",
998 hostname,1011 hostname,
999 tunnelName,1012 tunnelName,
1000 ...(tunnelResponse.id ? { returnedTunnelId: tunnelResponse.id } : {}),1013 ...(tunnelResponse.id ? { returnedTunnelId: tunnelResponse.id } : {}),
...@@ -1030,6 +1043,7 @@ export const make = Effect.gen(function* () {...@@ -1030,6 +1043,7 @@ export const make = Effect.gen(function* () {
1030 userId: input.userId,1043 userId: input.userId,
1031 environmentId: input.environmentId,1044 environmentId: input.environmentId,
1032 stage: "record-tunnel",1045 stage: "record-tunnel",
1046 reason: "claim-lost",
1033 hostname,1047 hostname,
1034 tunnelName,1048 tunnelName,
1035 tunnelId: tunnel.id,1049 tunnelId: tunnel.id,
...@@ -1090,6 +1104,7 @@ export const make = Effect.gen(function* () {...@@ -1090,6 +1104,7 @@ export const make = Effect.gen(function* () {
1090 userId: input.userId,1104 userId: input.userId,
1091 environmentId: input.environmentId,1105 environmentId: input.environmentId,
1092 stage: "configure-tunnel",1106 stage: "configure-tunnel",
1107 reason: "claim-lost",
1093 hostname,1108 hostname,
1094 tunnelName,1109 tunnelName,
1095 tunnelId: tunnel.id,1110 tunnelId: tunnel.id,
...@@ -1162,6 +1177,7 @@ export const make = Effect.gen(function* () {...@@ -1162,6 +1177,7 @@ export const make = Effect.gen(function* () {
1162 userId: input.userId,1177 userId: input.userId,
1163 environmentId: input.environmentId,1178 environmentId: input.environmentId,
1164 stage: "record-dns",1179 stage: "record-dns",
1180 reason: "claim-lost",
1165 hostname,1181 hostname,
1166 tunnelName,1182 tunnelName,
1167 tunnelId: tunnel.id,1183 tunnelId: tunnel.id,
...@@ -1192,6 +1208,7 @@ export const make = Effect.gen(function* () {...@@ -1192,6 +1208,7 @@ export const make = Effect.gen(function* () {
1192 userId: input.userId,1208 userId: input.userId,
1193 environmentId: input.environmentId,1209 environmentId: input.environmentId,
1194 stage: "record-dns",1210 stage: "record-dns",
1211 reason: "claim-lost",
1195 hostname,1212 hostname,
1196 tunnelName,1213 tunnelName,
1197 tunnelId: tunnel.id,1214 tunnelId: tunnel.id,
...@@ -1242,6 +1259,7 @@ export const make = Effect.gen(function* () {...@@ -1242,6 +1259,7 @@ export const make = Effect.gen(function* () {
1242 userId: input.userId,1259 userId: input.userId,
1243 environmentId: input.environmentId,1260 environmentId: input.environmentId,
1244 stage: "mark-allocation-ready",1261 stage: "mark-allocation-ready",
1262 reason: "claim-lost",
1245 hostname,1263 hostname,
1246 tunnelName,1264 tunnelName,
1247 tunnelId: tunnel.id,1265 tunnelId: tunnel.id,
infra/relay/src/worker.ts+7-1
...@@ -175,7 +175,13 @@ export const ApiLive = Api.make(...@@ -175,7 +175,13 @@ export const ApiLive = Api.make(
175 const cloudMintPrivateKey = yield* cloudMintKeyPair.privateKey;175 const cloudMintPrivateKey = yield* cloudMintKeyPair.privateKey;
176 const cloudMintPublicKey = yield* cloudMintKeyPair.publicKey;176 const cloudMintPublicKey = yield* cloudMintKeyPair.publicKey;
177 const hyperdrive = yield* Cloudflare.Hyperdrive.Connect(yield* RelayDb.RelayHyperdrive);177 const hyperdrive = yield* Cloudflare.Hyperdrive.Connect(yield* RelayDb.RelayHyperdrive);
178 const db = yield* Drizzle.Postgres(hyperdrive.connectionString);178 // Named prepared statements collide behind Hyperdrive's transaction-mode
179 // pool: sql-pg < 4.0.0-rc.117 names them `effect1..N` per connection, and
180 // inside a transaction a Bind can reach another request's statement
181 // (#14070, Effect-TS/effect#8320). Unnamed statements cannot collide.
182 const db = yield* Drizzle.Postgres(hyperdrive.connectionString, undefined, {
183 prepare: false,
184 });
179185
180 const managedEndpointTunnelBinding = yield* Cloudflare.Tunnel.ReadWriteTunnel();186 const managedEndpointTunnelBinding = yield* Cloudflare.Tunnel.ReadWriteTunnel();
181 // Keep Worker custom-domain reconciliation ordered after API zone provisioning.187 // Keep Worker custom-domain reconciliation ordered after API zone provisioning.
patches/alchemy@2.0.0-beta.79.patch+84
...@@ -1,3 +1,50 @@...@@ -1,3 +1,50 @@
1diff --git a/lib/Drizzle/Postgres.d.ts b/lib/Drizzle/Postgres.d.ts
2index ddba2e1e6ae85ca24e626ce2d7ea2bde92ef6f86..31335e2039a52ad2fe7a12d6bc820dbb04fe15a8 100644
3--- a/lib/Drizzle/Postgres.d.ts
4+++ b/lib/Drizzle/Postgres.d.ts
5@@ -4,6 +4,11 @@ import type { EffectPgDatabase } from "drizzle-orm/effect-postgres";
6 import type { EffectDrizzlePgConfig } from "drizzle-orm/pg-core/effect/utils";
7 import * as Effect from "effect/Effect";
8 import type * as Redacted from "effect/Redacted";
9+/**
10+ * `@effect/sql-pg` client settings that cannot be carried in the URL, e.g.
11+ * `prepare: false` for transaction-mode poolers such as Hyperdrive.
12+ */
13+export type PostgresClientOptions = Omit<PgClient.PgPoolConfig, "url" | "ssl">;
14 /**
15 * Open a Drizzle/Postgres database from a connection URL using the
16 * `drizzle-orm/effect-postgres` integration.
17@@ -39,7 +44,7 @@ import type * as Redacted from "effect/Redacted";
18 *
19 * @binding
20 */
21-export declare const Postgres: <TRelations extends AnyRelations = EmptyRelations, E = never, R = never>(connectionString: Effect.Effect<Redacted.Redacted<string>, E, R>, config?: EffectDrizzlePgConfig<TRelations>) => Effect.Effect<EffectPgDatabase<TRelations> & {
22+export declare const Postgres: <TRelations extends AnyRelations = EmptyRelations, E = never, R = never>(connectionString: Effect.Effect<Redacted.Redacted<string>, E, R>, config?: EffectDrizzlePgConfig<TRelations>, pgClient?: PostgresClientOptions) => Effect.Effect<EffectPgDatabase<TRelations> & {
23 $client: PgClient.PgClient;
24 }, never, never>;
25 //# sourceMappingURL=Postgres.d.ts.map
26\ No newline at end of file
27diff --git a/lib/Drizzle/Postgres.js b/lib/Drizzle/Postgres.js
28index fdd0942fc9da4f220e135bd9ce6c891dd837a948..e7452288b6b92e0aeacc26f37a10e85a3ba232e5 100644
29--- a/lib/Drizzle/Postgres.js
30+++ b/lib/Drizzle/Postgres.js
31@@ -38,13 +38,13 @@ import { proxyChain } from "../Util/proxy-chain.js";
32 *
33 * @binding
34 */
35-export const Postgres = (connectionString, config) => Effect.map(makeExecutionMemo(Effect.gen(function* () {
36+export const Postgres = (connectionString, config, pgClient) => Effect.map(makeExecutionMemo(Effect.gen(function* () {
37 const [PgClient, PgDrizzle] = yield* Effect.promise(() => Promise.all([
38 import("@effect/sql-pg/PgClient"),
39 import("drizzle-orm/effect-postgres"),
40 ]));
41 const url = yield* connectionString;
42- const pgCtx = yield* Layer.build(PgClient.layer(resolveConnectionOptions(url)));
43+ const pgCtx = yield* Layer.build(PgClient.layer({ ...pgClient, ...resolveConnectionOptions(url) }));
44 return yield* PgDrizzle.makeWithDefaults(config).pipe(Effect.provideContext(pgCtx));
45 })), (db) => proxyChain(db));
46 //# sourceMappingURL=Postgres.js.map
47\ No newline at end of file
1diff --git a/lib/Test/Vitest.js b/lib/Test/Vitest.js48diff --git a/lib/Test/Vitest.js b/lib/Test/Vitest.js
2index 0ecf9ccff01bb6556bf3e471d5a93254d16224a7..c0f1237e6a98e698718b0bbde5de8eb58c859e8e 10064449index 0ecf9ccff01bb6556bf3e471d5a93254d16224a7..c0f1237e6a98e698718b0bbde5de8eb58c859e8e 100644
3--- a/lib/Test/Vitest.js50--- a/lib/Test/Vitest.js
...@@ -11,6 +58,43 @@ index 0ecf9ccff01bb6556bf3e471d5a93254d16224a7..c0f1237e6a98e698718b0bbde5de8eb5...@@ -11,6 +58,43 @@ index 0ecf9ccff01bb6556bf3e471d5a93254d16224a7..c0f1237e6a98e698718b0bbde5de8eb5
11 import * as Core from "./Core.js";58 import * as Core from "./Core.js";
12 export { executeWhenReady, getWhenReady, guardContentType, guardedFetchLayer, rpcClientLayer, WorkerNotReady, } from "./Http.js";59 export { executeWhenReady, getWhenReady, guardContentType, guardedFetchLayer, rpcClientLayer, WorkerNotReady, } from "./Http.js";
13 export const defaultStage = Core.defaultStage;60 export const defaultStage = Core.defaultStage;
61diff --git a/src/Drizzle/Postgres.ts b/src/Drizzle/Postgres.ts
62index 2d138914e834d5c47078c42b756129897506f51d..61ae549db6ee20e8809295e8d1543b3bc78f63ad 100644
63--- a/src/Drizzle/Postgres.ts
64+++ b/src/Drizzle/Postgres.ts
65@@ -48,6 +48,15 @@ import { proxyChain } from "../Util/proxy-chain.ts";
66 * @binding
67 */
68
69+/**
70+ * `@effect/sql-pg` client settings that cannot be carried in the URL, e.g.
71+ * `prepare: false` for transaction-mode poolers such as Hyperdrive.
72+ */
73+export type PostgresClientOptions = Omit<
74+ PgClient.PgPoolConfig,
75+ "url" | "ssl"
76+>;
77+
78 export const Postgres = <
79 TRelations extends AnyRelations = EmptyRelations,
80 E = never,
81@@ -55,6 +64,7 @@ export const Postgres = <
82 >(
83 connectionString: Effect.Effect<Redacted.Redacted<string>, E, R>,
84 config?: EffectDrizzlePgConfig<TRelations>,
85+ pgClient?: PostgresClientOptions,
86 ) =>
87 Effect.map(
88 makeExecutionMemo(
89@@ -67,7 +77,7 @@ export const Postgres = <
90 );
91 const url = yield* connectionString;
92 const pgCtx = yield* Layer.build(
93- PgClient.layer(resolveConnectionOptions(url)),
94+ PgClient.layer({ ...pgClient, ...resolveConnectionOptions(url) }),
95 );
96 return yield* PgDrizzle.makeWithDefaults(config).pipe(
97 Effect.provideContext(pgCtx),
14diff --git a/src/Test/Vitest.ts b/src/Test/Vitest.ts98diff --git a/src/Test/Vitest.ts b/src/Test/Vitest.ts
15index c321e6d4924d0f6b3ae53292a12af88167692ccb..673929a81d066bdd6a2dd94e9c1d95bb69f3e3cd 10064499index c321e6d4924d0f6b3ae53292a12af88167692ccb..673929a81d066bdd6a2dd94e9c1d95bb69f3e3cd 100644
16--- a/src/Test/Vitest.ts100--- a/src/Test/Vitest.ts
pnpm-lock.yaml+3-3
...@@ -101,7 +101,7 @@ patchedDependencies:...@@ -101,7 +101,7 @@ patchedDependencies:
101 '@react-native-ai/apple@0.12.0': 2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d101 '@react-native-ai/apple@0.12.0': 2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d
102 '@react-native-menu/menu@2.0.0': a4866ecfcd44f318043de839d20110c17e14909004900f002ffe12050376f2ba102 '@react-native-menu/menu@2.0.0': a4866ecfcd44f318043de839d20110c17e14909004900f002ffe12050376f2ba
103 '@react-navigation/native-stack@7.17.6': e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552103 '@react-navigation/native-stack@7.17.6': e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552
104 alchemy@2.0.0-beta.79: d1a03d902083946ee58121cc2787d88d1da561e9e30a5bcfcb8654692a489fb8104 alchemy@2.0.0-beta.79: 2ad1ff594ebadb1d8653c94b9ac2762703788acdbd8432c22273e6c19da1f7a6
105 dbus-next@0.10.2: cfff57561b0ee59b5addb3b2e6c6f20906e967507a530ab67e8db8108e520ba4105 dbus-next@0.10.2: cfff57561b0ee59b5addb3b2e6c6f20906e967507a530ab67e8db8108e520ba4
106 effect@4.0.0-rc.115: 0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5106 effect@4.0.0-rc.115: 0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5
107 expo-audio@58.0.4: c20cb927d6848c53e7bf6ec14fe12f19daae9210165d2dbaf4e0f97ce31e8742107 expo-audio@58.0.4: c20cb927d6848c53e7bf6ec14fe12f19daae9210165d2dbaf4e0f97ce31e8742
...@@ -848,7 +848,7 @@ importers:...@@ -848,7 +848,7 @@ importers:
848 version: link:../../packages/shared848 version: link:../../packages/shared
849 alchemy:849 alchemy:
850 specifier: 2.0.0-beta.79850 specifier: 2.0.0-beta.79
851 version: 2.0.0-beta.79(patch_hash=d1a03d902083946ee58121cc2787d88d1da561e9e30a5bcfcb8654692a489fb8)(@effect/platform-node@4.0.0-rc.115(bufferutil@4.1.0)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(redis@6.2.1)(utf-8-validate@6.0.6))(@effect/sql-pg@4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)))(@types/node@24.12.4)(@types/react@19.3.0)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(drizzle-kit@1.0.0-rc.5-ab785fc)(drizzle-orm@1.0.0-rc.5-ab785fc(5f52a5feaac0b02f5e556737028925ac))(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(mongodb@6.21.0(@aws-sdk/credential-providers@3.1062.0)(socks@2.8.9))(pg@8.23.0)(react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(typescript@7.0.2)(utf-8-validate@6.0.6)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))851 version: 2.0.0-beta.79(patch_hash=2ad1ff594ebadb1d8653c94b9ac2762703788acdbd8432c22273e6c19da1f7a6)(@effect/platform-node@4.0.0-rc.115(bufferutil@4.1.0)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(redis@6.2.1)(utf-8-validate@6.0.6))(@effect/sql-pg@4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)))(@types/node@24.12.4)(@types/react@19.3.0)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(drizzle-kit@1.0.0-rc.5-ab785fc)(drizzle-orm@1.0.0-rc.5-ab785fc(5f52a5feaac0b02f5e556737028925ac))(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(mongodb@6.21.0(@aws-sdk/credential-providers@3.1062.0)(socks@2.8.9))(pg@8.23.0)(react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(typescript@7.0.2)(utf-8-validate@6.0.6)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))
852 drizzle-orm:852 drizzle-orm:
853 specifier: 1.0.0-rc.5-ab785fc853 specifier: 1.0.0-rc.5-ab785fc
854 version: 1.0.0-rc.5-ab785fc(5f52a5feaac0b02f5e556737028925ac)854 version: 1.0.0-rc.5-ab785fc(5f52a5feaac0b02f5e556737028925ac)
...@@ -16495,7 +16495,7 @@ snapshots:...@@ -16495,7 +16495,7 @@ snapshots:
16495 json-schema-traverse: 1.0.016495 json-schema-traverse: 1.0.0
16496 require-from-string: 2.0.216496 require-from-string: 2.0.2
1649716497
16498 ? alchemy@2.0.0-beta.79(patch_hash=d1a03d902083946ee58121cc2787d88d1da561e9e30a5bcfcb8654692a489fb8)(@effect/platform-node@4.0.0-rc.115(bufferutil@4.1.0)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(redis@6.2.1)(utf-8-validate@6.0.6))(@effect/sql-pg@4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)))(@types/node@24.12.4)(@types/react@19.3.0)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(drizzle-kit@1.0.0-rc.5-ab785fc)(drizzle-orm@1.0.0-rc.5-ab785fc(5f52a5feaac0b02f5e556737028925ac))(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(mongodb@6.21.0(@aws-sdk/credential-providers@3.1062.0)(socks@2.8.9))(pg@8.23.0)(react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(typescript@7.0.2)(utf-8-validate@6.0.6)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))16498 ? alchemy@2.0.0-beta.79(patch_hash=2ad1ff594ebadb1d8653c94b9ac2762703788acdbd8432c22273e6c19da1f7a6)(@effect/platform-node@4.0.0-rc.115(bufferutil@4.1.0)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(redis@6.2.1)(utf-8-validate@6.0.6))(@effect/sql-pg@4.0.0-rc.115(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)))(@types/node@24.12.4)(@types/react@19.3.0)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(drizzle-kit@1.0.0-rc.5-ab785fc)(drizzle-orm@1.0.0-rc.5-ab785fc(5f52a5feaac0b02f5e556737028925ac))(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(mongodb@6.21.0(@aws-sdk/credential-providers@3.1062.0)(socks@2.8.9))(pg@8.23.0)(react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(typescript@7.0.2)(utf-8-validate@6.0.6)(ws@8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))
16499 : dependencies:16499 : dependencies:
16500 '@alchemy.run/cloudflare-runtime': 2.0.0-beta.79(@distilled.cloud/cloudflare@1.0.0-rc.12(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)))(@effect/platform-node@4.0.0-rc.115(bufferutil@4.1.0)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(redis@6.2.1)(utf-8-validate@6.0.6))(@types/node@24.12.4)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(rolldown@1.2.5)(typescript@7.0.2)16500 '@alchemy.run/cloudflare-runtime': 2.0.0-beta.79(@distilled.cloud/cloudflare@1.0.0-rc.12(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5)))(@effect/platform-node@4.0.0-rc.115(bufferutil@4.1.0)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(redis@6.2.1)(utf-8-validate@6.0.6))(@types/node@24.12.4)(@voidzero-dev/vite-plus-core@1.0.0(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))(rolldown@1.2.5)(typescript@7.0.2)
16501 '@alchemy.run/floci': 2.0.0-beta.79(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))16501 '@alchemy.run/floci': 2.0.0-beta.79(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))