authorgravatar for julius0216@outlook.comJulius Marminge <julius0216@outlook.com> 2026-08-04 13:56:50+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-08-04 13:56:50+02:00
log2b1d4fecb859b9a68f4853b8c4c5857ffe9d448d
tree04cdf7acfa4b4ef8391e3a5f68f0ccc1c75a6afa
parentcec1bb9de38a80d7c06faa6841360002ca136080
signature Signed by PGP key B5690EEEBB952194

Upgrade Effect to beta.103 (#5331)


46 files changed, 775 insertions(+), 989 deletions(-)

apps/desktop/src/preview/Manager.ts+1-1
...@@ -109,7 +109,7 @@ const DIAGNOSTIC_BUFFER_LIMIT = 200;...@@ -109,7 +109,7 @@ const DIAGNOSTIC_BUFFER_LIMIT = 200;
109const MAX_ARTIFACT_SITE_SLUG_LENGTH = 80;109const MAX_ARTIFACT_SITE_SLUG_LENGTH = 80;
110const AGENT_CURSOR_MOVE_MS = 160;110const AGENT_CURSOR_MOVE_MS = 160;
111const AGENT_CURSOR_CLICK_LEAD_MS = 40;111const AGENT_CURSOR_CLICK_LEAD_MS = 40;
112const encodeUnknownJson = Schema.encodeUnknownEffect(Schema.UnknownFromJsonString);112const encodeUnknownJson = Schema.encodeUnknownEffect(Schema.fromJsonString(Schema.Unknown));
113const DEFAULT_ANNOTATION_THEME: DesktopPreviewAnnotationTheme = {113const DEFAULT_ANNOTATION_THEME: DesktopPreviewAnnotationTheme = {
114 colorScheme: "light",114 colorScheme: "light",
115 radius: "0.625rem",115 radius: "0.625rem",
apps/desktop/src/preview/PlaywrightInjectedRuntime.ts+1-1
...@@ -8,7 +8,7 @@ import * as Effect from "effect/Effect";...@@ -8,7 +8,7 @@ import * as Effect from "effect/Effect";
8import * as Schema from "effect/Schema";8import * as Schema from "effect/Schema";
99
10const require = NodeModule.createRequire(import.meta.url);10const require = NodeModule.createRequire(import.meta.url);
11const encodeUnknownJson = Schema.encodeUnknownEffect(Schema.UnknownFromJsonString);11const encodeUnknownJson = Schema.encodeUnknownEffect(Schema.fromJsonString(Schema.Unknown));
12const PLAYWRIGHT_PACKAGE_SPECIFIER = "playwright-core/package.json";12const PLAYWRIGHT_PACKAGE_SPECIFIER = "playwright-core/package.json";
13const PLAYWRIGHT_SOURCE_MARKER = "source3 = ";13const PLAYWRIGHT_SOURCE_MARKER = "source3 = ";
14const PLAYWRIGHT_SOURCE_TERMINATOR = ";\n }\n});";14const PLAYWRIGHT_SOURCE_TERMINATOR = ";\n }\n});";
apps/server/src/cli/config.test.ts+6-2
...@@ -1,3 +1,5 @@...@@ -1,3 +1,5 @@
1// @effect-diagnostics nodeBuiltinImport:off
2import * as NodeFS from "node:fs";
1import * as NodeOS from "node:os";3import * as NodeOS from "node:os";
24
3import { assert, expect, it } from "@effect/vitest";5import { assert, expect, it } from "@effect/vitest";
...@@ -56,8 +58,10 @@ it.layer(NodeServices.layer)("cli config resolution", (it) => {...@@ -56,8 +58,10 @@ it.layer(NodeServices.layer)("cli config resolution", (it) => {
56 const filePath = yield* fs.makeTempFileScoped({ prefix: "t3-bootstrap-", suffix: ".ndjson" });58 const filePath = yield* fs.makeTempFileScoped({ prefix: "t3-bootstrap-", suffix: ".ndjson" });
57 const encoded = yield* encodeDesktopBootstrap(payload);59 const encoded = yield* encodeDesktopBootstrap(payload);
58 yield* fs.writeFileString(filePath, `${encoded}\n`);60 yield* fs.writeFileString(filePath, `${encoded}\n`);
59 const { fd } = yield* fs.open(filePath, { flag: "r" });61 return yield* Effect.acquireRelease(
60 return fd;62 Effect.sync(() => NodeFS.openSync(filePath, "r")),
63 (fd) => Effect.sync(() => NodeFS.closeSync(fd)),
64 );
61 });65 });
6266
63 it.effect("falls back to effect/config values when flags are omitted", () =>67 it.effect("falls back to effect/config values when flags are omitted", () =>
apps/server/src/cli/config.ts+1-1
...@@ -466,7 +466,7 @@ export const DurationFromString = Schema.String.pipe(...@@ -466,7 +466,7 @@ export const DurationFromString = Schema.String.pipe(
466 return Effect.succeed(duration);466 return Effect.succeed(duration);
467 }467 }
468 return Effect.fail(468 return Effect.fail(
469 new SchemaIssue.InvalidValue(Option.some(value), {469 new SchemaIssue.InvalidValue({
470 message: "Invalid duration. Use values like 5m, 1h, 30d, or 15 minutes.",470 message: "Invalid duration. Use values like 5m, 1h, 30d, or 15 minutes.",
471 }),471 }),
472 );472 );
apps/server/src/cloud/publicConfig.ts+2-3
...@@ -4,7 +4,6 @@ import { normalizeSecureRelayUrl } from "@t3tools/shared/relayUrl";...@@ -4,7 +4,6 @@ import { normalizeSecureRelayUrl } from "@t3tools/shared/relayUrl";
4import * as Config from "effect/Config";4import * as Config from "effect/Config";
5import * as ConfigProvider from "effect/ConfigProvider";5import * as ConfigProvider from "effect/ConfigProvider";
6import * as Effect from "effect/Effect";6import * as Effect from "effect/Effect";
7import * as Option from "effect/Option";
8import * as Schema from "effect/Schema";7import * as Schema from "effect/Schema";
9import * as SchemaIssue from "effect/SchemaIssue";8import * as SchemaIssue from "effect/SchemaIssue";
109
...@@ -24,7 +23,7 @@ function validateRelayUrl(value: string) {...@@ -24,7 +23,7 @@ function validateRelayUrl(value: string) {
24 ? Effect.fail(23 ? Effect.fail(
25 new Config.ConfigError(24 new Config.ConfigError(
26 new Schema.SchemaError(25 new Schema.SchemaError(
27 new SchemaIssue.InvalidValue(Option.some(value), {26 new SchemaIssue.InvalidValue({
28 message: "Relay URL must be a secure absolute HTTPS origin.",27 message: "Relay URL must be a secure absolute HTTPS origin.",
29 }),28 }),
30 ),29 ),
...@@ -130,7 +129,7 @@ function validateHostedAppUrl(value: string) {...@@ -130,7 +129,7 @@ function validateHostedAppUrl(value: string) {
130 return Effect.fail(129 return Effect.fail(
131 new Config.ConfigError(130 new Config.ConfigError(
132 new Schema.SchemaError(131 new Schema.SchemaError(
133 new SchemaIssue.InvalidValue(Option.some(value), {132 new SchemaIssue.InvalidValue({
134 message: "Hosted app URL must be an absolute HTTPS origin (or HTTP loopback origin).",133 message: "Hosted app URL must be an absolute HTTPS origin (or HTTP loopback origin).",
135 }),134 }),
136 ),135 ),
apps/server/src/http.ts+3-68
...@@ -14,10 +14,10 @@ import * as Option from "effect/Option";...@@ -14,10 +14,10 @@ import * as Option from "effect/Option";
14import * as Path from "effect/Path";14import * as Path from "effect/Path";
15import { cast } from "effect/Function";15import { cast } from "effect/Function";
16import {16import {
17 Headers,
18 HttpBody,17 HttpBody,
19 HttpClient,18 HttpClient,
20 HttpClientResponse,19 HttpClientResponse,
20 HttpMiddleware,
21 HttpRouter,21 HttpRouter,
22 HttpServerResponse,22 HttpServerResponse,
23 HttpServerRequest,23 HttpServerRequest,
...@@ -30,7 +30,6 @@ import * as ServerConfig from "./config.ts";...@@ -30,7 +30,6 @@ import * as ServerConfig from "./config.ts";
30import { ASSET_ROUTE_PREFIX, resolveAsset } from "./assets/AssetAccess.ts";30import { ASSET_ROUTE_PREFIX, resolveAsset } from "./assets/AssetAccess.ts";
31import * as BrowserTraceCollector from "./observability/BrowserTraceCollector.ts";31import * as BrowserTraceCollector from "./observability/BrowserTraceCollector.ts";
32import * as EnvironmentAuth from "./auth/EnvironmentAuth.ts";32import * as EnvironmentAuth from "./auth/EnvironmentAuth.ts";
33import * as HttpResponseCompression from "./httpCompression/HttpResponseCompression.ts";
34import { traceRelayRequest } from "./cloud/traceRelayRequest.ts";33import { traceRelayRequest } from "./cloud/traceRelayRequest.ts";
35import {34import {
36 annotateEnvironmentRequest,35 annotateEnvironmentRequest,
...@@ -44,74 +43,10 @@ import { browserApiCorsAllowedHeaders, browserApiCorsAllowedMethods } from "./ht...@@ -44,74 +43,10 @@ import { browserApiCorsAllowedHeaders, browserApiCorsAllowedMethods } from "./ht
44const OTLP_TRACES_PROXY_PATH = "/api/observability/v1/traces";43const OTLP_TRACES_PROXY_PATH = "/api/observability/v1/traces";
45const LOOPBACK_HOSTNAMES = new Set(["127.0.0.1", "::1", "localhost"]);44const LOOPBACK_HOSTNAMES = new Set(["127.0.0.1", "::1", "localhost"]);
46const DESKTOP_RENDERER_ORIGINS = ["t3code://app", "t3code-dev://app"];45const DESKTOP_RENDERER_ORIGINS = ["t3code://app", "t3code-dev://app"];
47const GZIP_MIN_BYTES = 1024;46export const httpCompressionLayer = HttpRouter.middleware(HttpMiddleware.compression(), {
4847 global: true,
49function acceptsGzip(value: string | undefined): boolean {
50 if (!value) return false;
51
52 const accepted = new Map(
53 value.split(",").map((entry) => {
54 const [coding = "", ...parameters] = entry.trim().toLowerCase().split(";");
55 const quality = parameters
56 .map((parameter) => parameter.trim().match(/^q=(.+)$/)?.[1])
57 .find((parameter) => parameter !== undefined);
58 return [coding, quality === undefined ? 1 : Number(quality)] as const;
59 }),
60 );
61 return (accepted.get("gzip") ?? accepted.get("*") ?? 0) > 0;
62}
63
64function varyByAcceptEncoding(value: string | undefined): string {
65 if (!value) return "Accept-Encoding";
66 const values = new Set(value.split(",").map((entry) => entry.trim().toLowerCase()));
67 return values.has("*") || values.has("accept-encoding") ? value : `${value}, Accept-Encoding`;
68}
69
70const compressHttpResponse = Effect.fnUntraced(function* (
71 response: HttpServerResponse.HttpServerResponse,
72 acceptEncoding: string | undefined,
73) {
74 const body = response.body;
75 if (
76 body._tag !== "Uint8Array" ||
77 body.contentLength < GZIP_MIN_BYTES ||
78 !body.contentType.startsWith("application/json") ||
79 response.headers["content-encoding"]
80 ) {
81 return response;
82 }
83
84 const variedResponse = HttpServerResponse.setHeader(
85 response,
86 "vary",
87 varyByAcceptEncoding(response.headers.vary),
88 );
89 if (!acceptsGzip(acceptEncoding)) return variedResponse;
90
91 const compression = yield* HttpResponseCompression.HttpResponseCompression;
92 const headers = Headers.set(
93 Headers.remove(variedResponse.headers, "content-length"),
94 "content-encoding",
95 "gzip",
96 );
97 return compression.gzip(body.body, {
98 status: response.status,
99 statusText: response.statusText,
100 headers,
101 cookies: response.cookies,
102 contentType: body.contentType,
103 });
104});48});
10549
106export const httpCompressionLayer = HttpRouter.middleware(
107 (httpEffect) =>
108 Effect.flatMap(
109 Effect.all([httpEffect, HttpServerRequest.HttpServerRequest]),
110 ([response, request]) => compressHttpResponse(response, request.headers["accept-encoding"]),
111 ),
112 { global: true },
113);
114
115export const browserApiCorsLayer = Layer.unwrap(50export const browserApiCorsLayer = Layer.unwrap(
116 Effect.gen(function* () {51 Effect.gen(function* () {
117 const config = yield* ServerConfig.ServerConfig;52 const config = yield* ServerConfig.ServerConfig;
apps/server/src/httpCompression/HttpResponseCompression.test.ts deleted-29
...@@ -1,29 +0,0 @@
1import { expect, it } from "@effect/vitest";
2import * as NodeStream from "node:stream";
3import * as Effect from "effect/Effect";
4
5import * as HttpResponseCompression from "./HttpResponseCompression.ts";
6
7it.effect("uses a native Node stream", () =>
8 Effect.gen(function* () {
9 const compression = yield* HttpResponseCompression.HttpResponseCompression;
10 const response = compression.gzip(new Uint8Array(), {});
11
12 expect(response.body._tag).toBe("Raw");
13 if (response.body._tag === "Raw") {
14 expect(response.body.body).toBeInstanceOf(NodeStream.Readable);
15 }
16 }).pipe(Effect.provide(HttpResponseCompression.layerNode)),
17);
18
19it.effect("uses a native Web stream for Bun", () =>
20 Effect.gen(function* () {
21 const compression = yield* HttpResponseCompression.HttpResponseCompression;
22 const response = compression.gzip(new Uint8Array(), {});
23
24 expect(response.body._tag).toBe("Raw");
25 if (response.body._tag === "Raw") {
26 expect(response.body.body).toBeInstanceOf(ReadableStream);
27 }
28 }).pipe(Effect.provide(HttpResponseCompression.layerBun)),
29);
apps/server/src/httpCompression/HttpResponseCompression.ts deleted-36
...@@ -1,36 +0,0 @@
1import * as Context from "effect/Context";
2import * as Effect from "effect/Effect";
3import * as Layer from "effect/Layer";
4import * as HttpServerResponse from "effect/unstable/http/HttpServerResponse";
5
6export class HttpResponseCompression extends Context.Service<
7 HttpResponseCompression,
8 {
9 readonly gzip: (
10 body: Uint8Array,
11 options: HttpServerResponse.Options,
12 ) => HttpServerResponse.HttpServerResponse;
13 }
14>()("t3/httpCompression/HttpResponseCompression") {}
15
16export const layerNode = Layer.effect(
17 HttpResponseCompression,
18 Effect.gen(function* () {
19 const NodeZlib = yield* Effect.promise(() => import("node:zlib"));
20 return {
21 gzip: (body, options) => {
22 const stream = NodeZlib.createGzip();
23 stream.end(body);
24 return HttpServerResponse.raw(stream, options);
25 },
26 };
27 }),
28);
29
30export const layerBun = Layer.succeed(HttpResponseCompression, {
31 gzip: (body, options) =>
32 HttpServerResponse.raw(
33 new Response(body).body!.pipeThrough(new CompressionStream("gzip")),
34 options,
35 ),
36});
apps/server/src/keybindings.ts+2-3
...@@ -29,7 +29,6 @@ import * as Exit from "effect/Exit";...@@ -29,7 +29,6 @@ import * as Exit from "effect/Exit";
29import * as FileSystem from "effect/FileSystem";29import * as FileSystem from "effect/FileSystem";
30import * as Path from "effect/Path";30import * as Path from "effect/Path";
31import * as Layer from "effect/Layer";31import * as Layer from "effect/Layer";
32import * as Option from "effect/Option";
33import * as Predicate from "effect/Predicate";32import * as Predicate from "effect/Predicate";
34import * as PubSub from "effect/PubSub";33import * as PubSub from "effect/PubSub";
35import * as Result from "effect/Result";34import * as Result from "effect/Result";
...@@ -68,7 +67,7 @@ export const ResolvedKeybindingFromConfig = KeybindingRule.pipe(...@@ -68,7 +67,7 @@ export const ResolvedKeybindingFromConfig = KeybindingRule.pipe(
68 Effect.filterOrFail(67 Effect.filterOrFail(
69 Predicate.isNotNull,68 Predicate.isNotNull,
70 () =>69 () =>
71 new SchemaIssue.InvalidValue(Option.some(rule), {70 new SchemaIssue.InvalidValue({
72 message: "Invalid keybinding rule",71 message: "Invalid keybinding rule",
73 }),72 }),
74 ),73 ),
...@@ -80,7 +79,7 @@ export const ResolvedKeybindingFromConfig = KeybindingRule.pipe(...@@ -80,7 +79,7 @@ export const ResolvedKeybindingFromConfig = KeybindingRule.pipe(
80 const key = encodeShortcut(resolved.shortcut);79 const key = encodeShortcut(resolved.shortcut);
81 if (!key) {80 if (!key) {
82 return yield* Effect.fail(81 return yield* Effect.fail(
83 new SchemaIssue.InvalidValue(Option.some(resolved), {82 new SchemaIssue.InvalidValue({
84 message: "Resolved shortcut cannot be encoded to key string",83 message: "Resolved shortcut cannot be encoded to key string",
85 }),84 }),
86 );85 );
apps/server/src/mcp/McpHttpServer.test.ts+6-3
...@@ -5,7 +5,7 @@ import { EnvironmentId, PreviewTabId, ProviderInstanceId, ThreadId } from "@t3to...@@ -5,7 +5,7 @@ import { EnvironmentId, PreviewTabId, ProviderInstanceId, ThreadId } from "@t3to
5import * as Effect from "effect/Effect";5import * as Effect from "effect/Effect";
6import * as Layer from "effect/Layer";6import * as Layer from "effect/Layer";
7import * as Stream from "effect/Stream";7import * as Stream from "effect/Stream";
8import { McpSchema, McpServer } from "effect/unstable/ai";8import { McpProtocol, McpSchema, McpServer } from "effect/unstable/ai";
9import { HttpBody, HttpClient, HttpRouter, HttpServerResponse } from "effect/unstable/http";9import { HttpBody, HttpClient, HttpRouter, HttpServerResponse } from "effect/unstable/http";
1010
11import * as McpHttpServer from "./McpHttpServer.ts";11import * as McpHttpServer from "./McpHttpServer.ts";
...@@ -26,8 +26,9 @@ const invocation = {...@@ -26,8 +26,9 @@ const invocation = {
26};26};
27const client = McpSchema.McpServerClient.of({27const client = McpSchema.McpServerClient.of({
28 clientId: 1,28 clientId: 1,
29 protocolVersion: "2025-06-18",
29 initializePayload: {30 initializePayload: {
30 protocolVersion: "2025-03-26",31 protocolVersion: "2025-06-18",
31 capabilities: {},32 capabilities: {},
32 clientInfo: { name: "mcp-test", version: "1.0.0" },33 clientInfo: { name: "mcp-test", version: "1.0.0" },
33 },34 },
...@@ -103,6 +104,7 @@ it.effect("terminates HTTP MCP sessions with DELETE", () =>...@@ -103,6 +104,7 @@ it.effect("terminates HTTP MCP sessions with DELETE", () =>
103 name: "MCP termination test",104 name: "MCP termination test",
104 version: "1.0.0",105 version: "1.0.0",
105 path: "/mcp",106 path: "/mcp",
107 protocols: [McpProtocol.v2025_06_18],
106 });108 });
107 yield* HttpRouter.serve(serverLayer, {109 yield* HttpRouter.serve(serverLayer, {
108 disableListenLog: true,110 disableListenLog: true,
...@@ -239,8 +241,9 @@ it.effect("registers annotated tools and preserves authenticated request context...@@ -239,8 +241,9 @@ it.effect("registers annotated tools and preserves authenticated request context
239 .pipe(241 .pipe(
240 Effect.provideService(McpInvocationContext.McpInvocationContext, invocation),242 Effect.provideService(McpInvocationContext.McpInvocationContext, invocation),
241 Effect.provideService(McpSchema.McpServerClient, client),243 Effect.provideService(McpSchema.McpServerClient, client),
244 Effect.flip,
242 );245 );
243 expect(malformed.isError).toBe(true);246 expect(malformed._tag).toBe("InvalidParams");
244247
245 const snapshot = yield* server248 const snapshot = yield* server
246 .callTool({ name: "preview_snapshot", arguments: { tabId: alternateTabId } })249 .callTool({ name: "preview_snapshot", arguments: { tabId: alternateTabId } })
apps/server/src/mcp/McpHttpServer.ts+2-1
...@@ -6,7 +6,7 @@ import * as Option from "effect/Option";...@@ -6,7 +6,7 @@ import * as Option from "effect/Option";
6import * as Sink from "effect/Sink";6import * as Sink from "effect/Sink";
7import * as Stream from "effect/Stream";7import * as Stream from "effect/Stream";
8import type * as Types from "effect/Types";8import type * as Types from "effect/Types";
9import { McpSchema, McpServer, Tool } from "effect/unstable/ai";9import { McpProtocol, McpSchema, McpServer, Tool } from "effect/unstable/ai";
10import { HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/unstable/http";10import { HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/unstable/http";
1111
12import packageJson from "../../package.json" with { type: "json" };12import packageJson from "../../package.json" with { type: "json" };
...@@ -220,6 +220,7 @@ const McpTransportLive = McpServer.layerHttp({...@@ -220,6 +220,7 @@ const McpTransportLive = McpServer.layerHttp({
220 name: "T3 Code",220 name: "T3 Code",
221 version: packageJson.version,221 version: packageJson.version,
222 path: "/mcp",222 path: "/mcp",
223 protocols: [McpProtocol.v2025_06_18],
223}).pipe(Layer.provide(McpAuthMiddlewareLive));224}).pipe(Layer.provide(McpAuthMiddlewareLive));
224225
225export const layer = PreviewToolkitRegistrationLive.pipe(Layer.provideMerge(McpTransportLive));226export const layer = PreviewToolkitRegistrationLive.pipe(Layer.provideMerge(McpTransportLive));
apps/server/src/provider/Layers/ClaudeAdapter.ts+2-2
...@@ -90,8 +90,8 @@ import {...@@ -90,8 +90,8 @@ import {
90} from "../Errors.ts";90} from "../Errors.ts";
91import { type ClaudeAdapterShape } from "../Services/ClaudeAdapter.ts";91import { type ClaudeAdapterShape } from "../Services/ClaudeAdapter.ts";
92import { type EventNdjsonLogger, makeEventNdjsonLogger } from "./EventNdjsonLogger.ts";92import { type EventNdjsonLogger, makeEventNdjsonLogger } from "./EventNdjsonLogger.ts";
93const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.UnknownFromJsonString);93const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.fromJsonString(Schema.Unknown));
94const decodeUnknownJsonStringExit = Schema.decodeUnknownExit(Schema.UnknownFromJsonString);94const decodeUnknownJsonStringExit = Schema.decodeUnknownExit(Schema.fromJsonString(Schema.Unknown));
9595
96const PROVIDER = ProviderDriverKind.make("claudeAgent");96const PROVIDER = ProviderDriverKind.make("claudeAgent");
97type ClaudeTextStreamKind = Extract<RuntimeContentStreamKind, "assistant_text" | "reasoning_text">;97type ClaudeTextStreamKind = Extract<RuntimeContentStreamKind, "assistant_text" | "reasoning_text">;
apps/server/src/provider/Layers/CursorAdapter.ts+1-1
...@@ -77,7 +77,7 @@ import {...@@ -77,7 +77,7 @@ import {
77import { type CursorAdapterShape } from "../Services/CursorAdapter.ts";77import { type CursorAdapterShape } from "../Services/CursorAdapter.ts";
78import { resolveCursorAcpBaseModelId } from "./CursorProvider.ts";78import { resolveCursorAcpBaseModelId } from "./CursorProvider.ts";
79import { type EventNdjsonLogger, makeEventNdjsonLogger } from "./EventNdjsonLogger.ts";79import { type EventNdjsonLogger, makeEventNdjsonLogger } from "./EventNdjsonLogger.ts";
80const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.UnknownFromJsonString);80const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.fromJsonString(Schema.Unknown));
8181
82const PROVIDER = ProviderDriverKind.make("cursor");82const PROVIDER = ProviderDriverKind.make("cursor");
83const CURSOR_RESUME_VERSION = 1 as const;83const CURSOR_RESUME_VERSION = 1 as const;
apps/server/src/provider/Layers/EventNdjsonLogger.test.ts+1-1
...@@ -20,7 +20,7 @@ import {...@@ -20,7 +20,7 @@ import {
20 writeBatchedMessages,20 writeBatchedMessages,
21} from "./EventNdjsonLogger.ts";21} from "./EventNdjsonLogger.ts";
2222
23const encodeUnknownJson = Schema.encodeUnknownSync(Schema.UnknownFromJsonString);23const encodeUnknownJson = Schema.encodeUnknownSync(Schema.fromJsonString(Schema.Unknown));
2424
25function ownedLogPath(basePath: string, segment: string): string {25function ownedLogPath(basePath: string, segment: string): string {
26 const basename = NodePath.basename(basePath);26 const basename = NodePath.basename(basePath);
apps/server/src/provider/Layers/EventNdjsonLogger.ts+1-1
...@@ -34,7 +34,7 @@ const DEFAULT_MAX_BUFFERED_BYTES = MEBIBYTE;...@@ -34,7 +34,7 @@ const DEFAULT_MAX_BUFFERED_BYTES = MEBIBYTE;
34const DEFAULT_MAX_BUFFERED_RECORDS = 512;34const DEFAULT_MAX_BUFFERED_RECORDS = 512;
35const GLOBAL_THREAD_SEGMENT = "_global";35const GLOBAL_THREAD_SEGMENT = "_global";
36const LOG_SCOPE = "provider-observability";36const LOG_SCOPE = "provider-observability";
37const encodeUnknownJsonString = Schema.encodeUnknownEffect(Schema.UnknownFromJsonString);37const encodeUnknownJsonString = Schema.encodeUnknownEffect(Schema.fromJsonString(Schema.Unknown));
3838
39const transientCanonicalEventTypes = new Set([39const transientCanonicalEventTypes = new Set([
40 "content.delta",40 "content.delta",
apps/server/src/provider/Layers/GrokAdapter.ts+1-1
...@@ -69,7 +69,7 @@ import {...@@ -69,7 +69,7 @@ import {
69import { type GrokAdapterShape } from "../Services/GrokAdapter.ts";69import { type GrokAdapterShape } from "../Services/GrokAdapter.ts";
70import { type EventNdjsonLogger, makeEventNdjsonLogger } from "./EventNdjsonLogger.ts";70import { type EventNdjsonLogger, makeEventNdjsonLogger } from "./EventNdjsonLogger.ts";
7171
72const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.UnknownFromJsonString);72const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.fromJsonString(Schema.Unknown));
7373
74const PROVIDER = ProviderDriverKind.make("grok");74const PROVIDER = ProviderDriverKind.make("grok");
75const GROK_RESUME_VERSION = 1 as const;75const GROK_RESUME_VERSION = 1 as const;
apps/server/src/provider/acp/AcpNativeLogging.test.ts+1-1
...@@ -12,7 +12,7 @@ import type { EventNdjsonLogger } from "../Layers/EventNdjsonLogger.ts";...@@ -12,7 +12,7 @@ import type { EventNdjsonLogger } from "../Layers/EventNdjsonLogger.ts";
12import { makeAcpNativeLoggerFactory } from "./AcpNativeLogging.ts";12import { makeAcpNativeLoggerFactory } from "./AcpNativeLogging.ts";
1313
14const nodeServicesIt = it.layer(NodeServices.layer);14const nodeServicesIt = it.layer(NodeServices.layer);
15const encodeUnknownJson = Schema.encodeUnknownSync(Schema.UnknownFromJsonString);15const encodeUnknownJson = Schema.encodeUnknownSync(Schema.fromJsonString(Schema.Unknown));
1616
17nodeServicesIt("ACP native logging", (it) => {17nodeServicesIt("ACP native logging", (it) => {
18 it.effect("records bounded request and protocol diagnostics without raw payloads", () =>18 it.effect("records bounded request and protocol diagnostics without raw payloads", () =>
apps/server/src/provider/opencodeRuntime.ts+1-1
...@@ -34,7 +34,7 @@ import { collectStreamAsString } from "./providerSnapshot.ts";...@@ -34,7 +34,7 @@ import { collectStreamAsString } from "./providerSnapshot.ts";
34import * as NetService from "@t3tools/shared/Net";34import * as NetService from "@t3tools/shared/Net";
35import { HostProcessPlatform } from "@t3tools/shared/hostProcess";35import { HostProcessPlatform } from "@t3tools/shared/hostProcess";
36import { resolveSpawnCommand } from "@t3tools/shared/shell";36import { resolveSpawnCommand } from "@t3tools/shared/shell";
37const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.UnknownFromJsonString);37const encodeUnknownJsonStringExit = Schema.encodeUnknownExit(Schema.fromJsonString(Schema.Unknown));
38const OPENCODE_EMPTY_CONFIG_CONTENT = "{}";38const OPENCODE_EMPTY_CONFIG_CONTENT = "{}";
3939
40const OPENCODE_SERVER_READY_PREFIX = "opencode server listening";40const OPENCODE_SERVER_READY_PREFIX = "opencode server listening";
apps/server/src/server.test.ts+23-3
...@@ -73,7 +73,6 @@ const TEST_EPOCH = DateTime.makeUnsafe("1970-01-01T00:00:00.000Z");...@@ -73,7 +73,6 @@ const TEST_EPOCH = DateTime.makeUnsafe("1970-01-01T00:00:00.000Z");
7373
74import * as BackgroundPolicy from "./background/BackgroundPolicy.ts";74import * as BackgroundPolicy from "./background/BackgroundPolicy.ts";
75import * as ServerConfig from "./config.ts";75import * as ServerConfig from "./config.ts";
76import * as HttpResponseCompression from "./httpCompression/HttpResponseCompression.ts";
77import { makeRoutesLayer } from "./server.ts";76import { makeRoutesLayer } from "./server.ts";
78import { resolveAvailableEditorsForConfig } from "./ws.ts";77import { resolveAvailableEditorsForConfig } from "./ws.ts";
79import * as CheckpointDiffQuery from "./checkpointing/CheckpointDiffQuery.ts";78import * as CheckpointDiffQuery from "./checkpointing/CheckpointDiffQuery.ts";
...@@ -892,7 +891,6 @@ const buildAppUnderTest = (options?: {...@@ -892,7 +891,6 @@ const buildAppUnderTest = (options?: {
892 Layer.provideMerge(ServerSecretStore.layer),891 Layer.provideMerge(ServerSecretStore.layer),
893 Layer.provide(workspaceAndProjectServicesLayer),892 Layer.provide(workspaceAndProjectServicesLayer),
894 Layer.provideMerge(FetchHttpClient.layer),893 Layer.provideMerge(FetchHttpClient.layer),
895 Layer.provide(HttpResponseCompression.layerNode),
896 Layer.provide(layerConfig),894 Layer.provide(layerConfig),
897 );895 );
898896
...@@ -3221,6 +3219,28 @@ it.layer(NodeServices.layer)("server router seam", (it) => {...@@ -3221,6 +3219,28 @@ it.layer(NodeServices.layer)("server router seam", (it) => {
3221 }).pipe(Effect.provide(NodeHttpServer.layerTest)),3219 }).pipe(Effect.provide(NodeHttpServer.layerTest)),
3222 );3220 );
32233221
3222 // Mirrors NodeHttpServer.layerTest, which does not expose server options,
3223 // with the production `websocket: { perMessageDeflate: true }` setting.
3224 const NodeHttpServerTestWithWsDeflate = HttpServer.layerTestClient.pipe(
3225 Layer.provide(
3226 Layer.fresh(FetchHttpClient.layer).pipe(
3227 Layer.provide(Layer.succeed(FetchHttpClient.RequestInit)({ keepalive: false })),
3228 ),
3229 ),
3230 Layer.provideMerge(
3231 Layer.unwrap(
3232 Effect.map(
3233 Effect.promise(() => import("node:http")),
3234 (NodeHttp) =>
3235 NodeHttpServer.layer(NodeHttp.createServer, {
3236 port: 0,
3237 websocket: { perMessageDeflate: true },
3238 }),
3239 ),
3240 ),
3241 ),
3242 );
3243
3224 it.effect("negotiates permessage-deflate with clients that offer it", () =>3244 it.effect("negotiates permessage-deflate with clients that offer it", () =>
3225 Effect.gen(function* () {3245 Effect.gen(function* () {
3226 yield* buildAppUnderTest();3246 yield* buildAppUnderTest();
...@@ -3246,7 +3266,7 @@ it.layer(NodeServices.layer)("server router seam", (it) => {...@@ -3246,7 +3266,7 @@ it.layer(NodeServices.layer)("server router seam", (it) => {
32463266
3247 const plain = yield* openSocket(false);3267 const plain = yield* openSocket(false);
3248 assert.notInclude(plain.extensions, "permessage-deflate");3268 assert.notInclude(plain.extensions, "permessage-deflate");
3249 }).pipe(Effect.scoped, Effect.provide(NodeHttpServer.layerTest)),3269 }).pipe(Effect.scoped, Effect.provide(NodeHttpServerTestWithWsDeflate)),
3250 );3270 );
32513271
3252 it.effect("issues short-lived websocket tickets for authenticated bearer sessions", () =>3272 it.effect("issues short-lived websocket tickets for authenticated bearer sessions", () =>
apps/server/src/server.ts+21-5
...@@ -10,7 +10,6 @@ import * as HttpApiBuilder from "effect/unstable/httpapi/HttpApiBuilder";...@@ -10,7 +10,6 @@ import * as HttpApiBuilder from "effect/unstable/httpapi/HttpApiBuilder";
10import * as BackgroundPolicy from "./background/BackgroundPolicy.ts";10import * as BackgroundPolicy from "./background/BackgroundPolicy.ts";
11import * as HostPowerMonitor from "./background/HostPowerMonitor.ts";11import * as HostPowerMonitor from "./background/HostPowerMonitor.ts";
12import * as ServerConfig from "./config.ts";12import * as ServerConfig from "./config.ts";
13import * as HttpResponseCompression from "./httpCompression/HttpResponseCompression.ts";
14import {13import {
15 otlpTracesProxyRouteLayer,14 otlpTracesProxyRouteLayer,
16 assetRouteLayer,15 assetRouteLayer,
...@@ -182,6 +181,20 @@ const HttpServerLive = Layer.unwrap(...@@ -182,6 +181,20 @@ const HttpServerLive = Layer.unwrap(
182 port: config.port,181 port: config.port,
183 hostname: config.host ?? "127.0.0.1",182 hostname: config.host ?? "127.0.0.1",
184 gracefulShutdownTimeout: HTTP_PREEMPTIVE_SHUTDOWN_GRACE_MS,183 gracefulShutdownTimeout: HTTP_PREEMPTIVE_SHUTDOWN_GRACE_MS,
184 websocket: {
185 // Negotiate permessage-deflate with clients that offer it; clients
186 // that don't still get uncompressed frames on their connection. A
187 // dedicated compressor keeps a per-connection sliding window
188 // (context takeover) so the compression dictionary is shared across
189 // server-to-client frames. Decompression uses the shared
190 // decompressor: uWebSockets' dedicated decompressor path can abort
191 // connections (close 1006) on valid DEFLATE input — see
192 // https://github.com/uNetworking/uWebSockets.js/issues/633.
193 perMessageDeflate: {
194 compress: "dedicated",
195 decompress: "shared",
196 },
197 },
185 });198 });
186 } else {199 } else {
187 const [NodeHttpServer, NodeHttp] = yield* Effect.all([200 const [NodeHttpServer, NodeHttp] = yield* Effect.all([
...@@ -192,14 +205,18 @@ const HttpServerLive = Layer.unwrap(...@@ -192,14 +205,18 @@ const HttpServerLive = Layer.unwrap(
192 host: config.host ?? "127.0.0.1",205 host: config.host ?? "127.0.0.1",
193 port: config.port,206 port: config.port,
194 gracefulShutdownTimeout: HTTP_PREEMPTIVE_SHUTDOWN_GRACE_MS,207 gracefulShutdownTimeout: HTTP_PREEMPTIVE_SHUTDOWN_GRACE_MS,
208 // Negotiate permessage-deflate with clients that offer it; clients
209 // that don't still get uncompressed frames on their connection.
210 // Context takeover stays enabled (ws default) so the compression
211 // window is shared across frames — that also makes small frames cheap
212 // to compress, so no size threshold is set (ws only honors
213 // `threshold` when context takeover is disabled).
214 websocket: { perMessageDeflate: true },
195 });215 });
196 }216 }
197 }),217 }),
198);218);
199219
200const HttpResponseCompressionLive =
201 typeof Bun !== "undefined" ? HttpResponseCompression.layerBun : HttpResponseCompression.layerNode;
202
203const PlatformServicesLive = Layer.unwrap(220const PlatformServicesLive = Layer.unwrap(
204 Effect.gen(function* () {221 Effect.gen(function* () {
205 if (typeof Bun !== "undefined") {222 if (typeof Bun !== "undefined") {
...@@ -622,7 +639,6 @@ export const makeServerLayer = Layer.unwrap(...@@ -622,7 +639,6 @@ export const makeServerLayer = Layer.unwrap(
622 Layer.provideMerge(runtimeServicesLive),639 Layer.provideMerge(runtimeServicesLive),
623 Layer.provide(activationLayer),640 Layer.provide(activationLayer),
624 Layer.provideMerge(serverRelayBrokerTracingLayer),641 Layer.provideMerge(serverRelayBrokerTracingLayer),
625 Layer.provideMerge(HttpResponseCompressionLive),
626 Layer.provideMerge(HttpServerLive),642 Layer.provideMerge(HttpServerLive),
627 Layer.provide(ApplicationObservabilityLive),643 Layer.provide(ApplicationObservabilityLive),
628 Layer.provideMerge(FetchHttpClient.layer),644 Layer.provideMerge(FetchHttpClient.layer),
apps/server/src/textGeneration/ClaudeTextGeneration.ts+1-1
...@@ -55,7 +55,7 @@ const ClaudeOutputEnvelope = Schema.Struct({...@@ -55,7 +55,7 @@ const ClaudeOutputEnvelope = Schema.Struct({
55 structured_output: Schema.Unknown,55 structured_output: Schema.Unknown,
56});56});
5757
58const encodeJsonString = Schema.encodeEffect(Schema.UnknownFromJsonString);58const encodeJsonString = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown));
59const decodeClaudeOutputEnvelope = Schema.decodeEffect(Schema.fromJsonString(ClaudeOutputEnvelope));59const decodeClaudeOutputEnvelope = Schema.decodeEffect(Schema.fromJsonString(ClaudeOutputEnvelope));
6060
61export const makeClaudeTextGeneration = Effect.fn("makeClaudeTextGeneration")(function* (61export const makeClaudeTextGeneration = Effect.fn("makeClaudeTextGeneration")(function* (
apps/server/src/textGeneration/CodexTextGeneration.ts+1-1
...@@ -35,7 +35,7 @@ import { getCodexServiceTierOptionValue } from "../codexModelOptions.ts";...@@ -35,7 +35,7 @@ import { getCodexServiceTierOptionValue } from "../codexModelOptions.ts";
3535
36const CODEX_GIT_TEXT_GENERATION_REASONING_EFFORT = "low";36const CODEX_GIT_TEXT_GENERATION_REASONING_EFFORT = "low";
37const CODEX_TIMEOUT_MS = 180_000;37const CODEX_TIMEOUT_MS = 180_000;
38const encodeJsonString = Schema.encodeEffect(Schema.UnknownFromJsonString);38const encodeJsonString = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown));
39/**39/**
40 * Build a Codex text-generation closure bound to a specific `CodexSettings`40 * Build a Codex text-generation closure bound to a specific `CodexSettings`
41 * payload. See `makeCodexAdapter` for the overall per-instance rationale.41 * payload. See `makeCodexAdapter` for the overall per-instance rationale.
infra/relay/src/agentActivity/AgentActivityRows.ts+2-2
...@@ -91,8 +91,8 @@ export class AgentActivityRows extends Context.Service<...@@ -91,8 +91,8 @@ export class AgentActivityRows extends Context.Service<
91 }91 }
92>()("t3code-relay/agentActivity/AgentActivityRows") {}92>()("t3code-relay/agentActivity/AgentActivityRows") {}
9393
94const decodeJsonString = Schema.decodeEffect(Schema.UnknownFromJsonString);94const decodeJsonString = Schema.decodeEffect(Schema.fromJsonString(Schema.Unknown));
95const encodeJsonValue = Schema.encodeEffect(Schema.UnknownFromJsonString);95const encodeJsonValue = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown));
9696
97const encodeRelayAgentActivityStateJson = Schema.encodeEffect(97const encodeRelayAgentActivityStateJson = Schema.encodeEffect(
98 Schema.fromJsonString(RelayAgentActivityStateSchema),98 Schema.fromJsonString(RelayAgentActivityStateSchema),
infra/relay/src/agentActivity/LiveActivities.ts+2-2
...@@ -122,8 +122,8 @@ export class LiveActivities extends Context.Service<...@@ -122,8 +122,8 @@ export class LiveActivities extends Context.Service<
122 }122 }
123>()("t3code-relay/agentActivity/LiveActivities") {}123>()("t3code-relay/agentActivity/LiveActivities") {}
124124
125const decodeJsonString = Schema.decodeEffect(Schema.UnknownFromJsonString);125const decodeJsonString = Schema.decodeEffect(Schema.fromJsonString(Schema.Unknown));
126const encodeJsonValue = Schema.encodeEffect(Schema.UnknownFromJsonString);126const encodeJsonValue = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown));
127127
128const encodeRelayAgentActivityAggregateStateJson = Schema.encodeEffect(128const encodeRelayAgentActivityAggregateStateJson = Schema.encodeEffect(
129 Schema.fromJsonString(RelayAgentActivityAggregateStateSchema),129 Schema.fromJsonString(RelayAgentActivityAggregateStateSchema),
infra/relay/src/observability.test.ts+2-2
...@@ -21,11 +21,11 @@ interface ExportedRequest {...@@ -21,11 +21,11 @@ interface ExportedRequest {
21const otlpAttributeValue = (value: {21const otlpAttributeValue = (value: {
22 readonly stringValue?: string | null;22 readonly stringValue?: string | null;
23 readonly boolValue?: boolean | null;23 readonly boolValue?: boolean | null;
24 readonly intValue?: number | null;24 readonly intValue?: string | number | null;
25 readonly doubleValue?: number | null;25 readonly doubleValue?: number | null;
26}) => value.stringValue ?? value.boolValue ?? value.intValue ?? value.doubleValue;26}) => value.stringValue ?? value.boolValue ?? value.intValue ?? value.doubleValue;
2727
28const decodeJson = Schema.decodeUnknownEffect(Schema.UnknownFromJsonString);28const decodeJson = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Unknown));
2929
30it.effect("exports schema error fields as span attributes", () =>30it.effect("exports schema error fields as span attributes", () =>
31 Effect.gen(function* () {31 Effect.gen(function* () {
infra/relay/src/worker.ts+5
...@@ -72,6 +72,11 @@ const webcryptoLayer = Layer.succeed(...@@ -72,6 +72,11 @@ const webcryptoLayer = Layer.succeed(
72);72);
7373
74const httpPlatformNotSupportedLayer = Layer.succeed(HttpPlatform.HttpPlatform, {74const httpPlatformNotSupportedLayer = Layer.succeed(HttpPlatform.HttpPlatform, {
75 platform: "web",
76 compression: {
77 algorithms: new Set<HttpPlatform.CompressionAlgorithm>(),
78 compressResponse: (response) => Effect.succeed(response),
79 },
75 fileResponse: () => Effect.die("Relay API does not serve filesystem responses"),80 fileResponse: () => Effect.die("Relay API does not serve filesystem responses"),
76 fileWebResponse: () => Effect.die("Relay API does not serve file responses"),81 fileWebResponse: () => Effect.die("Relay API does not serve file responses"),
77});82});
oxlint-plugin-t3code/test/utils.ts+1-1
...@@ -38,7 +38,7 @@ class OxlintFixtureExpectedFailure extends Data.TaggedError("OxlintFixtureExpect...@@ -38,7 +38,7 @@ class OxlintFixtureExpectedFailure extends Data.TaggedError("OxlintFixtureExpect
38 }38 }
39}39}
4040
41const encodeOxlintConfig = Schema.encodeEffect(Schema.UnknownFromJsonString);41const encodeOxlintConfig = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown));
4242
43interface RuleHarness {43interface RuleHarness {
44 readonly run: (44 readonly run: (
packages/client-runtime/src/rpc/session.test.ts+2-2
...@@ -138,9 +138,9 @@ const RpcRequest = Schema.TaggedStruct("Request", {...@@ -138,9 +138,9 @@ const RpcRequest = Schema.TaggedStruct("Request", {
138 payload: Schema.Unknown,138 payload: Schema.Unknown,
139 tag: Schema.String,139 tag: Schema.String,
140});140});
141const decodeJson = Schema.decodeUnknownSync(Schema.UnknownFromJsonString);141const decodeJson = Schema.decodeUnknownSync(Schema.fromJsonString(Schema.Unknown));
142const decodeRpcRequest = Schema.decodeUnknownSync(RpcRequest);142const decodeRpcRequest = Schema.decodeUnknownSync(RpcRequest);
143const encodeJson = Schema.encodeUnknownSync(Schema.UnknownFromJsonString);143const encodeJson = Schema.encodeUnknownSync(Schema.fromJsonString(Schema.Unknown));
144const encodeServerConfig = Schema.encodeSync(ServerConfig);144const encodeServerConfig = Schema.encodeSync(ServerConfig);
145const ENCODED_SERVER_CONFIG = encodeServerConfig(SERVER_CONFIG);145const ENCODED_SERVER_CONFIG = encodeServerConfig(SERVER_CONFIG);
146const LEGACY_SERVER_CONFIG = {146const LEGACY_SERVER_CONFIG = {
packages/contracts/src/orchestration.ts+1-2
...@@ -1,5 +1,4 @@...@@ -1,5 +1,4 @@
1import * as Effect from "effect/Effect";1import * as Effect from "effect/Effect";
2import * as Option from "effect/Option";
3import * as Schema from "effect/Schema";2import * as Schema from "effect/Schema";
4import * as SchemaIssue from "effect/SchemaIssue";3import * as SchemaIssue from "effect/SchemaIssue";
5import * as SchemaTransformation from "effect/SchemaTransformation";4import * as SchemaTransformation from "effect/SchemaTransformation";
...@@ -1320,7 +1319,7 @@ export const TurnCountRange = Schema.Struct({...@@ -1320,7 +1319,7 @@ export const TurnCountRange = Schema.Struct({
1320 Schema.makeFilter(1319 Schema.makeFilter(
1321 (input) =>1320 (input) =>
1322 input.fromTurnCount <= input.toTurnCount ||1321 input.fromTurnCount <= input.toTurnCount ||
1323 new SchemaIssue.InvalidValue(Option.some(input.fromTurnCount), {1322 new SchemaIssue.InvalidValue({
1324 message: "fromTurnCount must be less than or equal to toTurnCount",1323 message: "fromTurnCount must be less than or equal to toTurnCount",
1325 }),1324 }),
1326 { identifier: "OrchestrationTurnDiffRange" },1325 { identifier: "OrchestrationTurnDiffRange" },
packages/effect-acp/src/errors.test.ts+1-1
...@@ -10,7 +10,7 @@ import * as AcpError from "./errors.ts";...@@ -10,7 +10,7 @@ import * as AcpError from "./errors.ts";
10const decodeNestedNumberPayload = Schema.decodeUnknownEffect(10const decodeNestedNumberPayload = Schema.decodeUnknownEffect(
11 Schema.Struct({ profile: Schema.Struct({ token: Schema.Number }) }),11 Schema.Struct({ profile: Schema.Struct({ token: Schema.Number }) }),
12);12);
13const encodeUnknownJson = Schema.encodeSync(Schema.UnknownFromJsonString);13const encodeUnknownJson = Schema.encodeSync(Schema.fromJsonString(Schema.Unknown));
1414
15describe("effect-acp errors", () => {15describe("effect-acp errors", () => {
16 it.effect("retains RPC method and cause without deriving the message from the cause", () => {16 it.effect("retains RPC method and cause without deriving the message from the cause", () => {
packages/effect-acp/src/protocol.test.ts+1-1
...@@ -49,7 +49,7 @@ const decodeExtResponse = Schema.decodeEffect(Schema.fromJsonString(ExtResponse)...@@ -49,7 +49,7 @@ const decodeExtResponse = Schema.decodeEffect(Schema.fromJsonString(ExtResponse)
49const decodeRequestPermissionResponse = Schema.decodeEffect(49const decodeRequestPermissionResponse = Schema.decodeEffect(
50 Schema.fromJsonString(RequestPermissionResponse),50 Schema.fromJsonString(RequestPermissionResponse),
51);51);
52const encodeUnknownJsonString = Schema.encodeUnknownSync(Schema.UnknownFromJsonString);52const encodeUnknownJsonString = Schema.encodeUnknownSync(Schema.fromJsonString(Schema.Unknown));
53const encoder = new TextEncoder();53const encoder = new TextEncoder();
54const mockPeerPath = Effect.map(Effect.service(Path.Path), (path) =>54const mockPeerPath = Effect.map(Effect.service(Path.Path), (path) =>
55 path.join(import.meta.dirname, "../test/fixtures/acp-mock-peer.ts"),55 path.join(import.meta.dirname, "../test/fixtures/acp-mock-peer.ts"),
packages/effect-codex-app-server/src/_internal/shared.test.ts+1-1
...@@ -8,7 +8,7 @@ import * as Shared from "./shared.ts";...@@ -8,7 +8,7 @@ import * as Shared from "./shared.ts";
8const decodeNestedNumberPayload = Schema.decodeUnknownEffect(8const decodeNestedNumberPayload = Schema.decodeUnknownEffect(
9 Schema.Struct({ profile: Schema.Struct({ token: Schema.Number }) }),9 Schema.Struct({ profile: Schema.Struct({ token: Schema.Number }) }),
10);10);
11const encodeUnknownJson = Schema.encodeSync(Schema.UnknownFromJsonString);11const encodeUnknownJson = Schema.encodeSync(Schema.fromJsonString(Schema.Unknown));
1212
13it.effect("preserves schema decode diagnostics without deriving the message from the cause", () =>13it.effect("preserves schema decode diagnostics without deriving the message from the cause", () =>
14 Effect.gen(function* () {14 Effect.gen(function* () {
packages/effect-codex-app-server/src/protocol.test.ts+2-2
...@@ -13,13 +13,13 @@ import * as CodexProtocol from "./protocol.ts";...@@ -13,13 +13,13 @@ import * as CodexProtocol from "./protocol.ts";
13import * as CodexRpc from "./rpc.ts";13import * as CodexRpc from "./rpc.ts";
14import * as CodexSchema from "./schema.ts";14import * as CodexSchema from "./schema.ts";
15import { makeInMemoryStdio } from "./_internal/stdio.ts";15import { makeInMemoryStdio } from "./_internal/stdio.ts";
16const encodeUnknownJsonString = Schema.encodeUnknownSync(Schema.UnknownFromJsonString);16const encodeUnknownJsonString = Schema.encodeUnknownSync(Schema.fromJsonString(Schema.Unknown));
1717
18const encoder = new TextEncoder();18const encoder = new TextEncoder();
1919
20const encodeJsonl = (value: unknown) => encoder.encode(`${encodeUnknownJsonString(value)}\n`);20const encodeJsonl = (value: unknown) => encoder.encode(`${encodeUnknownJsonString(value)}\n`);
2121
22const decodeJson = Schema.decodeEffect(Schema.UnknownFromJsonString);22const decodeJson = Schema.decodeEffect(Schema.fromJsonString(Schema.Unknown));
23const decodeAccountTokenUsageResponse = Schema.decodeUnknownEffect(23const decodeAccountTokenUsageResponse = Schema.decodeUnknownEffect(
24 CodexRpc.CLIENT_REQUEST_RESPONSES["account/usage/read"],24 CodexRpc.CLIENT_REQUEST_RESPONSES["account/usage/read"],
25);25);
packages/effect-codex-app-server/src/protocol.ts+2-2
...@@ -91,8 +91,8 @@ function isIncomingResponse(value: unknown): value is typeof JsonRpcResponseEnve...@@ -91,8 +91,8 @@ function isIncomingResponse(value: unknown): value is typeof JsonRpcResponseEnve
91 return isJsonRpcResponseEnvelope(value);91 return isJsonRpcResponseEnvelope(value);
92}92}
9393
94const encodeJsonString = Schema.encodeUnknownEffect(Schema.UnknownFromJsonString);94const encodeJsonString = Schema.encodeUnknownEffect(Schema.fromJsonString(Schema.Unknown));
95const decodeJsonString = Schema.decodeUnknownEffect(Schema.UnknownFromJsonString);95const decodeJsonString = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Unknown));
9696
97const encodeWireMessage = (97const encodeWireMessage = (
98 message: Record<string, unknown>,98 message: Record<string, unknown>,
packages/shared/src/schemaJson.ts+1-1
...@@ -175,7 +175,7 @@ export const formatSchemaError = (cause: Cause.Cause<Schema.SchemaError>) => {...@@ -175,7 +175,7 @@ export const formatSchemaError = (cause: Cause.Cause<Schema.SchemaError>) => {
175 *175 *
176 * Mirrors `SchemaGetter.parseJson()` but strips JSONC syntax before parsing.176 * Mirrors `SchemaGetter.parseJson()` but strips JSONC syntax before parsing.
177 */177 */
178const decodeJsonString = Schema.decodeEffect(Schema.UnknownFromJsonString);178const decodeJsonString = Schema.decodeEffect(Schema.fromJsonString(Schema.Unknown));
179179
180const parseLenientJsonGetter = SchemaGetter.onSome((input: string) => {180const parseLenientJsonGetter = SchemaGetter.onSome((input: string) => {
181 // Strip single-line comments - alternation preserves quoted strings.181 // Strip single-line comments - alternation preserves quoted strings.
packages/shared/src/schemaYaml.ts+2-5
...@@ -1,5 +1,4 @@...@@ -1,5 +1,4 @@
1import * as Effect from "effect/Effect";1import * as Effect from "effect/Effect";
2import * as Option from "effect/Option";
3import * as Schema from "effect/Schema";2import * as Schema from "effect/Schema";
4import * as SchemaGetter from "effect/SchemaGetter";3import * as SchemaGetter from "effect/SchemaGetter";
5import * as SchemaIssue from "effect/SchemaIssue";4import * as SchemaIssue from "effect/SchemaIssue";
...@@ -62,8 +61,7 @@ export function parseYaml<E extends string>(...@@ -62,8 +61,7 @@ export function parseYaml<E extends string>(
62 return SchemaGetter.transformOrFail((input: E) =>61 return SchemaGetter.transformOrFail((input: E) =>
63 Effect.try({62 Effect.try({
64 try: () => parseYamlString(input, options) as unknown,63 try: () => parseYamlString(input, options) as unknown,
65 catch: (error) =>64 catch: (error) => new SchemaIssue.InvalidValue({ message: formatYamlParseError(error) }),
66 new SchemaIssue.InvalidValue(Option.none(), { message: formatYamlParseError(error) }),
67 }),65 }),
68 );66 );
69}67}
...@@ -97,8 +95,7 @@ export function stringifyYaml(...@@ -97,8 +95,7 @@ export function stringifyYaml(
97 return SchemaGetter.transformOrFail((input: unknown) =>95 return SchemaGetter.transformOrFail((input: unknown) =>
98 Effect.try({96 Effect.try({
99 try: () => stringifyYamlValue(input, options),97 try: () => stringifyYamlValue(input, options),
100 catch: () =>98 catch: () => new SchemaIssue.InvalidValue({ message: "Failed to stringify YAML." }),
101 new SchemaIssue.InvalidValue(Option.none(), { message: "Failed to stringify YAML." }),
102 }),99 }),
103 );100 );
104}101}
patches/@effect__platform-bun@4.0.0-beta.102.patch deleted-50
...@@ -1,50 +0,0 @@
1diff --git a/dist/BunHttpServer.js b/dist/BunHttpServer.js
2index 5fb0cbacc183b58e31a442badf4aef06bebcd592..e31fb00c430821fc06247079091a93fb15a1ab92 100644
3--- a/dist/BunHttpServer.js
4+++ b/dist/BunHttpServer.js
5@@ -45,6 +45,20 @@ export const make = /*#__PURE__*/Effect.fnUntraced(function* (options) {
6 ...options,
7 fetch: handlerStack[0],
8 websocket: {
9+ // Patch: upstreamed as https://github.com/Effect-TS/effect/pull/6691 (ships
10+ // in >= 4.0.0-beta.103 as the layer option `websocket: { ... }`). On
11+ // upgrade: drop this patch and pass the option in apps/server/src/server.ts.
12+ // Negotiate permessage-deflate with clients that offer it; clients that
13+ // don't still get uncompressed frames on their connection. A dedicated
14+ // compressor keeps a per-connection sliding window (context takeover) so
15+ // the compression dictionary is shared across server-to-client frames.
16+ // Decompression uses the shared decompressor: uWebSockets' dedicated
17+ // decompressor path can abort connections (close 1006) on valid DEFLATE
18+ // input — see https://github.com/uNetworking/uWebSockets.js/issues/633.
19+ perMessageDeflate: {
20+ compress: "dedicated",
21+ decompress: "shared"
22+ },
23 open(ws) {
24 Deferred.doneUnsafe(ws.data.deferred, Exit.succeed(ws));
25 },
26diff --git a/src/BunHttpServer.ts b/src/BunHttpServer.ts
27index 9f2ac3dfc018e2d35c6f44785f1ce05e2e06fc7c..f2bd3def712677ae1e7d475f5eaf27ac2e42ae1a 100644
28--- a/src/BunHttpServer.ts
29+++ b/src/BunHttpServer.ts
30@@ -90,6 +90,20 @@ export const make = Effect.fnUntraced(
31 ...options as ServeOptions<R>,
32 fetch: handlerStack[0],
33 websocket: {
34+ // Patch: upstreamed as https://github.com/Effect-TS/effect/pull/6691 (ships
35+ // in >= 4.0.0-beta.103 as the layer option `websocket: { ... }`). On
36+ // upgrade: drop this patch and pass the option in apps/server/src/server.ts.
37+ // Negotiate permessage-deflate with clients that offer it; clients that
38+ // don't still get uncompressed frames on their connection. A dedicated
39+ // compressor keeps a per-connection sliding window (context takeover) so
40+ // the compression dictionary is shared across server-to-client frames.
41+ // Decompression uses the shared decompressor: uWebSockets' dedicated
42+ // decompressor path can abort connections (close 1006) on valid DEFLATE
43+ // input — see https://github.com/uNetworking/uWebSockets.js/issues/633.
44+ perMessageDeflate: {
45+ compress: "dedicated",
46+ decompress: "shared"
47+ },
48 open(ws) {
49 Deferred.doneUnsafe(ws.data.deferred, Exit.succeed(ws))
50 },
patches/@effect__platform-node@4.0.0-beta.102.patch deleted-50
...@@ -1,50 +0,0 @@
1diff --git a/dist/NodeHttpServer.js b/dist/NodeHttpServer.js
2index ab7c9354853032fefa192ebfa8ab2026bac6ddb7..319815f01e78f5d4e6f7e62a00046ec092eaf797 100644
3--- a/dist/NodeHttpServer.js
4+++ b/dist/NodeHttpServer.js
5@@ -83,7 +83,17 @@ export const make = /*#__PURE__*/Effect.fnUntraced(function* (evaluate, options)
6 });
7 const address = server.address();
8 const wss = yield* Effect.acquireRelease(Effect.sync(() => new NodeWS.WebSocketServer({
9- noServer: true
10+ noServer: true,
11+ // Patch: upstreamed as https://github.com/Effect-TS/effect/pull/6691 (ships
12+ // in >= 4.0.0-beta.103 as the layer option `websocket: { perMessageDeflate }`).
13+ // On upgrade: drop this patch and pass the option in apps/server/src/server.ts.
14+ // Negotiate permessage-deflate with clients that offer it; clients that
15+ // don't still get uncompressed frames on their connection. Context
16+ // takeover stays enabled (ws default) so the compression window is shared
17+ // across frames — that also makes small frames cheap to compress, so no
18+ // size threshold is set (ws only honors `threshold` when context takeover
19+ // is disabled).
20+ perMessageDeflate: true
21 })), wss => Effect.callback(resume => {
22 wss.close(() => resume(Effect.void));
23 })).pipe(Scope.provide(scope), Effect.cached);
24diff --git a/src/NodeHttpServer.ts b/src/NodeHttpServer.ts
25index e18cd931f17c26d6ca985a2d1ece9e9d760851d3..9c888a581738aea12dbdb2b213cce1c480aa2ecc 100644
26--- a/src/NodeHttpServer.ts
27+++ b/src/NodeHttpServer.ts
28@@ -116,7 +116,21 @@ export const make = Effect.fnUntraced(function*(
29 const address = server.address()!
30
31 const wss = yield* Effect.acquireRelease(
32- Effect.sync(() => new NodeWS.WebSocketServer({ noServer: true })),
33+ Effect.sync(() =>
34+ new NodeWS.WebSocketServer({
35+ noServer: true,
36+ // Patch: upstreamed as https://github.com/Effect-TS/effect/pull/6691 (ships
37+ // in >= 4.0.0-beta.103 as the layer option `websocket: { perMessageDeflate }`).
38+ // On upgrade: drop this patch and pass the option in apps/server/src/server.ts.
39+ // Negotiate permessage-deflate with clients that offer it; clients that
40+ // don't still get uncompressed frames on their connection. Context
41+ // takeover stays enabled (ws default) so the compression window is
42+ // shared across frames — that also makes small frames cheap to
43+ // compress, so no size threshold is set (ws only honors `threshold`
44+ // when context takeover is disabled).
45+ perMessageDeflate: true
46+ })
47+ ),
48 (wss) =>
49 Effect.callback<void>((resume) => {
50 wss.close(() => resume(Effect.void))
patches/@effect__vitest@4.0.0-beta.102.patch deleted-124
...@@ -1,124 +0,0 @@
1diff --git a/dist/index.d.ts b/dist/index.d.ts
2index bc52d20f3116059904e99498447451bd4083c0fe..43cf0824f9f294cb441d9ee4cc12de9f82c04e46 100644
3--- a/dist/index.d.ts
4+++ b/dist/index.d.ts
5@@ -7,11 +7,11 @@ import type * as Layer from "effect/Layer";
6 import type * as Schema from "effect/Schema";
7 import type * as Scope from "effect/Scope";
8 import type * as FC from "effect/testing/FastCheck";
9-import * as V from "vitest";
10+import * as V from "vite-plus/test";
11 /**
12 * @since 4.0.0
13 */
14-export * from "vitest";
15+export * from "vite-plus/test";
16 /**
17 * @since 4.0.0
18 */
19diff --git a/dist/index.js b/dist/index.js
20index 938c9c817abe9aeddb9ad8c74e099c62cbf5f091..760ecc47fec5e9df2efd75de17c05ba4b0700ec1 100644
21--- a/dist/index.js
22+++ b/dist/index.js
23@@ -1,9 +1,9 @@
24-import * as V from "vitest";
25+import * as V from "vite-plus/test";
26 import * as internal from "./internal/internal.js";
27 /**
28 * @since 4.0.0
29 */
30-export * from "vitest";
31+export * from "vite-plus/test";
32 /**
33 * @since 4.0.0
34 */
35diff --git a/dist/internal/internal.js b/dist/internal/internal.js
36index 29ea5844d6c7db5f8ee9cb40eea09fa06306ac76..45461c6610983e6b55cb0b303f3064fe0e12574c 100644
37--- a/dist/internal/internal.js
38+++ b/dist/internal/internal.js
39@@ -1,7 +1,7 @@
40 /**
41 * @since 4.0.0
42 */
43-import { getCurrentSuite } from "@vitest/runner";
44+import { getCurrentSuite } from "vite-plus/test/plugins/runner";
45 import * as Cause from "effect/Cause";
46 import * as Duration from "effect/Duration";
47 import * as Effect from "effect/Effect";
48@@ -16,7 +16,7 @@ import * as Scope from "effect/Scope";
49 import * as fc from "effect/testing/FastCheck";
50 import * as TestClock from "effect/testing/TestClock";
51 import * as TestConsole from "effect/testing/TestConsole";
52-import * as V from "vitest";
53+import * as V from "vite-plus/test";
54 const runPromise = /*#__PURE__*/Effect.fnUntraced(function* (effect, _ctx) {
55 const exit = yield* Effect.exit(effect);
56 if (Exit.isFailure(exit)) {
57diff --git a/dist/utils.js b/dist/utils.js
58index cfb2c39847518b491ca5db87ef693947a75e5e53..c044d7a01c2dd9d86e35db3910aed384eca53a3b 100644
59--- a/dist/utils.js
60+++ b/dist/utils.js
61@@ -4,7 +4,7 @@ import * as Option from "effect/Option";
62 import * as Predicate from "effect/Predicate";
63 import * as Result from "effect/Result";
64 import * as assert from "node:assert";
65-import { assert as vassert } from "vitest";
66+import { assert as vassert } from "vite-plus/test";
67 // ----------------------------
68 // Primitives
69 // ----------------------------
70diff --git a/src/index.ts b/src/index.ts
71index 37886fb6c37a12710f73ccee87a3ff6ca8b2c9fa..2207df940dfae2a346211d09b8d39554e0c00d34 100644
72--- a/src/index.ts
73+++ b/src/index.ts
74@@ -7,13 +7,13 @@ import type * as Layer from "effect/Layer"
75 import type * as Schema from "effect/Schema"
76 import type * as Scope from "effect/Scope"
77 import type * as FC from "effect/testing/FastCheck"
78-import * as V from "vitest"
79+import * as V from "vite-plus/test"
80 import * as internal from "./internal/internal.ts"
81
82 /**
83 * @since 4.0.0
84 */
85-export * from "vitest"
86+export * from "vite-plus/test"
87
88 /**
89 * @since 4.0.0
90diff --git a/src/internal/internal.ts b/src/internal/internal.ts
91index 59c35ec9e65c93df8e2ba21299a5b23f2ce27772..38475742e3d39e8cb30c5ab6a1a45916882cdca4 100644
92--- a/src/internal/internal.ts
93+++ b/src/internal/internal.ts
94@@ -2,7 +2,7 @@
95 * @since 4.0.0
96 */
97
98-import { getCurrentSuite } from "@vitest/runner"
99+import { getCurrentSuite } from "vite-plus/test/plugins/runner"
100 import * as Cause from "effect/Cause"
101 import * as Duration from "effect/Duration"
102 import * as Effect from "effect/Effect"
103@@ -17,7 +17,7 @@ import * as Scope from "effect/Scope"
104 import * as fc from "effect/testing/FastCheck"
105 import * as TestClock from "effect/testing/TestClock"
106 import * as TestConsole from "effect/testing/TestConsole"
107-import * as V from "vitest"
108+import * as V from "vite-plus/test"
109 import type * as Vitest from "../index.ts"
110
111 const runPromise: <E, A>(
112diff --git a/src/utils.ts b/src/utils.ts
113index 09c824139056c992bf978c15dc3836b3dd2257a9..6cd39bf9c0f332ba65842e555cc1c3fe0675e923 100644
114--- a/src/utils.ts
115+++ b/src/utils.ts
116@@ -16,7 +16,7 @@ import * as Option from "effect/Option"
117 import * as Predicate from "effect/Predicate"
118 import * as Result from "effect/Result"
119 import * as assert from "node:assert"
120-import { assert as vassert } from "vitest"
121+import { assert as vassert } from "vite-plus/test"
122
123 // ----------------------------
124 // Primitives
patches/@effect__vitest@4.0.0-beta.103.patch created+106
...@@ -0,0 +1,106 @@
1diff --git a/dist/index.d.ts b/dist/index.d.ts
2index a364638..4ee44c2 100644
3--- a/dist/index.d.ts
4+++ b/dist/index.d.ts
5@@ -7,11 +7,11 @@ import type * as Layer from "effect/Layer";
6 import type * as Schema from "effect/Schema";
7 import type * as Scope from "effect/Scope";
8 import type * as FC from "effect/testing/FastCheck";
9-import * as V from "vitest";
10+import * as V from "vite-plus/test";
11 /**
12 * @since 4.0.0
13 */
14-export * from "vitest";
15+export * from "vite-plus/test";
16 /**
17 * @since 4.0.0
18 */
19diff --git a/dist/index.js b/dist/index.js
20index a1a89bd..687df5a 100644
21--- a/dist/index.js
22+++ b/dist/index.js
23@@ -1,9 +1,9 @@
24-import * as V from "vitest";
25+import * as V from "vite-plus/test";
26 import * as internal from "./internal/internal.js";
27 /**
28 * @since 4.0.0
29 */
30-export * from "vitest";
31+export * from "vite-plus/test";
32 /**
33 * @since 4.0.0
34 */
35diff --git a/dist/internal/internal.js b/dist/internal/internal.js
36index fe41479..8ae751c 100644
37--- a/dist/internal/internal.js
38+++ b/dist/internal/internal.js
39@@ -15,7 +15,7 @@ import * as Scope from "effect/Scope";
40 import * as fc from "effect/testing/FastCheck";
41 import * as TestClock from "effect/testing/TestClock";
42 import * as TestConsole from "effect/testing/TestConsole";
43-import * as V from "vitest";
44+import * as V from "vite-plus/test";
45 const getCurrentSuite = V.TestRunner.getCurrentSuite;
46 const runPromise = /*#__PURE__*/Effect.fnUntraced(function* (effect, _ctx) {
47 const exit = yield* Effect.exit(effect);
48diff --git a/dist/utils.js b/dist/utils.js
49index 4871215..2c46e2b 100644
50--- a/dist/utils.js
51+++ b/dist/utils.js
52@@ -4,7 +4,7 @@ import * as Option from "effect/Option";
53 import * as Predicate from "effect/Predicate";
54 import * as Result from "effect/Result";
55 import * as assert from "node:assert";
56-import { assert as vassert } from "vitest";
57+import { assert as vassert } from "vite-plus/test";
58 // ----------------------------
59 // Primitives
60 // ----------------------------
61diff --git a/src/index.ts b/src/index.ts
62index b524786..8d4025d 100644
63--- a/src/index.ts
64+++ b/src/index.ts
65@@ -7,13 +7,13 @@ import type * as Layer from "effect/Layer"
66 import type * as Schema from "effect/Schema"
67 import type * as Scope from "effect/Scope"
68 import type * as FC from "effect/testing/FastCheck"
69-import * as V from "vitest"
70+import * as V from "vite-plus/test"
71 import * as internal from "./internal/internal.ts"
72
73 /**
74 * @since 4.0.0
75 */
76-export * from "vitest"
77+export * from "vite-plus/test"
78
79 /**
80 * @since 4.0.0
81diff --git a/src/internal/internal.ts b/src/internal/internal.ts
82index d4040a0..f02fc9d 100644
83--- a/src/internal/internal.ts
84+++ b/src/internal/internal.ts
85@@ -16,7 +16,7 @@ import * as Scope from "effect/Scope"
86 import * as fc from "effect/testing/FastCheck"
87 import * as TestClock from "effect/testing/TestClock"
88 import * as TestConsole from "effect/testing/TestConsole"
89-import * as V from "vitest"
90+import * as V from "vite-plus/test"
91 import type * as Vitest from "../index.ts"
92
93 const getCurrentSuite = V.TestRunner.getCurrentSuite
94diff --git a/src/utils.ts b/src/utils.ts
95index 4a4612c..846bcc9 100644
96--- a/src/utils.ts
97+++ b/src/utils.ts
98@@ -16,7 +16,7 @@ import * as Option from "effect/Option"
99 import * as Predicate from "effect/Predicate"
100 import * as Result from "effect/Result"
101 import * as assert from "node:assert"
102-import { assert as vassert } from "vitest"
103+import { assert as vassert } from "vite-plus/test"
104
105 // ----------------------------
106 // Primitives
patches/effect@4.0.0-beta.102.patch deleted-317
...@@ -1,317 +0,0 @@
1diff --git a/dist/unstable/ai/McpServer.js b/dist/unstable/ai/McpServer.js
2index 2830482842c07f2f0fb412076c901e52830b7e24..cd92160578fd152c6b6399ad8a328c4ddd7d300c 100644
3--- a/dist/unstable/ai/McpServer.js
4+++ b/dist/unstable/ai/McpServer.js
5@@ -230,6 +230,26 @@ export const run = /*#__PURE__*/Effect.fnUntraced(function* (options) {
6 const server = yield* McpServer;
7 const isHttp = Option.isSome(yield* Effect.serviceOption(HttpRouter.HttpRouter));
8 const clientSessions = protocolState.clientSessions;
9+ if (isHttp && options.path !== undefined) {
10+ const router = yield* HttpRouter.HttpRouter;
11+ yield* router.add("DELETE", options.path, Effect.gen(function* () {
12+ const request = yield* HttpServerRequest.HttpServerRequest;
13+ const sessionId = request.headers[MCP_SESSION_ID_HEADER];
14+ if (sessionId === undefined) {
15+ return HttpServerResponse.empty({
16+ status: 400
17+ });
18+ }
19+ if (!clientSessions.delete(sessionId)) {
20+ return HttpServerResponse.empty({
21+ status: 404
22+ });
23+ }
24+ return HttpServerResponse.empty({
25+ status: 204
26+ });
27+ }));
28+ }
29 const handlers = yield* Layer.build(layerHandlers(options)).pipe(Effect.provideService(McpProtocolState, protocolState));
30 const clients = yield* RcMap.make({
31 lookup: Effect.fnUntraced(function* (clientId) {
32@@ -493,7 +513,7 @@ export const layerHttp = options => {
33 allow: "POST"
34 }
35 });
36- 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));
37+ const routes = Layer.mergeAll(HttpRouter.add("GET", options.path, methodNotAllowedResponse), HttpRouter.add("PUT", options.path, methodNotAllowedResponse), HttpRouter.add("PATCH", options.path, methodNotAllowedResponse));
38 return Layer.merge(layerWithProtocolState(options), routes).pipe(Layer.provide(layerMcpProtocolHttp(options)), Layer.provide(protocolState), Layer.provide(RpcSerialization.layerJsonRpc()));
39 };
40 const layerMcpProtocolHttp = options => Layer.effect(RpcServer.Protocol)(Effect.gen(function* () {
41diff --git a/dist/unstable/rpc/RpcClient.d.ts b/dist/unstable/rpc/RpcClient.d.ts
42index a70061a638faabdd663eca25cb79585fec06e03c..15c940b61860830f11cad86b155e3b76f43d34ea 100644
43--- a/dist/unstable/rpc/RpcClient.d.ts
44+++ b/dist/unstable/rpc/RpcClient.d.ts
45@@ -2,6 +2,7 @@ import * as Cause from "../../Cause.ts";
46 import * as Context from "../../Context.ts";
47 import type * as Duration from "../../Duration.ts";
48 import * as Effect from "../../Effect.ts";
49+import * as Exit from "../../Exit.ts";
50 import * as Layer from "../../Layer.ts";
51 import * as Queue from "../../Queue.ts";
52 import * as Schedule from "../../Schedule.ts";
53@@ -261,9 +262,40 @@ export declare const layerProtocolWorker: (options: {
54 readonly targetUtilization?: number | undefined;
55 readonly timeToLive: Duration.Input;
56 }) => Layer.Layer<Protocol, WorkerError, Worker.WorkerPlatform | Worker.Spawner>;
57+declare const RequestHooks_base: Context.ServiceClass<RequestHooks, "effect/rpc/RpcClient/RequestHooks", {
58+ readonly onRequestStart?: ((info: {
59+ readonly id: RequestId;
60+ readonly tag: string;
61+ readonly stream: boolean;
62+ }) => Effect.Effect<void>) | undefined;
63+ readonly onRequestChunk?: ((info: {
64+ readonly id: RequestId;
65+ readonly tag: string;
66+ readonly chunkCount: number;
67+ }) => Effect.Effect<void>) | undefined;
68+ readonly onRequestExit?: ((info: {
69+ readonly id: RequestId;
70+ readonly tag: string;
71+ readonly stream: boolean;
72+ readonly exit: Exit.Exit<unknown, unknown>;
73+ }) => Effect.Effect<void>) | undefined;
74+ readonly onRequestInterrupt?: ((info: {
75+ readonly id: RequestId;
76+ readonly tag?: string | undefined;
77+ }) => Effect.Effect<void>) | undefined;
78+}>;
79+/**
80+ * @since 4.0.0
81+ * @category RequestHooks
82+ */
83+export declare class RequestHooks extends RequestHooks_base {
84+}
85 declare const ConnectionHooks_base: Context.ServiceClass<ConnectionHooks, "effect/rpc/RpcClient/ConnectionHooks", {
86 readonly onConnect: Effect.Effect<void>;
87 readonly onDisconnect: Effect.Effect<void>;
88+ readonly onPing?: Effect.Effect<void> | undefined;
89+ readonly onPong?: Effect.Effect<void> | undefined;
90+ readonly onPingTimeout?: Effect.Effect<void> | undefined;
91 }>;
92 /**
93 * Represents optional client protocol hooks that run when a transport connects
94diff --git a/dist/unstable/rpc/RpcClient.js b/dist/unstable/rpc/RpcClient.js
95index b6ddbacbde74fb0ce98c79452b95a1c8fc0e65ed..154fe9a1ec64e5a47cd2ea89536186d6a73a74f6 100644
96--- a/dist/unstable/rpc/RpcClient.js
97+++ b/dist/unstable/rpc/RpcClient.js
98@@ -47,6 +47,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
99 const services = yield* Effect.context();
100 const scope = Context.get(services, Scope.Scope);
101 const entries = new Map();
102+ const hooks = yield* Effect.serviceOption(RequestHooks);
103 let isShutdown = false;
104 yield* Scope.addFinalizer(scope, Effect.withFiber(parent => {
105 isShutdown = true;
106@@ -84,6 +85,11 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
107 return Effect.interrupt;
108 }
109 const id = generateRequestId();
110+ const onStart = Option.isSome(hooks) && hooks.value.onRequestStart ? hooks.value.onRequestStart({
111+ id,
112+ tag: rpc._tag,
113+ stream: false
114+ }) : Effect.void;
115 const send = middleware(message => options.onFromClient({
116 message,
117 context,
118@@ -101,7 +107,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
119 headers: Headers.merge(parentFiber.getRef(CurrentHeaders), headers)
120 });
121 if (discard) {
122- return send;
123+ return onStart.pipe(Effect.andThen(send));
124 }
125 let fiber;
126 return Effect.onInterrupt(Effect.callback(resume => {
127@@ -119,7 +125,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
128 }
129 };
130 entries.set(id, entry);
131- fiber = send.pipe(span ? Effect.withParentSpan(span, {
132+ fiber = onStart.pipe(Effect.andThen(send), span ? Effect.withParentSpan(span, {
133 captureStackTrace: false
134 }) : identity, Effect.runForkWith(parentFiber.context));
135 fiber.addObserver(exit => {
136@@ -128,8 +134,9 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
137 }
138 });
139 }), interruptors => {
140+ const entry = entries.get(id);
141 entries.delete(id);
142- return Effect.andThen(Fiber.interrupt(fiber), sendInterrupt(id, Array.from(interruptors), context));
143+ return Effect.andThen(Fiber.interrupt(fiber), sendInterrupt(id, Array.from(interruptors), context, entry?.rpc._tag));
144 });
145 });
146 const onStreamRequest = Effect.fnUntraced(function* (rpc, middleware, payload, headers, streamBufferSize, context) {
147@@ -141,11 +148,17 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
148 });
149 const fiber = Fiber.getCurrent();
150 const id = generateRequestId();
151+ const onStart = Option.isSome(hooks) && hooks.value.onRequestStart ? hooks.value.onRequestStart({
152+ id,
153+ tag: rpc._tag,
154+ stream: true
155+ }) : Effect.void;
156 const scope = Context.getUnsafe(fiber.context, Scope.Scope);
157 yield* Scope.addFinalizerExit(scope, exit => {
158- if (!entries.has(id)) return Effect.void;
159+ const entry = entries.get(id);
160+ if (!entry) return Effect.void;
161 entries.delete(id);
162- return sendInterrupt(id, Exit.isFailure(exit) ? Array.from(Cause.interruptors(exit.cause)) : [], context);
163+ return sendInterrupt(id, Exit.isFailure(exit) ? Array.from(Cause.interruptors(exit.cause)) : [], context, entry.rpc._tag);
164 });
165 const queue = yield* Queue.bounded(streamBufferSize);
166 entries.set(id, {
167@@ -153,9 +166,10 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
168 rpc,
169 queue,
170 scope,
171- context
172+ context,
173+ chunkCount: 0
174 });
175- yield* middleware(message => options.onFromClient({
176+ yield* onStart.pipe(Effect.andThen(middleware(message => options.onFromClient({
177 message,
178 context,
179 discard: false
180@@ -170,7 +184,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
181 sampled: span.sampled
182 } : {}),
183 headers: Headers.merge(fiber.getRef(CurrentHeaders), headers)
184- }).pipe(span ? Effect.withParentSpan(span, {
185+ }))).pipe(span ? Effect.withParentSpan(span, {
186 captureStackTrace: false
187 }) : identity, Effect.catchCause(error => Queue.failCause(queue, error)), Effect.interruptible, Effect.forkIn(scope, {
188 startImmediately: true
189@@ -200,7 +214,10 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
190 });
191 };
192 };
193- const sendInterrupt = (requestId, interruptors, context) => Effect.callback(resume => {
194+ const sendInterrupt = (requestId, interruptors, context, tag) => (Option.isSome(hooks) && hooks.value.onRequestInterrupt ? hooks.value.onRequestInterrupt({
195+ id: requestId,
196+ tag
197+ }) : Effect.void).pipe(Effect.andThen(Effect.callback(resume => {
198 const parentFiber = Fiber.getCurrent();
199 const fiber = options.onFromClient({
200 message: {
201@@ -214,7 +231,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
202 fiber.addObserver(() => {
203 resume(Effect.void);
204 });
205- });
206+ })));
207 const write = message => {
208 switch (message._tag) {
209 case "Chunk":
210@@ -222,7 +239,13 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
211 const requestId = message.requestId;
212 const entry = entries.get(requestId);
213 if (!entry || entry._tag !== "Queue") return Effect.void;
214- return Queue.offerAll(entry.queue, message.values).pipe(supportsAck ? Effect.flatMap(() => options.onFromClient({
215+ const chunkCount = entry.chunkCount += message.values.length;
216+ const onChunk = Option.isSome(hooks) && hooks.value.onRequestChunk ? hooks.value.onRequestChunk({
217+ id: requestId,
218+ tag: entry.rpc._tag,
219+ chunkCount
220+ }) : Effect.void;
221+ return Queue.offerAll(entry.queue, message.values).pipe(Effect.andThen(onChunk), supportsAck ? Effect.flatMap(() => options.onFromClient({
222 message: {
223 _tag: "Ack",
224 requestId: message.requestId
225@@ -237,11 +260,18 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
226 const entry = entries.get(requestId);
227 if (!entry) return Effect.void;
228 entries.delete(requestId);
229+ const onExit = Option.isSome(hooks) && hooks.value.onRequestExit ? hooks.value.onRequestExit({
230+ id: requestId,
231+ tag: entry.rpc._tag,
232+ stream: entry._tag === "Queue",
233+ exit: message.exit
234+ }) : Effect.void;
235 if (entry._tag === "Effect") {
236- entry.resume(message.exit);
237- return Effect.void;
238+ return onExit.pipe(Effect.andThen(Effect.sync(() => {
239+ entry.resume(message.exit);
240+ })));
241 }
242- return message.exit._tag === "Success" ? Queue.end(entry.queue) : Queue.failCause(entry.queue, message.exit.cause);
243+ return onExit.pipe(Effect.andThen(message.exit._tag === "Success" ? Queue.end(entry.queue) : Queue.failCause(entry.queue, message.exit.cause)));
244 }
245 case "Defect":
246 {
247@@ -590,7 +620,7 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun
248 const requestClientMap = new Map();
249 const write = yield* socket.writer;
250 let parser = serialization.makeUnsafe();
251- const pinger = yield* makePinger(write(parser.encode(constPing)));
252+ const pinger = yield* makePinger(write(parser.encode(constPing)), Option.isSome(hooks) ? hooks.value : undefined);
253 let currentError;
254 const onOpen = Effect.suspend(() => {
255 currentError = undefined;
256@@ -610,8 +640,7 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun
257 body: () => {
258 const response = responses[i++];
259 if (response._tag === "Pong") {
260- pinger.onPong();
261- return Effect.void;
262+ return pinger.onPong;
263 }
264 if ("requestId" in response) {
265 const clientId = requestClientMap.get(response.requestId);
266@@ -639,12 +668,12 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun
267 }
268 }, {
269 onOpen
270- }).pipe(Effect.raceFirst(Effect.flatMap(pinger.timeout, () => Effect.fail(new Socket.SocketError({
271+ }).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({
272 reason: new Socket.SocketOpenError({
273 kind: "Timeout",
274 cause: new Error("ping timeout")
275 })
276- })))));
277+ })))))));
278 }).pipe(Effect.flatMap(() => Effect.fail(new Socket.SocketError({
279 reason: new Socket.SocketCloseError({
280 code: 1000
281@@ -686,20 +715,20 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun
282 };
283 }));
284 const defaultRetryPolicy = /*#__PURE__*/Schedule.min([/*#__PURE__*/Schedule.exponential(500, 1.5), /*#__PURE__*/Schedule.spaced(5000)]);
285-const makePinger = /*#__PURE__*/Effect.fnUntraced(function* (writePing) {
286+const makePinger = /*#__PURE__*/Effect.fnUntraced(function* (writePing, hooks) {
287 let recievedPong = true;
288 const latch = Latch.makeUnsafe();
289 const reset = () => {
290 recievedPong = true;
291 latch.closeUnsafe();
292 };
293- const onPong = () => {
294+ const onPong = Effect.sync(() => {
295 recievedPong = true;
296- };
297+ }).pipe(Effect.andThen(hooks?.onPong ?? Effect.void));
298 yield* Effect.suspend(() => {
299 if (!recievedPong) return latch.open;
300 recievedPong = false;
301- return writePing;
302+ return (hooks?.onPing ?? Effect.void).pipe(Effect.andThen(writePing));
303 }).pipe(Effect.delay("5 seconds"), Effect.ignore, Effect.forever, Effect.interruptible, Effect.forkScoped);
304 return {
305 timeout: latch.await,
306@@ -842,6 +871,11 @@ export const makeProtocolWorker = options => Protocol.make(Effect.fnUntraced(fun
307 * @since 4.0.0
308 */
309 export const layerProtocolWorker = /*#__PURE__*/flow(makeProtocolWorker, /*#__PURE__*/Layer.effect(Protocol));
310+/**
311+ * @since 4.0.0
312+ * @category RequestHooks
313+ */
314+export class RequestHooks extends /*#__PURE__*/Context.Service()("effect/rpc/RpcClient/RequestHooks") {}
315 /**
316 * Represents optional client protocol hooks that run when a transport connects
317 * and disconnects.
patches/effect@4.0.0-beta.103.patch created+317
...@@ -0,0 +1,317 @@
1diff --git a/dist/unstable/ai/McpServer.js b/dist/unstable/ai/McpServer.js
2index 755e41c..dc431aa 100644
3--- a/dist/unstable/ai/McpServer.js
4+++ b/dist/unstable/ai/McpServer.js
5@@ -262,6 +262,26 @@ const runWithProtocolState = /*#__PURE__*/Effect.fnUntraced(function* (options,
6 const server = yield* McpServer;
7 const isHttp = Option.isSome(yield* Effect.serviceOption(HttpRouter.HttpRouter));
8 const sessions = protocolState.sessions;
9+ if (isHttp && options.path !== undefined) {
10+ const router = yield* HttpRouter.HttpRouter;
11+ yield* router.add("DELETE", options.path, Effect.gen(function* () {
12+ const request = yield* HttpServerRequest.HttpServerRequest;
13+ const sessionId = request.headers[MCP_SESSION_ID_HEADER];
14+ if (sessionId === undefined) {
15+ return HttpServerResponse.empty({
16+ status: 400
17+ });
18+ }
19+ if (!sessions.bySessionId.delete(sessionId)) {
20+ return HttpServerResponse.empty({
21+ status: 404
22+ });
23+ }
24+ return HttpServerResponse.empty({
25+ status: 204
26+ });
27+ }));
28+ }
29 const clientProtocols = new Map();
30 const cancelledRequests = new Map();
31 const handlers = yield* Layer.build(layerHandlers(options, {
32@@ -719,7 +739,7 @@ export const layerHttp = options => {
33 const methodNotAllowed = request => Effect.succeed(request.headers.origin !== undefined && !options.allowedOrigins?.includes(request.headers.origin) ? HttpServerResponse.empty({
34 status: 403
35 }) : methodNotAllowedResponse);
36- 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));
37+ 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));
38 return Layer.merge(layerWithProtocolState(options), routes).pipe(Layer.provide(layerMcpProtocolHttp(options)), Layer.provide(protocolState), Layer.provide(RpcSerialization.layerJsonRpc()));
39 };
40 const layerMcpProtocolHttp = options => Layer.effect(RpcServer.Protocol)(Effect.gen(function* () {
41diff --git a/dist/unstable/rpc/RpcClient.d.ts b/dist/unstable/rpc/RpcClient.d.ts
42index aba2779..581d267 100644
43--- a/dist/unstable/rpc/RpcClient.d.ts
44+++ b/dist/unstable/rpc/RpcClient.d.ts
45@@ -2,6 +2,7 @@ import * as Cause from "../../Cause.ts";
46 import * as Context from "../../Context.ts";
47 import type * as Duration from "../../Duration.ts";
48 import * as Effect from "../../Effect.ts";
49+import * as Exit from "../../Exit.ts";
50 import * as Layer from "../../Layer.ts";
51 import * as Queue from "../../Queue.ts";
52 import * as Schedule from "../../Schedule.ts";
53@@ -261,9 +262,40 @@ export declare const layerProtocolWorker: (options: {
54 readonly targetUtilization?: number | undefined;
55 readonly timeToLive: Duration.Input;
56 }) => Layer.Layer<Protocol, WorkerError, Worker.WorkerPlatform | Worker.Spawner>;
57+declare const RequestHooks_base: Context.ServiceClass<RequestHooks, "effect/rpc/RpcClient/RequestHooks", {
58+ readonly onRequestStart?: ((info: {
59+ readonly id: RequestId;
60+ readonly tag: string;
61+ readonly stream: boolean;
62+ }) => Effect.Effect<void>) | undefined;
63+ readonly onRequestChunk?: ((info: {
64+ readonly id: RequestId;
65+ readonly tag: string;
66+ readonly chunkCount: number;
67+ }) => Effect.Effect<void>) | undefined;
68+ readonly onRequestExit?: ((info: {
69+ readonly id: RequestId;
70+ readonly tag: string;
71+ readonly stream: boolean;
72+ readonly exit: Exit.Exit<unknown, unknown>;
73+ }) => Effect.Effect<void>) | undefined;
74+ readonly onRequestInterrupt?: ((info: {
75+ readonly id: RequestId;
76+ readonly tag?: string | undefined;
77+ }) => Effect.Effect<void>) | undefined;
78+}>;
79+/**
80+ * @since 4.0.0
81+ * @category RequestHooks
82+ */
83+export declare class RequestHooks extends RequestHooks_base {
84+}
85 declare const ConnectionHooks_base: Context.ServiceClass<ConnectionHooks, "effect/rpc/RpcClient/ConnectionHooks", {
86 readonly onConnect: Effect.Effect<void>;
87 readonly onDisconnect: Effect.Effect<void>;
88+ readonly onPing?: Effect.Effect<void> | undefined;
89+ readonly onPong?: Effect.Effect<void> | undefined;
90+ readonly onPingTimeout?: Effect.Effect<void> | undefined;
91 }>;
92 /**
93 * Represents optional client protocol hooks that run when a transport connects
94diff --git a/dist/unstable/rpc/RpcClient.js b/dist/unstable/rpc/RpcClient.js
95index b536d0a..12ffac0 100644
96--- a/dist/unstable/rpc/RpcClient.js
97+++ b/dist/unstable/rpc/RpcClient.js
98@@ -47,6 +47,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
99 const services = yield* Effect.context();
100 const scope = Context.get(services, Scope.Scope);
101 const entries = new Map();
102+ const hooks = yield* Effect.serviceOption(RequestHooks);
103 let isShutdown = false;
104 yield* Scope.addFinalizer(scope, Effect.withFiber(parent => {
105 isShutdown = true;
106@@ -84,6 +85,11 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
107 return Effect.interrupt;
108 }
109 const id = generateRequestId();
110+ const onStart = Option.isSome(hooks) && hooks.value.onRequestStart ? hooks.value.onRequestStart({
111+ id,
112+ tag: rpc._tag,
113+ stream: false
114+ }) : Effect.void;
115 const send = middleware(message => options.onFromClient({
116 message,
117 context,
118@@ -101,7 +107,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
119 headers: Headers.merge(parentFiber.getRef(CurrentHeaders), headers)
120 });
121 if (discard) {
122- return send;
123+ return onStart.pipe(Effect.andThen(send));
124 }
125 let fiber;
126 return Effect.onInterrupt(Effect.callback(resume => {
127@@ -119,7 +125,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
128 }
129 };
130 entries.set(id, entry);
131- fiber = send.pipe(span ? Effect.withParentSpan(span, {
132+ fiber = onStart.pipe(Effect.andThen(send), span ? Effect.withParentSpan(span, {
133 captureStackTrace: false
134 }) : identity, Effect.runForkWith(parentFiber.context));
135 fiber.addObserver(exit => {
136@@ -128,8 +134,9 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
137 }
138 });
139 }), interruptors => {
140+ const entry = entries.get(id);
141 entries.delete(id);
142- return Effect.andThen(Fiber.interrupt(fiber), sendInterrupt(id, Array.from(interruptors), context));
143+ return Effect.andThen(Fiber.interrupt(fiber), sendInterrupt(id, Array.from(interruptors), context, entry?.rpc._tag));
144 });
145 });
146 const onStreamRequest = Effect.fnUntraced(function* (rpc, middleware, payload, headers, streamBufferSize, context) {
147@@ -141,11 +148,17 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
148 });
149 const fiber = Fiber.getCurrent();
150 const id = generateRequestId();
151+ const onStart = Option.isSome(hooks) && hooks.value.onRequestStart ? hooks.value.onRequestStart({
152+ id,
153+ tag: rpc._tag,
154+ stream: true
155+ }) : Effect.void;
156 const scope = Context.getUnsafe(fiber.context, Scope.Scope);
157 yield* Scope.addFinalizerExit(scope, exit => {
158- if (!entries.has(id)) return Effect.void;
159+ const entry = entries.get(id);
160+ if (!entry) return Effect.void;
161 entries.delete(id);
162- return sendInterrupt(id, Exit.isFailure(exit) ? Array.from(Cause.interruptors(exit.cause)) : [], context);
163+ return sendInterrupt(id, Exit.isFailure(exit) ? Array.from(Cause.interruptors(exit.cause)) : [], context, entry.rpc._tag);
164 });
165 const queue = yield* Queue.bounded(streamBufferSize);
166 entries.set(id, {
167@@ -153,9 +166,10 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
168 rpc,
169 queue,
170 scope,
171- context
172+ context,
173+ chunkCount: 0
174 });
175- yield* middleware(message => options.onFromClient({
176+ yield* onStart.pipe(Effect.andThen(middleware(message => options.onFromClient({
177 message,
178 context,
179 discard: false
180@@ -170,7 +184,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
181 sampled: span.sampled
182 } : {}),
183 headers: Headers.merge(fiber.getRef(CurrentHeaders), headers)
184- }).pipe(span ? Effect.withParentSpan(span, {
185+ }))).pipe(span ? Effect.withParentSpan(span, {
186 captureStackTrace: false
187 }) : identity, Effect.catchCause(error => Queue.failCause(queue, error)), Effect.interruptible, Effect.forkIn(scope, {
188 startImmediately: true
189@@ -200,7 +214,10 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
190 });
191 };
192 };
193- const sendInterrupt = (requestId, interruptors, context) => Effect.callback(resume => {
194+ const sendInterrupt = (requestId, interruptors, context, tag) => (Option.isSome(hooks) && hooks.value.onRequestInterrupt ? hooks.value.onRequestInterrupt({
195+ id: requestId,
196+ tag
197+ }) : Effect.void).pipe(Effect.andThen(Effect.callback(resume => {
198 const parentFiber = Fiber.getCurrent();
199 const fiber = options.onFromClient({
200 message: {
201@@ -214,7 +231,7 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
202 fiber.addObserver(() => {
203 resume(Effect.void);
204 });
205- });
206+ })));
207 const write = message => {
208 switch (message._tag) {
209 case "Chunk":
210@@ -222,7 +239,13 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
211 const requestId = message.requestId;
212 const entry = entries.get(requestId);
213 if (!entry || entry._tag !== "Queue") return Effect.void;
214- return Queue.offerAll(entry.queue, message.values).pipe(supportsAck ? Effect.flatMap(() => options.onFromClient({
215+ const chunkCount = entry.chunkCount += message.values.length;
216+ const onChunk = Option.isSome(hooks) && hooks.value.onRequestChunk ? hooks.value.onRequestChunk({
217+ id: requestId,
218+ tag: entry.rpc._tag,
219+ chunkCount
220+ }) : Effect.void;
221+ return Queue.offerAll(entry.queue, message.values).pipe(Effect.andThen(onChunk), supportsAck ? Effect.flatMap(() => options.onFromClient({
222 message: {
223 _tag: "Ack",
224 requestId: message.requestId
225@@ -237,11 +260,18 @@ export const makeNoSerialization = /*#__PURE__*/Effect.fnUntraced(function* (gro
226 const entry = entries.get(requestId);
227 if (!entry) return Effect.void;
228 entries.delete(requestId);
229+ const onExit = Option.isSome(hooks) && hooks.value.onRequestExit ? hooks.value.onRequestExit({
230+ id: requestId,
231+ tag: entry.rpc._tag,
232+ stream: entry._tag === "Queue",
233+ exit: message.exit
234+ }) : Effect.void;
235 if (entry._tag === "Effect") {
236- entry.resume(message.exit);
237- return Effect.void;
238+ return onExit.pipe(Effect.andThen(Effect.sync(() => {
239+ entry.resume(message.exit);
240+ })));
241 }
242- return message.exit._tag === "Success" ? Queue.end(entry.queue) : Queue.failCause(entry.queue, message.exit.cause);
243+ return onExit.pipe(Effect.andThen(message.exit._tag === "Success" ? Queue.end(entry.queue) : Queue.failCause(entry.queue, message.exit.cause)));
244 }
245 case "Defect":
246 {
247@@ -590,7 +620,7 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun
248 const requestClientMap = new Map();
249 const write = yield* socket.writer;
250 let parser = serialization.makeUnsafe();
251- const pinger = yield* makePinger(write(parser.encode(constPing)));
252+ const pinger = yield* makePinger(write(parser.encode(constPing)), Option.isSome(hooks) ? hooks.value : undefined);
253 let currentError;
254 const onOpen = Effect.suspend(() => {
255 currentError = undefined;
256@@ -610,8 +640,7 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun
257 body: () => {
258 const response = responses[i++];
259 if (response._tag === "Pong") {
260- pinger.onPong();
261- return Effect.void;
262+ return pinger.onPong;
263 }
264 if (Object.hasOwn(response, "requestId")) {
265 const requestId = response.requestId;
266@@ -640,12 +669,12 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun
267 }
268 }, {
269 onOpen
270- }).pipe(Effect.raceFirst(Effect.flatMap(pinger.timeout, () => Effect.fail(new Socket.SocketError({
271+ }).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({
272 reason: new Socket.SocketOpenError({
273 kind: "Timeout",
274 cause: new Error("ping timeout")
275 })
276- })))));
277+ })))))));
278 }).pipe(Effect.flatMap(() => Effect.fail(new Socket.SocketError({
279 reason: new Socket.SocketCloseError({
280 code: 1000
281@@ -687,20 +716,20 @@ export const makeProtocolSocket = options => Protocol.make(Effect.fnUntraced(fun
282 };
283 }));
284 const defaultRetryPolicy = /*#__PURE__*/Schedule.min([/*#__PURE__*/Schedule.exponential(500, 1.5), /*#__PURE__*/Schedule.spaced(5000)]);
285-const makePinger = /*#__PURE__*/Effect.fnUntraced(function* (writePing) {
286+const makePinger = /*#__PURE__*/Effect.fnUntraced(function* (writePing, hooks) {
287 let recievedPong = true;
288 const latch = Latch.makeUnsafe();
289 const reset = () => {
290 recievedPong = true;
291 latch.closeUnsafe();
292 };
293- const onPong = () => {
294+ const onPong = Effect.sync(() => {
295 recievedPong = true;
296- };
297+ }).pipe(Effect.andThen(hooks?.onPong ?? Effect.void));
298 yield* Effect.suspend(() => {
299 if (!recievedPong) return latch.open;
300 recievedPong = false;
301- return writePing;
302+ return (hooks?.onPing ?? Effect.void).pipe(Effect.andThen(writePing));
303 }).pipe(Effect.delay("5 seconds"), Effect.ignore, Effect.forever, Effect.interruptible, Effect.forkScoped);
304 return {
305 timeout: latch.await,
306@@ -843,6 +872,11 @@ export const makeProtocolWorker = options => Protocol.make(Effect.fnUntraced(fun
307 * @since 4.0.0
308 */
309 export const layerProtocolWorker = /*#__PURE__*/flow(makeProtocolWorker, /*#__PURE__*/Layer.effect(Protocol));
310+/**
311+ * @since 4.0.0
312+ * @category RequestHooks
313+ */
314+export class RequestHooks extends /*#__PURE__*/Context.Service()("effect/rpc/RpcClient/RequestHooks") {}
315 /**
316 * Represents optional client protocol hooks that run when a transport connects
317 * and disconnects.
pnpm-lock.yaml+227-234
...@@ -7,8 +7,8 @@ settings:...@@ -7,8 +7,8 @@ settings:
7catalogs:7catalogs:
8 default:8 default:
9 '@effect/openapi-generator':9 '@effect/openapi-generator':
10 specifier: 4.0.0-beta.10210 specifier: 4.0.0-beta.103
11 version: 4.0.0-beta.10211 version: 4.0.0-beta.103
12 '@effect/tsgo':12 '@effect/tsgo':
13 specifier: 0.13.213 specifier: 0.13.2
14 version: 0.13.214 version: 0.13.2
...@@ -48,18 +48,18 @@ overrides:...@@ -48,18 +48,18 @@ overrides:
48 '@clerk/expo': 4.1.248 '@clerk/expo': 4.1.2
49 '@clerk/react': 6.12.949 '@clerk/react': 6.12.9
50 '@clerk/shared': 4.25.950 '@clerk/shared': 4.25.9
51 '@effect/atom-react': 4.0.0-beta.10251 '@effect/atom-react': 4.0.0-beta.103
52 '@effect/platform-bun': 4.0.0-beta.10252 '@effect/platform-bun': 4.0.0-beta.103
53 '@effect/platform-node': 4.0.0-beta.10253 '@effect/platform-node': 4.0.0-beta.103
54 '@effect/platform-node-shared': 4.0.0-beta.10254 '@effect/platform-node-shared': 4.0.0-beta.103
55 '@effect/sql-pg': 4.0.0-beta.10255 '@effect/sql-pg': 4.0.0-beta.103
56 '@effect/sql-sqlite-bun': 4.0.0-beta.10256 '@effect/sql-sqlite-bun': 4.0.0-beta.103
57 '@effect/vitest': 4.0.0-beta.10257 '@effect/vitest': 4.0.0-beta.103
58 '@effect/vitest>vitest': '-'58 '@effect/vitest>vitest': '-'
59 '@expo/metro-config': 56.0.1459 '@expo/metro-config': 56.0.14
60 '@pierre/diffs>@shikijs/transformers': ^4.2.060 '@pierre/diffs>@shikijs/transformers': ^4.2.0
61 '@types/node': 24.12.461 '@types/node': 24.12.4
62 effect: 4.0.0-beta.10262 effect: 4.0.0-beta.103
63 expo-modules-jsi: 56.0.1063 expo-modules-jsi: 56.0.10
64 expo-sharing>@expo/config-plugins: 56.0.964 expo-sharing>@expo/config-plugins: 56.0.9
65 expo-sharing>@expo/config-types: 56.0.665 expo-sharing>@expo/config-types: 56.0.6
...@@ -69,16 +69,14 @@ overrides:...@@ -69,16 +69,14 @@ overrides:
69packageExtensionsChecksum: sha256-CUzzeefpj3gNFrCKNBhV9FOaniNbrLdKyIhWQyXuaiE=69packageExtensionsChecksum: sha256-CUzzeefpj3gNFrCKNBhV9FOaniNbrLdKyIhWQyXuaiE=
7070
71patchedDependencies:71patchedDependencies:
72 '@effect/platform-bun@4.0.0-beta.102': 9f7cfa69ef19b624ac7704fe505a6775dc272d734208883f3decc7e5201a3d2372 '@effect/vitest@4.0.0-beta.103': a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b
73 '@effect/platform-node@4.0.0-beta.102': cae7efcda6fd29f4db2efd357cb7dc6c41cb6adc957901d437e13ed1f3c017f0
74 '@effect/vitest@4.0.0-beta.102': a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425
75 '@expo/metro-config@56.0.14': 8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff4673 '@expo/metro-config@56.0.14': 8cb08b5bb7051ed9d2dbe46a2c293c5a1e17f1bd6ddf30de27909e18c921ff46
76 '@ff-labs/fff-node@0.9.4': 2b16019ce7ab61aec6478dd02f79ef468cc1d5c51e9d00764f7d2ab8167210c874 '@ff-labs/fff-node@0.9.4': 2b16019ce7ab61aec6478dd02f79ef468cc1d5c51e9d00764f7d2ab8167210c8
77 '@legendapp/list@3.3.3': d162d67b73933ab077d00627cdf52b18ea88b28c4fae4e8340a854df25026f0975 '@legendapp/list@3.3.3': d162d67b73933ab077d00627cdf52b18ea88b28c4fae4e8340a854df25026f09
78 '@pierre/diffs@1.3.0-beta.10': 7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa76 '@pierre/diffs@1.3.0-beta.10': 7ef7cb0cbabb17c15cdb137554068b36f15f6f5265e73fb51452aa3380db91aa
79 '@react-native-menu/menu@2.0.0': 5ea3ae4bf1d9baf5443b65c269bb09621c27a68d556f713778f37b1e8d46aaae77 '@react-native-menu/menu@2.0.0': 5ea3ae4bf1d9baf5443b65c269bb09621c27a68d556f713778f37b1e8d46aaae
80 '@react-navigation/native-stack@7.17.6': c7fc101b78d434904425e5a24c22fb0042298dec6f807250486e784f3c71727378 '@react-navigation/native-stack@7.17.6': c7fc101b78d434904425e5a24c22fb0042298dec6f807250486e784f3c717273
81 effect@4.0.0-beta.102: 71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d48879 effect@4.0.0-beta.103: a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9
82 expo-modules-jsi@56.0.10: 9170f8074ae4e35a0a086e756c8f815794fd3abe51eac67ca3ba02804225ec1f80 expo-modules-jsi@56.0.10: 9170f8074ae4e35a0a086e756c8f815794fd3abe51eac67ca3ba02804225ec1f
83 react-native-gesture-handler@2.31.2: 808eb26f9e57cf4945efd3985af4d9c764da6f91f4c9764433cc868602bbf4d381 react-native-gesture-handler@2.31.2: 808eb26f9e57cf4945efd3985af4d9c764da6f91f4c9764433cc868602bbf4d3
84 react-native-keyboard-controller@1.21.13: 20be72c84d74253acdcfefbc6defe36dc396944f1a44cab2bdd0e3cd572ae00882 react-native-keyboard-controller@1.21.13: 20be72c84d74253acdcfefbc6defe36dc396944f1a44cab2bdd0e3cd572ae008
...@@ -117,8 +115,8 @@ importers:...@@ -117,8 +115,8 @@ importers:
117 specifier: 0.0.3115 specifier: 0.0.3
118 version: 0.0.3116 version: 0.0.3
119 '@effect/platform-node':117 '@effect/platform-node':
120 specifier: 4.0.0-beta.102118 specifier: 4.0.0-beta.103
121 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)119 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)
122 '@t3tools/client-runtime':120 '@t3tools/client-runtime':
123 specifier: workspace:*121 specifier: workspace:*
124 version: link:../../packages/client-runtime122 version: link:../../packages/client-runtime
...@@ -135,8 +133,8 @@ importers:...@@ -135,8 +133,8 @@ importers:
135 specifier: workspace:*133 specifier: workspace:*
136 version: link:../../packages/tailscale134 version: link:../../packages/tailscale
137 effect:135 effect:
138 specifier: 4.0.0-beta.102136 specifier: 4.0.0-beta.103
139 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)137 version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
140 electron:138 electron:
141 specifier: 41.5.0139 specifier: 41.5.0
142 version: 41.5.0140 version: 41.5.0
...@@ -154,8 +152,8 @@ importers:...@@ -154,8 +152,8 @@ importers:
154 version: 0.1.44(react@19.2.6)152 version: 0.1.44(react@19.2.6)
155 devDependencies:153 devDependencies:
156 '@effect/vitest':154 '@effect/vitest':
157 specifier: 4.0.0-beta.102155 specifier: 4.0.0-beta.103
158 version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))156 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
159 '@types/node':157 '@types/node':
160 specifier: 24.12.4158 specifier: 24.12.4
161 version: 24.12.4159 version: 24.12.4
...@@ -200,8 +198,8 @@ importers:...@@ -200,8 +198,8 @@ importers:
200 specifier: 4.1.2198 specifier: 4.1.2
201 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)199 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)
202 '@effect/atom-react':200 '@effect/atom-react':
203 specifier: 4.0.0-beta.102201 specifier: 4.0.0-beta.103
204 version: 4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(react@19.2.3)(scheduler@0.27.0)202 version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(react@19.2.3)(scheduler@0.27.0)
205 '@expo-google-fonts/dm-sans':203 '@expo-google-fonts/dm-sans':
206 specifier: ^0.4.2204 specifier: ^0.4.2
207 version: 0.4.2205 version: 0.4.2
...@@ -275,8 +273,8 @@ importers:...@@ -275,8 +273,8 @@ importers:
275 specifier: 8.0.3273 specifier: 8.0.3
276 version: 8.0.3274 version: 8.0.3
277 effect:275 effect:
278 specifier: 4.0.0-beta.102276 specifier: 4.0.0-beta.103
279 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)277 version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
280 expo:278 expo:
281 specifier: ~56.0.12279 specifier: ~56.0.12
282 version: 56.0.12(8895228379997a2a064f9644cda56ed0)280 version: 56.0.12(8895228379997a2a064f9644cda56ed0)
...@@ -423,8 +421,8 @@ importers:...@@ -423,8 +421,8 @@ importers:
423 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)421 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)
424 devDependencies:422 devDependencies:
425 '@effect/vitest':423 '@effect/vitest':
426 specifier: 4.0.0-beta.102424 specifier: 4.0.0-beta.103
427 version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))425 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
428 '@pierre/trees':426 '@pierre/trees':
429 specifier: 1.0.0-beta.4427 specifier: 1.0.0-beta.4
430 version: 1.0.0-beta.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)428 version: 1.0.0-beta.4(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
...@@ -447,17 +445,17 @@ importers:...@@ -447,17 +445,17 @@ importers:
447 specifier: ^0.3.170445 specifier: ^0.3.170
448 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)446 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)
449 '@effect/platform-bun':447 '@effect/platform-bun':
450 specifier: 4.0.0-beta.102448 specifier: 4.0.0-beta.103
451 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)449 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)
452 '@effect/platform-node':450 '@effect/platform-node':
453 specifier: 4.0.0-beta.102451 specifier: 4.0.0-beta.103
454 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)452 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)
455 '@effect/platform-node-shared':453 '@effect/platform-node-shared':
456 specifier: 4.0.0-beta.102454 specifier: 4.0.0-beta.103
457 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)455 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)
458 '@effect/sql-sqlite-bun':456 '@effect/sql-sqlite-bun':
459 specifier: 4.0.0-beta.102457 specifier: 4.0.0-beta.103
460 version: 4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))458 version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
461 '@ff-labs/fff-node':459 '@ff-labs/fff-node':
462 specifier: 0.9.4460 specifier: 0.9.4
463 version: 0.9.4(patch_hash=2b16019ce7ab61aec6478dd02f79ef468cc1d5c51e9d00764f7d2ab8167210c8)461 version: 0.9.4(patch_hash=2b16019ce7ab61aec6478dd02f79ef468cc1d5c51e9d00764f7d2ab8167210c8)
...@@ -468,8 +466,8 @@ importers:...@@ -468,8 +466,8 @@ importers:
468 specifier: 'catalog:'466 specifier: 'catalog:'
469 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)467 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)
470 effect:468 effect:
471 specifier: 4.0.0-beta.102469 specifier: 4.0.0-beta.103
472 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)470 version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
473 node-pty:471 node-pty:
474 specifier: ^1.1.0472 specifier: ^1.1.0
475 version: 1.1.0473 version: 1.1.0
...@@ -478,8 +476,8 @@ importers:...@@ -478,8 +476,8 @@ importers:
478 version: 2.9.0476 version: 2.9.0
479 devDependencies:477 devDependencies:
480 '@effect/vitest':478 '@effect/vitest':
481 specifier: 4.0.0-beta.102479 specifier: 4.0.0-beta.103
482 version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))480 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
483 '@t3tools/contracts':481 '@t3tools/contracts':
484 specifier: workspace:*482 specifier: workspace:*
485 version: link:../../packages/contracts483 version: link:../../packages/contracts
...@@ -532,8 +530,8 @@ importers:...@@ -532,8 +530,8 @@ importers:
532 specifier: ^3.2.2530 specifier: ^3.2.2
533 version: 3.2.2(react@19.2.6)531 version: 3.2.2(react@19.2.6)
534 '@effect/atom-react':532 '@effect/atom-react':
535 specifier: 4.0.0-beta.102533 specifier: 4.0.0-beta.103
536 version: 4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))(react@19.2.6)(scheduler@0.27.0)534 version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))(react@19.2.6)(scheduler@0.27.0)
537 '@fontsource-variable/dm-sans':535 '@fontsource-variable/dm-sans':
538 specifier: ^5.2.8536 specifier: ^5.2.8
539 version: 5.2.8537 version: 5.2.8
...@@ -574,8 +572,8 @@ importers:...@@ -574,8 +572,8 @@ importers:
574 specifier: ^0.7.1572 specifier: ^0.7.1
575 version: 0.7.1573 version: 0.7.1
576 effect:574 effect:
577 specifier: 4.0.0-beta.102575 specifier: 4.0.0-beta.103
578 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)576 version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
579 jose:577 jose:
580 specifier: 'catalog:'578 specifier: 'catalog:'
581 version: 6.2.2579 version: 6.2.2
...@@ -614,11 +612,11 @@ importers:...@@ -614,11 +612,11 @@ importers:
614 version: 5.0.14(@types/react@19.2.16)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6))612 version: 5.0.14(@types/react@19.2.16)(react@19.2.6)(use-sync-external-store@1.6.0(react@19.2.6))
615 devDependencies:613 devDependencies:
616 '@effect/platform-node':614 '@effect/platform-node':
617 specifier: 4.0.0-beta.102615 specifier: 4.0.0-beta.103
618 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)616 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)
619 '@effect/vitest':617 '@effect/vitest':
620 specifier: 4.0.0-beta.102618 specifier: 4.0.0-beta.103
621 version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))619 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
622 '@rolldown/plugin-babel':620 '@rolldown/plugin-babel':
623 specifier: ^0.2.0621 specifier: ^0.2.0
624 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)622 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:...@@ -665,8 +663,8 @@ importers:
665 specifier: 3.14.0663 specifier: 3.14.0
666 version: 3.14.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)664 version: 3.14.0(react-dom@19.2.6(react@19.2.6))(react@19.2.6)
667 '@effect/sql-pg':665 '@effect/sql-pg':
668 specifier: 4.0.0-beta.102666 specifier: 4.0.0-beta.103
669 version: 4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))667 version: 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
670 '@noble/curves':668 '@noble/curves':
671 specifier: 'catalog:'669 specifier: 'catalog:'
672 version: 1.9.1670 version: 1.9.1
...@@ -684,23 +682,23 @@ importers:...@@ -684,23 +682,23 @@ importers:
684 version: link:../../packages/shared682 version: link:../../packages/shared
685 alchemy:683 alchemy:
686 specifier: 2.0.0-beta.65684 specifier: 2.0.0-beta.65
687 version: 2.0.0-beta.65(249551d75ad3792c0b22cd2754b25266)685 version: 2.0.0-beta.65(a455401069e1fee89f31a277c51247f6)
688 drizzle-orm:686 drizzle-orm:
689 specifier: 1.0.0-rc.4687 specifier: 1.0.0-rc.4
690 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)688 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)
691 effect:689 effect:
692 specifier: 4.0.0-beta.102690 specifier: 4.0.0-beta.103
693 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)691 version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
694 devDependencies:692 devDependencies:
695 '@cloudflare/workers-types':693 '@cloudflare/workers-types':
696 specifier: ^4.20260601.1694 specifier: ^4.20260601.1
697 version: 4.20260604.1695 version: 4.20260604.1
698 '@effect/platform-node':696 '@effect/platform-node':
699 specifier: 4.0.0-beta.102697 specifier: 4.0.0-beta.103
700 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)698 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)
701 '@effect/vitest':699 '@effect/vitest':
702 specifier: 4.0.0-beta.102700 specifier: 4.0.0-beta.103
703 version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))701 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
704 '@types/node':702 '@types/node':
705 specifier: 24.12.4703 specifier: 24.12.4
706 version: 24.12.4704 version: 24.12.4
...@@ -717,18 +715,18 @@ importers:...@@ -717,18 +715,18 @@ importers:
717 oxlint-plugin-t3code:715 oxlint-plugin-t3code:
718 dependencies:716 dependencies:
719 '@effect/platform-node':717 '@effect/platform-node':
720 specifier: 4.0.0-beta.102718 specifier: 4.0.0-beta.103
721 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)719 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)
722 '@oxlint/plugins':720 '@oxlint/plugins':
723 specifier: ^1.63.0721 specifier: ^1.63.0
724 version: 1.68.0722 version: 1.68.0
725 effect:723 effect:
726 specifier: 4.0.0-beta.102724 specifier: 4.0.0-beta.103
727 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)725 version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
728 devDependencies:726 devDependencies:
729 '@effect/vitest':727 '@effect/vitest':
730 specifier: 4.0.0-beta.102728 specifier: 4.0.0-beta.103
731 version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))729 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
732 vite-plus:730 vite-plus:
733 specifier: 'catalog:'731 specifier: 'catalog:'
734 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)732 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:...@@ -742,12 +740,12 @@ importers:
742 specifier: workspace:*740 specifier: workspace:*
743 version: link:../shared741 version: link:../shared
744 effect:742 effect:
745 specifier: 4.0.0-beta.102743 specifier: 4.0.0-beta.103
746 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)744 version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
747 devDependencies:745 devDependencies:
748 '@effect/vitest':746 '@effect/vitest':
749 specifier: 4.0.0-beta.102747 specifier: 4.0.0-beta.103
750 version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))748 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
751 vite-plus:749 vite-plus:
752 specifier: 'catalog:'750 specifier: 'catalog:'
753 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)751 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:...@@ -755,12 +753,12 @@ importers:
755 packages/contracts:753 packages/contracts:
756 dependencies:754 dependencies:
757 effect:755 effect:
758 specifier: 4.0.0-beta.102756 specifier: 4.0.0-beta.103
759 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)757 version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
760 devDependencies:758 devDependencies:
761 '@effect/vitest':759 '@effect/vitest':
762 specifier: 4.0.0-beta.102760 specifier: 4.0.0-beta.103
763 version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))761 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
764 vite-plus:762 vite-plus:
765 specifier: 'catalog:'763 specifier: 'catalog:'
766 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)764 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:...@@ -768,18 +766,18 @@ importers:
768 packages/effect-acp:766 packages/effect-acp:
769 dependencies:767 dependencies:
770 effect:768 effect:
771 specifier: 4.0.0-beta.102769 specifier: 4.0.0-beta.103
772 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)770 version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
773 devDependencies:771 devDependencies:
774 '@effect/openapi-generator':772 '@effect/openapi-generator':
775 specifier: 'catalog:'773 specifier: 'catalog:'
776 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))774 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))
777 '@effect/platform-node':775 '@effect/platform-node':
778 specifier: 4.0.0-beta.102776 specifier: 4.0.0-beta.103
779 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)777 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)
780 '@effect/vitest':778 '@effect/vitest':
781 specifier: 4.0.0-beta.102779 specifier: 4.0.0-beta.103
782 version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))780 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
783 '@types/node':781 '@types/node':
784 specifier: 24.12.4782 specifier: 24.12.4
785 version: 24.12.4783 version: 24.12.4
...@@ -790,18 +788,18 @@ importers:...@@ -790,18 +788,18 @@ importers:
790 packages/effect-codex-app-server:788 packages/effect-codex-app-server:
791 dependencies:789 dependencies:
792 effect:790 effect:
793 specifier: 4.0.0-beta.102791 specifier: 4.0.0-beta.103
794 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)792 version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
795 devDependencies:793 devDependencies:
796 '@effect/openapi-generator':794 '@effect/openapi-generator':
797 specifier: 'catalog:'795 specifier: 'catalog:'
798 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))796 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))
799 '@effect/platform-node':797 '@effect/platform-node':
800 specifier: 4.0.0-beta.102798 specifier: 4.0.0-beta.103
801 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)799 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)
802 '@effect/vitest':800 '@effect/vitest':
803 specifier: 4.0.0-beta.102801 specifier: 4.0.0-beta.103
804 version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))802 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
805 '@types/node':803 '@types/node':
806 specifier: 24.12.4804 specifier: 24.12.4
807 version: 24.12.4805 version: 24.12.4
...@@ -821,8 +819,8 @@ importers:...@@ -821,8 +819,8 @@ importers:
821 specifier: workspace:*819 specifier: workspace:*
822 version: link:../contracts820 version: link:../contracts
823 effect:821 effect:
824 specifier: 4.0.0-beta.102822 specifier: 4.0.0-beta.103
825 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)823 version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
826 jose:824 jose:
827 specifier: 'catalog:'825 specifier: 'catalog:'
828 version: 6.2.2826 version: 6.2.2
...@@ -831,11 +829,11 @@ importers:...@@ -831,11 +829,11 @@ importers:
831 version: 2.9.0829 version: 2.9.0
832 devDependencies:830 devDependencies:
833 '@effect/platform-node':831 '@effect/platform-node':
834 specifier: 4.0.0-beta.102832 specifier: 4.0.0-beta.103
835 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)833 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)
836 '@effect/vitest':834 '@effect/vitest':
837 specifier: 4.0.0-beta.102835 specifier: 4.0.0-beta.103
838 version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))836 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
839 '@types/node':837 '@types/node':
840 specifier: 24.12.4838 specifier: 24.12.4
841 version: 24.12.4839 version: 24.12.4
...@@ -852,15 +850,15 @@ importers:...@@ -852,15 +850,15 @@ importers:
852 specifier: workspace:*850 specifier: workspace:*
853 version: link:../shared851 version: link:../shared
854 effect:852 effect:
855 specifier: 4.0.0-beta.102853 specifier: 4.0.0-beta.103
856 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)854 version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
857 devDependencies:855 devDependencies:
858 '@effect/platform-node':856 '@effect/platform-node':
859 specifier: 4.0.0-beta.102857 specifier: 4.0.0-beta.103
860 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)858 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)
861 '@effect/vitest':859 '@effect/vitest':
862 specifier: 4.0.0-beta.102860 specifier: 4.0.0-beta.103
863 version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))861 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
864 '@types/node':862 '@types/node':
865 specifier: 24.12.4863 specifier: 24.12.4
866 version: 24.12.4864 version: 24.12.4
...@@ -871,18 +869,18 @@ importers:...@@ -871,18 +869,18 @@ importers:
871 packages/tailscale:869 packages/tailscale:
872 dependencies:870 dependencies:
873 '@effect/platform-node':871 '@effect/platform-node':
874 specifier: 4.0.0-beta.102872 specifier: 4.0.0-beta.103
875 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)873 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)
876 '@t3tools/shared':874 '@t3tools/shared':
877 specifier: workspace:*875 specifier: workspace:*
878 version: link:../shared876 version: link:../shared
879 effect:877 effect:
880 specifier: 4.0.0-beta.102878 specifier: 4.0.0-beta.103
881 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)879 version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
882 devDependencies:880 devDependencies:
883 '@effect/vitest':881 '@effect/vitest':
884 specifier: 4.0.0-beta.102882 specifier: 4.0.0-beta.103
885 version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))883 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
886 '@types/node':884 '@types/node':
887 specifier: 24.12.4885 specifier: 24.12.4
888 version: 24.12.4886 version: 24.12.4
...@@ -893,8 +891,8 @@ importers:...@@ -893,8 +891,8 @@ importers:
893 scripts:891 scripts:
894 dependencies:892 dependencies:
895 '@effect/platform-node':893 '@effect/platform-node':
896 specifier: 4.0.0-beta.102894 specifier: 4.0.0-beta.103
897 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)895 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)
898 '@t3tools/contracts':896 '@t3tools/contracts':
899 specifier: workspace:*897 specifier: workspace:*
900 version: link:../packages/contracts898 version: link:../packages/contracts
...@@ -905,8 +903,8 @@ importers:...@@ -905,8 +903,8 @@ importers:
905 specifier: workspace:*903 specifier: workspace:*
906 version: link:../packages/tailscale904 version: link:../packages/tailscale
907 effect:905 effect:
908 specifier: 4.0.0-beta.102906 specifier: 4.0.0-beta.103
909 version: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)907 version: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
910 pngjs:908 pngjs:
911 specifier: 7.0.0909 specifier: 7.0.0
912 version: 7.0.0910 version: 7.0.0
...@@ -915,8 +913,8 @@ importers:...@@ -915,8 +913,8 @@ importers:
915 version: 2.9.0913 version: 2.9.0
916 devDependencies:914 devDependencies:
917 '@effect/vitest':915 '@effect/vitest':
918 specifier: 4.0.0-beta.102916 specifier: 4.0.0-beta.103
919 version: 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))917 version: 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
920 '@types/pngjs':918 '@types/pngjs':
921 specifier: 6.0.5919 specifier: 6.0.5
922 version: 6.0.5920 version: 6.0.5
...@@ -1844,12 +1842,12 @@ packages:...@@ -1844,12 +1842,12 @@ packages:
1844 '@distilled.cloud/aws@0.30.2':1842 '@distilled.cloud/aws@0.30.2':
1845 resolution: {integrity: sha512-Uw2yZf7PJ2ienrKG49HN1ajnke65mTtHBUrSb/3ykeZ/8cLaSgwVhPscHxSzGByY0TEtYcYKNNmfUVISgGQl9g==}1843 resolution: {integrity: sha512-Uw2yZf7PJ2ienrKG49HN1ajnke65mTtHBUrSb/3ykeZ/8cLaSgwVhPscHxSzGByY0TEtYcYKNNmfUVISgGQl9g==}
1846 peerDependencies:1844 peerDependencies:
1847 effect: 4.0.0-beta.1021845 effect: 4.0.0-beta.103
18481846
1849 '@distilled.cloud/axiom@0.30.2':1847 '@distilled.cloud/axiom@0.30.2':
1850 resolution: {integrity: sha512-6g7tN/fKdMjnZYswlvwmLPeCqa2/jTsuOG7cSyUldhd6akxwWlMYqqDxwiOjgJfBZIOmcqSs5XVwiGMonZQTBw==}1848 resolution: {integrity: sha512-6g7tN/fKdMjnZYswlvwmLPeCqa2/jTsuOG7cSyUldhd6akxwWlMYqqDxwiOjgJfBZIOmcqSs5XVwiGMonZQTBw==}
1851 peerDependencies:1849 peerDependencies:
1852 effect: 4.0.0-beta.1021850 effect: 4.0.0-beta.103
18531851
1854 '@distilled.cloud/cloudflare-rolldown-plugin@0.13.10':1852 '@distilled.cloud/cloudflare-rolldown-plugin@0.13.10':
1855 resolution: {integrity: sha512-UO9wjepZWYupWMf/KYKY7LUueHNawdp0qBGc9z3XYxjodrQaMwFQWtIGG1yWOHjTWl1BUx86A69hyB8kHYRAeA==}1853 resolution: {integrity: sha512-UO9wjepZWYupWMf/KYKY7LUueHNawdp0qBGc9z3XYxjodrQaMwFQWtIGG1yWOHjTWl1BUx86A69hyB8kHYRAeA==}
...@@ -1866,9 +1864,9 @@ packages:...@@ -1866,9 +1864,9 @@ packages:
1866 resolution: {integrity: sha512-0mtI2rmxKiRcuZVXsQZfPnHWstUTCyPlg4q6EbxdImfiB4CCL2F56orGl9UhuBy+BPgO37wDgMe2GIpAHIUNWA==}1864 resolution: {integrity: sha512-0mtI2rmxKiRcuZVXsQZfPnHWstUTCyPlg4q6EbxdImfiB4CCL2F56orGl9UhuBy+BPgO37wDgMe2GIpAHIUNWA==}
1867 peerDependencies:1865 peerDependencies:
1868 '@distilled.cloud/cloudflare': ^0.29.01866 '@distilled.cloud/cloudflare': ^0.29.0
1869 '@effect/platform-bun': 4.0.0-beta.1021867 '@effect/platform-bun': 4.0.0-beta.103
1870 '@effect/platform-node': 4.0.0-beta.1021868 '@effect/platform-node': 4.0.0-beta.103
1871 effect: 4.0.0-beta.1021869 effect: 4.0.0-beta.103
1872 peerDependenciesMeta:1870 peerDependenciesMeta:
1873 '@effect/platform-bun':1871 '@effect/platform-bun':
1874 optional: true1872 optional: true
...@@ -1880,9 +1878,9 @@ packages:...@@ -1880,9 +1878,9 @@ packages:
1880 peerDependencies:1878 peerDependencies:
1881 '@distilled.cloud/cloudflare': ^0.29.01879 '@distilled.cloud/cloudflare': ^0.29.0
1882 '@distilled.cloud/cloudflare-runtime': 0.13.101880 '@distilled.cloud/cloudflare-runtime': 0.13.10
1883 '@effect/platform-bun': 4.0.0-beta.1021881 '@effect/platform-bun': 4.0.0-beta.103
1884 '@effect/platform-node': 4.0.0-beta.1021882 '@effect/platform-node': 4.0.0-beta.103
1885 effect: 4.0.0-beta.1021883 effect: 4.0.0-beta.103
1886 vite: ^7.0.0 || ^8.0.01884 vite: ^7.0.0 || ^8.0.0
1887 peerDependenciesMeta:1885 peerDependenciesMeta:
1888 '@effect/platform-bun':1886 '@effect/platform-bun':
...@@ -1893,22 +1891,22 @@ packages:...@@ -1893,22 +1891,22 @@ packages:
1893 '@distilled.cloud/cloudflare@0.30.2':1891 '@distilled.cloud/cloudflare@0.30.2':
1894 resolution: {integrity: sha512-bY0WAXL7Xw1mbo9twdXcaSCKL1rMi1o4aDzVwhnHASxe416oWvDARUo2/DPhQqN48r3q9BY2AyRAxRf65X6z0g==}1892 resolution: {integrity: sha512-bY0WAXL7Xw1mbo9twdXcaSCKL1rMi1o4aDzVwhnHASxe416oWvDARUo2/DPhQqN48r3q9BY2AyRAxRf65X6z0g==}
1895 peerDependencies:1893 peerDependencies:
1896 effect: 4.0.0-beta.1021894 effect: 4.0.0-beta.103
18971895
1898 '@distilled.cloud/core@0.30.2':1896 '@distilled.cloud/core@0.30.2':
1899 resolution: {integrity: sha512-7wurt9mk2Z3h0zJ00FAXD9ApSLoiBdjArctc9k706JPwzo6uhSJNkTwVMFdYM6V3m5186cY5C8ukzstrCRkJSw==}1897 resolution: {integrity: sha512-7wurt9mk2Z3h0zJ00FAXD9ApSLoiBdjArctc9k706JPwzo6uhSJNkTwVMFdYM6V3m5186cY5C8ukzstrCRkJSw==}
1900 peerDependencies:1898 peerDependencies:
1901 effect: 4.0.0-beta.1021899 effect: 4.0.0-beta.103
19021900
1903 '@distilled.cloud/neon@0.30.2':1901 '@distilled.cloud/neon@0.30.2':
1904 resolution: {integrity: sha512-mFNmN4sUGIa7WukCSmU1KQSDZKmByjGY5Neh05IiM4b38UaJ80zYws0ZKLVsM3NNpypwnwcibYv3RwXxfG4f/Q==}1902 resolution: {integrity: sha512-mFNmN4sUGIa7WukCSmU1KQSDZKmByjGY5Neh05IiM4b38UaJ80zYws0ZKLVsM3NNpypwnwcibYv3RwXxfG4f/Q==}
1905 peerDependencies:1903 peerDependencies:
1906 effect: 4.0.0-beta.1021904 effect: 4.0.0-beta.103
19071905
1908 '@distilled.cloud/planetscale@0.30.2':1906 '@distilled.cloud/planetscale@0.30.2':
1909 resolution: {integrity: sha512-Ph4lY6Ds8xC0l8ZDaEsX4E5oPCHqnDHb3RYKbOPeO8fjaXdZHWxn24gxCWpzSU+fVnkmdKy9ntflqxK2l+12rQ==}1907 resolution: {integrity: sha512-Ph4lY6Ds8xC0l8ZDaEsX4E5oPCHqnDHb3RYKbOPeO8fjaXdZHWxn24gxCWpzSU+fVnkmdKy9ntflqxK2l+12rQ==}
1910 peerDependencies:1908 peerDependencies:
1911 effect: 4.0.0-beta.1021909 effect: 4.0.0-beta.103
19121910
1913 '@dnd-kit/accessibility@3.1.1':1911 '@dnd-kit/accessibility@3.1.1':
1914 resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==}1912 resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==}
...@@ -1941,52 +1939,52 @@ packages:...@@ -1941,52 +1939,52 @@ packages:
1941 '@drizzle-team/brocli@0.12.0':1939 '@drizzle-team/brocli@0.12.0':
1942 resolution: {integrity: sha512-mlUE+rZ8CatQekLhnaiN91Iemdd+e2gFKooGlnRB3oPTL3VghLfX24dx7HrzMNeC1JrIB/0kpsfyty3f5HNfxQ==}1940 resolution: {integrity: sha512-mlUE+rZ8CatQekLhnaiN91Iemdd+e2gFKooGlnRB3oPTL3VghLfX24dx7HrzMNeC1JrIB/0kpsfyty3f5HNfxQ==}
19431941
1944 '@effect/atom-react@4.0.0-beta.102':1942 '@effect/atom-react@4.0.0-beta.103':
1945 resolution: {integrity: sha512-6SX11h7OFwje4YhxYUml9qGjBU8hvnEMrLWe3TKI3lEH/W6tkU/BzajC263eXkxM68h+BJNzE81Ipi5DTfEgug==}1943 resolution: {integrity: sha512-1HJ+Cyq4ssLnH2UZ8OVnhtMGAySabtzZo7imKC+vEfxOW3lvJYpGZeicxQX5Ii/7AdvlR+19p/6K2a5IPKYAow==}
1946 peerDependencies:1944 peerDependencies:
1947 effect: 4.0.0-beta.1021945 effect: 4.0.0-beta.103
1948 react: ^19.2.41946 react: ^19.2.4
1949 scheduler: '*'1947 scheduler: '*'
19501948
1951 '@effect/openapi-generator@4.0.0-beta.102':1949 '@effect/openapi-generator@4.0.0-beta.103':
1952 resolution: {integrity: sha512-LeUj+Z1J58+Xj1WtyhF/cpFIcTOEAHvcQe++Sh6b/o4tZPaC2UDb0144bOFjTNPgOBKcNb6FvVQXwPGV2wv3ZQ==}1950 resolution: {integrity: sha512-wWp3n0w9g7edprSue5xLB68Lu3PNdeW1n8girDmV2RKdmVKgrvY0+iIyzYqEMhVGOxc7P0g/ZtMWzaAnJAxbBA==}
1953 hasBin: true1951 hasBin: true
1954 peerDependencies:1952 peerDependencies:
1955 '@effect/platform-node': 4.0.0-beta.1021953 '@effect/platform-node': 4.0.0-beta.103
1956 effect: 4.0.0-beta.1021954 effect: 4.0.0-beta.103
19571955
1958 '@effect/platform-bun@4.0.0-beta.102':1956 '@effect/platform-bun@4.0.0-beta.103':
1959 resolution: {integrity: sha512-hTIb0jjTfXhNgnDq2OX5wrigc0OSvTT0VWWb1PLpMM395RJPu8rCIbTlGhy0NS7kZOd8FfgNi9e0sDhgyu+5Ag==}1957 resolution: {integrity: sha512-/ay1/lhE9FUKEiDRQs56463eJ9u9ivtUtOCi2eeqI8Aooau7PupKNtV5zKjoRBCLInZMAX7JezT46NW5AdACBQ==}
1960 peerDependencies:1958 peerDependencies:
1961 effect: 4.0.0-beta.1021959 effect: 4.0.0-beta.103
19621960
1963 '@effect/platform-node-shared@4.0.0-beta.102':1961 '@effect/platform-node-shared@4.0.0-beta.103':
1964 resolution: {integrity: sha512-gVd793I72MrkX4dXo7eYtRKfNj0RW4eMRfVEKEJI16h2+mBDCzQ+gqMrog2hSTHQnaIbvbYShNQ4TVGuRCYZeQ==}1962 resolution: {integrity: sha512-0aCZMBid5ifqmY55TkfCDLaGTIM8qu3bNFUW7qL9vh/7jFOkaIAMX2MA8muG4deqW17XWxawddWu4v0fK+UW3g==}
1965 engines: {node: '>=18.0.0'}1963 engines: {node: '>=18.0.0'}
1966 peerDependencies:1964 peerDependencies:
1967 effect: 4.0.0-beta.1021965 effect: 4.0.0-beta.103
19681966
1969 '@effect/platform-node@4.0.0-beta.102':1967 '@effect/platform-node@4.0.0-beta.103':
1970 resolution: {integrity: sha512-wYVAU9jAePT+gouMr/EVz1CaW6yDLjPAgXYeEFLz7wugT5iZhFRag6mqajV/wwN3bzWP2fzZHokLuPmqD/rqeA==}1968 resolution: {integrity: sha512-VD8fbpendwFokMwzC7/MxazjhEVDihPC5NZtomYEyZwGaA1LXMvwP1y8pfXwfshUkG56TN4EMQqzu72c0B9FhA==}
1971 engines: {node: '>=18.0.0'}1969 engines: {node: '>=18.0.0'}
1972 peerDependencies:1970 peerDependencies:
1973 effect: 4.0.0-beta.1021971 effect: 4.0.0-beta.103
1974 ioredis: ^5.7.01972 ioredis: ^5.7.0
19751973
1976 '@effect/sql-d1@4.0.0-beta.101':1974 '@effect/sql-d1@4.0.0-beta.101':
1977 resolution: {integrity: sha512-4M/2lm7y1M1Fg1fCc31BTtU3p8lK0jHUlPGqIiJ97pOSXZJrlv21087VVLbJ/1i4svuSUshnShDsce9ZwZKsOQ==}1975 resolution: {integrity: sha512-4M/2lm7y1M1Fg1fCc31BTtU3p8lK0jHUlPGqIiJ97pOSXZJrlv21087VVLbJ/1i4svuSUshnShDsce9ZwZKsOQ==}
1978 peerDependencies:1976 peerDependencies:
1979 effect: 4.0.0-beta.1021977 effect: 4.0.0-beta.103
19801978
1981 '@effect/sql-pg@4.0.0-beta.102':1979 '@effect/sql-pg@4.0.0-beta.103':
1982 resolution: {integrity: sha512-02a+fNfECWCZIZcgHl7OLQN2jZj42gq90EdwdnvR3KA6GLGypY02swABS4zFtaW9H80rTa0ukqVnTdcO/DT5GQ==}1980 resolution: {integrity: sha512-jzlTFtFaaoOmT87rQMKUBhkFeIQQwDKtlB+MOYn1jIPssLvXZVnMqo9GahCjsNcXVlB6QGBkUgD1HCA6+tJvBw==}
1983 peerDependencies:1981 peerDependencies:
1984 effect: 4.0.0-beta.1021982 effect: 4.0.0-beta.103
19851983
1986 '@effect/sql-sqlite-bun@4.0.0-beta.102':1984 '@effect/sql-sqlite-bun@4.0.0-beta.103':
1987 resolution: {integrity: sha512-pBO6FBJ+a21j2qHmzJDK1DeJsxm7HpUQBgucw6prHQXLMUBkhOsfZofhw1FKEdGRDEhO0sGTjffa2KP7iOuDIg==}1985 resolution: {integrity: sha512-u10I6SEWgUc1sKrlT0luxOBNzlUXunzxCChrD75pK5khIN1baKlPn2DD3f7bkh20NxwSzOfxF3hWsrO4VktvNg==}
1988 peerDependencies:1986 peerDependencies:
1989 effect: 4.0.0-beta.1021987 effect: 4.0.0-beta.103
19901988
1991 '@effect/tsgo-darwin-arm64@0.13.2':1989 '@effect/tsgo-darwin-arm64@0.13.2':
1992 resolution: {integrity: sha512-AlYlxU2sD3urNCmNCQWtatPJS/+m2r3CvgZdDTs9KEz2YcyQc2GV1g2RWFkoMwmgzYBx69DBLu1oscqJO2qAog==}1990 resolution: {integrity: sha512-AlYlxU2sD3urNCmNCQWtatPJS/+m2r3CvgZdDTs9KEz2YcyQc2GV1g2RWFkoMwmgzYBx69DBLu1oscqJO2qAog==}
...@@ -2027,10 +2025,10 @@ packages:...@@ -2027,10 +2025,10 @@ packages:
2027 resolution: {integrity: sha512-zPQMHBdCN1k7Jbxjxq0HVAbzsZd+LAoRPzBEZ3F4y/uxNK0K/XGvFXUUw/CUAsD6rhUtC2VahZY1tp0owb5lgg==}2025 resolution: {integrity: sha512-zPQMHBdCN1k7Jbxjxq0HVAbzsZd+LAoRPzBEZ3F4y/uxNK0K/XGvFXUUw/CUAsD6rhUtC2VahZY1tp0owb5lgg==}
2028 hasBin: true2026 hasBin: true
20292027
2030 '@effect/vitest@4.0.0-beta.102':2028 '@effect/vitest@4.0.0-beta.103':
2031 resolution: {integrity: sha512-4dipFAYG6imOzrY3zy3BgzCJkbb9xESyzUef0WSx8bsK0/SpITqbJpdwKeOyDWLZ+rimjua8IbTFMAde865pIQ==}2029 resolution: {integrity: sha512-Kz3gemVuJNAZ3e4V6A7BwAP87x2Av8LyHOlCjy9jbZzlncwJXO7Olk1Sje3hdKaet3wEl51A/0/89xJ2IYSgNg==}
2032 peerDependencies:2030 peerDependencies:
2033 effect: 4.0.0-beta.1022031 effect: 4.0.0-beta.103
20342032
2035 '@egjs/hammerjs@2.0.17':2033 '@egjs/hammerjs@2.0.17':
2036 resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==}2034 resolution: {integrity: sha512-XQsZgjm2EcVUiZQf11UBJQfmZeEmOW8DpI1gsFeln6w0ae0ii4dMQEQ0kjl6DspdWX1aGY1/loyXnP0JS06e/A==}
...@@ -5295,12 +5293,12 @@ packages:...@@ -5295,12 +5293,12 @@ packages:
5295 hasBin: true5293 hasBin: true
5296 peerDependencies:5294 peerDependencies:
5297 '@aws/durable-execution-sdk-js': ^2.1.05295 '@aws/durable-execution-sdk-js': ^2.1.0
5298 '@effect/platform-bun': 4.0.0-beta.1025296 '@effect/platform-bun': 4.0.0-beta.103
5299 '@effect/platform-node': 4.0.0-beta.1025297 '@effect/platform-node': 4.0.0-beta.103
5300 '@effect/sql-pg': 4.0.0-beta.1025298 '@effect/sql-pg': 4.0.0-beta.103
5301 drizzle-kit: 1.0.0-rc.45299 drizzle-kit: 1.0.0-rc.4
5302 drizzle-orm: 1.0.0-rc.45300 drizzle-orm: 1.0.0-rc.4
5303 effect: 4.0.0-beta.1025301 effect: 4.0.0-beta.103
5304 vite: ^8.0.75302 vite: ^8.0.7
5305 ws: ^8.20.05303 ws: ^8.20.0
5306 peerDependenciesMeta:5304 peerDependenciesMeta:
...@@ -6160,9 +6158,9 @@ packages:...@@ -6160,9 +6158,9 @@ packages:
6160 '@effect/sql-d1': '>=4.0.0-beta.83 || >=4.0.0'6158 '@effect/sql-d1': '>=4.0.0-beta.83 || >=4.0.0'
6161 '@effect/sql-libsql': '>=4.0.0-beta.83 || >=4.0.0'6159 '@effect/sql-libsql': '>=4.0.0-beta.83 || >=4.0.0'
6162 '@effect/sql-mysql2': '>=4.0.0-beta.83 || >=4.0.0'6160 '@effect/sql-mysql2': '>=4.0.0-beta.83 || >=4.0.0'
6163 '@effect/sql-pg': 4.0.0-beta.1026161 '@effect/sql-pg': 4.0.0-beta.103
6164 '@effect/sql-pglite': '>=4.0.0-beta.83 || >=4.0.0'6162 '@effect/sql-pglite': '>=4.0.0-beta.83 || >=4.0.0'
6165 '@effect/sql-sqlite-bun': 4.0.0-beta.1026163 '@effect/sql-sqlite-bun': 4.0.0-beta.103
6166 '@effect/sql-sqlite-do': '>=4.0.0-beta.83 || >=4.0.0'6164 '@effect/sql-sqlite-do': '>=4.0.0-beta.83 || >=4.0.0'
6167 '@effect/sql-sqlite-node': '>=4.0.0-beta.83 || >=4.0.0'6165 '@effect/sql-sqlite-node': '>=4.0.0-beta.83 || >=4.0.0'
6168 '@effect/sql-sqlite-wasm': '>=4.0.0-beta.83 || >=4.0.0'6166 '@effect/sql-sqlite-wasm': '>=4.0.0-beta.83 || >=4.0.0'
...@@ -6191,7 +6189,7 @@ packages:...@@ -6191,7 +6189,7 @@ packages:
6191 arktype: '>=2.0.0'6189 arktype: '>=2.0.0'
6192 better-sqlite3: '>=9.3.0'6190 better-sqlite3: '>=9.3.0'
6193 bun-types: '*'6191 bun-types: '*'
6194 effect: 4.0.0-beta.1026192 effect: 4.0.0-beta.103
6195 expo-sqlite: '>=14.0.0'6193 expo-sqlite: '>=14.0.0'
6196 mssql: ^11.0.16194 mssql: ^11.0.1
6197 mysql2: '>=2'6195 mysql2: '>=2'
...@@ -6312,8 +6310,8 @@ packages:...@@ -6312,8 +6310,8 @@ packages:
6312 ee-first@1.1.1:6310 ee-first@1.1.1:
6313 resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}6311 resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
63146312
6315 effect@4.0.0-beta.102:6313 effect@4.0.0-beta.103:
6316 resolution: {integrity: sha512-z8Y+Q76Hh/kjLFZrXu8tGn6e+tDsg45R+UHhxd190pXxD53OGwf/G/zDxXTkse4HJ5mobNZfitLfUCp4fMvu6w==}6314 resolution: {integrity: sha512-pE8TxF4m2tQzVI+77dIlm3s+81TACV1AiX1JEkvY+zVuxgQQ8aGSkqXNJF6b/ST+coCSk5cUdbULpQ7sm4oHyw==}
63176315
6318 ejs@3.1.10:6316 ejs@3.1.10:
6319 resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==}6317 resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==}
...@@ -8610,9 +8608,6 @@ packages:...@@ -8610,9 +8608,6 @@ packages:
8610 pg-cloudflare@1.4.0:8608 pg-cloudflare@1.4.0:
8611 resolution: {integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==}8609 resolution: {integrity: sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A==}
86128610
8613 pg-connection-string@2.13.0:
8614 resolution: {integrity: sha512-EMnU9E2fSULdsbErBbMaXJvFeD9B4+nPcM3f+4lsiCR0BHLPrLVjv3DbyM2hgQQviKJaTWIRRTjKjWlHg3p2ig==}
8615
8616 pg-connection-string@2.14.0:8611 pg-connection-string@2.14.0:
8617 resolution: {integrity: sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==}8612 resolution: {integrity: sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg==}
86188613
...@@ -11657,24 +11652,24 @@ snapshots:...@@ -11657,24 +11652,24 @@ snapshots:
1165711652
11658 '@cloudflare/workers-types@5.20260726.1': {}11653 '@cloudflare/workers-types@5.20260726.1': {}
1165911654
11660 '@distilled.cloud/aws@0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))':11655 '@distilled.cloud/aws@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))':
11661 dependencies:11656 dependencies:
11662 '@aws-crypto/crc32': 5.2.011657 '@aws-crypto/crc32': 5.2.0
11663 '@aws-crypto/util': 5.2.011658 '@aws-crypto/util': 5.2.0
11664 '@aws-sdk/credential-providers': 3.1062.011659 '@aws-sdk/credential-providers': 3.1062.0
11665 '@aws-sdk/types': 3.973.1011660 '@aws-sdk/types': 3.973.10
11666 '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))11661 '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
11667 '@smithy/shared-ini-file-loader': 4.5.611662 '@smithy/shared-ini-file-loader': 4.5.6
11668 '@smithy/types': 4.14.311663 '@smithy/types': 4.14.3
11669 '@smithy/util-base64': 4.4.611664 '@smithy/util-base64': 4.4.6
11670 aws4fetch: 1.0.2011665 aws4fetch: 1.0.20
11671 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11666 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
11672 fast-xml-parser: 5.8.011667 fast-xml-parser: 5.8.0
1167311668
11674 '@distilled.cloud/axiom@0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))':11669 '@distilled.cloud/axiom@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))':
11675 dependencies:11670 dependencies:
11676 '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))11671 '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
11677 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11672 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
1167811673
11679 '@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)':11674 '@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)':
11680 dependencies:11675 dependencies:
...@@ -11687,48 +11682,48 @@ snapshots:...@@ -11687,48 +11682,48 @@ snapshots:
11687 transitivePeerDependencies:11682 transitivePeerDependencies:
11688 - workerd11683 - workerd
1168911684
11690 '@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))':11685 '@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))':
11691 dependencies:11686 dependencies:
11692 '@alchemy.run/node-utils': 0.0.511687 '@alchemy.run/node-utils': 0.0.5
11693 '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))11688 '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
11694 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11689 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
11695 workerd: 1.20260704.111690 workerd: 1.20260704.1
11696 optionalDependencies:11691 optionalDependencies:
11697 '@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)11692 '@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)
11698 '@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)11693 '@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)
1169911694
11700 '@distilled.cloud/cloudflare-vite-plugin@0.13.10(554b80dcfb9268a9eeb72fedc0ae62a5)':11695 '@distilled.cloud/cloudflare-vite-plugin@0.13.10(8bf551e378e9cbc11f8bf1003fbc14a8)':
11701 dependencies:11696 dependencies:
11702 '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))11697 '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
11703 '@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)11698 '@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)
11704 '@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))11699 '@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))
11705 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11700 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
11706 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)'11701 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)'
11707 optionalDependencies:11702 optionalDependencies:
11708 '@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)11703 '@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)
11709 '@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)11704 '@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)
11710 transitivePeerDependencies:11705 transitivePeerDependencies:
11711 - rolldown11706 - rolldown
11712 - workerd11707 - workerd
1171311708
11714 '@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))':11709 '@distilled.cloud/cloudflare@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))':
11715 dependencies:11710 dependencies:
11716 '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))11711 '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
11717 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11712 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
1171811713
11719 '@distilled.cloud/core@0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))':11714 '@distilled.cloud/core@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))':
11720 dependencies:11715 dependencies:
11721 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11716 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
1172211717
11723 '@distilled.cloud/neon@0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))':11718 '@distilled.cloud/neon@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))':
11724 dependencies:11719 dependencies:
11725 '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))11720 '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
11726 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11721 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
1172711722
11728 '@distilled.cloud/planetscale@0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))':11723 '@distilled.cloud/planetscale@0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))':
11729 dependencies:11724 dependencies:
11730 '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))11725 '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
11731 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11726 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
1173211727
11733 '@dnd-kit/accessibility@3.1.1(react@19.2.6)':11728 '@dnd-kit/accessibility@3.1.1(react@19.2.6)':
11734 dependencies:11729 dependencies:
...@@ -11764,47 +11759,47 @@ snapshots:...@@ -11764,47 +11759,47 @@ snapshots:
1176411759
11765 '@drizzle-team/brocli@0.12.0': {}11760 '@drizzle-team/brocli@0.12.0': {}
1176611761
11767 '@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)':11762 '@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)':
11768 dependencies:11763 dependencies:
11769 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11764 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
11770 react: 19.2.311765 react: 19.2.3
11771 scheduler: 0.27.011766 scheduler: 0.27.0
1177211767
11773 '@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)':11768 '@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)':
11774 dependencies:11769 dependencies:
11775 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11770 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
11776 react: 19.2.611771 react: 19.2.6
11777 scheduler: 0.27.011772 scheduler: 0.27.0
1177811773
11779 '@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))':11774 '@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))':
11780 dependencies:11775 dependencies:
11781 '@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)11776 '@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)
11782 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11777 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
11783 swagger2openapi: 7.0.811778 swagger2openapi: 7.0.8
11784 transitivePeerDependencies:11779 transitivePeerDependencies:
11785 - encoding11780 - encoding
1178611781
11787 '@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)':11782 '@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)':
11788 dependencies:11783 dependencies:
11789 '@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)11784 '@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)
11790 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11785 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
11791 transitivePeerDependencies:11786 transitivePeerDependencies:
11792 - bufferutil11787 - bufferutil
11793 - utf-8-validate11788 - utf-8-validate
1179411789
11795 '@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)':11790 '@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)':
11796 dependencies:11791 dependencies:
11797 '@types/ws': 8.18.111792 '@types/ws': 8.18.1
11798 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11793 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
11799 ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)11794 ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
11800 transitivePeerDependencies:11795 transitivePeerDependencies:
11801 - bufferutil11796 - bufferutil
11802 - utf-8-validate11797 - utf-8-validate
1180311798
11804 '@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)':11799 '@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)':
11805 dependencies:11800 dependencies:
11806 '@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)11801 '@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)
11807 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11802 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
11808 ioredis: 5.11.011803 ioredis: 5.11.0
11809 mime: 4.1.011804 mime: 4.1.0
11810 undici: 8.9.011805 undici: 8.9.0
...@@ -11812,14 +11807,14 @@ snapshots:...@@ -11812,14 +11807,14 @@ snapshots:
11812 - bufferutil11807 - bufferutil
11813 - utf-8-validate11808 - utf-8-validate
1181411809
11815 '@effect/sql-d1@4.0.0-beta.101(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))':11810 '@effect/sql-d1@4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))':
11816 dependencies:11811 dependencies:
11817 '@cloudflare/workers-types': 5.20260726.111812 '@cloudflare/workers-types': 5.20260726.1
11818 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11813 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
1181911814
11820 '@effect/sql-pg@4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))':11815 '@effect/sql-pg@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))':
11821 dependencies:11816 dependencies:
11822 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11817 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
11823 pg: 8.22.011818 pg: 8.22.0
11824 pg-connection-string: 2.14.011819 pg-connection-string: 2.14.0
11825 pg-cursor: 2.21.0(pg@8.22.0)11820 pg-cursor: 2.21.0(pg@8.22.0)
...@@ -11828,9 +11823,9 @@ snapshots:...@@ -11828,9 +11823,9 @@ snapshots:
11828 transitivePeerDependencies:11823 transitivePeerDependencies:
11829 - pg-native11824 - pg-native
1183011825
11831 '@effect/sql-sqlite-bun@4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))':11826 '@effect/sql-sqlite-bun@4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))':
11832 dependencies:11827 dependencies:
11833 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11828 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
1183411829
11835 '@effect/tsgo-darwin-arm64@0.13.2':11830 '@effect/tsgo-darwin-arm64@0.13.2':
11836 optional: true11831 optional: true
...@@ -11863,9 +11858,9 @@ snapshots:...@@ -11863,9 +11858,9 @@ snapshots:
11863 '@effect/tsgo-win32-arm64': 0.13.211858 '@effect/tsgo-win32-arm64': 0.13.2
11864 '@effect/tsgo-win32-x64': 0.13.211859 '@effect/tsgo-win32-x64': 0.13.2
1186511860
11866 '@effect/vitest@4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))':11861 '@effect/vitest@4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))':
11867 dependencies:11862 dependencies:
11868 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)11863 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
1186911864
11870 '@egjs/hammerjs@2.0.17':11865 '@egjs/hammerjs@2.0.17':
11871 dependencies:11866 dependencies:
...@@ -15371,22 +15366,22 @@ snapshots:...@@ -15371,22 +15366,22 @@ snapshots:
15371 json-schema-traverse: 1.0.015366 json-schema-traverse: 1.0.0
15372 require-from-string: 2.0.215367 require-from-string: 2.0.2
1537315368
15374 alchemy@2.0.0-beta.65(249551d75ad3792c0b22cd2754b25266):15369 alchemy@2.0.0-beta.65(a455401069e1fee89f31a277c51247f6):
15375 dependencies:15370 dependencies:
15376 '@alchemy.run/node-utils': 0.0.515371 '@alchemy.run/node-utils': 0.0.5
15377 '@aws-sdk/credential-providers': 3.1062.015372 '@aws-sdk/credential-providers': 3.1062.0
15378 '@clack/prompts': 0.11.015373 '@clack/prompts': 0.11.0
15379 '@distilled.cloud/aws': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))15374 '@distilled.cloud/aws': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
15380 '@distilled.cloud/axiom': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))15375 '@distilled.cloud/axiom': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
15381 '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))15376 '@distilled.cloud/cloudflare': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
15382 '@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)15377 '@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)
15383 '@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))15378 '@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))
15384 '@distilled.cloud/cloudflare-vite-plugin': 0.13.10(554b80dcfb9268a9eeb72fedc0ae62a5)15379 '@distilled.cloud/cloudflare-vite-plugin': 0.13.10(8bf551e378e9cbc11f8bf1003fbc14a8)
15385 '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))15380 '@distilled.cloud/core': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
15386 '@distilled.cloud/neon': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))15381 '@distilled.cloud/neon': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
15387 '@distilled.cloud/planetscale': 0.30.2(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))15382 '@distilled.cloud/planetscale': 0.30.2(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
15388 '@effect/sql-d1': 4.0.0-beta.101(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))15383 '@effect/sql-d1': 4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
15389 '@effect/vitest': 4.0.0-beta.102(patch_hash=a607339aab944136a084a05f159aa0f5a69776934d4b835dab8f9992f1c13425)(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))15384 '@effect/vitest': 4.0.0-beta.103(patch_hash=a16b1e870d8c29e4a98b17cc4c638a4ff471753d8ca3487f78a22b759caf951b)(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
15390 '@libsql/client': 0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)15385 '@libsql/client': 0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
15391 '@octokit/rest': 22.0.115386 '@octokit/rest': 22.0.1
15392 '@octokit/webhooks': 14.2.015387 '@octokit/webhooks': 14.2.0
...@@ -15396,7 +15391,7 @@ snapshots:...@@ -15396,7 +15391,7 @@ snapshots:
15396 '@types/aws-lambda': 8.10.16115391 '@types/aws-lambda': 8.10.161
15397 aws4fetch: 1.0.2015392 aws4fetch: 1.0.20
15398 capnweb: 0.6.115393 capnweb: 0.6.1
15399 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)15394 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
15400 fast-glob: 3.3.315395 fast-glob: 3.3.3
15401 fast-xml-parser: 5.8.015396 fast-xml-parser: 5.8.0
15402 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)15397 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:...@@ -15412,11 +15407,11 @@ snapshots:
15412 undici: 7.27.115407 undici: 7.27.1
15413 yaml: 2.9.015408 yaml: 2.9.0
15414 optionalDependencies:15409 optionalDependencies:
15415 '@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)15410 '@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)
15416 '@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)15411 '@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)
15417 '@effect/sql-pg': 4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))15412 '@effect/sql-pg': 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
15418 drizzle-kit: 1.0.0-rc.415413 drizzle-kit: 1.0.0-rc.4
15419 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)15414 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)
15420 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)'15415 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)'
15421 ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)15416 ws: 8.21.0(bufferutil@4.1.0)(utf-8-validate@6.0.6)
15422 transitivePeerDependencies:15417 transitivePeerDependencies:
...@@ -16439,15 +16434,15 @@ snapshots:...@@ -16439,15 +16434,15 @@ snapshots:
16439 get-tsconfig: 4.14.016434 get-tsconfig: 4.14.0
16440 jiti: 2.7.016435 jiti: 2.7.0
1644116436
16442 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):16437 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):
16443 optionalDependencies:16438 optionalDependencies:
16444 '@cloudflare/workers-types': 4.20260604.116439 '@cloudflare/workers-types': 4.20260604.1
16445 '@effect/sql-d1': 4.0.0-beta.101(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))16440 '@effect/sql-d1': 4.0.0-beta.101(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
16446 '@effect/sql-pg': 4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))16441 '@effect/sql-pg': 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
16447 '@effect/sql-sqlite-bun': 4.0.0-beta.102(effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488))16442 '@effect/sql-sqlite-bun': 4.0.0-beta.103(effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9))
16448 '@libsql/client': 0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)16443 '@libsql/client': 0.17.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
16449 bun-types: 1.3.1416444 bun-types: 1.3.14
16450 effect: 4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488)16445 effect: 4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9)
16451 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)16446 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)
16452 mysql2: 3.22.4(@types/node@24.12.4)16447 mysql2: 3.22.4(@types/node@24.12.4)
16453 pg: 8.21.016448 pg: 8.21.0
...@@ -16467,7 +16462,7 @@ snapshots:...@@ -16467,7 +16462,7 @@ snapshots:
1646716462
16468 ee-first@1.1.1: {}16463 ee-first@1.1.1: {}
1646916464
16470 effect@4.0.0-beta.102(patch_hash=71215759e1ac0a7f65d7b75d816986687ae6c3a6cba02d928d184ca71790d488):16465 effect@4.0.0-beta.103(patch_hash=a18f963109656ddbeb2a99ca45f942ecf54830986259eb01ce6a970421c9c6a9):
16471 dependencies:16466 dependencies:
16472 '@standard-schema/spec': 1.1.016467 '@standard-schema/spec': 1.1.0
16473 fast-check: 4.9.016468 fast-check: 4.9.0
...@@ -19487,8 +19482,6 @@ snapshots:...@@ -19487,8 +19482,6 @@ snapshots:
19487 pg-cloudflare@1.4.0:19482 pg-cloudflare@1.4.0:
19488 optional: true19483 optional: true
1948919484
19490 pg-connection-string@2.13.0: {}
19491
19492 pg-connection-string@2.14.0: {}19485 pg-connection-string@2.14.0: {}
1949319486
19494 pg-cursor@2.21.0(pg@8.22.0):19487 pg-cursor@2.21.0(pg@8.22.0):
...@@ -19531,7 +19524,7 @@ snapshots:...@@ -19531,7 +19524,7 @@ snapshots:
1953119524
19532 pg@8.21.0:19525 pg@8.21.0:
19533 dependencies:19526 dependencies:
19534 pg-connection-string: 2.13.019527 pg-connection-string: 2.14.0
19535 pg-pool: 3.14.0(pg@8.21.0)19528 pg-pool: 3.14.0(pg@8.21.0)
19536 pg-protocol: 1.14.019529 pg-protocol: 1.14.0
19537 pg-types: 2.2.019530 pg-types: 2.2.0
pnpm-workspace.yaml+20-22
...@@ -30,21 +30,21 @@ catalog:...@@ -30,21 +30,21 @@ catalog:
30 "@clerk/expo": 4.1.230 "@clerk/expo": 4.1.2
31 "@clerk/react": 6.12.931 "@clerk/react": 6.12.9
32 "@clerk/shared": 4.25.932 "@clerk/shared": 4.25.9
33 "@effect/atom-react": 4.0.0-beta.10233 "@effect/atom-react": 4.0.0-beta.103
34 "@effect/openapi-generator": 4.0.0-beta.10234 "@effect/openapi-generator": 4.0.0-beta.103
35 "@effect/platform-bun": 4.0.0-beta.10235 "@effect/platform-bun": 4.0.0-beta.103
36 "@effect/platform-node": 4.0.0-beta.10236 "@effect/platform-node": 4.0.0-beta.103
37 "@effect/platform-node-shared": 4.0.0-beta.10237 "@effect/platform-node-shared": 4.0.0-beta.103
38 "@effect/sql-pg": 4.0.0-beta.10238 "@effect/sql-pg": 4.0.0-beta.103
39 "@effect/sql-sqlite-bun": 4.0.0-beta.10239 "@effect/sql-sqlite-bun": 4.0.0-beta.103
40 "@effect/tsgo": 0.13.240 "@effect/tsgo": 0.13.2
41 "@effect/vitest": 4.0.0-beta.10241 "@effect/vitest": 4.0.0-beta.103
42 "@noble/curves": 1.9.142 "@noble/curves": 1.9.1
43 "@noble/hashes": 1.8.043 "@noble/hashes": 1.8.0
44 "@pierre/diffs": 1.3.0-beta.1044 "@pierre/diffs": 1.3.0-beta.10
45 "@types/node": 24.12.445 "@types/node": 24.12.4
46 "@typescript/native-preview": 7.0.0-dev.20260604.146 "@typescript/native-preview": 7.0.0-dev.20260604.1
47 effect: 4.0.0-beta.10247 effect: 4.0.0-beta.103
48 jose: 6.2.248 jose: 6.2.2
49 typescript: ~6.0.349 typescript: ~6.0.3
50 vite: npm:@voidzero-dev/vite-plus-core@0.2.250 vite: npm:@voidzero-dev/vite-plus-core@0.2.2
...@@ -64,16 +64,16 @@ minimumReleaseAgeExclude:...@@ -64,16 +64,16 @@ minimumReleaseAgeExclude:
64 - "@distilled.cloud/core@0.30.2"64 - "@distilled.cloud/core@0.30.2"
65 - "@distilled.cloud/neon@0.30.2"65 - "@distilled.cloud/neon@0.30.2"
66 - "@distilled.cloud/planetscale@0.30.2"66 - "@distilled.cloud/planetscale@0.30.2"
67 - "@effect/atom-react@4.0.0-beta.102"67 - "@effect/atom-react@4.0.0-beta.103"
68 - "@effect/openapi-generator@4.0.0-beta.102"68 - "@effect/openapi-generator@4.0.0-beta.103"
69 - "@effect/platform-bun@4.0.0-beta.102"69 - "@effect/platform-bun@4.0.0-beta.103"
70 - "@effect/platform-node-shared@4.0.0-beta.102"70 - "@effect/platform-node-shared@4.0.0-beta.103"
71 - "@effect/platform-node@4.0.0-beta.102"71 - "@effect/platform-node@4.0.0-beta.103"
72 - "@effect/sql-pg@4.0.0-beta.102"72 - "@effect/sql-pg@4.0.0-beta.103"
73 - "@effect/sql-sqlite-bun@4.0.0-beta.102"73 - "@effect/sql-sqlite-bun@4.0.0-beta.103"
74 - "@effect/vitest@4.0.0-beta.102"74 - "@effect/vitest@4.0.0-beta.103"
75 - alchemy@2.0.0-beta.6575 - alchemy@2.0.0-beta.65
76 - effect@4.0.0-beta.10276 - effect@4.0.0-beta.103
7777
78overrides:78overrides:
79 "@clerk/backend": "catalog:"79 "@clerk/backend": "catalog:"
...@@ -122,16 +122,14 @@ packageExtensions:...@@ -122,16 +122,14 @@ packageExtensions:
122 vite: "catalog:"122 vite: "catalog:"
123123
124patchedDependencies:124patchedDependencies:
125 "@effect/platform-bun@4.0.0-beta.102": patches/@effect__platform-bun@4.0.0-beta.102.patch125 "@effect/vitest@4.0.0-beta.103": patches/@effect__vitest@4.0.0-beta.103.patch
126 "@effect/platform-node@4.0.0-beta.102": patches/@effect__platform-node@4.0.0-beta.102.patch
127 "@effect/vitest@4.0.0-beta.102": patches/@effect__vitest@4.0.0-beta.102.patch
128 "@expo/metro-config@56.0.14": patches/@expo%2Fmetro-config@56.0.14.patch126 "@expo/metro-config@56.0.14": patches/@expo%2Fmetro-config@56.0.14.patch
129 "@ff-labs/fff-node@0.9.4": patches/@ff-labs__fff-node@0.9.4.patch127 "@ff-labs/fff-node@0.9.4": patches/@ff-labs__fff-node@0.9.4.patch
130 "@legendapp/list@3.3.3": patches/@legendapp__list@3.3.3.patch128 "@legendapp/list@3.3.3": patches/@legendapp__list@3.3.3.patch
131 "@pierre/diffs@1.3.0-beta.10": patches/@pierre%2Fdiffs@1.3.0-beta.10.patch129 "@pierre/diffs@1.3.0-beta.10": patches/@pierre%2Fdiffs@1.3.0-beta.10.patch
132 "@react-native-menu/menu@2.0.0": patches/@react-native-menu__menu@2.0.0.patch130 "@react-native-menu/menu@2.0.0": patches/@react-native-menu__menu@2.0.0.patch
133 "@react-navigation/native-stack@7.17.6": patches/@react-navigation%2Fnative-stack@7.17.6.patch131 "@react-navigation/native-stack@7.17.6": patches/@react-navigation%2Fnative-stack@7.17.6.patch
134 effect@4.0.0-beta.102: patches/effect@4.0.0-beta.102.patch132 effect@4.0.0-beta.103: patches/effect@4.0.0-beta.103.patch
135 expo-modules-jsi@56.0.10: patches/expo-modules-jsi@56.0.10.patch133 expo-modules-jsi@56.0.10: patches/expo-modules-jsi@56.0.10.patch
136 react-native-gesture-handler@2.31.2: patches/react-native-gesture-handler@2.31.2.patch134 react-native-gesture-handler@2.31.2: patches/react-native-gesture-handler@2.31.2.patch
137 react-native-keyboard-controller@1.21.13: patches/react-native-keyboard-controller@1.21.13.patch135 react-native-keyboard-controller@1.21.13: patches/react-native-keyboard-controller@1.21.13.patch
scripts/build-desktop-artifact.ts+1-1
...@@ -67,7 +67,7 @@ type StageWorkspaceConfig = typeof StageWorkspaceConfig.Type;...@@ -67,7 +67,7 @@ type StageWorkspaceConfig = typeof StageWorkspaceConfig.Type;
67const RepoRoot = Effect.service(Path.Path).pipe(67const RepoRoot = Effect.service(Path.Path).pipe(
68 Effect.flatMap((path) => path.fromFileUrl(new URL("..", import.meta.url))),68 Effect.flatMap((path) => path.fromFileUrl(new URL("..", import.meta.url))),
69);69);
70const encodeJsonString = Schema.encodeEffect(Schema.UnknownFromJsonString);70const encodeJsonString = Schema.encodeEffect(Schema.fromJsonString(Schema.Unknown));
71const decodeWorkspaceConfig = Schema.decodeEffect(fromYaml(WorkspaceConfig));71const decodeWorkspaceConfig = Schema.decodeEffect(fromYaml(WorkspaceConfig));
72const decodeNodePtyManifest = Schema.decodeUnknownEffect(72const decodeNodePtyManifest = Schema.decodeUnknownEffect(
73 Schema.fromJsonString(Schema.Struct({ version: Schema.String })),73 Schema.fromJsonString(Schema.Struct({ version: Schema.String })),
scripts/sync-reference-repos.ts+1-1
...@@ -100,7 +100,7 @@ export const ReferenceRepoSyncError = Schema.Union([...@@ -100,7 +100,7 @@ export const ReferenceRepoSyncError = Schema.Union([
100export type ReferenceRepoSyncError = typeof ReferenceRepoSyncError.Type;100export type ReferenceRepoSyncError = typeof ReferenceRepoSyncError.Type;
101export const isReferenceRepoSyncError = Schema.is(ReferenceRepoSyncError);101export const isReferenceRepoSyncError = Schema.is(ReferenceRepoSyncError);
102102
103const decodeJsonSource = Schema.decodeUnknownEffect(Schema.UnknownFromJsonString);103const decodeJsonSource = Schema.decodeUnknownEffect(Schema.fromJsonString(Schema.Unknown));
104const decodeYamlSource = Schema.decodeEffect(fromYaml(Schema.Unknown));104const decodeYamlSource = Schema.decodeEffect(fromYaml(Schema.Unknown));
105105
106const collectStreamAsString = <E>(stream: Stream.Stream<Uint8Array, E>): Effect.Effect<string, E> =>106const collectStreamAsString = <E>(stream: Stream.Stream<Uint8Array, E>): Effect.Effect<string, E> =>