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.
### Patch Changes - #1782 `9252b43` Thanks @gcanti! - Add Schema.ArrayEnsure. - #1784 `7daf387` Thanks @gcanti! - Add Config.Success type utility, clo
#1784 7daf387 Thanks @gcanti! - Add Config.Success type utility, closes #1783.
#1778 e1664a3 Thanks @tim-smart! - Allow Effect.acquireRelease release finalizers to depend on the surrounding environment.
#1777 fdaa6e0 Thanks @tim-smart! - Remove an unreachable array branch in decodeJsonRpcRaw to simplify JSON-RPC decode logic without changing behavior.
#1774 19aa47e Thanks @tim-smart! - Align CLI help flag and global flag descriptions to a single column even when some flag names are very long.
#1780 c667dad Thanks @tim-smart! - Fix LanguageModel incremental prompt fallback to reliably retry with the full prompt when an incremental request fails with InvalidRequestError.
#1781 764d150 Thanks @gcanti! - Fix DateTime.makeUnsafe incorrectly appending "Z" to date strings containing "GMT"
#1772 3c27098 Thanks @tim-smart! - make Layer.mock work with Stream and Channel
Add the unstable EmbeddingModel module API surface in effect, including service, request, response, and provider types.
#1758 f2f75ee Thanks @tim-smart! - Use a normal Map in ResponseIdTracker and clear it on divergence / reset instead of reallocating a WeakMap.
#1764 342fc4b Thanks @tim-smart! - Add unstable EmbeddingModel support across core and OpenAI providers.
effect, including service, request, response, and provider types.effect, with RequestResolver batching, embed / embedMany spans, provider error propagation, deterministic ordering, and empty-input embedMany fast-path behavior.effect for embedding usage, batching, ordering, and error handling.OpenAiEmbeddingModel in @effect/ai-openai, including model / make / layer constructors, config overrides, and provider output index validation with deterministic reordering.@effect/ai-openai-compat, including config overrides, layer constructors, and output index validation.#1766 5d704ee Thanks @tim-smart! - Fix JSDoc wording for Effect.catch to consistently reference the current API name.
#1771 00add69 Thanks @tim-smart! - Add EmbeddingModel.ModelDimensions and require dimensions in embedding provider model constructors.
#1767 58217d3 Thanks @gcanti! - Add isMutableHashMap and isMutableHashSet, and align nominal guard implementations and tests across collections and transactional data types.
#1765 f4e2aba Thanks @tim-smart! - retry incremental prompt on invalid request
#1756 e3b44b6 Thanks @tim-smart! - add HttpApiMiddleware.layerSchemaErrorTransform
#1732 e1472b7 Thanks @KhraksMamtsov! - port Url module from v3
#1761 7686320 Thanks @gcanti! - Fix Tool.make type and runtime behavior when parameters is not provided.
### Patch Changes - #1754 `571447d` Thanks @tim-smart! - narrow types for Effect.retry/repeat while option
HttpApiBuilder.applyMiddleware now resolves middleware services via Context.getUnsafe, so missing middleware fails with a clear "Service not found: "
#1717 bf8fff8 Thanks @gcanti! - Schema: add OptionFromOptionalNullOr schema, closes #1707.
#1722 1af3ef3 Thanks @tim-smart! - Fix RpcSerialization.json decode so JSON array payloads are not wrapped in an extra outer array.
#1725 27fea0f Thanks @tim-smart! - Improve unstable HttpApi runtime failures for missing server middleware and missing group implementations.
#1727 2ad6c1b Thanks @tim-smart! - Make all built-in HttpApiError classes implement HttpServerRespondable, so they can be returned directly from plain HTTP server handlers outside of HttpApi.
#1739 398ac3e Thanks @tim-smart! - Use predicate-based dual dispatch for Stream.merge so data-last calls with optional options are handled correctly.
#1741 51fe22f Thanks @tim-smart! - Add Layer.tap, Layer.tapError, and Layer.tapCause APIs for effectful observation of layer success and failure without changing layer outputs.
#1740 4605db6 Thanks @tim-smart! - Refactor call sites with multiple Context mutations to use Context.mutate for batched updates.
#1750 f4de1b0 Thanks @gcanti! - Improve unstable AI structured output handling for empty tool params and add Tool.EmptyParams, closes #1749.
#1525 60214f2 Thanks @tim-smart! - use Option<A> instead of undefined | A
#1747 c4b8b0f Thanks @tim-smart! - seperate scheduler dispatch from yield decisions
#1753 6de4efe Thanks @tim-smart! - Add dtslint coverage for Stream.catchIf to lock in predicate and refinement inference behavior in both data-first and data-last forms.
#1716 4f969d1 Thanks @gcanti! - Remove unused effect/NullOr module.
#1721 6cc67c8 Thanks @IMax153! - Correct the type of the schema parameter accepted by the fileSchema methods in the CLI to be Schema.Decoder<A>
#1709 8531a22 Thanks @mikearnaldi! - Add module-level helpers for Semaphore, Latch, and extracted PartitionedSemaphore operations.
#1743 47a51ab Thanks @tim-smart! - default ws close codes to 1001 in case they are undefined
#1728 1521d02 Thanks @tim-smart! - add graceful shutdown to http servers
Durations can now be created from objects with named unit properties like { hours: 1, minutes: 30 }, similar to Temporal.Duration.from(). Supported fi
#1696 5a84853 Thanks @krzkaczor! - Add DurationObject to Duration.Input to support Temporal-style object input.
Durations can now be created from objects with named unit properties like { hours: 1, minutes: 30 }, similar to Temporal.Duration.from(). Supported fields: weeks, days, hours, minutes, seconds, millis, micros, nanos.
#1705 6f23f0e Thanks @tim-smart! - Preserve message item ordering in the default logger when logging a Cause with message values.
#1711 654aaec Thanks @tim-smart! - Fix RpcGroup.toLayer and RpcGroup.toLayerHandler service requirement inference so handler dependencies are preserved for non-stream RPC handlers.
#1712 2958a42 Thanks @tim-smart! - Expose CLI completions as a public unstable module at effect/unstable/cli/Completions.
#1713 95d27a2 Thanks @tim-smart! - Make Layer.mock a dual API so it supports both Layer.mock(Service)(impl) and Layer.mock(Service, impl).
#1704 0fbaea8 Thanks @tim-smart! - Support toolkit unions in LanguageModel options.
#1701 21d5d5e Thanks @tim-smart! - wrap httpapi request context with HttpRouter.Request
#1696 5a84853 Thanks @krzkaczor! - allow assigning Temporal types to DateTime & Duration input
#1698 6e49959 Thanks @tim-smart! - Include toolkit tool handler requirements in AI generation API environment inference.
#1703 8f5805d Thanks @tim-smart! - Relax Ndjson byte-stream channel signatures to accept plain Uint8Array.
#1710 990df2c Thanks @gcanti! - Schema: toCodecJson now returns Codec<T, Json, RD, RE> instead of Codec<T, unknown, RD, RE>.
Http: the json property on HttpIncomingMessage, HttpClientResponse, HttpServerRequest, and HttpServerResponse now returns Effect<Schema.Json, E> instead of Effect<unknown, E>.
When colors is explicitly set to true, prettyLoggerTty was still gating it with processStdoutIsTTY check, making it impossible to enable colors in non
#1675 c88e5b7 Thanks @gijsbartman! - Fix consolePretty ignoring explicit colors option in non-TTY environments.
When colors is explicitly set to true, prettyLoggerTty was still gating it with processStdoutIsTTY check, making it impossible to enable colors in non-TTY environments like Vite dev server.
#1690 947d0e4 Thanks @gcanti! - Fix Cause.hasInterruptsOnly to return false for empty causes.
#1620 7517908 Thanks @kitlangton! - Fix TaggedUnion.match to use Unify for return types, allowing
branches to return distinct Effect types that are properly merged.
#1680 a49ecd5 Thanks @KhraksMamtsov! - make HttpClientResponse pipeable
#1681 6993e33 Thanks @mikearnaldi! - Add an optional message field to Effect.ignore and Effect.ignoreCause for custom log output.
#1695 514f2a2 Thanks @gcanti! - Remove unused APIs from the Utils module.
#1644 3214b47 Thanks @patroza! - fix: update Service interface to use 'this: void' in 'of' method signatures
#1693 95ec5ed Thanks @tim-smart! - fix cli subcommand context
### Patch Changes - #1672 `9d93adb` Thanks @gcanti! - Add Newtype module. - #1677 `b52721c` Thanks @gcanti! - Fix Schema.isUUID so the version paramet
#1677 b52721c Thanks @gcanti! - Fix Schema.isUUID so the version parameter is optional in its public signature.
#1667 a891c7b Thanks @tim-smart! - Preserve Atom.withReactivity(...) refresh behavior when registry initial values seed the wrapped atom.
#1678 ef26cdf Thanks @tim-smart! - Abort HTTP client requests when response streams are consumed only partially.
#1665 82fd3ed Thanks @tim-smart! - Remove placeholder fallback behavior from CLI prompt inputs now that default values are prefilled.
The atom serialization key now uses each API's built-in request schemas so dehydrated state can be keyed consistently across server and client.
42bc7ce Thanks @tim-smart! - Add a new effect/unstable/http/HttpStaticServer module for static file serving with MIME resolution, directory index fallback, SPA fallback, and safe path resolution.#1659 ff533f2 Thanks @tim-smart! - Persist MCP HTTP session and protocol headers after initialize so follow-up JSON-RPC requests include MCP-Protocol-Version.
#1663 dc803ee Thanks @tim-smart! - Add HttpServerResponse.fromClientResponse for directly converting client responses into server responses.
#1657 d660b1c Thanks @tim-smart! - Add Ctrl-U line clearing support to editable CLI prompts.
#1645 93a05e3 Thanks @gijsbartman! - ensure transformed Atom's don't extend idle ttl
#1655 2a65cf6 Thanks @tim-smart! - Make AtomRpc.query and AtomHttpApi.query return serializable atoms by default when query results are schema-backed.
The atom serialization key now uses each API's built-in request schemas so dehydrated state can be keyed consistently across server and client.
#1662 a561a40 Thanks @tim-smart! - Add HttpServerRequest.toClientRequest for direct server-to-client request conversion.
#1648 29cd24d Thanks @gcanti! - Fix Types.VoidIfEmpty to correctly detect empty object types. Remove deprecated Types.MatchRecord in favor of the simplified implementation, closes #1647.
#1664 662a8e6 Thanks @tim-smart! - Add HttpServerRequest.fromClientRequest for direct client-request-backed server request conversion.
#1656 d2b52ba Thanks @tim-smart! - Persist MCP client capability context across HTTP requests by resolving initialized payloads through the standard Mcp-Session-Id HTTP header in McpServer.
Adds a regression test that initializes an MCP HTTP client, verifies the MCP server echoes Mcp-Session-Id, and then checks a later tool call can still read McpServer.clientCapabilities.
#1639 407c3b4 Thanks @tim-smart! - Add Scheduler.PreventSchedulerYield and expose it via References so fibers can skip scheduler shouldYield checks when needed.
#1649 e741322 Thanks @tim-smart! - Set Schema.TaggedErrorClass instance name to the tag value, matching Data.TaggedError behavior.
#1646 5c75fa8 Thanks @tim-smart! - Simplify internal and documented request usage by passing request resolvers directly to Effect.request instead of wrapping them with Effect.succeed.
#1641 747177b Thanks @tim-smart! - Don't transform Tool result schemas, as they aren't sent to the providers as
json schemas
#1636 326cd48 Thanks @tim-smart! - Add Cookies.expireCookie / expireCookieUnsafe and HttpServerResponse.expireCookie / expireCookieUnsafe for emitting expired cookies.
#1653 627e922 Thanks @tim-smart! - expose mcp client capabilities
#1660 662287e Thanks @tim-smart! - Add HttpServerResponse.toClientResponse for converting server responses into HttpClientResponse values.
### Patch Changes - #1621 `903a839` Thanks @kitlangton! - unstable/http Headers: add removeMany combinator for removing multiple headers at once - #16
#1621 903a839 Thanks @kitlangton! - unstable/http Headers: add removeMany combinator for removing multiple headers at once
#1622 91a0168 Thanks @tim-smart! - Add Model.BooleanSqlite, a model field schema that uses 0 | 1 encoding for database variants and plain boolean encoding for JSON variants.
#1631 c890f9a Thanks @gcanti! - unstable/httpapi HttpApiBuilder: fix void responses producing a non-empty body instead of Response.empty, closes #1628.
#1618 1e985f2 Thanks @tim-smart! - Default Effect.context() to Effect.context<never>() when no type parameter is provided.
Add Command.withSharedFlags conflict validation against existing subcommands, including the withSubcommands(...).withSharedFlags(...) composition orde
#1603 fb21462 Thanks @tim-smart! - Add responseText to AiError.StructuredOutputError and populate it from LanguageModel.generateObject so failed structured output decodes include the full LLM text.
#1613 2ed26b1 Thanks @lucas-barake! - Add disableFatalDefects to RpcServer.layerHttp, RpcServer.toHttpEffect, and RpcServer.toHttpEffectWebsocket option types to match existing runtime support.
#1599 e832a57 Thanks @tim-smart! - add trait for customizing exit codes
#1611 7f01be7 Thanks @WebWalks! - Fixed the Error Type on AtomHttpApiClient (Server errors were being incorrectly reported, and we could not determine _tag to handle)
#1612 e965143 Thanks @tim-smart! - Expose the optional orElse fallback parameter in Effect.catchTags.
#1606 b9b80f1 Thanks @gcanti! - Schema: toJsonSchemaDocument now emits JSON Schema false for unannotated
Never index signatures (including additionalProperties) instead of { not: {} }.
Annotated Never still emits a schema object so metadata like description is preserved.
#1607 98252aa Thanks @gcanti! - Schema: improve Schema.Unknown / Schema.ObjectKeyword handling in toCodecJson and toCodecStringTree
#1616 56fbd94 Thanks @lucas-barake! - Add Atom.swr to effect/unstable/reactivity for staleTime-gated stale-while-revalidate reads, optional mount and window-focus revalidation, and forceful manual refresh.
#1600 3faa109 Thanks @tim-smart! - add args to Stdio service
#1610 692ecfe Thanks @kitlangton! - Refine unstable CLI parent/subcommand flag composition.
Command.withSharedFlags conflict validation against existing subcommands, including the withSubcommands(...).withSharedFlags(...) composition order.Command type parameters to Command<Name, Input, ContextInput, E, R> for clearer parent-context modeling.Command.withSubcommands input typing sound for downstream input-based combinators by reflecting that subcommand paths only carry parent context input.#1604 1e70b72 Thanks @lucas-barake! - Fix unstable/sql/SqlSchema request input typing so findAll and findNonEmpty accept Request["Type"] instead of Request["Encoded"].
#1602 ecf0782 Thanks @tim-smart! - Replace the default HttpApi schema-validation error with HttpApiError.BadRequestNoContent.
### Patch Changes - #1597 `fa17bb5` Thanks @tim-smart! - Fix Effect.forkScoped data-first typings to include Scope in requirements. - #1598 `f46e5b5`
#1597 fa17bb5 Thanks @tim-smart! - Fix Effect.forkScoped data-first typings to include Scope in requirements.
#1598 f46e5b5 Thanks @tim-smart! - compare transaction connections by reference
#1596 ce4767c Thanks @tim-smart! - improve HttpClient.withRateLimiter initial state tracking
#1594 c830a8b Thanks @tim-smart! - HttpClient.withRateLimiter adds delay from retry-after headers
### Patch Changes - #1586 `a909e1c` Thanks @gcanti! - Schema: add Chunk schema, closes #1585. - #1588 `8814a4e` Thanks @gcanti! - Fix Schema.toTaggedU
#1586 a909e1c Thanks @gcanti! - Schema: add Chunk schema, closes #1585.
#1588 8814a4e Thanks @gcanti! - Fix Schema.toTaggedUnion discriminant detection for class-based schemas, including unique symbol tags, closes #1584.
#1591 3f942c5 Thanks @tim-smart! - Add HttpClient.withRateLimiter for integrating the RateLimiter service with HTTP clients, including optional response-header driven limit updates and automatic 429 retry behavior.
#1583 774ed59 Thanks @patroza! - feat: Support Reference classes
#1592 f54b8d3 Thanks @tim-smart! - Fix HttpApi.prefix so it updates endpoint path types the same way HttpApiGroup.prefix does.
### Patch Changes - #1561 `5c73c41` Thanks @gcanti! - SchemaRepresentation: only create references for recursive/mutually recursive schemas and schema
### Patch Changes - #1578 `0874332` Thanks @tim-smart! - Proxy function arity from Effect.fn APIs so wrapped functions preserve the original length va
#1578 0874332 Thanks @tim-smart! - Proxy function arity from Effect.fn APIs so wrapped functions preserve the original length value.
#1580 c592dcd Thanks @tim-smart! - simplify Filter by removing Args type parameter
#1575 1dbe28d Thanks @tim-smart! - fix Chat constructor types
#1581 564d730 Thanks @tim-smart! - fix Duration.toMillis regression
#1579 3cfadc4 Thanks @tim-smart! - Remove fiber-level keep-alive intervals and keep the process alive from Runtime.makeRunMain instead.
#1571 6634fd0 Thanks @tim-smart! - Add HttpApiClient.urlBuilder for type-safe endpoint URL construction from group + method/path keys.
#1573 d10dabe Thanks @tim-smart! - Expose a chunkSize option on Stream.fromIterable to control emitted chunk boundaries when constructing streams from iterables.
#1574 f82f549 Thanks @tim-smart! - Fix AI tool handler error typing so LanguageModel.generateText with a toolkit exposes wrapped AiError values rather than leaking raw AiErrorReason in the error channel.
### Patch Changes - #1555 `e691909` Thanks @tim-smart! - fix Stream.withSpan options - #1548 `d5f413f` Thanks @effect-bot! - Fix TxPubSub.publish and
#1555 e691909 Thanks @tim-smart! - fix Stream.withSpan options
#1548 d5f413f Thanks @effect-bot! - Fix TxPubSub.publish and TxPubSub.publishAll overloads to require Effect.Transaction in their return environment.
#1557 139d152 Thanks @A386official! - Fix MCP resource template parameter names resolving as param0, param1 instead of actual names by checking isParam on the original schema before toCodecStringTree transformation.
#1547 947e3d4 Thanks @effect-bot! - Fix Schedule.reduce to persist state updates when the combine function returns a synchronous value.
#1545 84b2cce Thanks @effect-bot! - Fix TupleWithRest post-rest validation to check each tail index sequentially.
#1552 7f5305e Thanks @tim-smart! - Constrain HttpServerRequest.source to object and key server-side request weak caches by request.source so middleware request wrappers share the same cache entries.
#1556 9e6fd84 Thanks @tim-smart! - rename WorkflowEngine.layer
#1558 fdb8a4b Thanks @tim-smart! - Fix Workflow.executionId to use schema makeUnsafe instead of the removed .make API.
#1553 0f986ef Thanks @kaylynb! - Fix spans never having parent span
#1541 9355fc0 Thanks @tim-smart! - Add Effect.findFirst and Effect.findFirstFilter for short-circuiting effectful searches over iterables.
Make Config.withDefault accept an eager value instead of LazyArg, aligning with CLI module conventions.
#1533 842a624 Thanks @tim-smart! - move ChildProcess apis into spawner service
#1536 4785eef Thanks @tim-smart! - add Context.Key type, used a base for Context.Service and Context.Reference
#1531 8fac95b Thanks @gcanti! - Revert Config.withDefault to v3 behavior, closes #1530.
Make Config.withDefault accept an eager value instead of LazyArg, aligning with CLI module conventions.
#1535 12ee8e2 Thanks @tim-smart! - change default ErrorReporter severity to Info
#1529 e542c94 Thanks @tim-smart! - Add dedicated AiError metadata interfaces per reason so provider packages can safely augment metadata without conflicting module declarations.
#1531 8fac95b Thanks @gcanti! - Fix Config.withDefault type inference, closes #1530.
#1528 6f4ebd1 Thanks @tim-smart! - Add Model.ModelName and provide it from AI model constructors.
#1537 989d1cc Thanks @tim-smart! - Revert Effect.partition to Effect v3 behavior by accumulating failures from the effect error channel and never failing.
Nothing published for this version
Refactor transaction model: remove Effect.atomic/Effect.atomicWith, add Effect.withTxState. All Tx operations now return Effect requiring explicit Eff
#1515 01e31fd Thanks @mikearnaldi! - Add transactional STM modules: TxDeferred, TxPriorityQueue, TxPubSub, TxReentrantLock, TxSubscriptionRef.
Refactor transaction model: remove Effect.atomic/Effect.atomicWith, add Effect.withTxState. All Tx operations now return Effect<A, E, Transaction> requiring explicit Effect.transaction(...) at boundaries.
Expose TxPubSub.acquireSubscriber/releaseSubscriber for composable transaction boundaries. Fix TxSubscriptionRef.changes race condition ensuring current value is delivered first.
Remove TxRandom module.
#1518 0890aab Thanks @IMax153! - Fix Command.withGlobalFlags type inference when mixing GlobalFlag.action and GlobalFlag.setting.
Setting service identifiers are now correctly removed from command requirements in mixed global flag arrays.
#1520 725260b Thanks @IMax153! - Ensure that OpenAI JSON schemas for tool calls and structured outputs are properly transformed
### Patch Changes - #1516 `8f59c32` Thanks @gcanti! - Fix Schema.encodeKeys to encode non-remapped struct fields during encoding.
### Patch Changes - #1513 `bf9096c` Thanks @gcanti! - Add SchemaParser.makeOption and Schema.makeOption for constructing schema values as Option. - #1
#1513 bf9096c Thanks @gcanti! - Add SchemaParser.makeOption and Schema.makeOption for constructing schema values as Option.
#1508 29f81ca Thanks @gcanti! - Schema: add OptionFromUndefinedOr and OptionFromNullishOr schemas.
#1498 68eb28c Thanks @kaylynb! - Fix OpenApi Multipart file upload schema generation
Remove GlobalFlag.add, GlobalFlag.remove, and GlobalFlag.clear
#1500 24ae609 Thanks @qadama831! - Unwrap _Success schema to enable field access.
#1486 0e3c059 Thanks @tim-smart! - Fix Stream.groupedWithin to stop emitting empty arrays when schedule ticks fire while upstream is idle.
#1503 e843b0a Thanks @tim-smart! - allow creating standalone http handlers from HttpApiEndpoints
#1499 f4389a2 Thanks @tim-smart! - fix atom node timeout cleanup
#1494 5b73de0 - Refine ExtractServices to omit tool handler requirements when automatic tool resolution is explicitly disabled through the disableToolCallResolution option.
#1496 595d2d6 Thanks @IMax153! - Refactor unstable CLI global flags to command-scoped declarations.
GlobalFlag.add, GlobalFlag.remove, and GlobalFlag.clearCommand.withGlobalFlags(...) as the declaration API for command/subcommand scopeGlobalFlag.setting constructor to curried form which carries type-level identifier:
GlobalFlag.setting({ flag, ... })GlobalFlag.setting("id")({ flag })effect/unstable/cli/GlobalFlag/${id}Flag combinators (optional, withDefault) rather than setting constructor defaultsGlobalFlag.setting now takes { flag, defaultValue } and returns a setting that is a Context.Reference, so handlers and Command.provide* effects can yi
#1471 c414700 Thanks @IMax153! - Make CLI global settings directly yieldable and simplify built-in names.
GlobalFlag.setting now takes { flag, defaultValue } and returns a setting that is a Context.Reference, so handlers and Command.provide* effects can yield* global setting values directly.
Built-in settings keep internal behavior in runWith (for example, --log-level still configures References.MinimumLogLevel) while also being readable as values.
Also renamed built-in globals:
GlobalFlag.CompletionsFlag -> GlobalFlag.CompletionsGlobalFlag.LogLevelFlag -> GlobalFlag.LogLevel#1490 a30c969 Thanks @gcanti! - Fix OpenApi.fromApi preserving multiple response content types for one status code, closes #1485.
The elapsedSincePrevious > window check included sleep time from the previous step, so any timer imprecision (e.g. 1001ms for a 1000ms sleep) triggere
#1454 368f4c3 Thanks @lucas-barake! - Expose NoSuchElementError in the error type of stream-based Atom.make overloads.
#1469 db8a579 Thanks @tim-smart! - Update unstable schema variant helpers to use array-based arguments for FieldOnly, FieldExcept, and Union, aligning VariantSchema and Model with other v4 API shapes.
#1457 668b703 Thanks @tim-smart! - Run request resolver batch fibers with request services by using Effect.runForkWith, so resolver delay effects and runAll execution see the request service map.
#1461 d40e76b Thanks @mikearnaldi! - Fix Schedule.fixed double-executing the effect due to clock jitter.
The elapsedSincePrevious > window check included sleep time from the
previous step, so any timer imprecision (e.g. 1001ms for a 1000ms sleep)
triggered an immediate zero-delay re-execution.
#1464 6e18cf8 Thanks @gcanti! - Use the identifier annotation as the expected message when available, closes #1458.
#1475 86062e8 Thanks @tim-smart! - Add a CI check job that runs pnpm ai-docgen and fails if it produces uncommitted changes.
#1448 c27ce75 Thanks @IMax153! - Refactor CLI built-in options to use Effect services with GlobalFlag
Built-in CLI flags (--help, --version, --completions, --log-level) are now implemented as Effect services using Context.Reference. This provides:
GlobalFlag.addNew GlobalFlag module exports:
Action<A> and Setting<A> types for different flag behaviorsHelp, Version, Completions, LogLevel references for built-in flagsadd, remove, clear functions for managing global flagsExample:
const app = Command.make("myapp");
Command.run(app, { version: "1.0.0" }).pipe(
GlobalFlag.add(CustomFlag, customFlagValue),
);
#1468 e2d4fbf Thanks @lucas-barake! - Fix Rpc.ExtractProvides to use middleware service ID instead of constructor type.
#1465 114ab42 Thanks @lloydrichards! - tighten Schema on _meta fields in McpSchema; closes #1463
#1470 484caec Thanks @tim-smart! - Add Command.withAlias for unstable CLI commands, including subcommand parsing by alias and help output that renders aliases as name, alias in subcommand listings.
Previously, stripResolvedApprovals only ran when there were pending approvals in the current round. Stale artifacts from earlier rounds would leak to
#1439 70a74e8 Thanks @gcanti! - Add Config.nested combinator to scope a config under a named prefix, closes #1437.
#1452 b5b6e10 Thanks @tim-smart! - make fiber keepAlive setInterval evaluation lazy
#1431 f5ce5a9 Thanks @tim-smart! - Add Random.nextBoolean for generating random boolean values.
#1450 a29eb70 Thanks @tim-smart! - use cause annotations for detecting client aborts
#1445 c7b36e5 Thanks @mattiamanzati! - Fix Graph.toMermaid to escape special characters using HTML entity codes per the Mermaid specification.
#1443 9381d6d Thanks @mikearnaldi! - Fix HttpClient.retryTransient autocomplete leaking Schedule internals by splitting the {...} | Schedule union into separate overloads.
#1444 88439f1 Thanks @gcanti! - Schema.encodeKeys: relax input constraint from Struct to schemas with fields so Schema.Class works, closes #1412.
#1438 e35307d Thanks @mikearnaldi! - Atom.searchParam: decode initial URL values correctly when a schema is provided
#1425 c7df4bc Thanks @candrewlee14! - Fix LanguageModel stripping of resolved approval artifacts across multi-round conversations.
Previously, stripResolvedApprovals only ran when there were pending approvals
in the current round. Stale artifacts from earlier rounds would leak to the
provider, causing errors. The stripping now runs unconditionally.
In streaming mode, pre-resolved tool results are also emitted as stream parts
so Chat.streamText persists them to history, preventing re-resolution on
subsequent rounds.
#1453 accaf3b Thanks @tim-smart! - allow mcp errors to be encoded correctly
#1440 3e1c270 Thanks @lloydrichards! - extend McpSchema to work with extensions
#1447 6cd81f7 Thanks @tim-smart! - remove all non-regional service usage
#1451 f222da3 Thanks @tim-smart! - Add Effect.annotateLogsScoped to apply log annotations for the current scope and automatically restore previous annotations when the scope closes.
#1434 61f901d Thanks @tim-smart! - Fix JSON-RPC serialization to return an object for non-batched requests while preserving array responses for true batch requests.
### Patch Changes - #1429 `88659ed` Thanks @tim-smart! - Add grouped subcommand support to Command.withSubcommands, including help output sections for
#1429 88659ed Thanks @tim-smart! - Add grouped subcommand support to Command.withSubcommands, including help output sections for named groups while keeping ungrouped commands under SUBCOMMANDS.
#1426 f2915e8 Thanks @tim-smart! - Add Effect.validate for validating collections while accumulating all failures, equivalent to the v3 Effect.validateAll behavior.
#1430 eb71ace Thanks @tim-smart! - Add Command.withExamples to attach concrete usage examples to CLI commands, expose them through HelpDoc.examples, and render them in the default help formatter.
#1415 2a16999 Thanks @mikearnaldi! - HashMap: compare HAMT bit positions as unsigned to preserve entry lookup when bit 31 is set
#1417 d42dd52 Thanks @mikearnaldi! - unstable/http Headers: hide inspectable prototype methods from for..in iteration to avoid invalid header names in runtime fetch polyfills
#1418 339adaf Thanks @mikearnaldi! - runtime: guard keepAlive setInterval / clearInterval so Effect.runPromise works in runtimes that block timer APIs
#1416 de19645 Thanks @mikearnaldi! - Queue.collect: stop duplicating drained messages by appending each batch once
#1413 9b1dc3b Thanks @gcanti! - Fix Schema.TupleWithRest incorrectly accepting inputs with missing post-rest elements, closes #1410.
#1427 8bced95 Thanks @tim-smart! - Add Command.annotate and Command.annotateMerge to unstable CLI commands, and include command annotations in HelpDoc so custom help formatters can access command metadata.
#1401 9431420 Thanks @tim-smart! - Add WorkflowEngine.layer, an in-memory layer for the unstable workflow engine.
#1428 948dca2 Thanks @tim-smart! - Add Command.withShortDescription and use short descriptions for CLI subcommand listings, with fallback to the full command description.
#1405 d18e327 Thanks @candrewlee14! - Strip resolved tool approval artifacts from prompt before sending to provider, preventing errors when providers reject pre-resolved approval requests.
#1424 ab512f7 Thanks @tim-smart! - expose more atom Node properties
### Patch Changes - #1396 `371acab` Thanks @gcanti! - Add unstable/encoding subpath export. - #1392 `856d774` Thanks @tim-smart! - Fix a race in Semap
#1396 371acab Thanks @gcanti! - Add unstable/encoding subpath export.
#1392 856d774 Thanks @tim-smart! - Fix a race in Semaphore.take where interruption could leak permits after a waiter was resumed.
#1388 b9e9202 Thanks @tim-smart! - Export Effect do notation APIs (Do, bindTo, bind, and let) from effect/Effect and add runtime and type-level coverage.
#1387 1d1a974 Thanks @tim-smart! - short circuit when Fiber.joinAll is called with an empty iterable
#1386 6bfe2a6 Thanks @tim-smart! - simplify http logger disabling
#1381 b12c811 Thanks @tim-smart! - Fix UrlParams.Input usage to accept interface-typed records in HTTP client and server helpers while keeping coercion constraints for url parameter values.
#1383 d17d98a Thanks @tim-smart! - Rename HttpClient.retryTransient option mode to retryOn and rename "both" to "errors-and-responses".
#1399 68c3c7c Thanks @tim-smart! - Add Random.shuffle to shuffle iterables with seeded randomness support.
### Patch Changes - #1376 `3386557` Thanks @gcanti! - HttpApiEndpoint: relax params, query, and headers constraints to accept a full schema in additio
#1376 3386557 Thanks @gcanti! - HttpApiEndpoint: relax params, query, and headers constraints to accept a full schema in addition to a record of fields.
#1379 b6666e3 Thanks @tim-smart! - Fix AtomHttpApi.query to forward v4 params / query request fields to HttpApiClient at runtime.
Also align AtomHttpApi endpoint type inference with v4 HttpApiEndpoint params/query naming and add a regression test.
### Patch Changes - #1371 `246e672` Thanks @IMax153! - Fix ChildProcess options type and implement PgMigrator - #1372 `807dec0` Thanks @pawelblaszczyk
### Patch Changes - #1366 `a2bda6d` Thanks @tim-smart! - rename SqlSchema.findOne\* apis - #1360 `1f95a2b` Thanks @tim-smart! - Add Schedule.jittered
#1366 a2bda6d Thanks @tim-smart! - rename SqlSchema.findOne* apis
#1360 1f95a2b Thanks @tim-smart! - Add Schedule.jittered to randomize schedule delays between 80% and 120% of the original delay.
#1364 a8d5e79 Thanks @gcanti! - Schema: avoid eager resolution for type-level helpers, closes #1332
#1369 a5386ba Thanks @tim-smart! - align HttpClientRequest constructors with http method names
#1369 a5386ba Thanks @tim-smart! - remove body restriction for HttpClientRequest's
#1358 06d8a03 Thanks @tim-smart! - Add LogLevel.isEnabled for checking a log level against References.MinimumLogLevel.
#1363 8caac76 Thanks @tim-smart! - rename DurationInput to Duration.Input
#1363 8caac76 Thanks @tim-smart! - DateTime.distance now returns a Duration
#1363 8caac76 Thanks @tim-smart! - remove rpc client nesting to improve type performance
`ts class MyClass extends Pipeable.Class() { constructor(public a: number) { super(); } methodA() { return this.a; } } console.log(new MyClass(2).pipe
#1338 3247da2 Thanks @Leka74! - Add showOperationId to HttpApiScalar.ScalarConfig.
#1326 f205705 Thanks @gcanti! - Schema: add BigDecimal schema with comparison checks (isGreaterThanBigDecimal, isGreaterThanOrEqualToBigDecimal, isLessThanBigDecimal, isLessThanOrEqualToBigDecimal, isBetweenBigDecimal).
#1328 f35022c Thanks @gcanti! - Schema: add DateTimeZoned, TimeZoneOffset, TimeZoneNamed, and TimeZone schemas.
#1325 8622721 Thanks @KhraksMamtsov! - Make Data.Class, Data.TaggedClass, and Cause.YieldableError pipeable.
#1323 fc660ab Thanks @KhraksMamtsov! - Port Pipeable.Class from v3.
class MyClass extends Pipeable.Class() {
constructor(public a: number) {
super();
}
methodA() {
return this.a;
}
}
console.log(new MyClass(2).pipe((x) => x.methodA())); // 2
class A {
constructor(public a: number) {}
methodA() {
return this.a;
}
}
class B extends Pipeable.Class(A) {
constructor(private b: string) {
super(b.length);
}
methodB() {
return [this.b, this.methodA()];
}
}
console.log(new B("pipe").pipe((x) => x.methodB())); // ['pipe', 4]
#1337 f37dc33 Thanks @IMax153! - Encoding: consolidate effect/encoding sub-modules (Base64, Base64Url, Hex, EncodingError) into a top-level Encoding module. Functions are now prefixed: encodeBase64, decodeBase64, encodeHex, decodeHex, etc. The effect/encoding sub-path export is removed.
#1351 3662f32 Thanks @tim-smart! - add Schema.HashSet for decoding and encoding HashSet values.
#1336 a7d436f Thanks @mikearnaldi! - Extract Semaphore and Latch into their own modules.
Semaphore.make / Semaphore.makeUnsafe replace Effect.makeSemaphore / Effect.makeSemaphoreUnsafe.
Latch.make / Latch.makeUnsafe replace Effect.makeLatch / Effect.makeLatchUnsafe.
Merge PartitionedSemaphore into Semaphore as Semaphore.Partitioned, Semaphore.makePartitioned, Semaphore.makePartitionedUnsafe.
#1345 6856a41 Thanks @tim-smart! - allocate less effects when reading a file
#1350 8c417d0 Thanks @tim-smart! - Add "Previously Known As" JSDoc migration notes for the Semaphore and Latch APIs extracted from Effect.
#1355 5419570 Thanks @tim-smart! - ensure non-middleware http errors are correctly handled
#1352 449c5ed Thanks @tim-smart! - Add Schema.HashMap for decoding and encoding HashMap values.
#1347 4b5ec12 Thanks @tim-smart! - use .toJSON for default .toString implementations
#1329 df87937 Thanks @gcanti! - Schema: extract shared dateTimeUtcFromString transformation for DateTimeUtc and DateTimeUtcFromString.
#1318 5dbfca8 Thanks @gcanti! - Schema: rename $ suffix to $ prefix for type-level identifiers that conflict with built-in names (Array$ → $Array, Record$ → $Record, ReadonlyMap$ → $ReadonlyMap, ReadonlySet$ → $ReadonlySet).
#1356 e629497 Thanks @tim-smart! - allow passing void for request constructors
#1348 981c991 Thanks @tim-smart! - Fix Schedule.andThenResult to initialize the right schedule only after the left schedule completes.
This removes the extra immediate transition tick and correctly completes when the right schedule is finite.
#1320 1ca2ed6 Thanks @gcanti! - Struct: add Struct.Record constructor for creating records with the given keys and value.
#1342 45722bd Thanks @cevr! - Schema.TaggedErrorClass, Schema.Class, and Schema.ErrorClass constructors now allow omitting the props argument when all fields have constructor defaults (e.g. new MyError() instead of new MyError({})).
#1322 eb2a85e Thanks @tim-smart! - Add a requireServicesAt option to PersistedCache.make so lookup-service requirements can be configured like Cache.
Use Schema.toCodecJson instead of Schema.encodeSync/Schema.decodeSync directly, so that encoded values are plain JSON objects that survive serializati
#1317 f6e133e Thanks @tim-smart! - support tag unions in Effect.catchTag/Reason
#1314 e3893cc Thanks @zeyuri! - Fix Atom.serializable encode/decode for wire transfer.
Use Schema.toCodecJson instead of Schema.encodeSync/Schema.decodeSync directly, so that encoded values are plain JSON objects that survive serialization roundtrips (JSON, seroval, etc.). Previously, AsyncResult.Schema encode produced instances with custom prototypes that were lost after wire transfer, causing decode to fail with "Expected AsyncResult" errors during SSR hydration.
#1314 e3893cc Thanks @zeyuri! - Port ReactHydration to effect-smol.
Add Hydration module to effect/unstable/reactivity with dehydrate, hydrate, and toValues for SSR state serialization. Add HydrationBoundary React component to @effect/atom-react with two-phase hydration (new atoms in render, existing atoms after commit).
### Patch Changes - #1308 `c5a18ef` Thanks @tim-smart! - improve Schema.TaggedUnion .match auto completion - #1310 `bc6b885` Thanks @tim-smart! - Add
### Patch Changes - #1303 `3a0cf36` Thanks @tim-smart! - add Result.failVoid - #1307 `c4da328` Thanks @tim-smart! - Add HttpClientRequest.bodyFormData
### Patch Changes - #1302 `a22ce73` Thanks @tim-smart! - allow undefined for VariantSchema.Overridable input - #1299 `ebdabf7` Thanks @tim-smart! - Po
#1302 a22ce73 Thanks @tim-smart! - allow undefined for VariantSchema.Overridable input
#1299 ebdabf7 Thanks @tim-smart! - Port SqlSchema.findOne from effect v3 to return Option on empty results and add SqlSchema.single for the fail-on-empty behavior.
#1298 8f663bb Thanks @tim-smart! - Add Effect.catchNoSuchElement, a renamed port of v3 Effect.optionFromOptional that converts NoSuchElementError failures into Option.none.
### Patch Changes - #1293 `0fecf70` Thanks @mikearnaldi! - Add Effect.filter support for synchronous Filter.Filter overloads and correctly handle non-
#1293 0fecf70 Thanks @mikearnaldi! - Add Effect.filter support for synchronous Filter.Filter overloads and correctly handle non-effect Result return values at runtime.
#1294 709569e Thanks @tim-smart! - Fix Prompt.text and related text prompts to initialize from default values so users can edit the default input directly.
### Major Changes - #1183 `be642ab` Thanks @tim-smart! - v4 beta
Nothing published for this version
### Patch Changes - #6443 `7ccbd9c` Thanks @coyaSONG! - Clarify that Context.GenericTag requires a key. - #6673 `ab2af6d` Thanks @tim-smart! - Fix zer
#6443 7ccbd9c Thanks @coyaSONG! - Clarify that Context.GenericTag requires a key.
#6673 ab2af6d Thanks @tim-smart! - Fix zero-capacity Mailbox rendezvous behavior for take and takeN.
#6761 3cc3c6e Thanks @tim-smart! - Use a linear matcher when decoding template literals containing only string spans.
#6507 3d390f2 Thanks @tim-smart! - Disable unhandled error logging for fibers spawned by Effect.timeout.
#6762 fcabf08 Thanks @tim-smart! - Redact errors from wrapped config parsers and avoid JSON key path collisions.
#6669 735d81b Thanks @tim-smart! - Fix Stream.asyncPush termination with bounded dropping and sliding buffers.
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →