Added
- Nexus links of type
Link.Callbackare converted to and from their Nexus wire form, so they are carried through Nexus requests and responses instead of being dropped. @temporalio/interceptors-opentelemetryand@temporalio/interceptors-opentelemetry-v2now expose Workflow-only/workflowentrypoints. Existing root exports andlib/*imports remain available.- Experimental: External storage failures now surface as dedicated error types exported from
@temporalio/common:ExternalStorageDriverError,ExternalStorageUnregisteredDriverError, andExternalStorageReferenceError, all extending the newExternalStorageErrorbase type. - Experimental:
WorkflowClient.getHandle,ActivityClient.getHandleWithOptions, andNexusClient.getHandlecan infer detached handle result types and read outputTypeInfofrom supplied Workflow, Activity, and Nexus Operation definitions. Explicit outputTypeInfois checked against the declared handle result type. - Experimental:
ExternalStoragenow accepts cooperative concurrency limits:maxDriverOperationscaps operations across its registered drivers, andmaxOperationsPerMessagecaps operations per top-level input or output. Drivers must acquire permits throughcontext.limiter; the bundled S3 and GCS drivers use it. - Experimental:
ChildWorkflowOptions.versioningOverridecan pin, auto-upgrade, or one-time route a Child Workflow independently of its parent. One-time routing is also available for client-started Workflows through{ oneTimeTo: WorkerDeploymentVersion }. Both require Temporal Server 1.32.0 or later. Invalid child overrides reject withInvalidVersioningOverrideError. - Experimental: Added
listandfetchHistoryinterception toWorkflowClientInterceptor.listinterception spans one lazy iterable consumption across pagination and early termination. - Experimental:
NexusSerializationContextis now passed to payload converters, payload codecs, and failure converters for Nexus operation payloads, identifying the operation's endpoint, service, and operation name. Callers use it for inputs, summaries, results, and failures; handlers use it for inputs, synchronous results, and failures. A standalone handle obtained fromNexusClient.getHandlehas none of that information and therefore decodes without Nexus context, so contextual encodings must be self-describing and decoders must keep accepting payloads encoded without context.GetNexusOperationResultInputnow carries the operation'sendpoint,service, andoperationwhen known. - The Workflow sandbox now exposes
URLPattern, both as a global and from theurlmodule, when the Worker runs on Node.js 23.8 or later. On older Node.js versions,URLPatternremains undefined inside Workflows. - Experimental: Nexus workers decode Temporal System Nexus inputs sent by the server with the System Nexus converter.
SearchAttributeKeyis now exported from the@temporalio/commonpackage root.- Experimental: Added opt-in payload caching for External Storage. Pass a
PayloadCache, such asInMemoryPayloadCache, as thepayloadCacheoption of a Client or Worker to cache External Storage payloads. - Experimental: Workflows can signal another Workflow and start it when absent with
signalWithStartWorkflow. - Experimental: Workflow outbound interceptors can intercept Temporal System Nexus calls generically with
startSystemNexusOperationor specifically withsignalWithStartWorkflow. - The Workflow sandbox now exposes
atobandbtoa.
Changed
- Experimental:
createEventGroup(...)now takes the Event Group's ID as its first and only required argument; user-provided IDs are used verbatim and should not contain sensitive information. The optional label is a codec-encoded Payload on the second argument, the type is nowEventGroup(previouslyEventGroupMarker), and direct Event Group attachment is supported on more APIs. RetryPolicy.maximumAttemptsaccepts0as another way to specify unlimited attempts, alongsideInfinity.- Updated
unionfsfrom 4.5.1 to 4.6.0,@grpc/grpc-jsfrom 1.12.4 to 1.12.7,smol-tomlfrom 1.6.1 to 1.7.1, andtarfrom 7.5.11 to 7.5.21. - Updated
ms, adding month units and fixing duration type declarations under modern Node.js module resolution. @temporalio/createchecks for updates in the background and displays cached notifications on subsequent interactive runs.- AI integrations are now maintained and released independently in temporalio/ai-integrations.
@temporalio/ai-sdkand@temporalio/google-adk-agentsremain as compatibility wrappers forwarding their public entrypoints to@temporalio/vercel-ai-sdkand@temporalio/google-adk. Existing import paths can be retained; new applications should use the standalone names.@temporalio/langsmith,@temporalio/openai-agents, and@temporalio/strands-agentsretain their package names. The integrations' implementations, tests, and API documentation are no longer built in this repository; the two wrappers have separate forwarding tests. - Workers now refuse to load and execute Workflow bundles produced with a different SDK version. This unsupported practice previously resulted in subtle, hard-to-diagnose issues.
Deprecated
- Undocumented imports through
@temporalio/*/lib/*are deprecated. Where present, the wildcard remains temporarily as a compatibility fallback.@temporalio/commonexplicitly supports@temporalio/common/encoding,@temporalio/common/protobufs,@temporalio/common/proto-utils, and@temporalio/common/time
💥 Breaking Changes
- Experimental: Nexus Workflow Updates now require
waitForStageto be explicitly set toACCEPTED. - The
@temporalio/google-adk-agentscompatibility wrapper now requires Node.js 22.12.0 or later and Google ADK 2.0, matching@temporalio/google-adk. The wrapper preserves import paths, but the ADK upgrade and renamed workflow random stream still require draining affected in-flight Workflows or using separate task queues for the cutover. - Undocumented package subpaths that are not covered by a package's explicit export map no longer resolve.
- SDK and contrib packages now declare
protobufjs(^8.7.1) andlong(^5.3.2) as peer dependencies rather than relying on separately installed copies. Package managers that do not automatically install peers require applications to add these dependencies explicitly.@temporalio/protoretains its regular runtime dependencies.
Fixed
- Workflow code that blocks the sandbox past its time limit now fails with the
[TMPRL1101]deadlock diagnostic (#2426). - Corrected the Schedule
catchupWindowdocumentation to state that omitted values use the Temporal Server's configured default. - Experimental: A Standalone Activity started from a Nexus operation handler directly through
ActivityClient, rather than throughTemporalNexusClient.startActivity()'s guarded call, now inherits the handler's Nexus request ID and inbound links. - A workflow task that arrives while a Workflow waits on a Local Activity, such as a legacy query, now waits until the current workflow task is reported. Previously it replaced that workflow task, which then timed out on the server and could leave the Workflow stuck on a nondeterminism error (temporalio/sdk-rust#1640).
WorkflowExecutionAlreadyStartedErrornow exposes therunIdof the already-running Workflow Execution when the server provides it in the error details (#1838).- Corrected the protobufjs dependency declarations to prevent
historyFromJSONfailing withtype must be a Typewhen npm installs separate protobufjs copies alongside a dependency on an older protobufjs major (#2514). - Fixed a race where finishing a Worker could shut down the shared Runtime while another Worker or replay was being prepared, causing replay creation to fail with a native handle type error.
- Core: Replay now preserves which local activity results were delivered together for newly recorded histories. This prevents local activity scheduling which was conditional on local activity resolution order from assigning recorded results to different handles. Older markers keep their existing behavior.
- Core: Workflow poll balancing now lets non-sticky pollers use capacity after sticky pollers reach their configured or autoscaled polling limit.
- Core: Every path that fails a workflow task now only reports the failure to server on the task's first attempt, and later attempts are left to time out. Previously
PayloadsTooLargefailures and history fetch failures were re-reported on every attempt. - Core: The
workflow_task_execution_failedmetric is now recorded for every failed workflow task attempt, including attempts whose failure was not sent to the server. - Core: Worker shutdown now drains activity completions that are still flushing their result to the server before finishing.
- Workflow conditions are no longer evaluated in a workflow task that only delivers updates and rejects all of them.
JsonPayloadConverterno longer produces a payload with undefined data for values with no JSON representation, such as functions, symbols, and objects whosetoJSONreturnsundefined. The default payload converter now throws aValueErrorfor these values, including symbols, which previously caused aTypeErrorwhile building the error message.- Update-with-Start gRPC errors now include the decoded operation error code and message in the first line of the stack trace.
@temporalio/createnow supports comments and trailing commas intsconfig.jsonfiles when creating projects.- Fixed Worker crashes when running with
node --watchby ignoring unrecognized messages from Workflow Worker threads.
Security
- Updated
rustls-webpkito 0.103.16 (RUSTSEC-2026-0382).
New Contributors
- @clintonb made their first contribution in #1855
- @kmeraz made their first contribution in #2398
- @RaphaelFakhri made their first contribution in #2461
- @ATKasem made their first contribution in #2206
- @dlwhdgus0810 made their first contribution in #2467
- @atol made their first contribution in #2432
- @88subarno88 made their first contribution in #2464
- @dajiaohuang made their first contribution in #2450
- @tekkaya made their first contribution in #2369
- @1fanwang made their first contribution in #2379
- @OMD-123 made their first contribution in #2435
- @trippyogi made their first contribution in #2215
Full Changelog: v1.24.0...v1.25.0