Commit graph

7323 commits

Author SHA1 Message Date
Sipke Schoorstra 5e56161031
Merge pull request #7919 from elsa-workflows/claude/fix-nuke-nuget-frameworks
build: bump NuGet.Packaging to 7.9.0 to unbreak the NUKE build on SDK 10.0.400
2026-08-11 23:36:35 +02:00
Sipke Schoorstra fe6601ab5b
build: bump NuGet.Packaging to 7.9.0 to unbreak the NUKE build on SDK 10.0.400
CI started failing on every branch with an assembly load error out of NUKE's
project parsing, before any test ran:

  InvalidProjectFileException: The expression
  "[MSBuild]::GetTargetFrameworkIdentifier(net10.0)" cannot be evaluated.
  Could not load file or assembly 'NuGet.Frameworks, Version=7.9.0.0'.
  The located assembly's manifest definition does not match the assembly reference.
     at Nuke.Common.ProjectModel.ProjectModelTasks.ParseProject

Nothing in the repo changed to cause it. pr.yml requests dotnet-version 10.x,
and the hosted runner moved from SDK 10.0.302 to 10.0.400. Measured, the two
SDKs ship different NuGet.Frameworks:

  SDK 10.0.300 / 10.0.302 -> NuGet.Frameworks 7.6.0
  SDK 10.0.400            -> NuGet.Frameworks 7.9.0

_build.csproj pinned NuGet.Packaging 7.6.0, which puts NuGet.Frameworks 7.6.0
in the NUKE output directory, where it shadows the SDK's own copy. The loader
accepts an assembly newer than the reference but not older, so once MSBuild
started asking for 7.9.0.0 the app-local 7.6.0 no longer satisfied it. The same
commits passed 19 hours earlier on 10.0.302.

