effect@4.0.0-rc.109
Pre-releasePatch Changes
-
#7219
a0743f2Thanks @tim-smart! - Add SQL, HttpApi testing, and CLI schema examples to the published AI documentation. -
#7241
17892e7Thanks @tim-smart! - Use Context mapUnsafe in less call sites -
#7240
4d8a230Thanks @tim-smart! - FixEffect.fromOptiondata-first inference for inlineOptionexpressions. -
#7216
f21f9c9Thanks @tim-smart! - Add aHttpStatusmodule toeffect/unstable/httpthat centralizes the mapping from HTTP status literal names to numeric codes and exportsHttpStatus.fromLiteral.HttpApiSchema.statusnow consumes the new module. -
#6829
18270ddThanks @lloydrichards! - MCP servers now support the 2024-11-05 and 2025-03-26 RPC revisions through version-specific protocol adapters. -
#7218
26db404Thanks @tim-smart! - Run SQLPersistedQueuetable creation through versioned migrations so future schema changes can be applied safely. -
#7210
2670398Thanks @tim-smart! - Preserve nanosecond precision when adjustingTestClockwith large durations. -
#7205
3702bedThanks @tim-smart! - Remove thekubernetes-typesdependency by vendoring the Kubernetes Pod declarations used by the cluster helpers and exporting them fromeffect/unstable/cluster/K8sTypes. -
#7236
ccae60eThanks @roninjin10! - Propagate a failedBEGINorSAVEPOINTfromSqlClient.withTransactionas a typedSqlError.makeWithTransactionwrapped thebeginstep together with the transaction body, so a
failedBEGINtook the rollback branch. No transaction was active at that point, the
ROLLBACKfailed, and itsEffect.orDiewrapper replaced the original typed error with a
defect (cannot rollback - no transaction is active). Callers could no longer classify the
failure as retryable. The path became reachable when the sqlite client started using
BEGIN IMMEDIATE, which acquires a write lock and can fail withSQLITE_BUSY.Commit and rollback now run only after
beginorsavepointsucceeds. A failedbeginor
savepointfails with its originalSqlError, leaves the wrapped effect unexecuted, and
still closes the acquired connection scope. -
#7206
6ff5396Thanks @tim-smart! - Bound cluster runner entity residency and storage reads.ShardingConfiggains two knobs:maxResidentEntities(default10_000): the maximum number of entities
that can be resident on a runner at the same time. At the cap, the storage
read loop stops admitting messages for new entity addresses (they stay in
storage until a slot frees up) and volatile sends to new addresses fail with
MailboxFull. Persisted sends still succeed."unbounded"restores the
previous behaviour and can only be set programmatically.unprocessedMessageBatchSize(default1024): the maximum number of
unprocessed messages read from storage in a single poll.
MessageStorage.unprocessedMessagesaccepts an optional
{ limit, addresses }argument, and only claims the messages it actually
returns. The memory implementation now applies the same ten-minute claim
window as SQL, so bounded reads advance past in-flight requests; resetting an
address or shard makes its claimed messages immediately eligible again.The encoded driver contract replaces
Encoded.resetAddresswith the batched
Encoded.resetAddressesoperation.SqlMessageStorage.makeEncodedconstructs
the SQL encoded driver directly for custom storage composition.ClusterWorkflowEngineentities (workflows and the durable clock) now use a
fixed ten-second idle time, so completed and suspended executions release their
entity slots quickly. Their state is durable, so an evicted execution is
rebuilt from storage when its next message arrives.