Breaking Changes
-
Major upgrade of
protobufjsto v8 andprotobufjs-clito v2.Temporal's protobuf messages types generated by
protobufjsare exposed as part of our public
API surface (mostly through@temporalio/protoandClient's raw gRPC interfaces). This
upgrade introduces some minor changes in theprotobuftypes 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
.protofiles will need
to upgrade their ownprotobufjsdependency to v8. A root built with v7 still works for binary
payloads, but JSON-encoded payloads will fail at runtime withTypeError: type must be a Type. -
The constructor on generated message types is no longer publicly accessible, which means that
new SomeMessage()no longer compiles. UseSomeMessage.create({ ... })instead. Use of the
constructor was never officially supported, and would have previously resulted in a runtime error. -
The
getTypeUrlmethod 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, sinceprotobufjsv8 no longer
sets them when decoding. Reading the field still yields its default (msg.someEnumis still
0), but it no longer shows up inObject.keys, object spreads, or a deep equality comparison
against a message built withcreate({ someEnum: 0 }). Unknown fields are still ignored when
parsing JSON. -
protobufjsrenamed the generated "properties" interfaces fromIFootoFoo.$Properties,
and added a companionFoo.$Shapethat narrowsoneoffields. We still exposeIFooas an
alias ofFoo.$Propertiespreserving 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.
-
Added
createPayloadValidationErrorin@temporalio/commoncreates a non-retryable
ApplicationFailurewith structured Payload validation details when provided. Passingnullor
undefinedproduces a failure without details.- Experimental: Nexus operation definitions can provide
TypeInfofor Workflow callers and operation handlers.
Workflow-backed asynchronous handlers must configure matching TypeInfo on the backing Workflow. - Experimental: Standalone Nexus Clients can use operation
TypeInfo, including output conversion on detached
operation handles. - Experimental: Workflow and standalone Activities can use
TypeInfoto convert inputs and results, including
Local Activities, retained and detached Client handles, and asynchronous completion. - Core logs written directly to the console can now use compact, pretty, or newline-delimited JSON
output viatelemetryOptions.logging.console.format. - Experimental: Workflow Clients can now use
TypeInfoto encode Workflow inputs and decode Workflow results. - Experimental: Query definitions and string-named Client Queries can now provide
TypeInfofor converting Query
arguments and results. - Experimental: Update definitions and named Update calls can use
TypeInfoto convert Update arguments and
results. - Experimental:
@temporalio/google-adk-agentspackage for running Google ADK agents as durable Temporal Workflows,
requiring@google/adk@>=1.5.0 <1.6.0as a peer dependency.
ADK's OpenTelemetry agent-loop spans can be exported replay-safely from the Workflow sandbox by composing with
OpenTelemetryPluginfrom@temporalio/interceptors-opentelemetry; see the package README's telemetry section. - Experimental:
TemporalOperationHandlercan now use Standalone Activities as asynchronous
Nexus Operation backing executions throughTemporalNexusClient.startActivityand
typedActivity. - Experimental: Signal definitions can now provide
TypeInfofor converting Signal arguments on Client and
Workflow callers and in Workflow handlers. - Experimental: Workflows can now use
TypeInfofor Child Workflow inputs and results and continue-as-new inputs. - Experimental: String-named Signal calls can now provide
TypeInfothrough explicit options on Client and
Workflow handles and in signal-with-start requests. - Experimental: Experimental support for Event Groups. Event Groups
is a new form of Workflow-level metadata that allows for improved
visibility into a Workflow execution's history by grouping logically
related Events together based on user-defined or system-inferred criteria.
Changed
- Nexus is now generally available (GA) for calling Nexus Operations from Workflows and handling
Workflow-backed Operations withWorkflowRunOperationHandler. @temporalio/ai-sdknow requiresai@>=7.0.59as a peer dependency, up from7.0.0, since
earlier releases threw aTypeErroron import in runtimes without a globalfetch.- A Payload Converter or Payload Codec that fails to decode a Nexus Operation's input with a
non-retryableApplicationFailureof typePayloadValidationErrornow results in aBAD_REQUEST
Nexus Handler Error instead ofINTERNAL, so the caller is not retried on invalid input. The
originalApplicationFailureis retained as the Handler Error's cause. Any other failure from the
data converter is unchanged. SimplePluginno longer appends itsworkerInterceptors.workflowModulesto worker options when
the worker uses a prebuiltworkflowBundle, as module paths cannot be resolved in that case;
they are instead applied at bundling time, through the plugin'sconfigureBundlermethod.
Fixed
- Local Activities now fall back to a registered
defaultactivity when the requested type is not
registered, matching non-local Activity dispatch. Previously the Workflow Task failed immediately
withReferenceErroreven ifdefaultwas registered. - Experimental: Fixed compatibility with Bun 1.4, including reusable VM context switching,
microtask handling, and Worker thread shutdown. - Experimental: The external storage S3 and GCS drivers now use
hash_algorithmandhash_valueinstead of
hashAlgorithmandhashValuein their claims. The GCS driver additionally usesobject_nameinstead of
object. Retrieval still accepts the old key names. - Fixed issue where replaying a workflow with Local Activities scheduled from a nested Promise could
trigger a nondeterminism error. msOptionalToTs()was incorrectly converting durations of0toundefined, resulting in incorrect behaviors
in various places that takes optional durations where0is a legitimate value, e.g.ApplicationFailure.nextRetryDelay(). Durations of0are now properly preserved.
Complete change list
- fix(strands): don't evict an MCP connection with a call in flight by @brianstrauch in #2259
- chore: add ai to changelog code owners by @chris-olszewski in #2296
- Add SAA support to TemporalOperationHandler by @VegetarianOrc in #2106
- Mark Nexus as GA by @Quinn-With-Two-Ns in #2299
- Close lint:prune coverage gaps in contrib by @xumaple in #2300
- feat(workflow): support TypeInfo for client-started workflows by @THardy98 in #2252
- fix: require ai@>=7.0.59 in @temporalio/ai-sdk by @brianstrauch in #2306
- Run integration tests in an isolated Cloud namespace by @THardy98 in #2279
- Move Nexus invoked SAA changelog entry by @VegetarianOrc in #2311
- Add Nexus Activity link conversion by @VegetarianOrc in #2312
- Run Cloud-eligible integration tests by filename by @THardy98 in #2281
- feat(google-adk-agents): add @temporalio/google-adk-agents package by @xumaple in #2120
- feat(workflow): support TypeInfo on Signal definitions by @THardy98 in #2318
- docs: add the langsmith package and the openai-agents Workflow and OTel subpaths to the API reference by @xumaple in #2325
- Report non-retryable PayloadValidationError as BAD_REQUEST by @bergundy in #2319
- Expose Core console log format by @Sushisource in #2314
- fix inconsistencies in s3 and gcs drivers by @cconstable in #2324
- chore(proto)!: bump protobufjs to v8 and protobufjs-cli to v2 by @mjameswh in #2303
- feat(workflow): support TypeInfo for workflow transitions by @THardy98 in #2248
- feat(workflow): support TypeInfo for string Signals by @THardy98 in #2323
- chore: ensure local activity replay issue is resolved by @chris-olszewski in #2328
- feat(google-adk-agents): export failure-type constants, narrow the ADK peer range by @xumaple in #2321
- test: organize TypeInfo integration coverage by @THardy98 in #2330
- feat(workflow): add TypeInfo to Queries by @THardy98 in #2332
- fix(google-adk-agents): surface the model failures ADK absorbs by @xumaple in #2341
- fix: pin Bun to 1.3.14 by @THardy98 in #2347
- Add payload validation error factory by @bergundy in #2337
- feat(workflow): add TypeInfo to Updates by @THardy98 in #2333
- chore(otel): minor speedup of otel test by @chris-olszewski in #2338
- chore(adk): bump ava concurrency by @chris-olszewski in #2339
- chore(deps): update nexus-rpc to 0.0.3 by @THardy98 in #2351
- fix(common): omit nullish payload validation details by @bergundy in #2352
- fix(common): preserve zero optional durations by @sidsri14 in #2249
- feat(nexus): apply TypeInfo in Workflow callers and handlers by @THardy98 in #2334
- feat(nexus): apply TypeInfo in the standalone Client by @THardy98 in #2335
- feat(activity): add TypeInfo support for activities by @THardy98 in #2343
- fix: don't apply plugin workflowModules when a workflowBundle is used by @alexrosenfeld10 in #2309
- Add SDK Sentinel PR responder by @Sushisource in #2353
- fix(bun): support Bun 1.4.0 by @chris-olszewski in #2349
- feat: Event Groups support (experimental) by @mjameswh in #2209
- release v1.23.0 by @THardy98 in #2358
New Contributors
- @sidsri14 made their first contribution in #2249
- @alexrosenfeld10 made their first contribution in #2309
Full Changelog: v1.22.0...v1.23.0