The reference is not used by the build itself - there are no NuGet.* usages
anywhere in build/*.cs. It exists only as a transitive vulnerability override,
added in f5dc29cdc, so bumping it preserves the original intent while matching
what the current SDK ships. Staying loadable on 10.0.3xx follows from the same
newer-than-reference rule that broke the old pin.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 23:25:33 +02:00
Sipke Schoorstra a618337923
docs(core): give FaultSignal handlers a working completion path
Review caught that the contract advertised something that cannot work. It
offered handlers three ways to terminalize the faulted activity - cancel,
complete, or reschedule - but CompleteActivityAsync returns immediately unless
the activity is Running, and throughout the handler it is still Faulted, since
recovery runs only after the handler returns. Completing inline did nothing at
all, silently, leaving the child Running.

Measured, same container, handler completing the faulted child:

  inline complete                    -> child Running,   no output, Running/Suspended
  TransitionTo(Running), complete    -> child Completed, "after",   Finished/Finished

So a supported path exists; it just needed writing down. Document it on
FaultSignal, note that it is not licence to call RecoverFromFault (which also
rewrites the fault counts), and note that cancelling and rescheduling need no
equivalent step. Cover it with an integration test asserting that completing the
child with a substitute result fires the container's completion callback and
resumes its sequencing.

Refs #7911

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 22:08:44 +02:00
Shivamkmr8 d9ba421737 Use last version for revert version allocation 2026-08-11 12:39:55 +05:30
Sipke Schoorstra d085b536f0
docs(core): document FaultSignal self-receipt and pin it with a test
Review raised that TrySendSignalAsync delivers to the faulting activity before
walking ancestors, so an activity that throws and also handles FaultSignal can
claim its own fault and suppress the incident strategy.

That is real, but it is the channel's existing dispatch, which #7911 chose
deliberately over a variant of it, and SignalContext.IsSelf exists so handlers
can discriminate. It also grants no capability: an activity that catches its own
exception never faults at all, ending Finished/Finished with zero incidents,
which is a cleaner suppression than self-handling (incident still recorded,
activity left Running, workflow suspended).

So dispatch is unchanged. What was missing is that none of this was written
down: the contract describes the handler as an enclosing container and never
mentioned self-receipt. Document it on FaultSignal, including how a handler
that wants ancestors-only semantics opts out, and add a test so the behavior is
pinned rather than incidental.

Refs #7911

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 03:04:49 +02:00
Sipke Schoorstra 13eb48e002
feat(core): let a container handle a child's fault via FaultSignal
A container activity had no way to learn that one of its children faulted.
ExceptionHandlingMiddleware caught the exception, called context.Fault(e) and
handed off to the workflow-global IIncidentStrategy; the container's completion
callback never fired, because the child never completed.

Add a seam on the ancestor-bubbling signal channel that already exists:

- FaultSignal(Exception, ActivityExecutionContext), beside CancelSignal. Its XML
  doc carries the contract, including why a handler must not call
  RecoverFromFault and why the CompleteActivityAsync sweep is a backstop rather
  than the mechanism.
- An internal bool-returning TrySendSignalAsync, since SignalContext
  .StopPropagationRequested is internal and SendSignalAsync reported nothing.
  SendSignalAsync keeps its public signature and delegates to it.
- ExceptionHandlingMiddleware sends the signal after faulting and, when an
  ancestor stops propagation, calls RecoverFromFault once and returns instead of
  raising an incident.

RecoverFromFault now transitions to Running only when the activity is still
Faulted. It is called after the handler runs, so the unconditional transition
would otherwise undo a handler that cancelled or completed the faulted child.
The counts are still reset unconditionally, and the one pre-existing caller is
unaffected.

Behavior is unchanged when nobody handles the signal: verified by running the
new unhandled-fault theory against the pre-change middleware, and by
IncidentStrategyTests and Primitives/FaultTests passing unmodified.

Refs #7911

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 01:11:25 +02:00
Sipke Schoorstra bd903f63dc
docs: refresh roadmap 2026-08-05 00:05:27 +02:00
Sipke Schoorstra 5429008d98
Add architecture and practices documentation
Introduce comprehensive documentation covering architecture (ARCHITECTURE.md), concerns (CONCERNS.md), coding conventions (CONVENTIONS.md), integrations (INTEGRATIONS.md), technology stack (STACK.md), codebase structure (STRUCTURE.md), and testing patterns (TESTING.md). Enhance testing with additional test cases for external sign-in flows, ensuring accurate timestamp recording for identity links.
2026-08-03 23:46:38 +02:00
Sipke Schoorstra ff10a68100
refactor: update package reference configuration
- Updated `CShells.Abstractions` package reference to use the default version in the unit test project.
2026-08-03 13:15:18 +02:00
Sipke Schoorstra e59a0f1721
Merge remote-tracking branch 'origin/release/3.8.0' into release/3.8.0 2026-08-03 02:08:23 +02:00
Sipke Schoorstra 103028452f
feat: introduce HTTP webhooks module
Adds a new `Elsa.Http.Webhooks` module, enabling workflows to receive incoming webhook events and dispatch outgoing webhooks. This integrates the WebhooksCore library.

Further improvements include:
- Enhanced validation for configured application instance names, providing clearer feedback, especially regarding Azure Service Bus entity name limits.
- Improved API error reporting for shell reload operations, distinguishing between blueprint not found (404) and other failures (503).
- Updated release announcement rendering to dynamically reference the correct major.minor release line for feedback messages.
2026-08-03 02:08:15 +02:00
Sipke Schoorstra 46b29d6efd
Merge pull request #7901 from DenDeline/bugfix/7900-tenant-request-services
fix: restore request services after tenant middleware exceptions
2026-08-03 01:06:56 +02:00
Sipke Schoorstra c557c455ad
Merge release/3.8.0 into bugfix/7900-tenant-request-services 2026-08-03 00:48:56 +02:00
Sipke Schoorstra dacad14643
Merge pull request #7905 from elsa-workflows/codex/pr-7903-review-fixes
Harden external identity race compensation
2026-08-02 23:44:31 +02:00
Sipke Schoorstra 286a0d83d1
Harden external identity race compensation 2026-08-02 23:19:49 +02:00
Sipke Schoorstra d10dbdd482
Merge branch 'codex/pr-7903-review-fixes' into release/3.8.0 2026-08-02 22:40:23 +02:00
Sipke Schoorstra f4d749d3f1
Merge branch 'codex/auth-refinements' into release/3.8.0 2026-08-02 22:39:54 +02:00
Sipke Schoorstra fe125ac336
Fix external authentication review findings 2026-08-02 03:35:39 +02:00
Sipke Schoorstra ed50e1cc96
Merge pull request #7904 from elsa-workflows/codex/fix-7306-tenant-agnostic-registry-population
Avoid repeated tenant-agnostic registry population
2026-08-02 03:25:43 +02:00
Sipke Schoorstra 1b74bb94c0
fix: validate external login methods before discovery
Use the same structural and secret-binding assessment for management, discovery, and initiation so incomplete overrides are never advertised as available sign-in methods.
2026-08-02 02:47:28 +02:00
Sipke Schoorstra 542058971b
Avoid repeated tenant-agnostic registry population 2026-08-02 01:59:45 +02:00
Sipke Schoorstra a24a6fe267
Add test to validate complete configuration requirements for connections
Introduce a new test `ValidateRequiresCompleteConfigurationAndReturnsMissingSecretDetails` to verify that a connection requires a complete configuration, including handling missing secret details. Adjust configuration to enforce `RequiresClientSecret`.
2026-08-02 01:43:30 +02:00
Sipke Schoorstra a60b5a36b2
Refine test for archived connections in shadow relationships; introduce IsAvailableForAuthentication helper for improved connection filtering logic. 2026-08-02 00:49:26 +02:00
Sipke Schoorstra 572cd325b5
Merge compact external authentication secret IDs 2026-08-02 00:22:29 +02:00
Sipke Schoorstra 119f49f7a2
fix: simplify external authentication secret IDs
Use a compact namespaced GUID for newly managed secrets while preserving unique staging and opaque existing references.
2026-08-02 00:22:16 +02:00
Sipke Schoorstra 9f09aca3f6
Refine test to ensure archived connections do not participate as active shadows; update shadow relationship management to exclude archived entries. 2026-07-31 23:07:08 +02:00
Sipke Schoorstra 14f373528d
Add test for handling archived database overrides in connection shadows 2026-07-31 21:34:35 +02:00
Sipke Schoorstra 6e3ed5c4e0
Remove migration for external authentication in EFCore.Sqlite module 2026-07-31 14:31:18 +02:00
Sipke Schoorstra 5b0c2d7359
Merge pull request #7902 from elsa-workflows/012-output-converters
Add extensible output converters
2026-07-31 13:30:06 +02:00
Sipke Schoorstra 5d7db9d057
Merge remote-tracking branch 'origin/main' into 012-output-converters 2026-07-31 13:29:06 +02:00
Sipke Schoorstra 0737def83d
Harden output converter contracts 2026-07-31 13:29:01 +02:00
Sipke Schoorstra c3c6f12858
fix: restore commit notification scope before flush
Detach the AsyncLocal scope synchronously so notifications published after an asynchronous flush are not re-buffered and discarded. Add regression coverage that forces the flush across an async boundary.
2026-07-31 04:50:31 +02:00
Sipke Schoorstra d698e6b005
Add output converter support at binding boundaries 2026-07-31 04:10:48 +02:00
Sipke Schoorstra d63dae95bc
Introduce shadow relationship management in identity provider connections 2026-07-31 01:00:36 +02:00
Rostislav Statko 56b16caa0e
fix: restore request services after tenant middleware exceptions 2026-07-30 09:54:00 +03:00
Sipke Schoorstra ec9acd4f3f
Fix tenant service mutation race (#7898)
Serialize tenant lifecycle mutations and keep synchronization available through shutdown.

Closes #7771.
2026-07-30 02:47:44 +02:00
Sipke Schoorstra edb5f7cd51
Add workflow state rehydration diagnostics (#7899) 2026-07-30 02:28:56 +02:00
Sipke Schoorstra f4ca206607
fix: send preview authentication responses 2026-07-30 02:14:29 +02:00
Sipke Schoorstra 678182dff8
fix: persist relative external auth preview callbacks 2026-07-30 01:27:26 +02:00
Sipke Schoorstra 7941a9d72e
Add runtime descriptor endpoint and tests for version metadata 2026-07-29 20:01:16 +02:00
Sipke Schoorstra 1ccf5b7611
Add test for callback session persistence; extend authentication broker for refresh token hash initialization; enable config connection overrides 2026-07-29 13:59:24 +02:00
Sipke Schoorstra 22bc531aa8
Allow promoting shadowed authentication connections 2026-07-29 12:13:06 +02:00
Sipke Schoorstra 1000d29feb
docs: refresh roadmap 2026-07-29 00:08:31 +02:00
Sipke Schoorstra 238080c465
feat: add configuration-backed Keycloak demo providers 2026-07-28 00:12:12 +02:00
Sipke Schoorstra eb07aa2cde
Fix external authentication connection contracts 2026-07-27 10:07:29 +02:00
Sipke Schoorstra 75a3216ae8
Persist external authentication in identity shell 2026-07-27 02:25:41 +02:00
Sipke Schoorstra 0fa7657b30
Harden external identity link management 2026-07-27 00:40:23 +02:00
Sipke Schoorstra e97a90d442
Add atomic external identity link replacement 2026-07-26 23:40:17 +02:00
Sipke Schoorstra 97c459f198
Add OpenID Connect authentication features 2026-07-26 23:38:20 +02:00
Sipke Schoorstra 04e58690ff
chore: apply safe dependency upgrades (#7896) 2026-07-26 21:42:27 +02:00