@lostgradient/weft 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -24
- package/dist/cli/conformance.js +7 -1
- package/dist/cli/generated/operation-client.generated.d.ts +28 -13
- package/dist/cli/generated/operation-client.generated.js +1 -0
- package/dist/cli/help-text.d.ts +1 -1
- package/dist/cli/help-text.js +1 -0
- package/dist/cli/operation-catalog-snapshot.d.ts +8 -0
- package/dist/cli/operation-catalog-snapshot.js +11 -0
- package/dist/cli/parse-schedule-arguments.js +3 -1
- package/dist/cli/schedule.js +2 -1
- package/dist/cli/types.d.ts +1 -0
- package/dist/cli-main.js +79 -78
- package/dist/client/handle-delegation.d.ts +3 -2
- package/dist/client/handle-delegation.js +3 -1
- package/dist/client/http-client-requests.d.ts +2 -1
- package/dist/client/http-client-requests.js +7 -0
- package/dist/client/http-client.d.ts +9 -6
- package/dist/client/http-client.js +10 -1
- package/dist/client/http-request.d.ts +11 -1
- package/dist/client/http-request.js +17 -7
- package/dist/client/index.d.ts +1 -1
- package/dist/client/interface.d.ts +46 -5
- package/dist/client/local.d.ts +4 -1
- package/dist/client/local.js +12 -4
- package/dist/client/start-body.d.ts +4 -3
- package/dist/core/byte-arrays.d.ts +5 -0
- package/dist/core/byte-arrays.js +5 -0
- package/dist/core/checkpoint/lifecycle.d.ts +3 -0
- package/dist/core/checkpoint/lifecycle.js +9 -4
- package/dist/core/checkpoint/serialization.js +12 -5
- package/dist/core/codec/extension-codec.d.ts +16 -0
- package/dist/core/codec/extension-codec.js +100 -6
- package/dist/core/context/activity-retry-state.d.ts +38 -0
- package/dist/core/context/activity-retry-state.js +89 -0
- package/dist/core/context/activity-schedule-to-close.d.ts +159 -0
- package/dist/core/context/activity-schedule-to-close.js +69 -0
- package/dist/core/context/child-workflow-pipe.d.ts +5 -5
- package/dist/core/context/child-workflow-pipe.js +15 -2
- package/dist/core/context/context-presence.d.ts +19 -0
- package/dist/core/context/context-presence.js +13 -0
- package/dist/core/context/durable-operations.d.ts +25 -0
- package/dist/core/context/durable-operations.js +64 -0
- package/dist/core/context/index.d.ts +9 -5
- package/dist/core/context/index.js +17 -12
- package/dist/core/context/internals.d.ts +20 -0
- package/dist/core/context/internals.js +3 -1
- package/dist/core/context/operation-request.d.ts +35 -0
- package/dist/core/context/parallel-cache-entry.d.ts +14 -5
- package/dist/core/context/run-operation.d.ts +6 -1
- package/dist/core/context/run-operation.js +41 -87
- package/dist/core/context/session-state.js +7 -8
- package/dist/core/context/speculative-child.js +2 -0
- package/dist/core/context/types.d.ts +15 -0
- package/dist/core/context/version-patching.d.ts +8 -0
- package/dist/core/context/version-patching.js +40 -0
- package/dist/core/context/workflow-logger.d.ts +98 -0
- package/dist/core/context/workflow-logger.js +68 -0
- package/dist/core/engine/activity-heartbeat-tracking.d.ts +64 -0
- package/dist/core/engine/activity-heartbeat-tracking.js +42 -0
- package/dist/core/engine/activity-per-attempt-timeout.d.ts +41 -0
- package/dist/core/engine/activity-per-attempt-timeout.js +36 -0
- package/dist/core/engine/activity-reconciliation.d.ts +1 -0
- package/dist/core/engine/activity-reconciliation.js +12 -1
- package/dist/core/engine/activity-resolution.d.ts +23 -0
- package/dist/core/engine/activity-resolution.js +37 -0
- package/dist/core/engine/aggregate.js +66 -30
- package/dist/core/engine/async-activity-completion.d.ts +23 -6
- package/dist/core/engine/async-activity-completion.js +53 -12
- package/dist/core/engine/attributes-tags.js +9 -4
- package/dist/core/engine/bulk-operations-purge.d.ts +26 -0
- package/dist/core/engine/bulk-operations-purge.js +38 -3
- package/dist/core/engine/bulk-operations-shared.d.ts +2 -0
- package/dist/core/engine/bulk-operations-shared.js +8 -2
- package/dist/core/engine/bulk-operations.d.ts +4 -1
- package/dist/core/engine/bulk-operations.js +235 -24
- package/dist/core/engine/callback-creators-bundles.d.ts +9 -0
- package/dist/core/engine/callback-creators-bundles.js +30 -2
- package/dist/core/engine/callback-creators-core.js +6 -4
- package/dist/core/engine/callback-creators-router.js +10 -0
- package/dist/core/engine/callback-creators-schedule.d.ts +2 -2
- package/dist/core/engine/callback-creators-schedule.js +12 -8
- package/dist/core/engine/candidate-read-batching.d.ts +6 -0
- package/dist/core/engine/candidate-read-batching.js +1 -0
- package/dist/core/engine/checkpoint-io.js +61 -25
- package/dist/core/engine/checkpoint-reads.js +3 -2
- package/dist/core/engine/checkpoint-replay.d.ts +20 -0
- package/dist/core/engine/checkpoint-replay.js +242 -0
- package/dist/core/engine/checkpoint-side-effects.d.ts +23 -0
- package/dist/core/engine/checkpoint-side-effects.js +35 -0
- package/dist/core/engine/child-workflow-cancellation.d.ts +10 -0
- package/dist/core/engine/child-workflow-cancellation.js +40 -0
- package/dist/core/engine/child-workflow.js +27 -4
- package/dist/core/engine/condition-waiters.d.ts +14 -0
- package/dist/core/engine/condition-waiters.js +5 -0
- package/dist/core/engine/construction.d.ts +3 -0
- package/dist/core/engine/construction.js +21 -8
- package/dist/core/engine/coordination-branch-executors.d.ts +70 -0
- package/dist/core/engine/coordination-branch-executors.js +107 -0
- package/dist/core/engine/deferred-consume-envelope.d.ts +59 -0
- package/dist/core/engine/deferred-consume-envelope.js +14 -0
- package/dist/core/engine/disposal.js +13 -0
- package/dist/core/engine/engine-create-types.d.ts +14 -4
- package/dist/core/engine/engine-internal-types.d.ts +26 -3
- package/dist/core/engine/errors.d.ts +47 -0
- package/dist/core/engine/errors.js +20 -0
- package/dist/core/engine/event-log-compaction.d.ts +8 -0
- package/dist/core/engine/event-log-compaction.js +20 -2
- package/dist/core/engine/fenced-write.d.ts +65 -0
- package/dist/core/engine/fenced-write.js +71 -0
- package/dist/core/engine/finalizer-state.d.ts +28 -0
- package/dist/core/engine/finalizer-state.js +16 -0
- package/dist/core/engine/handles.d.ts +8 -0
- package/dist/core/engine/index.d.ts +34 -16
- package/dist/core/engine/index.js +133 -8
- package/dist/core/engine/inline-parking.js +3 -2
- package/dist/core/engine/internals.d.ts +107 -3
- package/dist/core/engine/lease-codec.d.ts +35 -0
- package/dist/core/engine/lease-codec.js +32 -0
- package/dist/core/engine/lease-deposition.d.ts +66 -0
- package/dist/core/engine/lease-deposition.js +10 -0
- package/dist/core/engine/lease-errors.d.ts +99 -0
- package/dist/core/engine/lease-errors.js +30 -0
- package/dist/core/engine/lease-manager.d.ts +114 -0
- package/dist/core/engine/lease-manager.js +135 -0
- package/dist/core/engine/lifecycle/persist.js +10 -32
- package/dist/core/engine/lifecycle/recovered-services.d.ts +8 -6
- package/dist/core/engine/lifecycle/recovered-services.js +18 -3
- package/dist/core/engine/lifecycle/resume.js +16 -9
- package/dist/core/engine/lifecycle/shared.d.ts +8 -1
- package/dist/core/engine/lifecycle/start-batch.d.ts +1 -1
- package/dist/core/engine/lifecycle/start-batch.js +2 -1
- package/dist/core/engine/lifecycle/start-commit.d.ts +9 -0
- package/dist/core/engine/lifecycle/start-commit.js +50 -8
- package/dist/core/engine/lifecycle/start-or-signal-create.d.ts +58 -0
- package/dist/core/engine/lifecycle/start-or-signal-create.js +95 -0
- package/dist/core/engine/lifecycle/start-or-signal.d.ts +3 -2
- package/dist/core/engine/lifecycle/start-or-signal.js +11 -81
- package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +39 -0
- package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +28 -0
- package/dist/core/engine/lifecycle/start.d.ts +4 -4
- package/dist/core/engine/lifecycle/start.js +17 -9
- package/dist/core/engine/lifecycle/transition.js +17 -5
- package/dist/core/engine/lifecycle.d.ts +1 -1
- package/dist/core/engine/list-candidate-resolution.js +2 -2
- package/dist/core/engine/listing.js +9 -5
- package/dist/core/engine/operations-activity.d.ts +4 -11
- package/dist/core/engine/operations-activity.js +22 -49
- package/dist/core/engine/operations-coordination.d.ts +10 -0
- package/dist/core/engine/operations-coordination.js +43 -8
- package/dist/core/engine/operations-router.d.ts +6 -0
- package/dist/core/engine/operations-router.js +2 -0
- package/dist/core/engine/operations-speculate.js +6 -2
- package/dist/core/engine/operations-stream.js +12 -2
- package/dist/core/engine/operations-time.d.ts +4 -2
- package/dist/core/engine/operations-time.js +14 -2
- package/dist/core/engine/operations-wait-condition.d.ts +23 -0
- package/dist/core/engine/operations-wait-condition.js +62 -0
- package/dist/core/engine/ownership-options.d.ts +23 -0
- package/dist/core/engine/ownership-options.js +26 -0
- package/dist/core/engine/payload-size-policy.d.ts +3 -0
- package/dist/core/engine/payload-size-policy.js +4 -0
- package/dist/core/engine/pending-updates.d.ts +17 -0
- package/dist/core/engine/pending-updates.js +33 -11
- package/dist/core/engine/queries.js +1 -1
- package/dist/core/engine/registration.d.ts +1 -0
- package/dist/core/engine/registration.js +18 -3
- package/dist/core/engine/schedule-jitter.d.ts +5 -0
- package/dist/core/engine/schedule-jitter.js +10 -0
- package/dist/core/engine/schedule-run.d.ts +17 -0
- package/dist/core/engine/schedule-run.js +38 -0
- package/dist/core/engine/schedule-timer.js +81 -17
- package/dist/core/engine/schedules.d.ts +7 -4
- package/dist/core/engine/schedules.js +37 -16
- package/dist/core/engine/search-attribute-records.d.ts +4 -0
- package/dist/core/engine/search-attribute-records.js +17 -0
- package/dist/core/engine/signals.d.ts +18 -2
- package/dist/core/engine/signals.js +42 -21
- package/dist/core/engine/state-utilities.d.ts +49 -2
- package/dist/core/engine/state-utilities.js +114 -3
- package/dist/core/engine/storage-io.d.ts +16 -2
- package/dist/core/engine/storage-io.js +26 -5
- package/dist/core/engine/stream-chunk-loading.d.ts +2 -0
- package/dist/core/engine/stream-chunk-loading.js +24 -1
- package/dist/core/engine/sub-operation.js +22 -3
- package/dist/core/engine/termination/cleanup.d.ts +3 -1
- package/dist/core/engine/termination/cleanup.js +25 -1
- package/dist/core/engine/termination/complete.js +44 -6
- package/dist/core/engine/termination/finalizer-activity.d.ts +53 -0
- package/dist/core/engine/termination/finalizer-activity.js +30 -0
- package/dist/core/engine/termination/finalizer-claim.d.ts +110 -0
- package/dist/core/engine/termination/finalizer-claim.js +80 -0
- package/dist/core/engine/termination/finalizer.d.ts +48 -0
- package/dist/core/engine/termination/finalizer.js +159 -0
- package/dist/core/engine/termination/suspend.d.ts +3 -1
- package/dist/core/engine/termination.d.ts +1 -0
- package/dist/core/engine/termination.js +4 -0
- package/dist/core/engine/updates.js +5 -25
- package/dist/core/engine/validation/schedule.d.ts +2 -1
- package/dist/core/engine/validation/schedule.js +51 -2
- package/dist/core/engine/validation.js +32 -5
- package/dist/core/engine/waiting-update-response.d.ts +8 -0
- package/dist/core/engine/waiting-update-response.js +22 -0
- package/dist/core/engine/workflow-concurrency.d.ts +10 -0
- package/dist/core/engine/workflow-concurrency.js +136 -0
- package/dist/core/engine/workflow-feed.d.ts +4 -5
- package/dist/core/engine/workflow-feed.js +4 -1
- package/dist/core/engine/workflow-indexes.d.ts +9 -0
- package/dist/core/engine/workflow-indexes.js +10 -0
- package/dist/core/engine/workflow-state-stream.js +33 -13
- package/dist/core/engine/workflow-visibility-queries.d.ts +2 -2
- package/dist/core/engine-helpers.js +1 -0
- package/dist/core/events/activity-events.d.ts +43 -12
- package/dist/core/events/activity-events.js +28 -0
- package/dist/core/events/attribute-events.d.ts +2 -3
- package/dist/core/events/event-map.d.ts +18 -12
- package/dist/core/events/index.d.ts +1 -0
- package/dist/core/events/index.js +1 -0
- package/dist/core/events/schedule-events.d.ts +71 -0
- package/dist/core/events/schedule-events.js +29 -0
- package/dist/core/events/signal-events.d.ts +4 -6
- package/dist/core/events/system-events.d.ts +29 -19
- package/dist/core/events/system-events.js +26 -0
- package/dist/core/events/update-events.d.ts +6 -8
- package/dist/core/events/workflow-events.d.ts +88 -23
- package/dist/core/events/workflow-events.js +26 -0
- package/dist/core/failure-categories.js +5 -17
- package/dist/core/fault-code.d.ts +9 -3
- package/dist/core/fault-code.js +1 -0
- package/dist/core/inline-execution-strategy.context-options.d.ts +69 -0
- package/dist/core/inline-execution-strategy.context-options.js +56 -0
- package/dist/core/inline-execution-strategy.d.ts +31 -36
- package/dist/core/inline-execution-strategy.js +16 -27
- package/dist/core/list-filter-validation.d.ts +1 -1
- package/dist/core/payload-size.d.ts +1 -1
- package/dist/core/persisted-data-incompatible-error.d.ts +9 -7
- package/dist/core/review/events.d.ts +6 -8
- package/dist/core/scheduler/scheduler-class.d.ts +10 -1
- package/dist/core/scheduler/scheduler-class.js +38 -11
- package/dist/core/scheduler/timer-batch.js +9 -1
- package/dist/core/scheduler/timer-sources.d.ts +1 -0
- package/dist/core/scheduler/timer-sources.js +11 -5
- package/dist/core/session-state.d.ts +0 -1
- package/dist/core/session-state.js +2 -2
- package/dist/core/start-workflow-validation.d.ts +34 -0
- package/dist/core/start-workflow-validation.js +19 -0
- package/dist/core/types/activity-verification.d.ts +67 -0
- package/dist/core/types/activity-verification.js +0 -0
- package/dist/core/types/activity.d.ts +80 -61
- package/dist/core/types/bulk.d.ts +50 -9
- package/dist/core/types/checkpoint.d.ts +44 -8
- package/dist/core/types/list-options.d.ts +146 -0
- package/dist/core/types/list-options.js +0 -0
- package/dist/core/types/options.d.ts +121 -165
- package/dist/core/types/schedules.d.ts +39 -3
- package/dist/core/types/services-resolution.d.ts +2 -2
- package/dist/core/types/workflow-builder-runtime.d.ts +12 -3
- package/dist/core/types/workflow-builder-runtime.js +11 -2
- package/dist/core/types/workflow-builder.d.ts +42 -11
- package/dist/core/types/workflow-concurrency.d.ts +39 -0
- package/dist/core/types/workflow-concurrency.js +0 -0
- package/dist/core/types/workflow-context.d.ts +157 -14
- package/dist/core/types/workflow-definition.d.ts +53 -10
- package/dist/core/types/workflow-function.d.ts +84 -9
- package/dist/core/types/workflow-log.d.ts +98 -0
- package/dist/core/types/workflow-log.js +0 -0
- package/dist/core/types/workflow-registries.d.ts +14 -3
- package/dist/core/types/workflow-registry.d.ts +3 -0
- package/dist/core/types.d.ts +4 -0
- package/dist/core/types.js +4 -0
- package/dist/core/versioning.d.ts +9 -39
- package/dist/core/versioning.js +2 -12
- package/dist/core/weft-error.d.ts +44 -1
- package/dist/core/weft-error.js +16 -0
- package/dist/core/worker-execution-strategy-options.d.ts +26 -0
- package/dist/core/worker-execution-strategy.js +40 -36
- package/dist/core/worker-inbound-message.d.ts +38 -0
- package/dist/core/worker-inbound-message.js +37 -0
- package/dist/core/worker-log-abuse-counter.d.ts +175 -0
- package/dist/core/worker-log-abuse-counter.js +107 -0
- package/dist/core/worker-message-helpers.d.ts +47 -0
- package/dist/core/worker-message-helpers.js +26 -0
- package/dist/core/worker-protocol-guard.js +1 -1
- package/dist/core/worker-protocol-log.d.ts +56 -0
- package/dist/core/worker-protocol-log.js +18 -0
- package/dist/core/worker-protocol.d.ts +23 -0
- package/dist/core/worker-protocol.js +12 -2
- package/dist/core/workflow-version-tuple.d.ts +3 -9
- package/dist/core/workflow-version-tuple.js +2 -3
- package/dist/diagnostics/format.js +1 -6
- package/dist/diagnostics/types.d.ts +4 -5
- package/dist/diagnostics/validate.d.ts +0 -1
- package/dist/diagnostics/version-check.d.ts +1 -1
- package/dist/diagnostics/version-check.js +4 -9
- package/dist/index.d.ts +12 -10
- package/dist/index.js +29 -3
- package/dist/json-schema.js +3 -3
- package/dist/mcp/cli.js +27 -27
- package/dist/mcp/dispatcher.js +1 -1
- package/dist/mcp/http.js +16 -6
- package/dist/mcp/protocol.d.ts +2 -0
- package/dist/mcp/protocol.js +1 -1
- package/dist/mcp/session.d.ts +16 -0
- package/dist/mcp/session.js +59 -6
- package/dist/mcp/tools.js +73 -6
- package/dist/observability/index.js +2 -2
- package/dist/server/asyncapi-channels.js +5 -2
- package/dist/server/attribute-filters.d.ts +8 -3
- package/dist/server/attribute-filters.js +6 -1
- package/dist/server/authentication/api-key.d.ts +2 -1
- package/dist/server/authentication/api-key.js +5 -2
- package/dist/server/authentication/constant-time-api-key.d.ts +15 -0
- package/dist/server/authentication/constant-time-api-key.js +24 -0
- package/dist/server/authentication/index.d.ts +1 -1
- package/dist/server/authentication/index.js +7 -4
- package/dist/server/authentication/rotating-api-key-store.d.ts +5 -3
- package/dist/server/authentication/rotating-api-key-store.js +19 -11
- package/dist/server/engine-event-feed-backend.d.ts +4 -5
- package/dist/server/fault-to-http.js +8 -1
- package/dist/server/fault-to-json-rpc.js +1 -0
- package/dist/server/fleet-event-feed.d.ts +31 -0
- package/dist/server/fleet-event-feed.js +157 -0
- package/dist/server/handler/index.js +1 -1
- package/dist/server/handler/response-helpers.js +2 -1
- package/dist/server/handler/route-dispatch.d.ts +6 -3
- package/dist/server/handler/route-dispatch.js +2 -2
- package/dist/server/handler.js +23 -23
- package/dist/server/index.d.ts +32 -2
- package/dist/server/index.js +26 -26
- package/dist/server/json-rpc-transport-helpers.d.ts +1 -0
- package/dist/server/json-rpc-transport-helpers.js +2 -1
- package/dist/server/json-rpc-websocket-runtime.d.ts +11 -2
- package/dist/server/json-rpc-websocket-runtime.js +1 -0
- package/dist/server/json-rpc-websocket-subscriptions.d.ts +10 -0
- package/dist/server/json-rpc-websocket-subscriptions.js +29 -0
- package/dist/server/json-rpc-websocket-types.d.ts +22 -0
- package/dist/server/json-rpc-websocket-types.js +0 -0
- package/dist/server/json-rpc-websocket-validation.js +20 -4
- package/dist/server/json-rpc-websocket.d.ts +2 -43
- package/dist/server/json-rpc-websocket.js +57 -74
- package/dist/server/openapi.d.ts +2 -1
- package/dist/server/openapi.js +1 -3
- package/dist/server/openrpc-document-schema.d.ts +78 -0
- package/dist/server/openrpc-document-schema.js +27 -1
- package/dist/server/openrpc-errors.d.ts +3 -0
- package/dist/server/openrpc-errors.js +2 -1
- package/dist/server/openrpc.js +32 -0
- package/dist/server/operation-catalog/index.d.ts +1 -1
- package/dist/server/operation-catalog/pipeline-helpers.js +1 -0
- package/dist/server/operation-catalog/pipeline-stages.js +26 -12
- package/dist/server/operation-catalog/pipeline.js +8 -1
- package/dist/server/operation-catalog/registry.js +13 -0
- package/dist/server/operation-catalog/types.d.ts +20 -9
- package/dist/server/operation-fault.d.ts +10 -0
- package/dist/server/operation-fault.js +2 -0
- package/dist/server/operation-registry.d.ts +12 -11
- package/dist/server/operation-registry.js +12 -3
- package/dist/server/operations/aggregate-workflows.d.ts +15 -15
- package/dist/server/operations/async-activity.d.ts +2 -2
- package/dist/server/operations/async-activity.js +12 -7
- package/dist/server/operations/bulk-cancel-workflows.d.ts +1 -1
- package/dist/server/operations/bulk-cancel-workflows.js +2 -2
- package/dist/server/operations/bulk-delete-workflows.d.ts +1 -1
- package/dist/server/operations/bulk-delete-workflows.js +2 -2
- package/dist/server/operations/bulk-filter-helpers.d.ts +8 -6
- package/dist/server/operations/bulk-filter-helpers.js +54 -24
- package/dist/server/operations/bulk-mutate-workflow-tags.d.ts +11 -9
- package/dist/server/operations/bulk-mutate-workflow-tags.js +2 -2
- package/dist/server/operations/bulk-operation-helpers.d.ts +2 -2
- package/dist/server/operations/bulk-retry-failed-workflows.d.ts +7 -0
- package/dist/server/operations/bulk-retry-failed-workflows.js +64 -0
- package/dist/server/operations/bulk-signal-workflows.d.ts +11 -9
- package/dist/server/operations/bulk-signal-workflows.js +2 -2
- package/dist/server/operations/cancel-schedule.d.ts +1 -1
- package/dist/server/operations/create-schedule.d.ts +3 -1
- package/dist/server/operations/create-schedule.js +29 -11
- package/dist/server/operations/fleet-events-subscription.d.ts +54 -0
- package/dist/server/operations/fleet-events-subscription.js +99 -0
- package/dist/server/operations/fork-workflow.d.ts +1 -1
- package/dist/server/operations/fork-workflow.js +3 -2
- package/dist/server/operations/get-checkpoint-at.d.ts +1 -1
- package/dist/server/operations/get-registry.d.ts +1 -1
- package/dist/server/operations/get-retention-overview.d.ts +1 -1
- package/dist/server/operations/get-review.d.ts +1 -1
- package/dist/server/operations/get-schedule.d.ts +1 -1
- package/dist/server/operations/get-stream-chunks.d.ts +1 -1
- package/dist/server/operations/get-system-metrics.d.ts +2 -2
- package/dist/server/operations/get-task-diagnostics.d.ts +45 -6
- package/dist/server/operations/get-task-diagnostics.js +101 -7
- package/dist/server/operations/get-update-result.d.ts +1 -1
- package/dist/server/operations/get-workflow-attributes.d.ts +1 -1
- package/dist/server/operations/get-workflow-events.d.ts +1 -1
- package/dist/server/operations/get-workflow-result.d.ts +1 -1
- package/dist/server/operations/get-workflow-timeline.d.ts +1 -1
- package/dist/server/operations/get-workflow.d.ts +1 -1
- package/dist/server/operations/list-checkpoints.d.ts +1 -1
- package/dist/server/operations/list-reviews.d.ts +1 -1
- package/dist/server/operations/list-schedules.d.ts +1 -1
- package/dist/server/operations/list-task-queues.d.ts +2 -2
- package/dist/server/operations/list-workers.d.ts +2 -2
- package/dist/server/operations/list-workflows.d.ts +1 -1
- package/dist/server/operations/operation-helpers.d.ts +16 -1
- package/dist/server/operations/operation-helpers.js +15 -3
- package/dist/server/operations/pause-schedule.d.ts +1 -1
- package/dist/server/operations/purge-workflows.d.ts +5 -5
- package/dist/server/operations/purge-workflows.js +2 -2
- package/dist/server/operations/query-workflow.d.ts +1 -1
- package/dist/server/operations/query-workflow.js +3 -2
- package/dist/server/operations/recover-all.d.ts +1 -1
- package/dist/server/operations/replay-workflow.d.ts +1 -1
- package/dist/server/operations/resume-schedule.d.ts +1 -1
- package/dist/server/operations/set-workflow-attributes.d.ts +1 -1
- package/dist/server/operations/set-workflow-attributes.js +6 -3
- package/dist/server/operations/signal-workflow.js +8 -3
- package/dist/server/operations/single-workflow-tag-mutation.js +13 -3
- package/dist/server/operations/start-or-signal-workflow.d.ts +6 -1
- package/dist/server/operations/start-or-signal-workflow.js +14 -24
- package/dist/server/operations/start-workflow-options.d.ts +6 -0
- package/dist/server/operations/start-workflow-rest-input.d.ts +14 -0
- package/dist/server/operations/start-workflow-rest-input.js +31 -0
- package/dist/server/operations/start-workflow.d.ts +1 -1
- package/dist/server/operations/start-workflow.js +8 -23
- package/dist/server/operations/storage.d.ts +6 -6
- package/dist/server/operations/storage.js +24 -14
- package/dist/server/operations/stream-workflow-sse.d.ts +1 -1
- package/dist/server/operations/submit-review-decision.d.ts +1 -1
- package/dist/server/operations/submit-review-decision.js +6 -3
- package/dist/server/operations/update-schedule.d.ts +1 -1
- package/dist/server/operations/update-schedule.js +7 -4
- package/dist/server/operations/update-workflow.d.ts +1 -1
- package/dist/server/operations/update-workflow.js +7 -3
- package/dist/server/operations/worker-drain.d.ts +8 -8
- package/dist/server/operations/worker-drain.js +11 -8
- package/dist/server/operations/workflow-events-subscription.d.ts +7 -8
- package/dist/server/operations/workflow-events-subscription.js +43 -8
- package/dist/server/rest-binding.d.ts +3 -1
- package/dist/server/rest-bindings.js +12 -0
- package/dist/server/rest-body.d.ts +10 -0
- package/dist/server/rest-body.js +80 -0
- package/dist/server/runtime/authentication-bridge.d.ts +1 -0
- package/dist/server/runtime/authentication-bridge.js +33 -6
- package/dist/server/runtime/client-visible-events.d.ts +3 -0
- package/dist/server/runtime/client-visible-events.js +65 -0
- package/dist/server/runtime/context.d.ts +7 -0
- package/dist/server/runtime/event-broadcasting.d.ts +6 -0
- package/dist/server/runtime/event-broadcasting.js +72 -38
- package/dist/server/runtime/retry.d.ts +1 -0
- package/dist/server/runtime/retry.js +14 -0
- package/dist/server/runtime/shutdown.d.ts +7 -6
- package/dist/server/runtime/shutdown.js +6 -1
- package/dist/server/runtime/task-polling.js +61 -20
- package/dist/server/runtime/task-reconciliation.js +9 -1
- package/dist/server/runtime/task-result-resolution.d.ts +15 -0
- package/dist/server/runtime/task-result-resolution.js +81 -0
- package/dist/server/runtime/websocket-stream.d.ts +20 -1
- package/dist/server/runtime/websocket-stream.js +173 -7
- package/dist/server/runtime/websocket-upgrade.js +22 -3
- package/dist/server/runtime/websocket-worker.d.ts +1 -1
- package/dist/server/runtime/websocket-worker.js +38 -30
- package/dist/server/serve-internals.d.ts +3 -1
- package/dist/server/serve-internals.js +18 -2
- package/dist/server/task-state.d.ts +30 -0
- package/dist/server/task-state.js +28 -0
- package/dist/server/workflow-event-feed.d.ts +36 -115
- package/dist/server/workflow-event-feed.js +92 -27
- package/dist/service-worker/index.js +30 -30
- package/dist/storage/auto.js +1 -1
- package/dist/storage/bun-sql.js +24 -0
- package/dist/storage/compressed-storage.js +1 -1
- package/dist/storage/default-scope.d.ts +7 -4
- package/dist/storage/http.js +2 -2
- package/dist/storage/index.d.ts +76 -4
- package/dist/storage/indexeddb.js +1 -1
- package/dist/storage/interface.d.ts +163 -0
- package/dist/storage/interface.js +1 -1
- package/dist/storage/key-prefixes.d.ts +1 -1
- package/dist/storage/key-prefixes.js +10 -0
- package/dist/storage/lmdb.d.ts +4 -3
- package/dist/storage/lmdb.js +1 -1
- package/dist/storage/memory.js +1 -1
- package/dist/storage/neon-batch.d.ts +30 -0
- package/dist/storage/neon-batch.js +30 -0
- package/dist/storage/neon-value-mapping.d.ts +30 -3
- package/dist/storage/neon-value-mapping.js +12 -0
- package/dist/storage/neon.d.ts +16 -0
- package/dist/storage/neon.js +9 -4
- package/dist/storage/node-sqlite.js +23 -0
- package/dist/storage/postgres-key-value-queries.d.ts +69 -44
- package/dist/storage/postgres-key-value-queries.js +62 -24
- package/dist/storage/resolve.js +1 -1
- package/dist/storage/scoped-storage.js +1 -1
- package/dist/storage/testing.d.ts +168 -0
- package/dist/storage/testing.js +2 -0
- package/dist/storage/turso.d.ts +8 -0
- package/dist/storage/turso.js +2 -2
- package/dist/storage/typed-storage.js +1 -1
- package/dist/storage/web-extension.js +1 -1
- package/dist/testing/index.js +28 -28
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker/protocol.js +1 -1
- package/dist/workers/worker-replay-state.d.ts +32 -0
- package/dist/workers/worker-replay-state.js +35 -0
- package/dist/workers/worker-state-namespace.d.ts +21 -0
- package/dist/workers/worker-state-namespace.js +13 -0
- package/dist/workers/workflow-runner.d.ts +19 -15
- package/dist/workers/workflow-runner.js +72 -60
- package/dist/workers/workflow-worker-entry.js +5 -2
- package/package.json +5 -1
|
@@ -3,6 +3,7 @@ import type { Storage as WeftStorage } from '../../storage/interface.ts';
|
|
|
3
3
|
import { ActivityWorkerDispatcher } from '../../workers/activity-worker-dispatcher.ts';
|
|
4
4
|
import type { ComposedWorkflowInterceptor, Interceptor } from '../interceptor.ts';
|
|
5
5
|
import { type AnyActivityDefinition, type AnyWorkflowDefinition, type EngineOptions, type RegisteredWorkflowDefinition } from '../types.ts';
|
|
6
|
+
import type { WorkflowLogRecord } from '../types/workflow-log.ts';
|
|
6
7
|
import type { EngineConstructorOptions, ExecutionStrategyBundle, RegistrationEntry, ResolvedOptions } from './engine-internal-types.ts';
|
|
7
8
|
export type KnownWorkflowNames<TWorkflows extends object> = Extract<keyof TWorkflows, string>;
|
|
8
9
|
declare const emptyWorkflowDefinitions: unique symbol;
|
|
@@ -53,7 +54,9 @@ export declare function createExecutionStrategyBundle(parameters: {
|
|
|
53
54
|
getComposedWorkflowInterceptor?: () => ComposedWorkflowInterceptor | null;
|
|
54
55
|
resolveWorkflowType: (target: string | Function) => string;
|
|
55
56
|
registerCancelHandler?: (workflowId: string, handler: () => Promise<void> | void) => () => void;
|
|
57
|
+
recordFinalizerState?: (workflowId: string, value: unknown) => void;
|
|
56
58
|
getWorkflowServices?: (workflowId: string) => unknown;
|
|
59
|
+
getLogSink?: () => ((record: WorkflowLogRecord) => void) | undefined;
|
|
57
60
|
}): ExecutionStrategyBundle;
|
|
58
61
|
export declare function createActivityWorkerDispatcher(activityExecution: EngineConstructorOptions['activityExecution']): ActivityWorkerDispatcher | null;
|
|
59
62
|
export declare function createAlertManagerForEngine(engine: EventTarget, alerts: EngineOptions['alerts'] | undefined, getNow: () => number): AlertManager | null;
|
|
@@ -3,6 +3,7 @@ import { CompressedStorage } from "../../storage/compressed-storage.js";
|
|
|
3
3
|
import { MemoryStorage } from "../../storage/memory.js";
|
|
4
4
|
import { ActivityWorkerDispatcher } from "../../workers/activity-worker-dispatcher.js";
|
|
5
5
|
import { WorkerPool } from "../../workers/pool.js";
|
|
6
|
+
import { optionalInlineDependencies } from "../inline-execution-strategy.context-options.js";
|
|
6
7
|
import { InlineExecutionStrategy } from "../inline-execution-strategy.js";
|
|
7
8
|
import {
|
|
8
9
|
DEFAULT_RETENTION_SWEEP_BATCH_SIZE,
|
|
@@ -14,6 +15,7 @@ import {
|
|
|
14
15
|
DEFAULT_WORKER_TURN_TIMEOUT_MS,
|
|
15
16
|
MIN_WORKER_PROTOCOL_MESSAGE_BYTES
|
|
16
17
|
} from "../worker-protocol.js";
|
|
18
|
+
import { resolveOwnershipFields } from "./ownership-options.js";
|
|
17
19
|
import {
|
|
18
20
|
normalizeHistoryPolicy,
|
|
19
21
|
normalizePayloadSizePolicy,
|
|
@@ -70,7 +72,8 @@ export function copyWorkflowDefinition(type, registration) {
|
|
|
70
72
|
...registration.description === void 0 ? {} : { description: registration.description },
|
|
71
73
|
...registration.inputSchema === void 0 ? {} : { inputSchema: registration.inputSchema },
|
|
72
74
|
...registration.outputSchema === void 0 ? {} : { outputSchema: registration.outputSchema },
|
|
73
|
-
...registration.searchAttributes === void 0 ? {} : { searchAttributes: registration.searchAttributes }
|
|
75
|
+
...registration.searchAttributes === void 0 ? {} : { searchAttributes: registration.searchAttributes },
|
|
76
|
+
...registration.concurrency === void 0 ? {} : { concurrency: registration.concurrency }
|
|
74
77
|
};
|
|
75
78
|
}
|
|
76
79
|
function resolveRetentionFields(options) {
|
|
@@ -116,11 +119,13 @@ export function resolveEngineOptions(storage, options, getNow) {
|
|
|
116
119
|
storage,
|
|
117
120
|
getNow,
|
|
118
121
|
resolveWorkflowServices: options?.resolveWorkflowServices ?? null,
|
|
122
|
+
onLog: options?.onLog ?? null,
|
|
119
123
|
...resolveBooleanDefaults(options),
|
|
120
124
|
...resolveNumericDefaults(options),
|
|
121
125
|
...resolveRetentionFields(options),
|
|
122
126
|
...resolveHistoryFields(options),
|
|
123
|
-
...resolveSecondInstanceFields(options)
|
|
127
|
+
...resolveSecondInstanceFields(options),
|
|
128
|
+
...resolveOwnershipFields(options)
|
|
124
129
|
};
|
|
125
130
|
}
|
|
126
131
|
export function normalizeWorkerExecutionConfiguration(options) {
|
|
@@ -180,19 +185,23 @@ export function createExecutionStrategyBundle(parameters) {
|
|
|
180
185
|
getComposedWorkflowInterceptor,
|
|
181
186
|
resolveWorkflowType,
|
|
182
187
|
registerCancelHandler,
|
|
183
|
-
|
|
188
|
+
recordFinalizerState,
|
|
189
|
+
getWorkflowServices,
|
|
190
|
+
getLogSink
|
|
184
191
|
} = parameters, workerExecutionConfiguration = normalizeWorkerExecutionConfiguration(options);
|
|
185
192
|
if (workerExecutionConfiguration.mode === "worker") {
|
|
186
193
|
const pool = new WorkerPool({
|
|
187
194
|
workerUrl: workerExecutionConfiguration.workerExecution.workerUrl,
|
|
188
195
|
concurrency: workerExecutionConfiguration.workerExecution.poolSize ?? 4,
|
|
189
196
|
smol: workerExecutionConfiguration.workerExecution.smol ?? !1
|
|
190
|
-
}), strategyOptions = {
|
|
197
|
+
}), logSink = getLogSink?.(), strategyOptions = {
|
|
191
198
|
broadcastEvents,
|
|
192
199
|
requireProtocolVersion: workerExecutionConfiguration.requireProtocolVersion,
|
|
193
200
|
discardOnCancel: workerExecutionConfiguration.discardOnCancel,
|
|
194
201
|
workflowTurnTimeoutMs: workerExecutionConfiguration.workflowTurnTimeoutMs,
|
|
195
|
-
maxProtocolMessageBytes: workerExecutionConfiguration.maxProtocolMessageBytes
|
|
202
|
+
maxProtocolMessageBytes: workerExecutionConfiguration.maxProtocolMessageBytes,
|
|
203
|
+
getNow,
|
|
204
|
+
...logSink !== void 0 && { onLog: logSink }
|
|
196
205
|
};
|
|
197
206
|
return {
|
|
198
207
|
strategy: new WorkerExecutionStrategy(pool, strategyOptions),
|
|
@@ -201,13 +210,17 @@ export function createExecutionStrategyBundle(parameters) {
|
|
|
201
210
|
}
|
|
202
211
|
const inlineStrategy = new InlineExecutionStrategy({
|
|
203
212
|
getRegistration,
|
|
204
|
-
...getComposedWorkflowInterceptor !== void 0 && { getComposedWorkflowInterceptor },
|
|
205
213
|
getNow,
|
|
206
214
|
maxNestingDepth,
|
|
207
215
|
development,
|
|
208
216
|
resolveWorkflowType,
|
|
209
|
-
...
|
|
210
|
-
|
|
217
|
+
...optionalInlineDependencies({
|
|
218
|
+
getComposedWorkflowInterceptor,
|
|
219
|
+
registerCancelHandler,
|
|
220
|
+
recordFinalizerState,
|
|
221
|
+
getWorkflowServices,
|
|
222
|
+
getLogSink
|
|
223
|
+
})
|
|
211
224
|
});
|
|
212
225
|
return { strategy: inlineStrategy, inlineStrategy };
|
|
213
226
|
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { ContextOperationRequest } from '../context.ts';
|
|
2
|
+
import type { EngineInternals } from './internals.ts';
|
|
3
|
+
/**
|
|
4
|
+
* The largest delay a host `setTimeout` can hold without overflow. Node and Bun
|
|
5
|
+
* store the delay in a 32-bit signed integer, so a value above this wraps and
|
|
6
|
+
* the timer fires almost immediately. A multi-day race-branch sleep must be
|
|
7
|
+
* chunked under this ceiling and re-armed, or it would win its race instantly.
|
|
8
|
+
*/
|
|
9
|
+
export declare const MAX_TIMER_DELAY_MS = 2147483647;
|
|
10
|
+
/**
|
|
11
|
+
* Compute the next host-timer delay for a race-branch sleep: the milliseconds
|
|
12
|
+
* remaining until the deterministic `scheduledFireAt` deadline, clamped to
|
|
13
|
+
* `[0, MAX_TIMER_DELAY_MS]`. Clamping to the ceiling is what prevents a multi-day
|
|
14
|
+
* sleep from overflowing `setTimeout` and firing instantly — the caller re-arms
|
|
15
|
+
* against the same deadline until the remaining delay reaches `0`.
|
|
16
|
+
*/
|
|
17
|
+
export declare function nextSleepTimerDelayMs(scheduledFireAt: number, now: number): number;
|
|
18
|
+
/**
|
|
19
|
+
* Abortable in-process `sleep` branch for `ctx.race` / `ctx.all`.
|
|
20
|
+
*
|
|
21
|
+
* Unlike a top-level `ctx.sleep` (which arms a durable timer and parks the whole
|
|
22
|
+
* generator), a sleep branch inside a coordination operation is a TRANSIENT
|
|
23
|
+
* in-process wait: the coordination operation as a whole is the durable unit, and
|
|
24
|
+
* on replay the cached winner short-circuits before any branch re-runs. So this
|
|
25
|
+
* must NOT touch `internals.scheduler` (a durable timer write would corrupt the
|
|
26
|
+
* timer index) — it waits with a plain timer that the race's AbortController can
|
|
27
|
+
* cancel when another branch wins.
|
|
28
|
+
*
|
|
29
|
+
* The deadline is the operation's deterministic `scheduledFireAt`, compared
|
|
30
|
+
* against the engine clock (`internals.options.getNow()`), not wall-clock
|
|
31
|
+
* `Date.now()`, so a clock-overriding deployment stays consistent. The remaining
|
|
32
|
+
* delay is recomputed against that absolute deadline on every chunk, which both
|
|
33
|
+
* chunks delays beyond {@link MAX_TIMER_DELAY_MS} (so a multi-day sleep does not
|
|
34
|
+
* overflow `setTimeout` and fire instantly) and self-corrects for timer drift.
|
|
35
|
+
*
|
|
36
|
+
* Note: because the timer is a real event-loop timer, a long sleep that WINS its
|
|
37
|
+
* race is not driven by a virtual-clock `advanceTime`; tests should use short
|
|
38
|
+
* real durations for sleep-wins paths (sleep-loses paths need no timing — the
|
|
39
|
+
* abort fires).
|
|
40
|
+
*
|
|
41
|
+
* The timer also observes the engine abort signal so a long sleep branch does
|
|
42
|
+
* not outlive engine disposal. `ctx.all` does not abort siblings (it has no
|
|
43
|
+
* loser), so without watching `internals.abortController.signal` a multi-day
|
|
44
|
+
* `ctx.all([ctx.sleep('30d')])` branch would keep a host timer alive after the
|
|
45
|
+
* engine is gone.
|
|
46
|
+
*/
|
|
47
|
+
export declare function executeSleepSubOperation(internals: EngineInternals, operation: Extract<ContextOperationRequest, {
|
|
48
|
+
type: 'sleep';
|
|
49
|
+
}>, signal?: AbortSignal): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Abortable in-process `wait-signal` branch for `ctx.race` / `ctx.all`.
|
|
52
|
+
*
|
|
53
|
+
* A wait-signal branch must never consume its durable signal record itself —
|
|
54
|
+
* when it is woken it does not yet know whether it WON its race. So on delivery
|
|
55
|
+
* it resolves with a {@link createDeferredConsumeEnvelope | deferred-consume
|
|
56
|
+
* envelope}: the single atomic {@link consumeSignalWithAtomicWorkflowCommit} is wrapped in
|
|
57
|
+
* `finalize` and performed ONLY by the coordinator, on the winner, strictly
|
|
58
|
+
* after `Promise.race` / `Promise.all` settles. A losing branch (race settled by
|
|
59
|
+
* a sibling → `signal` aborts) drops its envelope unfinalized and releases its
|
|
60
|
+
* waiter via {@link releaseSignalWaiter} WITHOUT consuming, so the signal
|
|
61
|
+
* survives for a later `waitForSignal` or a replay.
|
|
62
|
+
*
|
|
63
|
+
* Reads are non-destructive {@link peekSignal}s until the coordinator finalizes;
|
|
64
|
+
* the identity-guarded release (`expectedResolve === deliver`) ensures a loser
|
|
65
|
+
* never clobbers another waiter (e.g. a later top-level `waitForSignal`) that
|
|
66
|
+
* reused the shared `${workflowId}:${signalName}` key.
|
|
67
|
+
*/
|
|
68
|
+
export declare function executeWaitSignalSubOperation(internals: EngineInternals, workflowId: string, operation: Extract<ContextOperationRequest, {
|
|
69
|
+
type: 'wait-signal';
|
|
70
|
+
}>, signal?: AbortSignal): Promise<unknown>;
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { createDeferredConsumeEnvelope } from "./deferred-consume-envelope.js";
|
|
2
|
+
import {
|
|
3
|
+
consumeSignalWithAtomicWorkflowCommit,
|
|
4
|
+
peekSignal,
|
|
5
|
+
releaseSignalWaiter,
|
|
6
|
+
trackWaiterKey
|
|
7
|
+
} from "./signals.js";
|
|
8
|
+
export const MAX_TIMER_DELAY_MS = 2147483647;
|
|
9
|
+
export function nextSleepTimerDelayMs(scheduledFireAt, now) {
|
|
10
|
+
return Math.min(Math.max(0, scheduledFireAt - now), MAX_TIMER_DELAY_MS);
|
|
11
|
+
}
|
|
12
|
+
export function executeSleepSubOperation(internals, operation, signal) {
|
|
13
|
+
signal?.throwIfAborted();
|
|
14
|
+
const engineAbort = internals.abortController.signal;
|
|
15
|
+
if (engineAbort.aborted)
|
|
16
|
+
return Promise.reject(engineAbort.reason ?? Error("aborted"));
|
|
17
|
+
if (nextSleepTimerDelayMs(operation.scheduledFireAt, internals.options.getNow()) === 0)
|
|
18
|
+
return Promise.resolve();
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
let timer;
|
|
21
|
+
const cleanup = () => {
|
|
22
|
+
signal?.removeEventListener("abort", onAbort);
|
|
23
|
+
engineAbort.removeEventListener("abort", onAbort);
|
|
24
|
+
}, onAbort = () => {
|
|
25
|
+
clearTimeout(timer);
|
|
26
|
+
cleanup();
|
|
27
|
+
reject(signal?.reason ?? engineAbort.reason ?? Error("aborted"));
|
|
28
|
+
}, arm = () => {
|
|
29
|
+
const remainingMs = nextSleepTimerDelayMs(operation.scheduledFireAt, internals.options.getNow());
|
|
30
|
+
if (remainingMs === 0) {
|
|
31
|
+
cleanup();
|
|
32
|
+
resolve();
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
timer = setTimeout(arm, remainingMs);
|
|
36
|
+
};
|
|
37
|
+
signal?.addEventListener("abort", onAbort, { once: !0 });
|
|
38
|
+
engineAbort.addEventListener("abort", onAbort, { once: !0 });
|
|
39
|
+
arm();
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
export function executeWaitSignalSubOperation(internals, workflowId, operation, signal) {
|
|
43
|
+
signal?.throwIfAborted();
|
|
44
|
+
const { signalName } = operation, waiterKey = `${workflowId}:${signalName}`, engineAbort = internals.abortController.signal;
|
|
45
|
+
return new Promise((resolve, reject) => {
|
|
46
|
+
let settled = !1, registered = !1;
|
|
47
|
+
const { promise: delivered, resolve: deliver } = Promise.withResolvers(), cleanup = () => {
|
|
48
|
+
signal?.removeEventListener("abort", onAbort);
|
|
49
|
+
engineAbort.removeEventListener("abort", onAbort);
|
|
50
|
+
}, finalize = async () => {
|
|
51
|
+
const consumed = await consumeSignalWithAtomicWorkflowCommit(internals, workflowId, signalName);
|
|
52
|
+
return consumed.found ? consumed.payload : void 0;
|
|
53
|
+
}, onAbort = () => {
|
|
54
|
+
if (settled)
|
|
55
|
+
return;
|
|
56
|
+
settled = !0;
|
|
57
|
+
cleanup();
|
|
58
|
+
if (registered)
|
|
59
|
+
releaseSignalWaiter(internals, workflowId, waiterKey, deliver);
|
|
60
|
+
reject(signal?.reason ?? engineAbort.reason ?? Error("aborted"));
|
|
61
|
+
}, win = () => {
|
|
62
|
+
if (settled)
|
|
63
|
+
return;
|
|
64
|
+
settled = !0;
|
|
65
|
+
cleanup();
|
|
66
|
+
resolve(createDeferredConsumeEnvelope(finalize));
|
|
67
|
+
}, fail = (error) => {
|
|
68
|
+
if (settled)
|
|
69
|
+
return;
|
|
70
|
+
settled = !0;
|
|
71
|
+
cleanup();
|
|
72
|
+
if (registered)
|
|
73
|
+
releaseSignalWaiter(internals, workflowId, waiterKey, deliver);
|
|
74
|
+
reject(error);
|
|
75
|
+
};
|
|
76
|
+
signal?.addEventListener("abort", onAbort, { once: !0 });
|
|
77
|
+
engineAbort.addEventListener("abort", onAbort, { once: !0 });
|
|
78
|
+
if (engineAbort.aborted) {
|
|
79
|
+
onAbort();
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
(async () => {
|
|
83
|
+
const existing = await peekSignal(internals, workflowId, signalName);
|
|
84
|
+
if (settled)
|
|
85
|
+
return;
|
|
86
|
+
if (existing.found) {
|
|
87
|
+
win();
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
internals.signalWaiters.set(waiterKey, deliver);
|
|
91
|
+
trackWaiterKey(internals.signalWaitersByWorkflow, workflowId, waiterKey);
|
|
92
|
+
registered = !0;
|
|
93
|
+
const buffered = await peekSignal(internals, workflowId, signalName);
|
|
94
|
+
if (settled)
|
|
95
|
+
return;
|
|
96
|
+
if (buffered.found) {
|
|
97
|
+
releaseSignalWaiter(internals, workflowId, waiterKey, deliver);
|
|
98
|
+
win();
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
await delivered;
|
|
102
|
+
if (settled)
|
|
103
|
+
return;
|
|
104
|
+
win();
|
|
105
|
+
})().catch(fail);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Deferred-consume envelopes for `wait-signal` branches inside `ctx.race` /
|
|
3
|
+
* `ctx.all`.
|
|
4
|
+
*
|
|
5
|
+
* A `wait-signal` branch must NOT destructively consume its durable signal
|
|
6
|
+
* record when it is woken — at that moment it does not yet know whether it WON
|
|
7
|
+
* its race. If a losing branch consumed, it would delete a signal that a later
|
|
8
|
+
* `waitForSignal` (or a replay) still needs. So a woken wait-signal branch
|
|
9
|
+
* resolves with one of these envelopes instead of a value: the branch defers the
|
|
10
|
+
* single destructive {@link import('./signals.ts').consumeSignal} into
|
|
11
|
+
* `finalize`, and ONLY the coordinator — which authoritatively knows the race
|
|
12
|
+
* winner once `Promise.race` settles — calls `finalize()`, on the winner alone.
|
|
13
|
+
* Losing branches drop their envelope unfinalized and release their waiter
|
|
14
|
+
* without consuming, so the signal survives.
|
|
15
|
+
*
|
|
16
|
+
* The envelope is branded with a unique {@link DEFERRED_CONSUME_BRAND} symbol and
|
|
17
|
+
* detected ONLY by that symbol, never structurally — a user's signal payload can
|
|
18
|
+
* legitimately be an object shaped like `{ finalize }`, and a structural check
|
|
19
|
+
* would misfire on it.
|
|
20
|
+
*
|
|
21
|
+
* Envelopes must never reach the durable operation cache (a function cannot
|
|
22
|
+
* round-trip `encode`/`decode`), so the coordinator finalize-and-unwraps every
|
|
23
|
+
* winning branch's envelope before the operation result is written — including
|
|
24
|
+
* envelopes nested at arbitrary positions inside a `ctx.all` array result that a
|
|
25
|
+
* nested coordinator surfaces up to its parent.
|
|
26
|
+
*/
|
|
27
|
+
declare const DEFERRED_CONSUME_BRAND: unique symbol;
|
|
28
|
+
/**
|
|
29
|
+
* A branch result whose real value is produced by a single deferred consume that
|
|
30
|
+
* only the winning coordinator performs.
|
|
31
|
+
*/
|
|
32
|
+
export type DeferredConsumeEnvelope = {
|
|
33
|
+
readonly [DEFERRED_CONSUME_BRAND]: true;
|
|
34
|
+
/** Perform the single destructive consume and return the consumed payload. */
|
|
35
|
+
readonly finalize: () => Promise<unknown>;
|
|
36
|
+
};
|
|
37
|
+
/** Wrap a deferred consume into a branded envelope. */
|
|
38
|
+
export declare function createDeferredConsumeEnvelope(finalize: () => Promise<unknown>): DeferredConsumeEnvelope;
|
|
39
|
+
/** Detect an envelope by its brand symbol only (never structurally). */
|
|
40
|
+
export declare function isDeferredConsumeEnvelope(value: unknown): value is DeferredConsumeEnvelope;
|
|
41
|
+
/**
|
|
42
|
+
* Finalize-and-unwrap a coordination result before it is written to the durable
|
|
43
|
+
* cache. A winning `wait-signal` branch surfaces a {@link DeferredConsumeEnvelope}
|
|
44
|
+
* whose `finalize()` performs the single consume; a nested `ctx.all` branch
|
|
45
|
+
* surfaces an ARRAY that may hold envelopes at arbitrary positions, so arrays are
|
|
46
|
+
* walked and each element finalized. Any other value passes through untouched.
|
|
47
|
+
*
|
|
48
|
+
* This runs only on the WINNING path (race winner, or every branch of a settled
|
|
49
|
+
* `ctx.all`), so finalizing here is exactly the linearization point of "this
|
|
50
|
+
* branch won" — the consume happens strictly after the coordinator settled, and a
|
|
51
|
+
* losing branch's envelope is never reached, so its signal is never consumed.
|
|
52
|
+
*
|
|
53
|
+
* The array walk reconstructs arrays via `Promise.all(map(...))`. This is safe
|
|
54
|
+
* because coordination results are cache-safe encoded data: they round-trip
|
|
55
|
+
* `encode`/`decode` for the durable cache, so sparse holes, custom array
|
|
56
|
+
* properties, subclasses, and array identity are not preserved semantics here.
|
|
57
|
+
*/
|
|
58
|
+
export declare function finalizeAndUnwrap(value: unknown): Promise<unknown>;
|
|
59
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
const DEFERRED_CONSUME_BRAND = Symbol("weft.deferredConsume");
|
|
2
|
+
export function createDeferredConsumeEnvelope(finalize) {
|
|
3
|
+
return { [DEFERRED_CONSUME_BRAND]: !0, finalize };
|
|
4
|
+
}
|
|
5
|
+
export function isDeferredConsumeEnvelope(value) {
|
|
6
|
+
return typeof value === "object" && value !== null && value[DEFERRED_CONSUME_BRAND] === !0;
|
|
7
|
+
}
|
|
8
|
+
export async function finalizeAndUnwrap(value) {
|
|
9
|
+
if (isDeferredConsumeEnvelope(value))
|
|
10
|
+
return value.finalize();
|
|
11
|
+
if (Array.isArray(value))
|
|
12
|
+
return Promise.all(value.map((element) => finalizeAndUnwrap(element)));
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
@@ -10,6 +10,9 @@ export function disposeEngine(internals) {
|
|
|
10
10
|
resolveSignalWaiter();
|
|
11
11
|
internals.signalWaiters.clear();
|
|
12
12
|
internals.signalWaitersByWorkflow.clear();
|
|
13
|
+
for (const resolveConditionWaiter of internals.conditionWaiters.values())
|
|
14
|
+
resolveConditionWaiter();
|
|
15
|
+
internals.conditionWaiters.clear();
|
|
13
16
|
disposeQueuedInlineWorkflowStarts(internals);
|
|
14
17
|
internals.scheduler[Symbol.dispose]();
|
|
15
18
|
internals.strategy[Symbol.dispose]();
|
|
@@ -23,6 +26,7 @@ export function disposeEngine(internals) {
|
|
|
23
26
|
}
|
|
24
27
|
internals.nextRetentionSweepAt = null;
|
|
25
28
|
disposeSecondInstanceDetection(internals);
|
|
29
|
+
disposeLeaseManager(internals);
|
|
26
30
|
internals.handleCache.clear();
|
|
27
31
|
for (const waiter of internals.resultResolvers.values())
|
|
28
32
|
waiter.reject(new EngineDisposedError);
|
|
@@ -35,6 +39,7 @@ export function disposeEngine(internals) {
|
|
|
35
39
|
internals.workflowReviewIds.clear();
|
|
36
40
|
internals.parkedInlineWorkflows.clear();
|
|
37
41
|
internals.terminalizingWorkflows.clear();
|
|
42
|
+
internals.deliveredPendingUpdateIds.clear();
|
|
38
43
|
internals.reviewTimerIds.clear();
|
|
39
44
|
for (const controller of internals.pendingWebhooks)
|
|
40
45
|
controller.abort();
|
|
@@ -50,6 +55,8 @@ export function disposeEngine(internals) {
|
|
|
50
55
|
internals.pendingScheduleCreations.clear();
|
|
51
56
|
internals.eventLogHeads.clear();
|
|
52
57
|
internals.pendingTimelineEntries.clear();
|
|
58
|
+
internals.pendingAtomicWorkflowCommitSideEffects.clear();
|
|
59
|
+
internals.pendingAsyncActivityResolutions.clear();
|
|
53
60
|
internals.workflowVersionTuples.clear();
|
|
54
61
|
internals.workflowFeedListeners.clear();
|
|
55
62
|
internals.activityRegistriesByWorkflow.clear();
|
|
@@ -68,3 +75,9 @@ function disposeSecondInstanceDetection(internals) {
|
|
|
68
75
|
internals.secondInstanceDetector = null;
|
|
69
76
|
}
|
|
70
77
|
}
|
|
78
|
+
function disposeLeaseManager(internals) {
|
|
79
|
+
if (internals.leaseManager !== null) {
|
|
80
|
+
internals.leaseManager.stop();
|
|
81
|
+
internals.leaseManager = null;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { AnyActivityDefinition, AnyWorkflowDefinition, IsDefaultWorkflowRegistry } from '../types.ts';
|
|
1
|
+
import type { AnyActivityDefinition, AnyWorkflowDefinition, DefaultWorkflowRegistry, InferWorkflowEntries, IsDefaultWorkflowRegistry, WorkflowServicesUnion } from '../types.ts';
|
|
2
2
|
import type { UnknownNameWhenRegistryHasNoKnownNames } from '../types/registry-type-helpers.ts';
|
|
3
3
|
import type { KnownWorkflowNames } from './construction.ts';
|
|
4
4
|
import type { EngineConstructorOptions } from './engine-internal-types.ts';
|
|
@@ -24,7 +24,7 @@ import type { EngineConstructorOptions } from './engine-internal-types.ts';
|
|
|
24
24
|
* void engine;
|
|
25
25
|
* ```
|
|
26
26
|
*/
|
|
27
|
-
export type EngineCreateOptions<TWorkflowDefinitions extends Record<string, AnyWorkflowDefinition> = {}, TActivityDefinitions extends Record<string, AnyActivityDefinition> = {}> = EngineConstructorOptions & {
|
|
27
|
+
export type EngineCreateOptions<TWorkflowDefinitions extends Record<string, AnyWorkflowDefinition> = {}, TActivityDefinitions extends Record<string, AnyActivityDefinition> = {}> = EngineConstructorOptions<WorkflowServicesUnion<EngineCreateWorkflowRegistry<TWorkflowDefinitions>>> & {
|
|
28
28
|
/** Workflow definitions to register before recovery. */
|
|
29
29
|
workflows?: TWorkflowDefinitions;
|
|
30
30
|
/** Activity definitions to register before workflows. */
|
|
@@ -34,13 +34,13 @@ export type EngineCreateOptions<TWorkflowDefinitions extends Record<string, AnyW
|
|
|
34
34
|
* Recover stored running workflows after registration. Defaults to
|
|
35
35
|
* `true`: a fresh engine booting against durable storage resumes any
|
|
36
36
|
* workflows left in flight by a previous process. Pass `recover: false`
|
|
37
|
-
* to opt out (tests, `ScopedStorage` isolation,
|
|
37
|
+
* to opt out (tests, `ScopedStorage` isolation, explicit operator
|
|
38
38
|
* inspection).
|
|
39
39
|
*/
|
|
40
40
|
recover?: true | undefined;
|
|
41
41
|
/**
|
|
42
42
|
* Forwarded to `Engine.recoverAll`. Only use this during rolling
|
|
43
|
-
* deploys or explicit storage
|
|
43
|
+
* deploys or explicit operator storage repair.
|
|
44
44
|
*/
|
|
45
45
|
acknowledgeUnknownWorkflowTypes?: boolean;
|
|
46
46
|
} | {
|
|
@@ -49,6 +49,16 @@ export type EngineCreateOptions<TWorkflowDefinitions extends Record<string, AnyW
|
|
|
49
49
|
/** Only valid when recovery is enabled (the default). Invalid with `recover: false`. */
|
|
50
50
|
acknowledgeUnknownWorkflowTypes?: never;
|
|
51
51
|
});
|
|
52
|
+
/**
|
|
53
|
+
* Resolves the workflow registry type for `Engine.create` return values.
|
|
54
|
+
*
|
|
55
|
+
* When the provided workflow definition map is empty (`{}`), the resulting
|
|
56
|
+
* engine carries the same `DefaultWorkflowRegistry` brand as an engine
|
|
57
|
+
* constructed without a `workflows` map at all — the two are semantically
|
|
58
|
+
* identical. A non-empty map routes to `InferWorkflowEntries` so literal
|
|
59
|
+
* workflow-name inference is preserved.
|
|
60
|
+
*/
|
|
61
|
+
export type EngineCreateWorkflowRegistry<TWorkflowDefinitions extends Record<string, AnyWorkflowDefinition>> = [keyof TWorkflowDefinitions & string] extends [never] ? DefaultWorkflowRegistry : InferWorkflowEntries<TWorkflowDefinitions>;
|
|
52
62
|
export type UnknownWorkflowNameWhenDefaultRegistryIsEmpty<TWorkflows extends object, TName extends string> = IsDefaultWorkflowRegistry<TWorkflows> extends true ? UnknownNameWhenRegistryHasNoKnownNames<TName, KnownWorkflowNames<TWorkflows>> : never;
|
|
53
63
|
export type ActivityDefinitionName<TDefinition extends AnyActivityDefinition> = TDefinition extends {
|
|
54
64
|
readonly name: infer TName extends string;
|
|
@@ -2,7 +2,7 @@ import type { Storage as WeftStorage } from '../../storage/interface.ts';
|
|
|
2
2
|
import type { ConstraintDefinition } from '../constraint.ts';
|
|
3
3
|
import type { ExecutionStrategy } from '../execution-strategy.ts';
|
|
4
4
|
import type { InlineExecutionStrategy } from '../inline-execution-strategy.ts';
|
|
5
|
-
import type { ArchiveAdapter, Checkpoint, DefinitionSchema, EngineOptions, NormalizedHistoryPolicy, NormalizedPayloadSizePolicy, NormalizedRetentionPolicy, SearchAttributeSchema, WorkflowFunction, WorkflowTimelineEntry } from '../types.ts';
|
|
5
|
+
import type { AnyActivityDefinition, ArchiveAdapter, Checkpoint, DefinitionSchema, EngineOptions, NormalizedHistoryPolicy, NormalizedPayloadSizePolicy, NormalizedRetentionPolicy, SearchAttributeSchema, WorkflowConcurrencyOptions, WorkflowFunction, WorkflowTimelineEntry } from '../types.ts';
|
|
6
6
|
export interface RegistrationEntry {
|
|
7
7
|
handler: WorkflowFunction;
|
|
8
8
|
version: string;
|
|
@@ -10,10 +10,16 @@ export interface RegistrationEntry {
|
|
|
10
10
|
tags?: ReadonlyArray<string>;
|
|
11
11
|
inputSchema?: DefinitionSchema;
|
|
12
12
|
outputSchema?: DefinitionSchema;
|
|
13
|
-
migrate?: (checkpoint: unknown, fromVersion: string) => unknown;
|
|
14
13
|
searchAttributes?: SearchAttributeSchema;
|
|
15
14
|
retention?: NormalizedRetentionPolicy;
|
|
15
|
+
concurrency?: WorkflowConcurrencyOptions;
|
|
16
16
|
constraints?: ConstraintDefinition[];
|
|
17
|
+
/**
|
|
18
|
+
* Definition-level teardown activity (issue #446), driven by the engine after a
|
|
19
|
+
* `cancelled`/`timed-out` terminal. Stored on the engine-lifetime registry so it
|
|
20
|
+
* survives per-workflow terminal cleanup; resolved at teardown by workflow type.
|
|
21
|
+
*/
|
|
22
|
+
finalizer?: AnyActivityDefinition;
|
|
17
23
|
}
|
|
18
24
|
export interface ResolvedOptions {
|
|
19
25
|
storage: WeftStorage;
|
|
@@ -33,19 +39,36 @@ export interface ResolvedOptions {
|
|
|
33
39
|
secondInstanceDetectionEnabled: boolean;
|
|
34
40
|
/** Heartbeat interval (ms) for the second-instance detector when enabled. */
|
|
35
41
|
secondInstanceHeartbeatIntervalMs: number;
|
|
42
|
+
/**
|
|
43
|
+
* Single-writer ownership posture. `'none'` recovers immediately (infra owns
|
|
44
|
+
* mutual exclusion); `'lease'` acquires a storage lease before recovery. The
|
|
45
|
+
* lease tuning fields below are only meaningful when this is `'lease'`.
|
|
46
|
+
*/
|
|
47
|
+
ownershipMode: 'none' | 'lease';
|
|
48
|
+
/** Lease time-to-live (ms) when `ownershipMode` is `'lease'`. */
|
|
49
|
+
leaseTtlMs: number;
|
|
50
|
+
/** Lease renewal interval (ms) when `ownershipMode` is `'lease'`. */
|
|
51
|
+
leaseRenewIntervalMs: number;
|
|
52
|
+
/** Boot-time lease acquisition wait window (ms) when `ownershipMode` is `'lease'`. */
|
|
53
|
+
leaseWaitTimeoutMs: number;
|
|
36
54
|
getNow: () => number;
|
|
37
55
|
/**
|
|
38
56
|
* Re-provides the non-serialized per-run `services` value on recovery; `null`
|
|
39
57
|
* when the engine was created without `resolveWorkflowServices`.
|
|
40
58
|
*/
|
|
41
59
|
resolveWorkflowServices: EngineOptions['resolveWorkflowServices'] | null;
|
|
60
|
+
/**
|
|
61
|
+
* Host sink for `ctx.log` records (`EngineOptions.onLog`); `null` when the engine
|
|
62
|
+
* was created without one (the default console behavior).
|
|
63
|
+
*/
|
|
64
|
+
onLog: EngineOptions['onLog'] | null;
|
|
42
65
|
}
|
|
43
66
|
export interface WorkflowResultWaiter {
|
|
44
67
|
promise: Promise<unknown>;
|
|
45
68
|
resolve: (value: unknown) => void;
|
|
46
69
|
reject: (reason: unknown) => void;
|
|
47
70
|
}
|
|
48
|
-
export type EngineConstructorOptions = Partial<EngineOptions
|
|
71
|
+
export type EngineConstructorOptions<TServices = unknown> = Partial<EngineOptions<TServices>> & {
|
|
49
72
|
getNow?: () => number;
|
|
50
73
|
};
|
|
51
74
|
export type ExecutionStrategyBundle = {
|
|
@@ -27,6 +27,29 @@ export declare class WorkflowAlreadyExistsError extends WeftError<'WorkflowAlrea
|
|
|
27
27
|
readonly workflowId: string;
|
|
28
28
|
constructor(workflowId: string);
|
|
29
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Thrown by {@link Engine.start} with `onTerminalConflict: 'start-new'` when the
|
|
32
|
+
* prior terminal run under the requested id still owes an engine-driven finalizer
|
|
33
|
+
* (issue #446). Unlike {@link WorkflowAlreadyExistsError}, this is **transient**:
|
|
34
|
+
* the restart is refused only so the displacing purge cannot delete the finalizer
|
|
35
|
+
* payload before the resource is torn down. Once the finalizer completes (or
|
|
36
|
+
* permanently dead-letters), the marker clears and the same restart succeeds — so a
|
|
37
|
+
* caller should retry after a short delay rather than treat the id as permanently
|
|
38
|
+
* taken.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* import { WorkflowTeardownPendingError } from '@lostgradient/weft';
|
|
43
|
+
*
|
|
44
|
+
* function shouldRetryRestartLater(error: unknown): boolean {
|
|
45
|
+
* return error instanceof WorkflowTeardownPendingError;
|
|
46
|
+
* }
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export declare class WorkflowTeardownPendingError extends WeftError<'WorkflowTeardownPendingError'> {
|
|
50
|
+
readonly workflowId: string;
|
|
51
|
+
constructor(workflowId: string);
|
|
52
|
+
}
|
|
30
53
|
/**
|
|
31
54
|
* Thrown by {@link Engine.deleteAll} when the supplied filter would match
|
|
32
55
|
* non-terminal workflows. Narrow the filter to completed, failed, cancelled,
|
|
@@ -187,6 +210,30 @@ export declare class WorkflowNotRegisteredError extends WeftError<'WorkflowNotRe
|
|
|
187
210
|
readonly workflowType: string;
|
|
188
211
|
constructor(workflowType: string);
|
|
189
212
|
}
|
|
213
|
+
/**
|
|
214
|
+
* Thrown by {@link Engine.start} when a workflow definition's `concurrency`
|
|
215
|
+
* policy has no free slot for the requested workflow type or partition key.
|
|
216
|
+
* Starts are rejected immediately; Weft does not queue excess starts.
|
|
217
|
+
*
|
|
218
|
+
* @example
|
|
219
|
+
* ```ts
|
|
220
|
+
* import { WorkflowConcurrencyLimitExceededError } from '@lostgradient/weft';
|
|
221
|
+
*
|
|
222
|
+
* function isCapacityRejection(error: unknown): boolean {
|
|
223
|
+
* return error instanceof WorkflowConcurrencyLimitExceededError;
|
|
224
|
+
* }
|
|
225
|
+
* ```
|
|
226
|
+
*/
|
|
227
|
+
export declare class WorkflowConcurrencyLimitExceededError extends WeftError<'WorkflowConcurrencyLimitExceededError'> {
|
|
228
|
+
readonly workflowType: string;
|
|
229
|
+
readonly limit: number;
|
|
230
|
+
readonly partitionKey: string;
|
|
231
|
+
constructor(parameters: {
|
|
232
|
+
workflowType: string;
|
|
233
|
+
limit: number;
|
|
234
|
+
partitionKey: string;
|
|
235
|
+
});
|
|
236
|
+
}
|
|
190
237
|
/**
|
|
191
238
|
* Thrown by {@link Engine.suspend} when invoked on an engine running in worker
|
|
192
239
|
* execution mode. Suspension parks the live run without aborting it, which the
|
|
@@ -8,6 +8,14 @@ export class WorkflowAlreadyExistsError extends WeftError {
|
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
+
export class WorkflowTeardownPendingError extends WeftError {
|
|
12
|
+
workflowId;
|
|
13
|
+
constructor(workflowId) {
|
|
14
|
+
super("WorkflowTeardownPendingError", `Cannot restart workflow "${workflowId}" under the same id: its prior run is tearing down a resource (finalizer in progress). Retry after the teardown completes.`);
|
|
15
|
+
this.workflowId = workflowId;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
11
19
|
export class BulkDeleteRequiresTerminalWorkflowsError extends WeftError {
|
|
12
20
|
constructor() {
|
|
13
21
|
super("BulkDeleteRequiresTerminalWorkflowsError", "Bulk delete matches non-terminal workflows");
|
|
@@ -78,6 +86,18 @@ export class WorkflowNotRegisteredError extends WeftError {
|
|
|
78
86
|
}
|
|
79
87
|
}
|
|
80
88
|
|
|
89
|
+
export class WorkflowConcurrencyLimitExceededError extends WeftError {
|
|
90
|
+
workflowType;
|
|
91
|
+
limit;
|
|
92
|
+
partitionKey;
|
|
93
|
+
constructor(parameters) {
|
|
94
|
+
super("WorkflowConcurrencyLimitExceededError", `Workflow "${parameters.workflowType}" concurrency limit ${parameters.limit} reached for partition key "${parameters.partitionKey}"`);
|
|
95
|
+
this.workflowType = parameters.workflowType;
|
|
96
|
+
this.limit = parameters.limit;
|
|
97
|
+
this.partitionKey = parameters.partitionKey;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
81
101
|
export class WorkflowSuspendNotSupportedError extends WeftError {
|
|
82
102
|
constructor(message) {
|
|
83
103
|
super("WorkflowSuspendNotSupportedError", message);
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
* @module core/engine/event-log-compaction
|
|
19
19
|
*/
|
|
20
20
|
import type { BatchOperation, Storage } from '../../storage/interface.ts';
|
|
21
|
+
import { type CheckpointReplayPayload } from './checkpoint-replay.ts';
|
|
21
22
|
/**
|
|
22
23
|
* Upper bound on event-log records deleted in a single compaction (one
|
|
23
24
|
* checkpoint commit). A workflow that enables `retentionWindow` with a large
|
|
@@ -52,6 +53,13 @@ export type EventLogWatermark = {
|
|
|
52
53
|
* deleted prefix — unambiguous across incremental batches.
|
|
53
54
|
*/
|
|
54
55
|
deletedThrough: number;
|
|
56
|
+
/**
|
|
57
|
+
* Internal replay deltas folded from compacted checkpoint events. Canonical
|
|
58
|
+
* checkpoints can prune consumed results only because recovery can seed replay
|
|
59
|
+
* from the event log; when old events are compacted, their replay deltas move
|
|
60
|
+
* here before deletion.
|
|
61
|
+
*/
|
|
62
|
+
checkpointReplay?: CheckpointReplayPayload;
|
|
55
63
|
};
|
|
56
64
|
/**
|
|
57
65
|
* Narrow an unknown decoded value to {@link EventLogWatermark}, rejecting
|