Workable.Views
1.1.71926.1
See the version list below for details.
dotnet add package Workable.Views --version 1.1.71926.1
NuGet\Install-Package Workable.Views -Version 1.1.71926.1
<PackageReference Include="Workable.Views" Version="1.1.71926.1" />
<PackageVersion Include="Workable.Views" Version="1.1.71926.1" />
<PackageReference Include="Workable.Views" />
paket add Workable.Views --version 1.1.71926.1
#r "nuget: Workable.Views, 1.1.71926.1"
#:package Workable.Views@1.1.71926.1
#addin nuget:?package=Workable.Views&version=1.1.71926.1
#tool nuget:?package=Workable.Views&version=1.1.71926.1
Workable
Workable is a .NET work orchestration library for applications that need more than "run this in the background." It turns background jobs, operational tasks, recurring work, and user-triggered actions into first-class work the host can queue, observe, control, and configure.
Most applications eventually grow work that does not fit cleanly inside the request, controller action, message handler, or command that started it. Sending email, refreshing caches, synchronizing data, running maintenance tasks, retrying transient failures, and coordinating long-running operations all need identity, state, cancellation, status, events, and a way to be found later. Workable gives that work a consistent runtime model instead of leaving each feature to invent its own.
Workable is useful when you want feature code to define work near the feature that needs it, while the host application keeps control of execution. Feature assemblies can declare their own work with Workable.Sdk. Libraries that need to use a hosted system can depend on Workable.Abstractions and accept IWorkSystem from the host. The host application owns the actual Workable systems, decides which work belongs in each system, and controls how workers start, retry, recur, respect concurrency, and stay available for inspection.
That split lets teams add work near the feature that needs it without forcing every feature library to know how the application hosts work. At runtime, the host gets a consistent surface for queueing work, awaiting completion, pausing, canceling, reconfiguring workers, and subscribing to work events.
Workable also gives applications a path to expose the same authored work through more than one channel. Direct .NET callers, HTTP endpoints, MCP clients, and realtime SignalR clients can all work against the same catalog while preserving request context, structured outcomes, worker history, and invocation rules.
Why Use Workable?
- Define work once and invoke it through .NET, HTTP, or MCP when those channels are enabled.
- Register workflow definitions that coordinate existing work through dispatch, typed fan-out, parallel branches, and join steps inside the host runtime.
- Keep feature libraries independent from the host runtime while still letting them contribute work.
- Queue fire-and-forget work without losing the ability to query, observe, cancel, pause, retry, or purge it.
- Give operators a real admin surface for work: live system and worker visibility, executable definitions, diagnostics, and control actions instead of one-off job screens and custom tooling.
- Attach runtime behavior such as recurrence, transient retry, failed-worker handling, idempotency, concurrency, durability, retention, logging, profiling, initialization, invocation policy, and start policy.
- Use structured inputs, outputs, messages, worker snapshots, event payloads, and status summaries instead of ad hoc task tracking.
- Preserve who or what started work through request context and origin metadata for HTTP, MCP, SignalR, and direct .NET calls.
Packages
Core Packages
Workable.Sdk: contracts and registration helpers for assemblies that author work.Workable.Abstractions: contracts for libraries that consume an already-hosted work system.Workable: in-process host and runtime for Workable systems.
Optional Packages
Workable.SqlServer: SQL Server persistence integration for durable queueing and completion, durable workflows, persistence-backed idempotency, and persistence-backed concurrency.Workable.AspNetCore: ASP.NET Core request-context and authorization integration for custom endpoints and hosts.Workable.Entra: Microsoft Entra ID bearer-token validation and Workable authorization claim mapping for ASP.NET Core target apps.Workable.Views: shared component-view contracts and projections used by HTTP and SignalR adapters; most applications receive it transitively throughWorkable.HttpApiorWorkable.SignalRinstead of referencing it directly.Workable.HttpApi: standard HTTP endpoints for queueing, querying, and controlling workers and workflow runs.Workable.Mcp: MCP server adapter for authored work, worker and workflow queries, and worker and workflow actions.Workable.SignalR: realtime worker and workflow events plus component-view updates for ASP.NET Core clients.
Apps And Tools
apps/samples/Workable.SampleHost: runnable ASP.NET Core sample app with HTTP API, MCP, SignalR, fake-auth profiles, and SQL Server LocalDB durability scenarios.apps/tools/Workable.PerformanceHarness: opt-in scenario runner and BenchmarkDotNet harness for runtime, query, view, realtime, and SQL durability performance work.apps/tools/Workable.SqlServer.Cli: SQL Server schema generation and deployment CLI for Workable persistence.apps/web/workable-admin-ui: Next.js admin UI for inspecting and operating Workable systems through the HTTP API and SignalR realtime updates.
Documentation
Start with the docs landing page: Workable Docs.
Recommended entry points:
- Getting Started if you are evaluating or integrating Workable.
- Registration if you are authoring work in feature assemblies.
- Workflows if you want to author multi-step orchestrations from existing work definitions.
- Implementation if you want to implement work classes and understand what executor code can do at runtime.
- Queueing if you already have work definitions and want to invoke them.
- Configuration if you are tuning start behavior, retry, recurrence, failed-worker handling, concurrency, durability, logging, retention, or invocation rules.
- HTTP API, MCP, and Realtime if you are exposing Workable over transports.
- Abstractions Surface if you are consuming a hosted system from another library.
- Workable SQL Server Integration if you need durable queueing, durable workflows, or persistence-backed coordination.
- Sample Host if you want a runnable reference app.
- Admin UI if you want the browser-based operator surface.
- Performance Harness if you are measuring runtime or adapter performance.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Workable.Abstractions (>= 1.1.71926.1)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on Workable.Views:
| Package | Downloads |
|---|---|
|
Workable.SignalR
Expose Workable worker events and component-view updates to ASP.NET Core clients through SignalR. |
|
|
Workable.HttpApi
Expose standard ASP.NET Core HTTP endpoints for queueing Workable definitions, querying workers, and sending worker actions. |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.1.83126.1 | 153 | 9/1/2026 |
| 1.1.82326.1 | 346 | 8/24/2026 |
| 1.1.81126.1 | 169 | 8/11/2026 |
| 1.1.80926.1 | 113 | 8/9/2026 |
| 1.1.80726.1 | 139 | 8/8/2026 |
| 1.1.80526.1 | 126 | 8/5/2026 |
| 1.1.71926.1 | 146 | 7/21/2026 |
| 1.1.70926.1 | 162 | 7/10/2026 |
| 1.1.70626.2 | 218 | 7/6/2026 |
| 1.1.70626.1 | 143 | 7/6/2026 |
| 1.1.63026.1 | 138 | 6/30/2026 |
| 1.1.61226.1 | 146 | 6/12/2026 |
| 1.1.159.1 | 162 | 6/8/2026 |
| 1.1.158.1 | 142 | 6/7/2026 |
| 1.1.157 | 154 | 6/7/2026 |
| 1.1.153.1 | 158 | 6/2/2026 |
| 1.1.146.1 | 318 | 5/26/2026 |
| 1.1.142.3 | 178 | 5/23/2026 |
| 1.1.0 | 169 | 5/22/2026 |
| 1.0.0 | 160 | 5/21/2026 |
# 1.1.071926.1
Date: 2026-07-19
## Added
- Added configurable canceled-child handling for `DispatchEach(...)` through `WorkflowCanceledChildBehavior.Continue`, `Block`, and `CancelWorkflow`. The selected policy is applied across non-durable execution, durable execution and recovery, joins, final child waits, outstanding-child cancellation, and operator status reporting.
- Added `WorkerActionRequest` so single-worker actions can carry an optional human-readable reason while the concise `Execute(worker, action, cancellationToken)` overload remains available.
- Added `IWorkExecutionContext.CancellationRequestContext` so running work can inspect the sanitized caller identity and reason for an accepted explicit cancellation before Workable signals the execution cancellation token. Pause, shutdown interruption, and lease loss continue to leave this value unset.
- Added `IWorkflowDispatchEachBuilder.Outputs<TOutput>()`, which returns a typed reference to each fan-out child's output and allows a later `DispatchEach(...)` step to consume those outputs without reconstructing a reference from the earlier step name.
- Added `IWorkPersistenceStore.DurableWorkersExist(...)` so persistence providers can resolve large durable-workflow fan-outs with one batched lookup. Existing providers remain compatible through a default fallback to `DurableWorkerExists(...)`; the SQL Server provider implements a single set-based query.
## Changed
- `DispatchEach(...)` defaults canceled expanded children to `Continue`, treating them as skipped after the remaining siblings settle. Select `WorkflowCanceledChildBehavior.Block` when a canceled child should stop the workflow at its next synchronization point.
- The configured `DispatchEach` cancellation policy is now part of the workflow definition fingerprint. Changing it while an incomplete durable run is retained is handled as a workflow definition mismatch.
- `CancelWorkflow` now cancels the workflow and requests cancellation of its remaining outstanding children, including active and recovered durable executions. `Block` leaves remaining siblings running and blocks at the next synchronization point, while `Continue` waits for the remaining siblings before advancing.
- Single-worker action reasons are stored in action history as `RequestContext.Description`. The HTTP adapter preserves the existing `description` wire property and maps it to `WorkerActionRequest.Reason`.
- Compatibility: the new `IWorkerOperations` request overload and `IWorkExecutionContext.CancellationRequestContext` use default interface implementations, so previously compiled direct implementations remain loadable. Implementers can override the new members to preserve cancellation reasons and expose cancellation request context.
- Refreshed the README and API, adapter, registration, queueing, workflow, authorization, querying, views, durability, and sample-host documentation to match the current runtime surfaces. Removed temporary documentation and test-audit working files after their findings were incorporated.
## Fixed
- Workflow-run and operator views now distinguish canceled fan-out children according to the configured policy instead of reporting every canceled `DispatchEach` child as blocked or canceled in the same way.
- Workflow cancellation now verifies that a canceled worker is recorded as a child of the referenced `DispatchEach` step before applying `CancelWorkflow`, including during durable recovery.
- Chained `DispatchEach` output expansion now honors the source fan-out's cancellation policy, so `Continue` skips canceled source children instead of blocking the downstream fan-out.
- Chained `DispatchEach` output expansion now treats a successfully completed empty source fan-out as an empty expansion instead of failing it as unavailable, in both durable and non-durable workflows.
- Fan-out and join execution now cancel remaining child waiters after an early blocked, canceled, or failed outcome, preventing abandoned durable polling loops.
- `CancelWorkflow` now cancels outstanding children before marking and persisting a durable workflow as canceled, so recovery cannot mistake a partially canceled run for a fully settled final run after an interruption.
- Durable joins and trailing waits now coalesce child-retention checks into bounded batched lookups instead of polling persistence once per child every 100 milliseconds. Child completions flow through a single-pass queue, and cancellation-policy resolution uses indexed child membership, avoiding quadratic task and fan-out scans as children settle.
- Durable workflow persistence is now ordered per run, with receipt writes coalesced and join progress checkpointed at exponentially decreasing thresholds. This prevents stale concurrent snapshots from erasing child receipts or final state while avoiding one full-run write per child on large fan-outs.
- Workflow cancellation is now idempotent and outcome-aware: cancellation conflicts are retried, rejected child actions keep the workflow non-final with structured errors, queued fan-outs cannot recursively re-enter cancellation, and final workflow state cannot regress during a concurrent execution handoff.
- Non-durable workflow cancellation now defers its final `Canceled` transition until outstanding child cancellation requests succeed, so a rejected sibling cancellation leaves both manual and `CancelWorkflow` policy executions blocked and recoverable.
- Chained `DispatchEach` source children are observed in completion order while their outputs retain source order, allowing a later canceled or failed child to stop the workflow without waiting behind an earlier child that never settles.
- Durable existence fallback checks now use bounded concurrency, and provider-originated cancellation completes the active lookup batch instead of leaving workflow waiters unresolved.
- Workable now replaces caller-supplied reserved workflow identifiers (`workflow-run`, `workflow-definition`, and `workflow-step`) when dispatching children, preventing conflicting metadata from breaking lifecycle validation.
- Final workers are scheduled for retention before workflow observers run, and durable child receipts are persisted independently of the child's canceled execution token, preventing slow finalization observers from leaving canceled workers untracked.
- A failed durable child-receipt write now keeps the final worker protected and is retried through retention finalization before worker cleanup, so transient persistence failures cannot remove the workflow's only recoverable child state.
- Workflow-child lifecycle events, retention decisions, completion receipts, and blocked-run auto-resume now require the claimed worker to belong to the claimed workflow step, preventing forged workflow identifiers from mutating or retaining a run.
- Explicit worker cancellation now publishes its request context before canceling executing code, so cleanup and audit logic can reliably observe the accepted cancellation caller and reason.
- Per-run persistence ordering now covers transactional commit as well as the transactional upsert call, preventing a delayed provider commit from overwriting a later workflow snapshot.
- Durable final completions now persist before publishing terminal state or settling their public workflow handles; a failed final write leaves query-visible state non-final and faults both the handle and registered execution instead of acknowledging a completion that recovery has not recorded.
- Durable workflow writes now apply their matching in-memory transition while the per-run persistence gate is still held, preventing a child receipt that arrives during final settlement, resume, or control-intent persistence from restoring an older run state.
- Durable blocked-run auto-resume now applies its in-memory `Running` transition before releasing the per-run persistence gate, preventing a queued child receipt from restoring the previously persisted `Blocked` state.
- Blocked-run auto-resume now evaluates final children after their receipts are recorded, rechecks after an earlier blocked execution finishes settling, and treats a canceled `DispatchEach` child as settled only for `Continue`. This covers both restart-then-cancel and cancel-then-restart ordering without resuming `Block` or `CancelWorkflow` runs.
- Transient durable auto-resume failures now enter one coalesced retry loop per blocked run with capped exponential backoff. Retries remain active through temporary execution or cancellation gates—including an unsuccessful competing cancellation—and concurrent requests are handed off when an existing retry retires, allowing a later persistence attempt to resume the workflow exactly once while shutdown cancels and drains pending retries.
- Accepted workflow cancellations now propagate the sanitized operator identity and reason to outstanding child cancellations. Durable pending cancellations persist that context and restore it during recovery instead of attributing child cancellation to the workflow starter.
- Accepted workflow cancellation is now a monotonic control intent: a later pause request cannot overwrite a pending durable cancellation, and a repeated cancel cannot replace the first accepted operator context while the active execution and its children are still settling.
- Workflow execution bookkeeping is registered before background execution can finish, per-run action gates are released when their callers leave, and execution settlement shares the action gate so a stale blocked completion cannot follow a concurrent final cancellation.
- Retention finalization guards no longer reschedule themselves during count-based cleanup; workers are re-registered once finalization exits without creating a tight retention loop while persistence or workflow observers are slow.
- Retention retries and workflow-protected children are now deferred until their next purge interval without remaining eligible for immediate count-based selection, preventing tight retry loops when a system is over its final-worker cap.
- Deferred retention schedules now supersede earlier queued purge deadlines for the same worker, preserving the full retry or protection interval before cleanup.
- Final durable-workflow cleanup now resolves absent child persistence in one batched lookup instead of issuing a growing number of scalar existence queries as large fan-outs are purged.
- Expanded regression coverage across authorization, dynamic registration, HTTP and MCP adapters, querying, durable queues, realtime broadcasting, view contracts, retention, worker edge cases, workflow execution, and durable workflow recovery, raising core line coverage above 95 percent.
- Added contract and end-to-end tests for typed `DispatchEach` child-output references and fluent-builder behavior, with 100 percent changed-line coverage for the new staged builder implementation.