From 004e6133d8044b88c3d68104578d888ec6f2f93a Mon Sep 17 00:00:00 2001 From: Simon Curtis Date: Mon, 17 Aug 2026 15:06:16 +0100 Subject: [PATCH 1/3] perf(windows): reduce first-start editor discovery time --- packages/shared/src/shell.test.ts | 26 ++++++++++++++++++++++++++ packages/shared/src/shell.ts | 18 +++++++++++++++++- 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/packages/shared/src/shell.test.ts b/packages/shared/src/shell.test.ts index e3046c03abed..fa25ebcb8da7 100644 --- a/packages/shared/src/shell.test.ts +++ b/packages/shared/src/shell.test.ts @@ -2,6 +2,8 @@ import * as NodeServices from "@effect/platform-node/NodeServices"; import { it as effectIt } from "@effect/vitest"; import { HostProcessEnvironment, HostProcessPlatform } from "@t3tools/shared/hostProcess"; import * as Effect from "effect/Effect"; +import * as FileSystem from "effect/FileSystem"; +import * as Path from "effect/Path"; import { describe, expect, it, vi } from "vite-plus/test"; import { @@ -375,6 +377,30 @@ effectIt.layer(NodeServices.layer)("resolveCommandPath", (it) => { expect(result._tag).toBe("Failure"); }), ); + + it.effect("matches listed Windows commands case-insensitively", () => + Effect.gen(function* () { + const fileSystem = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + const tempDir = yield* fileSystem.makeTempDirectory({ prefix: "t3-shell-resolution-" }); + + return yield* Effect.gen(function* () { + yield* fileSystem.makeDirectory(path.join(tempDir, "provider-tool.COM")); + const executable = path.join(tempDir, "provider-tool.eXe"); + yield* fileSystem.writeFileString(executable, "MZ"); + + expect( + yield* resolveCommandPath("provider-tool", { + env: { PATH: tempDir, PATHEXT: ".COM;.EXE;.BAT;.CMD" }, + }).pipe(Effect.provideService(HostProcessPlatform, "win32")), + ).toBe(executable); + }).pipe( + Effect.ensuring( + fileSystem.remove(tempDir, { recursive: true, force: true }).pipe(Effect.orDie), + ), + ); + }), + ); }); effectIt.layer(NodeServices.layer)("resolveSpawnCommand", (it) => { diff --git a/packages/shared/src/shell.ts b/packages/shared/src/shell.ts index 4c86c8886312..abde5602b8ba 100644 --- a/packages/shared/src/shell.ts +++ b/packages/shared/src/shell.ts @@ -567,6 +567,7 @@ const resolveCommandPathForPlatform = Effect.fn("shell.resolveCommandPathForPlat command: string, options: CommandAvailabilityOptions & { readonly platform: NodeJS.Platform }, ): Effect.fn.Return { + const fileSystem = yield* FileSystem.FileSystem; const path = yield* Path.Path; const platform = options.platform; const env = options.env ?? process.env; @@ -614,7 +615,22 @@ const resolveCommandPathForPlatform = Effect.fn("shell.resolveCommandPathForPlat } for (const pathEntry of pathEntries) { - for (const candidate of commandCandidates) { + let candidates = commandCandidates; + if (platform === "win32") { + // Fall back to direct probes when a directory is searchable but not listable. + const entries = yield* fileSystem + .readDirectory(pathEntry) + .pipe(Effect.orElseSucceed(() => null)); + if (entries !== null) { + const names = new Map(entries.map((entry) => [entry.toUpperCase(), entry])); + candidates = commandCandidates.flatMap((candidate) => { + const match = names.get(candidate.toUpperCase()); + return match === undefined ? [] : [match]; + }); + } + } + + for (const candidate of candidates) { const candidatePath = path.join(pathEntry, candidate); if (yield* isExecutableFile(candidatePath, platform, windowsPathExtensions)) { cacheCommandResolution(cache, cacheKey, candidatePath, nowNanos); From ae911eb39ad83f26261b28f2963b4494068cf145 Mon Sep 17 00:00:00 2001 From: Simon Curtis <43214378+simon-curtis@users.noreply.github.com> Date: Mon, 17 Aug 2026 17:44:43 +0100 Subject: [PATCH 2/3] Update packages/shared/src/shell.ts Co-authored-by: macroscopeapp[bot] <170038800+macroscopeapp[bot]@users.noreply.github.com> --- packages/shared/src/shell.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/shared/src/shell.ts b/packages/shared/src/shell.ts index abde5602b8ba..58a41ee600cb 100644 --- a/packages/shared/src/shell.ts +++ b/packages/shared/src/shell.ts @@ -624,7 +624,8 @@ const resolveCommandPathForPlatform = Effect.fn("shell.resolveCommandPathForPlat if (entries !== null) { const names = new Map(entries.map((entry) => [entry.toUpperCase(), entry])); candidates = commandCandidates.flatMap((candidate) => { - const match = names.get(candidate.toUpperCase()); + const exactMatch = entries.find((entry) => entry === candidate); + const match = exactMatch ?? names.get(candidate.toUpperCase()); return match === undefined ? [] : [match]; }); } From 6754baee4011016b0ede782b22d94b2f8ce79aac Mon Sep 17 00:00:00 2001 From: Simon Curtis Date: Sat, 5 Sep 2026 17:57:18 +0100 Subject: [PATCH 3/3] perf(windows): reduce command discovery and Git probe startup cost --- .../src/process/externalLauncher.test.ts | 18 ++ apps/server/src/process/externalLauncher.ts | 9 +- apps/server/src/processRunner.cleanup.test.ts | 92 +++++++ apps/server/src/processRunner.test.ts | 21 ++ apps/server/src/processRunner.ts | 4 + .../RepositoryIdentityResolver.test.ts | 61 ++++- .../src/project/RepositoryIdentityResolver.ts | 12 + packages/shared/src/shell.test.ts | 72 +++++- packages/shared/src/shell.ts | 88 ++++++- ..._platform-node-shared@4.0.0-beta.103.patch | 44 ++++ patches/effect@4.0.0-beta.103.patch | 50 +++- pnpm-lock.yaml | 243 +++++++++--------- pnpm-workspace.yaml | 1 + 13 files changed, 566 insertions(+), 149 deletions(-) create mode 100644 apps/server/src/processRunner.cleanup.test.ts create mode 100644 patches/@effect__platform-node-shared@4.0.0-beta.103.patch diff --git a/apps/server/src/process/externalLauncher.test.ts b/apps/server/src/process/externalLauncher.test.ts index 2ae1684b67d4..91484b271733 100644 --- a/apps/server/src/process/externalLauncher.test.ts +++ b/apps/server/src/process/externalLauncher.test.ts @@ -11,6 +11,7 @@ import * as Fiber from "effect/Fiber"; import * as FileSystem from "effect/FileSystem"; import * as Layer from "effect/Layer"; import * as Path from "effect/Path"; +import * as PlatformError from "effect/PlatformError"; import * as Sink from "effect/Sink"; import * as Stream from "effect/Stream"; import * as TestClock from "effect/testing/TestClock"; @@ -835,11 +836,17 @@ it.effect("discovers editors through the service API", () => it.effect("memoizes editor discovery and refreshes after the cache window", () => { let statCalls = 0; + let directoryCalls = 0; const fileInfo = { type: "File" } as FileSystem.File.Info; const launcherLayer = ExternalLauncher.layer.pipe( Layer.provide( Layer.mergeAll( FileSystem.layerNoop({ + readDirectory: () => + Effect.sync(() => { + directoryCalls += 1; + return ["code.eXe", "cursor.EXE"]; + }), stat: () => Effect.sync(() => { statCalls += 1; @@ -860,6 +867,7 @@ it.effect("memoizes editor discovery and refreshes after the cache window", () = const first = yield* launcher.resolveAvailableEditors(); assert.equal(first.includes("vscode"), true); + assert.equal(directoryCalls, 1); const statCallsAfterFirstScan = statCalls; assert.isAbove(statCallsAfterFirstScan, 0); @@ -869,11 +877,13 @@ it.effect("memoizes editor discovery and refreshes after the cache window", () = const second = yield* launcher.resolveAvailableEditors(); assert.deepEqual([...second], [...first]); assert.equal(statCalls, statCallsAfterFirstScan); + assert.equal(directoryCalls, 1); // Past the discovery cache window the next call rescans. yield* TestClock.adjust("30 seconds"); yield* launcher.resolveAvailableEditors(); assert.isAbove(statCalls, statCallsAfterFirstScan); + assert.equal(directoryCalls, 2); }).pipe( Effect.provide( Layer.mergeAll( @@ -905,6 +915,14 @@ it.effect("rescans after an interrupted discovery instead of caching the interru Layer.provide( Layer.mergeAll( FileSystem.layerNoop({ + readDirectory: () => + Effect.fail( + PlatformError.systemError({ + _tag: "PermissionDenied", + module: "FileSystem", + method: "readDirectory", + }), + ), // The first scan parks inside `stat` so the interrupt lands while // discovery is in flight, which is what a client disconnecting // mid-connect does to the shared effect. diff --git a/apps/server/src/process/externalLauncher.ts b/apps/server/src/process/externalLauncher.ts index fbde96ff58b1..9389f938aba6 100644 --- a/apps/server/src/process/externalLauncher.ts +++ b/apps/server/src/process/externalLauncher.ts @@ -19,7 +19,11 @@ import { type LaunchEditorInput, } from "@t3tools/contracts"; import { HostProcessPlatform } from "@t3tools/shared/hostProcess"; -import { isCommandAvailable, resolveSpawnCommand } from "@t3tools/shared/shell"; +import { + isCommandAvailable, + resolveSpawnCommand, + withCommandDirectoryCache, +} from "@t3tools/shared/shell"; import * as Clock from "effect/Clock"; import * as Config from "effect/Config"; import * as Context from "effect/Context"; @@ -456,7 +460,8 @@ const resolveBrowserLaunch = Effect.fn("externalLauncher.resolveBrowserLaunch")( const resolveAvailableEditors = Effect.fn("externalLauncher.resolveAvailableEditors")(function* () { const platform = yield* HostProcessPlatform; const env = { ...(yield* readBrowserLaunchEnv), ...(yield* readCommandLookupEnv) }; - return yield* buildAvailableEditors(platform, env); + const discovery = buildAvailableEditors(platform, env); + return yield* platform === "win32" ? withCommandDirectoryCache(discovery) : discovery; }); const resolveFileManagerRevealKind = Effect.fn("externalLauncher.resolveFileManagerRevealKind")( diff --git a/apps/server/src/processRunner.cleanup.test.ts b/apps/server/src/processRunner.cleanup.test.ts new file mode 100644 index 000000000000..ba7700455581 --- /dev/null +++ b/apps/server/src/processRunner.cleanup.test.ts @@ -0,0 +1,92 @@ +// @effect-diagnostics nodeBuiltinImport:off - observes the native cleanup commands used by the process spawner. +import type * as NodeChildProcess from "node:child_process"; +import * as NodeModule from "node:module"; +import * as NodeServices from "@effect/platform-node/NodeServices"; +import { HostProcessPlatform } from "@t3tools/shared/hostProcess"; +import { expect, it } from "@effect/vitest"; +import { afterEach, beforeEach, vi } from "vite-plus/test"; +import * as Deferred from "effect/Deferred"; +import * as Effect from "effect/Effect"; +import * as Fiber from "effect/Fiber"; +import * as Option from "effect/Option"; +import * as Stream from "effect/Stream"; +import { TestClock } from "effect/testing"; +import * as ChildProcess from "effect/unstable/process/ChildProcess"; +import * as ChildProcessSpawner from "effect/unstable/process/ChildProcessSpawner"; + +import * as ProcessRunner from "./processRunner.ts"; + +// Observe native ESM consumers as well as modules loaded through the test runner. +const nativeChildProcess = NodeModule.createRequire(import.meta.url)( + "node:child_process", +) as typeof NodeChildProcess; + +beforeEach(() => { + vi.spyOn(nativeChildProcess, "exec"); + NodeModule.syncBuiltinESMExports(); +}); +afterEach(() => { + vi.restoreAllMocks(); + NodeModule.syncBuiltinESMExports(); +}); + +const taskkillCalls = () => + vi + .mocked(nativeChildProcess.exec) + .mock.calls.filter(([command]) => command.startsWith("taskkill ")); + +it.layer(NodeServices.layer)("completed probe cleanup", (it) => { + for (const cleanupOnExit of [false, true] as const) { + it.effect(`preserves nonzero results with cleanupOnExit=${cleanupOnExit}`, () => + Effect.gen(function* () { + const runner = yield* ProcessRunner.ProcessRunner; + const result = yield* runner.run({ + command: process.execPath, + args: ["-e", "process.stdout.write('probe result'); process.exitCode = 1"], + ...(cleanupOnExit ? {} : { windowsCleanupOnExit: cleanupOnExit }), + }); + expect(result.code).toBe(1); + expect(result.stdout).toBe("probe result"); + if ((yield* HostProcessPlatform) === "win32") { + expect(taskkillCalls()).toHaveLength(cleanupOnExit ? 2 : 0); + } + }).pipe(Effect.provide(ProcessRunner.layer)), + ); + } + + for (const termination of ["interrupt", "timeout"] as const) { + it.effect(`still kills running probes on ${termination}`, () => + Effect.gen(function* () { + const spawner = yield* ChildProcessSpawner.ChildProcessSpawner; + const ready = yield* Deferred.make(); + const probe = Effect.gen(function* () { + const child = yield* spawner.spawn( + ChildProcess.make( + process.execPath, + ["-e", "process.stdout.write('ready'); setInterval(() => {}, 1000)"], + { cleanupOnExit: false }, + ), + ); + yield* Stream.runHead(child.stdout); + yield* Deferred.succeed(ready, child); + return yield* Effect.never; + }).pipe(Effect.scoped); + const fiber = yield* probe.pipe(Effect.timeoutOption("1 second"), Effect.forkChild); + const child = yield* Deferred.await(ready); + expect(yield* child.isRunning).toBe(true); + + if (termination === "interrupt") { + yield* Fiber.interrupt(fiber); + } else { + yield* TestClock.adjust("1 second"); + expect(Option.isNone(yield* Fiber.join(fiber))).toBe(true); + } + + expect(yield* child.isRunning).toBe(false); + if ((yield* HostProcessPlatform) === "win32") { + expect(taskkillCalls()).toHaveLength(1); + } + }), + ); + } +}); diff --git a/apps/server/src/processRunner.test.ts b/apps/server/src/processRunner.test.ts index e264ba7849da..77ee1e3c0b5a 100644 --- a/apps/server/src/processRunner.test.ts +++ b/apps/server/src/processRunner.test.ts @@ -19,6 +19,7 @@ type ChildProcessCommand = { readonly args: ReadonlyArray; readonly options: { readonly shell?: boolean | string; + readonly cleanupOnExit?: boolean; }; }; @@ -80,6 +81,26 @@ const runWith = ); describe("runProcess", () => { + for (const platform of ["win32", "linux", "darwin"] as const) { + it.effect(`only applies Windows probe cleanup settings on Windows (${platform})`, () => + Effect.gen(function* () { + const spawner = makeSpawner((command) => { + expect(command.options.cleanupOnExit).toBe(platform === "win32" ? false : undefined); + return Effect.succeed(makeHandle({ code: 1 })); + }); + const result = yield* runWith(spawner)({ + command: "git", + args: ["rev-parse", "--show-toplevel"], + windowsCleanupOnExit: false, + }); + expect(result.code).toBe(1); + }).pipe( + Effect.provideService(HostProcessPlatform, platform), + Effect.provideService(SpawnExecutableResolution, () => "C:\\git.exe"), + ), + ); + } + it.effect("collects stdout through an injected ChildProcessSpawner", () => Effect.gen(function* () { const spawner = makeSpawner((command) => diff --git a/apps/server/src/processRunner.ts b/apps/server/src/processRunner.ts index c245b0411525..48dc90ad01d3 100644 --- a/apps/server/src/processRunner.ts +++ b/apps/server/src/processRunner.ts @@ -28,6 +28,8 @@ export interface ProcessRunInput { readonly maxOutputBytes?: number | undefined; readonly outputMode?: "error" | "truncate" | undefined; readonly truncatedMarker?: string | undefined; + /** On Windows, disable only for leaf probes that cannot leave child processes after exiting. */ + readonly windowsCleanupOnExit?: boolean | undefined; /** * On timeout, return a synthetic timedOut result. * Partial stdout/stderr are not preserved. @@ -294,6 +296,7 @@ const runProcessCore = Effect.fn("processRunner.runProcessCore")(function* ( const outputMode = input.outputMode ?? "error"; const truncatedMarker = input.truncatedMarker ?? ""; const extendEnv = input.env !== undefined; + const platform = yield* HostProcessPlatform; const spawnCommand = yield* resolveSpawnCommand( input.command, input.args, @@ -311,6 +314,7 @@ const runProcessCore = Effect.fn("processRunner.runProcessCore")(function* ( } : {}), shell: spawnCommand.shell, + ...(platform === "win32" ? { cleanupOnExit: input.windowsCleanupOnExit } : {}), }), ) .pipe( diff --git a/apps/server/src/project/RepositoryIdentityResolver.test.ts b/apps/server/src/project/RepositoryIdentityResolver.test.ts index 7c73752ee831..a38e3d259d6e 100644 --- a/apps/server/src/project/RepositoryIdentityResolver.test.ts +++ b/apps/server/src/project/RepositoryIdentityResolver.test.ts @@ -1,12 +1,14 @@ // @effect-diagnostics nodeBuiltinImport:off - realpathSync.native resolves Windows 8.3 short names, which the Effect realPath does not. import * as NodeFS from "node:fs"; import * as NodeServices from "@effect/platform-node/NodeServices"; +import { HostProcessPlatform } from "@t3tools/shared/hostProcess"; import { expect, it } from "@effect/vitest"; import * as Duration from "effect/Duration"; import * as Effect from "effect/Effect"; import * as FileSystem from "effect/FileSystem"; import * as Layer from "effect/Layer"; import * as Path from "effect/Path"; +import * as PlatformError from "effect/PlatformError"; import * as ChildProcessSpawner from "effect/unstable/process/ChildProcessSpawner"; import { TestClock } from "effect/testing"; @@ -38,11 +40,12 @@ const makeRepositoryIdentityResolverTestLayer = (options: { ).pipe(Layer.provide(ProcessRunner.layer)); it.layer(NodeServices.layer)("RepositoryIdentityResolverLive", (it) => { - it.effect("reuses the cached Git root for repeated workspace lookups", () => { + it.effect("reuses the cached Git root even when the filesystem preflight fails", () => { const calls: Array> = []; const processRunner = Layer.succeed(ProcessRunner.ProcessRunner, { run: (input) => Effect.sync(() => { + expect(input.windowsCleanupOnExit).toBe(false); calls.push(input.args); return { stdout: input.args.includes("rev-parse") @@ -61,7 +64,22 @@ it.layer(NodeServices.layer)("RepositoryIdentityResolverLive", (it) => { const resolverLayer = Layer.effect( RepositoryIdentityResolver.RepositoryIdentityResolver, RepositoryIdentityResolver.make(), - ).pipe(Layer.provide(processRunner)); + ).pipe( + Layer.provide(processRunner), + Layer.provide( + FileSystem.layerNoop({ + exists: (path) => + Effect.fail( + PlatformError.systemError({ + _tag: "PermissionDenied", + module: "FileSystem", + method: "exists", + pathOrDescriptor: path, + }), + ), + }), + ), + ); return Effect.gen(function* () { const resolver = yield* RepositoryIdentityResolver.RepositoryIdentityResolver; @@ -105,7 +123,10 @@ it.layer(NodeServices.layer)("RepositoryIdentityResolverLive", (it) => { const resolverLayer = Layer.effect( RepositoryIdentityResolver.RepositoryIdentityResolver, RepositoryIdentityResolver.make(), - ).pipe(Layer.provide(processRunner)); + ).pipe( + Layer.provide(processRunner), + Layer.provide(FileSystem.layerNoop({ exists: () => Effect.succeed(true) })), + ); return Effect.gen(function* () { const resolver = yield* RepositoryIdentityResolver.RepositoryIdentityResolver; @@ -121,6 +142,40 @@ it.layer(NodeServices.layer)("RepositoryIdentityResolverLive", (it) => { }).pipe(Effect.provide(resolverLayer)); }); + it.effect("skips missing workspaces and discovers them immediately when restored", () => + Effect.gen(function* () { + const fileSystem = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + const parent = yield* fileSystem.makeTempDirectoryScoped({ + prefix: "t3-repository-identity-restored-", + }); + const cwd = path.join(parent, "restored"); + const processRunner = yield* ProcessRunner.ProcessRunner; + const calls: Array> = []; + const resolver = yield* RepositoryIdentityResolver.make().pipe( + Effect.provideService(ProcessRunner.ProcessRunner, { + run: (input) => { + calls.push(input.args); + return processRunner.run(input); + }, + }), + ); + + expect(yield* resolver.resolve(cwd)).toBeNull(); + expect(yield* resolver.resolve(cwd)).toBeNull(); + const platform = yield* HostProcessPlatform; + expect(calls).toHaveLength(platform === "win32" ? 0 : 2); + calls.length = 0; + + yield* fileSystem.makeDirectory(cwd); + yield* git(cwd, ["init"]); + yield* git(cwd, ["remote", "add", "origin", "git@github.com:T3Tools/t3code.git"]); + + expect((yield* resolver.resolve(cwd))?.canonicalKey).toBe("github.com/t3tools/t3code"); + expect(calls).toHaveLength(2); + }).pipe(Effect.provide(ProcessRunner.layer)), + ); + it.effect("normalizes equivalent GitHub remotes into a stable repository identity", () => Effect.gen(function* () { const fileSystem = yield* FileSystem.FileSystem; diff --git a/apps/server/src/project/RepositoryIdentityResolver.ts b/apps/server/src/project/RepositoryIdentityResolver.ts index bf3c570c3cac..f4e4c9178ef3 100644 --- a/apps/server/src/project/RepositoryIdentityResolver.ts +++ b/apps/server/src/project/RepositoryIdentityResolver.ts @@ -1,4 +1,5 @@ import type { RepositoryIdentity } from "@t3tools/contracts"; +import { HostProcessPlatform } from "@t3tools/shared/hostProcess"; import { detectSourceControlProviderFromGitRemoteUrl, normalizeGitRemoteUrl, @@ -8,6 +9,7 @@ import * as Context from "effect/Context"; import * as Duration from "effect/Duration"; import * as Effect from "effect/Effect"; import * as Exit from "effect/Exit"; +import * as FileSystem from "effect/FileSystem"; import * as Layer from "effect/Layer"; import * as ProcessRunner from "../processRunner.ts"; @@ -90,6 +92,12 @@ function buildRepositoryIdentity(input: { const resolveRepositoryIdentityCacheKey = Effect.fn("RepositoryIdentityResolver.resolveCacheKey")( function* (cwd: string) { const processRunner = yield* ProcessRunner.ProcessRunner; + const fileSystem = yield* FileSystem.FileSystem; + if ((yield* HostProcessPlatform) === "win32") { + // Avoid spawning Git for removed projects on Windows. + const exists = yield* fileSystem.exists(cwd).pipe(Effect.orElseSucceed(() => true)); + if (!exists) return null; + } // git is a real executable on every platform — no cmd.exe shell mode, which // would split paths containing spaces during cmd's re-tokenization. @@ -97,6 +105,7 @@ const resolveRepositoryIdentityCacheKey = Effect.fn("RepositoryIdentityResolver. .run({ command: "git", args: ["-C", cwd, "rev-parse", "--show-toplevel"], + windowsCleanupOnExit: false, timeoutBehavior: "timedOutResult", }) .pipe(Effect.option); @@ -119,6 +128,7 @@ const resolveRepositoryIdentityFromCacheKey = Effect.fn( .run({ command: "git", args: ["-C", cacheKey, "remote", "-v"], + windowsCleanupOnExit: false, timeoutBehavior: "timedOutResult", }) .pipe(Effect.option); @@ -135,11 +145,13 @@ export const make = Effect.fn("RepositoryIdentityResolver.make")(function* ( ) { const processRunner = yield* ProcessRunner.ProcessRunner; const cacheCapacity = options.cacheCapacity ?? DEFAULT_REPOSITORY_IDENTITY_CACHE_CAPACITY; + const fileSystem = yield* FileSystem.FileSystem; const repositoryRootCache = yield* Cache.makeWith( (cwd) => resolveRepositoryIdentityCacheKey(cwd).pipe( Effect.provideService(ProcessRunner.ProcessRunner, processRunner), + Effect.provideService(FileSystem.FileSystem, fileSystem), ), { capacity: cacheCapacity, diff --git a/packages/shared/src/shell.test.ts b/packages/shared/src/shell.test.ts index 8c191dfcbe44..10c919ed1862 100644 --- a/packages/shared/src/shell.test.ts +++ b/packages/shared/src/shell.test.ts @@ -11,6 +11,7 @@ import { describe, expect, it, vi } from "vite-plus/test"; import { CommandAvailability, CommandResolutionCache, + withCommandDirectoryCache, type CommandAvailabilityChecker, isCommandAvailable, listLoginShellCandidates, @@ -374,6 +375,13 @@ effectIt.layer(NodeServices.layer)("resolveCommandPath", (it) => { env: { PATH: tempDir, PATHEXT: ".COM;.EXE;.BAT;.CMD" }, }).pipe(Effect.provideService(HostProcessPlatform, "win32")), ).toBe(executable); + if (HostProcessPlatform.defaultValue() === "win32") { + expect( + yield* resolveSpawnCommand("provider-tool", [], { + env: { PATH: tempDir, PATHEXT: ".COM;.EXE;.BAT;.CMD" }, + }), + ).toEqual({ command: executable, args: [], shell: false }); + } }).pipe( Effect.ensuring( fileSystem.remove(tempDir, { recursive: true, force: true }).pipe(Effect.orDie), @@ -382,7 +390,7 @@ effectIt.layer(NodeServices.layer)("resolveCommandPath", (it) => { }), ); - it.effect.each(["PermissionDenied", "Busy", "Unknown", "NotFound", "BadResource"] as const)( + it.effect.each(["PermissionDenied", "Busy", "Unknown"] as const)( "falls back to direct executable probes when listing fails with %s", (reason) => Effect.gen(function* () { @@ -442,6 +450,60 @@ effectIt.layer(NodeServices.layer)("resolveCommandPath", (it) => { }), ); + it.effect.each(["NotFound", "BadResource"] as const)( + "skips direct probes for a directory reported as %s", + (reason) => + Effect.gen(function* () { + const stat = vi.fn(() => Effect.succeed({ type: "File" } as FileSystem.File.Info)); + const result = yield* resolveCommandPath("tool", { + env: { PATH: "C:\\missing", PATHEXT: ".EXE" }, + }).pipe( + Effect.provideService(HostProcessPlatform, "win32"), + Effect.provideService(CommandResolutionCache, new Map()), + Effect.provide( + FileSystem.layerNoop({ + readDirectory: () => + Effect.fail( + PlatformError.systemError({ + _tag: reason, + module: "FileSystem", + method: "readDirectory", + }), + ), + stat, + }), + ), + Effect.result, + ); + expect(result._tag).toBe("Failure"); + expect(stat).not.toHaveBeenCalled(); + }), + ); + + it.effect("reuses listings across commands only within a discovery pass", () => + Effect.gen(function* () { + const fs = yield* FileSystem.FileSystem; + const path = yield* Path.Path; + const cwd = yield* fs.makeTempDirectoryScoped(); + yield* fs.writeFileString(path.join(cwd, "first.eXe"), "MZ"); + const readDirectory = vi.fn((directory: string) => fs.readDirectory(directory)); + const discover = Effect.forEach(["first", "second"], (command) => + resolveCommandPath(command, { env: { PATH: cwd, PATHEXT: ".EXE" } }).pipe(Effect.result), + ).pipe(withCommandDirectoryCache); + const run = discover.pipe( + Effect.provideService(HostProcessPlatform, "win32"), + Effect.provideService(FileSystem.FileSystem, { ...fs, readDirectory }), + ); + const first = yield* run.pipe(Effect.provideService(CommandResolutionCache, new Map())); + expect(first.map((result) => result._tag)).toEqual(["Success", "Failure"]); + expect(readDirectory).toHaveBeenCalledTimes(1); + yield* fs.writeFileString(path.join(cwd, "second.EXE"), "MZ"); + const second = yield* run.pipe(Effect.provideService(CommandResolutionCache, new Map())); + expect(second.map((result) => result._tag)).toEqual(["Success", "Success"]); + expect(readDirectory).toHaveBeenCalledTimes(2); + }), + ); + // Records every path the scan stats, without ever reporting a match, so the // walk runs to exhaustion and the probe set can be inspected. Assertions // below count probes rather than naming paths: `Path` is the host's, so the @@ -454,6 +516,14 @@ effectIt.layer(NodeServices.layer)("resolveCommandPath", (it) => { Effect.provideService(CommandResolutionCache, new Map()), Effect.provide( FileSystem.layerNoop({ + readDirectory: () => + Effect.fail( + PlatformError.systemError({ + _tag: "PermissionDenied", + module: "FileSystem", + method: "readDirectory", + }), + ), stat: (filePath) => Effect.sync(() => { probed.push(filePath); diff --git a/packages/shared/src/shell.ts b/packages/shared/src/shell.ts index 3c7f3e49edc8..c1bc1ffbd18e 100644 --- a/packages/shared/src/shell.ts +++ b/packages/shared/src/shell.ts @@ -124,7 +124,25 @@ function resolveSpawnExecutableWithNode( for (const pathEntry of (readEnvPath(env) ?? "").split(pathDelimiterForPlatform(platform))) { const normalizedPathEntry = stripWrappingQuotes(pathEntry.trim()); if (normalizedPathEntry.length === 0) continue; - for (const candidate of candidates) { + let directoryCandidates = candidates; + if (platform === "win32") { + try { + directoryCandidates = matchCommandDirectory( + candidates, + indexCommandDirectory(NodeFS.readdirSync(normalizedPathEntry)), + ); + } catch (error) { + if ( + typeof error === "object" && + error !== null && + "code" in error && + (error.code === "ENOENT" || error.code === "ENOTDIR") + ) { + continue; + } + } + } + for (const candidate of directoryCandidates) { const candidatePath = path.join(normalizedPathEntry, candidate); if (isExecutable(candidatePath)) return candidatePath; } @@ -512,6 +530,59 @@ export const CommandResolutionCache = Context.Reference; + readonly folded: ReadonlyMap; +} + +function indexCommandDirectory(entries: ReadonlyArray): CommandDirectoryIndex { + return { + exact: new Set(entries), + folded: new Map(entries.map((entry) => [entry.toUpperCase(), entry])), + }; +} + +function matchCommandDirectory(candidates: ReadonlyArray, index: CommandDirectoryIndex) { + return candidates.flatMap((candidate) => { + const match = index.exact.has(candidate) + ? candidate + : index.folded.get(candidate.toUpperCase()); + return match === undefined ? [] : [match]; + }); +} + +const CommandDirectoryCache = Context.Reference | undefined>( + "@t3tools/shared/shell/CommandDirectoryCache", + { defaultValue: () => undefined }, +); + +/** Reuse Windows directory listings within one discovery pass, then discard them. */ +export const withCommandDirectoryCache = (effect: Effect.Effect) => + Effect.suspend(() => Effect.provideService(effect, CommandDirectoryCache, new Map())); + +const readCommandDirectory = Effect.fnUntraced(function* (directory: string) { + const cache = yield* CommandDirectoryCache; + const cached = cache?.get(directory); + if (cached !== undefined) return cached; + + const fileSystem = yield* FileSystem.FileSystem; + const entries = yield* fileSystem + .readDirectory(directory) + .pipe( + Effect.catch((error) => + Effect.succeed( + error.reason._tag === "NotFound" || error.reason._tag === "BadResource" ? [] : null, + ), + ), + ); + // Searchable but unlistable directories still need direct executable probes. + if (entries === null) return null; + + const index = indexCommandDirectory(entries); + cache?.set(directory, index); + return index; +}); + function cacheCommandResolution( cache: Map, cacheKey: string, @@ -554,7 +625,6 @@ const resolveCommandPathForPlatform = Effect.fn("shell.resolveCommandPathForPlat command: string, options: CommandAvailabilityOptions & { readonly platform: NodeJS.Platform }, ): Effect.fn.Return { - const fileSystem = yield* FileSystem.FileSystem; const path = yield* Path.Path; const platform = options.platform; const env = options.env ?? process.env; @@ -607,17 +677,9 @@ const resolveCommandPathForPlatform = Effect.fn("shell.resolveCommandPathForPlat for (const pathEntry of pathEntries) { let candidates = commandCandidates; if (platform === "win32") { - // Fall back to direct probes when a directory is searchable but not listable. - const entries = yield* fileSystem - .readDirectory(pathEntry) - .pipe(Effect.orElseSucceed(() => null)); - if (entries !== null) { - const names = new Map(entries.map((entry) => [entry.toUpperCase(), entry])); - candidates = commandCandidates.flatMap((candidate) => { - const exactMatch = entries.find((entry) => entry === candidate); - const match = exactMatch ?? names.get(candidate.toUpperCase()); - return match === undefined ? [] : [match]; - }); + const index = yield* readCommandDirectory(pathEntry); + if (index !== null) { + candidates = matchCommandDirectory(commandCandidates, index); } } diff --git a/patches/@effect__platform-node-shared@4.0.0-beta.103.patch b/patches/@effect__platform-node-shared@4.0.0-beta.103.patch new file mode 100644 index 000000000000..ea436c21c1f1 --- /dev/null +++ b/patches/@effect__platform-node-shared@4.0.0-beta.103.patch @@ -0,0 +1,44 @@ +diff --git a/dist/NodeChildProcessSpawner.js b/dist/NodeChildProcessSpawner.js +index 29b02311c2101b01e5ad991f2e9375e699f2340c..0338c275281b6f0345bfdd35ad47ab535ff8dcee 100644 +--- a/dist/NodeChildProcessSpawner.js ++++ b/dist/NodeChildProcessSpawner.js +@@ -349,7 +349,7 @@ const make = /*#__PURE__*/Effect.gen(function* () { + if (exited) { + // Process already exited, check if children need cleanup + const [code] = yield* Deferred.await(exitSignal); +- if (code !== 0 && Predicate.isNotNull(code)) { ++ if (cmd.options.cleanupOnExit !== false && code !== 0 && Predicate.isNotNull(code)) { + // Non-zero exit code ,attempt to clean up process group + return yield* Effect.ignore(killWithTimeout(killProcessGroup)); + } +@@ -363,7 +363,7 @@ const make = /*#__PURE__*/Effect.gen(function* () { + })); + const pid = ProcessId(childProcess.pid); + childProcess.on("exit", code => { +- if (code !== 0 && Predicate.isNotNull(code)) { ++ if (cmd.options.cleanupOnExit !== false && code !== 0 && Predicate.isNotNull(code)) { + killProcessGroupOnExit(childProcess, cmd.options.killSignal ?? "SIGTERM"); + } + }); +diff --git a/src/NodeChildProcessSpawner.ts b/src/NodeChildProcessSpawner.ts +index bf6f007c4a29597fad5eb1367dd145fde2688851..5cc2de0d01bfdf505aad95bc3c7b94e828d28143 100644 +--- a/src/NodeChildProcessSpawner.ts ++++ b/src/NodeChildProcessSpawner.ts +@@ -484,7 +484,7 @@ const make = Effect.gen(function*() { + if (exited) { + // Process already exited, check if children need cleanup + const [code] = yield* Deferred.await(exitSignal) +- if (code !== 0 && Predicate.isNotNull(code)) { ++ if (cmd.options.cleanupOnExit !== false && code !== 0 && Predicate.isNotNull(code)) { + // Non-zero exit code ,attempt to clean up process group + return yield* Effect.ignore(killWithTimeout(killProcessGroup)) + } +@@ -507,7 +507,7 @@ const make = Effect.gen(function*() { + + const pid = ProcessId(childProcess.pid!) + childProcess.on("exit", (code) => { +- if (code !== 0 && Predicate.isNotNull(code)) { ++ if (cmd.options.cleanupOnExit !== false && code !== 0 && Predicate.isNotNull(code)) { + killProcessGroupOnExit(childProcess, cmd.options.killSignal ?? "SIGTERM") + } + }) diff --git a/patches/effect@4.0.0-beta.103.patch b/patches/effect@4.0.0-beta.103.patch index a46ccf9c9764..85f4355f23d4 100644 --- a/patches/effect@4.0.0-beta.103.patch +++ b/patches/effect@4.0.0-beta.103.patch @@ -1,5 +1,5 @@ diff --git a/dist/unstable/ai/McpServer.js b/dist/unstable/ai/McpServer.js -index 755e41c..dc431aa 100644 +index 755e41c143ace01604487266c91b6ca331e35e71..dc431aa521784d6bce7ef02e17fbaead40587548 100644 --- a/dist/unstable/ai/McpServer.js +++ b/dist/unstable/ai/McpServer.js @@ -262,6 +262,26 @@ const runWithProtocolState = /*#__PURE__*/Effect.fnUntraced(function* (options, @@ -38,8 +38,25 @@ index 755e41c..dc431aa 100644 return Layer.merge(layerWithProtocolState(options), routes).pipe(Layer.provide(layerMcpProtocolHttp(options)), Layer.provide(protocolState), Layer.provide(RpcSerialization.layerJsonRpc())); }; const layerMcpProtocolHttp = options => Layer.effect(RpcServer.Protocol)(Effect.gen(function* () { +diff --git a/dist/unstable/process/ChildProcess.d.ts b/dist/unstable/process/ChildProcess.d.ts +index 348a3496e8ddfc096d7ec7fe36824c6dcd498285..abc2f372008c7409691b52e377fea67655d322bb 100644 +--- a/dist/unstable/process/ChildProcess.d.ts ++++ b/dist/unstable/process/ChildProcess.d.ts +@@ -263,6 +263,12 @@ export type AdditionalFdConfig = { + * @since 4.0.0 + */ + export interface CommandOptions extends KillOptions { ++ /** ++ * Clean up descendants after a nonzero exit. Defaults to true. ++ * Set false only for leaf probes. Running processes are still killed on scope close. ++ */ ++ readonly cleanupOnExit?: boolean | undefined ++ + /** + * The current working directory of the child process. + */ diff --git a/dist/unstable/rpc/RpcClient.d.ts b/dist/unstable/rpc/RpcClient.d.ts -index aba2779..581d267 100644 +index aba2779fb0703c06e476bd3c30a1156ea4b35dbb..581d267eb13d3c34fae2f98bc523f188f921a9be 100644 --- a/dist/unstable/rpc/RpcClient.d.ts +++ b/dist/unstable/rpc/RpcClient.d.ts @@ -2,6 +2,7 @@ import * as Cause from "../../Cause.ts"; @@ -92,7 +109,7 @@ index aba2779..581d267 100644 /** * Represents optional client protocol hooks that run when a transport connects diff --git a/dist/unstable/rpc/RpcClient.js b/dist/unstable/rpc/RpcClient.js -index b536d0a..12ffac0 100644 +index b536d0a720c13678ccfc2c55c612ee6b61fbedaa..2b0cbb3873cab351134c66c90c57f1045ae7fa7d 100644 --- a/dist/unstable/rpc/RpcClient.js +++ b/dist/unstable/rpc/RpcClient.js @@ -47,6 +47,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro @@ -293,22 +310,20 @@ index b536d0a..12ffac0 100644 latch.closeUnsafe(); }; - const onPong = () => { -- recievedPong = true; -- }; + const onPong = Effect.sync(() => { -+ recievedPong = true; + recievedPong = true; +- }; + missedPongs = 0; + }).pipe(Effect.andThen(hooks?.onPong ?? Effect.void)); yield* Effect.suspend(() => { - if (!recievedPong) return latch.open; -- recievedPong = false; -- return writePing; + if (!recievedPong) { + missedPongs += 1; + if (missedPongs >= 3) return latch.open; + return (hooks?.onPing ?? Effect.void).pipe(Effect.andThen(writePing)); + } -+ recievedPong = false; + recievedPong = false; +- return writePing; + missedPongs = 0; + return (hooks?.onPing ?? Effect.void).pipe(Effect.andThen(writePing)); }).pipe(Effect.delay("5 seconds"), Effect.ignore, Effect.forever, Effect.interruptible, Effect.forkScoped); @@ -326,3 +341,20 @@ index b536d0a..12ffac0 100644 /** * Represents optional client protocol hooks that run when a transport connects * and disconnects. +diff --git a/src/unstable/process/ChildProcess.ts b/src/unstable/process/ChildProcess.ts +index 16bbb4ab376f82c6e0605c13e9dcd90d89f43355..0ffe0622fce90075dac893f55fd08ff0549de3df 100644 +--- a/src/unstable/process/ChildProcess.ts ++++ b/src/unstable/process/ChildProcess.ts +@@ -372,6 +372,12 @@ export type AdditionalFdConfig = + * @since 4.0.0 + */ + export interface CommandOptions extends KillOptions { ++ /** ++ * Clean up descendants after a nonzero exit. Defaults to true. ++ * Set false only for leaf probes. Running processes are still killed on scope close. ++ */ ++ readonly cleanupOnExit?: boolean | undefined ++ + /** + * The current working directory of the child process. + */ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd6ed98740aa..da9069406977 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -88,6 +88,7 @@ packageExtensionsChecksum: sha256-k/dT9NFDl5hihRPaoFKeY11hzyutMFs5psfZLFiKJic= patchedDependencies: '@clerk/expo@4.2.0': 72e426f44fc1cde16fc2cbba3d1e96cdca7c6d957faa73d0fe6b43948608a6c1 + '@effect/platform-node-shared@4.0.0-beta.103': 42c4b137136a2c0506c34e5c970039932c127d696bf27382ca2535dd5a6db83e '@effect/vitest@4.0.0-beta.103': a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b '@expo/metro-config@57.0.12': 96f1a75347e6ea02dc4b7034ace815d8ee39e18b8166ebfb573d9e58328f0dc2 '@ff-labs/fff-node@0.9.4': ab9ff544009e1891cfe3930105862d3699007f38922a79f3c98d90018deca368 @@ -96,7 +97,7 @@ patchedDependencies: '@react-native-ai/apple@0.12.0': 2d09870c2848d185cb05b53ed823a46e12dba519324d8dd8e584e28731990f9d '@react-native-menu/menu@2.0.0': f63d256bf6a97a873b5e628eb595bd6ef0075ddd5bdd890fc920f7a6024290dd '@react-navigation/native-stack@7.17.6': e667c3cef8c78bb9ff4882ee5bd23a432247b843060a9499eb5f07e9e2295552 - effect@4.0.0-beta.103: af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6 + effect@4.0.0-beta.103: d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5 expo-audio@57.0.4: fa9a3e0442ed395d4071bb406e08c3a471c9a84700bdfa0b9ad7ff144c96041a expo-sharing@57.0.17: 8d2e3b10eb3f52036a9a086800180ec6cebf3b75bccc5b1775117a7244d4ac45 react-native-gesture-handler@2.32.0: 808eb26f9e57cf4945efd3985af4d9c764da6f91f4c9764433cc868602bbf4d3 @@ -135,7 +136,7 @@ importers: version: 0.0.3 '@effect/platform-node': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6) + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@napi-rs/keyring': specifier: ^1.3.0 version: 1.3.0 @@ -156,7 +157,7 @@ importers: version: link:../../packages/tailscale effect: specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + version: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) electron: specifier: 43.4.1 version: 43.4.1 @@ -175,7 +176,7 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -224,7 +225,7 @@ importers: version: 4.2.0(patch_hash=72e426f44fc1cde16fc2cbba3d1e96cdca7c6d957faa73d0fe6b43948608a6c1)(1fcd0592788ddcf326eeeb90d875ed47) '@effect/atom-react': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(react@19.2.3)(scheduler@0.27.0) + version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(react@19.2.3)(scheduler@0.27.0) '@expo-google-fonts/dm-sans': specifier: ^0.4.2 version: 0.4.2 @@ -299,7 +300,7 @@ importers: version: 8.0.3 effect: specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + version: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) expo: specifier: ~57.0.18 version: 57.0.18(f9c992a5d7c53d81398568d3950992dc) @@ -456,7 +457,7 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@pierre/trees': specifier: 1.0.0-beta.4 version: 1.0.0-beta.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3) @@ -480,13 +481,13 @@ importers: version: 0.3.260(@anthropic-ai/sdk@0.93.0(zod@4.4.3))(@modelcontextprotocol/sdk@1.29.0(zod@4.4.3))(zod@4.4.3) '@effect/platform-bun': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6) + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(utf-8-validate@6.0.6) '@effect/platform-node': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6) + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@effect/sql-sqlite-bun': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@ff-labs/fff-node': specifier: 0.9.4 version: 0.9.4(patch_hash=ab9ff544009e1891cfe3930105862d3699007f38922a79f3c98d90018deca368) @@ -495,7 +496,7 @@ importers: version: 1.15.13 effect: specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + version: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) msgpackr-extract: specifier: 3.0.4 version: 3.0.4 @@ -511,7 +512,7 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@t3tools/contracts': specifier: workspace:* version: link:../../packages/contracts @@ -568,7 +569,7 @@ importers: version: 3.2.2(react@19.2.6) '@effect/atom-react': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(react@19.2.6)(scheduler@0.27.0) + version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(react@19.2.6)(scheduler@0.27.0) '@formkit/auto-animate': specifier: ^0.9.0 version: 0.9.0 @@ -610,7 +611,7 @@ importers: version: 4.0.2 effect: specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + version: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) heic-to: specifier: ^1.5.2 version: 1.5.2 @@ -659,10 +660,10 @@ importers: devDependencies: '@effect/platform-node': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6) + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@rolldown/plugin-babel': specifier: ^0.2.0 version: 0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5) @@ -722,7 +723,7 @@ importers: version: 3.14.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6) '@effect/sql-pg': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@noble/curves': specifier: 'catalog:' version: 1.9.1 @@ -740,23 +741,23 @@ importers: version: link:../../packages/shared alchemy: specifier: 2.0.0-beta.65 - version: 2.0.0-beta.65(2233d007cbd93ff91712c637e233494f) + version: 2.0.0-beta.65(8c568039059757a4cfe5a2c0ea94a045) drizzle-orm: specifier: 1.0.0-rc.4 - version: 1.0.0-rc.4(@cloudflare/workers-types@4.20260604.1)(@effect/sql-d1@4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bun-types@1.3.14)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(expo-sqlite@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(zod@4.4.3) + version: 1.0.0-rc.4(@cloudflare/workers-types@4.20260604.1)(@effect/sql-d1@4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)))(@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)))(@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)))(@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bun-types@1.3.14)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(expo-sqlite@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(zod@4.4.3) effect: specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + version: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) devDependencies: '@cloudflare/workers-types': specifier: ^4.20260601.1 version: 4.20260604.1 '@effect/platform-node': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6) + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -774,17 +775,17 @@ importers: dependencies: '@effect/platform-node': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6) + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@oxlint/plugins': specifier: ^1.63.0 version: 1.68.0 effect: specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + version: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) devDependencies: '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) vite-plus: specifier: 'catalog:' version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) @@ -799,7 +800,7 @@ importers: version: link:../shared effect: specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + version: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) mdast-util-directive: specifier: ^3.1.0 version: 3.1.0 @@ -818,7 +819,7 @@ importers: devDependencies: '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) micromark-util-types: specifier: ^2.0.2 version: 2.0.2 @@ -830,11 +831,11 @@ importers: dependencies: effect: specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + version: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) devDependencies: '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) vite-plus: specifier: 'catalog:' version: 0.3.0(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.1)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0) @@ -843,17 +844,17 @@ importers: dependencies: effect: specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + version: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) devDependencies: '@effect/openapi-generator': specifier: 'catalog:' - version: 4.0.0-beta.103(@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@effect/platform-node': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6) + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -865,17 +866,17 @@ importers: dependencies: effect: specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + version: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) devDependencies: '@effect/openapi-generator': specifier: 'catalog:' - version: 4.0.0-beta.103(@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@effect/platform-node': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6) + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -896,7 +897,7 @@ importers: version: link:../contracts effect: specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + version: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) jose: specifier: 'catalog:' version: 6.2.2 @@ -906,10 +907,10 @@ importers: devDependencies: '@effect/platform-node': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6) + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -927,14 +928,14 @@ importers: version: link:../shared effect: specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + version: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) devDependencies: '@effect/platform-node': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6) + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -949,11 +950,11 @@ importers: version: link:../shared effect: specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + version: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) devDependencies: '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -965,7 +966,7 @@ importers: dependencies: '@effect/platform-node': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6) + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@electron/asar': specifier: ^3.4.1 version: 3.4.1 @@ -980,14 +981,14 @@ importers: version: link:../packages/tailscale effect: specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + version: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) pngjs: specifier: 7.0.0 version: 7.0.0 devDependencies: '@effect/vitest': specifier: 4.0.0-beta.103 - version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@types/pngjs': specifier: 6.0.5 version: 6.0.5 @@ -11925,24 +11926,24 @@ snapshots: '@cloudflare/workers-types@5.20260726.1': {} - '@distilled.cloud/aws@0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))': + '@distilled.cloud/aws@0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))': dependencies: '@aws-crypto/crc32': 5.2.0 '@aws-crypto/util': 5.2.0 '@aws-sdk/credential-providers': 3.1062.0 '@aws-sdk/types': 3.973.10 - '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@smithy/shared-ini-file-loader': 4.5.6 '@smithy/types': 4.14.3 '@smithy/util-base64': 4.4.6 aws4fetch: 1.0.20 - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) fast-xml-parser: 5.8.0 - '@distilled.cloud/axiom@0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))': + '@distilled.cloud/axiom@0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))': dependencies: - '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) '@distilled.cloud/cloudflare-rolldown-plugin@0.13.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)(workerd@1.20260704.1)': dependencies: @@ -11955,48 +11956,48 @@ snapshots: transitivePeerDependencies: - workerd - '@distilled.cloud/cloudflare-runtime@0.13.10(@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/platform-bun@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6))(@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))': + '@distilled.cloud/cloudflare-runtime@0.13.10(@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)))(@effect/platform-bun@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(utf-8-validate@6.0.6))(@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))': dependencies: '@alchemy.run/node-utils': 0.0.5 - '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) workerd: 1.20260704.1 optionalDependencies: - '@effect/platform-bun': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6) - '@effect/platform-node': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6) + '@effect/platform-bun': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(utf-8-validate@6.0.6) + '@effect/platform-node': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6) - '@distilled.cloud/cloudflare-vite-plugin@0.13.10(86e3ed6000e5955518fd9c0dea8322a9)': + '@distilled.cloud/cloudflare-vite-plugin@0.13.10(c7b6605b849f56c31898560cb0365369)': dependencies: - '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@distilled.cloud/cloudflare-rolldown-plugin': 0.13.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)(workerd@1.20260704.1) - '@distilled.cloud/cloudflare-runtime': 0.13.10(@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/platform-bun@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6))(@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + '@distilled.cloud/cloudflare-runtime': 0.13.10(@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)))(@effect/platform-bun@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(utf-8-validate@6.0.6))(@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)' optionalDependencies: - '@effect/platform-bun': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6) - '@effect/platform-node': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6) + '@effect/platform-bun': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(utf-8-validate@6.0.6) + '@effect/platform-node': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - rolldown - workerd - '@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))': + '@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))': dependencies: - '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) - '@distilled.cloud/core@0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))': + '@distilled.cloud/core@0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))': dependencies: - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) - '@distilled.cloud/neon@0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))': + '@distilled.cloud/neon@0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))': dependencies: - '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) - '@distilled.cloud/planetscale@0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))': + '@distilled.cloud/planetscale@0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))': dependencies: - '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) '@dnd-kit/accessibility@3.1.1(react@19.2.6)': dependencies: @@ -12032,47 +12033,47 @@ snapshots: '@drizzle-team/brocli@0.12.0': {} - '@effect/atom-react@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(react@19.2.3)(scheduler@0.27.0)': + '@effect/atom-react@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(react@19.2.3)(scheduler@0.27.0)': dependencies: - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) react: 19.2.3 scheduler: 0.27.0 - '@effect/atom-react@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(react@19.2.6)(scheduler@0.27.0)': + '@effect/atom-react@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(react@19.2.6)(scheduler@0.27.0)': dependencies: - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) react: 19.2.6 scheduler: 0.27.0 - '@effect/openapi-generator@4.0.0-beta.103(@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))': + '@effect/openapi-generator@4.0.0-beta.103(@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))': dependencies: - '@effect/platform-node': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6) - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + '@effect/platform-node': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) swagger2openapi: 7.0.8 transitivePeerDependencies: - encoding - '@effect/platform-bun@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6)': + '@effect/platform-bun@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(utf-8-validate@6.0.6)': dependencies: - '@effect/platform-node-shared': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6) - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + '@effect/platform-node-shared': 4.0.0-beta.103(patch_hash=42c4b137136a2c0506c34e5c970039932c127d696bf27382ca2535dd5a6db83e)(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(utf-8-validate@6.0.6) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node-shared@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6)': + '@effect/platform-node-shared@4.0.0-beta.103(patch_hash=42c4b137136a2c0506c34e5c970039932c127d696bf27382ca2535dd5a6db83e)(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(utf-8-validate@6.0.6)': dependencies: '@types/ws': 8.18.1 - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6)': + '@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6)': dependencies: - '@effect/platform-node-shared': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6) - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + '@effect/platform-node-shared': 4.0.0-beta.103(patch_hash=42c4b137136a2c0506c34e5c970039932c127d696bf27382ca2535dd5a6db83e)(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(utf-8-validate@6.0.6) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) ioredis: 5.11.0 mime: 4.1.0 undici: 8.9.0 @@ -12080,14 +12081,14 @@ snapshots: - bufferutil - utf-8-validate - '@effect/sql-d1@4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))': + '@effect/sql-d1@4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))': dependencies: '@cloudflare/workers-types': 5.20260726.1 - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) - '@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))': + '@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))': dependencies: - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) pg: 8.22.0 pg-connection-string: 2.14.0 pg-cursor: 2.21.0(pg@8.22.0) @@ -12096,9 +12097,9 @@ snapshots: transitivePeerDependencies: - pg-native - '@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))': + '@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))': dependencies: - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) '@effect/tsgo-darwin-arm64@0.13.2': optional: true @@ -12131,9 +12132,9 @@ snapshots: '@effect/tsgo-win32-arm64': 0.13.2 '@effect/tsgo-win32-x64': 0.13.2 - '@effect/vitest@4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))': + '@effect/vitest@4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))': dependencies: - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) '@egjs/hammerjs@2.0.17': dependencies: @@ -15600,22 +15601,22 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - alchemy@2.0.0-beta.65(2233d007cbd93ff91712c637e233494f): + alchemy@2.0.0-beta.65(8c568039059757a4cfe5a2c0ea94a045): dependencies: '@alchemy.run/node-utils': 0.0.5 '@aws-sdk/credential-providers': 3.1062.0 '@clack/prompts': 0.11.0 - '@distilled.cloud/aws': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - '@distilled.cloud/axiom': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + '@distilled.cloud/aws': 0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + '@distilled.cloud/axiom': 0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@distilled.cloud/cloudflare-rolldown-plugin': 0.13.10(@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.1.5)(workerd@1.20260704.1) - '@distilled.cloud/cloudflare-runtime': 0.13.10(@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/platform-bun@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6))(@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - '@distilled.cloud/cloudflare-vite-plugin': 0.13.10(86e3ed6000e5955518fd9c0dea8322a9) - '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - '@distilled.cloud/neon': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - '@distilled.cloud/planetscale': 0.30.2(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - '@effect/sql-d1': 4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - '@effect/vitest': 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + '@distilled.cloud/cloudflare-runtime': 0.13.10(@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)))(@effect/platform-bun@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(utf-8-validate@6.0.6))(@effect/platform-node@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + '@distilled.cloud/cloudflare-vite-plugin': 0.13.10(c7b6605b849f56c31898560cb0365369) + '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + '@distilled.cloud/neon': 0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + '@distilled.cloud/planetscale': 0.30.2(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + '@effect/sql-d1': 4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + '@effect/vitest': 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@libsql/client': 0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) '@octokit/rest': 22.0.1 '@octokit/webhooks': 14.2.0 @@ -15625,7 +15626,7 @@ snapshots: '@types/aws-lambda': 8.10.161 aws4fetch: 1.0.20 capnweb: 0.6.1 - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) fast-glob: 3.3.3 fast-xml-parser: 5.8.0 ink: 6.8.0(@types/react@19.2.16)(bufferutil@4.1.0)(react-devtools-core@6.1.5(bufferutil@4.1.0)(utf-8-validate@6.0.6))(react@19.2.6)(utf-8-validate@6.0.6) @@ -15641,11 +15642,11 @@ snapshots: undici: 7.27.1 yaml: 2.9.0 optionalDependencies: - '@effect/platform-bun': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(utf-8-validate@6.0.6) - '@effect/platform-node': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(ioredis@5.11.0)(utf-8-validate@6.0.6) - '@effect/sql-pg': 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + '@effect/platform-bun': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(utf-8-validate@6.0.6) + '@effect/platform-node': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(ioredis@5.11.0)(utf-8-validate@6.0.6) + '@effect/sql-pg': 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) drizzle-kit: 1.0.0-rc.4 - drizzle-orm: 1.0.0-rc.4(@cloudflare/workers-types@4.20260604.1)(@effect/sql-d1@4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bun-types@1.3.14)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(expo-sqlite@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(zod@4.4.3) + drizzle-orm: 1.0.0-rc.4(@cloudflare/workers-types@4.20260604.1)(@effect/sql-d1@4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)))(@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)))(@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)))(@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bun-types@1.3.14)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(expo-sqlite@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(zod@4.4.3) vite: '@voidzero-dev/vite-plus-core@0.3.0(@types/node@24.12.4)(esbuild@0.28.1)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)' ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6) transitivePeerDependencies: @@ -16609,15 +16610,15 @@ snapshots: get-tsconfig: 4.14.0 jiti: 2.7.0 - drizzle-orm@1.0.0-rc.4(@cloudflare/workers-types@4.20260604.1)(@effect/sql-d1@4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)))(@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bun-types@1.3.14)(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6))(expo-sqlite@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(zod@4.4.3): + drizzle-orm@1.0.0-rc.4(@cloudflare/workers-types@4.20260604.1)(@effect/sql-d1@4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)))(@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)))(@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)))(@libsql/client@0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6))(bun-types@1.3.14)(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5))(expo-sqlite@57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6))(mysql2@3.22.4(@types/node@24.12.4))(pg@8.21.0)(zod@4.4.3): optionalDependencies: '@cloudflare/workers-types': 4.20260604.1 - '@effect/sql-d1': 4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - '@effect/sql-pg': 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) - '@effect/sql-sqlite-bun': 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6)) + '@effect/sql-d1': 4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + '@effect/sql-pg': 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) + '@effect/sql-sqlite-bun': 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5)) '@libsql/client': 0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6) bun-types: 1.3.14 - effect: 4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6) + effect: 4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5) expo-sqlite: 57.0.2(expo@57.0.18)(react-native@0.86.3(@babel/core@7.29.7)(@react-native/metro-config@0.86.3(@babel/core@7.29.7)(bufferutil@4.1.0)(utf-8-validate@6.0.6))(@types/react@19.2.16)(bufferutil@4.1.0)(react@19.2.6)(utf-8-validate@6.0.6))(react@19.2.6) mysql2: 3.22.4(@types/node@24.12.4) pg: 8.21.0 @@ -16637,7 +16638,7 @@ snapshots: ee-first@1.1.1: {} - effect@4.0.0-beta.103(patch_hash=af36b7948b6f9c56623074662b51dade5699880c1a7c71245de73e13c3185fb6): + effect@4.0.0-beta.103(patch_hash=d0da49cc9dd3209dfcffeff70846915b6f97ff50ce4b69ea33367232fa72e0b5): dependencies: '@standard-schema/spec': 1.1.0 fast-check: 4.9.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ee1bd25547f6..c70a9ec2b4bb 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -158,6 +158,7 @@ packageExtensions: patchedDependencies: "@clerk/expo@4.2.0": patches/@clerk__expo@4.2.0.patch + "@effect/platform-node-shared@4.0.0-beta.103": patches/@effect__platform-node-shared@4.0.0-beta.103.patch "@effect/vitest@4.0.0-beta.103": patches/@effect__vitest@4.0.0-beta.103.patch "@expo/metro-config@57.0.12": patches/@expo__metro-config@57.0.12.patch "@ff-labs/fff-node@0.9.4": patches/@ff-labs__fff-node@0.9.4.patch