Skip to content

Bump the elsa group with 4 updates - #1528

Merged
github-actions[bot] merged 1 commit into
masterfrom
dependabot/nuget/Elsademo/ElsaCore.Server/elsa-a5b8d49b57
Sep 7, 2026
Merged

Bump the elsa group with 4 updates#1528
github-actions[bot] merged 1 commit into
masterfrom
dependabot/nuget/Elsademo/ElsaCore.Server/elsa-a5b8d49b57

Conversation

@dependabot

@dependabot dependabot Bot commented on behalf of github Sep 7, 2026

Copy link
Copy Markdown
Contributor

Updated Elsa from 3.7.1 to 3.8.0.

Release notes

Sourced from Elsa's releases.

3.8.0

Compare: 3.7.1...3.8.0

Elsa 3.8.0 — Release Notes


🌟 Highlights

  • Operational diagnostics: Structured ILogger logs can remain in memory or be persisted to SQLite, while console output and OpenTelemetry traces, metrics, and logs can be ingested and queried through dedicated diagnostics modules. (#​7445, #​7462)
  • Safer workflow operations: Runtime drain, pause/resume, interrupted-workflow recovery, transactional dispatch outbox, bookmark dead-letter management, and readiness checks provide clearer control over clustered and restarting hosts. (#​7424, #​7516, #​7517)
  • Secrets and external sign-in: Add the Secrets module with encrypted and configuration-backed stores, secret expressions, EF Core persistence, and JavaScript access, alongside the external authentication broker and OpenID Connect adapter. (#​7468)
  • Workflow platform foundations: Bring HTTP Webhooks into Core, and add an operational Dashboard API, provider-neutral Persistence vNext building blocks, Platform integration, and the Weaver AI host with grounded, proposal-only workflow tools. (#​7523, #​7681; 103028452, c16995014, e9d89969b)
  • State machine and workflow execution: Add the StateMachine activity and align its trigger and transition behavior with workflow runtime lifecycle semantics. (#​7457, #​8010)

⚠️ Breaking changes / upgrade notes

  • Configure production identity secrets before startup: The reference server no longer ships usable admin credentials or API keys. Configure initial users/applications through environment-specific settings or a secret manager. JWT signing keys must be configured, contain at least 32 printable ASCII characters, and have no surrounding whitespace. Known public defaults are accepted only in Development or Demo; set Identity__Tokens__SigningKey (or the shell feature equivalent) to a secure random value. (#​7496, #​7500)
  • Localhost bootstrap is opt-in: Localhost requests no longer receive security-root bootstrap permissions by default. Hosts that intentionally rely on this development bootstrap must call EnableLocalHostPermissionGrantForSecurityRoot(); otherwise configure an explicit admin bootstrap or authenticated identity. (#​7498)
  • Script execution is privileged: C# and Python host-code execution now requires the corresponding AllowHostCodeExecution option and exec:csharp-expressions / exec:python-expressions permission. Treat both runtimes as host-code execution rather than sandboxes and enable them only for trusted authors. (#​7519)
  • New opt-in modules need explicit wiring: Structured logs, console logs, OpenTelemetry diagnostics, Secrets, Webhooks, Dashboard, and Weaver are separate modules. Add the relevant Core package, call its Use... registration, and map its routes/hub where applicable; existing hosts do not opt into these surfaces automatically. (e2e00ff23, 322d65d46, 43108c2e4)
  • EF Core persistence packages and providers: New Secrets and external-authentication persistence packages add provider-specific migrations. Include the migrations for any installed provider in your normal EF Core deployment process, and review provider project references when adding these modules. (e083d3b30, 75a3216ae)
  • .NET 10 FastEndpoints update: The .NET 10 package set moves FastEndpoints, FastEndpoints.Security, and FastEndpoints.Swagger from 7.2.0 to 8.2.0. ElsaEndpoint request constraints no longer require new(), and the runtime resume endpoint uses FastEndpoints.EmptyRequest; ResumeRequest is obsolete. Review custom endpoint wrappers and resume integrations when targeting .NET 10. (#​8019)

✨ New features

  • Diagnostics: Add structured log capture with REST/SignalR streaming and opt-in SQLite persistence; add raw console-log capture with redaction, source metadata, bounded buffers, REST, and SignalR; add an OTLP HTTP/protobuf collector with bounded in-memory trace, metric, and log stores plus query APIs and live updates. (#​7445, #​7462; 322d65d46)
  • Secrets: Add the Secrets module, EF Core persistence providers, the Secret expression, JavaScript getSecret, versioned encrypted storage, configuration-backed read-only secrets, and metadata-only management APIs. (#​7468; e083d3b30, b438551c78, 556e931662)
  • Identity and authentication: Add the external authentication broker, OpenID Connect adapter, configuration-backed Keycloak demo providers, atomic external-identity-link replacement, shadowed-connection management, and callback/session hardening. (ef83541ed, 97c459f19, e97a90d44, 238080c46)
  • Runtime operations: Add graceful runtime shutdown and recovery, readiness health checks, bookmark queue dead letters, ingress rate-limiting hooks, transactional workflow dispatch outbox, workflow OpenTelemetry instrumentation, and a read-only runtime status endpoint. (#​7424, #​7512, #​7514, #​7516, #​7517; 1e41f6fdf, dd47148164)
  • Workflow and platform modules: Add the StateMachine activity, bring HTTP Webhooks into Core, and add the Dashboard API, Persistence vNext provider-neutral contracts, Platform integration, publish-validation opt-out, stable application instance configuration, and output-converter support at binding boundaries. (#​7457, #​7681; 103028452, c16995014, e9d89969b7, 61fc376dac)
  • Weaver and module metadata: Add the Weaver AI host and grounding tools, package-manifest build metadata, shell feature categories, named WithVariable overloads, and runtime descriptor/version metadata. (#​7523, #​7699, #​7701; c66f9aed45, 92f451e655, 7941a9d72e)

🔧 Improvements

  • Workflow management: Definition synchronization avoids redundant lookups, and workflow JSON type serialization now uses a consolidated resolver path for more predictable polymorphic activity and state handling. (#​7521, #​7549)
  • Activity registry: Registry and descriptor refreshes reduce allocation and lookup overhead while retaining valid descriptors when a provider refresh is empty or removes a descriptor. (#​7538; 9554385498, a98f31141d, 26017e3b73)
  • Structured logs: SQLite storage wiring now exposes provider-neutral storage diagnostics, batches writes, and keeps the existing in-memory provider as the default. (#​7445, #​7446; 63dec9f5e4)
  • Console logs: Console capture now carries richer workflow/source context through its lifecycle, improving filtering and clustered diagnostics. (#​7536)

🐛 Fixes

  • Workflow execution: Restore dynamic references for C# variables, preserve fork completion state during resume, skip already-finished interrupted workflows, fix nested Flowchart ForEach completion, catch scheduling startup backlog, and correct StateMachine transition ordering. (#​7415, #​7416, #​7431, #​7435, #​7702; c7912fd2c8, 051e12f864)
    ... (truncated)

3.8.0-rc2

3.8 is the release where Elsa grew up operationally. Safe-by-default security, graceful shutdown, a real observability stack, first-class secrets, single sign-on — plus an AI copilot and a dashboard API for Studio.

This is the release candidate for 3.8.0, covering everything since 3.7.1: 114 pull requests across two pre-releases. The theme running through most of it is running Elsa in production and being able to tell what it's doing — the runtime now drains instead of dying, logs and traces are first-class, dispatch survives a crash, and a set of dangerous defaults have been closed off.

That last part matters before you upgrade: 3.8 removes several production-usable defaults, and a host that relied on them will now refuse to start. That's deliberate — see Upgrade notes first, then come back.

Coming from 3.8.0-rc1? rc2 adds one thing: output converters. It exists because Elsa Studio's 3.8 branch already consumes the client API for it, and rc1's Elsa.Api.Client did not ship it — so Studio could not build against a released client. Everything else below is unchanged from rc1.

Commits 328
Pull requests 114
Files touched 2,014 (+147,186 / −3,076)
New modules 47 (38 → 85 total)
New contributors 4
Compare 3.7.1...3.8.0-rc2

Highlights

1. Security: several defaults were unsafe, and are now gone

A dedicated remediation pass ran across identity, expressions, and the API surface. Most of it is invisible; the parts that aren't will stop a misconfigured production host at startup, on purpose.

Defaults that no longer ship. Default admin credentials are now development-only — outside Development, username, password, and API key must be configured explicitly (#​7500). Known public/default JWT signing keys are rejected outside explicit Development or Demo mode, failing fast with an OptionsValidationException rather than quietly signing tokens anyone can forge (#​7496). Localhost permission grants are opt-in instead of a production default (#​7498).

Scripting is now a privileged capability. Roslyn C# and Python.NET expressions execute host code — they are not sandboxes, and 3.8 stops pretending otherwise. Both are disabled unless the host explicitly opts in, their descriptors and authoring surfaces are hidden when it hasn't, and author/publish/dispatch/execute paths carrying scripts require dedicated permissions (exec:csharp-expressions, and the Python equivalent). Python and C# share one preflight authorization path. (#​7519 · #​7507, fixes #​7096)

Identity internals. Random string and API-key generation moved to cryptographic RNG, and new secrets hash with versioned PBKDF2-SHA256 and per-record salts. Legacy SHA-256 hashes stay verifiable and are upgraded in place after a successful validation — no forced reset (#​7511). Issued JWTs carry a token_use claim so a refresh token can no longer be presented as an API access token; /identity/refresh-token gets its own scheme (#​7509).

Authorization gaps closed across workflow imports (#​7510), role assignment (#​7501), SignalR workflow-instance observation (#​7504), the console-logs hub (#​7531 · #​7533), and the resilience simulate-response endpoint (#​7505). Bookmark-resume SAS tokens now fail closed before input parsing, ZIP cache download IDs are validated as opaque tokens with path containment enforced (#​7495), HTTP workflow request body limits are enforced while reading rather than after (#​7497), workflow timestamp filter columns are whitelisted (#​7506), HTTP bookmark lookup is scoped to tenant (#​7508), and polymorphic workflow JSON no longer resolves arbitrary types through unrestricted Type.GetType (#​7499).

Read Upgrade notes before deploying. Four of these will stop a host or a workflow that worked on 3.7.1.


2. Graceful shutdown: the runtime drains instead of dying

On host stop or shell deactivation, in-flight workflow executions now get a bounded chance to finish their current burst before the process exits — and anything cut short is recovered automatically on the next start.

The mechanism is worth understanding because it's extensible:

  • IQuiescenceSignal composes two flags — Drain (forward-only, triggered by host stop) and AdministrativePause (reversible, operator-triggered). Both are idempotent; pause can optionally persist via IKeyValueStore so it survives a restart.
  • IIngressSource is the contract every component that injects external events implements — HTTP, scheduling, message consumers, internal workers, and third-party modules alike. Drain pauses all sources in parallel with per-source timeouts, escalating to IForceStoppable where available. A source that claims Paused and then starts a burst anyway is detected and flipped to PauseFailed rather than trusted.
  • BurstTrackingMiddleware registers a handle for the lifetime of every execution burst, so the orchestrator can wait on real work rather than a guess. The wait is deadline-clamped; on breach, bursts are force-cancelled, instances persist as Interrupted, and a WorkflowInterrupted log entry is written.
  • Recovery on next activation scans for Interrupted instances — a scan deliberately disjoint from the existing timeout-based RestartInterruptedWorkflowsTask, so the two don't fight.
  • The heartbeat deliberately outlives drain, so a draining node doesn't look dead to the cluster mid-drain.

There's also an authenticated admin surface in Elsa.Workflows.ApiGET /admin/workflow-runtime/status plus POST to pause, resume, and force-drain — letting operators quiesce a node without stopping the host. While paused, HTTP middleware short-circuits to 503 with Retry-After instead of accepting work it won't run. First-party ingress adapters ship for HTTP triggers and scheduled triggers.
... (truncated)

3.8.0-rc1

3.8 is the release where Elsa grew up operationally. Safe-by-default security, graceful shutdown, a real observability stack, first-class secrets, single sign-on — plus an AI copilot and a dashboard API for Studio.

This is the release candidate for 3.8.0, covering everything since 3.7.1: 114 pull requests across two pre-releases. The theme running through most of it is running Elsa in production and being able to tell what it's doing — the runtime now drains instead of dying, logs and traces are first-class, dispatch survives a crash, and a set of dangerous defaults have been closed off.

That last part matters before you upgrade: 3.8 removes several production-usable defaults, and a host that relied on them will now refuse to start. That's deliberate — see Upgrade notes first, then come back.

Commits 323
Pull requests 114
Files touched 1,948 (+143,056 / −3,042)
New modules 47 (38 → 85 total)
New contributors 4
Compare 3.7.1...3.8.0-rc1

Highlights

1. Security: several defaults were unsafe, and are now gone

A dedicated remediation pass ran across identity, expressions, and the API surface. Most of it is invisible; the parts that aren't will stop a misconfigured production host at startup, on purpose.

Defaults that no longer ship. Default admin credentials are now development-only — outside Development, username, password, and API key must be configured explicitly (#​7500). Known public/default JWT signing keys are rejected outside explicit Development or Demo mode, failing fast with an OptionsValidationException rather than quietly signing tokens anyone can forge (#​7496). Localhost permission grants are opt-in instead of a production default (#​7498).

Scripting is now a privileged capability. Roslyn C# and Python.NET expressions execute host code — they are not sandboxes, and 3.8 stops pretending otherwise. Both are disabled unless the host explicitly opts in, their descriptors and authoring surfaces are hidden when it hasn't, and author/publish/dispatch/execute paths carrying scripts require dedicated permissions (exec:csharp-expressions, and the Python equivalent). Python and C# share one preflight authorization path. (#​7519 · #​7507, fixes #​7096)

Identity internals. Random string and API-key generation moved to cryptographic RNG, and new secrets hash with versioned PBKDF2-SHA256 and per-record salts. Legacy SHA-256 hashes stay verifiable and are upgraded in place after a successful validation — no forced reset (#​7511). Issued JWTs carry a token_use claim so a refresh token can no longer be presented as an API access token; /identity/refresh-token gets its own scheme (#​7509).

Authorization gaps closed across workflow imports (#​7510), role assignment (#​7501), SignalR workflow-instance observation (#​7504), the console-logs hub (#​7531 · #​7533), and the resilience simulate-response endpoint (#​7505). Bookmark-resume SAS tokens now fail closed before input parsing, ZIP cache download IDs are validated as opaque tokens with path containment enforced (#​7495), HTTP workflow request body limits are enforced while reading rather than after (#​7497), workflow timestamp filter columns are whitelisted (#​7506), HTTP bookmark lookup is scoped to tenant (#​7508), and polymorphic workflow JSON no longer resolves arbitrary types through unrestricted Type.GetType (#​7499).

Read Upgrade notes before deploying. Four of these will stop a host or a workflow that worked on 3.7.1.


2. Graceful shutdown: the runtime drains instead of dying

On host stop or shell deactivation, in-flight workflow executions now get a bounded chance to finish their current burst before the process exits — and anything cut short is recovered automatically on the next start.

The mechanism is worth understanding because it's extensible:

  • IQuiescenceSignal composes two flags — Drain (forward-only, triggered by host stop) and AdministrativePause (reversible, operator-triggered). Both are idempotent; pause can optionally persist via IKeyValueStore so it survives a restart.
  • IIngressSource is the contract every component that injects external events implements — HTTP, scheduling, message consumers, internal workers, and third-party modules alike. Drain pauses all sources in parallel with per-source timeouts, escalating to IForceStoppable where available. A source that claims Paused and then starts a burst anyway is detected and flipped to PauseFailed rather than trusted.
  • BurstTrackingMiddleware registers a handle for the lifetime of every execution burst, so the orchestrator can wait on real work rather than a guess. The wait is deadline-clamped; on breach, bursts are force-cancelled, instances persist as Interrupted, and a WorkflowInterrupted log entry is written.
  • Recovery on next activation scans for Interrupted instances — a scan deliberately disjoint from the existing timeout-based RestartInterruptedWorkflowsTask, so the two don't fight.
  • The heartbeat deliberately outlives drain, so a draining node doesn't look dead to the cluster mid-drain.

There's also an authenticated admin surface in Elsa.Workflows.ApiGET /admin/workflow-runtime/status plus POST to pause, resume, and force-drain — letting operators quiesce a node without stopping the host. While paused, HTTP middleware short-circuits to 503 with Retry-After instead of accepting work it won't run. First-party ingress adapters ship for HTTP triggers and scheduled triggers.

This is on by default — UseWorkflowRuntime() registers the drain hosted service unconditionally. The drain deadline defaults to 30 seconds and is automatically clamped to the host's own shutdown budget less a 500 ms safety margin, so the runtime never gets killed mid-persistence by a shutdown timeout it was already exceeding. Tuning knobs live on GracefulShutdownOptions: DrainDeadline, per-source IngressPauseTimeout (5 s), stimulus-queue depth while paused (10,000, Buffer overflow policy), and whether an administrative pause survives a runtime generation boundary. (#​7424)
... (truncated)

3.8.0-preview1

What's Changed

Commits viewable in compare view.

Updated Elsa.Identity from 3.7.1 to 3.8.0.

Release notes

Sourced from Elsa.Identity's releases.

3.8.0

Compare: 3.7.1...3.8.0

Elsa 3.8.0 — Release Notes


🌟 Highlights

  • Operational diagnostics: Structured ILogger logs can remain in memory or be persisted to SQLite, while console output and OpenTelemetry traces, metrics, and logs can be ingested and queried through dedicated diagnostics modules. (#​7445, #​7462)
  • Safer workflow operations: Runtime drain, pause/resume, interrupted-workflow recovery, transactional dispatch outbox, bookmark dead-letter management, and readiness checks provide clearer control over clustered and restarting hosts. (#​7424, #​7516, #​7517)
  • Secrets and external sign-in: Add the Secrets module with encrypted and configuration-backed stores, secret expressions, EF Core persistence, and JavaScript access, alongside the external authentication broker and OpenID Connect adapter. (#​7468)
  • Workflow platform foundations: Bring HTTP Webhooks into Core, and add an operational Dashboard API, provider-neutral Persistence vNext building blocks, Platform integration, and the Weaver AI host with grounded, proposal-only workflow tools. (#​7523, #​7681; 103028452, c16995014, e9d89969b)
  • State machine and workflow execution: Add the StateMachine activity and align its trigger and transition behavior with workflow runtime lifecycle semantics. (#​7457, #​8010)

⚠️ Breaking changes / upgrade notes

  • Configure production identity secrets before startup: The reference server no longer ships usable admin credentials or API keys. Configure initial users/applications through environment-specific settings or a secret manager. JWT signing keys must be configured, contain at least 32 printable ASCII characters, and have no surrounding whitespace. Known public defaults are accepted only in Development or Demo; set Identity__Tokens__SigningKey (or the shell feature equivalent) to a secure random value. (#​7496, #​7500)
  • Localhost bootstrap is opt-in: Localhost requests no longer receive security-root bootstrap permissions by default. Hosts that intentionally rely on this development bootstrap must call EnableLocalHostPermissionGrantForSecurityRoot(); otherwise configure an explicit admin bootstrap or authenticated identity. (#​7498)
  • Script execution is privileged: C# and Python host-code execution now requires the corresponding AllowHostCodeExecution option and exec:csharp-expressions / exec:python-expressions permission. Treat both runtimes as host-code execution rather than sandboxes and enable them only for trusted authors. (#​7519)
  • New opt-in modules need explicit wiring: Structured logs, console logs, OpenTelemetry diagnostics, Secrets, Webhooks, Dashboard, and Weaver are separate modules. Add the relevant Core package, call its Use... registration, and map its routes/hub where applicable; existing hosts do not opt into these surfaces automatically. (e2e00ff23, 322d65d46, 43108c2e4)
  • EF Core persistence packages and providers: New Secrets and external-authentication persistence packages add provider-specific migrations. Include the migrations for any installed provider in your normal EF Core deployment process, and review provider project references when adding these modules. (e083d3b30, 75a3216ae)
  • .NET 10 FastEndpoints update: The .NET 10 package set moves FastEndpoints, FastEndpoints.Security, and FastEndpoints.Swagger from 7.2.0 to 8.2.0. ElsaEndpoint request constraints no longer require new(), and the runtime resume endpoint uses FastEndpoints.EmptyRequest; ResumeRequest is obsolete. Review custom endpoint wrappers and resume integrations when targeting .NET 10. (#​8019)

✨ New features

  • Diagnostics: Add structured log capture with REST/SignalR streaming and opt-in SQLite persistence; add raw console-log capture with redaction, source metadata, bounded buffers, REST, and SignalR; add an OTLP HTTP/protobuf collector with bounded in-memory trace, metric, and log stores plus query APIs and live updates. (#​7445, #​7462; 322d65d46)
  • Secrets: Add the Secrets module, EF Core persistence providers, the Secret expression, JavaScript getSecret, versioned encrypted storage, configuration-backed read-only secrets, and metadata-only management APIs. (#​7468; e083d3b30, b438551c78, 556e931662)
  • Identity and authentication: Add the external authentication broker, OpenID Connect adapter, configuration-backed Keycloak demo providers, atomic external-identity-link replacement, shadowed-connection management, and callback/session hardening. (ef83541ed, 97c459f19, e97a90d44, 238080c46)
  • Runtime operations: Add graceful runtime shutdown and recovery, readiness health checks, bookmark queue dead letters, ingress rate-limiting hooks, transactional workflow dispatch outbox, workflow OpenTelemetry instrumentation, and a read-only runtime status endpoint. (#​7424, #​7512, #​7514, #​7516, #​7517; 1e41f6fdf, dd47148164)
  • Workflow and platform modules: Add the StateMachine activity, bring HTTP Webhooks into Core, and add the Dashboard API, Persistence vNext provider-neutral contracts, Platform integration, publish-validation opt-out, stable application instance configuration, and output-converter support at binding boundaries. (#​7457, #​7681; 103028452, c16995014, e9d89969b7, 61fc376dac)
  • Weaver and module metadata: Add the Weaver AI host and grounding tools, package-manifest build metadata, shell feature categories, named WithVariable overloads, and runtime descriptor/version metadata. (#​7523, #​7699, #​7701; c66f9aed45, 92f451e655, 7941a9d72e)

🔧 Improvements

  • Workflow management: Definition synchronization avoids redundant lookups, and workflow JSON type serialization now uses a consolidated resolver path for more predictable polymorphic activity and state handling. (#​7521, #​7549)
  • Activity registry: Registry and descriptor refreshes reduce allocation and lookup overhead while retaining valid descriptors when a provider refresh is empty or removes a descriptor. (#​7538; 9554385498, a98f31141d, 26017e3b73)
  • Structured logs: SQLite storage wiring now exposes provider-neutral storage diagnostics, batches writes, and keeps the existing in-memory provider as the default. (#​7445, #​7446; 63dec9f5e4)
  • Console logs: Console capture now carries richer workflow/source context through its lifecycle, improving filtering and clustered diagnostics. (#​7536)

🐛 Fixes

  • Workflow execution: Restore dynamic references for C# variables, preserve fork completion state during resume, skip already-finished interrupted workflows, fix nested Flowchart ForEach completion, catch scheduling startup backlog, and correct StateMachine transition ordering. (#​7415, #​7416, #​7431, #​7435, #​7702; c7912fd2c8, 051e12f864)
    ... (truncated)

3.8.0-rc2

3.8 is the release where Elsa grew up operationally. Safe-by-default security, graceful shutdown, a real observability stack, first-class secrets, single sign-on — plus an AI copilot and a dashboard API for Studio.

This is the release candidate for 3.8.0, covering everything since 3.7.1: 114 pull requests across two pre-releases. The theme running through most of it is running Elsa in production and being able to tell what it's doing — the runtime now drains instead of dying, logs and traces are first-class, dispatch survives a crash, and a set of dangerous defaults have been closed off.

That last part matters before you upgrade: 3.8 removes several production-usable defaults, and a host that relied on them will now refuse to start. That's deliberate — see Upgrade notes first, then come back.

Coming from 3.8.0-rc1? rc2 adds one thing: output converters. It exists because Elsa Studio's 3.8 branch already consumes the client API for it, and rc1's Elsa.Api.Client did not ship it — so Studio could not build against a released client. Everything else below is unchanged from rc1.

Commits 328
Pull requests 114
Files touched 2,014 (+147,186 / −3,076)
New modules 47 (38 → 85 total)
New contributors 4
Compare 3.7.1...3.8.0-rc2

Highlights

1. Security: several defaults were unsafe, and are now gone

A dedicated remediation pass ran across identity, expressions, and the API surface. Most of it is invisible; the parts that aren't will stop a misconfigured production host at startup, on purpose.

Defaults that no longer ship. Default admin credentials are now development-only — outside Development, username, password, and API key must be configured explicitly (#​7500). Known public/default JWT signing keys are rejected outside explicit Development or Demo mode, failing fast with an OptionsValidationException rather than quietly signing tokens anyone can forge (#​7496). Localhost permission grants are opt-in instead of a production default (#​7498).

Scripting is now a privileged capability. Roslyn C# and Python.NET expressions execute host code — they are not sandboxes, and 3.8 stops pretending otherwise. Both are disabled unless the host explicitly opts in, their descriptors and authoring surfaces are hidden when it hasn't, and author/publish/dispatch/execute paths carrying scripts require dedicated permissions (exec:csharp-expressions, and the Python equivalent). Python and C# share one preflight authorization path. (#​7519 · #​7507, fixes #​7096)

Identity internals. Random string and API-key generation moved to cryptographic RNG, and new secrets hash with versioned PBKDF2-SHA256 and per-record salts. Legacy SHA-256 hashes stay verifiable and are upgraded in place after a successful validation — no forced reset (#​7511). Issued JWTs carry a token_use claim so a refresh token can no longer be presented as an API access token; /identity/refresh-token gets its own scheme (#​7509).

Authorization gaps closed across workflow imports (#​7510), role assignment (#​7501), SignalR workflow-instance observation (#​7504), the console-logs hub (#​7531 · #​7533), and the resilience simulate-response endpoint (#​7505). Bookmark-resume SAS tokens now fail closed before input parsing, ZIP cache download IDs are validated as opaque tokens with path containment enforced (#​7495), HTTP workflow request body limits are enforced while reading rather than after (#​7497), workflow timestamp filter columns are whitelisted (#​7506), HTTP bookmark lookup is scoped to tenant (#​7508), and polymorphic workflow JSON no longer resolves arbitrary types through unrestricted Type.GetType (#​7499).

Read Upgrade notes before deploying. Four of these will stop a host or a workflow that worked on 3.7.1.


2. Graceful shutdown: the runtime drains instead of dying

On host stop or shell deactivation, in-flight workflow executions now get a bounded chance to finish their current burst before the process exits — and anything cut short is recovered automatically on the next start.

The mechanism is worth understanding because it's extensible:

  • IQuiescenceSignal composes two flags — Drain (forward-only, triggered by host stop) and AdministrativePause (reversible, operator-triggered). Both are idempotent; pause can optionally persist via IKeyValueStore so it survives a restart.
  • IIngressSource is the contract every component that injects external events implements — HTTP, scheduling, message consumers, internal workers, and third-party modules alike. Drain pauses all sources in parallel with per-source timeouts, escalating to IForceStoppable where available. A source that claims Paused and then starts a burst anyway is detected and flipped to PauseFailed rather than trusted.
  • BurstTrackingMiddleware registers a handle for the lifetime of every execution burst, so the orchestrator can wait on real work rather than a guess. The wait is deadline-clamped; on breach, bursts are force-cancelled, instances persist as Interrupted, and a WorkflowInterrupted log entry is written.
  • Recovery on next activation scans for Interrupted instances — a scan deliberately disjoint from the existing timeout-based RestartInterruptedWorkflowsTask, so the two don't fight.
  • The heartbeat deliberately outlives drain, so a draining node doesn't look dead to the cluster mid-drain.

There's also an authenticated admin surface in Elsa.Workflows.ApiGET /admin/workflow-runtime/status plus POST to pause, resume, and force-drain — letting operators quiesce a node without stopping the host. While paused, HTTP middleware short-circuits to 503 with Retry-After instead of accepting work it won't run. First-party ingress adapters ship for HTTP triggers and scheduled triggers.
... (truncated)

3.8.0-rc1

3.8 is the release where Elsa grew up operationally. Safe-by-default security, graceful shutdown, a real observability stack, first-class secrets, single sign-on — plus an AI copilot and a dashboard API for Studio.

This is the release candidate for 3.8.0, covering everything since 3.7.1: 114 pull requests across two pre-releases. The theme running through most of it is running Elsa in production and being able to tell what it's doing — the runtime now drains instead of dying, logs and traces are first-class, dispatch survives a crash, and a set of dangerous defaults have been closed off.

That last part matters before you upgrade: 3.8 removes several production-usable defaults, and a host that relied on them will now refuse to start. That's deliberate — see Upgrade notes first, then come back.

Commits 323
Pull requests 114
Files touched 1,948 (+143,056 / −3,042)
New modules 47 (38 → 85 total)
New contributors 4
Compare 3.7.1...3.8.0-rc1

Highlights

1. Security: several defaults were unsafe, and are now gone

A dedicated remediation pass ran across identity, expressions, and the API surface. Most of it is invisible; the parts that aren't will stop a misconfigured production host at startup, on purpose.

Defaults that no longer ship. Default admin credentials are now development-only — outside Development, username, password, and API key must be configured explicitly (#​7500). Known public/default JWT signing keys are rejected outside explicit Development or Demo mode, failing fast with an OptionsValidationException rather than quietly signing tokens anyone can forge (#​7496). Localhost permission grants are opt-in instead of a production default (#​7498).

Scripting is now a privileged capability. Roslyn C# and Python.NET expressions execute host code — they are not sandboxes, and 3.8 stops pretending otherwise. Both are disabled unless the host explicitly opts in, their descriptors and authoring surfaces are hidden when it hasn't, and author/publish/dispatch/execute paths carrying scripts require dedicated permissions (exec:csharp-expressions, and the Python equivalent). Python and C# share one preflight authorization path. (#​7519 · #​7507, fixes #​7096)

Identity internals. Random string and API-key generation moved to cryptographic RNG, and new secrets hash with versioned PBKDF2-SHA256 and per-record salts. Legacy SHA-256 hashes stay verifiable and are upgraded in place after a successful validation — no forced reset (#​7511). Issued JWTs carry a token_use claim so a refresh token can no longer be presented as an API access token; /identity/refresh-token gets its own scheme (#​7509).

Authorization gaps closed across workflow imports (#​7510), role assignment (#​7501), SignalR workflow-instance observation (#​7504), the console-logs hub (#​7531 · #​7533), and the resilience simulate-response endpoint (#​7505). Bookmark-resume SAS tokens now fail closed before input parsing, ZIP cache download IDs are validated as opaque tokens with path containment enforced (#​7495), HTTP workflow request body limits are enforced while reading rather than after (#​7497), workflow timestamp filter columns are whitelisted (#​7506), HTTP bookmark lookup is scoped to tenant (#​7508), and polymorphic workflow JSON no longer resolves arbitrary types through unrestricted Type.GetType (#​7499).

Read Upgrade notes before deploying. Four of these will stop a host or a workflow that worked on 3.7.1.


2. Graceful shutdown: the runtime drains instead of dying

On host stop or shell deactivation, in-flight workflow executions now get a bounded chance to finish their current burst before the process exits — and anything cut short is recovered automatically on the next start.

The mechanism is worth understanding because it's extensible:

  • IQuiescenceSignal composes two flags — Drain (forward-only, triggered by host stop) and AdministrativePause (reversible, operator-triggered). Both are idempotent; pause can optionally persist via IKeyValueStore so it survives a restart.
  • IIngressSource is the contract every component that injects external events implements — HTTP, scheduling, message consumers, internal workers, and third-party modules alike. Drain pauses all sources in parallel with per-source timeouts, escalating to IForceStoppable where available. A source that claims Paused and then starts a burst anyway is detected and flipped to PauseFailed rather than trusted.
  • BurstTrackingMiddleware registers a handle for the lifetime of every execution burst, so the orchestrator can wait on real work rather than a guess. The wait is deadline-clamped; on breach, bursts are force-cancelled, instances persist as Interrupted, and a WorkflowInterrupted log entry is written.
  • Recovery on next activation scans for Interrupted instances — a scan deliberately disjoint from the existing timeout-based RestartInterruptedWorkflowsTask, so the two don't fight.
  • The heartbeat deliberately outlives drain, so a draining node doesn't look dead to the cluster mid-drain.

There's also an authenticated admin surface in Elsa.Workflows.ApiGET /admin/workflow-runtime/status plus POST to pause, resume, and force-drain — letting operators quiesce a node without stopping the host. While paused, HTTP middleware short-circuits to 503 with Retry-After instead of accepting work it won't run. First-party ingress adapters ship for HTTP triggers and scheduled triggers.

This is on by default — UseWorkflowRuntime() registers the drain hosted service unconditionally. The drain deadline defaults to 30 seconds and is automatically clamped to the host's own shutdown budget less a 500 ms safety margin, so the runtime never gets killed mid-persistence by a shutdown timeout it was already exceeding. Tuning knobs live on GracefulShutdownOptions: DrainDeadline, per-source IngressPauseTimeout (5 s), stimulus-queue depth while paused (10,000, Buffer overflow policy), and whether an administrative pause survives a runtime generation boundary. (#​7424)
... (truncated)

3.8.0-preview1

What's Changed

Commits viewable in compare view.

Updated Elsa.Scheduling from 3.7.1 to 3.8.0.

Release notes

Sourced from Elsa.Scheduling's releases.

3.8.0

Compare: 3.7.1...3.8.0

Elsa 3.8.0 — Release Notes


🌟 Highlights

  • Operational diagnostics: Structured ILogger logs can remain in memory or be persisted to SQLite, while console output and OpenTelemetry traces, metrics, and logs can be ingested and queried through dedicated diagnostics modules. (#​7445, #​7462)
  • Safer workflow operations: Runtime drain, pause/resume, interrupted-workflow recovery, transactional dispatch outbox, bookmark dead-letter management, and readiness checks provide clearer control over clustered and restarting hosts. (#​7424, #​7516, #​7517)
  • Secrets and external sign-in: Add the Secrets module with encrypted and configuration-backed stores, secret expressions, EF Core persistence, and JavaScript access, alongside the external authentication broker and OpenID Connect adapter. (#​7468)
  • Workflow platform foundations: Bring HTTP Webhooks into Core, and add an operational Dashboard API, provider-neutral Persistence vNext building blocks, Platform integration, and the Weaver AI host with grounded, proposal-only workflow tools. (#​7523, #​7681; 103028452, c16995014, e9d89969b)
  • State machine and workflow execution: Add the StateMachine activity and align its trigger and transition behavior with workflow runtime lifecycle semantics. (#​7457, #​8010)

⚠️ Breaking changes / upgrade notes

  • Configure production identity secrets before startup: The reference server no longer ships usable admin credentials or API keys. Configure initial users/applications through environment-specific settings or a secret manager. JWT signing keys must be configured, contain at least 32 printable ASCII characters, and have no surrounding whitespace. Known public defaults are accepted only in Development or Demo; set Identity__Tokens__SigningKey (or the shell feature equivalent) to a secure random value. (#​7496, #​7500)
  • Localhost bootstrap is opt-in: Localhost requests no longer receive security-root bootstrap permissions by default. Hosts that intentionally rely on this development bootstrap must call EnableLocalHostPermissionGrantForSecurityRoot(); otherwise configure an explicit admin bootstrap or authenticated identity. (#​7498)
  • Script execution is privileged: C# and Python host-code execution now requires the corresponding AllowHostCodeExecution option and exec:csharp-expressions / exec:python-expressions permission. Treat both runtimes as host-code execution rather than sandboxes and enable them only for trusted authors. (#​7519)
  • New opt-in modules need explicit wiring: Structured logs, console logs, OpenTelemetry diagnostics, Secrets, Webhooks, Dashboard, and Weaver are separate modules. Add the relevant Core package, call its Use... registration, and map its routes/hub where applicable; existing hosts do not opt into these surfaces automatically. (e2e00ff23, 322d65d46, 43108c2e4)
  • EF Core persistence packages and providers: New Secrets and external-authentication persistence packages add provider-specific migrations. Include the migrations for any installed provider in your normal EF Core deployment process, and review provider project references when adding these modules. (e083d3b30, 75a3216ae)
  • .NET 10 FastEndpoints update: The .NET 10 package set moves FastEndpoints, FastEndpoints.Security, and FastEndpoints.Swagger from 7.2.0 to 8.2.0. ElsaEndpoint request constraints no longer require new(), and the runtime resume endpoint uses FastEndpoints.EmptyRequest; ResumeRequest is obsolete. Review custom endpoint wrappers and resume integrations when targeting .NET 10. (#​8019)

✨ New features

  • Diagnostics: Add structured log capture with REST/SignalR streaming and opt-in SQLite persistence; add raw console-log capture with redaction, source metadata, bounded buffers, REST, and SignalR; add an OTLP HTTP/protobuf collector with bounded in-memory trace, metric, and log stores plus query APIs and live updates. (#​7445, #​7462; 322d65d46)
  • Secrets: Add the Secrets module, EF Core persistence providers, the Secret expression, JavaScript getSecret, versioned encrypted storage, configuration-backed read-only secrets, and metadata-only management APIs. (#​7468; e083d3b30, b438551c78, 556e931662)
  • Identity and authentication: Add the external authentication broker, OpenID Connect adapter, configuration-backed Keycloak demo providers, atomic external-identity-link replacement, shadowed-connection management, and callback/session hardening. (ef83541ed, 97c459f19, e97a90d44, 238080c46)
  • Runtime operations: Add graceful runtime shutdown and recovery, readiness health checks, bookmark queue dead letters, ingress rate-limiting hooks, transactional workflow dispatch outbox, workflow OpenTelemetry instrumentation, and a read-only runtime status endpoint. (#​7424, #​7512, #​7514, #​7516, #​7517; 1e41f6fdf, dd47148164)
  • Workflow and platform modules: Add the StateMachine activity, bring HTTP Webhooks into Core, and add the Dashboard API, Persistence vNext provider-neutral contracts, Platform integration, publish-validation opt-out, stable application instance configuration, and output-converter support at binding boundaries. (#​7457, #​7681; 103028452, c16995014, e9d89969b7, 61fc376dac)
  • Weaver and module metadata: Add the Weaver AI host and grounding tools, package-manifest build metadata, shell feature categories, named WithVariable overloads, and runtime descriptor/version metadata. (#​7523, #​7699, #​7701; c66f9aed45, 92f451e655, 7941a9d72e)

🔧 Improvements

  • Workflow management: Definition synchronization avoids redundant lookups, and workflow JSON type serialization now uses a consolidated resolver path for more predictable polymorphic activity and state handling. (#​7521, #​7549)
  • Activity registry: Registry and descriptor refreshes reduce allocation and lookup overhead while retaining valid descriptors when a provider refresh is empty or removes a descriptor. (#​7538; 9554385498, a98f31141d, 26017e3b73)
  • Structured logs: SQLite storage wiring now exposes provider-neutral storage diagnostics, batches writes, and keeps the existing in-memory provider as the default. (#​7445, #​7446; 63dec9f5e4)
  • Console logs: Console capture now carries richer workflow/source context through its lifecycle, improving filtering and clustered diagnostics. (#​7536)

🐛 Fixes

  • Workflow execution: Restore dynamic references for C# variables, preserve fork completion state during resume, skip already-finished interrupted workflows, fix nested Flowchart ForEach completion, catch scheduling startup backlog, and correct StateMachine transition ordering. (#​7415, #​7416, #​7431, #​7435, #​7702; c7912fd2c8, 051e12f864)
    ... (truncated)

3.8.0-rc2

3.8 is the release where Elsa grew up operationally. Safe-by-default security, graceful shutdown, a real observability stack, first-class secrets, single sign-on — plus an AI copilot and a dashboard API for Studio.

This is the release candidate for 3.8.0, covering everything since 3.7.1: 114 pull requests across two pre-releases. The theme running through most of it is running Elsa in production and being able to tell what it's doing — the runtime now drains instead of dying, logs and traces are first-class, dispatch survives a crash, and a set of dangerous defaults have been closed off.

That last part matters before you upgrade: 3.8 removes several production-usable defaults, and a host that relied on them will now refuse to start. That's deliberate — see Upgrade notes first, then come back.

Coming from 3.8.0-rc1? rc2 adds one thing: output converters. It exists because Elsa Studio's 3.8 branch already consumes the client API for it, and rc1's Elsa.Api.Client did not ship it — so Studio could not build against a released client. Everything else below is unchanged from rc1.

Commits 328
Pull requests 114
Files touched 2,014 (+147,186 / −3,076)
New modules 47 (38 → 85 total)
New contributors 4
Compare 3.7.1...3.8.0-rc2

Highlights

1. Security: several defaults were unsafe, and are now gone

A dedicated remediation pass ran across identity, expressions, and the API surface. Most of it is invisible; the parts that aren't will stop a misconfigured production host at startup, on purpose.

Defaults that no longer ship. Default admin credentials are now development-only — outside Development, username, password, and API key must be configured explicitly (#​7500). Known public/default JWT signing keys are rejected outside explicit Development or Demo mode, failing fast with an OptionsValidationException rather than quietly signing tokens anyone can forge (#​7496). Localhost permission grants are opt-in instead of a production ...

_Des...

Description has been truncated

Bumps Elsa from 3.7.1 to 3.8.0
Bumps Elsa.Identity from 3.7.1 to 3.8.0
Bumps Elsa.Scheduling from 3.7.1 to 3.8.0
Bumps Elsa.Workflows.Api from 3.7.1 to 3.8.0

---
updated-dependencies:
- dependency-name: Elsa
  dependency-version: 3.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: elsa
- dependency-name: Elsa.Identity
  dependency-version: 3.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: elsa
- dependency-name: Elsa.Scheduling
  dependency-version: 3.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: elsa
- dependency-name: Elsa.Workflows.Api
  dependency-version: 3.8.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: elsa
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot added .NET Pull requests that update .net code dependencies Pull requests that update a dependency file labels Sep 7, 2026
@github-actions
github-actions Bot merged commit 468d6be into master Sep 7, 2026
1 of 2 checks passed
@github-actions
github-actions Bot deleted the dependabot/nuget/Elsademo/ElsaCore.Server/elsa-a5b8d49b57 branch September 7, 2026 17:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file .NET Pull requests that update .net code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

RCE ( Remote Code Execution ) and Docker Escape using Elsa Workflows version >= 3.4.3

0 participants