@lostgradient/weft 0.3.0 → 0.5.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 +61 -5
- package/dist/client/local-handles.d.ts +22 -0
- package/dist/client/local-handles.js +23 -0
- package/dist/client/local.d.ts +6 -3
- package/dist/client/local.js +12 -26
- 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 +46 -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 +136 -9
- 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 +6 -13
- package/dist/core/engine/operations-activity.js +26 -53
- package/dist/core/engine/operations-coordination.d.ts +10 -0
- package/dist/core/engine/operations-coordination.js +44 -9
- 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 +25 -6
- 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 +19 -19
- 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 +32 -32
- 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 +20 -20
- 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
|
@@ -2,6 +2,10 @@ import { hashBytes } from "../../runtime/portable.js";
|
|
|
2
2
|
import { KEYS } from "../../storage/interface.js";
|
|
3
3
|
import { decode, encode } from "../codec.js";
|
|
4
4
|
import { isWorkflowLogEntry } from "../event-log-shared.js";
|
|
5
|
+
import {
|
|
6
|
+
mergeCheckpointReplayPayloads,
|
|
7
|
+
readCheckpointReplayPayload
|
|
8
|
+
} from "./checkpoint-replay.js";
|
|
5
9
|
export const MAX_COMPACTION_BATCH = 1000;
|
|
6
10
|
export function isEventLogWatermark(value) {
|
|
7
11
|
if (typeof value !== "object" || value === null)
|
|
@@ -27,7 +31,7 @@ export async function readEventLogWatermark(storage, workflowId) {
|
|
|
27
31
|
export async function appendCompactionOperations(storage, workflowId, headSequence, retentionWindow, operations) {
|
|
28
32
|
if (retentionWindow === null)
|
|
29
33
|
return null;
|
|
30
|
-
const targetFirstSurviving = Math.max(0, headSequence - retentionWindow + 1),
|
|
34
|
+
const targetFirstSurviving = Math.max(0, headSequence - retentionWindow + 1), existing = await readEventLogWatermark(storage, workflowId), currentFloor = existing?.sequence ?? 0, batchFirstSurviving = Math.min(targetFirstSurviving, currentFloor + MAX_COMPACTION_BATCH);
|
|
31
35
|
if (batchFirstSurviving <= currentFloor)
|
|
32
36
|
return null;
|
|
33
37
|
const collected = await collectDeleteRange(storage, workflowId, currentFloor, batchFirstSurviving);
|
|
@@ -38,7 +42,8 @@ export async function appendCompactionOperations(storage, workflowId, headSequen
|
|
|
38
42
|
version: 1,
|
|
39
43
|
sequence: batchFirstSurviving,
|
|
40
44
|
prevHash,
|
|
41
|
-
deletedThrough: batchFirstSurviving - 1
|
|
45
|
+
deletedThrough: batchFirstSurviving - 1,
|
|
46
|
+
...optionalCheckpointReplay(mergeDeletedCheckpointReplayPayloads(existing?.checkpointReplay, collected.deletedEntries))
|
|
42
47
|
};
|
|
43
48
|
for (let sequence = currentFloor;sequence < batchFirstSurviving; sequence += 1)
|
|
44
49
|
operations.push({ type: "delete", key: KEYS.event(workflowId, sequence) });
|
|
@@ -53,6 +58,19 @@ export async function appendCompactionOperations(storage, workflowId, headSequen
|
|
|
53
58
|
deletedRange: { from: currentFloor, to: batchFirstSurviving - 1 }
|
|
54
59
|
};
|
|
55
60
|
}
|
|
61
|
+
function optionalCheckpointReplay(checkpointReplay) {
|
|
62
|
+
return checkpointReplay === void 0 ? {} : { checkpointReplay };
|
|
63
|
+
}
|
|
64
|
+
function mergeDeletedCheckpointReplayPayloads(existing, deletedEntries) {
|
|
65
|
+
let merged = existing;
|
|
66
|
+
for (const bytes of deletedEntries) {
|
|
67
|
+
const decoded = decode(bytes);
|
|
68
|
+
if (!isWorkflowLogEntry(decoded))
|
|
69
|
+
continue;
|
|
70
|
+
merged = mergeCheckpointReplayPayloads(merged, readCheckpointReplayPayload(decoded.payload));
|
|
71
|
+
}
|
|
72
|
+
return merged;
|
|
73
|
+
}
|
|
56
74
|
async function collectDeleteRange(storage, workflowId, currentFloor, batchFirstSurviving) {
|
|
57
75
|
const deletedEntries = [];
|
|
58
76
|
let expected = currentFloor;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Step-2 epoch fencing for `ownership: 'lease'` (issue #470).
|
|
3
|
+
*
|
|
4
|
+
* Step 1 made a rolling deploy a clean lease handoff but added no correctness
|
|
5
|
+
* backstop: a deposed zombie instance (GC pause, partition) that emerged after
|
|
6
|
+
* its lease expired could still issue a plain durable write and corrupt the
|
|
7
|
+
* successor's state. Step 2 closes that hole by conditioning every
|
|
8
|
+
* engine-generator-owned per-workflow durable write on the held lease epoch, so
|
|
9
|
+
* a deposed instance's write loses its CAS instead of landing.
|
|
10
|
+
*
|
|
11
|
+
* The correctness guarantee lives entirely in the epoch CONDITION: a deposed
|
|
12
|
+
* instance's commit CAS-fails regardless of any in-process flag, because the
|
|
13
|
+
* successor bumped `lease:epoch` when it took over. The {@link EngineInternals.deposed}
|
|
14
|
+
* flag and the engine teardown are hygiene on top of that — they stop the engine
|
|
15
|
+
* from silently spinning on swallowed write losses, surface the deposition to the
|
|
16
|
+
* operator, and release resources. They are not what makes the system safe.
|
|
17
|
+
*
|
|
18
|
+
* This module is allow-listed for import only from `src/core/engine/**`.
|
|
19
|
+
*/
|
|
20
|
+
import type { BatchOperation, ConditionalBatchCondition } from '../../storage/interface.ts';
|
|
21
|
+
import type { EngineInternals } from './internals.ts';
|
|
22
|
+
/**
|
|
23
|
+
* Reject an engine-owned work entry point (start, startOrSignal, fork, resume)
|
|
24
|
+
* when `ownership: 'lease'` is configured but the engine does not currently hold
|
|
25
|
+
* the lease. The lease is acquired at the two boot gates ({@link Engine.create}
|
|
26
|
+
* and {@link Engine.recoverAll}); a directly constructed engine that does engine
|
|
27
|
+
* work before `recoverAll()` would otherwise durably write workflow state without
|
|
28
|
+
* single-writer ownership and without having recovered existing runs. Placed at
|
|
29
|
+
* each public awaited entry so the caller gets a clean {@link EngineLeaseNotHeldError}
|
|
30
|
+
* — without this, fork/resume would reach `resolveFenceEpochOrHalt` with no held
|
|
31
|
+
* epoch and be misreported as a deposition (warn + teardown) rather than the true
|
|
32
|
+
* "lease not held yet" condition. A no-op under `ownership: 'none'`.
|
|
33
|
+
*/
|
|
34
|
+
export declare function assertLeaseHeldForEngineWork(internals: EngineInternals): void;
|
|
35
|
+
/**
|
|
36
|
+
* Commit an engine-generator-owned durable write, fenced on the held lease epoch
|
|
37
|
+
* under `ownership: 'lease'` (a byte-for-byte no-op under `ownership: 'none'`). A
|
|
38
|
+
* lost CAS race throws the caller-supplied `onLostRace` error so existing retry
|
|
39
|
+
* semantics apply; a deposition halts the engine and throws
|
|
40
|
+
* {@link EngineDeposedError}. The helper owns the batch-vs-conditionalBatch
|
|
41
|
+
* decision — pass plain operations plus whatever base conditions you already need.
|
|
42
|
+
*
|
|
43
|
+
* @param internals - the engine internals (ownership mode, lease manager, deposed flag)
|
|
44
|
+
* @param operations - the durable operations to commit atomically
|
|
45
|
+
* @param baseConditions - CAS conditions the caller already requires (may be empty)
|
|
46
|
+
* @param onLostRace - builds the error thrown on a same-epoch lost CAS race
|
|
47
|
+
*/
|
|
48
|
+
export declare function commitFencedEngineWrite(internals: EngineInternals, operations: BatchOperation[], baseConditions: ConditionalBatchCondition[], onLostRace: () => Error): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Like {@link commitFencedEngineWrite}, but the caller treats a base-precondition
|
|
51
|
+
* failure as a legitimate outcome rather than an error — used by the idempotent
|
|
52
|
+
* start path, where a `false` means a concurrent same-key caller already wrote the
|
|
53
|
+
* record (resolve to the existing run) rather than "retry". Returns `true` when the
|
|
54
|
+
* batch committed and `false` when a base condition failed. Deposition is still a
|
|
55
|
+
* hard halt: if the epoch condition is the one that failed, this drives
|
|
56
|
+
* {@link handleDeposition} and throws {@link EngineDeposedError} — a deposed engine
|
|
57
|
+
* must never report a precondition-failure the caller would read as "already exists"
|
|
58
|
+
* and silently move on.
|
|
59
|
+
*
|
|
60
|
+
* @param internals - the engine internals
|
|
61
|
+
* @param operations - the durable operations to commit atomically
|
|
62
|
+
* @param baseConditions - the caller's required CAS conditions (non-empty in
|
|
63
|
+
* practice — this path is for conditional starts, which always carry one)
|
|
64
|
+
*/
|
|
65
|
+
export declare function commitFencedEngineWriteAllowingPreconditionFailure(internals: EngineInternals, operations: BatchOperation[], baseConditions: ConditionalBatchCondition[]): Promise<boolean>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { KEYS, storageConditionalBatch } from "../../storage/interface.js";
|
|
2
|
+
import { decodeEpoch } from "./lease-codec.js";
|
|
3
|
+
import { handleDeposition } from "./lease-deposition.js";
|
|
4
|
+
import { EngineDeposedError, EngineLeaseNotHeldError } from "./lease-errors.js";
|
|
5
|
+
export function assertLeaseHeldForEngineWork(internals) {
|
|
6
|
+
if (internals.options.ownershipMode !== "lease")
|
|
7
|
+
return;
|
|
8
|
+
if (!(!internals.deposed && internals.leaseManager !== null && internals.leaseManager.currentEpochBytes() !== null))
|
|
9
|
+
throw new EngineLeaseNotHeldError;
|
|
10
|
+
}
|
|
11
|
+
async function fencedCommit(internals, operations, baseConditions) {
|
|
12
|
+
const epochBytes = resolveFenceEpochOrHalt(internals);
|
|
13
|
+
if (epochBytes === null) {
|
|
14
|
+
if (baseConditions.length === 0) {
|
|
15
|
+
await internals.storage.batch(operations);
|
|
16
|
+
return "committed";
|
|
17
|
+
}
|
|
18
|
+
return await storageConditionalBatch(internals.storage, baseConditions, operations) ? "committed" : "lost-race";
|
|
19
|
+
}
|
|
20
|
+
const conditions = [
|
|
21
|
+
...baseConditions,
|
|
22
|
+
{ key: KEYS.leaseEpoch(), expectedValue: epochBytes }
|
|
23
|
+
];
|
|
24
|
+
if (await storageConditionalBatch(internals.storage, conditions, operations))
|
|
25
|
+
return "committed";
|
|
26
|
+
if (await isDeposed(internals, epochBytes)) {
|
|
27
|
+
handleDeposition(internals);
|
|
28
|
+
throw new EngineDeposedError;
|
|
29
|
+
}
|
|
30
|
+
return "lost-race";
|
|
31
|
+
}
|
|
32
|
+
function resolveFenceEpochOrHalt(internals) {
|
|
33
|
+
if (internals.deposed)
|
|
34
|
+
throw new EngineDeposedError;
|
|
35
|
+
if (internals.options.ownershipMode !== "lease")
|
|
36
|
+
return null;
|
|
37
|
+
const epochBytes = internals.leaseManager?.currentEpochBytes() ?? null;
|
|
38
|
+
if (epochBytes === null) {
|
|
39
|
+
handleDeposition(internals);
|
|
40
|
+
throw new EngineDeposedError;
|
|
41
|
+
}
|
|
42
|
+
return epochBytes;
|
|
43
|
+
}
|
|
44
|
+
export async function commitFencedEngineWrite(internals, operations, baseConditions, onLostRace) {
|
|
45
|
+
if (await fencedCommit(internals, operations, baseConditions) === "lost-race")
|
|
46
|
+
throw onLostRace();
|
|
47
|
+
}
|
|
48
|
+
export async function commitFencedEngineWriteAllowingPreconditionFailure(internals, operations, baseConditions) {
|
|
49
|
+
return await fencedCommit(internals, operations, baseConditions) === "committed";
|
|
50
|
+
}
|
|
51
|
+
function epochBytesEqual(a, b) {
|
|
52
|
+
if (b === null || a.byteLength !== b.byteLength)
|
|
53
|
+
return !1;
|
|
54
|
+
for (let index = 0;index < a.byteLength; index += 1)
|
|
55
|
+
if (a[index] !== b[index])
|
|
56
|
+
return !1;
|
|
57
|
+
return !0;
|
|
58
|
+
}
|
|
59
|
+
async function isDeposed(internals, heldEpochBytes) {
|
|
60
|
+
let currentEpochRaw;
|
|
61
|
+
try {
|
|
62
|
+
currentEpochRaw = await internals.storage.get(KEYS.leaseEpoch());
|
|
63
|
+
} catch {
|
|
64
|
+
return !0;
|
|
65
|
+
}
|
|
66
|
+
if (currentEpochRaw === null)
|
|
67
|
+
return !0;
|
|
68
|
+
if (decodeEpoch(currentEpochRaw) === null)
|
|
69
|
+
return !0;
|
|
70
|
+
return !epochBytesEqual(heldEpochBytes, currentEpochRaw);
|
|
71
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { EngineInternals } from './internals.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Engine-side handler for `ctx.setFinalizerState(value)` (issue #446). Durably
|
|
4
|
+
* records the payload associated with the workflow's definition-level
|
|
5
|
+
* `finalizer` activity.
|
|
6
|
+
*
|
|
7
|
+
* This handler only records the value; the engine passes the decoded payload as
|
|
8
|
+
* the finalizer's input when it drives cancel/timeout teardown (#446 Phase 2).
|
|
9
|
+
*
|
|
10
|
+
* The value is staged as a pending atomic side-effect — a `put` of
|
|
11
|
+
* {@link KEYS.finalizerState} — that commits with whichever durable write lands
|
|
12
|
+
* first: the next checkpoint/suspend commit, or, if no checkpoint runs before the
|
|
13
|
+
* workflow terminates, the terminal `updateWorkflowState` batch
|
|
14
|
+
* (`includePendingAtomicSideEffects` is set for terminal transitions). Either way
|
|
15
|
+
* the resource id is durable before teardown is driven: a cancel arriving before
|
|
16
|
+
* the next checkpoint still flushes the staged op in the terminal batch, so the
|
|
17
|
+
* finalizer always sees the resource id. The staged op inherits the lease-epoch
|
|
18
|
+
* fence (#470) for free, since checkpoint and terminal commits route through
|
|
19
|
+
* `commitFencedWorkflowStateOperations`.
|
|
20
|
+
*
|
|
21
|
+
* Oversized payloads are rejected before staging (the same hostile-input guard
|
|
22
|
+
* activity results use). A call made once the workflow is already terminalizing
|
|
23
|
+
* — e.g. from an `onCancel` handler, which runs after the terminal batch has
|
|
24
|
+
* already taken the pending side-effects — is a no-op: the staged op has no
|
|
25
|
+
* future commit to ride and is cleared on terminal cleanup. A development
|
|
26
|
+
* warning is emitted so the footgun is visible, but no error is thrown.
|
|
27
|
+
*/
|
|
28
|
+
export declare function recordFinalizerState(internals: EngineInternals, workflowId: string, value: unknown): void;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { KEYS } from "../../storage/interface.js";
|
|
2
|
+
import { encode } from "../codec.js";
|
|
3
|
+
import { assertPayloadWithinLimit } from "../payload-size.js";
|
|
4
|
+
import { stageAtomicWorkflowCommitSideEffects } from "./checkpoint-side-effects.js";
|
|
5
|
+
export function recordFinalizerState(internals, workflowId, value) {
|
|
6
|
+
if (internals.terminalizingWorkflows.has(workflowId)) {
|
|
7
|
+
if (internals.options.development)
|
|
8
|
+
console.warn(`[weft] ctx.setFinalizerState() called for workflow "${workflowId}" after it began terminalizing; the value is ignored. Record finalizer state while the workflow is still running.`);
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
assertPayloadWithinLimit(value, internals.options.payloadSizePolicy.maxBytes, "finalizer state");
|
|
12
|
+
stageAtomicWorkflowCommitSideEffects(internals, workflowId, {
|
|
13
|
+
conditions: [],
|
|
14
|
+
operations: [{ type: "put", key: KEYS.finalizerState(workflowId), value: encode(value) }]
|
|
15
|
+
});
|
|
16
|
+
}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import type { LaunchMetadata, QueryDefinition, SearchAttributeValue, SignalDefinition, SignalDeliveryOptions, UpdateDefinition, WorkflowState } from '../types.ts';
|
|
2
2
|
import type { WorkflowSnapshot } from '../types/workflow-snapshot.ts';
|
|
3
|
+
/**
|
|
4
|
+
* Which atomic path a `startOrSignal` call took, returned alongside the
|
|
5
|
+
* {@link WorkflowHandle} in `StartOrSignalResult` (not a field on the handle —
|
|
6
|
+
* converged concurrent callers share one cached engine handle, so the outcome
|
|
7
|
+
* rides the per-call result instead). `'started'` when the call created the
|
|
8
|
+
* run, `'signalled'` when it delivered a signal to a run that already existed.
|
|
9
|
+
*/
|
|
10
|
+
export type StartOrSignalOutcome = 'started' | 'signalled';
|
|
3
11
|
export declare function getWorkflowExecutionStartedAt(state: Pick<WorkflowState, 'createdAt' | 'startedAt'>): number;
|
|
4
12
|
export declare const HANDLE_RESULT_PROMISE: unique symbol;
|
|
5
13
|
export interface WorkflowHandleEngine extends EventTarget {
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import { type Storage as WeftStorage } from '../../storage/interface.ts';
|
|
2
2
|
import { type ActivityMetadata, type ActivityRegistrationOptions, type RegisteredActivityFunction } from '../activity-registry.ts';
|
|
3
3
|
import type { StoredStreamChunk } from '../context.ts';
|
|
4
|
+
import type { TypedEventTarget, WeftEventMap } from '../events.ts';
|
|
4
5
|
import type { Interceptor } from '../interceptor.ts';
|
|
5
6
|
import { type ReviewRequest } from '../review/index.ts';
|
|
6
7
|
import { Scheduler } from '../scheduler.ts';
|
|
7
|
-
import { type AnyActivityDefinition, type AnyWorkflowDefinition, type AttributeFilterKey, type BulkCancelResult, type BulkDeleteResult, type BulkOperationCommitOptions, type BulkOperationDryRunOptions, type BulkOperationDryRunResult, type BulkSignalAllCommitOptions, type BulkSignalAllDryRunOptions, type BulkSignalResult, type BulkTagResult, type CheckpointState, type CheckpointSummary, type CoordinatedUpdateResult, type DefaultActivityTypes, type DefaultWorkflowRegistry, type ForkOptions, type InferActivityEntries, type InferActivityEntry, type InferWorkflowEntries, type InferWorkflowEntry, type ListFilter, type ListOptions, type PaginatedResult, type PurgeResult, type QueryDefinition, type RegisteredWorkflowDefinition, type RetentionOverview, type ReviewListEntry, type ReviewListFilter, type ScheduleDefinition, type ScheduleFilter, type ScheduleOptions, type ScheduleSpec, type ScheduleSummary, type SearchAttributeValue, type SignalDefinition, type SignalDeliveryOptions, type StartOptions, type StartOrSignalSignal, type SubmitReviewOptions, type TypedListFilter, type UpdateDefinition, type WorkflowEvent, type WorkflowInput, type WorkflowOutput, type WorkflowReplay, type WorkflowState, type WorkflowSummary, type WorkflowTimelineEntry } from '../types.ts';
|
|
8
|
+
import { type AnyActivityDefinition, type AnyWorkflowDefinition, type AttributeFilterKey, type BulkCancelResult, type BulkDeleteResult, type BulkOperationCommitOptions, type BulkOperationDryRunOptions, type BulkOperationDryRunResult, type BulkRetryFailedResult, type BulkSignalAllCommitOptions, type BulkSignalAllDryRunOptions, type BulkSignalResult, type BulkTagResult, type CheckpointState, type CheckpointSummary, type CoordinatedUpdateResult, type DefaultActivityTypes, type DefaultWorkflowRegistry, type ForkOptions, type InferActivityEntries, type InferActivityEntry, type InferWorkflowEntries, type InferWorkflowEntry, type ListFilter, type ListOptions, type PaginatedResult, type PurgeResult, type QueryDefinition, type RegisteredWorkflowDefinition, type RetentionOverview, type ReviewListEntry, type ReviewListFilter, type ScheduleDefinition, type ScheduleFilter, type ScheduleOptions, type ScheduleSpec, type ScheduleSummary, type SearchAttributeValue, type SignalDefinition, type SignalDeliveryOptions, type StartOptions, type StartOrSignalSignal, type StartWorkflowOptions, type SubmitReviewOptions, type TypedListFilter, type UpdateDefinition, type WorkflowEvent, type WorkflowInput, type WorkflowOutput, type WorkflowReplay, type WorkflowServices, type WorkflowServicesUnion, type WorkflowState, type WorkflowSummary, type WorkflowTimelineEntry } from '../types.ts';
|
|
8
9
|
import type { TimerEntry } from '../types/checkpoint.ts';
|
|
9
10
|
import type { WorkflowAlreadyRegistered } from '../types/workflow-builder.ts';
|
|
10
11
|
import { type AggregateOptions, type AggregateResult } from './aggregate.ts';
|
|
11
12
|
import { type EmptyActivityDefinitions, type EmptyWorkflowDefinitions, type KnownWorkflowNames } from './construction.ts';
|
|
12
|
-
import { type ActivityDefinitionName, type EngineCreateOptions, type RegisteredActivityDefinitionExecute, type UnknownWorkflowNameWhenDefaultRegistryIsEmpty } from './engine-create-types.ts';
|
|
13
|
+
import { type ActivityDefinitionName, type EngineCreateOptions, type EngineCreateWorkflowRegistry, type RegisteredActivityDefinitionExecute, type UnknownWorkflowNameWhenDefaultRegistryIsEmpty } from './engine-create-types.ts';
|
|
13
14
|
import type { EngineConstructorOptions } from './engine-internal-types.ts';
|
|
14
15
|
import type { EngineStateNamespace } from './engine-state-namespace.ts';
|
|
15
16
|
import { HANDLE_RESULT_PROMISE, WorkflowHandle } from './handles.ts';
|
|
16
|
-
import {
|
|
17
|
+
import { ENGINE_LEASE_LOST_WARNING_NAME } from './lease-deposition.ts';
|
|
18
|
+
import { type RecoverAllOptions, type StartOrSignalResult } from './lifecycle.ts';
|
|
17
19
|
import { assertCompatiblePersistedDataVersion } from './persisted-data-version.ts';
|
|
18
20
|
import { ScheduleHandle } from './schedule-handle.ts';
|
|
19
21
|
import { type WorkflowFeedListener, type WorkflowFeedRecord, type WorkflowFeedSelector } from './workflow-feed.ts';
|
|
@@ -21,8 +23,9 @@ export { ActivityReconciliationCapabilityError, ActivityReconciliationConflictEr
|
|
|
21
23
|
export { AsyncActivityTokenNotFoundError } from './async-activity-completion.ts';
|
|
22
24
|
export type { PendingAsyncActivity } from './async-activity-completion.ts';
|
|
23
25
|
export type { PendingTimelineEntry, RegistrationEntry, ResolvedOptions, TrackedWaiterKeys, WorkflowResultWaiter, } from './engine-internal-types.ts';
|
|
24
|
-
export { ActivityResolutionError, BulkDeleteRequiresTerminalWorkflowsError, BulkOperationConfirmationError, EngineCreateNameMismatchError, EngineDisposedError, IdempotencyKeyPurgedError, PersistedDataIncompatibleError, StartOrSignalConflictError, WorkflowAlreadyExistsError, WorkflowNotFoundError, WorkflowNotRegisteredError, WorkflowSuspendNotSupportedError, WorkflowTypeNotRegisteredForRecoveryError, } from './errors.ts';
|
|
26
|
+
export { ActivityResolutionError, BulkDeleteRequiresTerminalWorkflowsError, BulkOperationConfirmationError, EngineCreateNameMismatchError, EngineDisposedError, IdempotencyKeyPurgedError, PersistedDataIncompatibleError, StartOrSignalConflictError, WorkflowAlreadyExistsError, WorkflowConcurrencyLimitExceededError, WorkflowNotFoundError, WorkflowNotRegisteredError, WorkflowSuspendNotSupportedError, WorkflowTeardownPendingError, WorkflowTypeNotRegisteredForRecoveryError, } from './errors.ts';
|
|
25
27
|
export { HANDLE_RESULT_PROMISE, WorkflowHandle } from './handles.ts';
|
|
28
|
+
export { EngineLeaseAcquisitionTimeoutError, EngineLeaseCorruptedError, EngineLeaseNotHeldError, } from './lease-errors.ts';
|
|
26
29
|
export type { RecoverAllOptions } from './lifecycle.ts';
|
|
27
30
|
export { ScheduleHandle } from './schedule-handle.ts';
|
|
28
31
|
export type { WorkflowFeedListener, WorkflowFeedRecord, WorkflowFeedSelector, } from './workflow-feed.ts';
|
|
@@ -33,6 +36,7 @@ export { assertCompatiblePersistedDataVersion };
|
|
|
33
36
|
export declare const ENGINE_PARKED_WORKFLOW_COUNT_FOR_TESTING: unique symbol;
|
|
34
37
|
export declare const ENGINE_SIGNAL_WAITER_COUNT_FOR_TESTING: unique symbol;
|
|
35
38
|
export declare const ENGINE_SLEEP_RESOLVER_COUNT_FOR_TESTING: unique symbol;
|
|
39
|
+
export { ENGINE_LEASE_LOST_WARNING_NAME };
|
|
36
40
|
/**
|
|
37
41
|
* Durable execution engine.
|
|
38
42
|
*
|
|
@@ -75,7 +79,7 @@ export declare const ENGINE_SLEEP_RESOLVER_COUNT_FOR_TESTING: unique symbol;
|
|
|
75
79
|
* void engine;
|
|
76
80
|
* ```
|
|
77
81
|
*/
|
|
78
|
-
export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry, TActivities extends object = DefaultActivityTypes> extends EventTarget implements Disposable, AsyncDisposable {
|
|
82
|
+
export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry, TActivities extends object = DefaultActivityTypes> extends EventTarget implements Disposable, AsyncDisposable, TypedEventTarget<WeftEventMap> {
|
|
79
83
|
#private;
|
|
80
84
|
/**
|
|
81
85
|
* Construct and register an engine in one step. Activities are registered
|
|
@@ -105,7 +109,7 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
|
|
|
105
109
|
static create<TWorkflowDefinitions extends Record<string, AnyWorkflowDefinition>>(options: EngineCreateOptions<TWorkflowDefinitions, EmptyActivityDefinitions> & {
|
|
106
110
|
activities?: undefined;
|
|
107
111
|
workflows: TWorkflowDefinitions;
|
|
108
|
-
}): Promise<Engine<
|
|
112
|
+
}): Promise<Engine<EngineCreateWorkflowRegistry<TWorkflowDefinitions>>>;
|
|
109
113
|
static create<TActivityDefinitions extends Record<string, AnyActivityDefinition>>(options: EngineCreateOptions<EmptyWorkflowDefinitions, TActivityDefinitions> & {
|
|
110
114
|
activities: TActivityDefinitions;
|
|
111
115
|
workflows?: undefined;
|
|
@@ -113,8 +117,12 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
|
|
|
113
117
|
static create<TWorkflowDefinitions extends Record<string, AnyWorkflowDefinition>, TActivityDefinitions extends Record<string, AnyActivityDefinition>>(options: EngineCreateOptions<TWorkflowDefinitions, TActivityDefinitions> & {
|
|
114
118
|
activities: TActivityDefinitions;
|
|
115
119
|
workflows: TWorkflowDefinitions;
|
|
116
|
-
}): Promise<Engine<
|
|
117
|
-
constructor(options?: EngineConstructorOptions);
|
|
120
|
+
}): Promise<Engine<EngineCreateWorkflowRegistry<TWorkflowDefinitions>, InferActivityEntries<TActivityDefinitions>>>;
|
|
121
|
+
constructor(options?: EngineConstructorOptions<WorkflowServicesUnion<TWorkflows>>);
|
|
122
|
+
addEventListener<K extends Extract<keyof WeftEventMap, string>>(type: K, listener: (event: WeftEventMap[K]) => void, options?: boolean | AddEventListenerOptions): void;
|
|
123
|
+
addEventListener(type: string, listener: EventListenerOrEventListenerObject | null, options?: boolean | AddEventListenerOptions): void;
|
|
124
|
+
removeEventListener<K extends Extract<keyof WeftEventMap, string>>(type: K, listener: (event: WeftEventMap[K]) => void, options?: boolean | EventListenerOptions): void;
|
|
125
|
+
removeEventListener(type: string, listener: EventListenerOrEventListenerObject | null, options?: boolean | EventListenerOptions): void;
|
|
118
126
|
get state(): EngineStateNamespace;
|
|
119
127
|
/**
|
|
120
128
|
* Register a workflow by name or definition, or register an activity
|
|
@@ -186,8 +194,8 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
|
|
|
186
194
|
listWorkflowDefinitions(): RegisteredWorkflowDefinition[];
|
|
187
195
|
getActivityDefinition(name: string): ActivityMetadata | undefined;
|
|
188
196
|
listActivityDefinitions(): ActivityMetadata[];
|
|
189
|
-
start<TName extends KnownWorkflowNames<TWorkflows>>(type: TName, input: WorkflowInput<TWorkflows, TName>, options?:
|
|
190
|
-
start<TName extends string>(type: UnknownWorkflowNameWhenDefaultRegistryIsEmpty<TWorkflows, TName>, input: unknown, options?:
|
|
197
|
+
start<TName extends KnownWorkflowNames<TWorkflows>>(type: TName, input: WorkflowInput<TWorkflows, TName>, options?: StartWorkflowOptions<WorkflowServices<TWorkflows, TName>>): Promise<WorkflowHandle<WorkflowOutput<TWorkflows, TName>>>;
|
|
198
|
+
start<TName extends string>(type: UnknownWorkflowNameWhenDefaultRegistryIsEmpty<TWorkflows, TName>, input: unknown, options?: StartWorkflowOptions): Promise<WorkflowHandle>;
|
|
191
199
|
/**
|
|
192
200
|
* Atomically start a workflow or signal it if it already exists
|
|
193
201
|
* (signal-with-start). With an absent target, the workflow record and the
|
|
@@ -205,8 +213,8 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
|
|
|
205
213
|
* are `options.id` and `options.idempotencyKey`. Requires a storage backend
|
|
206
214
|
* with `conditionalBatch`.
|
|
207
215
|
*/
|
|
208
|
-
startOrSignal<TName extends KnownWorkflowNames<TWorkflows>>(type: TName, input: WorkflowInput<TWorkflows, TName>, signal: StartOrSignalSignal, options?: StartOptions): Promise<
|
|
209
|
-
startOrSignal<TName extends string>(type: UnknownWorkflowNameWhenDefaultRegistryIsEmpty<TWorkflows, TName>, input: unknown, signal: StartOrSignalSignal, options?: StartOptions): Promise<
|
|
216
|
+
startOrSignal<TName extends KnownWorkflowNames<TWorkflows>>(type: TName, input: WorkflowInput<TWorkflows, TName>, signal: StartOrSignalSignal, options?: StartOptions<WorkflowServices<TWorkflows, TName>>): Promise<StartOrSignalResult<WorkflowOutput<TWorkflows, TName>>>;
|
|
217
|
+
startOrSignal<TName extends string>(type: UnknownWorkflowNameWhenDefaultRegistryIsEmpty<TWorkflows, TName>, input: unknown, signal: StartOrSignalSignal, options?: StartOptions): Promise<StartOrSignalResult>;
|
|
210
218
|
getHandle(workflowId: string): WorkflowHandle;
|
|
211
219
|
list<const TAttributeKeys extends readonly AttributeFilterKey[] = readonly AttributeFilterKey[]>(filter?: TypedListFilter<TAttributeKeys>, options?: ListOptions): Promise<PaginatedResult<WorkflowSummary>>;
|
|
212
220
|
aggregate(filter: ListFilter | undefined, options: AggregateOptions): Promise<AggregateResult>;
|
|
@@ -214,6 +222,8 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
|
|
|
214
222
|
purge(filter?: ListFilter): Promise<PurgeResult>;
|
|
215
223
|
cancelAll(filter: ListFilter, options: BulkOperationDryRunOptions): Promise<BulkOperationDryRunResult>;
|
|
216
224
|
cancelAll(filter: ListFilter, options?: BulkOperationCommitOptions): Promise<BulkCancelResult>;
|
|
225
|
+
retryFailedAll(filter: ListFilter, options: BulkOperationDryRunOptions): Promise<BulkOperationDryRunResult>;
|
|
226
|
+
retryFailedAll(filter: ListFilter, options?: BulkOperationCommitOptions): Promise<BulkRetryFailedResult>;
|
|
217
227
|
signalAll(filter: ListFilter, name: string, payload: unknown, options: BulkSignalAllDryRunOptions): Promise<BulkOperationDryRunResult>;
|
|
218
228
|
signalAll(filter: ListFilter, name: string, payload: unknown, options: BulkSignalAllCommitOptions): Promise<BulkSignalResult>;
|
|
219
229
|
signalAll(filter: ListFilter, name: string, payload?: unknown, options?: BulkOperationCommitOptions): Promise<BulkSignalResult>;
|
|
@@ -231,7 +241,7 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
|
|
|
231
241
|
* Two call forms:
|
|
232
242
|
* - A {@link ScheduleDefinition} object: `engine.schedule({ workflow, cron, input })`.
|
|
233
243
|
* Carries the workflow (definition or type name), the `cron`/`every` spec,
|
|
234
|
-
* optional `input`, `id`, `overlapPolicy`, and `
|
|
244
|
+
* optional `input`, `id`, `overlapPolicy`, `backfill`, and `jitter`.
|
|
235
245
|
* - Positional: `engine.schedule(type, input, spec, options?)` where `spec` is
|
|
236
246
|
* a cron string or a {@link ScheduleSpec} (`{ cron }` or `{ every }`).
|
|
237
247
|
*
|
|
@@ -325,7 +335,7 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
|
|
|
325
335
|
* registered workflow type on this engine.
|
|
326
336
|
*
|
|
327
337
|
* `acknowledgeUnknownWorkflowTypes` is a dangerous escape hatch for rolling
|
|
328
|
-
* deploys or explicit storage
|
|
338
|
+
* deploys or explicit operator storage repair.
|
|
329
339
|
* When set, unknown workflow types are skipped and reported through
|
|
330
340
|
* {@link WorkflowRecoverySkippedEvent}.
|
|
331
341
|
*/
|
|
@@ -335,7 +345,11 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
|
|
|
335
345
|
* have parked itself via `ActivityContext.completeAsync()`; pass the durable
|
|
336
346
|
* task token announced through the `activity:async-pending` event (or
|
|
337
347
|
* persisted by your callback dispatcher). The parked workflow resumes as
|
|
338
|
-
* though the activity had returned `result` inline.
|
|
348
|
+
* though the activity had returned `result` inline. During recovery, a
|
|
349
|
+
* completion that arrives after token recovery but before replay adopts the
|
|
350
|
+
* workflow generator is buffered and delivered when replay reaches the same
|
|
351
|
+
* async-activity token. Await `recoverAll()` before accepting callback traffic
|
|
352
|
+
* when your application needs startup ordering to be fully deterministic.
|
|
339
353
|
*
|
|
340
354
|
* @throws {AsyncActivityTokenNotFoundError} when no pending activity matches
|
|
341
355
|
* the token (unknown, or already completed/failed — tokens are single-use).
|
|
@@ -345,7 +359,11 @@ export declare class Engine<TWorkflows extends object = DefaultWorkflowRegistry,
|
|
|
345
359
|
* Fail a deferred activity out-of-band with `error`. The error is thrown into
|
|
346
360
|
* the workflow generator at the parked step — identical to an inline activity
|
|
347
361
|
* that threw — so the workflow's own try/catch and any configured retry
|
|
348
|
-
* policy apply unchanged.
|
|
362
|
+
* policy apply unchanged. During recovery, a failure that arrives after token
|
|
363
|
+
* recovery but before replay adopts the workflow generator is buffered and
|
|
364
|
+
* delivered when replay reaches the same async-activity token. Await
|
|
365
|
+
* `recoverAll()` before accepting callback traffic when your application needs
|
|
366
|
+
* startup ordering to be fully deterministic.
|
|
349
367
|
*
|
|
350
368
|
* @throws {AsyncActivityTokenNotFoundError} when no pending activity matches
|
|
351
369
|
* the token (unknown, or already completed/failed — tokens are single-use).
|