TypeScript SDK
npx @buildinternet/releases get temporal-typescript-sdknpx @buildinternet/releases get temporal-typescript-sdkExperimental: Workflows can signal another Workflow and start it when absent with
signalWithStartWorkflow.
Experimental: Workflow outbound interceptors can intercept Temporal System Nexus calls
generically with startSystemNexusOperation or specifically with signalWithStartWorkflow.
Experimental: New External Storage concurrency controls.
ExternalStorage takes a new concurrency option that holds two new concurrency limiting config values: maxDriverOperations caps how many are in flight across every driver registered on that ExternalStorage instance and maxOperationsPerMessage caps how many a single "message" may have in flight, where a message is any top-level input or ouput (e.g. a Workflow Task activation, a client request, a Nexus operation, etc)context.limiter to take out a permit for each request.Experimental: External storage failures now surface as dedicated error types exported from
@temporalio/common: ExternalStorageDriverError, ExternalStorageUnregisteredDriverError, and
ExternalStorageReferenceError, all extending the new ExternalStorageError base type.
unionfs from 4.5.1 to 4.6.0, @grpc/grpc-js from 1.12.4 to 1.12.7, smol-toml from 1.6.1 to 1.7.1
and tar from 7.5.11 to 7.5.21.@temporalio/ai-sdk now preserves text provider metadata when replaying streamed model responses
inside Workflows.atob and btoa, allowing integrations such as @temporalio/ai-sdk to
process image and file tool results containing base64 data.@temporalio/create now supports comments and trailing commas in tsconfig.json files when
creating projects.createEventGroup(...) now takes the Event Group's ID as its first and only required argument; user-provided ID is used verbatim and should not contain sensitive information. The label is now optional and passed as a property on the second, object argument; it is a codec-encoded Payload. The user-facing type is now EventGroup (previously EventGroupMarker). Direct Event Group attachment is now supported on more APIs.@temporalio/openai-agents now requires @openai/agents-core and @openai/agents-openai ~0.14.3. A project
pinned to 0.13.x or earlier hits a peer dependency conflict until it upgrades.StorageDriverSelector now receives a
StorageDriverSelectContext instead of a StorageDriverStoreContext. Update the parameter
type; the new type carries the same abortSignal and target fields.ActivityHandle: pause, unpause, updateOptions and restoreOriginalOptions.ActivityHandle.describe now accepts options that can be used to include additional data associated
with activity execution, such as input and result.@temporalio/openai-agents can run OpenAI Agents SandboxAgents as Temporal Workflows. SandboxAgent
operations are Activities; hosted tool credentials and sandbox environment values that reference allowlisted Worker
environment variables are resolved on Worker so their values are not recorded in Workflow history.rawValueTypeInfo, which allows RawValue inputs and results to be preserved across
serialization boundaries when explicitly configured on TypeInfo-aware APIs.ActivityClient now passes serialization context to data converter when interacting with standalone activities.common.v1.Link.Workflow now serializes to temporal:///namespaces/{ns}/workflows/{wid}/{rid}
with the optional reason as a query param, matching the other SDKs; previously it reused the
workflow event path and dropped reason. Inbound Workflow links are now parsed as well.ApplicationFailure now preserve native Error.cause chains in serialized failures.INTERNAL Handler Errors, preventing retries when ID reuse or conflict
policies reject duplicate execution IDs.maxCachedWorkflows). Sticky pollers could consume every Workflow-cache permit and starve the
non-sticky poller, so a Worker could stop accepting new Workflows until a poll timed out (up to
~60s). (Core fix: temporalio/sdk-rust#1534.)Major upgrade of protobufjs to v8 and protobufjs-cli to v2.
Temporal's protobuf messages types generated by protobufjs are exposed as part of our public
API surface (mostly through @temporalio/proto and Client's raw gRPC interfaces). This
upgrade introduces some minor changes in the protobuf types that are generated for them. The
large majority of applications either don't reference those types directly or do not use those
types in way that would be affected by these changes.
You may however want to consider the following user-facing and potentially breaking changes:
Applications that use the Protobuf Payload Converters with their own .proto files will need
to upgrade their own protobufjs dependency to v8. A root built with v7 still works for binary
payloads, but JSON-encoded payloads will fail at runtime with TypeError: type must be a Type.
The constructor on generated message types is no longer publicly accessible, which means that
new SomeMessage() no longer compiles. Use SomeMessage.create({ ... }) instead. Use of the
constructor was never officially supported, and would have previously resulted in a runtime error.
The getTypeUrl method on generated message types is no longer declared.
A field holding its default value is no longer materialized as an own property on decoded
messages. This applies both to JSON-encoded payloads, which are now spec-compliant and omit
such fields rather than writing them out, and to binary ones, since protobufjs v8 no longer
sets them when decoding. Reading the field still yields its default (msg.someEnum is still
0), but it no longer shows up in Object.keys, object spreads, or a deep equality comparison
against a message built with create({ someEnum: 0 }). Unknown fields are still ignored when
parsing JSON.
protobufjs renamed the generated "properties" interfaces from IFoo to Foo.$Properties,
and added a companion Foo.$Shape that narrows oneof fields. We still expose IFoo as an
alias of Foo.$Properties preserving backward compatibility with type definitions that rely
on the legacy spelling. Note that we may choose to deprecate the legacy spelling at some point
in the future to encourage adoption of protobufjs' roadmap.
createPayloadValidationError in @temporalio/common creates a non-retryable
ApplicationFailure with structured Payload validation details when provided. Passing null or
undefined produces a failure without details.TypeInfo for Workflow callers and operation handlers.
Workflow-backed asynchronous handlers must configure matching TypeInfo on the backing Workflow.TypeInfo, including output conversion on detached
operation handles.TypeInfo to convert inputs and results, including
Local Activities, retained and detached Client handles, and asynchronous completion.telemetryOptions.logging.console.format.TypeInfo to encode Workflow inputs and decode Workflow results.TypeInfo for converting Query
arguments and results.TypeInfo to convert Update arguments and
results.@temporalio/google-adk-agents package for running Google ADK agents as durable Temporal Workflows,
requiring @google/adk@>=1.5.0 <1.6.0 as a peer dependency.
ADK's OpenTelemetry agent-loop spans can be exported replay-safely from the Workflow sandbox by composing with
OpenTelemetryPlugin from @temporalio/interceptors-opentelemetry; see the package README's telemetry section.TemporalOperationHandler can now use Standalone Activities as asynchronous
Nexus Operation backing executions through TemporalNexusClient.startActivity and
typedActivity.TypeInfo for converting Signal arguments on Client and
Workflow callers and in Workflow handlers.TypeInfo for Child Workflow inputs and results and continue-as-new inputs.TypeInfo through explicit options on Client and
Workflow handles and in signal-with-start requests.WorkflowRunOperationHandler.@temporalio/ai-sdk now requires ai@>=7.0.59 as a peer dependency, up from 7.0.0, since
earlier releases threw a TypeError on import in runtimes without a global fetch.ApplicationFailure of type PayloadValidationError now results in a BAD_REQUEST
Nexus Handler Error instead of INTERNAL, so the caller is not retried on invalid input. The
original ApplicationFailure is retained as the Handler Error's cause. Any other failure from the
data converter is unchanged.SimplePlugin no longer appends its workerInterceptors.workflowModules to worker options when
the worker uses a prebuilt workflowBundle, as module paths cannot be resolved in that case;
they are instead applied at bundling time, through the plugin's configureBundler method.default activity when the requested type is not
registered, matching non-local Activity dispatch. Previously the Workflow Task failed immediately
with ReferenceError even if default was registered.hash_algorithm and hash_value instead of
hashAlgorithm and hashValue in their claims. The GCS driver additionally uses object_name instead of
object. Retrieval still accepts the old key names.msOptionalToTs() was incorrectly converting durations of 0 to undefined, resulting in incorrect behaviors
in various places that takes optional durations where 0 is a legitimate value, e.g. ApplicationFailure.nextRetryDelay(). Durations of 0 are now properly preserved.TypeInfo and TransferTypeConverter to @temporalio/common for converting
application values to and from serialization-friendly transfer types and supplying converter-specific hints.maxEagerActivityReservationsPerWorkflowTask. Setting it to zero disables
eager activity execution.TemporalNexusClient.getWorkflowHandle(...).update(...), in addition to a Workflow run.
The Update request carries the Nexus request ID (for deduplication), the request links, and a
completion callback bearing the operation token, so the Update's completion is delivered back to the
Nexus caller. Only asynchronous, ACCEPTED-stage updates are supported (a callback URL is
required); an update that has already completed is returned synchronously, and a completed-with-error
update (e.g. a validation rejection) surfaces as a failed Nexus operation. Cancellation is
customizable via the cancelWorkflowUpdate handler option; the default rejects with a
NOT_IMPLEMENTED handler error.@temporalio/ai-sdk: listToolsActivity/callToolActivity now reuse a single MCP client connection
across repeated invocations for the same server instead of creating and closing one on every call.
Configure the idle window via the new mcpConnectionIdleTimeout option on createActivities and
AiSdkPluginOptions (defaults to 5 minutes); pass mcpConnectionIdleTimeout: 0 to opt out and restore
the original behavior for MCP servers/transports that don't tolerate a reused or concurrent session.65b25ada (temporal-core 0.6.0)zod as a peer dependency.callTool or listTools activity.WorkflowStream.onPoll no longer serves a stale log index for a poll that
was parked across a truncate() call, which could silently skip events.makeTestFunction to manage their test environment.quinn-proto in @temporalio/core-bridge's Cargo.lock from 0.11.14 to
0.11.15, clearing GHSA-4w2j-m93h-cj5j / RUSTSEC-2026-0185 (unbounded out-of-order stream
reassembly DoS) for downstream image scanners.@aws-sdk/client-s3 to the workflow bundler ignore list, fixing bundler errors when
using the S3-backed context-offloader vended plugin. The package is dynamically imported
worker-side and is never reached from workflow code.Prerelease, Experimental: You can now configure external storage on your DataConverter via the new
externalStorage option to offload large payloads out of Temporal Server. When set, payloads larger
than the configured payloadSizeThreshold are stored via your StorageDriver(s) and retrieved
transparently, keeping large arguments, return values, and heartbeat details out of the Temporal Server
database. ExternalStorage and the StorageDriver types are exported from @temporalio/common.
Prerelease, Experimental: AWS S3 external storage driver: This release introduces a package which can be used with external storage to offload large payloads to S3 buckets in AWS instead of inlining them into workflow history.
Prerelease, Experimental: GCP GCS external storage driver: This release introduces a package which can be used with external storage to offload large payloads to GCS buckets in GCP instead of inlining them into workflow history.
ResourceBasedController can now be shared by resource-based tuners across multiple Workers in the same process.
Experimental New @temporalio/strands-agents package for building workflows with Strand Agents.
Experimental: @temporalio/openai-agents now supports streaming model events from Workflows.
Added opt-in envconfig support to the test workflow environment. This enables testing against arbitrary
Temporal server environments (i.e. local, staging, prod)
[TMPRL1103] at WARN) but still sent, while a task completion over the error limit is failed
retryably ([TMPRL1103] at ERROR) instead of sent. Previously these reached the server, which
terminated the workflow or failed the activity non-retryably; failing retryably instead lets a
corrected workflow or activity be redeployed and recover. Tune warn thresholds via
NativeConnectionOptions.payloadLimits. If you use a proxy between the worker and server that
alters the size of payloads (e.g. compression, encryption, external storage), it is advised that
you disable size enforcement by setting disablePayloadErrorLimit: true on the worker.@temporalio/ai-sdk now targets Vercel AI SDK v7, requiring Node 22.12.0+.nexus.HandlerError values thrown by payload codecs and converters.temporal_worker_task_slots_used no longer counts reserved but unused task slots as in use.strands: add @aws-sdk/client-s3 to the workflow bundler ignore list, fixing bundler errors when
using the S3-backed context-offloader vended plugin. The package is dynamically imported
worker-side and is never reached from workflow code.
TEMPORAL_TLS existing behavior when enabled was to disable TLS configuration. This has been corrected,
setting TEMPORAL_TLS now enables TLS configuration
__webpack_module_cache__ replacement logic, addressing regressions introduced by the fix in 1.20.1.__webpack_module_cache__ logic introduced by webpack 5.108.0, resulting in breaking workflow context isolation (fix #2170).@temporalio/langsmith package for tracing Temporal apps to LangSmith.
It hooks the client, Workflow, and Activity interceptors so a Workflow and the Activities it runs show up
as a single LangSmith run tree.5df57f6d. Package-visible changes from this update include:
NativeConnection initialization now retries without gRPC gzip compression if the server
cannot decompress the eager GetSystemInfo call.@temporalio/openai-agents: Query handlers and update validators now derive trace span IDs from the SDK's
replay-safe random source instead of a private seeded PRNG. This removes the old seed-collision workaround
and gives read-only handlers distinct, well-formed span IDs.__webpack_module_cache__ replacement logic, addressing regressions introduced by the fix in 1.19.1.__webpack_module_cache__ logic introduced by webpack 5.108.0, resulting in breaking workflow context isolation (fix #2170).WorkerOptions.patchActivationCallback to control whether newly encountered Workflow patches
activate and write a patch marker.@temporalio/interceptors-opentelemetry-v2 to support OpenTelemetry JS SDK 2.unsafe.random for read-only contexts.WorkflowHandle.runId in @temporalio/nexus is now an optional property to support creating a handle using only a workflow ID.grpcCompression: { codec: none } when constructing a NativeConnection.protobufjs bumped to 7.6.2NativeConnection on worker startup