Add StellaOps.Workflow engine: 14 libraries, WebService, 8 test projects

Extract product-agnostic workflow engine from Ablera.Serdica.Workflow into
standalone StellaOps.Workflow.* libraries targeting net10.0.

Libraries (14):
- Contracts, Abstractions (compiler, decompiler, expression runtime)
- Engine (execution, signaling, scheduling, projections, hosted services)
- ElkSharp (generic graph layout algorithm)
- Renderer.ElkSharp, Renderer.ElkJs, Renderer.Msagl, Renderer.Svg
- Signaling.Redis, Signaling.OracleAq
- DataStore.MongoDB, DataStore.PostgreSQL, DataStore.Oracle

WebService: ASP.NET Core Minimal API with 22 endpoints

Tests (8 projects, 109 tests pass):
- Engine.Tests (105 pass), WebService.Tests (4 E2E pass)
- Renderer.Tests, DataStore.MongoDB/Oracle/PostgreSQL.Tests
- Signaling.Redis.Tests, IntegrationTests.Shared

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
master
2026-03-20 19:14:44 +02:00
parent e56f9a114a
commit f5b5f24d95
422 changed files with 85428 additions and 0 deletions

View File

@@ -0,0 +1,36 @@
# Tutorial 8: Expressions
The expression system enables declarative logic that compiles to portable canonical JSON. All expressions are evaluable at runtime without recompilation.
## Path Navigation
| Prefix | Source | Example |
|--------|--------|---------|
| `start.*` | Start request fields | `start.policyId` |
| `state.*` | Mutable workflow state | `state.customerName` |
| `payload.*` | Task completion payload | `payload.answer` |
| `result.*` | Step result (by resultKey) | `result.productInfo.lob` |
## Built-in Functions
| Function | Description | Example |
|----------|-------------|---------|
| `coalesce` | First non-null | `coalesce(state.id, start.id, 0)` |
| `concat` | String join | `concat("Policy #", state.policyNo)` |
| `add` | Sum | `add(state.attempt, 1)` |
| `if` | Conditional | `if(state.isVip, "VIP", "Standard")` |
| `isNullOrWhiteSpace` | Null/empty check | `isNullOrWhiteSpace(state.name)` |
| `length` | String/array length | `length(state.items)` |
| `upper` | Uppercase | `upper(state.annexType)` |
| `first` | First array element | `first(state.objects)` |
| `mergeObjects` | Deep merge | `mergeObjects(state, payload)` |
## Variants
- [C# Expression Builder](csharp/)
- [JSON Expression Format](json/)
## Next
[Tutorial 9: Testing](../09-testing/) — unit test setup with recording transports.