diff --git a/apps/desktop/src/preview/Manager.ts b/apps/desktop/src/preview/Manager.ts index d7e8376cec7472f3e6b3d1c8695b6400e257735c..62d400fbda6295147323901fd70370741cd526a8 100644 --- a/apps/desktop/src/preview/Manager.ts +++ b/apps/desktop/src/preview/Manager.ts @@ -109,7 +109,7 @@ const DIAGNOSTIC_BUFFER_LIMIT = 200; const MAX_ARTIFACT_SITE_SLUG_LENGTH = 80; const AGENT_CURSOR_MOVE_MS = 160; const AGENT_CURSOR_CLICK_LEAD_MS = 40; -const encodeUnknownJson = Schema.encodeUnknownEffect(Schema.UnknownFromJsonString); +const encodeUnknownJson = Schema.encodeUnknownEffect(Schema.fromJsonString(Schema.Unknown)); const DEFAULT_ANNOTATION_THEME: DesktopPreviewAnnotationTheme = { colorScheme: "light", radius: "0.625rem", diff --git a/apps/desktop/src/preview/PlaywrightInjectedRuntime.ts b/apps/desktop/src/preview/PlaywrightInjectedRuntime.ts index ff1531f08f3c74e5a23bedcb2e5d067cf53c95e0..6104532e68d059fd6dec0ea53ff31e4c8d267e58 100644 --- a/apps/desktop/src/preview/PlaywrightInjectedRuntime.ts +++ b/apps/desktop/src/preview/PlaywrightInjectedRuntime.ts @@ -8,7 +8,7 @@ import * as Effect from "effect/Effect"; import * as Schema from "effect/Schema"; const require = NodeModule.createRequire(import.meta.url); -const encodeUnknownJson = Schema.encodeUnknownEffect(Schema.UnknownFromJsonString); +const encodeUnknownJson = Schema.encodeUnknownEffect(Schema.fromJsonString(Schema.Unknown)); const PLAYWRIGHT_PACKAGE_SPECIFIER = "playwright-core/package.json"; const PLAYWRIGHT_SOURCE_MARKER = "source3 = "; const PLAYWRIGHT_SOURCE_TERMINATOR = ";\n }\n});"; diff --git a/apps/server/src/cli/config.test.ts b/apps/server/src/cli/config.test.ts index cc1821dd10dc6bf4e4f69de489ae3e5be670b1fd..def63b61fafe97afe00a54005d875a826ec20adf 100644 --- a/apps/server/src/cli/config.test.ts +++ b/apps/server/src/cli/config.test.ts @@ -1,3 +1,5 @@ +// @effect-diagnostics nodeBuiltinImport:off +import * as NodeFS from "node:fs"; import * as NodeOS from "node:os"; import { assert, expect, it } from "@effect/vitest"; @@ -56,8 +58,10 @@ it.layer(NodeServices.layer)("cli config resolution", (it) => { const filePath = yield* fs.makeTempFileScoped({ prefix: "t3-bootstrap-", suffix: ".ndjson" }); const encoded = yield* encodeDesktopBootstrap(payload); yield* fs.writeFileString(filePath, `${encoded}\n`); - const { fd } = yield* fs.open(filePath, { flag: "r" }); - return fd; + return yield* Effect.acquireRelease( + Effect.sync(() => NodeFS.openSync(filePath, "r")), + (fd) => Effect.sync(() => NodeFS.closeSync(fd)), + ); }); it.effect("falls back to effect/config values when flags are omitted", () => diff --git a/apps/server/src/cli/config.ts b/apps/server/src/cli/config.ts index 6814d251a37e89c13f3637f40e2c1af1ea473005..5b05b773b3148b30fccd4476135dcb8164d947c6 100644 --- a/apps/server/src/cli/config.ts +++ b/apps/server/src/cli/config.ts @@ -466,7 +466,7 @@ export const DurationFromString = Schema.String.pipe( return Effect.succeed(duration); } return Effect.fail( - new SchemaIssue.InvalidValue(Option.some(value), { + new SchemaIssue.InvalidValue({ message: "Invalid duration. Use values like 5m, 1h, 30d, or 15 minutes.", }), ); diff --git a/apps/server/src/cloud/publicConfig.ts b/apps/server/src/cloud/publicConfig.ts index cb07d19721b586e6f60cd4aebb2a34c74fd2bb5f..e5fb9bd1697d0bdf2ce710c2fb35faefe8293098 100644 --- a/apps/server/src/cloud/publicConfig.ts +++ b/apps/server/src/cloud/publicConfig.ts @@ -4,7 +4,6 @@ import { normalizeSecureRelayUrl } from "@t3tools/shared/relayUrl"; import * as Config from "effect/Config"; import * as ConfigProvider from "effect/ConfigProvider"; import * as Effect from "effect/Effect"; -import * as Option from "effect/Option"; import * as Schema from "effect/Schema"; import * as SchemaIssue from "effect/SchemaIssue"; @@ -24,7 +23,7 @@ function validateRelayUrl(value: string) { ? Effect.fail( new Config.ConfigError( new Schema.SchemaError( - new SchemaIssue.InvalidValue(Option.some(value), { + new SchemaIssue.InvalidValue({ message: "Relay URL must be a secure absolute HTTPS origin.", }), ), @@ -130,7 +129,7 @@ function validateHostedAppUrl(value: string) { return Effect.fail( new Config.ConfigError( new Schema.SchemaError( - new SchemaIssue.InvalidValue(Option.some(value), { + new SchemaIssue.InvalidValue({ message: "Hosted app URL must be an absolute HTTPS origin (or HTTP loopback origin).", }), ), diff --git a/apps/server/src/http.ts b/apps/server/src/http.ts index 5a380be8fe22439f2b075bddc4317fe217437632..3c406731a4b04e9c7f0e505f97f24c04e7cb80b3 100644 --- a/apps/server/src/http.ts +++ b/apps/server/src/http.ts @@ -14,10 +14,10 @@ import * as Option from "effect/Option"; import * as Path from "effect/Path"; import { cast } from "effect/Function"; import { - Headers, HttpBody, HttpClient, HttpClientResponse, + HttpMiddleware, HttpRouter, HttpServerResponse, HttpServerRequest, @@ -30,7 +30,6 @@ import * as ServerConfig from "./config.ts"; import { ASSET_ROUTE_PREFIX, resolveAsset } from "./assets/AssetAccess.ts"; import * as BrowserTraceCollector from "./observability/BrowserTraceCollector.ts"; import * as EnvironmentAuth from "./auth/EnvironmentAuth.ts"; -import * as HttpResponseCompression from "./httpCompression/HttpResponseCompression.ts"; import { traceRelayRequest } from "./cloud/traceRelayRequest.ts"; import { annotateEnvironmentRequest, @@ -44,74 +43,10 @@ import { browserApiCorsAllowedHeaders, browserApiCorsAllowedMethods } from "./ht const OTLP_TRACES_PROXY_PATH = "/api/observability/v1/traces"; const LOOPBACK_HOSTNAMES = new Set(["127.0.0.1", "::1", "localhost"]); const DESKTOP_RENDERER_ORIGINS = ["t3code://app", "t3code-dev://app"]; -const GZIP_MIN_BYTES = 1024; - -function acceptsGzip(value: string | undefined): boolean { - if (!value) return false; - - const accepted = new Map( - value.split(",").map((entry) => { - const [coding = "", ...parameters] = entry.trim().toLowerCase().split(";"); - const quality = parameters - .map((parameter) => parameter.trim().match(/^q=(.+)$/)?.[1]) - .find((parameter) => parameter !== undefined); - return [coding, quality === undefined ? 1 : Number(quality)] as const; - }), - ); - return (accepted.get("gzip") ?? accepted.get("*") ?? 0) > 0; -} - -function varyByAcceptEncoding(value: string | undefined): string { - if (!value) return "Accept-Encoding"; - const values = new Set(value.split(",").map((entry) => entry.trim().toLowerCase())); - return values.has("*") || values.has("accept-encoding") ? value : `${value}, Accept-Encoding`; -} - -const compressHttpResponse = Effect.fnUntraced(function* ( - response: HttpServerResponse.HttpServerResponse, - acceptEncoding: string | undefined, -) { - const body = response.body; - if ( - body._tag !== "Uint8Array" || - body.contentLength < GZIP_MIN_BYTES || - !body.contentType.startsWith("application/json") || - response.headers["content-encoding"] - ) { - return response; - } - - const variedResponse = HttpServerResponse.setHeader( - response, - "vary", - varyByAcceptEncoding(response.headers.vary), - ); - if (!acceptsGzip(acceptEncoding)) return variedResponse; - - const compression = yield* HttpResponseCompression.HttpResponseCompression; - const headers = Headers.set( - Headers.remove(variedResponse.headers, "content-length"), - "content-encoding", - "gzip", - ); - return compression.gzip(body.body, { - status: response.status, - statusText: response.statusText, - headers, - cookies: response.cookies, - contentType: body.contentType, - }); +export const httpCompressionLayer = HttpRouter.middleware(HttpMiddleware.compression(), { + global: true, }); -export const httpCompressionLayer = HttpRouter.middleware( - (httpEffect) => - Effect.flatMap( - Effect.all([httpEffect, HttpServerRequest.HttpServerRequest]), - ([response, request]) => compressHttpResponse(response, request.headers["accept-encoding"]), - ), - { global: true }, -); - export const browserApiCorsLayer = Layer.unwrap( Effect.gen(function* () { const config = yield* ServerConfig.ServerConfig; diff --git a/apps/server/src/httpCompression/HttpResponseCompression.test.ts b/apps/server/src/httpCompression/HttpResponseCompression.test.ts deleted file mode 100644 index b608720d8ddd05e806b52eafcdb0b70a2cb3017a..0000000000000000000000000000000000000000 --- a/apps/server/src/httpCompression/HttpResponseCompression.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { expect, it } from "@effect/vitest"; -import * as NodeStream from "node:stream"; -import * as Effect from "effect/Effect"; - -import * as HttpResponseCompression from "./HttpResponseCompression.ts"; - -it.effect("uses a native Node stream", () => - Effect.gen(function* () { - const compression = yield* HttpResponseCompression.HttpResponseCompression; - const response = compression.gzip(new Uint8Array(), {}); - - expect(response.body._tag).toBe("Raw"); - if (response.body._tag === "Raw") { - expect(response.body.body).toBeInstanceOf(NodeStream.Readable); - } - }).pipe(Effect.provide(HttpResponseCompression.layerNode)), -); - -it.effect("uses a native Web stream for Bun", () => - Effect.gen(function* () { - const compression = yield* HttpResponseCompression.HttpResponseCompression; - const response = compression.gzip(new Uint8Array(), {}); - - expect(response.body._tag).toBe("Raw"); - if (response.body._tag === "Raw") { - expect(response.body.body).toBeInstanceOf(ReadableStream); - } - }).pipe(Effect.provide(HttpResponseCompression.layerBun)), -); diff --git a/apps/server/src/httpCompression/HttpResponseCompression.ts b/apps/server/src/httpCompression/HttpResponseCompression.ts deleted file mode 100644 index f00c4e1a123015ffbcd4019b5a5d7a2906c06107..0000000000000000000000000000000000000000 --- a/apps/server/src/httpCompression/HttpResponseCompression.ts +++ /dev/null @@ -1,36 +0,0 @@ -import * as Context from "effect/Context"; -import * as Effect from "effect/Effect"; -import * as Layer from "effect/Layer"; -import * as HttpServerResponse from "effect/unstable/http/HttpServerResponse"; - -export class HttpResponseCompression extends Context.Service< - HttpResponseCompression, - { - readonly gzip: ( - body: Uint8Array, - options: HttpServerResponse.Options, - ) => HttpServerResponse.HttpServerResponse; - } ->()("t3/httpCompression/HttpResponseCompression") {} - -export const layerNode = Layer.effect( - HttpResponseCompression, - Effect.gen(function* () { - const NodeZlib = yield* Effect.promise(() => import("node:zlib")); - return { - gzip: (body, options) => { - const stream = NodeZlib.createGzip(); - stream.end(body); - return HttpServerResponse.raw(stream, options); - }, - }; - }), -); - -export const layerBun = Layer.succeed(HttpResponseCompression, { - gzip: (body, options) => - HttpServerResponse.raw( - new Response(body).body!.pipeThrough(new CompressionStream("gzip")), - options, - ), -}); diff --git a/apps/server/src/keybindings.ts b/apps/server/src/keybindings.ts index 53f329e85120b1282d316c567d26b6ff92580bd7..10d98bf642909430e29812a12aadd63b55d8b708 100644 --- a/apps/server/src/keybindings.ts +++ b/apps/server/src/keybindings.ts @@ -29,7 +29,6 @@ import * as Exit from "effect/Exit"; import * as FileSystem from "effect/FileSystem"; import * as Path from "effect/Path"; import * as Layer from "effect/Layer"; -import * as Option from "effect/Option"; import * as Predicate from "effect/Predicate"; import * as PubSub from "effect/PubSub"; import * as Result from "effect/Result"; @@ -68,7 +67,7 @@ export const ResolvedKeybindingFromConfig = KeybindingRule.pipe( Effect.filterOrFail( Predicate.isNotNull, () => - new SchemaIssue.InvalidValue(Option.some(rule), { + new SchemaIssue.InvalidValue({ message: "Invalid keybinding rule", }), ), @@ -80,7 +79,7 @@ export const ResolvedKeybindingFromConfig = KeybindingRule.pipe( const key = encodeShortcut(resolved.shortcut); if (!key) { return yield* Effect.fail( - new SchemaIssue.InvalidValue(Option.some(resolved), { + new SchemaIssue.InvalidValue({ message: "Resolved shortcut cannot be encoded to key string", }), ); diff --git a/apps/server/src/mcp/McpHttpServer.test.ts b/apps/server/src/mcp/McpHttpServer.test.ts index e1cdf992f087a0cf0ef62730bb0e1903e423e9f7..fe902f4e93188db909473174f311d8e8ec42f73b 100644 --- a/apps/server/src/mcp/McpHttpServer.test.ts +++ b/apps/server/src/mcp/McpHttpServer.test.ts @@ -5,7 +5,7 @@ import { EnvironmentId, PreviewTabId, ProviderInstanceId, ThreadId } from "@t3to import * as Effect from "effect/Effect"; import * as Layer from "effect/Layer"; import * as Stream from "effect/Stream"; -import { McpSchema, McpServer } from "effect/unstable/ai"; +import { McpProtocol, McpSchema, McpServer } from "effect/unstable/ai"; import { HttpBody, HttpClient, HttpRouter, HttpServerResponse } from "effect/unstable/http"; import * as McpHttpServer from "./McpHttpServer.ts"; @@ -26,8 +26,9 @@ const invocation = { }; const client = McpSchema.McpServerClient.of({ clientId: 1, + protocolVersion: "2025-06-18", initializePayload: { - protocolVersion: "2025-03-26", + protocolVersion: "2025-06-18", capabilities: {}, clientInfo: { name: "mcp-test", version: "1.0.0" }, }, @@ -103,6 +104,7 @@ it.effect("terminates HTTP MCP sessions with DELETE", () => name: "MCP termination test", version: "1.0.0", path: "/mcp", + protocols: [McpProtocol.v2025_06_18], }); yield* HttpRouter.serve(serverLayer, { disableListenLog: true, @@ -239,8 +241,9 @@ it.effect("registers annotated tools and preserves authenticated request context .pipe( Effect.provideService(McpInvocationContext.McpInvocationContext, invocation), Effect.provideService(McpSchema.McpServerClient, client), + Effect.flip, ); - expect(malformed.isError).toBe(true); + expect(malformed._tag).toBe("InvalidParams"); const snapshot = yield* server .callTool({ name: "preview_snapshot", arguments: { tabId: alternateTabId } }) diff --git a/apps/server/src/mcp/McpHttpServer.ts b/apps/server/src/mcp/McpHttpServer.ts index 3ead607489ed4b5e5e51bdf0ecde6f9f26b46c2f..87975a49de2cedb71a0f338a8be6c5f52b57d6d7 100644 --- a/apps/server/src/mcp/McpHttpServer.ts +++ b/apps/server/src/mcp/McpHttpServer.ts @@ -6,7 +6,7 @@ import * as Option from "effect/Option"; import * as Sink from "effect/Sink"; import * as Stream from "effect/Stream"; import type * as Types from "effect/Types"; -import { McpSchema, McpServer, Tool } from "effect/unstable/ai"; +import { McpProtocol, McpSchema, McpServer, Tool } from "effect/unstable/ai"; import { HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/unstable/http"; import packageJson from "../../package.json" with { type: "json" }; @@ -220,6 +220,7 @@ const McpTransportLive = McpServer.layerHttp({ name: "T3 Code", version: packageJson.version, path: "/mcp", + protocols: [McpProtocol.v2025_06_18], }).pipe(Layer.provide(McpAuthMiddlewareLive)); export const layer = PreviewToolkitRegistrationLive.pipe(Layer.provideMerge(McpTransportLive)); diff --git a/apps/server/src/provider/Layers/ClaudeAdapter.ts b/apps/server/src/provider/Layers/ClaudeAdapter.ts index f87d5be74469a44a1de58c4be76d52e814d83163..548ffe6a896d48c4616dab892414353904bcd677 100644 --- a/apps/server/src/provider/Layers/ClaudeAdapter.ts +++ b/apps/server/src/provider/Layers/ClaudeAdapter.ts @@ -90,8 +90,8 @@ import { } from "../Errors.ts"; import { type ClaudeAdapterShape } from "../Services/ClaudeAdapter.ts"; import { type EventNdjsonLogger, makeEventNdjsonLogger } from "./EventNdjsonLogger.ts"; -const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.UnknownFromJsonString); -const decodeUnknownJsonStringExit = Schema.decodeUnknownExit(Schema.UnknownFromJsonString); +const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.fromJsonString(Schema.Unknown)); +const decodeUnknownJsonStringExit = Schema.decodeUnknownExit(Schema.fromJsonString(Schema.Unknown)); const PROVIDER = ProviderDriverKind.make("claudeAgent"); type ClaudeTextStreamKind = Extract; diff --git a/apps/server/src/provider/Layers/CursorAdapter.ts b/apps/server/src/provider/Layers/CursorAdapter.ts index 4dd38519c5a95aca76ddfa0f00dd4f2a1d8869cd..80475a5c2695e14fa2f2874b78d7529ffa9e0516 100644 --- a/apps/server/src/provider/Layers/CursorAdapter.ts +++ b/apps/server/src/provider/Layers/CursorAdapter.ts @@ -77,7 +77,7 @@ import { import { type CursorAdapterShape } from "../Services/CursorAdapter.ts"; import { resolveCursorAcpBaseModelId } from "./CursorProvider.ts"; import { type EventNdjsonLogger, makeEventNdjsonLogger } from "./EventNdjsonLogger.ts"; -const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.UnknownFromJsonString); +const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.fromJsonString(Schema.Unknown)); const PROVIDER = ProviderDriverKind.make("cursor"); const CURSOR_RESUME_VERSION = 1 as const; diff --git a/apps/server/src/provider/Layers/EventNdjsonLogger.test.ts b/apps/server/src/provider/Layers/EventNdjsonLogger.test.ts index 39d93ddc1623c1e0ffdfc00f5dc8aa9c192d2cb1..f6fb557e4b432ce7eb285888278e2bc053446e38 100644 --- a/apps/server/src/provider/Layers/EventNdjsonLogger.test.ts +++ b/apps/server/src/provider/Layers/EventNdjsonLogger.test.ts @@ -20,7 +20,7 @@ import { writeBatchedMessages, } from "./EventNdjsonLogger.ts"; -const encodeUnknownJson = Schema.encodeUnknownSync(Schema.UnknownFromJsonString); +const encodeUnknownJson = Schema.encodeUnknownSync(Schema.fromJsonString(Schema.Unknown)); function ownedLogPath(basePath: string, segment: string): string { const basename = NodePath.basename(basePath); diff --git a/apps/server/src/provider/Layers/EventNdjsonLogger.ts b/apps/server/src/provider/Layers/EventNdjsonLogger.ts index 8eb9d11e7a4b9088ecbf18a621a9cafabff40d0b..e07121ea76c1d54d2cdfb9420575e39455592b33 100644 --- a/apps/server/src/provider/Layers/EventNdjsonLogger.ts +++ b/apps/server/src/provider/Layers/EventNdjsonLogger.ts @@ -34,7 +34,7 @@ const DEFAULT_MAX_BUFFERED_BYTES = MEBIBYTE; const DEFAULT_MAX_BUFFERED_RECORDS = 512; const GLOBAL_THREAD_SEGMENT = "_global"; const LOG_SCOPE = "provider-observability"; -const encodeUnknownJsonString = Schema.encodeUnknownEffect(Schema.UnknownFromJsonString); +const encodeUnknownJsonString = Schema.encodeUnknownEffect(Schema.fromJsonString(Schema.Unknown)); const transientCanonicalEventTypes = new Set([ "content.delta", diff --git a/apps/server/src/provider/Layers/GrokAdapter.ts b/apps/server/src/provider/Layers/GrokAdapter.ts index d8c288a8292f46dd44d7f91100b40963c3fc627a..977cc8caaddb1720bb6f8451fc4aea99ee6290b7 100644 --- a/apps/server/src/provider/Layers/GrokAdapter.ts +++ b/apps/server/src/provider/Layers/GrokAdapter.ts @@ -69,7 +69,7 @@ import { import { type GrokAdapterShape } from "../Services/GrokAdapter.ts"; import { type EventNdjsonLogger, makeEventNdjsonLogger } from "./EventNdjsonLogger.ts"; -const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.UnknownFromJsonString); +const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.fromJsonString(Schema.Unknown)); const PROVIDER = ProviderDriverKind.make("grok"); const GROK_RESUME_VERSION = 1 as const; diff --git a/apps/server/src/provider/acp/AcpNativeLogging.test.ts b/apps/server/src/provider/acp/AcpNativeLogging.test.ts index 8c92d523aee63b3f4c63100d241fa8dd94b53fe4..7c949e0405997c9c404ffa6f27e0f698affd2562 100644 --- a/apps/server/src/provider/acp/AcpNativeLogging.test.ts +++ b/apps/server/src/provider/acp/AcpNativeLogging.test.ts @@ -12,7 +12,7 @@ import type { EventNdjsonLogger } from "../Layers/EventNdjsonLogger.ts"; import { makeAcpNativeLoggerFactory } from "./AcpNativeLogging.ts"; const nodeServicesIt = it.layer(NodeServices.layer); -const encodeUnknownJson = Schema.encodeUnknownSync(Schema.UnknownFromJsonString); +const encodeUnknownJson = Schema.encodeUnknownSync(Schema.fromJsonString(Schema.Unknown)); nodeServicesIt("ACP native logging", (it) => { it.effect("records bounded request and protocol diagnostics without raw payloads", () => diff --git a/apps/server/src/provider/opencodeRuntime.ts b/apps/server/src/provider/opencodeRuntime.ts index 63fcea22d19749225c4ffefda4b2d76b3ac033d4..d9a07fb8f28483b720509baef9416fb0b1529894 100644 --- a/apps/server/src/provider/opencodeRuntime.ts +++ b/apps/server/src/provider/opencodeRuntime.ts @@ -34,7 +34,7 @@ import { collectStreamAsString } from "./providerSnapshot.ts"; import * as NetService from "@t3tools/shared/Net"; import { HostProcessPlatform } from "@t3tools/shared/hostProcess"; import { resolveSpawnCommand } from "@t3tools/shared/shell"; -const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.UnknownFromJsonString); +const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.fromJsonString(Schema.Unknown)); const OPENCODE_EMPTY_CONFIG_CONTENT = "{}"; const OPENCODE_SERVER_READY_PREFIX = "opencode server listening"; diff --git a/apps/server/src/server.test.ts b/apps/server/src/server.test.ts index 74d3fd2d594bdaaaa7f63706a5a81f27f470c00c..e67ece99ffa590170eb13d59da52981b6f095593 100644 --- a/apps/server/src/server.test.ts +++ b/apps/server/src/server.test.ts @@ -73,7 +73,6 @@ const TEST_EPOCH = DateTime.makeUnsafe("1970-01-01T00:00:00.000Z"); import * as BackgroundPolicy from "./background/BackgroundPolicy.ts"; import * as ServerConfig from "./config.ts"; -import * as HttpResponseCompression from "./httpCompression/HttpResponseCompression.ts"; import { makeRoutesLayer } from "./server.ts"; import { resolveAvailableEditorsForConfig } from "./ws.ts"; import * as CheckpointDiffQuery from "./checkpointing/CheckpointDiffQuery.ts"; @@ -892,7 +891,6 @@ const buildAppUnderTest = (options?: { Layer.provideMerge(ServerSecretStore.layer), Layer.provide(workspaceAndProjectServicesLayer), Layer.provideMerge(FetchHttpClient.layer), - Layer.provide(HttpResponseCompression.layerNode), Layer.provide(layerConfig), ); @@ -3221,6 +3219,28 @@ it.layer(NodeServices.layer)("server router seam", (it) => { }).pipe(Effect.provide(NodeHttpServer.layerTest)), ); + // Mirrors NodeHttpServer.layerTest, which does not expose server options, + // with the production `websocket: { perMessageDeflate: true }` setting. + const NodeHttpServerTestWithWsDeflate = HttpServer.layerTestClient.pipe( + Layer.provide( + Layer.fresh(FetchHttpClient.layer).pipe( + Layer.provide(Layer.succeed(FetchHttpClient.RequestInit)({ keepalive: false })), + ), + ), + Layer.provideMerge( + Layer.unwrap( + Effect.map( + Effect.promise(() => import("node:http")), + (NodeHttp) => + NodeHttpServer.layer(NodeHttp.createServer, { + port: 0, + websocket: { perMessageDeflate: true }, + }), + ), + ), + ), + ); + it.effect("negotiates permessage-deflate with clients that offer it", () => Effect.gen(function* () { yield* buildAppUnderTest(); @@ -3246,7 +3266,7 @@ it.layer(NodeServices.layer)("server router seam", (it) => { const plain = yield* openSocket(false); assert.notInclude(plain.extensions, "permessage-deflate"); - }).pipe(Effect.scoped, Effect.provide(NodeHttpServer.layerTest)), + }).pipe(Effect.scoped, Effect.provide(NodeHttpServerTestWithWsDeflate)), ); it.effect("issues short-lived websocket tickets for authenticated bearer sessions", () => diff --git a/apps/server/src/server.ts b/apps/server/src/server.ts index 05657af6d48e01f59688b64cf6d679293440d00c..534d216aade6f7d0072d7831cccb9c5bc199f31f 100644 --- a/apps/server/src/server.ts +++ b/apps/server/src/server.ts @@ -10,7 +10,6 @@ import * as HttpApiBuilder from "effect/unstable/httpapi/HttpApiBuilder"; import * as BackgroundPolicy from "./background/BackgroundPolicy.ts"; import * as HostPowerMonitor from "./background/HostPowerMonitor.ts"; import * as ServerConfig from "./config.ts"; -import * as HttpResponseCompression from "./httpCompression/HttpResponseCompression.ts"; import { otlpTracesProxyRouteLayer, assetRouteLayer, @@ -182,6 +181,20 @@ const HttpServerLive = Layer.unwrap( port: config.port, hostname: config.host ?? "127.0.0.1", gracefulShutdownTimeout: HTTP_PREEMPTIVE_SHUTDOWN_GRACE_MS, + websocket: { + // Negotiate permessage-deflate with clients that offer it; clients + // that don't still get uncompressed frames on their connection. A + // dedicated compressor keeps a per-connection sliding window + // (context takeover) so the compression dictionary is shared across + // server-to-client frames. Decompression uses the shared + // decompressor: uWebSockets' dedicated decompressor path can abort + // connections (close 1006) on valid DEFLATE input — see + // https://github.com/uNetworking/uWebSockets.js/issues/633. + perMessageDeflate: { + compress: "dedicated", + decompress: "shared", + }, + }, }); } else { const [NodeHttpServer, NodeHttp] = yield* Effect.all([ @@ -192,14 +205,18 @@ const HttpServerLive = Layer.unwrap( host: config.host ?? "127.0.0.1", port: config.port, gracefulShutdownTimeout: HTTP_PREEMPTIVE_SHUTDOWN_GRACE_MS, + // Negotiate permessage-deflate with clients that offer it; clients + // that don't still get uncompressed frames on their connection. + // Context takeover stays enabled (ws default) so the compression + // window is shared across frames — that also makes small frames cheap + // to compress, so no size threshold is set (ws only honors + // `threshold` when context takeover is disabled). + websocket: { perMessageDeflate: true }, }); } }), ); -const HttpResponseCompressionLive = - typeof Bun !== "undefined" ? HttpResponseCompression.layerBun : HttpResponseCompression.layerNode; - const PlatformServicesLive = Layer.unwrap( Effect.gen(function* () { if (typeof Bun !== "undefined") { @@ -622,7 +639,6 @@ export const makeServerLayer = Layer.unwrap( Layer.provideMerge(runtimeServicesLive), Layer.provide(activationLayer), Layer.provideMerge(serverRelayBrokerTracingLayer), - Layer.provideMerge(HttpResponseCompressionLive), Layer.provideMerge(HttpServerLive), Layer.provide(ApplicationObservabilityLive), Layer.provideMerge(FetchHttpClient.layer), diff --git a/apps/server/src/textGeneration/ClaudeTextGeneration.ts b/apps/server/src/textGeneration/ClaudeTextGeneration.ts index 37304795a22e9a5f5df126f5be032df0938a71c1..aa3e59e2bf2180f422c6e7db61b2bb90b275e104 100644 --- a/apps/server/src/textGeneration/ClaudeTextGeneration.ts +++ b/apps/server/src/textGeneration/ClaudeTextGeneration.ts @@ -55,7 +55,7 @@ const ClaudeOutputEnvelope = Schema.Struct({ structured_output: Schema.Unknown, }); -const encodeJsonString = Schema.encodeEffect(Schema.UnknownFromJsonString); +const encodeJsonString = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown)); const decodeClaudeOutputEnvelope = Schema.decodeEffect(Schema.fromJsonString(ClaudeOutputEnvelope)); export const makeClaudeTextGeneration = Effect.fn("makeClaudeTextGeneration")(function* ( diff --git a/apps/server/src/textGeneration/CodexTextGeneration.ts b/apps/server/src/textGeneration/CodexTextGeneration.ts index 62d917012ae12e9974cd0845295b424cabc319c4..ad8b9550bc2f77d7fc8e03b0a2f780c9c200c355 100644 --- a/apps/server/src/textGeneration/CodexTextGeneration.ts +++ b/apps/server/src/textGeneration/CodexTextGeneration.ts @@ -35,7 +35,7 @@ import { getCodexServiceTierOptionValue } from "../codexModelOptions.ts"; const CODEX_GIT_TEXT_GENERATION_REASONING_EFFORT = "low"; const CODEX_TIMEOUT_MS = 180_000; -const encodeJsonString = Schema.encodeEffect(Schema.UnknownFromJsonString); +const encodeJsonString = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown)); /** * Build a Codex text-generation closure bound to a specific `CodexSettings` * payload. See `makeCodexAdapter` for the overall per-instance rationale. diff --git a/infra/relay/src/agentActivity/AgentActivityRows.ts b/infra/relay/src/agentActivity/AgentActivityRows.ts index 14245075e108015a90055a93e16b4c4845113939..54ba1df50600384d7dc745177331904eb5e21501 100644 --- a/infra/relay/src/agentActivity/AgentActivityRows.ts +++ b/infra/relay/src/agentActivity/AgentActivityRows.ts @@ -91,8 +91,8 @@ export class AgentActivityRows extends Context.Service< } >()("t3code-relay/agentActivity/AgentActivityRows") {} -const decodeJsonString = Schema.decodeEffect(Schema.UnknownFromJsonString); -const encodeJsonValue = Schema.encodeEffect(Schema.UnknownFromJsonString); +const decodeJsonString = Schema.decodeEffect(Schema.fromJsonString(Schema.Unknown)); +const encodeJsonValue = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown)); const encodeRelayAgentActivityStateJson = Schema.encodeEffect( Schema.fromJsonString(RelayAgentActivityStateSchema), diff --git a/infra/relay/src/agentActivity/LiveActivities.ts b/infra/relay/src/agentActivity/LiveActivities.ts index 97e87a65f2ca10abc9307f96cbc084aa56f6ce4a..a2179e1e76936d001bf579048740ebc0cc1f9c03 100644 --- a/infra/relay/src/agentActivity/LiveActivities.ts +++ b/infra/relay/src/agentActivity/LiveActivities.ts @@ -122,8 +122,8 @@ export class LiveActivities extends Context.Service< } >()("t3code-relay/agentActivity/LiveActivities") {} -const decodeJsonString = Schema.decodeEffect(Schema.UnknownFromJsonString); -const encodeJsonValue = Schema.encodeEffect(Schema.UnknownFromJsonString); +const decodeJsonString = Schema.decodeEffect(Schema.fromJsonString(Schema.Unknown)); +const encodeJsonValue = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown)); const encodeRelayAgentActivityAggregateStateJson = Schema.encodeEffect( Schema.fromJsonString(RelayAgentActivityAggregateStateSchema), diff --git a/infra/relay/src/observability.test.ts b/infra/relay/src/observability.test.ts index 5daeda11660741b0057261a9e8ee251f8b838d8a..3958b28b95dda07454adf9ebd2a64c6afa262474 100644 --- a/infra/relay/src/observability.test.ts +++ b/infra/relay/src/observability.test.ts @@ -21,11 +21,11 @@ interface ExportedRequest { const otlpAttributeValue = (value: { readonly stringValue?: string | null; readonly boolValue?: boolean | null; - readonly intValue?: number | null; + readonly intValue?: string | number | null; readonly doubleValue?: number | null; }) => value.stringValue ?? value.boolValue ?? value.intValue ?? value.doubleValue; -const decodeJson = Schema.decodeUnknownEffect(Schema.UnknownFromJsonString); +const decodeJson = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Unknown)); it.effect("exports schema error fields as span attributes", () => Effect.gen(function* () { diff --git a/infra/relay/src/worker.ts b/infra/relay/src/worker.ts index bcc53f3ff05c7e401a4e631b9d1b655b5dd8318a..77dfd845c5bcf6b2ba08192649b826d20021be0a 100644 --- a/infra/relay/src/worker.ts +++ b/infra/relay/src/worker.ts @@ -72,6 +72,11 @@ const webcryptoLayer = Layer.succeed( ); const httpPlatformNotSupportedLayer = Layer.succeed(HttpPlatform.HttpPlatform, { + platform: "web", + compression: { + algorithms: new Set(), + compressResponse: (response) => Effect.succeed(response), + }, fileResponse: () => Effect.die("Relay API does not serve filesystem responses"), fileWebResponse: () => Effect.die("Relay API does not serve file responses"), }); diff --git a/oxlint-plugin-t3code/test/utils.ts b/oxlint-plugin-t3code/test/utils.ts index 740da8a4f2ba768f40b14f8ea6dea918cd4d0c73..b1d7fccf38e345c65081bc5497f6cd92bf153cda 100644 --- a/oxlint-plugin-t3code/test/utils.ts +++ b/oxlint-plugin-t3code/test/utils.ts @@ -38,7 +38,7 @@ class OxlintFixtureExpectedFailure extends Data.TaggedError("OxlintFixtureExpect } } -const encodeOxlintConfig = Schema.encodeEffect(Schema.UnknownFromJsonString); +const encodeOxlintConfig = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown)); interface RuleHarness { readonly run: ( diff --git a/packages/client-runtime/src/rpc/session.test.ts b/packages/client-runtime/src/rpc/session.test.ts index 751453f82f69a0f56310b852269a01c11f740269..f7868834b57c5339855db5991693d346bab60fa7 100644 --- a/packages/client-runtime/src/rpc/session.test.ts +++ b/packages/client-runtime/src/rpc/session.test.ts @@ -138,9 +138,9 @@ const RpcRequest = Schema.TaggedStruct("Request", { payload: Schema.Unknown, tag: Schema.String, }); -const decodeJson = Schema.decodeUnknownSync(Schema.UnknownFromJsonString); +const decodeJson = Schema.decodeUnknownSync(Schema.fromJsonString(Schema.Unknown)); const decodeRpcRequest = Schema.decodeUnknownSync(RpcRequest); -const encodeJson = Schema.encodeUnknownSync(Schema.UnknownFromJsonString); +const encodeJson = Schema.encodeUnknownSync(Schema.fromJsonString(Schema.Unknown)); const encodeServerConfig = Schema.encodeSync(ServerConfig); const ENCODED_SERVER_CONFIG = encodeServerConfig(SERVER_CONFIG); const LEGACY_SERVER_CONFIG = { diff --git a/packages/contracts/src/orchestration.ts b/packages/contracts/src/orchestration.ts index 64520c89f9027732959b1a20bdaf5fb4b16538ca..af93a7b8fb4ebcc2cb24677ce84964c09879db46 100644 --- a/packages/contracts/src/orchestration.ts +++ b/packages/contracts/src/orchestration.ts @@ -1,5 +1,4 @@ import * as Effect from "effect/Effect"; -import * as Option from "effect/Option"; import * as Schema from "effect/Schema"; import * as SchemaIssue from "effect/SchemaIssue"; import * as SchemaTransformation from "effect/SchemaTransformation"; @@ -1320,7 +1319,7 @@ export const TurnCountRange = Schema.Struct({ Schema.makeFilter( (input) => input.fromTurnCount <= input.toTurnCount || - new SchemaIssue.InvalidValue(Option.some(input.fromTurnCount), { + new SchemaIssue.InvalidValue({ message: "fromTurnCount must be less than or equal to toTurnCount", }), { identifier: "OrchestrationTurnDiffRange" }, diff --git a/packages/effect-acp/src/errors.test.ts b/packages/effect-acp/src/errors.test.ts index a54c5af48431308291d24bde77606069717b9cd1..bebf247b29e156b25e396cc2ce0a26c03e2f5d3f 100644 --- a/packages/effect-acp/src/errors.test.ts +++ b/packages/effect-acp/src/errors.test.ts @@ -10,7 +10,7 @@ import * as AcpError from "./errors.ts"; const decodeNestedNumberPayload = Schema.decodeUnknownEffect( Schema.Struct({ profile: Schema.Struct({ token: Schema.Number }) }), ); -const encodeUnknownJson = Schema.encodeSync(Schema.UnknownFromJsonString); +const encodeUnknownJson = Schema.encodeSync(Schema.fromJsonString(Schema.Unknown)); describe("effect-acp errors", () => { it.effect("retains RPC method and cause without deriving the message from the cause", () => { diff --git a/packages/effect-acp/src/protocol.test.ts b/packages/effect-acp/src/protocol.test.ts index 11a582be86cf0edee38c4f66a3e2cef548cedbe9..a66cc75225dab2f1e3ef3cb8133c2add6c929911 100644 --- a/packages/effect-acp/src/protocol.test.ts +++ b/packages/effect-acp/src/protocol.test.ts @@ -49,7 +49,7 @@ const decodeExtResponse = Schema.decodeEffect(Schema.fromJsonString(ExtResponse) const decodeRequestPermissionResponse = Schema.decodeEffect( Schema.fromJsonString(RequestPermissionResponse), ); -const encodeUnknownJsonString = Schema.encodeUnknownSync(Schema.UnknownFromJsonString); +const encodeUnknownJsonString = Schema.encodeUnknownSync(Schema.fromJsonString(Schema.Unknown)); const encoder = new TextEncoder(); const mockPeerPath = Effect.map(Effect.service(Path.Path), (path) => path.join(import.meta.dirname, "../test/fixtures/acp-mock-peer.ts"), diff --git a/packages/effect-codex-app-server/src/_internal/shared.test.ts b/packages/effect-codex-app-server/src/_internal/shared.test.ts index 62b1373f12caf2447bf7d3b05140f6e383178af5..5e87485c85d2280248373fa3769ee9b2c242f261 100644 --- a/packages/effect-codex-app-server/src/_internal/shared.test.ts +++ b/packages/effect-codex-app-server/src/_internal/shared.test.ts @@ -8,7 +8,7 @@ import * as Shared from "./shared.ts"; const decodeNestedNumberPayload = Schema.decodeUnknownEffect( Schema.Struct({ profile: Schema.Struct({ token: Schema.Number }) }), ); -const encodeUnknownJson = Schema.encodeSync(Schema.UnknownFromJsonString); +const encodeUnknownJson = Schema.encodeSync(Schema.fromJsonString(Schema.Unknown)); it.effect("preserves schema decode diagnostics without deriving the message from the cause", () => Effect.gen(function* () { diff --git a/packages/effect-codex-app-server/src/protocol.test.ts b/packages/effect-codex-app-server/src/protocol.test.ts index a68abd537a88d95a1bd125e4937c9e7433444197..a7e0397b4adb1cef3cdec6f8eaa1745744291c9b 100644 --- a/packages/effect-codex-app-server/src/protocol.test.ts +++ b/packages/effect-codex-app-server/src/protocol.test.ts @@ -13,13 +13,13 @@ import * as CodexProtocol from "./protocol.ts"; import * as CodexRpc from "./rpc.ts"; import * as CodexSchema from "./schema.ts"; import { makeInMemoryStdio } from "./_internal/stdio.ts"; -const encodeUnknownJsonString = Schema.encodeUnknownSync(Schema.UnknownFromJsonString); +const encodeUnknownJsonString = Schema.encodeUnknownSync(Schema.fromJsonString(Schema.Unknown)); const encoder = new TextEncoder(); const encodeJsonl = (value: unknown) => encoder.encode(`${encodeUnknownJsonString(value)}\n`); -const decodeJson = Schema.decodeEffect(Schema.UnknownFromJsonString); +const decodeJson = Schema.decodeEffect(Schema.fromJsonString(Schema.Unknown)); const decodeAccountTokenUsageResponse = Schema.decodeUnknownEffect( CodexRpc.CLIENT_REQUEST_RESPONSES["account/usage/read"], ); diff --git a/packages/effect-codex-app-server/src/protocol.ts b/packages/effect-codex-app-server/src/protocol.ts index 825c59b9b2c59b98a5bd866728b3e6fd9f571335..17bfaed2b64c7f3c868ff508cb236d1b99e29787 100644 --- a/packages/effect-codex-app-server/src/protocol.ts +++ b/packages/effect-codex-app-server/src/protocol.ts @@ -91,8 +91,8 @@ function isIncomingResponse(value: unknown): value is typeof JsonRpcResponseEnve return isJsonRpcResponseEnvelope(value); } -const encodeJsonString = Schema.encodeUnknownEffect(Schema.UnknownFromJsonString); -const decodeJsonString = Schema.decodeUnknownEffect(Schema.UnknownFromJsonString); +const encodeJsonString = Schema.encodeUnknownEffect(Schema.fromJsonString(Schema.Unknown)); +const decodeJsonString = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Unknown)); const encodeWireMessage = ( message: Record, diff --git a/packages/shared/src/schemaJson.ts b/packages/shared/src/schemaJson.ts index 77b1fa5d548d59acb564098d74ef78fbfaf738db..3307eb460f8e60b1d818774b91d80e95c399d100 100644 --- a/packages/shared/src/schemaJson.ts +++ b/packages/shared/src/schemaJson.ts @@ -175,7 +175,7 @@ export const formatSchemaError = (cause: Cause.Cause) => { * * Mirrors `SchemaGetter.parseJson()` but strips JSONC syntax before parsing. */ -const decodeJsonString = Schema.decodeEffect(Schema.UnknownFromJsonString); +const decodeJsonString = Schema.decodeEffect(Schema.fromJsonString(Schema.Unknown)); const parseLenientJsonGetter = SchemaGetter.onSome((input: string) => { // Strip single-line comments - alternation preserves quoted strings. diff --git a/packages/shared/src/schemaYaml.ts b/packages/shared/src/schemaYaml.ts index ddb1b5c916c404cb0bdfd1d31e408ed2592b4e25..70e3c987ae0039c1f6391cec32433b36cd00d0c8 100644 --- a/packages/shared/src/schemaYaml.ts +++ b/packages/shared/src/schemaYaml.ts @@ -1,5 +1,4 @@ import * as Effect from "effect/Effect"; -import * as Option from "effect/Option"; import * as Schema from "effect/Schema"; import * as SchemaGetter from "effect/SchemaGetter"; import * as SchemaIssue from "effect/SchemaIssue"; @@ -62,8 +61,7 @@ export function parseYaml( return SchemaGetter.transformOrFail((input: E) => Effect.try({ try: () => parseYamlString(input, options) as unknown, - catch: (error) => - new SchemaIssue.InvalidValue(Option.none(), { message: formatYamlParseError(error) }), + catch: (error) => new SchemaIssue.InvalidValue({ message: formatYamlParseError(error) }), }), ); } @@ -97,8 +95,7 @@ export function stringifyYaml( return SchemaGetter.transformOrFail((input: unknown) => Effect.try({ try: () => stringifyYamlValue(input, options), - catch: () => - new SchemaIssue.InvalidValue(Option.none(), { message: "Failed to stringify YAML." }), + catch: () => new SchemaIssue.InvalidValue({ message: "Failed to stringify YAML." }), }), ); } diff --git a/patches/@effect__platform-bun@4.0.0-beta.102.patch b/patches/@effect__platform-bun@4.0.0-beta.102.patch deleted file mode 100644 index 8b8687295df78f686c87447f6e0196cc376a1a65..0000000000000000000000000000000000000000 --- a/patches/@effect__platform-bun@4.0.0-beta.102.patch +++ /dev/null @@ -1,50 +0,0 @@ -diff --git a/dist/BunHttpServer.js b/dist/BunHttpServer.js -index 5fb0cbacc183b58e31a442badf4aef06bebcd592..e31fb00c430821fc06247079091a93fb15a1ab92 100644 ---- a/dist/BunHttpServer.js -+++ b/dist/BunHttpServer.js -@@ -45,6 +45,20 @@ export const make = /*#__PURE__*/Effect.fnUntraced(function* (options) { - ...options, - fetch: handlerStack[0], - websocket: { -+ // Patch: upstreamed as https://github.com/Effect-TS/effect/pull/6691 (ships -+ // in >= 4.0.0-beta.103 as the layer option `websocket: { ... }`). On -+ // upgrade: drop this patch and pass the option in apps/server/src/server.ts. -+ // Negotiate permessage-deflate with clients that offer it; clients that -+ // don't still get uncompressed frames on their connection. A dedicated -+ // compressor keeps a per-connection sliding window (context takeover) so -+ // the compression dictionary is shared across server-to-client frames. -+ // Decompression uses the shared decompressor: uWebSockets' dedicated -+ // decompressor path can abort connections (close 1006) on valid DEFLATE -+ // input — see https://github.com/uNetworking/uWebSockets.js/issues/633. -+ perMessageDeflate: { -+ compress: "dedicated", -+ decompress: "shared" -+ }, - open(ws) { - Deferred.doneUnsafe(ws.data.deferred, Exit.succeed(ws)); - }, -diff --git a/src/BunHttpServer.ts b/src/BunHttpServer.ts -index 9f2ac3dfc018e2d35c6f44785f1ce05e2e06fc7c..f2bd3def712677ae1e7d475f5eaf27ac2e42ae1a 100644 ---- a/src/BunHttpServer.ts -+++ b/src/BunHttpServer.ts -@@ -90,6 +90,20 @@ export const make = Effect.fnUntraced( - ...options as ServeOptions, - fetch: handlerStack[0], - websocket: { -+ // Patch: upstreamed as https://github.com/Effect-TS/effect/pull/6691 (ships -+ // in >= 4.0.0-beta.103 as the layer option `websocket: { ... }`). On -+ // upgrade: drop this patch and pass the option in apps/server/src/server.ts. -+ // Negotiate permessage-deflate with clients that offer it; clients that -+ // don't still get uncompressed frames on their connection. A dedicated -+ // compressor keeps a per-connection sliding window (context takeover) so -+ // the compression dictionary is shared across server-to-client frames. -+ // Decompression uses the shared decompressor: uWebSockets' dedicated -+ // decompressor path can abort connections (close 1006) on valid DEFLATE -+ // input — see https://github.com/uNetworking/uWebSockets.js/issues/633. -+ perMessageDeflate: { -+ compress: "dedicated", -+ decompress: "shared" -+ }, - open(ws) { - Deferred.doneUnsafe(ws.data.deferred, Exit.succeed(ws)) - }, diff --git a/patches/@effect__platform-node@4.0.0-beta.102.patch b/patches/@effect__platform-node@4.0.0-beta.102.patch deleted file mode 100644 index 4a11632273bf2fbeb2f80a814b0924a619ee6c9a..0000000000000000000000000000000000000000 --- a/patches/@effect__platform-node@4.0.0-beta.102.patch +++ /dev/null @@ -1,50 +0,0 @@ -diff --git a/dist/NodeHttpServer.js b/dist/NodeHttpServer.js -index ab7c9354853032fefa192ebfa8ab2026bac6ddb7..319815f01e78f5d4e6f7e62a00046ec092eaf797 100644 ---- a/dist/NodeHttpServer.js -+++ b/dist/NodeHttpServer.js -@@ -83,7 +83,17 @@ export const make = /*#__PURE__*/Effect.fnUntraced(function* (evaluate, options) - }); - const address = server.address(); - const wss = yield* Effect.acquireRelease(Effect.sync(() => new NodeWS.WebSocketServer({ -- noServer: true -+ noServer: true, -+ // Patch: upstreamed as https://github.com/Effect-TS/effect/pull/6691 (ships -+ // in >= 4.0.0-beta.103 as the layer option `websocket: { perMessageDeflate }`). -+ // On upgrade: drop this patch and pass the option in apps/server/src/server.ts. -+ // Negotiate permessage-deflate with clients that offer it; clients that -+ // don't still get uncompressed frames on their connection. Context -+ // takeover stays enabled (ws default) so the compression window is shared -+ // across frames — that also makes small frames cheap to compress, so no -+ // size threshold is set (ws only honors `threshold` when context takeover -+ // is disabled). -+ perMessageDeflate: true - })), wss => Effect.callback(resume => { - wss.close(() => resume(Effect.void)); - })).pipe(Scope.provide(scope), Effect.cached); -diff --git a/src/NodeHttpServer.ts b/src/NodeHttpServer.ts -index e18cd931f17c26d6ca985a2d1ece9e9d760851d3..9c888a581738aea12dbdb2b213cce1c480aa2ecc 100644 ---- a/src/NodeHttpServer.ts -+++ b/src/NodeHttpServer.ts -@@ -116,7 +116,21 @@ export const make = Effect.fnUntraced(function*( - const address = server.address()! - - const wss = yield* Effect.acquireRelease( -- Effect.sync(() => new NodeWS.WebSocketServer({ noServer: true })), -+ Effect.sync(() => -+ new NodeWS.WebSocketServer({ -+ noServer: true, -+ // Patch: upstreamed as https://github.com/Effect-TS/effect/pull/6691 (ships -+ // in >= 4.0.0-beta.103 as the layer option `websocket: { perMessageDeflate }`). -+ // On upgrade: drop this patch and pass the option in apps/server/src/server.ts. -+ // Negotiate permessage-deflate with clients that offer it; clients that -+ // don't still get uncompressed frames on their connection. Context -+ // takeover stays enabled (ws default) so the compression window is -+ // shared across frames — that also makes small frames cheap to -+ // compress, so no size threshold is set (ws only honors `threshold` -+ // when context takeover is disabled). -+ perMessageDeflate: true -+ }) -+ ), - (wss) => - Effect.callback((resume) => { - wss.close(() => resume(Effect.void)) diff --git a/patches/@effect__vitest@4.0.0-beta.102.patch b/patches/@effect__vitest@4.0.0-beta.102.patch deleted file mode 100644 index 7e3b2f1c516cfaf83fc7e2f1bb5d193d67a54892..0000000000000000000000000000000000000000 --- a/patches/@effect__vitest@4.0.0-beta.102.patch +++ /dev/null @@ -1,124 +0,0 @@ -diff --git a/dist/index.d.ts b/dist/index.d.ts -index bc52d20f3116059904e99498447451bd4083c0fe..43cf0824f9f294cb441d9ee4cc12de9f82c04e46 100644 ---- a/dist/index.d.ts -+++ b/dist/index.d.ts -@@ -7,11 +7,11 @@ import type * as Layer from "effect/Layer"; - import type * as Schema from "effect/Schema"; - import type * as Scope from "effect/Scope"; - import type * as FC from "effect/testing/FastCheck"; --import * as V from "vitest"; -+import * as V from "vite-plus/test"; - /** - * @since 4.0.0 - */ --export * from "vitest"; -+export * from "vite-plus/test"; - /** - * @since 4.0.0 - */ -diff --git a/dist/index.js b/dist/index.js -index 938c9c817abe9aeddb9ad8c74e099c62cbf5f091..760ecc47fec5e9df2efd75de17c05ba4b0700ec1 100644 ---- a/dist/index.js -+++ b/dist/index.js -@@ -1,9 +1,9 @@ --import * as V from "vitest"; -+import * as V from "vite-plus/test"; - import * as internal from "./internal/internal.js"; - /** - * @since 4.0.0 - */ --export * from "vitest"; -+export * from "vite-plus/test"; - /** - * @since 4.0.0 - */ -diff --git a/dist/internal/internal.js b/dist/internal/internal.js -index 29ea5844d6c7db5f8ee9cb40eea09fa06306ac76..45461c6610983e6b55cb0b303f3064fe0e12574c 100644 ---- a/dist/internal/internal.js -+++ b/dist/internal/internal.js -@@ -1,7 +1,7 @@ - /** - * @since 4.0.0 - */ --import { getCurrentSuite } from "@vitest/runner"; -+import { getCurrentSuite } from "vite-plus/test/plugins/runner"; - import * as Cause from "effect/Cause"; - import * as Duration from "effect/Duration"; - import * as Effect from "effect/Effect"; -@@ -16,7 +16,7 @@ import * as Scope from "effect/Scope"; - import * as fc from "effect/testing/FastCheck"; - import * as TestClock from "effect/testing/TestClock"; - import * as TestConsole from "effect/testing/TestConsole"; --import * as V from "vitest"; -+import * as V from "vite-plus/test"; - const runPromise = /*#__PURE__*/Effect.fnUntraced(function* (effect, _ctx) { - const exit = yield* Effect.exit(effect); - if (Exit.isFailure(exit)) { -diff --git a/dist/utils.js b/dist/utils.js -index cfb2c39847518b491ca5db87ef693947a75e5e53..c044d7a01c2dd9d86e35db3910aed384eca53a3b 100644 ---- a/dist/utils.js -+++ b/dist/utils.js -@@ -4,7 +4,7 @@ import * as Option from "effect/Option"; - import * as Predicate from "effect/Predicate"; - import * as Result from "effect/Result"; - import * as assert from "node:assert"; --import { assert as vassert } from "vitest"; -+import { assert as vassert } from "vite-plus/test"; - // ---------------------------- - // Primitives - // ---------------------------- -diff --git a/src/index.ts b/src/index.ts -index 37886fb6c37a12710f73ccee87a3ff6ca8b2c9fa..2207df940dfae2a346211d09b8d39554e0c00d34 100644 ---- a/src/index.ts -+++ b/src/index.ts -@@ -7,13 +7,13 @@ import type * as Layer from "effect/Layer" - import type * as Schema from "effect/Schema" - import type * as Scope from "effect/Scope" - import type * as FC from "effect/testing/FastCheck" --import * as V from "vitest" -+import * as V from "vite-plus/test" - import * as internal from "./internal/internal.ts" - - /** - * @since 4.0.0 - */ --export * from "vitest" -+export * from "vite-plus/test" - - /** - * @since 4.0.0 -diff --git a/src/internal/internal.ts b/src/internal/internal.ts -index 59c35ec9e65c93df8e2ba21299a5b23f2ce27772..38475742e3d39e8cb30c5ab6a1a45916882cdca4 100644 ---- a/src/internal/internal.ts -+++ b/src/internal/internal.ts -@@ -2,7 +2,7 @@ - * @since 4.0.0 - */ - --import { getCurrentSuite } from "@vitest/runner" -+import { getCurrentSuite } from "vite-plus/test/plugins/runner" - import * as Cause from "effect/Cause" - import * as Duration from "effect/Duration" - import * as Effect from "effect/Effect" -@@ -17,7 +17,7 @@ import * as Scope from "effect/Scope" - import * as fc from "effect/testing/FastCheck" - import * as TestClock from "effect/testing/TestClock" - import * as TestConsole from "effect/testing/TestConsole" --import * as V from "vitest" -+import * as V from "vite-plus/test" - import type * as Vitest from "../index.ts" - - const runPromise: ( -diff --git a/src/utils.ts b/src/utils.ts -index 09c824139056c992bf978c15dc3836b3dd2257a9..6cd39bf9c0f332ba65842e555cc1c3fe0675e923 100644 ---- a/src/utils.ts -+++ b/src/utils.ts -@@ -16,7 +16,7 @@ import * as Option from "effect/Option" - import * as Predicate from "effect/Predicate" - import * as Result from "effect/Result" - import * as assert from "node:assert" --import { assert as vassert } from "vitest" -+import { assert as vassert } from "vite-plus/test" - - // ---------------------------- - // Primitives diff --git a/patches/@effect__vitest@4.0.0-beta.103.patch b/patches/@effect__vitest@4.0.0-beta.103.patch new file mode 100644 index 0000000000000000000000000000000000000000..f3578570837af279f7e1463c39a96a5d6b83047e --- /dev/null +++ b/patches/@effect__vitest@4.0.0-beta.103.patch @@ -0,0 +1,106 @@ +diff --git a/dist/index.d.ts b/dist/index.d.ts +index a364638..4ee44c2 100644 +--- a/dist/index.d.ts ++++ b/dist/index.d.ts +@@ -7,11 +7,11 @@ import type * as Layer from "effect/Layer"; + import type * as Schema from "effect/Schema"; + import type * as Scope from "effect/Scope"; + import type * as FC from "effect/testing/FastCheck"; +-import * as V from "vitest"; ++import * as V from "vite-plus/test"; + /** + * @since 4.0.0 + */ +-export * from "vitest"; ++export * from "vite-plus/test"; + /** + * @since 4.0.0 + */ +diff --git a/dist/index.js b/dist/index.js +index a1a89bd..687df5a 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -1,9 +1,9 @@ +-import * as V from "vitest"; ++import * as V from "vite-plus/test"; + import * as internal from "./internal/internal.js"; + /** + * @since 4.0.0 + */ +-export * from "vitest"; ++export * from "vite-plus/test"; + /** + * @since 4.0.0 + */ +diff --git a/dist/internal/internal.js b/dist/internal/internal.js +index fe41479..8ae751c 100644 +--- a/dist/internal/internal.js ++++ b/dist/internal/internal.js +@@ -15,7 +15,7 @@ import * as Scope from "effect/Scope"; + import * as fc from "effect/testing/FastCheck"; + import * as TestClock from "effect/testing/TestClock"; + import * as TestConsole from "effect/testing/TestConsole"; +-import * as V from "vitest"; ++import * as V from "vite-plus/test"; + const getCurrentSuite = V.TestRunner.getCurrentSuite; + const runPromise = /*#__PURE__*/Effect.fnUntraced(function* (effect, _ctx) { + const exit = yield* Effect.exit(effect); +diff --git a/dist/utils.js b/dist/utils.js +index 4871215..2c46e2b 100644 +--- a/dist/utils.js ++++ b/dist/utils.js +@@ -4,7 +4,7 @@ import * as Option from "effect/Option"; + import * as Predicate from "effect/Predicate"; + import * as Result from "effect/Result"; + import * as assert from "node:assert"; +-import { assert as vassert } from "vitest"; ++import { assert as vassert } from "vite-plus/test"; + // ---------------------------- + // Primitives + // ---------------------------- +diff --git a/src/index.ts b/src/index.ts +index b524786..8d4025d 100644 +--- a/src/index.ts ++++ b/src/index.ts +@@ -7,13 +7,13 @@ import type * as Layer from "effect/Layer" + import type * as Schema from "effect/Schema" + import type * as Scope from "effect/Scope" + import type * as FC from "effect/testing/FastCheck" +-import * as V from "vitest" ++import * as V from "vite-plus/test" + import * as internal from "./internal/internal.ts" + + /** + * @since 4.0.0 + */ +-export * from "vitest" ++export * from "vite-plus/test" + + /** + * @since 4.0.0 +diff --git a/src/internal/internal.ts b/src/internal/internal.ts +index d4040a0..f02fc9d 100644 +--- a/src/internal/internal.ts ++++ b/src/internal/internal.ts +@@ -16,7 +16,7 @@ import * as Scope from "effect/Scope" + import * as fc from "effect/testing/FastCheck" + import * as TestClock from "effect/testing/TestClock" + import * as TestConsole from "effect/testing/TestConsole" +-import * as V from "vitest" ++import * as V from "vite-plus/test" + import type * as Vitest from "../index.ts" + + const getCurrentSuite = V.TestRunner.getCurrentSuite +diff --git a/src/utils.ts b/src/utils.ts +index 4a4612c..846bcc9 100644 +--- a/src/utils.ts ++++ b/src/utils.ts +@@ -16,7 +16,7 @@ import * as Option from "effect/Option" + import * as Predicate from "effect/Predicate" + import * as Result from "effect/Result" + import * as assert from "node:assert" +-import { assert as vassert } from "vitest" ++import { assert as vassert } from "vite-plus/test" + + // ---------------------------- + // Primitives diff --git a/patches/effect@4.0.0-beta.102.patch b/patches/effect@4.0.0-beta.102.patch deleted file mode 100644 index 39f1a843bf9e99cc7801f75d5174e73c0c7aa189..0000000000000000000000000000000000000000 --- a/patches/effect@4.0.0-beta.102.patch +++ /dev/null @@ -1,317 +0,0 @@ -diff --git a/dist/unstable/ai/McpServer.js b/dist/unstable/ai/McpServer.js -index 2830482842c07f2f0fb412076c901e52830b7e24..cd92160578fd152c6b6399ad8a328c4ddd7d300c 100644 ---- a/dist/unstable/ai/McpServer.js -+++ b/dist/unstable/ai/McpServer.js -@@ -230,6 +230,26 @@ export const run = /*#__PURE__*/Effect.fnUntraced(function* (options) { - const server = yield* McpServer; - const isHttp = Option.isSome(yield* Effect.serviceOption(HttpRouter.HttpRouter)); - const clientSessions = protocolState.clientSessions; -+ if (isHttp && options.path !== undefined) { -+ const router = yield* HttpRouter.HttpRouter; -+ yield* router.add("DELETE", options.path, Effect.gen(function* () { -+ const request = yield* HttpServerRequest.HttpServerRequest; -+ const sessionId = request.headers[MCP_SESSION_ID_HEADER]; -+ if (sessionId === undefined) { -+ return HttpServerResponse.empty({ -+ status: 400 -+ }); -+ } -+ if (!clientSessions.delete(sessionId)) { -+ return HttpServerResponse.empty({ -+ status: 404 -+ }); -+ } -+ return HttpServerResponse.empty({ -+ status: 204 -+ }); -+ })); -+ } - const handlers = yield* Layer.build(layerHandlers(options)).pipe(Effect.provideService(McpProtocolState, protocolState)); - const clients = yield* RcMap.make({ - lookup: Effect.fnUntraced(function* (clientId) { -@@ -493,7 +513,7 @@ export const layerHttp = options => { - allow: "POST" - } - }); -- const routes = Layer.mergeAll(HttpRouter.add("GET", options.path, methodNotAllowedResponse), HttpRouter.add("PUT", options.path, methodNotAllowedResponse), HttpRouter.add("PATCH", options.path, methodNotAllowedResponse), HttpRouter.add("DELETE", options.path, methodNotAllowedResponse)); -+ const routes = Layer.mergeAll(HttpRouter.add("GET", options.path, methodNotAllowedResponse), HttpRouter.add("PUT", options.path, methodNotAllowedResponse), HttpRouter.add("PATCH", options.path, methodNotAllowedResponse)); - 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/rpc/RpcClient.d.ts b/dist/unstable/rpc/RpcClient.d.ts -index a70061a638faabdd663eca25cb79585fec06e03c..15c940b61860830f11cad86b155e3b76f43d34ea 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"; - import * as Context from "../../Context.ts"; - import type * as Duration from "../../Duration.ts"; - import * as Effect from "../../Effect.ts"; -+import * as Exit from "../../Exit.ts"; - import * as Layer from "../../Layer.ts"; - import * as Queue from "../../Queue.ts"; - import * as Schedule from "../../Schedule.ts"; -@@ -261,9 +262,40 @@ export declare const layerProtocolWorker: (options: { - readonly targetUtilization?: number | undefined; - readonly timeToLive: Duration.Input; - }) => Layer.Layer; -+declare const RequestHooks_base: Context.ServiceClass Effect.Effect) | undefined; -+ readonly onRequestChunk?: ((info: { -+ readonly id: RequestId; -+ readonly tag: string; -+ readonly chunkCount: number; -+ }) => Effect.Effect) | undefined; -+ readonly onRequestExit?: ((info: { -+ readonly id: RequestId; -+ readonly tag: string; -+ readonly stream: boolean; -+ readonly exit: Exit.Exit; -+ }) => Effect.Effect) | undefined; -+ readonly onRequestInterrupt?: ((info: { -+ readonly id: RequestId; -+ readonly tag?: string | undefined; -+ }) => Effect.Effect) | undefined; -+}>; -+/** -+ * @since 4.0.0 -+ * @category RequestHooks -+ */ -+export declare class RequestHooks extends RequestHooks_base { -+} - declare const ConnectionHooks_base: Context.ServiceClass; - readonly onDisconnect: Effect.Effect; -+ readonly onPing?: Effect.Effect | undefined; -+ readonly onPong?: Effect.Effect | undefined; -+ readonly onPingTimeout?: Effect.Effect | undefined; - }>; - /** - * 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 b6ddbacbde74fb0ce98c79452b95a1c8fc0e65ed..154fe9a1ec64e5a47cd2ea89536186d6a73a74f6 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 - const services = yield* Effect.context(); - const scope = Context.get(services, Scope.Scope); - const entries = new Map(); -+ const hooks = yield* Effect.serviceOption(RequestHooks); - let isShutdown = false; - yield* Scope.addFinalizer(scope, Effect.withFiber(parent => { - isShutdown = true; -@@ -84,6 +85,11 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro - return Effect.interrupt; - } - const id = generateRequestId(); -+ const onStart = Option.isSome(hooks) && hooks.value.onRequestStart ? hooks.value.onRequestStart({ -+ id, -+ tag: rpc._tag, -+ stream: false -+ }) : Effect.void; - const send = middleware(message => options.onFromClient({ - message, - context, -@@ -101,7 +107,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro - headers: Headers.merge(parentFiber.getRef(CurrentHeaders), headers) - }); - if (discard) { -- return send; -+ return onStart.pipe(Effect.andThen(send)); - } - let fiber; - return Effect.onInterrupt(Effect.callback(resume => { -@@ -119,7 +125,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro - } - }; - entries.set(id, entry); -- fiber = send.pipe(span ? Effect.withParentSpan(span, { -+ fiber = onStart.pipe(Effect.andThen(send), span ? Effect.withParentSpan(span, { - captureStackTrace: false - }) : identity, Effect.runForkWith(parentFiber.context)); - fiber.addObserver(exit => { -@@ -128,8 +134,9 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro - } - }); - }), interruptors => { -+ const entry = entries.get(id); - entries.delete(id); -- return Effect.andThen(Fiber.interrupt(fiber), sendInterrupt(id, Array.from(interruptors), context)); -+ return Effect.andThen(Fiber.interrupt(fiber), sendInterrupt(id, Array.from(interruptors), context, entry?.rpc._tag)); - }); - }); - const onStreamRequest = Effect.fnUntraced(function* (rpc, middleware, payload, headers, streamBufferSize, context) { -@@ -141,11 +148,17 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro - }); - const fiber = Fiber.getCurrent(); - const id = generateRequestId(); -+ const onStart = Option.isSome(hooks) && hooks.value.onRequestStart ? hooks.value.onRequestStart({ -+ id, -+ tag: rpc._tag, -+ stream: true -+ }) : Effect.void; - const scope = Context.getUnsafe(fiber.context, Scope.Scope); - yield* Scope.addFinalizerExit(scope, exit => { -- if (!entries.has(id)) return Effect.void; -+ const entry = entries.get(id); -+ if (!entry) return Effect.void; - entries.delete(id); -- return sendInterrupt(id, Exit.isFailure(exit) ? Array.from(Cause.interruptors(exit.cause)) : [], context); -+ return sendInterrupt(id, Exit.isFailure(exit) ? Array.from(Cause.interruptors(exit.cause)) : [], context, entry.rpc._tag); - }); - const queue = yield* Queue.bounded(streamBufferSize); - entries.set(id, { -@@ -153,9 +166,10 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro - rpc, - queue, - scope, -- context -+ context, -+ chunkCount: 0 - }); -- yield* middleware(message => options.onFromClient({ -+ yield* onStart.pipe(Effect.andThen(middleware(message => options.onFromClient({ - message, - context, - discard: false -@@ -170,7 +184,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro - sampled: span.sampled - } : {}), - headers: Headers.merge(fiber.getRef(CurrentHeaders), headers) -- }).pipe(span ? Effect.withParentSpan(span, { -+ }))).pipe(span ? Effect.withParentSpan(span, { - captureStackTrace: false - }) : identity, Effect.catchCause(error => Queue.failCause(queue, error)), Effect.interruptible, Effect.forkIn(scope, { - startImmediately: true -@@ -200,7 +214,10 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro - }); - }; - }; -- const sendInterrupt = (requestId, interruptors, context) => Effect.callback(resume => { -+ const sendInterrupt = (requestId, interruptors, context, tag) => (Option.isSome(hooks) && hooks.value.onRequestInterrupt ? hooks.value.onRequestInterrupt({ -+ id: requestId, -+ tag -+ }) : Effect.void).pipe(Effect.andThen(Effect.callback(resume => { - const parentFiber = Fiber.getCurrent(); - const fiber = options.onFromClient({ - message: { -@@ -214,7 +231,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro - fiber.addObserver(() => { - resume(Effect.void); - }); -- }); -+ }))); - const write = message => { - switch (message._tag) { - case "Chunk": -@@ -222,7 +239,13 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro - const requestId = message.requestId; - const entry = entries.get(requestId); - if (!entry || entry._tag !== "Queue") return Effect.void; -- return Queue.offerAll(entry.queue, message.values).pipe(supportsAck ? Effect.flatMap(() => options.onFromClient({ -+ const chunkCount = entry.chunkCount += message.values.length; -+ const onChunk = Option.isSome(hooks) && hooks.value.onRequestChunk ? hooks.value.onRequestChunk({ -+ id: requestId, -+ tag: entry.rpc._tag, -+ chunkCount -+ }) : Effect.void; -+ return Queue.offerAll(entry.queue, message.values).pipe(Effect.andThen(onChunk), supportsAck ? Effect.flatMap(() => options.onFromClient({ - message: { - _tag: "Ack", - requestId: message.requestId -@@ -237,11 +260,18 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro - const entry = entries.get(requestId); - if (!entry) return Effect.void; - entries.delete(requestId); -+ const onExit = Option.isSome(hooks) && hooks.value.onRequestExit ? hooks.value.onRequestExit({ -+ id: requestId, -+ tag: entry.rpc._tag, -+ stream: entry._tag === "Queue", -+ exit: message.exit -+ }) : Effect.void; - if (entry._tag === "Effect") { -- entry.resume(message.exit); -- return Effect.void; -+ return onExit.pipe(Effect.andThen(Effect.sync(() => { -+ entry.resume(message.exit); -+ }))); - } -- return message.exit._tag === "Success" ? Queue.end(entry.queue) : Queue.failCause(entry.queue, message.exit.cause); -+ return onExit.pipe(Effect.andThen(message.exit._tag === "Success" ? Queue.end(entry.queue) : Queue.failCause(entry.queue, message.exit.cause))); - } - case "Defect": - { -@@ -590,7 +620,7 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun - const requestClientMap = new Map(); - const write = yield* socket.writer; - let parser = serialization.makeUnsafe(); -- const pinger = yield* makePinger(write(parser.encode(constPing))); -+ const pinger = yield* makePinger(write(parser.encode(constPing)), Option.isSome(hooks) ? hooks.value : undefined); - let currentError; - const onOpen = Effect.suspend(() => { - currentError = undefined; -@@ -610,8 +640,7 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun - body: () => { - const response = responses[i++]; - if (response._tag === "Pong") { -- pinger.onPong(); -- return Effect.void; -+ return pinger.onPong; - } - if ("requestId" in response) { - const clientId = requestClientMap.get(response.requestId); -@@ -639,12 +668,12 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun - } - }, { - onOpen -- }).pipe(Effect.raceFirst(Effect.flatMap(pinger.timeout, () => Effect.fail(new Socket.SocketError({ -+ }).pipe(Effect.raceFirst(Effect.flatMap(pinger.timeout, () => (Option.isSome(hooks) && hooks.value.onPingTimeout ? hooks.value.onPingTimeout : Effect.void).pipe(Effect.andThen(Effect.fail(new Socket.SocketError({ - reason: new Socket.SocketOpenError({ - kind: "Timeout", - cause: new Error("ping timeout") - }) -- }))))); -+ }))))))); - }).pipe(Effect.flatMap(() => Effect.fail(new Socket.SocketError({ - reason: new Socket.SocketCloseError({ - code: 1000 -@@ -686,20 +715,20 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun - }; - })); - const defaultRetryPolicy = /*#__PURE__*/Schedule.min([/*#__PURE__*/Schedule.exponential(500, 1.5), /*#__PURE__*/Schedule.spaced(5000)]); --const makePinger = /*#__PURE__*/Effect.fnUntraced(function* (writePing) { -+const makePinger = /*#__PURE__*/Effect.fnUntraced(function* (writePing, hooks) { - let recievedPong = true; - const latch = Latch.makeUnsafe(); - const reset = () => { - recievedPong = true; - latch.closeUnsafe(); - }; -- const onPong = () => { -+ const onPong = Effect.sync(() => { - recievedPong = true; -- }; -+ }).pipe(Effect.andThen(hooks?.onPong ?? Effect.void)); - yield* Effect.suspend(() => { - if (!recievedPong) return latch.open; - recievedPong = false; -- return writePing; -+ return (hooks?.onPing ?? Effect.void).pipe(Effect.andThen(writePing)); - }).pipe(Effect.delay("5 seconds"), Effect.ignore, Effect.forever, Effect.interruptible, Effect.forkScoped); - return { - timeout: latch.await, -@@ -842,6 +871,11 @@ export const makeProtocolWorker = options => Protocol.make(Effect.fnUntraced(fun - * @since 4.0.0 - */ - export const layerProtocolWorker = /*#__PURE__*/flow(makeProtocolWorker, /*#__PURE__*/Layer.effect(Protocol)); -+/** -+ * @since 4.0.0 -+ * @category RequestHooks -+ */ -+export class RequestHooks extends /*#__PURE__*/Context.Service()("effect/rpc/RpcClient/RequestHooks") {} - /** - * Represents optional client protocol hooks that run when a transport connects - * and disconnects. diff --git a/patches/effect@4.0.0-beta.103.patch b/patches/effect@4.0.0-beta.103.patch new file mode 100644 index 0000000000000000000000000000000000000000..561db6f526302827acb1ccc3a32e62b183b4174a --- /dev/null +++ b/patches/effect@4.0.0-beta.103.patch @@ -0,0 +1,317 @@ +diff --git a/dist/unstable/ai/McpServer.js b/dist/unstable/ai/McpServer.js +index 755e41c..dc431aa 100644 +--- a/dist/unstable/ai/McpServer.js ++++ b/dist/unstable/ai/McpServer.js +@@ -262,6 +262,26 @@ const runWithProtocolState = /*#__PURE__*/Effect.fnUntraced(function* (options, + const server = yield* McpServer; + const isHttp = Option.isSome(yield* Effect.serviceOption(HttpRouter.HttpRouter)); + const sessions = protocolState.sessions; ++ if (isHttp && options.path !== undefined) { ++ const router = yield* HttpRouter.HttpRouter; ++ yield* router.add("DELETE", options.path, Effect.gen(function* () { ++ const request = yield* HttpServerRequest.HttpServerRequest; ++ const sessionId = request.headers[MCP_SESSION_ID_HEADER]; ++ if (sessionId === undefined) { ++ return HttpServerResponse.empty({ ++ status: 400 ++ }); ++ } ++ if (!sessions.bySessionId.delete(sessionId)) { ++ return HttpServerResponse.empty({ ++ status: 404 ++ }); ++ } ++ return HttpServerResponse.empty({ ++ status: 204 ++ }); ++ })); ++ } + const clientProtocols = new Map(); + const cancelledRequests = new Map(); + const handlers = yield* Layer.build(layerHandlers(options, { +@@ -719,7 +739,7 @@ export const layerHttp = options => { + const methodNotAllowed = request => Effect.succeed(request.headers.origin !== undefined && !options.allowedOrigins?.includes(request.headers.origin) ? HttpServerResponse.empty({ + status: 403 + }) : methodNotAllowedResponse); +- const routes = Layer.mergeAll(HttpRouter.add("GET", options.path, methodNotAllowed), HttpRouter.add("PUT", options.path, methodNotAllowed), HttpRouter.add("PATCH", options.path, methodNotAllowed), HttpRouter.add("DELETE", options.path, methodNotAllowed), HttpRouter.add("OPTIONS", options.path, methodNotAllowed)); ++ const routes = Layer.mergeAll(HttpRouter.add("GET", options.path, methodNotAllowed), HttpRouter.add("PUT", options.path, methodNotAllowed), HttpRouter.add("PATCH", options.path, methodNotAllowed), HttpRouter.add("OPTIONS", options.path, methodNotAllowed)); + 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/rpc/RpcClient.d.ts b/dist/unstable/rpc/RpcClient.d.ts +index aba2779..581d267 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"; + import * as Context from "../../Context.ts"; + import type * as Duration from "../../Duration.ts"; + import * as Effect from "../../Effect.ts"; ++import * as Exit from "../../Exit.ts"; + import * as Layer from "../../Layer.ts"; + import * as Queue from "../../Queue.ts"; + import * as Schedule from "../../Schedule.ts"; +@@ -261,9 +262,40 @@ export declare const layerProtocolWorker: (options: { + readonly targetUtilization?: number | undefined; + readonly timeToLive: Duration.Input; + }) => Layer.Layer; ++declare const RequestHooks_base: Context.ServiceClass Effect.Effect) | undefined; ++ readonly onRequestChunk?: ((info: { ++ readonly id: RequestId; ++ readonly tag: string; ++ readonly chunkCount: number; ++ }) => Effect.Effect) | undefined; ++ readonly onRequestExit?: ((info: { ++ readonly id: RequestId; ++ readonly tag: string; ++ readonly stream: boolean; ++ readonly exit: Exit.Exit; ++ }) => Effect.Effect) | undefined; ++ readonly onRequestInterrupt?: ((info: { ++ readonly id: RequestId; ++ readonly tag?: string | undefined; ++ }) => Effect.Effect) | undefined; ++}>; ++/** ++ * @since 4.0.0 ++ * @category RequestHooks ++ */ ++export declare class RequestHooks extends RequestHooks_base { ++} + declare const ConnectionHooks_base: Context.ServiceClass; + readonly onDisconnect: Effect.Effect; ++ readonly onPing?: Effect.Effect | undefined; ++ readonly onPong?: Effect.Effect | undefined; ++ readonly onPingTimeout?: Effect.Effect | undefined; + }>; + /** + * 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 +--- a/dist/unstable/rpc/RpcClient.js ++++ b/dist/unstable/rpc/RpcClient.js +@@ -47,6 +47,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro + const services = yield* Effect.context(); + const scope = Context.get(services, Scope.Scope); + const entries = new Map(); ++ const hooks = yield* Effect.serviceOption(RequestHooks); + let isShutdown = false; + yield* Scope.addFinalizer(scope, Effect.withFiber(parent => { + isShutdown = true; +@@ -84,6 +85,11 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro + return Effect.interrupt; + } + const id = generateRequestId(); ++ const onStart = Option.isSome(hooks) && hooks.value.onRequestStart ? hooks.value.onRequestStart({ ++ id, ++ tag: rpc._tag, ++ stream: false ++ }) : Effect.void; + const send = middleware(message => options.onFromClient({ + message, + context, +@@ -101,7 +107,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro + headers: Headers.merge(parentFiber.getRef(CurrentHeaders), headers) + }); + if (discard) { +- return send; ++ return onStart.pipe(Effect.andThen(send)); + } + let fiber; + return Effect.onInterrupt(Effect.callback(resume => { +@@ -119,7 +125,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro + } + }; + entries.set(id, entry); +- fiber = send.pipe(span ? Effect.withParentSpan(span, { ++ fiber = onStart.pipe(Effect.andThen(send), span ? Effect.withParentSpan(span, { + captureStackTrace: false + }) : identity, Effect.runForkWith(parentFiber.context)); + fiber.addObserver(exit => { +@@ -128,8 +134,9 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro + } + }); + }), interruptors => { ++ const entry = entries.get(id); + entries.delete(id); +- return Effect.andThen(Fiber.interrupt(fiber), sendInterrupt(id, Array.from(interruptors), context)); ++ return Effect.andThen(Fiber.interrupt(fiber), sendInterrupt(id, Array.from(interruptors), context, entry?.rpc._tag)); + }); + }); + const onStreamRequest = Effect.fnUntraced(function* (rpc, middleware, payload, headers, streamBufferSize, context) { +@@ -141,11 +148,17 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro + }); + const fiber = Fiber.getCurrent(); + const id = generateRequestId(); ++ const onStart = Option.isSome(hooks) && hooks.value.onRequestStart ? hooks.value.onRequestStart({ ++ id, ++ tag: rpc._tag, ++ stream: true ++ }) : Effect.void; + const scope = Context.getUnsafe(fiber.context, Scope.Scope); + yield* Scope.addFinalizerExit(scope, exit => { +- if (!entries.has(id)) return Effect.void; ++ const entry = entries.get(id); ++ if (!entry) return Effect.void; + entries.delete(id); +- return sendInterrupt(id, Exit.isFailure(exit) ? Array.from(Cause.interruptors(exit.cause)) : [], context); ++ return sendInterrupt(id, Exit.isFailure(exit) ? Array.from(Cause.interruptors(exit.cause)) : [], context, entry.rpc._tag); + }); + const queue = yield* Queue.bounded(streamBufferSize); + entries.set(id, { +@@ -153,9 +166,10 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro + rpc, + queue, + scope, +- context ++ context, ++ chunkCount: 0 + }); +- yield* middleware(message => options.onFromClient({ ++ yield* onStart.pipe(Effect.andThen(middleware(message => options.onFromClient({ + message, + context, + discard: false +@@ -170,7 +184,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro + sampled: span.sampled + } : {}), + headers: Headers.merge(fiber.getRef(CurrentHeaders), headers) +- }).pipe(span ? Effect.withParentSpan(span, { ++ }))).pipe(span ? Effect.withParentSpan(span, { + captureStackTrace: false + }) : identity, Effect.catchCause(error => Queue.failCause(queue, error)), Effect.interruptible, Effect.forkIn(scope, { + startImmediately: true +@@ -200,7 +214,10 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro + }); + }; + }; +- const sendInterrupt = (requestId, interruptors, context) => Effect.callback(resume => { ++ const sendInterrupt = (requestId, interruptors, context, tag) => (Option.isSome(hooks) && hooks.value.onRequestInterrupt ? hooks.value.onRequestInterrupt({ ++ id: requestId, ++ tag ++ }) : Effect.void).pipe(Effect.andThen(Effect.callback(resume => { + const parentFiber = Fiber.getCurrent(); + const fiber = options.onFromClient({ + message: { +@@ -214,7 +231,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro + fiber.addObserver(() => { + resume(Effect.void); + }); +- }); ++ }))); + const write = message => { + switch (message._tag) { + case "Chunk": +@@ -222,7 +239,13 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro + const requestId = message.requestId; + const entry = entries.get(requestId); + if (!entry || entry._tag !== "Queue") return Effect.void; +- return Queue.offerAll(entry.queue, message.values).pipe(supportsAck ? Effect.flatMap(() => options.onFromClient({ ++ const chunkCount = entry.chunkCount += message.values.length; ++ const onChunk = Option.isSome(hooks) && hooks.value.onRequestChunk ? hooks.value.onRequestChunk({ ++ id: requestId, ++ tag: entry.rpc._tag, ++ chunkCount ++ }) : Effect.void; ++ return Queue.offerAll(entry.queue, message.values).pipe(Effect.andThen(onChunk), supportsAck ? Effect.flatMap(() => options.onFromClient({ + message: { + _tag: "Ack", + requestId: message.requestId +@@ -237,11 +260,18 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro + const entry = entries.get(requestId); + if (!entry) return Effect.void; + entries.delete(requestId); ++ const onExit = Option.isSome(hooks) && hooks.value.onRequestExit ? hooks.value.onRequestExit({ ++ id: requestId, ++ tag: entry.rpc._tag, ++ stream: entry._tag === "Queue", ++ exit: message.exit ++ }) : Effect.void; + if (entry._tag === "Effect") { +- entry.resume(message.exit); +- return Effect.void; ++ return onExit.pipe(Effect.andThen(Effect.sync(() => { ++ entry.resume(message.exit); ++ }))); + } +- return message.exit._tag === "Success" ? Queue.end(entry.queue) : Queue.failCause(entry.queue, message.exit.cause); ++ return onExit.pipe(Effect.andThen(message.exit._tag === "Success" ? Queue.end(entry.queue) : Queue.failCause(entry.queue, message.exit.cause))); + } + case "Defect": + { +@@ -590,7 +620,7 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun + const requestClientMap = new Map(); + const write = yield* socket.writer; + let parser = serialization.makeUnsafe(); +- const pinger = yield* makePinger(write(parser.encode(constPing))); ++ const pinger = yield* makePinger(write(parser.encode(constPing)), Option.isSome(hooks) ? hooks.value : undefined); + let currentError; + const onOpen = Effect.suspend(() => { + currentError = undefined; +@@ -610,8 +640,7 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun + body: () => { + const response = responses[i++]; + if (response._tag === "Pong") { +- pinger.onPong(); +- return Effect.void; ++ return pinger.onPong; + } + if (Object.hasOwn(response, "requestId")) { + const requestId = response.requestId; +@@ -640,12 +669,12 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun + } + }, { + onOpen +- }).pipe(Effect.raceFirst(Effect.flatMap(pinger.timeout, () => Effect.fail(new Socket.SocketError({ ++ }).pipe(Effect.raceFirst(Effect.flatMap(pinger.timeout, () => (Option.isSome(hooks) && hooks.value.onPingTimeout ? hooks.value.onPingTimeout : Effect.void).pipe(Effect.andThen(Effect.fail(new Socket.SocketError({ + reason: new Socket.SocketOpenError({ + kind: "Timeout", + cause: new Error("ping timeout") + }) +- }))))); ++ }))))))); + }).pipe(Effect.flatMap(() => Effect.fail(new Socket.SocketError({ + reason: new Socket.SocketCloseError({ + code: 1000 +@@ -687,20 +716,20 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun + }; + })); + const defaultRetryPolicy = /*#__PURE__*/Schedule.min([/*#__PURE__*/Schedule.exponential(500, 1.5), /*#__PURE__*/Schedule.spaced(5000)]); +-const makePinger = /*#__PURE__*/Effect.fnUntraced(function* (writePing) { ++const makePinger = /*#__PURE__*/Effect.fnUntraced(function* (writePing, hooks) { + let recievedPong = true; + const latch = Latch.makeUnsafe(); + const reset = () => { + recievedPong = true; + latch.closeUnsafe(); + }; +- const onPong = () => { ++ const onPong = Effect.sync(() => { + recievedPong = true; +- }; ++ }).pipe(Effect.andThen(hooks?.onPong ?? Effect.void)); + yield* Effect.suspend(() => { + if (!recievedPong) return latch.open; + recievedPong = false; +- return writePing; ++ return (hooks?.onPing ?? Effect.void).pipe(Effect.andThen(writePing)); + }).pipe(Effect.delay("5 seconds"), Effect.ignore, Effect.forever, Effect.interruptible, Effect.forkScoped); + return { + timeout: latch.await, +@@ -843,6 +872,11 @@ export const makeProtocolWorker = options => Protocol.make(Effect.fnUntraced(fun + * @since 4.0.0 + */ + export const layerProtocolWorker = /*#__PURE__*/flow(makeProtocolWorker, /*#__PURE__*/Layer.effect(Protocol)); ++/** ++ * @since 4.0.0 ++ * @category RequestHooks ++ */ ++export class RequestHooks extends /*#__PURE__*/Context.Service()("effect/rpc/RpcClient/RequestHooks") {} + /** + * Represents optional client protocol hooks that run when a transport connects + * and disconnects. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 85afdd75d7a697cb6f98ba46d2e72538f9408ee3..4eee1f6e1a56de43e56daf77a7e09284d8125701 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,8 +7,8 @@ settings: catalogs: default: '@effect/openapi-generator': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102 + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103 '@effect/tsgo': specifier: 0.13.2 version: 0.13.2 @@ -48,18 +48,18 @@ overrides: '@clerk/expo': 4.1.2 '@clerk/react': 6.12.9 '@clerk/shared': 4.25.9 - '@effect/atom-react': 4.0.0-beta.102 - '@effect/platform-bun': 4.0.0-beta.102 - '@effect/platform-node': 4.0.0-beta.102 - '@effect/platform-node-shared': 4.0.0-beta.102 - '@effect/sql-pg': 4.0.0-beta.102 - '@effect/sql-sqlite-bun': 4.0.0-beta.102 - '@effect/vitest': 4.0.0-beta.102 + '@effect/atom-react': 4.0.0-beta.103 + '@effect/platform-bun': 4.0.0-beta.103 + '@effect/platform-node': 4.0.0-beta.103 + '@effect/platform-node-shared': 4.0.0-beta.103 + '@effect/sql-pg': 4.0.0-beta.103 + '@effect/sql-sqlite-bun': 4.0.0-beta.103 + '@effect/vitest': 4.0.0-beta.103 '@effect/vitest>vitest': '-' '@expo/metro-config': 56.0.14 '@pierre/diffs>@shikijs/transformers': ^4.2.0 '@types/node': 24.12.4 - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 expo-modules-jsi: 56.0.10 expo-sharing>@expo/config-plugins: 56.0.9 expo-sharing>@expo/config-types: 56.0.6 @@ -69,16 +69,14 @@ overrides: packageExtensionsChecksum: sha256-CUzzeefpj3gNFrCKNBhV9FOaniNbrLdKyIhWQyXuaiE= patchedDependencies: - '@effect/platform-bun@4.0.0-beta.102': 9f7cfa69ef19b624ac7704fe505a6775dc272d734208883f3decc7e5201a3d23 - '@effect/platform-node@4.0.0-beta.102': cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0 - '@effect/vitest@4.0.0-beta.102': a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425 + '@effect/vitest@4.0.0-beta.103': a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b '@expo/metro-config@56.0.14': 8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46 '@ff-labs/fff-node@0.9.4': 2b16019ce7ab61aec6478dd02f79ef468cc1d5c51e9d00764f7d2ab8167210c8 '@legendapp/list@3.3.3': d162d67b73933ab077d00627cdf52b18ea88b28c4fae4e8340a854df25026f09 '@pierre/diffs@1.3.0-beta.10': 7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa '@react-native-menu/menu@2.0.0': 5ea3ae4bf1d9baf5443b65c269bb09621c27a68d556f713778f37b1e8d46aaae '@react-navigation/native-stack@7.17.6': c7fc101b78d434904425e5a24c22fb0042298dec6f807250486e784f3c717273 - effect@4.0.0-beta.102: 71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488 + effect@4.0.0-beta.103: a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9 expo-modules-jsi@56.0.10: 9170f8074ae4e35a0a086e756c8f815794fd3abe51eac67ca3ba02804225ec1f react-native-gesture-handler@2.31.2: 808eb26f9e57cf4945efd3985af4d9c764da6f91f4c9764433cc868602bbf4d3 react-native-keyboard-controller@1.21.13: 20be72c84d74253acdcfefbc6defe36dc396944f1a44cab2bdd0e3cd572ae008 @@ -117,8 +115,8 @@ importers: specifier: 0.0.3 version: 0.0.3 '@effect/platform-node': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@t3tools/client-runtime': specifier: workspace:* version: link:../../packages/client-runtime @@ -135,8 +133,8 @@ importers: specifier: workspace:* version: link:../../packages/tailscale effect: - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) electron: specifier: 41.5.0 version: 41.5.0 @@ -154,8 +152,8 @@ importers: version: 0.1.44(react@19.2.6) devDependencies: '@effect/vitest': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -200,8 +198,8 @@ importers: specifier: 4.1.2 version: 4.1.2(expo-auth-session@56.0.14(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.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.3)(utf-8-validate@6.0.6))(react@19.2.3))(expo-constants@56.0.18)(expo-crypto@56.0.4(expo@56.0.12))(expo-secure-store@56.0.4(expo@56.0.12))(expo-web-browser@56.0.5(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.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.3)(utf-8-validate@6.0.6)))(expo@56.0.12)(react-dom@19.2.3(react@19.2.3))(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.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.3)(utf-8-validate@6.0.6))(react@19.2.3)(typescript@6.0.3) '@effect/atom-react': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(react@19.2.3)(scheduler@0.27.0) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(react@19.2.3)(scheduler@0.27.0) '@expo-google-fonts/dm-sans': specifier: ^0.4.2 version: 0.4.2 @@ -275,8 +273,8 @@ importers: specifier: 8.0.3 version: 8.0.3 effect: - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) expo: specifier: ~56.0.12 version: 56.0.12(8895228379997a2a064f9644cda56ed0) @@ -423,8 +421,8 @@ importers: version: 1.7.0(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.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.3)(utf-8-validate@6.0.6))(react@19.2.3)(tailwindcss@4.3.0) devDependencies: '@effect/vitest': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@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) @@ -447,17 +445,17 @@ importers: specifier: ^0.3.170 version: 0.3.170(@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.102 - version: 4.0.0-beta.102(patch_hash=9f7cfa69ef19b624ac7704fe505a6775dc272d734208883f3decc7e5201a3d23)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(utf-8-validate@6.0.6) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(utf-8-validate@6.0.6) '@effect/platform-node': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@effect/platform-node-shared': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(utf-8-validate@6.0.6) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(utf-8-validate@6.0.6) '@effect/sql-sqlite-bun': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@ff-labs/fff-node': specifier: 0.9.4 version: 0.9.4(patch_hash=2b16019ce7ab61aec6478dd02f79ef468cc1d5c51e9d00764f7d2ab8167210c8) @@ -468,8 +466,8 @@ importers: specifier: 'catalog:' version: 1.3.0-beta.10(patch_hash=7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa)(@shikijs/themes@4.3.0)(react-dom@19.2.6(react@19.2.6))(react@19.2.6) effect: - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) node-pty: specifier: ^1.1.0 version: 1.1.0 @@ -478,8 +476,8 @@ importers: version: 2.9.0 devDependencies: '@effect/vitest': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@t3tools/contracts': specifier: workspace:* version: link:../../packages/contracts @@ -532,8 +530,8 @@ importers: specifier: ^3.2.2 version: 3.2.2(react@19.2.6) '@effect/atom-react': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(react@19.2.6)(scheduler@0.27.0) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(react@19.2.6)(scheduler@0.27.0) '@fontsource-variable/dm-sans': specifier: ^5.2.8 version: 5.2.8 @@ -574,8 +572,8 @@ importers: specifier: ^0.7.1 version: 0.7.1 effect: - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) jose: specifier: 'catalog:' version: 6.2.2 @@ -614,11 +612,11 @@ importers: version: 5.0.14(@types/react@19.2.16)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6)) devDependencies: '@effect/platform-node': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@effect/vitest': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@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.2.2(@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) @@ -665,8 +663,8 @@ importers: specifier: 3.14.0 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.102 - version: 4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@noble/curves': specifier: 'catalog:' version: 1.9.1 @@ -684,23 +682,23 @@ importers: version: link:../../packages/shared alchemy: specifier: 2.0.0-beta.65 - version: 2.0.0-beta.65(249551d75ad3792c0b22cd2754b25266) + version: 2.0.0-beta.65(a455401069e1fee89f31a277c51247f6) 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.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)))(@effect/sql-pg@4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)))(@effect/sql-sqlite-bun@4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)))(@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.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(expo-sqlite@56.0.5(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)))(@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)))(@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)))(@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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(expo-sqlite@56.0.5(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.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.102 - version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) devDependencies: '@cloudflare/workers-types': specifier: ^4.20260601.1 version: 4.20260604.1 '@effect/platform-node': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@effect/vitest': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -717,18 +715,18 @@ importers: oxlint-plugin-t3code: dependencies: '@effect/platform-node': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(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.102 - version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) devDependencies: '@effect/vitest': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) vite-plus: specifier: 'catalog:' version: 0.2.2(@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) @@ -742,12 +740,12 @@ importers: specifier: workspace:* version: link:../shared effect: - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) devDependencies: '@effect/vitest': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) vite-plus: specifier: 'catalog:' version: 0.2.2(@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) @@ -755,12 +753,12 @@ importers: packages/contracts: dependencies: effect: - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) devDependencies: '@effect/vitest': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) vite-plus: specifier: 'catalog:' version: 0.2.2(@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) @@ -768,18 +766,18 @@ importers: packages/effect-acp: dependencies: effect: - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) devDependencies: '@effect/openapi-generator': specifier: 'catalog:' - version: 4.0.0-beta.102(@effect/platform-node@4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + 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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@effect/platform-node': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@effect/vitest': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -790,18 +788,18 @@ importers: packages/effect-codex-app-server: dependencies: effect: - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) devDependencies: '@effect/openapi-generator': specifier: 'catalog:' - version: 4.0.0-beta.102(@effect/platform-node@4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + 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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@effect/platform-node': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@effect/vitest': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -821,8 +819,8 @@ importers: specifier: workspace:* version: link:../contracts effect: - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) jose: specifier: 'catalog:' version: 6.2.2 @@ -831,11 +829,11 @@ importers: version: 2.9.0 devDependencies: '@effect/platform-node': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@effect/vitest': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -852,15 +850,15 @@ importers: specifier: workspace:* version: link:../shared effect: - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) devDependencies: '@effect/platform-node': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@effect/vitest': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -871,18 +869,18 @@ importers: packages/tailscale: dependencies: '@effect/platform-node': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@t3tools/shared': specifier: workspace:* version: link:../shared effect: - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) devDependencies: '@effect/vitest': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@types/node': specifier: 24.12.4 version: 24.12.4 @@ -893,8 +891,8 @@ importers: scripts: dependencies: '@effect/platform-node': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6) '@t3tools/contracts': specifier: workspace:* version: link:../packages/contracts @@ -905,8 +903,8 @@ importers: specifier: workspace:* version: link:../packages/tailscale effect: - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) pngjs: specifier: 7.0.0 version: 7.0.0 @@ -915,8 +913,8 @@ importers: version: 2.9.0 devDependencies: '@effect/vitest': - specifier: 4.0.0-beta.102 - version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + specifier: 4.0.0-beta.103 + version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@types/pngjs': specifier: 6.0.5 version: 6.0.5 @@ -1844,12 +1842,12 @@ packages: '@distilled.cloud/aws@0.30.2': resolution: {integrity: sha512-Uw2yZf7PJ2ienrKG49HN1ajnke65mTtHBUrSb/3ykeZ/8cLaSgwVhPscHxSzGByY0TEtYcYKNNmfUVISgGQl9g==} peerDependencies: - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 '@distilled.cloud/axiom@0.30.2': resolution: {integrity: sha512-6g7tN/fKdMjnZYswlvwmLPeCqa2/jTsuOG7cSyUldhd6akxwWlMYqqDxwiOjgJfBZIOmcqSs5XVwiGMonZQTBw==} peerDependencies: - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 '@distilled.cloud/cloudflare-rolldown-plugin@0.13.10': resolution: {integrity: sha512-UO9wjepZWYupWMf/KYKY7LUueHNawdp0qBGc9z3XYxjodrQaMwFQWtIGG1yWOHjTWl1BUx86A69hyB8kHYRAeA==} @@ -1866,9 +1864,9 @@ packages: resolution: {integrity: sha512-0mtI2rmxKiRcuZVXsQZfPnHWstUTCyPlg4q6EbxdImfiB4CCL2F56orGl9UhuBy+BPgO37wDgMe2GIpAHIUNWA==} peerDependencies: '@distilled.cloud/cloudflare': ^0.29.0 - '@effect/platform-bun': 4.0.0-beta.102 - '@effect/platform-node': 4.0.0-beta.102 - effect: 4.0.0-beta.102 + '@effect/platform-bun': 4.0.0-beta.103 + '@effect/platform-node': 4.0.0-beta.103 + effect: 4.0.0-beta.103 peerDependenciesMeta: '@effect/platform-bun': optional: true @@ -1880,9 +1878,9 @@ packages: peerDependencies: '@distilled.cloud/cloudflare': ^0.29.0 '@distilled.cloud/cloudflare-runtime': 0.13.10 - '@effect/platform-bun': 4.0.0-beta.102 - '@effect/platform-node': 4.0.0-beta.102 - effect: 4.0.0-beta.102 + '@effect/platform-bun': 4.0.0-beta.103 + '@effect/platform-node': 4.0.0-beta.103 + effect: 4.0.0-beta.103 vite: ^7.0.0 || ^8.0.0 peerDependenciesMeta: '@effect/platform-bun': @@ -1893,22 +1891,22 @@ packages: '@distilled.cloud/cloudflare@0.30.2': resolution: {integrity: sha512-bY0WAXL7Xw1mbo9twdXcaSCKL1rMi1o4aDzVwhnHASxe416oWvDARUo2/DPhQqN48r3q9BY2AyRAxRf65X6z0g==} peerDependencies: - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 '@distilled.cloud/core@0.30.2': resolution: {integrity: sha512-7wurt9mk2Z3h0zJ00FAXD9ApSLoiBdjArctc9k706JPwzo6uhSJNkTwVMFdYM6V3m5186cY5C8ukzstrCRkJSw==} peerDependencies: - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 '@distilled.cloud/neon@0.30.2': resolution: {integrity: sha512-mFNmN4sUGIa7WukCSmU1KQSDZKmByjGY5Neh05IiM4b38UaJ80zYws0ZKLVsM3NNpypwnwcibYv3RwXxfG4f/Q==} peerDependencies: - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 '@distilled.cloud/planetscale@0.30.2': resolution: {integrity: sha512-Ph4lY6Ds8xC0l8ZDaEsX4E5oPCHqnDHb3RYKbOPeO8fjaXdZHWxn24gxCWpzSU+fVnkmdKy9ntflqxK2l+12rQ==} peerDependencies: - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 '@dnd-kit/accessibility@3.1.1': resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} @@ -1941,52 +1939,52 @@ packages: '@drizzle-team/brocli@0.12.0': resolution: {integrity: sha512-mlUE+rZ8CatQekLhnaiN91Iemdd+e2gFKooGlnRB3oPTL3VghLfX24dx7HrzMNeC1JrIB/0kpsfyty3f5HNfxQ==} - '@effect/atom-react@4.0.0-beta.102': - resolution: {integrity: sha512-6SX11h7OFwje4YhxYUml9qGjBU8hvnEMrLWe3TKI3lEH/W6tkU/BzajC263eXkxM68h+BJNzE81Ipi5DTfEgug==} + '@effect/atom-react@4.0.0-beta.103': + resolution: {integrity: sha512-1HJ+Cyq4ssLnH2UZ8OVnhtMGAySabtzZo7imKC+vEfxOW3lvJYpGZeicxQX5Ii/7AdvlR+19p/6K2a5IPKYAow==} peerDependencies: - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 react: ^19.2.4 scheduler: '*' - '@effect/openapi-generator@4.0.0-beta.102': - resolution: {integrity: sha512-LeUj+Z1J58+Xj1WtyhF/cpFIcTOEAHvcQe++Sh6b/o4tZPaC2UDb0144bOFjTNPgOBKcNb6FvVQXwPGV2wv3ZQ==} + '@effect/openapi-generator@4.0.0-beta.103': + resolution: {integrity: sha512-wWp3n0w9g7edprSue5xLB68Lu3PNdeW1n8girDmV2RKdmVKgrvY0+iIyzYqEMhVGOxc7P0g/ZtMWzaAnJAxbBA==} hasBin: true peerDependencies: - '@effect/platform-node': 4.0.0-beta.102 - effect: 4.0.0-beta.102 + '@effect/platform-node': 4.0.0-beta.103 + effect: 4.0.0-beta.103 - '@effect/platform-bun@4.0.0-beta.102': - resolution: {integrity: sha512-hTIb0jjTfXhNgnDq2OX5wrigc0OSvTT0VWWb1PLpMM395RJPu8rCIbTlGhy0NS7kZOd8FfgNi9e0sDhgyu+5Ag==} + '@effect/platform-bun@4.0.0-beta.103': + resolution: {integrity: sha512-/ay1/lhE9FUKEiDRQs56463eJ9u9ivtUtOCi2eeqI8Aooau7PupKNtV5zKjoRBCLInZMAX7JezT46NW5AdACBQ==} peerDependencies: - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 - '@effect/platform-node-shared@4.0.0-beta.102': - resolution: {integrity: sha512-gVd793I72MrkX4dXo7eYtRKfNj0RW4eMRfVEKEJI16h2+mBDCzQ+gqMrog2hSTHQnaIbvbYShNQ4TVGuRCYZeQ==} + '@effect/platform-node-shared@4.0.0-beta.103': + resolution: {integrity: sha512-0aCZMBid5ifqmY55TkfCDLaGTIM8qu3bNFUW7qL9vh/7jFOkaIAMX2MA8muG4deqW17XWxawddWu4v0fK+UW3g==} engines: {node: '>=18.0.0'} peerDependencies: - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 - '@effect/platform-node@4.0.0-beta.102': - resolution: {integrity: sha512-wYVAU9jAePT+gouMr/EVz1CaW6yDLjPAgXYeEFLz7wugT5iZhFRag6mqajV/wwN3bzWP2fzZHokLuPmqD/rqeA==} + '@effect/platform-node@4.0.0-beta.103': + resolution: {integrity: sha512-VD8fbpendwFokMwzC7/MxazjhEVDihPC5NZtomYEyZwGaA1LXMvwP1y8pfXwfshUkG56TN4EMQqzu72c0B9FhA==} engines: {node: '>=18.0.0'} peerDependencies: - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 ioredis: ^5.7.0 '@effect/sql-d1@4.0.0-beta.101': resolution: {integrity: sha512-4M/2lm7y1M1Fg1fCc31BTtU3p8lK0jHUlPGqIiJ97pOSXZJrlv21087VVLbJ/1i4svuSUshnShDsce9ZwZKsOQ==} peerDependencies: - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 - '@effect/sql-pg@4.0.0-beta.102': - resolution: {integrity: sha512-02a+fNfECWCZIZcgHl7OLQN2jZj42gq90EdwdnvR3KA6GLGypY02swABS4zFtaW9H80rTa0ukqVnTdcO/DT5GQ==} + '@effect/sql-pg@4.0.0-beta.103': + resolution: {integrity: sha512-jzlTFtFaaoOmT87rQMKUBhkFeIQQwDKtlB+MOYn1jIPssLvXZVnMqo9GahCjsNcXVlB6QGBkUgD1HCA6+tJvBw==} peerDependencies: - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 - '@effect/sql-sqlite-bun@4.0.0-beta.102': - resolution: {integrity: sha512-pBO6FBJ+a21j2qHmzJDK1DeJsxm7HpUQBgucw6prHQXLMUBkhOsfZofhw1FKEdGRDEhO0sGTjffa2KP7iOuDIg==} + '@effect/sql-sqlite-bun@4.0.0-beta.103': + resolution: {integrity: sha512-u10I6SEWgUc1sKrlT0luxOBNzlUXunzxCChrD75pK5khIN1baKlPn2DD3f7bkh20NxwSzOfxF3hWsrO4VktvNg==} peerDependencies: - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 '@effect/tsgo-darwin-arm64@0.13.2': resolution: {integrity: sha512-AlYlxU2sD3urNCmNCQWtatPJS/+m2r3CvgZdDTs9KEz2YcyQc2GV1g2RWFkoMwmgzYBx69DBLu1oscqJO2qAog==} @@ -2027,10 +2025,10 @@ packages: resolution: {integrity: sha512-zPQMHBdCN1k7Jbxjxq0HVAbzsZd+LAoRPzBEZ3F4y/uxNK0K/XGvFXUUw/CUAsD6rhUtC2VahZY1tp0owb5lgg==} hasBin: true - '@effect/vitest@4.0.0-beta.102': - resolution: {integrity: sha512-4dipFAYG6imOzrY3zy3BgzCJkbb9xESyzUef0WSx8bsK0/SpITqbJpdwKeOyDWLZ+rimjua8IbTFMAde865pIQ==} + '@effect/vitest@4.0.0-beta.103': + resolution: {integrity: sha512-Kz3gemVuJNAZ3e4V6A7BwAP87x2Av8LyHOlCjy9jbZzlncwJXO7Olk1Sje3hdKaet3wEl51A/0/89xJ2IYSgNg==} peerDependencies: - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 '@egjs/hammerjs@2.0.17': resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==} @@ -5295,12 +5293,12 @@ packages: hasBin: true peerDependencies: '@aws/durable-execution-sdk-js': ^2.1.0 - '@effect/platform-bun': 4.0.0-beta.102 - '@effect/platform-node': 4.0.0-beta.102 - '@effect/sql-pg': 4.0.0-beta.102 + '@effect/platform-bun': 4.0.0-beta.103 + '@effect/platform-node': 4.0.0-beta.103 + '@effect/sql-pg': 4.0.0-beta.103 drizzle-kit: 1.0.0-rc.4 drizzle-orm: 1.0.0-rc.4 - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 vite: ^8.0.7 ws: ^8.20.0 peerDependenciesMeta: @@ -6160,9 +6158,9 @@ packages: '@effect/sql-d1': '>=4.0.0-beta.83 || >=4.0.0' '@effect/sql-libsql': '>=4.0.0-beta.83 || >=4.0.0' '@effect/sql-mysql2': '>=4.0.0-beta.83 || >=4.0.0' - '@effect/sql-pg': 4.0.0-beta.102 + '@effect/sql-pg': 4.0.0-beta.103 '@effect/sql-pglite': '>=4.0.0-beta.83 || >=4.0.0' - '@effect/sql-sqlite-bun': 4.0.0-beta.102 + '@effect/sql-sqlite-bun': 4.0.0-beta.103 '@effect/sql-sqlite-do': '>=4.0.0-beta.83 || >=4.0.0' '@effect/sql-sqlite-node': '>=4.0.0-beta.83 || >=4.0.0' '@effect/sql-sqlite-wasm': '>=4.0.0-beta.83 || >=4.0.0' @@ -6191,7 +6189,7 @@ packages: arktype: '>=2.0.0' better-sqlite3: '>=9.3.0' bun-types: '*' - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 expo-sqlite: '>=14.0.0' mssql: ^11.0.1 mysql2: '>=2' @@ -6312,8 +6310,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - effect@4.0.0-beta.102: - resolution: {integrity: sha512-z8Y+Q76Hh/kjLFZrXu8tGn6e+tDsg45R+UHhxd190pXxD53OGwf/G/zDxXTkse4HJ5mobNZfitLfUCp4fMvu6w==} + effect@4.0.0-beta.103: + resolution: {integrity: sha512-pE8TxF4m2tQzVI+77dIlm3s+81TACV1AiX1JEkvY+zVuxgQQ8aGSkqXNJF6b/ST+coCSk5cUdbULpQ7sm4oHyw==} ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} @@ -8610,9 +8608,6 @@ packages: pg-cloudflare@1.4.0: resolution: {integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==} - pg-connection-string@2.13.0: - resolution: {integrity: sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==} - pg-connection-string@2.14.0: resolution: {integrity: sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==} @@ -11657,24 +11652,24 @@ snapshots: '@cloudflare/workers-types@5.20260726.1': {} - '@distilled.cloud/aws@0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))': + '@distilled.cloud/aws@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))': 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.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@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.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) fast-xml-parser: 5.8.0 - '@distilled.cloud/axiom@0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))': + '@distilled.cloud/axiom@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))': dependencies: - '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) '@distilled.cloud/cloudflare-rolldown-plugin@0.13.10(@voidzero-dev/vite-plus-core@0.2.2(@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: @@ -11687,48 +11682,48 @@ snapshots: transitivePeerDependencies: - workerd - '@distilled.cloud/cloudflare-runtime@0.13.10(@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)))(@effect/platform-bun@4.0.0-beta.102(patch_hash=9f7cfa69ef19b624ac7704fe505a6775dc272d734208883f3decc7e5201a3d23)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(utf-8-validate@6.0.6))(@effect/platform-node@4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))': + '@distilled.cloud/cloudflare-runtime@0.13.10(@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)))(@effect/platform-bun@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))': dependencies: '@alchemy.run/node-utils': 0.0.5 - '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) workerd: 1.20260704.1 optionalDependencies: - '@effect/platform-bun': 4.0.0-beta.102(patch_hash=9f7cfa69ef19b624ac7704fe505a6775dc272d734208883f3decc7e5201a3d23)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(utf-8-validate@6.0.6) - '@effect/platform-node': 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6) - '@distilled.cloud/cloudflare-vite-plugin@0.13.10(554b80dcfb9268a9eeb72fedc0ae62a5)': + '@distilled.cloud/cloudflare-vite-plugin@0.13.10(8bf551e378e9cbc11f8bf1003fbc14a8)': dependencies: - '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@distilled.cloud/cloudflare-rolldown-plugin': 0.13.10(@voidzero-dev/vite-plus-core@0.2.2(@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.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)))(@effect/platform-bun@4.0.0-beta.102(patch_hash=9f7cfa69ef19b624ac7704fe505a6775dc272d734208883f3decc7e5201a3d23)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(utf-8-validate@6.0.6))(@effect/platform-node@4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + '@distilled.cloud/cloudflare-runtime': 0.13.10(@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)))(@effect/platform-bun@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) vite: '@voidzero-dev/vite-plus-core@0.2.2(@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.102(patch_hash=9f7cfa69ef19b624ac7704fe505a6775dc272d734208883f3decc7e5201a3d23)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(utf-8-validate@6.0.6) - '@effect/platform-node': 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6) transitivePeerDependencies: - rolldown - workerd - '@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))': + '@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))': dependencies: - '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) - '@distilled.cloud/core@0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))': + '@distilled.cloud/core@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))': dependencies: - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) - '@distilled.cloud/neon@0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))': + '@distilled.cloud/neon@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))': dependencies: - '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) - '@distilled.cloud/planetscale@0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))': + '@distilled.cloud/planetscale@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))': dependencies: - '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) '@dnd-kit/accessibility@3.1.1(react@19.2.6)': dependencies: @@ -11764,47 +11759,47 @@ snapshots: '@drizzle-team/brocli@0.12.0': {} - '@effect/atom-react@4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(react@19.2.3)(scheduler@0.27.0)': + '@effect/atom-react@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(react@19.2.3)(scheduler@0.27.0)': dependencies: - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) react: 19.2.3 scheduler: 0.27.0 - '@effect/atom-react@4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(react@19.2.6)(scheduler@0.27.0)': + '@effect/atom-react@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(react@19.2.6)(scheduler@0.27.0)': dependencies: - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) react: 19.2.6 scheduler: 0.27.0 - '@effect/openapi-generator@4.0.0-beta.102(@effect/platform-node@4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))': + '@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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))': dependencies: - '@effect/platform-node': 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6) - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + '@effect/platform-node': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) swagger2openapi: 7.0.8 transitivePeerDependencies: - encoding - '@effect/platform-bun@4.0.0-beta.102(patch_hash=9f7cfa69ef19b624ac7704fe505a6775dc272d734208883f3decc7e5201a3d23)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(utf-8-validate@6.0.6)': dependencies: - '@effect/platform-node-shared': 4.0.0-beta.102(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(utf-8-validate@6.0.6) - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + '@effect/platform-node-shared': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(utf-8-validate@6.0.6) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) transitivePeerDependencies: - bufferutil - utf-8-validate - '@effect/platform-node-shared@4.0.0-beta.102(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(utf-8-validate@6.0.6)': + '@effect/platform-node-shared@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(utf-8-validate@6.0.6)': dependencies: '@types/ws': 8.18.1 - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) 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.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6)': dependencies: - '@effect/platform-node-shared': 4.0.0-beta.102(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(utf-8-validate@6.0.6) - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + '@effect/platform-node-shared': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(utf-8-validate@6.0.6) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) ioredis: 5.11.0 mime: 4.1.0 undici: 8.9.0 @@ -11812,14 +11807,14 @@ snapshots: - bufferutil - utf-8-validate - '@effect/sql-d1@4.0.0-beta.101(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))': + '@effect/sql-d1@4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))': dependencies: '@cloudflare/workers-types': 5.20260726.1 - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) - '@effect/sql-pg@4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))': + '@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))': dependencies: - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) pg: 8.22.0 pg-connection-string: 2.14.0 pg-cursor: 2.21.0(pg@8.22.0) @@ -11828,9 +11823,9 @@ snapshots: transitivePeerDependencies: - pg-native - '@effect/sql-sqlite-bun@4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))': + '@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))': dependencies: - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) '@effect/tsgo-darwin-arm64@0.13.2': optional: true @@ -11863,9 +11858,9 @@ snapshots: '@effect/tsgo-win32-arm64': 0.13.2 '@effect/tsgo-win32-x64': 0.13.2 - '@effect/vitest@4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))': + '@effect/vitest@4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))': dependencies: - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) '@egjs/hammerjs@2.0.17': dependencies: @@ -15371,22 +15366,22 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - alchemy@2.0.0-beta.65(249551d75ad3792c0b22cd2754b25266): + alchemy@2.0.0-beta.65(a455401069e1fee89f31a277c51247f6): 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.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - '@distilled.cloud/axiom': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + '@distilled.cloud/aws': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + '@distilled.cloud/axiom': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@distilled.cloud/cloudflare-rolldown-plugin': 0.13.10(@voidzero-dev/vite-plus-core@0.2.2(@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.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)))(@effect/platform-bun@4.0.0-beta.102(patch_hash=9f7cfa69ef19b624ac7704fe505a6775dc272d734208883f3decc7e5201a3d23)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(utf-8-validate@6.0.6))(@effect/platform-node@4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - '@distilled.cloud/cloudflare-vite-plugin': 0.13.10(554b80dcfb9268a9eeb72fedc0ae62a5) - '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - '@distilled.cloud/neon': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - '@distilled.cloud/planetscale': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - '@effect/sql-d1': 4.0.0-beta.101(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - '@effect/vitest': 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + '@distilled.cloud/cloudflare-runtime': 0.13.10(@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)))(@effect/platform-bun@4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(ioredis@5.11.0)(utf-8-validate@6.0.6))(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + '@distilled.cloud/cloudflare-vite-plugin': 0.13.10(8bf551e378e9cbc11f8bf1003fbc14a8) + '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + '@distilled.cloud/neon': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + '@distilled.cloud/planetscale': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + '@effect/sql-d1': 4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + '@effect/vitest': 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@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 @@ -15396,7 +15391,7 @@ snapshots: '@types/aws-lambda': 8.10.161 aws4fetch: 1.0.20 capnweb: 0.6.1 - effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) 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) @@ -15412,11 +15407,11 @@ snapshots: undici: 7.27.1 yaml: 2.9.0 optionalDependencies: - '@effect/platform-bun': 4.0.0-beta.102(patch_hash=9f7cfa69ef19b624ac7704fe505a6775dc272d734208883f3decc7e5201a3d23)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(utf-8-validate@6.0.6) - '@effect/platform-node': 4.0.0-beta.102(patch_hash=cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0)(bufferutil@4.1.0)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(ioredis@5.11.0)(utf-8-validate@6.0.6) - '@effect/sql-pg': 4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + '@effect/platform-bun': 4.0.0-beta.103(bufferutil@4.1.0)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) 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.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)))(@effect/sql-pg@4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)))(@effect/sql-sqlite-bun@4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)))(@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.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(expo-sqlite@56.0.5(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)))(@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)))(@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)))(@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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(expo-sqlite@56.0.5(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.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.2.2(@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: @@ -16439,15 +16434,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.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)))(@effect/sql-pg@4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)))(@effect/sql-sqlite-bun@4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)))(@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.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(expo-sqlite@56.0.5(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)))(@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)))(@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)))(@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=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(expo-sqlite@56.0.5(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.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.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - '@effect/sql-pg': 4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) - '@effect/sql-sqlite-bun': 4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)) + '@effect/sql-d1': 4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + '@effect/sql-pg': 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) + '@effect/sql-sqlite-bun': 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)) '@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.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488) + effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9) expo-sqlite: 56.0.5(expo@56.0.12)(react-native@0.85.3(@babel/core@7.29.7)(@react-native/metro-config@0.85.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 @@ -16467,7 +16462,7 @@ snapshots: ee-first@1.1.1: {} - effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488): + effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9): dependencies: '@standard-schema/spec': 1.1.0 fast-check: 4.9.0 @@ -19487,8 +19482,6 @@ snapshots: pg-cloudflare@1.4.0: optional: true - pg-connection-string@2.13.0: {} - pg-connection-string@2.14.0: {} pg-cursor@2.21.0(pg@8.22.0): @@ -19531,7 +19524,7 @@ snapshots: pg@8.21.0: dependencies: - pg-connection-string: 2.13.0 + pg-connection-string: 2.14.0 pg-pool: 3.14.0(pg@8.21.0) pg-protocol: 1.14.0 pg-types: 2.2.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 79736c894e15bfe0cc78c1ef5a1d7e9ad0a6ab77..5ce125d991c3353b8a492f67ec2a37a9d722f970 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -30,21 +30,21 @@ catalog: "@clerk/expo": 4.1.2 "@clerk/react": 6.12.9 "@clerk/shared": 4.25.9 - "@effect/atom-react": 4.0.0-beta.102 - "@effect/openapi-generator": 4.0.0-beta.102 - "@effect/platform-bun": 4.0.0-beta.102 - "@effect/platform-node": 4.0.0-beta.102 - "@effect/platform-node-shared": 4.0.0-beta.102 - "@effect/sql-pg": 4.0.0-beta.102 - "@effect/sql-sqlite-bun": 4.0.0-beta.102 + "@effect/atom-react": 4.0.0-beta.103 + "@effect/openapi-generator": 4.0.0-beta.103 + "@effect/platform-bun": 4.0.0-beta.103 + "@effect/platform-node": 4.0.0-beta.103 + "@effect/platform-node-shared": 4.0.0-beta.103 + "@effect/sql-pg": 4.0.0-beta.103 + "@effect/sql-sqlite-bun": 4.0.0-beta.103 "@effect/tsgo": 0.13.2 - "@effect/vitest": 4.0.0-beta.102 + "@effect/vitest": 4.0.0-beta.103 "@noble/curves": 1.9.1 "@noble/hashes": 1.8.0 "@pierre/diffs": 1.3.0-beta.10 "@types/node": 24.12.4 "@typescript/native-preview": 7.0.0-dev.20260604.1 - effect: 4.0.0-beta.102 + effect: 4.0.0-beta.103 jose: 6.2.2 typescript: ~6.0.3 vite: npm:@voidzero-dev/vite-plus-core@0.2.2 @@ -64,16 +64,16 @@ minimumReleaseAgeExclude: - "@distilled.cloud/core@0.30.2" - "@distilled.cloud/neon@0.30.2" - "@distilled.cloud/planetscale@0.30.2" - - "@effect/atom-react@4.0.0-beta.102" - - "@effect/openapi-generator@4.0.0-beta.102" - - "@effect/platform-bun@4.0.0-beta.102" - - "@effect/platform-node-shared@4.0.0-beta.102" - - "@effect/platform-node@4.0.0-beta.102" - - "@effect/sql-pg@4.0.0-beta.102" - - "@effect/sql-sqlite-bun@4.0.0-beta.102" - - "@effect/vitest@4.0.0-beta.102" + - "@effect/atom-react@4.0.0-beta.103" + - "@effect/openapi-generator@4.0.0-beta.103" + - "@effect/platform-bun@4.0.0-beta.103" + - "@effect/platform-node-shared@4.0.0-beta.103" + - "@effect/platform-node@4.0.0-beta.103" + - "@effect/sql-pg@4.0.0-beta.103" + - "@effect/sql-sqlite-bun@4.0.0-beta.103" + - "@effect/vitest@4.0.0-beta.103" - alchemy@2.0.0-beta.65 - - effect@4.0.0-beta.102 + - effect@4.0.0-beta.103 overrides: "@clerk/backend": "catalog:" @@ -122,16 +122,14 @@ packageExtensions: vite: "catalog:" patchedDependencies: - "@effect/platform-bun@4.0.0-beta.102": patches/@effect__platform-bun@4.0.0-beta.102.patch - "@effect/platform-node@4.0.0-beta.102": patches/@effect__platform-node@4.0.0-beta.102.patch - "@effect/vitest@4.0.0-beta.102": patches/@effect__vitest@4.0.0-beta.102.patch + "@effect/vitest@4.0.0-beta.103": patches/@effect__vitest@4.0.0-beta.103.patch "@expo/metro-config@56.0.14": patches/@expo%2Fmetro-config@56.0.14.patch "@ff-labs/fff-node@0.9.4": patches/@ff-labs__fff-node@0.9.4.patch "@legendapp/list@3.3.3": patches/@legendapp__list@3.3.3.patch "@pierre/diffs@1.3.0-beta.10": patches/@pierre%2Fdiffs@1.3.0-beta.10.patch "@react-native-menu/menu@2.0.0": patches/@react-native-menu__menu@2.0.0.patch "@react-navigation/native-stack@7.17.6": patches/@react-navigation%2Fnative-stack@7.17.6.patch - effect@4.0.0-beta.102: patches/effect@4.0.0-beta.102.patch + effect@4.0.0-beta.103: patches/effect@4.0.0-beta.103.patch expo-modules-jsi@56.0.10: patches/expo-modules-jsi@56.0.10.patch react-native-gesture-handler@2.31.2: patches/react-native-gesture-handler@2.31.2.patch react-native-keyboard-controller@1.21.13: patches/react-native-keyboard-controller@1.21.13.patch diff --git a/scripts/build-desktop-artifact.ts b/scripts/build-desktop-artifact.ts index a3c9996925694db4aaae9a3fc80ac89887eddd56..a30b6d4a90a253e1a22abe08fba9a2e10e07844f 100644 --- a/scripts/build-desktop-artifact.ts +++ b/scripts/build-desktop-artifact.ts @@ -67,7 +67,7 @@ type StageWorkspaceConfig = typeof StageWorkspaceConfig.Type; const RepoRoot = Effect.service(Path.Path).pipe( Effect.flatMap((path) => path.fromFileUrl(new URL("..", import.meta.url))), ); -const encodeJsonString = Schema.encodeEffect(Schema.UnknownFromJsonString); +const encodeJsonString = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown)); const decodeWorkspaceConfig = Schema.decodeEffect(fromYaml(WorkspaceConfig)); const decodeNodePtyManifest = Schema.decodeUnknownEffect( Schema.fromJsonString(Schema.Struct({ version: Schema.String })), diff --git a/scripts/sync-reference-repos.ts b/scripts/sync-reference-repos.ts index b0bc57ad870c5df8d38e005c236f0bc8f9ef073d..70e97bdec980ea9fae27dce62be78673e16be53d 100644 --- a/scripts/sync-reference-repos.ts +++ b/scripts/sync-reference-repos.ts @@ -100,7 +100,7 @@ export const ReferenceRepoSyncError = Schema.Union([ export type ReferenceRepoSyncError = typeof ReferenceRepoSyncError.Type; export const isReferenceRepoSyncError = Schema.is(ReferenceRepoSyncError); -const decodeJsonSource = Schema.decodeUnknownEffect(Schema.UnknownFromJsonString); +const decodeJsonSource = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Unknown)); const decodeYamlSource = Schema.decodeEffect(fromYaml(Schema.Unknown)); const collectStreamAsString = (stream: Stream.Stream): Effect.Effect =>