Skip to content

Releases: aws/aws-durable-execution-sdk-js

Workflow Insight Explorer 0.1.0-alpha.3 (Preview)

Choose a tag to compare

@github-actions github-actions released this 21 Jul 22:36
Immutable release. Only release title and notes can be modified.
6dc1ad3

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)

Choose a tag to compare

@github-actions github-actions released this 21 Jul 20:33
Immutable release. Only release title and notes can be modified.
343926b

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

Choose a tag to compare

@ParidelPooya ParidelPooya released this 16 Jul 23:12
Immutable release. Only release title and notes can be modified.
a479e2c

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

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

Choose a tag to compare

@SilanHe SilanHe released this 06 Jul 21:03
Immutable release. Only release title and notes can be modified.
78bf9c7

@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

Choose a tag to compare

@ParidelPooya ParidelPooya released this 02 Jul 17:41
Immutable release. Only release title and notes can be modified.
68d0770

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

Release otel-0.1.0 Pre-release
Pre-release

Choose a tag to compare

@SilanHe SilanHe released this 23 Jun 18:04
Immutable release. Only release title and notes can be modified.
3e5f74c

@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

Choose a tag to compare

@ParidelPooya ParidelPooya released this 19 Jun 23:11
Immutable release. Only release title and notes can be modified.
56b6988

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:

  1. withRetry — a new helper for retrying a chunk of durable logic
    (multi-operation blocks containing waitForCallback, invoke, etc.) with a
    configurable backoff strategy.
  2. Linear retry strategycreateLinearRetryStrategy and the new
    retryPresets.linear preset for fixed-increment backoff alongside the
    existing exponential strategies.
  3. Serdes upgradescontext.configureSerdes() for setting default serdes
    once, createFileSystemSerdes for offloading large payloads to a durable
    mount (Amazon S3 Files, EFS), and inline previews to keep PII out of
    GetDurableExecutionHistory and the AWS console.
  4. Cost / scale knob for batch operationsNestingType.FLAT on map
    and parallel skips the per-iteration CONTEXT operation for up to 2x cost
    reduction and up to 2x more iterations per execution, trading per-branch
    observability for throughput.
  5. 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.
  6. 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 as CONTEXT
operations rather than STEP operations. 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/tmp is
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
...

Read more

Release sdk-1.1.7

Choose a tag to compare

@ayushiahjolia ayushiahjolia released this 29 May 21:20
Immutable release. Only release title and notes can be modified.
14fe0c5

What's Changed

Full Changelog: sdk-1.1.6...sdk-1.1.7

Release runtime-1.1.7

Choose a tag to compare

@ayushiahjolia ayushiahjolia released this 29 May 21:23
Immutable release. Only release title and notes can be modified.
14fe0c5

What's Changed

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

Choose a tag to compare

@ayushiahjolia ayushiahjolia released this 27 May 00:44
Immutable release. Only release title and notes can be modified.
e559821

What's Changed

Full Changelog: sdk-1.1.5t5...sdk-1.1.6