github Effect-TS/effect effect@4.0.2

Patch Changes

  • #8870 26c1089 Thanks @Makisuo! - Update AI tracing to use current OpenTelemetry GenAI conventions:

    • Replace gen_ai.system with gen_ai.provider.name. The system option, BaseAttributes and WellKnownSystem are removed in favor of provider: { name }, ProviderAttributes and WellKnownProviderName.
    • Remove gen_ai.token.type, which is not a span attribute in the current conventions, along with the token option, TokenAttributes and the AllAttributes types.
    • LanguageModel spans are client spans and record gen_ai.output.type (text or json) for every provider. The OpenAI responseFormat telemetry option and WellKnownResponseFormat are removed.
    • Move OpenAI service-tier and system-fingerprint attributes from gen_ai.openai.* to openai.*.
    • Rename concurrency, toolChoice and objectName span attributes to effect.ai.concurrency, effect.ai.tool_choice and effect.ai.object_name. Tool choices record the resolved value, defaulting to "auto"; object choices are JSON-encoded.
    • Include cached tokens in Anthropic gen_ai.usage.input_tokens and report cache reads and writes as gen_ai.usage.cache_read.input_tokens and gen_ai.usage.cache_write.input_tokens. The duplicate Anthropic cacheCreationInputTokens and cacheReadInputTokens response options are removed.
  • #8849 6c59de7 Thanks @gcanti! - Fix Arbitrary property checks, schema generation, and shrinking swallowing defects or interruption when they accompany typed failures. Propagate the defect and interruption reasons with their annotations, removing typed failures from mixed causes to preserve the existing error types.

  • #8760 467d3ac Thanks @fubhy! - Include runtime layer errors in the result type of AtomRuntime.subscriptionRef.

  • #8820 375c1b0 Thanks @jarrednorrisdev! - Preserve the URL hash and omit empty query strings when writing Atom.searchParam.

  • #8771 45a70ce Thanks @jarrednorrisdev! - Prevent Atom.windowFocusSignal and Atom.refreshOnWindowFocus from throwing when window is undefined.

  • #8837 fb757e3 Thanks @tim-smart! - Fix a Cache.get interruption race that could leave an abandoned lookup running and its key stuck in the cache.

  • #8778 716e358 Thanks @fubhy! - Fix a stack overflow when many consecutive failure handlers throw synchronously. The thrown defect is now captured as the fiber's exit and pending finalizers still run.

  • #8838 af114e6 Thanks @tim-smart! - Derive Channel.decodeText options from the TextDecoder constructor so declarations work with Node-only types without requiring the DOM library.

  • #8758 d0b3862 Thanks @fubhy! - Fix Channel.mapInput data-last overload to preserve channel requirements and add the mapping function's requirements.

  • #8757 7064da9 Thanks @fubhy! - Fix Channel.runIntoPubSub to include the channel's error type in the returned Effect.

  • #8810 eee0eeb Thanks @fubhy! - Fix compiled Struct parsers sharing mutable output when the same suspended Effect is executed more than once.

  • #8808 b9d6581 Thanks @fubhy! - Preserve provider defects and interruption reasons during Config parsing, and prevent Config.orElse from recovering mixed causes.

  • #8877 7a721ce Thanks @jayhemnani9910! - Preserve separators inside Config.Record values, including base64 padding in OTLP headers.

  • #8832 a0cb4c2 Thanks @tim-smart! - Add image input to DecisionModel.decide. Providers opt in with supportsImages: true and receive images through ProviderOptions.images. Models without image support reject nonempty image input with InvalidUserInputError.

  • #8765 3cb395e Thanks @fubhy! - Fix ExecutionPlan to preserve errors and service requirements from layers, predicates, and schedules across fallback steps. Provide captured services to schedules when using captureRequirements.

  • #8770 540ecd1 Thanks @fubhy! - Tag every module and directly importable export with an explicit @stability. @stability stable follows strict semver, and @stability unstable may receive breaking changes in minor releases.

  • #8814 aefe05a Thanks @fubhy! - Fix Map and Set schema equivalences incorrectly treating proper subsets as equal.

  • #8804 c381fbc Thanks @fubhy! - Fix stack overflow when many equal requests share a pending RequestResolver.withCache entry.

  • #8805 c6f2179 Thanks @fubhy! - Allow interruption while waiting for permits or locks in TxSemaphore and TxReentrantLock helpers, while preserving automatic release after acquisition.

  • #8586 0aeb7fd Thanks @Marve10s! - Allow spans without an Effect parent to inherit active OpenTelemetry spans created outside Effect.

  • #8799 2fbecc8 Thanks @fubhy! - Preserve finalizer defects in Effect.repeat and Effect.schedule. Prevent Effect.retry from retrying failures containing defects or interruptions.

  • #8753 7095539 Thanks @jayhemnani9910! - Fix Toml.parse to trim an immediate opening CRLF in basic and literal multiline strings, matching its existing LF handling.

  • #8752 46b75b1 Thanks @jayhemnani9910! - Fix Yaml.parse block scalar chomping to preserve trailing line breaks with keep (|+, >+) and avoid adding line breaks to empty or unterminated scalars.

  • #8815 99b6b45 Thanks @fubhy! - Fix Array concatenation reducers sharing mutable empty results across calls and reducer instances.

  • #8811 e4cb9f1 Thanks @fubhy! - Fix Standard Schema and Standard JSON Schema adapters to use the child schema rather than an inherited parent adapter.

  • #8792 2e03688 Thanks @fubhy! - Fix Stream.peel dropping the sink's unconsumed elements from a partially consumed chunk.

  • #8809 b817ebe Thanks @fubhy! - Fix suspended Schema union parsers reusing successes and issues when the same decode or encode effect is run again.

  • #8742 4153144 Thanks @wouter173! - Fix the data-last overload of AsyncResult.flatMap to correctly infer a changed success type.

  • #8830 2b3c63c Thanks @devangpratap! - Fix HttpClient retaining unread responses on runtimes without FinalizationRegistry, such as Hermes.

  • #8772 bd00773 Thanks @juliusmarminge! - Read HttpClientResponse.cookies on platforms whose Headers has no getSetCookie, such as React Native, instead of throwing.

  • #8873 146e86a Thanks @tim-smart! - Align HTTP tracing span names, response error status, server addresses and ports with OpenTelemetry conventions. Make header capture opt-in and export homogeneous primitive arrays as array attributes in @effect/opentelemetry.

  • #8759 44defad Thanks @fubhy! - Fix HttpServer service serve to infer required services from the middleware-transformed app.

  • #8821 22d6f4d Thanks @Makisuo! - Mark HttpMiddleware.tracer server spans as failed for 5xx responses, including rendered errors, without changing the application exit or existing span failure causes.

  • #8852 7d8d497 Thanks @effect-bot! - Report the 101 status of a successful WebSocket upgrade to server middleware such as HttpMiddleware.logger and HttpMiddleware.tracer, instead of the handler's discarded response status.

  • #8767 98a5ed7 Thanks @fubhy! - Fix HttpApiClient and AtomHttpApi result types for union response modes while preserving decoded-only results when the mode is omitted.

  • #8858 d350f8e Thanks @jayhemnani9910! - Fix HttpApi rejecting single-value array fields in form-urlencoded and GET payloads.

  • #8834 bd96be0 Thanks @tim-smart! - Return 500 and report HTTP API response encoding failures to ErrorReporter, while keeping request decoding failures at 400 and unreported. Preserve response failures as HttpApiSchemaError values for schema-error middleware.

  • #8875 f6af4b6 Thanks @tim-smart! - expose more of the atom registry apis

  • #8836 7234786 Thanks @tim-smart! - Cache the Kubernetes service-account token for one minute so K8sHttpClient picks up rotated credentials without reading the token file on every request.

  • #8773 1f74b62 Thanks @juliusmarminge! - Add opt-in allowSessionTermination to McpServer.layerHttp. DELETE ends the session and interrupts its active requests; later requests with that session id return 404.

    Fix an RPC cancellation race by registering request fibers before their handlers run.

  • #8775 42763ce Thanks @RhysSullivan! - McpServer.layerHttp uses the negotiated protocol version when a session request omits MCP-Protocol-Version. Unsupported or mismatched protocol versions, missing required MCP-Session-Id headers, and initialize requests with a session header now return JSON-RPC error bodies.

  • #8842 5630677 Thanks @brandon-julio-t! - Fix MCP toolkit registration to require tool handler and schema services.

  • #8864 a0e1b87 Thanks @Makisuo! - Leave interrupt-only spans Unset with an effect.fiber.interrupted: true attribute instead of Ok with an "Interrupted" description and the span.label / status.interrupted attributes. Successful spans keep Ok; failures keep Error and their exception events.

    Cause.prettyErrors no longer captures an internal stack frame for non-object failures such as Effect.fail("boom"); the stack is now the message plus the span frame, when available. This affects the exception.stacktrace exported by both tracers and the output of Cause.pretty.

  • #8868 f5716ad Thanks @Makisuo! - Align OTLP and @effect/opentelemetry logs, traces, and resources with OpenTelemetry conventions.

  • #8869 26931d0 Thanks @Makisuo! - OtlpMetrics exports each summary as one OTLP Summary metric named <id> instead of <id>_quantiles, <id>_count and <id>_sum Sum metrics. Summaries are always cumulative. Common unit names such as milliseconds are mapped to UCUM, and bigint values beyond 2^53 keep their precision.

  • #8756 972c80f Thanks @creatifcoding! - Fix PostgreSQL SqlEventJournal writes by storing entry and remote IDs as BYTEA, and decode BIGINT timestamps returned as strings or bigints.

    Existing tables with UUID columns are not migrated automatically. Recreate both journal tables only after confirming they are empty, or externally migrate id, remote_id, and entry_id to BYTEA while preserving existing data.

  • #8762 efebfa9 Thanks @fubhy! - Include completion-handler services in the requirements of McpServer.registerPrompt and McpServer.prompt, including optional handlers.

  • #8819 a3b4cf3 Thanks @mikearnaldi! - Prevent message loss when Queue.take, takeAll, takeN, takeBetween, poll, and clear are interrupted at a scheduler yield.

  • #8816 3ed997b Thanks @fubhy! - Fix Channel.merge hanging or succeeding when a side finalizer fails, preserving both usage and finalizer failures.

  • #8798 7b396bd Thanks @fubhy! - Fix Channel.mergeAll and concurrent Channel.flatMap dropping inner scope finalizer defects, preserving both usage and release failures.

  • #8800 c07c144 Thanks @fubhy! - Fix Cron.next returning past occurrences or exhausting its search limit when starting in a repeated DST interval.

  • #8777 8903b68 Thanks @fubhy! - Fix child fibers reusing completed transaction journals so later transactions commit their writes.

  • #8784 a84aa4e Thanks @fubhy! - Fix FiberHandle losing ownership of fibers started by a synchronous replacement finalizer.

  • #8782 88917eb Thanks @fubhy! - Fix Formatter.formatJson redaction of getter-returned values with toJSON without invoking getters twice.

  • #8776 50a5686 Thanks @fubhy! - Fix Effect.effectify so throwing error mappers become defects instead of escaping asynchronous callbacks and leaving fibers suspended.

  • #8789 c419a0e Thanks @fubhy! - Fix stack overflows when PartitionedSemaphore hands permits through long queues of synchronous tasks.

  • #8791 d85a309 Thanks @fubhy! - Fix Queue.clear swallowing failures combined with Cause.Done.

  • #8785 7e7ede6 Thanks @fubhy! - Fix Queue consumers defecting and messages being buffered after reentrant shutdown while resuming blocked producers.

  • #8779 1803500 Thanks @fubhy! - Mask interruption before invoking scope finalizer callbacks so singleton cleanup completes when its callback interrupts the closing fiber.

  • #8795 495740d Thanks @fubhy! - Fix Stream.zipLatest, zipLatestWith, and zipLatestAll hanging when an input completes without emitting.

  • #8780 985860d Thanks @fubhy! - Preserve failures raised while a transaction is retrying instead of rerunning the transaction.

  • #8833 e36abbb Thanks @tim-smart! - Return HTTP 200 with an empty body for empty RPC POST requests using framed serialization.

  • #8867 c6086ee Thanks @Makisuo! - RPC client and server spans now set span kind client / server and record the OpenTelemetry rpc.system.name (effect_rpc) and rpc.method attributes. User spanAttributes still override them.

    Default span names are now the RPC method, for example Echo.Ping instead of RpcClient.Echo.Ping. Update dashboards, alerts or samplers that match the old names, or pass spanPrefix: "RpcClient" / spanPrefix: "RpcServer" to keep them. Spans with an explicit spanPrefix keep their existing names.

  • #8835 0ac6ac8 Thanks @tim-smart! - Fix RPC request defects breaking subsequent SchemaBinary calls after an unknown request tag or payload decoding failure.

  • #8825 90a1bae Thanks @tim-smart! - Add configurable pingInterval and pingTimeout to RPC socket clients, counting any decoded server frame as liveness. Forward retryPolicy through layerProtocolSocket. The default ping interval and timeout remain 5 seconds.

  • #8748 b1d200c Thanks @gcanti! - Expose the selected tag property key through tag on schemas returned by Schema.toTaggedUnion and Schema.TaggedUnion, closes #8681.

  • #8764 1ba8521 Thanks @fubhy! - Fix the data-last Sink.catchCause overload to return the handler's error type instead of the original error type.

  • #8878 1b35732 Thanks @jayhemnani9910! - Fix Stream.slidingSize dropping elements from the final partial window when windows overlap.

  • #8855 763b445 Thanks @tim-smart! - Fix SQL unencrypted event-log notifications to publish in sequence order after commit, without missing startup rows or publishing rolled-back writes.

  • #8866 00f1cc7 Thanks @Makisuo! - Align SQL tracing with OpenTelemetry database conventions:

    • Name statement spans by db.namespace, server.address[:server.port] or db.system.name, falling back to sql.execute. The rules are exported as Statement.spanName and Statement.spanTarget.
    • Record Effect execution methods in effect.sql.method instead of db.operation.name.
    • Use internal transaction spans with effect.sql.transaction.commit|savepoint|rollback events.
    • Name D1 batches of two or more statements BATCH, or BATCH {target} when a target is set, with db.operation.name set to BATCH and db.operation.batch.size.
  • #8857 d4f4bc8 Thanks @jayhemnani9910! - Fix Stream.groupBy, Stream.groupByKey, Stream.partition, and Stream.partitionEffect hanging when a substream consumer stops early by shutting down its queue when the consumer finishes.

  • #8794 f11526a Thanks @fubhy! - Fix Stream.tapSink swallowing sink failures after end-of-stream.

  • #8817 8781388 Thanks @fubhy! - Fix Channel.callback and Channel.callbackArray losing registration effect failures and defects.

  • #8796 5326527 Thanks @fubhy! - Fix Channel.acquireUseRelease leaking resources when interrupted during acquisition.

  • #8813 8409eb4 Thanks @fubhy! - Fix Floyd-Warshall path reconstruction looping on zero-cost cycles after floating-point rounding.

  • #8781 c5cf8ce Thanks @fubhy! - Fix Layer.buildWithMemoMap retries returning an already-finalized resource by deferring each build until execution.

  • #8807 684ccdc Thanks @fubhy! - Fix Logger.batched shutdown to finish in-flight output before flushing remaining entries, without overlapping flushes.

  • #8788 33303ea Thanks @fubhy! - Fix Pool shutdown to wait for borrowed resources to be finalized before releasing owner scope dependencies.

  • #8786 b79fcb8 Thanks @fubhy! - Fix PubSub publishers accepting surplus messages after end when they yield during publishing.

  • #8790 888a189 Thanks @fubhy! - Reject NaN and fractional PubSub capacities to prevent nonterminating batch publication, while preserving Infinity support.

  • #8787 9b8200d Thanks @fubhy! - Fix PubSub take and takeAll delivering the final message before data published during waiter registration.

  • #8783 82303c1 Thanks @fubhy! - Fix ManagedRuntime disposal deadlocking when called from one of its own fibers, including their child fibers.

  • #8803 76fcd89 Thanks @fubhy! - Report ScopedCache finalizer failures during expiry and capacity eviction without failing reads or blocking replacement lookups.

  • #8793 f31e6b7 Thanks @fubhy! - Fix Stream.tapSink hanging when the sink finishes during an upstream pull.

  • #8797 332d363 Thanks @fubhy! - Fix Sink.make to return successful pipeline results instead of failing with a channel completion signal.

  • #8806 a6c7dcb Thanks @fubhy! - Preserve one-shot iterable inputs across transaction retries in TxPriorityQueue.offerAll, TxHashMap.fromIterable/setMany/removeMany, and TxHashSet.fromIterable.

Don't miss a new effect release

NewReleases is sending notifications on new releases.