NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
npm · #2106 most downloaded on npm
The missing standard library for TypeScript, for writing production-grade software.
Last release 4 days ago
01 Oct 2026
Ships on a steady schedule
a new release about every 9 days
Rarely documented
notes for 2 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
4 years old
485 releases · first in 2022
One column per quarter.
APIs tagged @stability unstable may have breaking changes in minor releases. APIs without a stability tag follow semver.
#8633 2c552f2 Thanks @IMax153! - Effect 4.0 is the first stable release of Effect v4. It replaces the 4.0.0 beta and release-candidate series, whose per-release notes remain below under the 4.0.0-beta.* and 4.0.0-rc.* headings. To upgrade from Effect 3, follow the migration guide.
Packaging and versioning
effect and every @effect/* package.@effect/platform, @effect/rpc, @effect/cluster, @effect/cli, @effect/ai, @effect/sql, @effect/workflow, @effect/experimental and similar packages are merged into effect. Separate packages remain only for platforms (@effect/platform-*), SQL drivers (@effect/sql-*), AI providers (@effect/ai-*), framework bindings (@effect/atom-*), OpenTelemetry, Vitest and tooling.effect/http, effect/http-api, effect/rpc, effect/cluster, effect/workflow, effect/ai, effect/cli, effect/sql and effect/schema import from effect/<area>. APIs tagged @stability unstable may have breaking changes in minor releases. APIs without a stability tag follow semver.@stability unstable, because that dependency's releases can change them. This covers NodeRedis, DenoRedis, BunRedis, @effect/platform-node/Undici and the undici dispatcher APIs, the ws options and re-exports in the platform packages, driver-specific options and clients in @effect/sql-clickhouse, @effect/sql-d1, @effect/sql-libsql, @effect/sql-mssql, @effect/sql-mysql2, @effect/sql-pglite and @effect/sql-sqlite-do, the provider clients, models and generated schemas in the @effect/ai-* packages, @effect/opentelemetry, and the vitest re-export in @effect/vitest.effect has no runtime dependencies.@effect/platform-deno, @effect/sql-pglite, @effect/ai-openai-compat, @effect/ai-typesafe, @effect/atom-react, @effect/atom-solid, @effect/atom-vue, @effect/openapi-generator and @effect/doctest. @effect/docgen now lives in this repository.Core
Context.Service, FiberRef is replaced by Context.Reference, Cause has a flat structure, and many combinators were renamed. See the migration guide for the full list.Effect.tx, with TxRef, TxQueue, TxHashMap, TxPubSub, TxSemaphore and related Tx* data types.Clock separates wall-clock time from monotonic time.Semaphore, Latch, LayerRef, ErrorReporter, ByteSize, Newtype and Crypto. Arbitrary is now a native property-based testing module and no longer depends on fast-check.Schema
make constructors on every schema, and effectful decoding with services.SchemaRepresentation powers JSON Schema (Draft-04, Draft-07, 2020-12 and OpenAPI 3.0/3.1) import and export, TypeScript code generation, and AI structured output.SchemaBinary provides a compact binary codec and is the default wire format for cluster transports.Platform, HTTP and RPC
HttpApi supports typed response headers, streaming and SSE responses, the HTTP QUERY method, HttpApiTest for in-memory testing, and much faster type checking for large APIs.Socket has a pull-based reader with backpressure and STARTTLS support. Network addresses are modeled by effect/net.@effect/platform-deno adds full Deno support. The Node, Bun, Deno and browser packages all provide the platform Crypto service, and the browser package adds IndexedDB support.Cluster and Workflow
DurableQueue and an in-memory WorkflowEngine are available.ShardingConfig limits. Shutdown, entity movement and persisted replies are more reliable.SQL
@effect/sql-pg uses a built-in PostgreSQL client with pipelining, prepared statements and binary codecs, and no longer depends on pg.@effect/sql-sqlite-node uses Node's built-in node:sqlite and requires Node 22.16 or newer.SqlError exposes structured reasons such as UniqueViolation.AI
effect/ai adds EmbeddingModel, the DecisionModel classification and rating API, dynamic tools and tool approvals.CLI, Atom, observability and testing
effect/cli adds global flags, command aliases and examples, an interactive wizard mode, and shell completions for Bash, Zsh and Fish.effect/reactivity and the @effect/atom-* bindings add SSR hydration, stale-while-revalidate atoms and serializable RPC and HttpApi queries.@effect/opentelemetry aligns logs and spans with the OpenTelemetry specification.@effect/vitest runs property tests with the native Arbitrary module and supports Vitest fixtures.Requirements
@effect/vitest and @effect/doctest require Vitest 5.@effect/atom-react requires React 19.@effect/platform-deno requires Deno 2.8.3 or newer.Updated dependencies [cbfc7b4, 5a81a6f, 68b6394, 5250ca6, 5f9c9d1, 3278821, 83429b4, 0af6d0c, 927e01e, 10d8524, 35ac25a, 29e0aa7, 8783536, df77fff, ef7d77f, 035e369, f72790c, aa19472, 988c467, 735b77b, e5f7d12, 2c552f2]:
#8580 cbfc7b4 Thanks @gcanti! - Restrict Schema.brand to a single concrete identifier and require Schema.fromBrand to use the constructor's sole brand key. Apply brand or fromBrand repeatedly when composing distinct brands. For enum brand keys, pass the enum member instead of its string value.
#8601 5a81a6f Thanks @RizgarOzan! - Prevent a stale Atom.family finalizer from evicting a newer cached atom.
#8576 68b6394 Thanks @tim-smart! - Prevent stale concurrent workflow resumes from clearing a newer completed reply. Custom message storage implementations must honor the optional expected reply ID on clearReplies to provide this safety guarantee.
#8589 5250ca6 Thanks @marek-hanzal! - Fix lost synchronous successes and failures in concurrent Atom.fn calls.
#8625 5f9c9d1 Thanks @tim-smart! - Fix MutableHashMap retaining previously used equal object keys after they are replaced or removed, including when Cache and ScopedCache refresh entries on hits.
#8619 3278821 Thanks @tim-smart! - Keep Queue.takeN suspended when only part of its requested batch is available. Previously a single offer woke the batch taker in a synchronous retry loop that starved the host. Queue.State.takers now holds Queue.Taker entries: call entry.resume(...) instead of calling the entry as a function.
#8607 83429b4 Thanks @mannyc2! - Interrupt losers in Effect.race, Effect.raceFirst, Effect.raceAll and Effect.raceAllFirst when the race settles or is interrupted while other effects are still starting.
#8626 0af6d0c Thanks @tim-smart! - The RpcMessage.ExitEncoded interrupt fiberId type now admits the null emitted by JSON encoding. Consumers reading encoded interrupts should handle null alongside undefined.
#8614 927e01e Thanks @gcanti! - Fix SchemaRepresentation.toCodeDocument to preserve the grouping of branded union types in generated TypeScript code.
#8617 10d8524 Thanks @gcanti! - Fix Schema.toType and Schema.toEncoded losing parent checks when projecting checked children without transformations. Suspended children remain opaque, and structural checks continue to be preserved.
#8583 35ac25a Thanks @KhraksMamtsov! - Array, Chunk, Effect, and Record partition, their separate helpers, and Option.partitionMap now return successes before failures, matching Stream.partition. Swap the tuple when moving from the previous [failures, successes] order.
#8585 29e0aa7 Thanks @roninjin10! - Preserve sibling and callback cleanup failures alongside interruption in concurrent Effect.forEach / Effect.all, including shared Layer.build.
#8593 8783536 Thanks @tim-smart! - Fail in-flight RPC calls when a socket misses a pong, even with transient connection retries enabled. Missed pongs no longer invoke onTransientError; connection-open failures still do.
#8579 df77fff Thanks @jasonkuhrt! - Fix union-of-tag inference for flat RPC clients and AtomRpc.query and AtomRpc.mutation. Payloads and results now reflect the selected RPCs instead of resolving to never.
#8628 ef7d77f Thanks @gcanti! - Make Schema.brand type-only: brand identifiers are no longer stored in AST annotations or preserved by SchemaRepresentation. Reapply Schema.brand after rebuilding a representation when a branded TypeScript type is required; checks added by Schema.fromBrand remain preserved. Preserve the order of equal-priority union members that share an AST when deriving JSON and string-tree codecs.
#8597 035e369 Thanks @Ceereals! - Speed up JIT and AOT Schema decoding of transformations whose source has checks, such as a pattern-checked string decoded to a number. Fix compiled TemplateLiteral validation to enforce oneOf parts and preserve interpreter diagnostics when templates appear in transformation chains.
#8630 f72790c Thanks @gcanti! - Fix duplicate references in decoded and encoded schema representations when reusing schemas through optional or mutable keys.
#8555 aa19472 Thanks @front-depiction! - Resolve a Schema union's candidate parsers once per union instead of on every decode, so union decoding and encoding allocate less and run faster.
#8598 988c467 Thanks @tim-smart! - Close server WebSockets with 1000 on success, 1001 on interruption, or 1011 on failure, while preserving explicit close codes. HTTP request scopes retain the handler's failure exit through response handling and middleware.
#8632 735b77b Thanks @gcanti! - Add succeedEffect, failEffect, and verifyRoundTripEffect to TestSchema so assertions can use the calling Effect's services, test clock, and interruption, and mark the module and its public APIs as unstable. Preserve defects and interruption when they occur alongside schema validation failures. Rename verifyLosslessTransformation to verifyRoundTrip; existing callers must update to the new name.
#8575 e5f7d12 Thanks @tim-smart! - Retry failed workflow run resets instead of acknowledging deferred completion before the run resumes.
#8633 2c552f2 Thanks @IMax153! - Effect 4.0 is the first stable release of Effect v4. It replaces the 4.0.0 beta and release-candidate series, whose per-release notes remain below under the 4.0.0-beta.* and 4.0.0-rc.* headings. To upgrade from Effect 3, follow the migration guide.
Packaging and versioning
effect and every @effect/* package.@effect/platform, @effect/rpc, @effect/cluster, @effect/cli, @effect/ai, @effect/sql, @effect/workflow, @effect/experimental and similar packages are merged into effect. Separate packages remain only for platforms (@effect/platform-*), SQL drivers (@effect/sql-*), AI providers (@effect/ai-*), framework bindings (@effect/atom-*), OpenTelemetry, Vitest and tooling.effect/http, effect/http-api, effect/rpc, effect/cluster, effect/workflow, effect/ai, effect/cli, effect/sql and effect/schema import from effect/<area>. APIs tagged @stability unstable may have breaking changes in minor releases. APIs without a stability tag follow semver.@stability unstable, because that dependency's releases can change them. This covers NodeRedis, DenoRedis, BunRedis, @effect/platform-node/Undici and the undici dispatcher APIs, the ws options and re-exports in the platform packages, driver-specific options and clients in @effect/sql-clickhouse, @effect/sql-d1, @effect/sql-libsql, @effect/sql-mssql, @effect/sql-mysql2, @effect/sql-pglite and @effect/sql-sqlite-do, the provider clients, models and generated schemas in the @effect/ai-* packages, @effect/opentelemetry, and the vitest re-export in @effect/vitest.effect has no runtime dependencies.@effect/platform-deno, @effect/sql-pglite, @effect/ai-openai-compat, @effect/ai-typesafe, @effect/atom-react, @effect/atom-solid, @effect/atom-vue, @effect/openapi-generator and @effect/doctest. @effect/docgen now lives in this repository.Core
Context.Service, FiberRef is replaced by Context.Reference, Cause has a flat structure, and many combinators were renamed. See the migration guide for the full list.Effect.tx, with TxRef, TxQueue, TxHashMap, TxPubSub, TxSemaphore and related Tx* data types.Clock separates wall-clock time from monotonic time.Semaphore, Latch, LayerRef, ErrorReporter, ByteSize, Newtype and Crypto. Arbitrary is now a native property-based testing module and no longer depends on fast-check.Schema
make constructors on every schema, and effectful decoding with services.SchemaRepresentation powers JSON Schema (Draft-04, Draft-07, 2020-12 and OpenAPI 3.0/3.1) import and export, TypeScript code generation, and AI structured output.SchemaBinary provides a compact binary codec and is the default wire format for cluster transports.Platform, HTTP and RPC
HttpApi supports typed response headers, streaming and SSE responses, the HTTP QUERY method, HttpApiTest for in-memory testing, and much faster type checking for large APIs.Socket has a pull-based reader with backpressure and STARTTLS support. Network addresses are modeled by effect/net.@effect/platform-deno adds full Deno support. The Node, Bun, Deno and browser packages all provide the platform Crypto service, and the browser package adds IndexedDB support.Cluster and Workflow
DurableQueue and an in-memory WorkflowEngine are available.ShardingConfig limits. Shutdown, entity movement and persisted replies are more reliable.SQL
@effect/sql-pg uses a built-in PostgreSQL client with pipelining, prepared statements and binary codecs, and no longer depends on pg.@effect/sql-sqlite-node uses Node's built-in node:sqlite and requires Node 22.16 or newer.SqlError exposes structured reasons such as UniqueViolation.AI
effect/ai adds EmbeddingModel, the DecisionModel classification and rating API, dynamic tools and tool approvals.CLI, Atom, observability and testing
effect/cli adds global flags, command aliases and examples, an interactive wizard mode, and shell completions for Bash, Zsh and Fish.effect/reactivity and the @effect/atom-* bindings add SSR hydration, stale-while-revalidate atoms and serializable RPC and HttpApi queries.@effect/opentelemetry aligns logs and spans with the OpenTelemetry specification.@effect/vitest runs property tests with the native Arbitrary module and supports Vitest fixtures.Requirements
@effect/vitest and @effect/doctest require Vitest 5.@effect/atom-react requires React 19.@effect/platform-deno requires Deno 2.8.3 or newer.Effect.flatMap callbacks now receive only the value, without internal fiber/exit arguments or an internal this receiver.
#8367 f75468a Thanks @Marve10s! - Add Arbitrary.configureGlobal to set default options for property checking and sampling, including the run count used by @effect/vitest. Explicit per-call options take precedence; passing an empty object restores the built-in defaults.
#8543 34cc788 Thanks @front-depiction! - Fix missed updates through stale AtomRegistry nodes, premature dependency release, leaked superseded builds, and failed observed builds that never recover.
#8421 eb02cbb Thanks @danieljvdm! - Defer Atom.swr stale refreshes until after reads, skipping them if the source becomes fresh or the atom is disposed. One-shot unmounted reads no longer refresh stale sources after disposal.
#8534 4bb949e Thanks @tim-smart! - Check identity authorization before resolving unencrypted event-log session bindings
#8353 b409e3f Thanks @tim-smart! - Make Effect.awaitAllChildren interruptible while it waits for child fibers.
#8510 4093507 Thanks @tim-smart! - Fix Cache.get retaining zero-TTL lookup results, which could evict live entries.
#8339 325e0fb Thanks @tim-smart! - Add data-last forms for selected safe Queue operations and selected Option, TxSemaphore, and AsyncResult APIs
#8503 e54211a Thanks @marbemac! - Cause.pretty and Cause.prettyErrors now restore Error.stackTraceLimit when formatting an error throws, instead of leaving it at 1 for the rest of the process.
#8413 0c6c2de Thanks @front-depiction! - Cause.squash no longer allocates intermediate arrays to pick the first failure or defect.
#8371 cdeccc7 Thanks @front-depiction! - Fix asymmetric Chunk.makeEquivalence comparisons on sparse arrays. Avoid redundant copies in Chunk and Array.dedupeWith, and balance Chunk.flatMap concatenations.
#8504 254fcc1 Thanks @IMax153! - Fix the CLI lexer to treat negative numbers such as -3.70 as values instead of short options, so --lon -3.70 parses correctly
#8474 bd14b64 Thanks @tim-smart! - Scope.closeUnsafe now requires a Scope.Closeable, matching Scope.close. Use a scope created by Scope.make or Scope.fork; a plain Scope.Scope cannot be closed directly.
#8473 37064fd Thanks @tim-smart! - Scope.close now requires a Scope.Closeable. Use a scope created by Scope.make or Scope.fork; a plain Scope.Scope cannot be closed directly.
#8542 702c34e Thanks @Marve10s! - Avoid retaining completed request ids when MessageStorage is disabled. Without storage, redelivering a completed request id now runs the request again instead of failing with AlreadyProcessingMessage.
#8454 7ef0ce6 Thanks @front-depiction! - Delay copying a derived Context's base until it has been read at least as many times as its size (with a minimum of eight), avoiding full copies for short-lived contexts.
#8339 325e0fb Thanks @tim-smart! - TxPriorityQueue.fromIterable(order)(iterable) passed its arguments to the implementation in the wrong order and produced a queue of undefined values; the data-first form was unaffected.
#8414 cdec5ef Thanks @front-depiction! - Cache named time zones by the requested id as well as the Intl-resolved id, avoiding repeated formatter construction for aliases. Zones still report the Intl-resolved id.
#8386 f9179cb Thanks @front-depiction! - Clean up rendered error stacks for common Effect callbacks and avoid per-step closure allocations in several combinators on V8.
Effect.flatMap callbacks now receive only the value, without internal fiber/exit arguments or an internal this receiver.
#8442 c760e1e Thanks @front-depiction! - Avoid allocating a closure context for each struct property and array element during sequential Schema traversal.
#8354 1b4461e Thanks @tim-smart! - Move unstable modules from effect/unstable/* to effect/* and remove the old export paths. Drop the unstable segment from imports. These APIs remain @stability unstable.
Move Arbitrary to the top level and update @effect/vitest to use the new entrypoint. Replace imports from effect/arbitrary or effect/arbitrary/Arbitrary with import { Arbitrary } from "effect" or import * as Arbitrary from "effect/Arbitrary".
#8362 5709ef6 Thanks @xia-chao! - Add type guards for HttpBodyError, CookiesError, MultipartError, and NdjsonError.
#8475 6b84149 Thanks @mugnivenko! - Annotate Config.fail return type as Config<never>, so it composes with Config.orElse without widening the result to Config<unknown>
#8469 508c70b Thanks @Marve10s! - Honor startImmediately: false in FiberHandle.run, FiberMap.run, and FiberSet.run.
#8443 382992f Thanks @front-depiction! - Reduce the memory each fiber retains: the type brand now lives on the prototype, Effect.callback no longer binds its registration, and Fiber.joinAll no longer keeps a cancel closure per joined fiber.
#8427 83d7c95 Thanks @front-depiction! - Preserve the original failure or interruption when an onExit finalizer throws synchronously.
#8535 6bf2eb7 Thanks @BleedingDev! - Build FindMyWay route params without new Function, avoiding string code generation in environments with CSP restrictions.
#8556 ccade14 Thanks @Marve10s! - Process atom writes queued by batch commit listeners instead of dropping them.
#8150 b8d14d3 Thanks @Tyagiquamar! - Fix Formatter.formatJson to include name and message and preserve enumerable properties when stringifying Error instances without toJSON.
import { Formatter } from "effect"
Formatter.formatJson(new Error("boom")) // now `{"name":"Error","message":"boom"}`, previously `{}`#8359 8fca194 Thanks @gcanti! - Fix Number.remainder for decimal operands whose scaled coefficients exceed the safe integer range, preserving the exact value of integer operands. This also prevents Schema.isMultipleOf from accepting or rejecting large values incorrectly.
#8459 34e09be Thanks @gcanti! - Align JSON Schema imports with Unicode string semantics by counting code points for string length keywords and applying regular expression patterns in ECMAScript Unicode mode.
#8415 97afa37 Thanks @front-depiction! - Reduce allocations in Graph traversals: neighbors / successors / predecessors deduplicate without an intermediate Set for typical degrees, and unweightedDistances, astar and allShortestPaths no longer allocate a closure or predecessor record per visited node or relaxation.
#8360 321bae6 Thanks @tim-smart! - Improve hash composition, number hashing, cyclic equality, native collection comparison, and HashMap hashing. Fix invalid caches and referential MutableHashMap lookups. Hash values may change.
#8572 fb718d3 Thanks @tim-smart! - Add per-slot HttpApi parse options for params, query, headers, payload, success and error codecs. Each slot falls back to ParseOptions when unset. Set HeadersParseOptions to {} to keep strict body parsing without rejecting transport headers.
#8477 ccd3440 Thanks @tim-smart! - Build each HttpRouter entrypoint with a fresh router in a forked layer memo map. Routes on separate servers and handlers no longer leak into each other.
Breaking changes:
Layer.provide(HttpRouter.layer)) are not served; the entrypoint serves its own router. For RPC, put the protocol and its handlers in the app passed to serve, for example HttpRouter.serve(RpcLayer.pipe(Layer.provideMerge(RpcServer.layerProtocolHttp({ path: "/rpc" })))).#8385 107dbec Thanks @front-depiction! - Fix interrupted Layer memoization so waiting and later requesters receive the interrupted build's exit instead of hanging, and shared layers are released when scopes close. Correct MemoMap.get observer accounting for effects run twice or never run.
#8511 af510e8 Thanks @tim-smart! - Skip LayerMap preloading for keys with a zero idle TTL. With the default TTL, preload failures now surface on first use; set a non-zero idleTimeToLive to retain eager validation.
#8453 537cd82 Thanks @front-depiction! - Reduce allocations per yield* in Effect.gen, Option.gen and Result.gen, and per Effect.fn call.
Utils.SingleShotGen now serves as its own completion result and is no longer an IterableIterator: it only implements next, and its self field has been removed.
#8512 ff554ae Thanks @tim-smart! - Run Scope.close finalizers uninterruptibly so interruption cannot abandon remaining cleanup, including when closing a ManagedRuntime.
#8528 9a5a383 Thanks @tim-smart! - Wait for managed fibers and their cleanup to finish before releasing layer resources when disposing a ManagedRuntime.
#8439 d2f3547 Thanks @front-depiction! - Stop allocating closures on every Effect.match and Effect.matchCause call.
#8507 25d9e47 Thanks @IMax153! - Clarify the McpServer.toolkit error when a tool's parameters are not an object schema.
#8505 372a45d Thanks @IMax153! - Fix stdio MCP servers rejecting pings before initialization when a stateful protocol is configured, including when a stateless protocol is listed first. These pings now return an empty result without creating a session.
#8508 5e9fd25 Thanks @IMax153! - Report all parameter validation errors for MCP tools in a single response, including missing or invalid fields and, for strict tools, unknown keys.
#8465 c85c8c3 Thanks @izakfilmalter! - Preserve tool annotation titles in MCP tools/list responses for the 2025-06-18 and 2025-11-25 protocol revisions, alongside the top-level title and behavioral hints.
#8552 b501557 Thanks @Floriferous! - Report declared MCP tool failures with empty messages using their encoded value. Handler execution errors now return isError results on protocol version 2025-11-25 and -32603 Internal error on older versions, instead of -32602 Invalid params.
#8380 35ef06c Thanks @front-depiction! - Fix Metric series key collisions, duplicate series for empty attributes, and updates lost after a registry is cleared. Reuse series keys when contextual attributes are unchanged.
#8420 d6cc5d9 Thanks @danieljvdm! - Emit parts buffered while reading a multipart file before pulling more input.
#8450 83b7b1f Thanks @front-depiction! - Fix MutableList.prependAll with empty input corrupting the list and breaking subsequent takes or appends.
#8447 f05fe36 Thanks @front-depiction! - Release consumed slots in a growing MutableList bucket, and pass list indices rather than bucket offsets to MutableList.filter predicates.
#8448 1fd49d4 Thanks @front-depiction! - Fix MutableList.takeN leaving a drained bucket at the head when it stops at a bucket boundary. This also prevents Queue.takeN from making subsequent messages inaccessible after an offerAll boundary.
#8340 c79088d Thanks @fubhy! - Add family-aware internet address and multicast interface types to NetAddress
#8407 0cbb457 Thanks @tim-smart! - Store NetAddress IPv4 and IPv6 addresses as numbers instead of a Uint8Array, making construction, Equal and Hash cheaper, especially on Deno.
#8545 8202a6e Thanks @hsyntax! - Mark OpenAPI parameters and response headers as optional when their encoded key is optional, such as keys using Schema.withDecodingDefaultKey or Schema.withDecodingDefault. Generated documents previously marked these keys as required, even though they can be absent on the wire.
#8547 8d070c3 Thanks @gcanti! - Generate OpenAPI parameters and response headers from their encoded object representation while preserving property annotations.
#8551 0cf7655 Thanks @hsyntax! - Preserve encoded string literals and exportable checks such as pattern in OpenAPI schemas for HttpApiSchema.asText() bodies. Text bodies keep their string type even when their schemas are opaque or referenced components.
#8522 d470d54 Thanks @FNDEVVE! - Drain OTLP export response bodies before completing or retrying each request.
#8395 2121472 Thanks @tim-smart! - Prevent lost permits when a partitioned semaphore acquisition is interrupted, and keep competing immediate takes from acquiring the same permit.
#8558 4113bc7 Thanks @fe-franco! - Fail @effect/sql-pg transactions when PostgreSQL returns ROLLBACK for COMMIT after a caught statement error. SqlClient.make accepts a commit effect so drivers can inspect the result.
#8468 a41a441 Thanks @lloydrichards! - In MCP protocols that omit string structuredContent, return plain text for toolkit and hand-written tool results whose single text block is an exact JSON mirror of that string.
#8337 3af6bd0 Thanks @mugnivenko! - Add PlatformError.isPlatformError guard
#8502 67ee3b8 Thanks @elizabethcheng! - Use a consistent row-lock order for PostgreSQL shard lease acquisition, refresh, and bulk release when shardLockDisableAdvisory is enabled.
#8540 e8df3d8 Thanks @Marve10s! - Treat an Infinity capacity passed to PubSub as unbounded.
#8345 1dbc4c3 Thanks @xia-chao! - Add PubSub.isPubSub, matching Queue.isQueue and TxPubSub.isTxPubSub.
#8449 80d5adb Thanks @front-depiction! - Fix a race where interrupting a waiting PubSub subscriber could swallow a later message, or interrupting a backpressured publisher could still publish when space became available.
#8569 aa430d8 Thanks @tim-smart! - Batch takes drain remaining messages when a queue closes, even below the requested minimum. Later takes receive the terminal error.
#8568 24f7d32 Thanks @tim-smart! - Withdraw pending Queue.offer and Queue.offerAll values when their producer is interrupted after Queue.end or Queue.fail. The queue can finish closing once those offers are withdrawn.
#8412 f4dd1ae Thanks @front-depiction! - Fix lost wake-ups in Queue when a fiber yields between checking for a message or capacity and registering its waiter.
Queue.offer on a zero-capacity dropping queue now hands the message to a waiting taker, matching offerUnsafe and offerAll.
#8472 0981d01 Thanks @tim-smart! - Fix Queue takers missing offers that arrive while they are registering.
#8514 0a29ca6 Thanks @tim-smart! - Retry failed background pool acquisitions when borrowed, rather than passing stale errors to later queries. Callers awaiting their own failed connection still receive its error.
#8397 17810b4 Thanks @tim-smart! - Close the interruption gap before scope and cache cleanup registration.
#8365 62b2ea9 Thanks @tim-smart! - Rename the HTTP API entry point from effect/httpapi to effect/http-api and remove the old export path. Runtime TypeIds under ~effect/httpapi/*, service keys under effect/httpapi/*, and the reserved effect/httpapi/stream/failure SSE event name now use http-api as well.
#8378 4e4fa8b Thanks @gcanti! - Rename range checks so their subject comes last: Schema.isBetweenLength, Schema.isBetweenCodePoints, Schema.isBetweenSize, and Schema.isBetweenProperties. Also rename the string checks to the grammatical Schema.isStartingWith, Schema.isEndingWith, and Schema.isIncluding. Update the corresponding SchemaRepresentation.*Reviver exports and persisted effect/schema/... check IDs to use the new names.
#8533 3495bd8 Thanks @tim-smart! - Keep the source result type for Effect.repeat with times or schedule, even when while or until is a refinement. Bounded repetition may finish before the predicate stops it, so callers relying on the previous narrowed type must check the result.
#8390 b3032f0 Thanks @front-depiction! - Fix interrupt-time resource leaks:
Pool.get, Pool.use and RcRef.get register cleanup before they can be interrupted.RcRef and RcMap finish closing expired resources even if their idle fibers are interrupted.ScopedRef closes in-flight replacements with their owner. make, fromAcquire and set now interrupt if the owning scope has closed.#8541 d26a913 Thanks @Marve10s! - Skip malformed ndjson lines and non-object JSON-RPC messages so later requests still decode. Handle non-string notification methods without throwing.
#8437 93f826a Thanks @front-depiction! - Stop Effect.map, Effect.tap, Effect.exit, Effect.match and Effect.matchCause allocating a success Exit on every step.
#8519 330b747 Thanks @tim-smart! - Add Schedule.once, a schedule that recurs immediately once and outputs void.
#8441 b808b5d Thanks @front-depiction! - Skip generator allocation for synchronous array and tuple parsing.
#8440 2575fcc Thanks @front-depiction! - Avoid rebuilding the parser wrappers on every SchemaParser.asserts call.
#8364 287273c Thanks @gcanti! - Add Schema.isMinCodePoints, Schema.isMaxCodePoints, and Schema.isBetweenCodePoints to validate string lengths by Unicode code point count, with JSON Schema export, representation revivers, and arbitrary generation support.
#8430 0860c0c Thanks @front-depiction! - Speed up schema decoder generation for deeply nested schemas.
#8451 8d27554 Thanks @front-depiction! - Speed up Schema code generation for nested schemas, especially when a child cannot be generated.
#8429 c2e810c Thanks @front-depiction! - Memoize recursive Schema.toEquivalence compilation and remove unused path tracking, reducing work and retained memory for deeply nested values.
#8423 35ecbb9 Thanks @fml09! - Ignore non-enumerable own properties when checking schema excess properties, allowing Schema.TaggedError responses to encode under strict HttpApi.ParseOptions. Symbol index signatures now skip non-enumerable entries during decoding and encoding, matching string index signatures; make those properties enumerable or declare them explicitly in a Struct to retain them.
#8436 b442528 Thanks @front-depiction! - Fix Schema.toFormatter compiling a recursive schema again at every nesting level of the formatted value.
#8482 16623c7 Thanks @gcanti! - Improve Schema.toJsonSchemaDocument export of built-in checks. String code-unit length checks now use safe code-point bounds, regex and literal checks avoid patterns that would reject accepted values under Unicode matching, and cardinality checks reject non-finite bounds instead of emitting invalid schemas. Custom check exporters can mark a fragment as approximate by returning [schema, true]; oneOf then falls back to anyOf, and approximate record-key patterns are not used as patternProperties selectors.
Built-in checks whose exported constraints can be looser than their runtime checks, including approximations that predate this change:
| Check | Approximation | Change in this PR |
|---|---|---|
isPattern |
The default applies to direct isPattern checks: the pattern is omitted unless the RegExp uses the Unicode flag and its other flags are d, g, or y. Sticky patterns are anchored at the start. Built-in checks may override the default when their Unicode semantics are known to be safe or intentionally loose. |
Updated export and approximation metadata. |
isStartingWith |
A trailing high surrogate is removed from the exported prefix; if nothing remains, the pattern is omitted. Other prefixes retain an exact pattern. | Updated export. |
isEndingWith |
A leading low surrogate is removed from the exported suffix; if nothing remains, the pattern is omitted. Other suffixes retain an exact pattern. | Updated export. |
isIncluding |
A leading low surrogate or trailing high surrogate is removed from the exported substring; if nothing remains, the pattern is omitted. Other substrings retain an exact pattern. | Updated export. |
isMinLength |
On strings, the exported minimum is Math.ceil(minLength / 2) code points. Bounds of 0 and 1 are exact; array bounds are unchanged. |
Updated export; rejects non-finite bounds. |
isMaxLength |
On strings, the exported maximum counts code points rather than UTF-16 code units. A bound of 0 is exact; array bounds are unchanged. | Updated type and union handling; rejects non-finite bounds. |
isBetweenLength |
On strings, combines the lower- and upper-bound approximations above. Array bounds are unchanged. | Updated export; rejects non-finite bounds. |
isUppercased, isLowercased |
Patterns exclude only ASCII letters of the opposite case. Non-ASCII characters that change under JavaScript casing can still pass JSON Schema validation. | Marked as approximate. |
isCapitalized, isUncapitalized |
Patterns exclude only ASCII letters of the opposite case at the start. Non-ASCII characters that change under JavaScript casing can still pass JSON Schema validation. | Marked as approximate. |
isInt |
Exports type: "integer" without the safe-integer bounds required by the runtime check. |
Marked as approximate. |
isMinProperties, isMaxProperties, isBetweenProperties |
Counts match for parsed JSON objects, but JSON Schema property-count keywords do not constrain arrays, which these object-typed checks can also receive. | Rejects non-finite bounds and tracks non-object use. |
isPropertyNames |
Inherits any approximation in the key schema. JSON Schema's propertyNames also does not constrain array keys. |
Propagates approximation from the key schema. |
isMinSize, isMaxSize, isBetweenSize |
The size constraint is omitted. | Rejects non-finite bounds and marks omission approximate. |
isUniqueKey |
Uniqueness of tuple keys is omitted. | Omission is now tracked as approximate. |
Comparison and range checks for Date, BigInt, and BigDecimal |
Their bounds are omitted from JSON Schema export. | Omission is now tracked as approximate. |
Length checks on objects with a length property also omit that constraint. Code-point checks map directly to JSON Schema length bounds and are not approximate on strings; this PR adds rejection of non-finite bounds to those checks as well.
#8435 5521209 Thanks @front-depiction! - Build the detailed traversal for structs without index signatures only when needed, avoiding unused parser allocations under default parse options.
#8434 477394d Thanks @front-depiction! - Split compiled tuple rest elements once per schema instead of on every equivalence or formatter call.
#8428 3036241 Thanks @front-depiction! - Stop Schema unions rebuilding their runtime-type candidate list on every decode. The list is now built once per union and reused.
#8418 ca422fd Thanks @front-depiction! - Run all scope finalizers even when one throws synchronously, and preserve the original failure when closing the scope.
#8457 4f5f866 Thanks @front-depiction! - Forked scopes detach from their parent on close, even if cleanup throws or is interrupted, without a bookkeeping finalizer. The readonly Scope.parent field exposes the parent scope.
#8396 54ff4f2 Thanks @tim-smart! - Shared ScopedCache lookups survive individual caller interruption. If the last waiter leaves while a lookup is pending, it is interrupted and its scope closed. Missing-key lookups, including refresh, now run in daemon fibers like Cache, so children forked by a lookup end with it rather than with the caller.
#8488 c8a9f85 Thanks @gcanti! - - Allow Config.withDefault and Config.option to recover Config.all groups with missing children even when other children have values. Validation and source errors still propagate. A group default replaces the entire group; put defaults on individual children to preserve supplied values, or use Config.schema(Schema.Struct(...)) to reject incomplete objects.
Config.orElse adopt the fallback's result, allowing a later default or option to handle an absent fallback even after invalid input was recovered.None for ShardingConfig.runnerListenAddress when listenHost is absent and listenPort is valid. Supply listenHost to configure the listen address.#8433 0c0aa5e Thanks @front-depiction! - Avoid redundant context lookups for the tracer and tracing-enabled flag when creating spans.
#8356 d426feb Thanks @tim-smart! - Split the encoding API into effect/encoding/Base64, effect/encoding/Base64Url, effect/encoding/Hex, and effect/encoding/EncodingError. The former effect/Encoding module has been removed; migrate each helper to its format module and use the shared error entrypoint to name or narrow encoding failures.
Two migrations need special attention: randomHex is now Hex.random, and the runtime value of EncodingErrorTypeId changed from ~effect/Encoding/EncodingError to ~effect/encoding/EncodingError.
#8529 2a8f5c7 Thanks @tim-smart! - Roll back SQLite transactions left open by a failed COMMIT, such as a deferred foreign key violation, so the connection can be reused.
#8445 6332de2 Thanks @front-depiction! - Keep long chains of Stream.concat linear in their length.
#8416 c00c8ff Thanks @front-depiction! - Fix Stream.forever and Stream.repeat slowing down and retaining pull layers with each repetition by using a constant-depth loop.
Note truncated.
#8354 1b4461e Thanks @tim-smart! - Move unstable modules from effect/unstable/* to effect/* and remove the old export paths. Drop the unstable segment from imports. These APIs remain @stability unstable.
Move Arbitrary to the top level and update @effect/vitest to use the new entrypoint. Replace imports from effect/arbitrary or effect/arbitrary/Arbitrary with import { Arbitrary } from "effect" or import * as Arbitrary from "effect/Arbitrary".
#8422 58eef0a Thanks @FredAmartey! - Fix anonymous layer causing FixtureParseError in Vitest fixture tests in the same suite.
#8425 81a0b3a Thanks @FredAmartey! - Support Vitest fixtures in Effect tests created with makeMethods(test.extend(...)). it.effect.each now passes the test context as its second argument. Build makeMethods from test or test.extend(...), not a suite-bound test from a describe callback: named it.layer tests can otherwise land outside their named suite, skipping its hooks and concurrency setting.
Updated dependencies [f75468a, 34cc788, eb02cbb, 4bb949e, b409e3f, 4093507, 325e0fb, e54211a, 0c6c2de, cdeccc7, 254fcc1, bd14b64, 37064fd, 702c34e, 7ef0ce6, 325e0fb, cdec5ef, f9179cb, c760e1e, 1b4461e, 5709ef6, 6b84149, 508c70b, 382992f, 83d7c95, 6bf2eb7, ccade14, b8d14d3, 8fca194, 34e09be, 97afa37, 321bae6, fb718d3, ccd3440, 107dbec, af510e8, 537cd82, ff554ae, 9a5a383, d2f3547, 25d9e47, 372a45d, 5e9fd25, c85c8c3, b501557, 35ef06c, d6cc5d9, 83b7b1f, f05fe36, 1fd49d4, c79088d, 0cbb457, 8202a6e, 8d070c3, 0cf7655, d470d54, 2121472, 4113bc7, a41a441, 3af6bd0, 67ee3b8, e8df3d8, 1dbc4c3, 80d5adb, aa430d8, 24f7d32, f4dd1ae, 0981d01, 0a29ca6, 17810b4, 62b2ea9, 4e4fa8b, 3495bd8, b3032f0, d26a913, 93f826a, 330b747, b808b5d, 2575fcc, 287273c, 0860c0c, 8d27554, c2e810c, 35ecbb9, b442528, 16623c7, 5521209, 477394d, 3036241, ca422fd, 4f5f866, 54ff4f2, c8a9f85, 0c0aa5e, d426feb, 2a8f5c7, 6332de2, c00c8ff, aa7de26, 6f44ca0, 98792c3, 1f76040, cf7cfd6, 6bc0eee, 88b79d7, db7b69e, 43bbb25, 6ecd4b3, 7b81a95, dd8990b, 19835f2, 1a3eb9e]:
2a8f5c7 Thanks @tim-smart! - Roll back SQLite transactions left open by a failed COMMIT, such as a deferred foreign key violation, so the connection can be reused.f75468a, 34cc788, eb02cbb, 4bb949e, b409e3f, 4093507, 325e0fb, e54211a, 0c6c2de, cdeccc7, 254fcc1, bd14b64, 37064fd, 702c34e, 7ef0ce6, 325e0fb, cdec5ef, f9179cb, c760e1e, 1b4461e, 5709ef6, 6b84149, 508c70b, 382992f, 83d7c95, 6bf2eb7, ccade14, b8d14d3, 8fca194, 34e09be, 97afa37, 321bae6, fb718d3, ccd3440, 107dbec, af510e8, 537cd82, ff554ae, 9a5a383, d2f3547, 25d9e47, 372a45d, 5e9fd25, c85c8c3, b501557, 35ef06c, d6cc5d9, 83b7b1f, f05fe36, 1fd49d4, c79088d, 0cbb457, 8202a6e, 8d070c3, 0cf7655, d470d54, 2121472, 4113bc7, a41a441, 3af6bd0, 67ee3b8, e8df3d8, 1dbc4c3, 80d5adb, aa430d8, 24f7d32, f4dd1ae, 0981d01, 0a29ca6, 17810b4, 62b2ea9, 4e4fa8b, 3495bd8, b3032f0, d26a913, 93f826a, 330b747, b808b5d, 2575fcc, 287273c, 0860c0c, 8d27554, c2e810c, 35ecbb9, b442528, 16623c7, 5521209, 477394d, 3036241, ca422fd, 4f5f866, 54ff4f2, c8a9f85, 0c0aa5e, d426feb, 2a8f5c7, 6332de2, c00c8ff, aa7de26, 6f44ca0, 98792c3, 1f76040, cf7cfd6, 6bc0eee, 88b79d7, db7b69e, 43bbb25, 6ecd4b3, 7b81a95, dd8990b, 19835f2, 1a3eb9e]:
#8532 0786152 Thanks @tim-smart! - Fix opening file: SQLite URI filenames on Linux with Bun, including readonly and create options.
#8529 2a8f5c7 Thanks @tim-smart! - Roll back SQLite transactions left open by a failed COMMIT, such as a deferred foreign key violation, so the connection can be reused.
Updated dependencies [f75468a, 34cc788, eb02cbb, 4bb949e, b409e3f, 4093507, 325e0fb, e54211a, 0c6c2de, cdeccc7, 254fcc1, bd14b64, 37064fd, 702c34e, 7ef0ce6, 325e0fb, cdec5ef, f9179cb, c760e1e, 1b4461e, 5709ef6, 6b84149, 508c70b, 382992f, 83d7c95, 6bf2eb7, ccade14, b8d14d3, 8fca194, 34e09be, 97afa37, 321bae6, fb718d3, ccd3440, 107dbec, af510e8, 537cd82, ff554ae, 9a5a383, d2f3547, 25d9e47, 372a45d, 5e9fd25, c85c8c3, b501557, 35ef06c, d6cc5d9, 83b7b1f, f05fe36, 1fd49d4, c79088d, 0cbb457, 8202a6e, 8d070c3, 0cf7655, d470d54, 2121472, 4113bc7, a41a441, 3af6bd0, 67ee3b8, e8df3d8, 1dbc4c3, 80d5adb, aa430d8, 24f7d32, f4dd1ae, 0981d01, 0a29ca6, 17810b4, 62b2ea9, 4e4fa8b, 3495bd8, b3032f0, d26a913, 93f826a, 330b747, b808b5d, 2575fcc, 287273c, 0860c0c, 8d27554, c2e810c, 35ecbb9, b442528, 16623c7, 5521209, 477394d, 3036241, ca422fd, 4f5f866, 54ff4f2, c8a9f85, 0c0aa5e, d426feb, 2a8f5c7, 6332de2, c00c8ff, aa7de26, 6f44ca0, 98792c3, 1f76040, cf7cfd6, 6bc0eee, 88b79d7, db7b69e, 43bbb25, 6ecd4b3, 7b81a95, dd8990b, 19835f2, 1a3eb9e]:
#8558 4113bc7 Thanks @fe-franco! - Fail @effect/sql-pg transactions when PostgreSQL returns ROLLBACK for COMMIT after a caught statement error. SqlClient.make accepts a commit effect so drivers can inspect the result.
#8570 d68cbd6 Thanks @tim-smart! - Prevent immediate queries from reusing a PostgreSQL connection after a fatal session error. The pool replaces the failed connection before the next query borrows one.
#8514 0a29ca6 Thanks @tim-smart! - Retry failed background pool acquisitions when borrowed, rather than passing stale errors to later queries. Callers awaiting their own failed connection still receive its error.
Updated dependencies [f75468a, 34cc788, eb02cbb, 4bb949e, b409e3f, 4093507, 325e0fb, e54211a, 0c6c2de, cdeccc7, 254fcc1, bd14b64, 37064fd, 702c34e, 7ef0ce6, 325e0fb, cdec5ef, f9179cb, c760e1e, 1b4461e, 5709ef6, 6b84149, 508c70b, 382992f, 83d7c95, 6bf2eb7, ccade14, b8d14d3, 8fca194, 34e09be, 97afa37, 321bae6, fb718d3, ccd3440, 107dbec, af510e8, 537cd82, ff554ae, 9a5a383, d2f3547, 25d9e47, 372a45d, 5e9fd25, c85c8c3, b501557, 35ef06c, d6cc5d9, 83b7b1f, f05fe36, 1fd49d4, c79088d, 0cbb457, 8202a6e, 8d070c3, 0cf7655, d470d54, 2121472, 4113bc7, a41a441, 3af6bd0, 67ee3b8, e8df3d8, 1dbc4c3, 80d5adb, aa430d8, 24f7d32, f4dd1ae, 0981d01, 0a29ca6, 17810b4, 62b2ea9, 4e4fa8b, 3495bd8, b3032f0, d26a913, 93f826a, 330b747, b808b5d, 2575fcc, 287273c, 0860c0c, 8d27554, c2e810c, 35ecbb9, b442528, 16623c7, 5521209, 477394d, 3036241, ca422fd, 4f5f866, 54ff4f2, c8a9f85, 0c0aa5e, d426feb, 2a8f5c7, 6332de2, c00c8ff, aa7de26, 6f44ca0, 98792c3, 1f76040, cf7cfd6, 6bc0eee, 88b79d7, db7b69e, 43bbb25, 6ecd4b3, 7b81a95, dd8990b, 19835f2, 1a3eb9e]:
Custom SQL clients can opt in through the new releaseSavepoint option. Clients that omit it are unchanged.
#8331 9953c92 Thanks @tim-smart! - Bound local sends that wait for an unregistered cluster entity type. These sends now fail with an Entity type ... not registered defect at the shared runner registration deadline. Once that startup deadline has elapsed, sends to not-yet-registered dynamic entity types fail immediately.
#8319 c6e8b20 Thanks @fubhy! - Extend NetAddress.toCanonical to accept internet addresses. IPv4-mapped IPv6 addresses become IPv4 while retaining the port. Other addresses retain their identity and IPv6 scope metadata.
#8317 8d40572 Thanks @tim-smart! - Fix cluster workflows stalling after request resets.
#8323 1b21e0d Thanks @fubhy! - Add validated multicast address refinements for IP and MAC addresses.
#8310 3b155e3 Thanks @williamrobertson13! - Fix memory leaks in Pool.makeWithTTL with the usage strategy by releasing retired resources and consumed acquisition errors from the TTL queue.
#8326 895d944 Thanks @lloydrichards! - Normalize identified MCP output schemas to object roots across protocol versions.
Support identified object schemas in MCP elicitation requests.
#8318 705fb68 Thanks @fubhy! - Add Queue.shutdownUnsafe to synchronously discard buffered messages and settle pending queue operations from callbacks. Both Queue.shutdown and Queue.shutdownUnsafe return false when the queue has already been shut down or completed; previously, Queue.shutdown always returned true.
#8325 87912c0 Thanks @fubhy! - Add NetAddress.formatNativeHost and NetAddress.formatMulticastInterface with explicit platform and scope ID map parameters for native socket APIs.
#8308 106af64 Thanks @tristanz! - Release savepoints after nested transactions succeed or successfully roll back in PostgreSQL, PGlite, MySQL, libSQL, and the Node, Bun, React Native, and WASM SQLite clients. This frees PostgreSQL transaction locks before the outer transaction completes.
Custom SQL clients can opt in through the new releaseSavepoint option. Clients that omit it are unchanged.
#8323 1b21e0d Thanks @fubhy! - Add generic branded NetAddress classifications and named validating schemas.
Singleton address constants retain their base-family types; guards expose
classifications on demand. Operations that derive new address bits return only
the IPv4 or IPv6 family until callers revalidate the classification.
#8305 3d59ae6 Thanks @tim-smart! - Make criteria optional for Decision.probability. When supplied, criteria still requires descriptions for both false and true.
Decision.Probability.criteria is now optional, so consumers reading outcome descriptions (for example, decision.criteria.true) must first guard against undefined.
#8329 89c9a39 Thanks @tim-smart! - Warn when conflicting cluster workflow definitions reuse a tag.
#8308 106af64 Thanks @tristanz! - Release savepoints after nested transactions succeed or successfully roll back in PostgreSQL, PGlite, MySQL, libSQL, and the Node, Bun, React Native, and WASM SQLite clients. This frees PostgreSQL transaction locks before the outer transaction completes.
Custom SQL clients can opt in through the new releaseSavepoint option. Clients that omit it are unchanged.
Updated dependencies [9953c92, c6e8b20, 8d40572, 1b21e0d, 3b155e3, 895d944, 705fb68, 87912c0, 106af64, 1b21e0d, 3d59ae6, 89c9a39]:
#8309 7869f54 Thanks @tristanz! - Decode binary regclass and regclass[] values as unsigned numeric OIDs, fixing the migration runner's table-existence check. Cast regclass values to text in SQL to return relation names.
#8327 201b5ab Thanks @tim-smart! - Namespace prepared statement names per connection to avoid collisions when backend sessions are shared.
#8308 106af64 Thanks @tristanz! - Release savepoints after nested transactions succeed or successfully roll back in PostgreSQL, PGlite, MySQL, libSQL, and the Node, Bun, React Native, and WASM SQLite clients. This frees PostgreSQL transaction locks before the outer transaction completes.
Custom SQL clients can opt in through the new releaseSavepoint option. Clients that omit it are unchanged.
#8330 27de875 Thanks @tim-smart! - Retire pooled PostgreSQL sessions with an unconfirmed CancelRequest, preventing a delayed cancel from reaching a later checkout. This includes interrupts sent while idle. The current checkout and unpooled sessions remain exposed to their own late cancel.
Updated dependencies [9953c92, c6e8b20, 8d40572, 1b21e0d, 3b155e3, 895d944, 705fb68, 87912c0, 106af64, 1b21e0d, 3d59ae6, 89c9a39]:
Updated dependencies [ c19c63f , 8cb0a4f , 8f420bb , 1393080 , ccae354 , 553c403 , 45b5103 , 77a5612 , 1076170 , f110af1 , 0045152 , 51d4a2f , 4d4c4e8
#8267 072e35a Thanks @tim-smart! - Support nested transactions with independent child rollback.
#8291 9a81b9b Thanks @tim-smart! - Prevent automatic scheduler yields inside storage-backed transactions to avoid Durable Object input-gate deadlocks when another fiber is queued. Explicit asynchronous operations inside transactions remain unsupported.
#8257 a7a7192 Thanks @danieljvdm! - Propagate native Durable Object transaction completion failures as SqlError.
Updated dependencies [c19c63f, 8cb0a4f, 8f420bb, 1393080, ccae354, 553c403, 45b5103, 77a5612, 1076170, f110af1, 0045152, 51d4a2f, 4d4c4e8, ccfe152, d30a0c8, 84fe64a, 49e4b37, 49e4b37, a2c4154, 23a58c0, feef90c, 755e863, 49e4b37, 9ad9891, 0beded0, 2940742, 63c1566]:
#8215 9367dcb Thanks @hsyntax! - Preserve the original SqlError when a PostgreSQL LISTEN connection fails after registration, allowing Stream.retry to acquire a new listener. Intentional scope closure still interrupts consumers.
Notification queues returned by PgClient.listen and PgConnection.listen now carry SqlError. Update explicit queue and stream type annotations to include this error.
#8200 8feeb3c Thanks @tim-smart! - Support sslmode=prefer and sslmode=allow by trying TLS first, then plaintext if the server declines SSLRequest. Unlike libpq, allow also tries TLS first. Explicit ssl overrides and certificate verification are unchanged. TLS handshake and certificate failures remain fatal. Cancellation never downgrades a TLS session to plaintext.
#8234 4e4a3a6 Thanks @tim-smart! - Add structured startupParameters and opaque startupOptions to connection config, and restore support for URL options. Explicit startupOptions overrides URL options; the startup packet field remains options. Send session defaults in every physical connection's startup packet, including pooled replacements, with config validation and documented application-name precedence.
#8224 205066a Thanks @alvarosevilla95! - Support infallible Effect password providers with no service requirements, refreshed per PostgreSQL connection and schema dump.
#8241 8ef3fcb Thanks @tim-smart! - Decode timestamp and timestamptz values, including array elements, as Date instead of epoch milliseconds. Their encoders, including PgTypes.timestamp and PgTypes.timestamptz, accept either form. Precision remains milliseconds.
date.getTime() or restore numeric codecs with PgTypes.register or a client Registry passed as types.infinity, -infinity and values outside the JavaScript Date range decode to an invalid Date. Numeric ±Infinity still encodes PostgreSQL's sentinels; encoding an invalid Date fails with PgTypes.CodecError.Date parameters bind as timestamptz. Inserting one into a timestamp column applies the session TimeZone. Use UTC or PgTypes.timestamp(value) to preserve its UTC fields. timestamptz round trips preserve the instant regardless of session timezone.
#8240 fd910d1 Thanks @tim-smart! - Decode unregistered OIDs as UTF-8 text so scalar enums return string labels.
Other binary user-defined types, including enum arrays, may produce garbled text or fail UTF-8 decoding. Decode failures close the connection, failing its pending queries and discarding transactions and LISTEN subscriptions; the pool replaces it.
Register scalar codecs with PgTypes.register. For arrays, use PgTypes.makeRegistry().register(elementOid, codec, { arrayOid }) and pass the registry as the client's types option.
Updated dependencies [c19c63f, 8cb0a4f, 8f420bb, 1393080, ccae354, 553c403, 45b5103, 77a5612, 1076170, f110af1, 0045152, 51d4a2f, 4d4c4e8, ccfe152, d30a0c8, 84fe64a, 49e4b37, 49e4b37, a2c4154, 23a58c0, feef90c, 755e863, 49e4b37, 9ad9891, 0beded0, 2940742, 63c1566]:
8abae87 Thanks @tim-smart! - Update Rolldown, the Deno Redis driver, Cloudflare Workers types, and MySQL dependencies to their latest releases.c19c63f, 8cb0a4f, 8f420bb, 1393080, ccae354, 553c403, 45b5103, 77a5612, 1076170, f110af1, 0045152, 51d4a2f, 4d4c4e8, ccfe152, d30a0c8, 84fe64a, 49e4b37, 49e4b37, a2c4154, 23a58c0, feef90c, 755e863, 49e4b37, 9ad9891, 0beded0, 2940742, 63c1566]:
#7908 c19c63f Thanks @gcanti! - Add experimental JIT and AOT schema compilers that work through the existing
SchemaParser APIs and share a decoder registry. Enable JIT globally with
effect/unstable/schema/SchemaJITCompiler/enable, selectively with
SchemaJITCompiler.enable(ast), or install generated AOT decoders without
requiring dynamic function construction. The new
effect/unstable/schema/SchemaAOTCompiler/Build entrypoint discovers direct
Schema exports from explicit module loaders and writes a self-installing AOT
module through Effect's FileSystem and Path services. Compiled decoders can
provide optional synchronous decode and make operations; normal
SchemaParser calls consume them transparently and retain decodeEffect and
makeEffect as the detailed fallbacks. AOT targets declare the operations to
prepare, so generated modules contain only those operation families and use
the interpreter if an omitted operation is later called.
SchemaGetter.Getter is now a tagged union that distinguishes synchronous,
optional, and effectful transformations. Getter values now expose only pipe.
Use the dual SchemaGetter.map, SchemaGetter.compose, and SchemaGetter.run
functions instead of the former methods. Keeping these operations standalone
lets bundlers remove composition code when an application does not use it.
The public Getter constructor is removed. Use
SchemaGetter.transformOptionalEffect instead of new SchemaGetter.Getter.
SchemaGetter.onSome and SchemaGetter.onNone are also removed. Use
transformEffect for an effectful transformation of present values and
transformOptionalEffect when the transformation handles missing values.
Transformation#compose is replaced by the dual standalone function
SchemaTransformation.composeTransformation. Replace first.compose(second)
with SchemaTransformation.composeTransformation(first, second) or
SchemaTransformation.composeTransformation(second)(first).
SchemaTransformation.make is renamed to
SchemaTransformation.makeTransformation. SchemaTransformation.Transformation
and SchemaTransformation.Middleware now implement Pipeable, so both values
can be passed through standalone combinators with .pipe(...).
SchemaAST.Context.constructorDefault now stores the constructor-default
Effect directly instead of wrapping it in a SchemaAST.Link. Constructor
defaults apply only during construction, so the direct representation avoids
giving them encoding semantics and lets construction reuse already-completed
synchronous Effects. Code that constructs or inspects SchemaAST.Context
should pass or read the default Effect directly.
#8287 8cb0a4f Thanks @tim-smart! - Add Decision and DecisionModel to effect/unstable/ai for batched classification, rating, and probability estimates over schema-encoded input.
#8221 8f420bb Thanks @gcanti! - Add Arbitrary.array(item, { minLength, maxLength }) for variable-length arrays of custom Arbitraries. Shrinking removes blocks of commands while preserving the remaining values and their order, and also simplifies individual elements.
Schema-derived arrays now also try removing prefixes and interior blocks. Shrinking composed values and Schema objects preserves child candidates that were previously lost when exploring another branch.
Shrunk results and replay paths may change from earlier native releases. Re-run affected properties to obtain new replay tokens, and preserve important failing inputs as regression tests.
#8233 1393080 Thanks @gold-beyond! - Add Crypto.randomULID to generate ULIDs from the current Clock timestamp and cryptographically secure random bytes.
#8256 ccae354 Thanks @tim-smart! - Align the Effect and Stream APIs and fix several Stream type signatures.
Effect.orElseSucceed now passes the error to the fallback function, matching Stream.orElseSucceed.Effect.isEffect narrows to Effect<unknown, unknown, unknown> instead of any.Stream.bind, Stream.bindEffect and Stream.let allow re-binding an existing field and produce the same record type as their Effect counterparts.Stream.Success, Stream.Error and Stream.Services are unconstrained and distributive like the Effect versions.Stream.partition returns [passes, fails] and takes a capacity option, matching Stream.partitionQueue and Stream.partitionEffect. Its default capacity remains 16.Stream.mapBoth takes onElement / onError, matching Stream.tapBoth.Stream.scan and Stream.scanEffect take a lazy initial state.Stream.catchTags rejects unknown tag keys like Effect.catchTags.Stream.runIntoPubSub (error type was dropped), Stream.cross (swapped type parameter names) and Stream.mapAccumArray (onHalt return type).Stream.as, Stream.tapDefect, Stream.tapErrorTag and Stream.unwrapReason.Types.Concurrency alias, and JSDoc categories were consolidated across both modules.#8235 553c403 Thanks @tim-smart! - Retain durable deferred completions received before a workflow owner's first local run so replay can complete while the deferred reply is still being persisted.
Keep pending completions in a cache keyed weakly by cluster activation. Handler rebuilds retain completions, and overlapping activations cannot clear each other's results. Results can be collected once their activation scope becomes unreachable; closing a scope alone does not guarantee collection.
Release RPC stream and queue consumers when their request write fiber is interrupted.
#8243 45b5103 Thanks @tim-smart! - Fix lost durable deferred wake-ups when a ClusterWorkflowEngine execution suspends before its run reply is persisted. Deferred completions now wait for the current run reply before resuming, so discarded executions can replay without relying on caller retries.
#8254 77a5612 Thanks @tim-smart! - Fix file response content types: honor the contentType option and preserve explicit headers, including MIME types set by HttpStaticServer. The default HttpPlatform.layer now infers missing content types from file extensions.
Web file responses on the default, Node, and Deno platforms prefer explicit content types, then nonempty File.type, then the file extension.
Removed the unused contentLength option from HttpServerResponse.file; lengths are calculated from the file and requested range.
#8229 1076170 Thanks @tim-smart! - Fix a deadlock in the memory workflow engine when a durable deferred is completed from a finalizer in the workflow awaiting it, including DurableDeferred.into inside DurableDeferred.raceAll.
#8206 f110af1 Thanks @tim-smart! - Fix multipart file streams hanging on body read errors and preserve error causes when persisting files.
#8284 0045152 Thanks @tim-smart! - HttpServerResponse.toWeb now keeps a raw Response's headers and Set-Cookie values when the body is omitted (HEAD, or status 204, 205 or 304). Bodyless outer statuses keep the outer status and status text; HEAD keeps the raw Response's. Outer cookies are appended to native Set-Cookie headers instead of replacing them.
#8202 51d4a2f Thanks @xia-chao! - Fix RcRef.make to treat idleTimeToLive: 0 like Duration.zero and "0 millis" instead of an omitted option.
#8298 4d4c4e8 Thanks @gcanti! - Fix Schema.Redacted to wrap the transformed result of its inner schema during decoding and encoding.
#8227 ccfe152 Thanks @tim-smart! - Release non-persisted, interruptible RunnerServer handlers and mailbox slots when callers disconnect.
Preserve dynamic WithTransaction annotations during replay and re-delivery.
#8261 d30a0c8 Thanks @nikhilsnayak! - Add HTTP QUERY support to clients, routers, HttpApi endpoints, and AI request metadata. Configure CORS support through allowedMethods; defaults are unchanged.
OpenAPI 3.1 output represents QUERY through x-oai-additionalOperations, which requires consumer support for that extension. The OpenAPI generator accepts the extension and the native OpenAPI 3.2 query field.
#8255 84fe64a Thanks @tim-smart! - Preserve literal suffixes such as :wait in /operations/:id:wait across HttpApiClient, HttpApiBuilder, and OpenAPI paths.
Server routes without a params schema keep their existing matching for RouteContext consumers. Schemas whose keys cannot be enumerated keep the existing fallback.
#8228 49e4b37 Thanks @lloydrichards! - Support prompt titles in McpServer.prompt and McpServer.registerPrompt.
#8228 49e4b37 Thanks @lloydrichards! - Add an instructions option to MCP servers for initialization and discovery responses.
#7265 a2c4154 Thanks @lloydrichards! - Add server support for MCP protocol version 2026-07-28 through 2026_07_28
#8272 23a58c0 Thanks @fubhy! - Add NetAddress.formatHost and NetAddress.inetAddressFromHostString for socket APIs that accept numeric hosts and ports separately, preserving IPv6 scope IDs. Add NetAddress.scopeIdsFromInterfaces to build a scope map for resolving named IPv6 zones from supplied network interface entries without performing operating-system lookups.
#8293 feef90c Thanks @gcanti! - Treat Never as an uninhabited branch during Arbitrary.schema derivation. Schemas with another finite generation path, including optional properties, unions, and empty collections, no longer fail derivation.
#8212 755e863 Thanks @IMax153! - Restrict ByteSize.Input strings to canonical non-negative integers with recognized units, rejecting malformed literals at compile time. Parse external strings and fractional quantities with ByteSize.fromString or ByteSize.fromStringUnsafe before passing them to APIs accepting ByteSize.Input.
#8228 49e4b37 Thanks @lloydrichards! - Honor Tool.Strict in MCP input schemas and argument validation. Strict dynamic tools require Effect schemas; raw JSON Schema is rejected at registration.
Support identified input schemas for non-strict tools. Invalid arguments use InvalidParams on protocols before 2025-11-25 and isError: true results on newer protocols.
Distinguish validation failures from declared handler failures. Declared failures return isError: true without structuredContent: error mode uses Error.message or schema-encoded text, and return mode uses the encoded payload. Declared failures do not produce internal-error diagnostics.
Log and report internal failures, including defects and encoding errors, while keeping client messages generic.
Allow Toolkit.handle to accept SchemaAST.ParseOptions for parameter decoding. Expose the Toolkit.FailureOrigin cause annotation and shared Tool.FailureOrigin type, with the same origin available in Tool.HandlerResult.failureOrigin on returned failures.
#8269 9ad9891 Thanks @tim-smart! - Add HttpApi.ParseOptions to configure server and client codecs at the API, group, or endpoint level.
Sse.decodeSchema and ChannelSchema.decode accept parse options, and Schema.Cause encodes reasons to their wire fields.
SSE decoding omits absent IDs, including with default options. Use Schema.optional(Schema.String) instead of Schema.UndefinedOr(Schema.String) for IDs. With onExcessProperty: "error", declare event (default: "message") and any id, including inherited IDs.
HttpApiSchema.StreamSse data-mode types and OpenAPI schemas now make id optional.
#8296 0beded0 Thanks @gcanti! - Improve Schema-derived BigInt and BigDecimal arbitraries with wider magnitude, precision, and exponent coverage and numeric boundary shrinking.
Cover intermediate magnitudes up to large one-sided BigInt bounds, handle BigDecimal bounds with widely different scales, and refine decimal counterexamples between simple values.
#8260 2940742 Thanks @xia-chao! - Fix repeated text, json, arrayBuffer, and urlParamsBody reads in HttpServerResponse.toClientResponse for raw Web Response bodies, preserving the original response for serving.
#8270 63c1566 Thanks @tim-smart! - Fix YAML indentless sequences, multiline scalar folding, and comments. Reject unsupported compact nested sequences (- - value) and document streams.
Previously accepted values such as description: Use when: deploy and description: Deploy: now throw SyntaxError: YAML forbids colons followed by whitespace or end-of-value in plain scalars. Quote these values, for example description: "Use when: deploy".
Patch Changes #8196 657254b Thanks @gcanti ! - Optimize schema initialization while preserving custom constructor options. #8190 f9ef0e9 Thanks @javas
#8196 657254b Thanks @gcanti! - Optimize schema initialization while preserving custom constructor options.
#8190 f9ef0e9 Thanks @javascript-unsafe! - Omit response bodies for statuses 204, 205, and 304 in HttpServerResponse.toWeb and the Bun/Deno HTTP adapters, preventing invalid Web responses and hung requests. Cancel omitted raw ReadableStream bodies, and finalize request resources without starting omitted Effect streams.
#8187 4f73f9e Thanks @tim-smart! - Parameterize persistence lookup keys in both SQL backing stores' getMany queries.
Import { not: {} } as Schema.Never ( #8137 ).
#8177 3ff4952 Thanks @tim-smart! - Allow Effect.cachedWithTTL to compute the TTL from each completed Exit, so successes and failures can use different cache durations.
#8164 6d55555 Thanks @sam-goodwin! - Keep Node and Bun file stats usable when optional numeric metadata exceeds the safe integer range by returning Option.none() for those fields.
#8162 716e0c0 Thanks @tim-smart! - Fix published declarations referencing symbols stripped as @internal, which broke consumers compiling with skipLibCheck: false. Effectable.d.ts now uses the public Effect.TypeId, Match.d.ts no longer aliases an internal Contextual type, Schema.d.ts ships the AnnotationSchemaConstraint alias it references, and the CLI's toFlagDoc helper is marked internal so it no longer leaks Param.getParamMetadata.
#8160 d4e4ad5 Thanks @gcanti! - Fix SchemaRepresentation.toCodeDocument generating invalid TypeScript for optional tuple elements containing unions or nested readonly tuples. Optional element types are now parenthesized, for example readonly [(string | number)?] instead of readonly [string | number?]. Generated runtime schemas are unchanged.
#8158 b1988f4 Thanks @gcanti! - Fix SchemaRepresentation.toCodeDocument dropping Struct fields named __proto__ from generated schemas. These fields now use computed keys, such as Schema.Struct({ ["__proto__"]: Schema.String }), so the generated schema validates them correctly.
#8169 482b7d7 Thanks @gcanti! - Improve SchemaRepresentation.fromJsonSchemaDocument and fromJsonSchemaMultiDocument:
Import { not: {} } as Schema.Never (#8137).
Import closed records with one patternProperties entry, additionalProperties: false, and no declared or required properties when patterns: "apply" is enabled. These were previously rejected.
{
"type": "object",
"patternProperties": { "^a": { "type": "number" } },
"additionalProperties": false
}Schema.Record(
Schema.String.check(Schema.isPattern(/^a/)),
Schema.Finite
)Reject open patterned objects with patterns: "apply" instead of generating incompatible TypeScript index signatures.
{
"type": "object",
"patternProperties": { "^a": { "type": "number" } },
"additionalProperties": true
}Import now explains that the generated TypeScript index signatures would give incorrect types to unmatched keys, and reports the source path. The same applies when additionalProperties is omitted or {}. Patterns can still be combined with a closed object in allOf when the result has a finite set of keys. Use patterns: "ignore" only if you intend to discard the pattern and its value constraints.
Reject references inside a subschema with its own $id instead of potentially resolving against the wrong definitions. Resolve or flatten these references before importing. A $id on the document root remains supported.
{
"$id": "https://example.com/root",
"$defs": { "Value": { "type": "string" } },
"type": "object",
"properties": {
"child": {
"$id": "child",
"$defs": { "Value": { "type": "number" } },
"$ref": "#/$defs/Value"
}
}
}Here child refers to the nested numeric Value, not the root string Value. Import now reports that references inside a subschema with its own $id are unsupported instead of incorrectly using the root definition.
Explain import failures using JSON Schema keyword names, the reason for rejection, and the source path. Reference errors distinguish missing definitions, unsupported reference formats, and circular aliases. Pattern errors explain how to opt in for trusted schemas or explicitly discard the constraints.
#8162 716e0c0 Thanks @tim-smart! - Rename Schema.Annotations.ToArbitrary.Constraint to Schema.Annotations.ToArbitrary.FilterConstraint.
Code that refers to the previous type name should update its type annotations to use FilterConstraint.
#8181 9941e6d Thanks @Ishkirat-Singh! - Make message optional for Prompt.Select and Prompt.MultiSelect. When omitted, prompts display only the choices and submission shows a tick followed by the selected titles. Prompt.AutoComplete still requires a message.
Your coding agent can read these notes before it upgrades. Set up the MCP server →