Releases: aws/aws-durable-execution-sdk-js
Release list
Workflow Insight Explorer 0.1.0-alpha.3 (Preview)
Preview build — multi-platform .vsix release. Includes darwin-arm64, win32-x64, win32-arm64, and linux-x64 builds with on-device LLM support.
Workflow Insight Explorer 0.1.0-alpha.2 (Preview)
Preview build — multi-platform .vsix release. Includes darwin-arm64, win32-x64, win32-arm64, and linux-x64 builds with on-device LLM support.
Release SDK-2.2.0/Insight-0.1.0
What's Changed
- ci(otel): Enable cloud deployment and strengthen span asse… by @SilanHe in #684
- chore(sdk): add Dependabot configuration for GitHub Actions by @ParidelPooya in #694
- feat(sdk): support custom summaryGenerator in map and parallel config by @ParidelPooya in #696
- chore(deps): bump the actions-deps group with 7 updates by @dependabot[bot] in #695
- feat(sdk): add updated operations to invocation info by @SilanHe in #693
- fix(sdk): keep replay mode active after a virtual context by @ParidelPooya in #697
- fix(ci): scope capacity provider test job to capacity provider functions by @ParidelPooya in #698
- refactor(sdk): rename getNextStepId to peekStepId for clarity by @ParidelPooya in #699
- refactor: Standardize test naming by @ayushiahjolia in #705
- feat(sdk): add shouldComplete predicate to completionConfig by @ParidelPooya in #702
- ci: use new test secrets for integration workflow roles by @zhongkechen in #704
- feat(sdk): Explorer query/ask/agent modes, saved queries + export, local-server LLM, and AI consent by @ParidelPooya in #706
- feat(sdk): show the query behind each Workflow Insight result by @ParidelPooya in #709
- feat(sdk): expose retry attempt number on step context by @ParidelPooya in #707
- ci: use SAM for integration test deployments by @zhongkechen in #708
- feat(sdk): return a completion decision from shouldComplete by @ParidelPooya in #711
- feat(sdk): preserve child-context operations across resume for observability by @ParidelPooya in #714
- feat(sdk): test connection button for Workflow Insight destination by @ParidelPooya in #715
- chore(deps): bump shell-quote and concurrently by @dependabot[bot] in #712
- chore(deps): bump the actions-deps group with 2 updates by @dependabot[bot] in #713
- feat(sdk): default to Claude Sonnet 5 and add a Bedrock model picker in Workflow Insight by @ParidelPooya in #716
- perf(sdk): cut checkpoint and batch hot-path CPU self-time by ~48% by @ParidelPooya in #717
- fix(sdk): Use current time for onOperationAttemptStart startTimestamp by @SilanHe in #718
- feat(sdk): recommend vetted Bedrock models by default in Workflow Insight by @ParidelPooya in #720
- fix(sdk): default Workflow Insight example auto-invoke schedule to off by @ParidelPooya in #721
- feat(sdk): Add executionStartTimestamp to InvocationBaseInfo by @SilanHe in #719
- feat(sdk): add Amazon Redshift support to Workflow Insight by @ParidelPooya in #722
- feat(sdk): add Amazon OpenSearch support to Workflow Insight extension by @ParidelPooya in #723
- docs(sdk): remove Timestream note from insight remaining-tasks by @ParidelPooya in #724
- chore(sdk): Workflow Insight follow-ups - exporter tests, Redshift timestamptz, docs by @ParidelPooya in #725
- chore(sdk): make insight package release-ready for first npm publish by @ParidelPooya in #726
- chore(deps-dev): bump vite from 8.0.8 to 8.1.5 by @dependabot[bot] in #727
- feat(sdk): expose retry attempt number on waitForCondition context by @ParidelPooya in #728
- chore: remove api-documenter, point API Reference to docs site by @ParidelPooya in #730
- chore(sdk): bump core SDK to 2.2.0 by @ParidelPooya in #731
New Contributors
- @zhongkechen made their first contribution in #704
Full Changelog: sdk-2.1.0/test-1.1.3/otel-0.1.1...sdk-2.2.0/insight-0.1.0
Release SDK-2.1.0/Test-1.1.3/Otel-0.1.1
@aws/durable-execution-sdk-js
What's Changed
- chore: rename DurableExecutionotelPlugin to OtelPlugin by @SilanHe in #659
- feat(ci): add E2E otel xray tests by @SilanHe in #655
- fix(sdk): onOperationStart is called with isReplay true for subsequen… by @SilanHe in #660
- feat(sdk): add PluginOperationStatus as const object (tree-shakeable, backward-compatible) by @ParidelPooya in #670
- feat(sdk): surface operation error and attempt on OperationInfo by @ParidelPooya in #673
- chore(otel): Remove RETRYING from AttemptEndInfoOutcome by @SilanHe in #679
- feat(sdk): emit operationName in default logger output by @ParidelPooya in #692
Full Changelog: sdk-2.0.0...sdk-2.1.0/testing-1.1.3/otel-0.1.1
@aws/durable-execution-sdk-js-testing
What's Changed
Full Changelog: test-1.1.2...sdk-2.1.0/test-1.1.3/otel-0.1.1
@aws/durable-execution-sdk-js-otel
What's Changed
- chore: rename DurableExecutionotelPlugin to OtelPlugin by @SilanHe in #659
- feat(otel): Enrich attempt spans with outcome, subtype, and attempt n… by @SilanHe in #661
- feat(otel): enrich log context otel trace sampled by @SilanHe in #662
- fix(otel): span id collision execution arn scoping by @SilanHe in #669
Full Changelog: otel-0.1.0...sdk-2.1.0/test-1.1.3/otel-0.1.1
Release test-1.1.2
What's Changed
- fix(testing-sdk): bump to 1.1.2 and publish core SDK peer-compat fix by @ParidelPooya in #678
Full Changelog: otel-0.1.0...test-1.1.2
Release otel-0.1.0
@aws/durable-execution-sdk-js-otel v0.1.0
⚠️ Experimental Beta — Functionality may change without notice between releases. Not recommended for production workloads at this time.
OpenTelemetry instrumentation plugin for AWS Durable Execution SDK. Emits distributed traces that correlate across multiple Lambda invocations of a single durable execution.
Features
- Deterministic Trace IDs — All invocations of the same durable execution share a single trace, derived from the X-Ray trace header or execution ARN
- Span-per-Operation — Each durable operation (step, wait, invoke) gets its own span with accurate timing
- Continuation Spans — Operations completing in a different invocation are linked back to the original span
- Replay-Aware — Skips redundant spans on replay while maintaining trace continuity
- Attempt Tracking — Step retry attempts are tracked as child spans with attempt number attributes
- Log Correlation — Enrich application logs with trace ID and span ID for end-to-end observability
- Configurable Context Extraction — Built-in support for X-Ray and W3C Trace Context propagation
- Self-Contained Setup — No manual TracerProvider configuration required
What's Changed
- feat(otel): add OpenTelemetry instrumentation plugin for durable executions by @SilanHe in #640
- fix(sdk): add plugin interface hook tests for isReplay by @SilanHe in #645
- feat(otel): add Otel integration tests by @SilanHe in #647
- feat(sdk): add executionInput to InvocationInfo (plugin interface) by @ParidelPooya in #653
- feat(otel): bump version to 0.1.0 and update README by @SilanHe in #657
Full Changelog: sdk-2.0.0-alpha.1...otel-0.1.0
Getting Started
For setup instructions, configuration options, and usage examples, see the package README.
Feedback
Please feel free to leave feedback in the discussion.
Release sdk-2.0.0
First major release for V2. Upgrade target for users on the 1.x line (last release:
1.1.7). 2.0.0 ships six categories of change:
withRetry— a new helper for retrying a chunk of durable logic
(multi-operation blocks containingwaitForCallback,invoke, etc.) with a
configurable backoff strategy.- Linear retry strategy —
createLinearRetryStrategyand the new
retryPresets.linearpreset for fixed-increment backoff alongside the
existing exponential strategies. - Serdes upgrades —
context.configureSerdes()for setting default serdes
once,createFileSystemSerdesfor offloading large payloads to a durable
mount (Amazon S3 Files, EFS), and inline previews to keep PII out of
GetDurableExecutionHistoryand the AWS console. - Cost / scale knob for batch operations —
NestingType.FLATonmap
andparallelskips the per-iterationCONTEXToperation for up to 2x cost
reduction and up to 2x more iterations per execution, trading per-branch
observability for throughput. - More precise error types — promise combinators and callbacks throw
specific error subclasses (PromiseCombinatorError,CallbackExternalError,
CallbackTimeoutError,CallbackSubmitterError). This is the main source of
breaking changes for code that branches on error type. - Observability plugins (experimental) — a
DurableInstrumentationPlugin
interface for emitting custom instrumentation. This API is experimental and
may change in a backward-incompatible way in any release.
A number of operational fixes and security updates are also included.
⚠ Upgrade guide (breaking changes)
1. Promise combinator failures now throw PromiseCombinatorError
context.Promise.all, Promise.allSettled, Promise.any, and Promise.race
previously rejected with StepError. They now reject with
PromiseCombinatorError, which extends DurableOperationError directly — not
StepError or ChildContextError.
// v1.x — no longer matches in v2
try {
await context.Promise.all([...]);
} catch (err) {
if (err instanceof StepError) { /* ... */ }
}
// v2.0
import { PromiseCombinatorError } from "@aws/durable-execution-sdk-js";
try {
await context.Promise.all([...]);
} catch (err) {
if (err instanceof PromiseCombinatorError) {
// err.cause is the original failure from the first rejecting branch
}
}If you don't care about distinguishing the operation type, catch the base class
DurableOperationError.
The error-type change is a side effect of reimplementing combinators on
runInChildContext(so idle branches no longer block Lambda termination). That
also changes the execution history shape — branches now appear asCONTEXT
operations rather thanSTEPoperations. See the "Changed" section below.
2. Callback failures now form a typed hierarchy under CallbackError
createCallback and waitForCallback previously threw CallbackError for every
failure mode. v2 organizes the specific callback errors into a hierarchy and
adds CallbackExternalError, which is thrown when the external entity completes a
callback with a failure (via SendDurableExecutionCallbackFailure):
CallbackError
+- CallbackExternalError // external entity reported failure (was CallbackError)
+- CallbackTimeoutError // callback timed out
+- CallbackSubmitterError // waitForCallback submitter function threw
| Scenario | v1.x error | v2 error |
|---|---|---|
Callback completed with FAILED |
CallbackError |
CallbackExternalError |
Callback timed out (TIMED_OUT) |
CallbackError |
CallbackTimeoutError |
waitForCallback submitter threw |
CallbackError |
CallbackSubmitterError |
| Internal error (e.g. no callback ID) | CallbackError |
CallbackError |
instanceof CallbackError is safe. Because CallbackExternalError,
CallbackTimeoutError, and CallbackSubmitterError all extend CallbackError,
existing catch (e) { if (e instanceof CallbackError) ... } code keeps matching
all callback failures. The break only affects code that relies on the exact
errorType / name string being "CallbackError" for external failures or
timeouts.
// v2.0 — branch on the specific subtype, or catch the base class
import {
CallbackError,
CallbackExternalError,
CallbackTimeoutError,
CallbackSubmitterError,
} from "@aws/durable-execution-sdk-js";
try {
await context.waitForCallback("approval", submitter, {
timeout: { hours: 1 },
});
} catch (err) {
if (err instanceof CallbackTimeoutError) {
// Approver missed the deadline
} else if (err instanceof CallbackSubmitterError) {
// The submitter function (e.g. publishing the approval URL) threw
} else if (err instanceof CallbackExternalError) {
// External system completed the callback with FAILED
} else if (err instanceof CallbackError) {
// Any other callback failure (base class)
}
}3. KMS exceptions during checkpoint / state APIs are non-retryable
KMS exceptions during CheckpointDurableExecution and GetDurableExecutionState
are now treated as non-retryable customer errors instead of being retried.
4. runInChildContext applies the serdes round-trip in all modes
runInChildContext previously ran deserialize(serialize(result)) only for
small (checkpointed) payloads; large payloads (replay-children mode) and virtual
contexts returned the raw in-memory result. With a non-identity serdes, the
value a caller received depended on payload size or the virtual flag. All three
modes now apply the same round-trip, so callers observe consistent results
regardless of payload size. No public API change, but observed values may change
if you use a serdes whose deserialize(serialize(x)) differs from x.
5. FileSystemSerdesConfig.mode renamed to storageMode
Only relevant if you adopted createFileSystemSerdes during the 2.0.0-alpha
line; 1.x users are unaffected.
Added
withRetry — retry a block of durable logic
A new helper for retrying chunks of logic that contain operations a step
cannot host (e.g. waitForCallback, invoke). Semantically a
runInChildContext with a retry policy wrapped around it.
import { withRetry, createRetryStrategy } from "@aws/durable-execution-sdk-js";
const result = await withRetry(
context,
"approval",
(ctx, attempt) =>
ctx.waitForCallback(`approval-${attempt}`, submitter, {
timeout: { hours: 24 },
}),
{
retryStrategy: createRetryStrategy({
maxAttempts: 3,
initialDelay: { seconds: 2 },
backoffRate: 2,
}),
},
);createLinearRetryStrategy + retryPresets.linear
Linear backoff with a configurable initial delay and increment.
import {
createLinearRetryStrategy,
retryPresets,
} from "@aws/durable-execution-sdk-js";
// Custom: 8 attempts, starting at 2s, +3s each attempt -> 2,5,8,11,14,17,20s
const strategy = createLinearRetryStrategy(8, 2, 3);
await context.step("flaky", fn, { retryStrategy: strategy });
// Or use the new preset (6 attempts: 1,2,3,4,5s)
await context.step("flaky", fn, { retryStrategy: retryPresets.linear });context.configureSerdes() + SerdesConfig
Set default serdes once on the context instead of passing serdes: to every
operation. Defaults flow into step, runInChildContext, invoke, and
waitForCondition. Callbacks (createCallback, waitForCallback) require an
explicit defaultCallbackDeserializer — they keep the passthrough
deserializer otherwise so customer-provided callback payloads aren't accidentally
JSON-parsed. Per-operation serdes: arguments still win over the default.
createFileSystemSerdes(basePath, config?)
A built-in Serdes that writes each value to a file under basePath and stores
only a small file pointer in the checkpoint, keeping executions under the
per-checkpoint size limit (~256KB) when individual operations produce large
results. Supports FileSystemSerdesMode.ALWAYS (default) and
FileSystemSerdesMode.OVERFLOW (inline JSON until a threshold, then spill to a
file).
⚠ Use a durable, shared mount. S3 Files (Lambda S3 mount) and EFS are
supported. Do not point this at Lambda's/tmp—/tmpis
per-execution-environment and a replay on a different sandbox won't find the
file, breaking deserialization.
It also accepts an optional generatePreview function (with the buildPreview
helper plus PreviewMode, FieldMatchMode) to store a redacted inline preview
in the checkpoint while keeping the full value on disk — useful for keeping PII
out of GetDurableExecutionHistory and the AWS console.
NestingType for map and parallel
Trade observability for cost on batch operations. The default is
NestingType.NESTED (existing behavior), so existing code is unaffected unless
you opt in. NestingType.FLAT skips per-iteration CONTEXT operations for up
to 2x cost reduction and higher per-execution scale, at the price of less
detailed history.
errorMapper on ChildConfig
runInChildContext, promise combinators, and withRetry accept a function to
remap the thrown error type — useful when you want a domain error class instead
of ChildContextError.
Instrumentation plugin system (experimental)
⚠ Experimental. This API is unstable and may change in a backward-
incompatible way in any future release, including minor and patch versions. It
is not covered by semantic versioning guarantees yet. Use with caution in
...
Release sdk-1.1.7
What's Changed
- fix(sdk): remove esm-shim banner from ESM dist by @nvasiu in #585
- ci: Update checkout action to use release tag name by @SilanHe in #589
- chore(sdk): bump version to 1.1.7 by @ayushiahjolia in #590
Full Changelog: sdk-1.1.6...sdk-1.1.7
Release runtime-1.1.7
What's Changed
- fix(sdk): remove esm-shim banner from ESM dist by @nvasiu in #585
- ci: Update checkout action to use release tag name by @SilanHe in #589
- chore(sdk): bump version to 1.1.7 by @ayushiahjolia in #590
Note: This release will be used by lambda runtime team.
Full Changelog: sdk-1.1.6...runtime-1.1.7
Release sdk-1.1.6
What's Changed
- fix(sdk): remove runtime bundled detection from UserAgent header by @ayushiahjolia in #582
- chore(sdk): bump version to 1.1.6 by @ayushiahjolia in #583
Full Changelog: sdk-1.1.5t5...sdk-1.1.6