@lostgradient/weft 0.2.1 → 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 +123 -43
- package/dist/cli/conformance.js +7 -1
- package/dist/cli/generated/operation-client.generated.d.ts +55 -13
- package/dist/cli/generated/operation-client.generated.js +3 -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 +80 -79
- package/dist/client/handle-delegation.d.ts +7 -2
- package/dist/client/handle-delegation.js +9 -1
- package/dist/client/http-client-requests.d.ts +4 -1
- package/dist/client/http-client-requests.js +10 -0
- package/dist/client/http-client.d.ts +10 -4
- package/dist/client/http-client.js +18 -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 +100 -4
- package/dist/client/local.d.ts +7 -1
- package/dist/client/local.js +17 -2
- package/dist/client/start-body.d.ts +9 -2
- package/dist/client/start-body.js +13 -4
- 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 +104 -8
- package/dist/core/codec/index.d.ts +1 -0
- package/dist/core/codec/index.js +1 -0
- package/dist/core/codec/serializer-registry.d.ts +122 -0
- package/dist/core/codec/serializer-registry.js +51 -0
- 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 +18 -5
- package/dist/core/context/index.js +17 -12
- package/dist/core/context/internals.d.ts +29 -0
- package/dist/core/context/internals.js +6 -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 +21 -3
- package/dist/core/context/run-operation.js +56 -93
- 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 -1
- package/dist/core/engine/construction.js +30 -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 +25 -0
- package/dist/core/engine/engine-create-types.d.ts +14 -18
- package/dist/core/engine/engine-internal-types.d.ts +38 -3
- package/dist/core/engine/engine-leak-warnings.d.ts +6 -0
- package/dist/core/engine/engine-leak-warnings.js +4 -0
- package/dist/core/engine/engine-runtime-helpers.d.ts +17 -0
- package/dist/core/engine/engine-runtime-helpers.js +26 -5
- package/dist/core/engine/errors.d.ts +121 -0
- package/dist/core/engine/errors.js +45 -1
- 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/handle-result.js +1 -1
- package/dist/core/engine/handles.d.ts +97 -40
- package/dist/core/engine/handles.js +25 -27
- package/dist/core/engine/index.d.ts +125 -15
- package/dist/core/engine/index.js +207 -11
- package/dist/core/engine/inline-launch-queue.d.ts +14 -0
- package/dist/core/engine/inline-launch-queue.js +32 -7
- package/dist/core/engine/inline-parking.js +3 -2
- package/dist/core/engine/internals.d.ts +125 -13
- 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/fork-helpers.js +1 -7
- package/dist/core/engine/lifecycle/persist.js +15 -52
- 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 +39 -11
- 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 +56 -0
- package/dist/core/engine/lifecycle/start-commit.js +69 -0
- package/dist/core/engine/lifecycle/start-exec.d.ts +30 -2
- package/dist/core/engine/lifecycle/start-exec.js +38 -0
- 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-resolution.d.ts +79 -0
- package/dist/core/engine/lifecycle/start-or-signal-resolution.js +60 -0
- package/dist/core/engine/lifecycle/start-or-signal.d.ts +46 -0
- package/dist/core/engine/lifecycle/start-or-signal.js +71 -0
- 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 +6 -6
- package/dist/core/engine/lifecycle/start.js +47 -45
- package/dist/core/engine/lifecycle/transition.js +17 -5
- package/dist/core/engine/lifecycle.d.ts +3 -2
- package/dist/core/engine/lifecycle.js +9 -2
- package/dist/core/engine/list-candidate-resolution.js +2 -2
- package/dist/core/engine/listing.js +10 -6
- 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/persisted-data-version.d.ts +5 -9
- package/dist/core/engine/persisted-data-version.js +4 -5
- 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-handle.d.ts +45 -0
- package/dist/core/engine/schedule-handle.js +26 -0
- 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 +8 -5
- package/dist/core/engine/schedules.js +44 -19
- 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/second-instance-detector.d.ts +96 -0
- package/dist/core/engine/second-instance-detector.js +108 -0
- package/dist/core/engine/signals.d.ts +38 -0
- package/dist/core/engine/signals.js +55 -19
- 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 +28 -1
- package/dist/core/engine/termination/cleanup.js +44 -2
- package/dist/core/engine/termination/complete.js +48 -9
- 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 +70 -0
- package/dist/core/engine/termination/suspend.js +41 -0
- package/dist/core/engine/termination.d.ts +5 -2
- package/dist/core/engine/termination.js +6 -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 +54 -3
- 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 +9 -8
- 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 +19 -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 +108 -20
- package/dist/core/events/workflow-events.js +35 -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/list-filter-validation.js +2 -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 +56 -0
- package/dist/core/start-workflow-validation.js +30 -1
- package/dist/core/step-context.d.ts +10 -6
- package/dist/core/step-context.js +7 -15
- 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 +86 -64
- package/dist/core/types/bulk.d.ts +50 -9
- package/dist/core/types/checkpoint.d.ts +44 -8
- package/dist/core/types/identity.d.ts +8 -1
- package/dist/core/types/launch-metadata.d.ts +33 -0
- package/dist/core/types/launch-metadata.js +0 -0
- package/dist/core/types/list-options.d.ts +146 -0
- package/dist/core/types/list-options.js +0 -0
- package/dist/core/types/message-handles.d.ts +25 -0
- package/dist/core/types/options.d.ts +165 -215
- package/dist/core/types/reviews.d.ts +2 -1
- package/dist/core/types/schedules.d.ts +39 -3
- package/dist/core/types/services-resolution.d.ts +47 -0
- package/dist/core/types/services-resolution.js +0 -0
- package/dist/core/types/state.d.ts +11 -11
- 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 +47 -15
- 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 +101 -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/workflow-snapshot.d.ts +29 -0
- package/dist/core/types/workflow-snapshot.js +0 -0
- package/dist/core/types.d.ts +7 -0
- package/dist/core/types.js +7 -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 +19 -1
- 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/doctor.js +6 -3
- package/dist/diagnostics/format.js +3 -8
- package/dist/diagnostics/types.d.ts +5 -5
- package/dist/diagnostics/validate.d.ts +0 -1
- package/dist/diagnostics/version-check.d.ts +1 -1
- package/dist/diagnostics/version-check.js +10 -13
- package/dist/index.d.ts +13 -11
- package/dist/index.js +39 -4
- package/dist/json-schema.js +3 -3
- package/dist/mcp/cli.js +35 -35
- package/dist/mcp/dispatcher.js +1 -1
- package/dist/mcp/http.js +16 -6
- package/dist/mcp/list-filter.js +2 -1
- 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 +60 -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 +31 -31
- package/dist/server/index.d.ts +32 -2
- package/dist/server/index.js +35 -35
- package/dist/server/interactive-operations.js +1 -0
- 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/resume-workflow.js +2 -2
- 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 +44 -0
- package/dist/server/operations/start-or-signal-workflow.js +130 -0
- package/dist/server/operations/start-workflow-options.d.ts +38 -0
- package/dist/server/operations/start-workflow-options.js +63 -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 +15 -92
- 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/suspend-workflow.d.ts +13 -0
- package/dist/server/operations/suspend-workflow.js +36 -0
- 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 +21 -8
- package/dist/server/rest-bindings.js +24 -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-dispatch.js +5 -3
- package/dist/server/runtime/task-polling.d.ts +16 -2
- package/dist/server/runtime/task-polling.js +80 -24
- 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 +46 -30
- package/dist/server/serve-internals.d.ts +11 -1
- package/dist/server/serve-internals.js +20 -2
- package/dist/server/task-state.d.ts +38 -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 +31 -31
- package/dist/storage/auto.js +1 -1
- package/dist/storage/bun-sql.js +24 -0
- package/dist/storage/capabilities.d.ts +10 -2
- package/dist/storage/capabilities.js +2 -2
- 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 +81 -4
- package/dist/storage/indexeddb.js +1 -1
- package/dist/storage/interface.d.ts +189 -0
- package/dist/storage/interface.js +1 -1
- package/dist/storage/key-prefixes.d.ts +1 -1
- package/dist/storage/key-prefixes.js +12 -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 +74 -0
- package/dist/storage/neon-value-mapping.js +23 -0
- package/dist/storage/neon.d.ts +124 -0
- package/dist/storage/neon.js +15 -0
- package/dist/storage/node-sqlite-loader.d.ts +71 -0
- package/dist/storage/node-sqlite-loader.js +41 -0
- package/dist/storage/node-sqlite.d.ts +1 -19
- package/dist/storage/node-sqlite.js +61 -32
- package/dist/storage/postgres-key-value-queries.d.ts +104 -0
- package/dist/storage/postgres-key-value-queries.js +101 -0
- package/dist/storage/resolve.d.ts +2 -165
- package/dist/storage/resolve.js +1 -1
- package/dist/storage/scoped-storage.js +1 -1
- package/dist/storage/storage-configuration.d.ts +209 -0
- package/dist/storage/storage-configuration.js +0 -0
- package/dist/storage/testing.d.ts +168 -0
- package/dist/storage/testing.js +2 -0
- package/dist/storage/text-value-store.d.ts +9 -9
- 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 +35 -35
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker/index.js +9 -5
- package/dist/worker/long-poll.js +4 -0
- package/dist/worker/protocol-messages.d.ts +20 -0
- package/dist/worker/protocol-schemas.d.ts +32 -0
- package/dist/worker/protocol-schemas.js +8 -4
- package/dist/worker/protocol-task-result.d.ts +28 -0
- package/dist/worker/protocol-task-result.js +76 -0
- package/dist/worker/protocol.d.ts +4 -15
- package/dist/worker/protocol.js +1 -1
- package/dist/worker/registry/fair-share.d.ts +29 -0
- package/dist/worker/registry/fair-share.js +30 -0
- package/dist/worker/registry/routing.d.ts +18 -0
- package/dist/worker/registry/routing.js +14 -0
- package/dist/worker/registry/types.d.ts +7 -0
- package/dist/worker/registry.d.ts +16 -1
- package/dist/worker/registry.js +24 -36
- 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 +21 -4
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { KEYS } from "../../storage/interface.js";
|
|
2
|
+
import { AtomicState, atomicStateVersionKey, readAtomicStateSnapshot } from "../atomic-state.js";
|
|
3
|
+
import { decode, encode } from "../codec.js";
|
|
4
|
+
import {
|
|
5
|
+
initialLockRecord,
|
|
6
|
+
reduceRelease
|
|
7
|
+
} from "../concurrency.js";
|
|
8
|
+
import { WorkflowConcurrencyLimitExceededError } from "./errors.js";
|
|
9
|
+
const WORKFLOW_CONCURRENCY_HOLDER_VERSION = 1, NON_EXPIRING_WORKFLOW_CONCURRENCY_LEASE = Number.MAX_SAFE_INTEGER;
|
|
10
|
+
function encodeVersionCondition(dataKey, version) {
|
|
11
|
+
return {
|
|
12
|
+
key: atomicStateVersionKey(dataKey),
|
|
13
|
+
expectedValue: version === 0 ? null : encode(version)
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function normalizeLockRecord(record) {
|
|
17
|
+
if (record === void 0)
|
|
18
|
+
return initialLockRecord();
|
|
19
|
+
return {
|
|
20
|
+
holders: Array.isArray(record.holders) ? record.holders : [],
|
|
21
|
+
waiters: Array.isArray(record.waiters) ? record.waiters : []
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
function liveWorkflowConcurrencyHolders(holders, now) {
|
|
25
|
+
return holders.filter((holder) => holder.leaseExpiresAt > now);
|
|
26
|
+
}
|
|
27
|
+
function acquireWorkflowConcurrencySlot(current, options) {
|
|
28
|
+
const record = normalizeLockRecord(current), holders = liveWorkflowConcurrencyHolders(record.holders, options.now);
|
|
29
|
+
if (holders.some((holder) => holder.holderId === options.workflowId))
|
|
30
|
+
return {
|
|
31
|
+
acquired: !0,
|
|
32
|
+
record: {
|
|
33
|
+
holders: holders.map((holder) => holder.holderId === options.workflowId ? {
|
|
34
|
+
holderId: options.workflowId,
|
|
35
|
+
leaseExpiresAt: NON_EXPIRING_WORKFLOW_CONCURRENCY_LEASE
|
|
36
|
+
} : holder),
|
|
37
|
+
waiters: []
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
if (holders.length >= options.limit)
|
|
41
|
+
return { acquired: !1, record: { holders, waiters: [] } };
|
|
42
|
+
return {
|
|
43
|
+
acquired: !0,
|
|
44
|
+
record: {
|
|
45
|
+
holders: [
|
|
46
|
+
...holders,
|
|
47
|
+
{
|
|
48
|
+
holderId: options.workflowId,
|
|
49
|
+
leaseExpiresAt: NON_EXPIRING_WORKFLOW_CONCURRENCY_LEASE
|
|
50
|
+
}
|
|
51
|
+
],
|
|
52
|
+
waiters: []
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function resolveWorkflowConcurrencyPartitionKey(workflowType, input, concurrency) {
|
|
57
|
+
if (concurrency.key === void 0)
|
|
58
|
+
return workflowType;
|
|
59
|
+
let partitionKey;
|
|
60
|
+
try {
|
|
61
|
+
partitionKey = concurrency.key(input);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
throw Error(`workflow("${workflowType}").concurrency.key threw while resolving the partition key: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
64
|
+
}
|
|
65
|
+
if (typeof partitionKey !== "string")
|
|
66
|
+
throw TypeError(`workflow("${workflowType}").concurrency.key must return a string partition key`);
|
|
67
|
+
return partitionKey;
|
|
68
|
+
}
|
|
69
|
+
function encodeHolderRecord(workflowType, partitionKey) {
|
|
70
|
+
return {
|
|
71
|
+
version: WORKFLOW_CONCURRENCY_HOLDER_VERSION,
|
|
72
|
+
workflowType,
|
|
73
|
+
partitionKey
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
function decodeHolderRecord(bytes) {
|
|
77
|
+
const decoded = decode(bytes);
|
|
78
|
+
if (typeof decoded !== "object" || decoded === null)
|
|
79
|
+
return null;
|
|
80
|
+
const record = decoded;
|
|
81
|
+
if (record.version !== WORKFLOW_CONCURRENCY_HOLDER_VERSION || typeof record.workflowType !== "string" || typeof record.partitionKey !== "string")
|
|
82
|
+
return null;
|
|
83
|
+
return {
|
|
84
|
+
version: WORKFLOW_CONCURRENCY_HOLDER_VERSION,
|
|
85
|
+
workflowType: record.workflowType,
|
|
86
|
+
partitionKey: record.partitionKey
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
export async function buildWorkflowConcurrencyStartOperations(internals, workflowType, workflowId, input, concurrency) {
|
|
90
|
+
const partitionKey = resolveWorkflowConcurrencyPartitionKey(workflowType, input, concurrency), stateKey = KEYS.workflowConcurrency(workflowType, partitionKey), snapshot = await readAtomicStateSnapshot(internals.storage, stateKey, {
|
|
91
|
+
initial: initialLockRecord()
|
|
92
|
+
}), acquired = acquireWorkflowConcurrencySlot(snapshot.value, {
|
|
93
|
+
workflowId,
|
|
94
|
+
now: internals.options.getNow(),
|
|
95
|
+
limit: concurrency.max
|
|
96
|
+
});
|
|
97
|
+
if (!acquired.acquired)
|
|
98
|
+
throw new WorkflowConcurrencyLimitExceededError({
|
|
99
|
+
workflowType,
|
|
100
|
+
limit: concurrency.max,
|
|
101
|
+
partitionKey
|
|
102
|
+
});
|
|
103
|
+
return {
|
|
104
|
+
stateKey,
|
|
105
|
+
conditions: [encodeVersionCondition(stateKey, snapshot.version)],
|
|
106
|
+
operations: [
|
|
107
|
+
{ type: "put", key: stateKey, value: encode(acquired.record) },
|
|
108
|
+
{ type: "put", key: atomicStateVersionKey(stateKey), value: encode(snapshot.version + 1) },
|
|
109
|
+
{
|
|
110
|
+
type: "put",
|
|
111
|
+
key: KEYS.workflowConcurrencyHolder(workflowId),
|
|
112
|
+
value: encode(encodeHolderRecord(workflowType, partitionKey))
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: "put",
|
|
116
|
+
key: KEYS.terminalCleanupNeeded(workflowId),
|
|
117
|
+
value: new Uint8Array(0)
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
export async function releaseWorkflowConcurrencySlot(internals, workflowId) {
|
|
123
|
+
const holderKey = KEYS.workflowConcurrencyHolder(workflowId), markerBytes = await internals.storage.get(holderKey);
|
|
124
|
+
if (markerBytes === null)
|
|
125
|
+
return;
|
|
126
|
+
const marker = decodeHolderRecord(markerBytes);
|
|
127
|
+
if (marker === null) {
|
|
128
|
+
await internals.storage.delete(holderKey);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const stateKey = KEYS.workflowConcurrency(marker.workflowType, marker.partitionKey);
|
|
132
|
+
await new AtomicState(internals.storage, stateKey, {
|
|
133
|
+
initial: initialLockRecord()
|
|
134
|
+
}).update((current) => reduceRelease(current, { holderId: workflowId, now: internals.options.getNow() }));
|
|
135
|
+
await internals.storage.delete(holderKey);
|
|
136
|
+
}
|
|
@@ -7,9 +7,11 @@ import type { EngineInternals } from './internals.ts';
|
|
|
7
7
|
*/
|
|
8
8
|
export type WorkflowFeedSelector = 'events' | 'tokens';
|
|
9
9
|
/**
|
|
10
|
-
* Hard-coded stream key for the `tokens` selector.
|
|
11
|
-
*
|
|
12
|
-
*
|
|
10
|
+
* Hard-coded stream key for the `tokens` selector. Every transport that
|
|
11
|
+
* exposes the token feed — `engine.getStreamChunks(id, 'tokens')` and the REST
|
|
12
|
+
* SSE / WebSocket stream-chunk routes layered on it — keys its stored chunks
|
|
13
|
+
* under this single value, so a resumption cursor issued by one transport
|
|
14
|
+
* round-trips through another.
|
|
13
15
|
*/
|
|
14
16
|
export declare const TOKENS_STREAM_KEY = "tokens";
|
|
15
17
|
/** Record `kind` for every token stream chunk emitted by the feed. */
|
|
@@ -24,11 +26,10 @@ export declare const STREAM_CHUNK_KIND = "stream:chunk";
|
|
|
24
26
|
export declare const COMPACTION_BOUNDARY_KIND = "workflow:compaction-boundary";
|
|
25
27
|
/**
|
|
26
28
|
* A committed workflow-feed record surfaced to subscribers of
|
|
27
|
-
* `subscribeWorkflowFeedCommits()`. Fires after
|
|
28
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* before interpreting `payload`.
|
|
29
|
+
* `subscribeWorkflowFeedCommits()`. Fires after the storage commit resolves, so
|
|
30
|
+
* replay and live delivery share the same committed sequence authority. The
|
|
31
|
+
* same shape covers both selectors — consumers filter on `selector` before
|
|
32
|
+
* interpreting `payload`.
|
|
32
33
|
*
|
|
33
34
|
* - `events` selector: `kind` is the durable log entry type
|
|
34
35
|
* (e.g. `'workflow:checkpoint'`). `sequence` / `timestamp` come
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EventLog } from "../event-log.js";
|
|
2
2
|
import { readEventLogWatermark } from "./event-log-compaction.js";
|
|
3
3
|
import { workflowFeedListenerKey } from "./state-utilities.js";
|
|
4
|
-
import { loadStoredStreamChunks } from "./stream-chunk-loading.js";
|
|
4
|
+
import { loadStoredStreamChunks, loadStoredStreamTailSequence } from "./stream-chunk-loading.js";
|
|
5
5
|
export const TOKENS_STREAM_KEY = "tokens", STREAM_CHUNK_KIND = "stream:chunk", COMPACTION_BOUNDARY_KIND = "workflow:compaction-boundary";
|
|
6
6
|
export async function* replayWorkflowFeed(internals, workflowId, selector, afterSequence) {
|
|
7
7
|
if (selector === "events") {
|
|
@@ -17,6 +17,9 @@ export async function snapshotWorkflowFeedTail(internals, workflowId, selector)
|
|
|
17
17
|
return head.sequence;
|
|
18
18
|
return (await new EventLog(internals.storage, workflowId).loadHead()).sequence;
|
|
19
19
|
}
|
|
20
|
+
const tail = await loadStoredStreamTailSequence(internals.storage, workflowId, TOKENS_STREAM_KEY);
|
|
21
|
+
if (tail !== null)
|
|
22
|
+
return tail;
|
|
20
23
|
const chunks = await loadStoredStreamChunks(internals.storage, workflowId, TOKENS_STREAM_KEY);
|
|
21
24
|
if (chunks.length === 0)
|
|
22
25
|
return -1;
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
import { type BatchOperation, type Storage } from '../../storage/interface.ts';
|
|
15
15
|
import type { WorkflowState } from '../types.ts';
|
|
16
16
|
import { WeftError } from '../weft-error.ts';
|
|
17
|
+
import type { EngineInternals } from './internals.ts';
|
|
17
18
|
/**
|
|
18
19
|
* Bumped whenever the index layout or population rules change. The engine
|
|
19
20
|
* compares this to the watermark stored at `wf-idx-meta:version` to decide
|
|
@@ -96,8 +97,16 @@ export declare function buildWorkflowVisibilityIndexTransition(workflowId: strin
|
|
|
96
97
|
* consult the new `wf-idx-*` rows when the watermark is `current`.
|
|
97
98
|
*/
|
|
98
99
|
export type WorkflowVisibilityWatermark = 'current' | 'stale';
|
|
100
|
+
export declare const WORKFLOW_VISIBILITY_WATERMARK_CACHE_TTL_MS = 1000;
|
|
99
101
|
/**
|
|
100
102
|
* Read the visibility-index watermark. Returns `'current'` when the
|
|
101
103
|
* persisted version is at or above {@link WORKFLOW_VISIBILITY_INDEX_VERSION}.
|
|
102
104
|
*/
|
|
103
105
|
export declare function getWorkflowVisibilityWatermark(storage: Storage): Promise<WorkflowVisibilityWatermark>;
|
|
106
|
+
/**
|
|
107
|
+
* Read the visibility-index watermark through the engine-local query cache.
|
|
108
|
+
* The short freshness window avoids repeated metadata reads during bursts of
|
|
109
|
+
* list/aggregate queries without pinning an external backfill or drop decision
|
|
110
|
+
* until process restart.
|
|
111
|
+
*/
|
|
112
|
+
export declare function getCachedWorkflowVisibilityWatermark(internals: EngineInternals): Promise<WorkflowVisibilityWatermark>;
|
|
@@ -77,6 +77,7 @@ function buildWorkflowVisibilityIndexOperationsInternal(workflowId, previousKeys
|
|
|
77
77
|
return { batchOps, nextManifestKeys: nextKeys };
|
|
78
78
|
}
|
|
79
79
|
const EMPTY_INDEX_VALUE = new Uint8Array(0);
|
|
80
|
+
export const WORKFLOW_VISIBILITY_WATERMARK_CACHE_TTL_MS = 1000;
|
|
80
81
|
export async function getWorkflowVisibilityWatermark(storage) {
|
|
81
82
|
const bytes = await storage.get(KEYS.workflowVisibilityMetaVersion());
|
|
82
83
|
if (!bytes)
|
|
@@ -91,3 +92,12 @@ export async function getWorkflowVisibilityWatermark(storage) {
|
|
|
91
92
|
return "stale";
|
|
92
93
|
return payload >= WORKFLOW_VISIBILITY_INDEX_VERSION ? "current" : "stale";
|
|
93
94
|
}
|
|
95
|
+
export async function getCachedWorkflowVisibilityWatermark(internals) {
|
|
96
|
+
const { workflowVisibilityWatermark: cachedWatermark, workflowVisibilityWatermarkExpiresAt: expiresAt } = internals, now = Date.now();
|
|
97
|
+
if (cachedWatermark !== void 0 && expiresAt !== void 0 && now < expiresAt)
|
|
98
|
+
return cachedWatermark;
|
|
99
|
+
const watermark = await getWorkflowVisibilityWatermark(internals.storage);
|
|
100
|
+
internals.workflowVisibilityWatermark = watermark;
|
|
101
|
+
internals.workflowVisibilityWatermarkExpiresAt = now + WORKFLOW_VISIBILITY_WATERMARK_CACHE_TTL_MS;
|
|
102
|
+
return watermark;
|
|
103
|
+
}
|
|
@@ -6,25 +6,35 @@ import {
|
|
|
6
6
|
import { failureCategorySearchValues, isFailureCategory } from "../failure-categories.js";
|
|
7
7
|
import { encodeAttributeValue, searchAttributeName } from "../search-attributes.js";
|
|
8
8
|
import { normalizeWorkflowTags } from "../workflow-tags.js";
|
|
9
|
-
import {
|
|
9
|
+
import { CONSTRAINED_ID_CHUNK_SIZE } from "./candidate-read-batching.js";
|
|
10
|
+
import {
|
|
11
|
+
attributeFilterExactValues,
|
|
12
|
+
decodeSearchAttributeRecord,
|
|
13
|
+
intersectIdentifierSets,
|
|
14
|
+
listFilterHasAttributeFilters,
|
|
15
|
+
matchesListFilter
|
|
16
|
+
} from "./state-utilities.js";
|
|
10
17
|
import { decodeWorkflowState } from "./validation.js";
|
|
11
18
|
const ATTRIBUTE_SCAN_CONCURRENCY = 8;
|
|
12
19
|
export async function* streamMatchingWorkflowStates(internals, filter) {
|
|
13
20
|
const normalizedTagFilters = normalizeWorkflowTags(filter?.tags), constrainedIds = await resolveConstrainedIds(internals, filter, normalizedTagFilters);
|
|
14
21
|
if (constrainedIds !== null) {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
22
|
+
const orderedIds = [...constrainedIds];
|
|
23
|
+
for (let start = 0;start < orderedIds.length; start += CONSTRAINED_ID_CHUNK_SIZE) {
|
|
24
|
+
const chunkIds = orderedIds.slice(start, start + CONSTRAINED_ID_CHUNK_SIZE), chunkStates = await Promise.all(chunkIds.map((workflowId) => loadMatchingWorkflowState(internals, workflowId, filter, constrainedIds, normalizedTagFilters)));
|
|
25
|
+
for (const state of chunkStates) {
|
|
26
|
+
if (state === null)
|
|
27
|
+
continue;
|
|
28
|
+
yield state;
|
|
29
|
+
}
|
|
20
30
|
}
|
|
21
31
|
return;
|
|
22
32
|
}
|
|
23
33
|
for await (const [key, value] of internals.storage.scan("wf:")) {
|
|
24
34
|
if (!isTopLevelWorkflowStateKey(key))
|
|
25
35
|
continue;
|
|
26
|
-
const state = decodeWorkflowState(value);
|
|
27
|
-
if (!matchesListFilter(state, filter, constrainedIds, normalizedTagFilters))
|
|
36
|
+
const state = decodeWorkflowState(value), searchAttributes = await readSearchAttributesForFilter(internals, state.id, filter);
|
|
37
|
+
if (!matchesListFilter(state, filter, constrainedIds, normalizedTagFilters, searchAttributes))
|
|
28
38
|
continue;
|
|
29
39
|
yield state;
|
|
30
40
|
}
|
|
@@ -33,11 +43,16 @@ async function loadMatchingWorkflowState(internals, workflowId, filter, constrai
|
|
|
33
43
|
const stateBytes = await internals.storage.get(KEYS.workflow(workflowId));
|
|
34
44
|
if (!stateBytes)
|
|
35
45
|
return null;
|
|
36
|
-
const state = decodeWorkflowState(stateBytes);
|
|
37
|
-
if (!matchesListFilter(state, filter, constrainedIds, normalizedTagFilters))
|
|
46
|
+
const state = decodeWorkflowState(stateBytes), searchAttributes = await readSearchAttributesForFilter(internals, workflowId, filter);
|
|
47
|
+
if (!matchesListFilter(state, filter, constrainedIds, normalizedTagFilters, searchAttributes))
|
|
38
48
|
return null;
|
|
39
49
|
return state;
|
|
40
50
|
}
|
|
51
|
+
async function readSearchAttributesForFilter(internals, workflowId, filter) {
|
|
52
|
+
if (!listFilterHasAttributeFilters(filter))
|
|
53
|
+
return null;
|
|
54
|
+
return decodeSearchAttributeRecord(await internals.storage.get(KEYS.attribute(workflowId)));
|
|
55
|
+
}
|
|
41
56
|
export async function resolveConstrainedIds(internals, filter, normalizedTagFilters) {
|
|
42
57
|
const attributeFilters = filter?.attributes, hasAttributeFilters = attributeFilters !== void 0 && attributeFilters.length > 0, hasTagFilters = normalizedTagFilters !== void 0 && normalizedTagFilters.length > 0;
|
|
43
58
|
if (!hasAttributeFilters && !hasTagFilters)
|
|
@@ -78,10 +93,15 @@ function requireConstrainedIdSet(idSet) {
|
|
|
78
93
|
return idSet;
|
|
79
94
|
}
|
|
80
95
|
async function collectExactAttributeMatches(internals, filter, attributeName, ids) {
|
|
81
|
-
const
|
|
82
|
-
if (
|
|
96
|
+
const exactValues = attributeFilterExactValues(filter);
|
|
97
|
+
if (exactValues === null)
|
|
83
98
|
return;
|
|
84
|
-
const values =
|
|
99
|
+
const values = [];
|
|
100
|
+
for (const exactValue of exactValues)
|
|
101
|
+
if (filter.key === "failureCategory" && isFailureCategory(exactValue))
|
|
102
|
+
values.push(...failureCategorySearchValues(exactValue));
|
|
103
|
+
else
|
|
104
|
+
values.push(exactValue);
|
|
85
105
|
for (const value of values) {
|
|
86
106
|
const exactPrefix = `idx:${attributeName}:${encodeAttributeValue(value)}:`;
|
|
87
107
|
for await (const [key] of internals.storage.scan(exactPrefix))
|
|
@@ -6,13 +6,13 @@
|
|
|
6
6
|
*
|
|
7
7
|
* Every helper assumes the visibility-index watermark is `current` — the
|
|
8
8
|
* caller checks {@link getWorkflowVisibilityWatermark} once per query and
|
|
9
|
-
*
|
|
9
|
+
* uses the current full-scan correctness path when it is `stale`.
|
|
10
10
|
*
|
|
11
11
|
* @module core/engine/workflow-visibility-queries
|
|
12
12
|
*/
|
|
13
13
|
import { type Storage } from '../../storage/interface.ts';
|
|
14
14
|
import type { FailureCategory, WorkflowStatus } from '../types/identity.ts';
|
|
15
|
-
import type { TimeRange } from '../types/options.ts';
|
|
15
|
+
import type { TimeRange } from '../types/list-options.ts';
|
|
16
16
|
/**
|
|
17
17
|
* Match every workflow whose `status` appears in `statuses`. Empty input
|
|
18
18
|
* returns an empty set (intersection short-circuits to "no matches").
|
|
@@ -25,6 +25,7 @@ export async function cleanupPartialStreamChunks(storage, workflowId, key, writt
|
|
|
25
25
|
return;
|
|
26
26
|
const deleteOperations = [
|
|
27
27
|
...writtenKeys.map((writtenKey) => ({ type: "delete", key: writtenKey })),
|
|
28
|
+
{ type: "delete", key: KEYS.streamTail(workflowId, key) },
|
|
28
29
|
{ type: "delete", key: KEYS.streamMetadata(workflowId, key) }
|
|
29
30
|
];
|
|
30
31
|
await storage.batch(deleteOperations).catch((deleteError) => {
|
|
@@ -8,9 +8,8 @@
|
|
|
8
8
|
* import { Engine, ActivityStartedEvent } from '@lostgradient/weft';
|
|
9
9
|
*
|
|
10
10
|
* const engine = new Engine();
|
|
11
|
-
* engine.addEventListener(
|
|
12
|
-
*
|
|
13
|
-
* console.log('activity started:', ev.activityName, 'attempt', ev.attempt);
|
|
11
|
+
* engine.addEventListener(ActivityStartedEvent.type, (event) => {
|
|
12
|
+
* console.log('activity started:', event.activityName, 'attempt', event.attempt);
|
|
14
13
|
* });
|
|
15
14
|
* ```
|
|
16
15
|
*/
|
|
@@ -32,9 +31,8 @@ export declare class ActivityStartedEvent extends Event {
|
|
|
32
31
|
* import { Engine, ActivityCompletedEvent } from '@lostgradient/weft';
|
|
33
32
|
*
|
|
34
33
|
* const engine = new Engine();
|
|
35
|
-
* engine.addEventListener(
|
|
36
|
-
*
|
|
37
|
-
* console.log(ev.activityName, 'completed in', ev.duration, 'ms');
|
|
34
|
+
* engine.addEventListener(ActivityCompletedEvent.type, (event) => {
|
|
35
|
+
* console.log(event.activityName, 'completed in', event.duration, 'ms');
|
|
38
36
|
* });
|
|
39
37
|
* ```
|
|
40
38
|
*/
|
|
@@ -61,9 +59,8 @@ export declare class ActivityCompletedEvent extends Event {
|
|
|
61
59
|
* import { Engine, ActivityAsyncPendingEvent } from '@lostgradient/weft';
|
|
62
60
|
*
|
|
63
61
|
* const engine = new Engine();
|
|
64
|
-
* engine.addEventListener(
|
|
65
|
-
*
|
|
66
|
-
* console.log('awaiting external completion of', ev.activityName, 'token', ev.token);
|
|
62
|
+
* engine.addEventListener(ActivityAsyncPendingEvent.type, (event) => {
|
|
63
|
+
* console.log('awaiting external completion of', event.activityName, 'token', event.token);
|
|
67
64
|
* });
|
|
68
65
|
* ```
|
|
69
66
|
*/
|
|
@@ -87,9 +84,8 @@ export declare class ActivityAsyncPendingEvent extends Event {
|
|
|
87
84
|
* import { Engine, ActivityFailedEvent } from '@lostgradient/weft';
|
|
88
85
|
*
|
|
89
86
|
* const engine = new Engine();
|
|
90
|
-
* engine.addEventListener(
|
|
91
|
-
*
|
|
92
|
-
* console.error(ev.activityName, 'attempt', ev.attempt, 'failed:', ev.error.message);
|
|
87
|
+
* engine.addEventListener(ActivityFailedEvent.type, (event) => {
|
|
88
|
+
* console.error(event.activityName, 'attempt', event.attempt, 'failed:', event.error.message);
|
|
93
89
|
* });
|
|
94
90
|
* ```
|
|
95
91
|
*/
|
|
@@ -102,3 +98,38 @@ export declare class ActivityFailedEvent extends Event {
|
|
|
102
98
|
readonly attempt: number;
|
|
103
99
|
constructor(operationId: string, workflowId: string, activityName: string, error: Error, attempt: number);
|
|
104
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Fired on the {@link Engine} when a remote worker task result cannot be
|
|
103
|
+
* durably moved from in-flight to resolved after storage retries are exhausted.
|
|
104
|
+
* The durable dead-letter guard prevents reconciliation from silently
|
|
105
|
+
* re-dispatching the already-completed worker attempt until an operator clears
|
|
106
|
+
* the diagnostic entry.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* import { Engine, TaskResultDeadLetteredEvent } from '@lostgradient/weft';
|
|
111
|
+
*
|
|
112
|
+
* const engine = new Engine();
|
|
113
|
+
* engine.addEventListener(TaskResultDeadLetteredEvent.type, (event) => {
|
|
114
|
+
* console.warn('task dead-lettered:', event.operationId, event.reason);
|
|
115
|
+
* });
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
export declare class TaskResultDeadLetteredEvent extends Event {
|
|
119
|
+
static readonly type: "task:dead-lettered";
|
|
120
|
+
readonly operationId: string;
|
|
121
|
+
readonly workflowId: string | undefined;
|
|
122
|
+
readonly activityName: string | undefined;
|
|
123
|
+
readonly queue: string | undefined;
|
|
124
|
+
readonly workerId: string | undefined;
|
|
125
|
+
readonly reason: 'result-resolution-storage-exhausted';
|
|
126
|
+
readonly errorMessage: string;
|
|
127
|
+
constructor({ operationId, workflowId, activityName, queue, workerId, errorMessage, }: {
|
|
128
|
+
operationId: string;
|
|
129
|
+
workflowId?: string | undefined;
|
|
130
|
+
activityName?: string | undefined;
|
|
131
|
+
queue?: string | undefined;
|
|
132
|
+
workerId?: string | undefined;
|
|
133
|
+
errorMessage: string;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
@@ -61,3 +61,31 @@ export class ActivityFailedEvent extends Event {
|
|
|
61
61
|
this.attempt = attempt;
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
+
|
|
65
|
+
export class TaskResultDeadLetteredEvent extends Event {
|
|
66
|
+
static type = "task:dead-lettered";
|
|
67
|
+
operationId;
|
|
68
|
+
workflowId;
|
|
69
|
+
activityName;
|
|
70
|
+
queue;
|
|
71
|
+
workerId;
|
|
72
|
+
reason;
|
|
73
|
+
errorMessage;
|
|
74
|
+
constructor({
|
|
75
|
+
operationId,
|
|
76
|
+
workflowId,
|
|
77
|
+
activityName,
|
|
78
|
+
queue,
|
|
79
|
+
workerId,
|
|
80
|
+
errorMessage
|
|
81
|
+
}) {
|
|
82
|
+
super(TaskResultDeadLetteredEvent.type);
|
|
83
|
+
this.operationId = operationId;
|
|
84
|
+
this.workflowId = workflowId;
|
|
85
|
+
this.activityName = activityName;
|
|
86
|
+
this.queue = queue;
|
|
87
|
+
this.workerId = workerId;
|
|
88
|
+
this.reason = "result-resolution-storage-exhausted";
|
|
89
|
+
this.errorMessage = errorMessage;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -8,9 +8,8 @@
|
|
|
8
8
|
* import { Engine, AttributesChangedEvent } from '@lostgradient/weft';
|
|
9
9
|
*
|
|
10
10
|
* const engine = new Engine();
|
|
11
|
-
* engine.addEventListener(
|
|
12
|
-
*
|
|
13
|
-
* console.log('attributes changed for', ev.workflowId, ev.changes);
|
|
11
|
+
* engine.addEventListener(AttributesChangedEvent.type, (event) => {
|
|
12
|
+
* console.log('attributes changed for', event.workflowId, event.changes);
|
|
14
13
|
* });
|
|
15
14
|
* ```
|
|
16
15
|
*/
|
|
@@ -1,52 +1,59 @@
|
|
|
1
1
|
import type { ReviewCompletedEvent, ReviewRequestedEvent } from '../review/events.ts';
|
|
2
|
-
import type { ActivityAsyncPendingEvent, ActivityCompletedEvent, ActivityFailedEvent, ActivityStartedEvent } from './activity-events.ts';
|
|
2
|
+
import type { ActivityAsyncPendingEvent, ActivityCompletedEvent, ActivityFailedEvent, ActivityStartedEvent, TaskResultDeadLetteredEvent } from './activity-events.ts';
|
|
3
3
|
import type { AttributesChangedEvent } from './attribute-events.ts';
|
|
4
|
+
import type { ScheduleFiredEvent, ScheduleMissedFireEvent } from './schedule-events.ts';
|
|
4
5
|
import type { SignalDeliveredEvent, SignalReceivedEvent } from './signal-events.ts';
|
|
5
|
-
import type { AlertFiredEvent, AlertResolvedEvent, CheckpointSizeWarningEvent, CleanupWarningEvent, ConstraintViolatedEvent, DevelopmentWarningEvent, StorageSizeReportedEvent } from './system-events.ts';
|
|
6
|
+
import type { AlertFiredEvent, AlertResolvedEvent, CheckpointSizeWarningEvent, CleanupWarningEvent, ConstraintViolatedEvent, DevelopmentWarningEvent, StorageSizeReportedEvent, WorkerConnectedEvent, WorkerDisconnectedEvent } from './system-events.ts';
|
|
6
7
|
import type { UpdateCompletedEvent, UpdateReceivedEvent } from './update-events.ts';
|
|
7
|
-
import type { WorkflowCancelledEvent, WorkflowCompletedEvent, WorkflowFailedEvent, WorkflowRecoverySkippedEvent, WorkflowResumedEvent, WorkflowStartedEvent, WorkflowTimedOutEvent } from './workflow-events.ts';
|
|
8
|
+
import type { WorkflowCancelledEvent, WorkflowCompletedEvent, WorkflowDefinitionRegisteredEvent, WorkflowFailedEvent, WorkflowRecoverySkippedEvent, WorkflowResumedEvent, WorkflowStartedEvent, WorkflowSuspendedEvent, WorkflowTeardownEvent, WorkflowTimedOutEvent } from './workflow-events.ts';
|
|
8
9
|
/**
|
|
9
10
|
* Record mapping each event-name string the {@link Engine} dispatches to its
|
|
10
|
-
* corresponding typed `Event` subclass.
|
|
11
|
-
* {@link TypedEventTarget} to get type-safe `addEventListener` /
|
|
12
|
-
* `removeEventListener` on the engine.
|
|
11
|
+
* corresponding typed `Event` subclass.
|
|
13
12
|
*
|
|
14
13
|
* @example
|
|
15
14
|
* ```ts
|
|
16
|
-
* import { Engine, type
|
|
15
|
+
* import { Engine, type WeftEventMap } from '@lostgradient/weft';
|
|
17
16
|
*
|
|
18
17
|
* function listenAll(engine: Engine) {
|
|
19
|
-
* (
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
18
|
+
* engine.addEventListener('workflow:completed', (event) => {
|
|
19
|
+
* const completed: WeftEventMap['workflow:completed'] = event;
|
|
20
|
+
* console.log('done', completed.workflowId, completed.result);
|
|
21
|
+
* });
|
|
23
22
|
* }
|
|
24
23
|
* void listenAll;
|
|
25
24
|
* ```
|
|
26
25
|
*/
|
|
27
26
|
export type WeftEventMap = {
|
|
27
|
+
'workflow:definition-registered': WorkflowDefinitionRegisteredEvent;
|
|
28
28
|
'workflow:started': WorkflowStartedEvent;
|
|
29
29
|
'workflow:completed': WorkflowCompletedEvent;
|
|
30
30
|
'workflow:failed': WorkflowFailedEvent;
|
|
31
31
|
'workflow:cancelled': WorkflowCancelledEvent;
|
|
32
32
|
'workflow:timed-out': WorkflowTimedOutEvent;
|
|
33
33
|
'workflow:resumed': WorkflowResumedEvent;
|
|
34
|
+
'workflow:suspended': WorkflowSuspendedEvent;
|
|
34
35
|
'workflow:recovery-skipped': WorkflowRecoverySkippedEvent;
|
|
36
|
+
'workflow:teardown': WorkflowTeardownEvent;
|
|
35
37
|
'activity:started': ActivityStartedEvent;
|
|
36
38
|
'activity:completed': ActivityCompletedEvent;
|
|
37
39
|
'activity:failed': ActivityFailedEvent;
|
|
38
40
|
'activity:async-pending': ActivityAsyncPendingEvent;
|
|
41
|
+
'task:dead-lettered': TaskResultDeadLetteredEvent;
|
|
39
42
|
'signal:received': SignalReceivedEvent;
|
|
40
43
|
'signal:delivered': SignalDeliveredEvent;
|
|
44
|
+
'schedule:fired': ScheduleFiredEvent;
|
|
41
45
|
'human-review:requested': ReviewRequestedEvent;
|
|
42
46
|
'human-review:completed': ReviewCompletedEvent;
|
|
43
47
|
'attributes:changed': AttributesChangedEvent;
|
|
48
|
+
'schedule:missed-fire': ScheduleMissedFireEvent;
|
|
44
49
|
'update:received': UpdateReceivedEvent;
|
|
45
50
|
'update:completed': UpdateCompletedEvent;
|
|
46
51
|
'checkpoint:size-warning': CheckpointSizeWarningEvent;
|
|
47
52
|
'development:warning': DevelopmentWarningEvent;
|
|
48
53
|
'cleanup:warning': CleanupWarningEvent;
|
|
49
54
|
'storage:size-reported': StorageSizeReportedEvent;
|
|
55
|
+
'worker:connected': WorkerConnectedEvent;
|
|
56
|
+
'worker:disconnected': WorkerDisconnectedEvent;
|
|
50
57
|
'alert:fired': AlertFiredEvent;
|
|
51
58
|
'alert:resolved': AlertResolvedEvent;
|
|
52
59
|
'constraint:violated': ConstraintViolatedEvent;
|
|
@@ -68,7 +75,7 @@ export type WeftEventMap = {
|
|
|
68
75
|
* });
|
|
69
76
|
* }
|
|
70
77
|
* const engine = new Engine();
|
|
71
|
-
* addTypedListener(engine
|
|
78
|
+
* addTypedListener(engine);
|
|
72
79
|
* void engine;
|
|
73
80
|
* ```
|
|
74
81
|
*/
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fired on the {@link Engine} each time a schedule launches an occurrence — i.e.
|
|
3
|
+
* whenever a scheduled run is actually started, whether that is a fresh cadence
|
|
4
|
+
* tick, a `cancel-running` replacement, or a `queue`d run draining after the
|
|
5
|
+
* previous one finished. A fire means a workflow was launched: the blocked
|
|
6
|
+
* policies (`skip`, and `queue` while a run is already active) intentionally do
|
|
7
|
+
* **not** emit, since nothing started.
|
|
8
|
+
*
|
|
9
|
+
* Delivery is process-local and best-effort — listen via
|
|
10
|
+
* `engine.addEventListener('schedule:fired', handler)` on the live engine that
|
|
11
|
+
* owns the schedule. The durable part (the cadence, and the launched run itself)
|
|
12
|
+
* is handled by the schedule; the event is dispatched synchronously right after
|
|
13
|
+
* the run's durable start commits, so a crash in that narrow window — start
|
|
14
|
+
* committed, dispatch not yet reached — can drop the notification without
|
|
15
|
+
* affecting the run. Treat it as a reaction signal, not a durable record. This
|
|
16
|
+
* lets a consumer react to a firing without polling `engine.list()` or
|
|
17
|
+
* `getSchedule()`.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```ts
|
|
21
|
+
* import { workflow, Engine, ScheduleFiredEvent } from '@lostgradient/weft';
|
|
22
|
+
*
|
|
23
|
+
* const engine = new Engine();
|
|
24
|
+
* engine.addEventListener('schedule:fired', (e: Event) => {
|
|
25
|
+
* const ev = e as ScheduleFiredEvent;
|
|
26
|
+
* console.log('schedule', ev.scheduleId, 'launched run', ev.workflowId);
|
|
27
|
+
* });
|
|
28
|
+
* engine.register(workflow({ name: 'tick' }).execute(async function* () { return 'ok'; }));
|
|
29
|
+
* await engine.schedule('tick', null, { every: '1h' });
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare class ScheduleFiredEvent extends Event {
|
|
33
|
+
static readonly type: "schedule:fired";
|
|
34
|
+
/** The schedule whose occurrence fired. */
|
|
35
|
+
readonly scheduleId: string;
|
|
36
|
+
/** The workflow run this occurrence launched. */
|
|
37
|
+
readonly workflowId: string;
|
|
38
|
+
/** Wall-clock time the run was launched, from the engine's injected clock. */
|
|
39
|
+
readonly firedAt: number;
|
|
40
|
+
/**
|
|
41
|
+
* The scheduled grid timestamp the occurrence was due. `undefined` for a run
|
|
42
|
+
* that drained from the `queue` overlap policy: a queued occurrence is tracked
|
|
43
|
+
* only as a count (`queuedRuns`), so its original due timestamp is not retained
|
|
44
|
+
* and cannot be reported when the run finally launches.
|
|
45
|
+
*/
|
|
46
|
+
readonly occurrence: number | undefined;
|
|
47
|
+
constructor(scheduleId: string, workflowId: string, firedAt: number, occurrence?: number);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Fired on the {@link Engine} when a non-backfill schedule timer is more than
|
|
51
|
+
* one second late and the engine skips the missed occurrence window instead of
|
|
52
|
+
* starting workflows for those ticks.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* import { Engine, ScheduleMissedFireEvent } from '@lostgradient/weft';
|
|
57
|
+
*
|
|
58
|
+
* const engine = new Engine();
|
|
59
|
+
* engine.addEventListener(ScheduleMissedFireEvent.type, (event) => {
|
|
60
|
+
* console.warn(event.scheduleId, 'missed', event.missedCount, 'scheduled ticks');
|
|
61
|
+
* });
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare class ScheduleMissedFireEvent extends Event {
|
|
65
|
+
static readonly type: "schedule:missed-fire";
|
|
66
|
+
readonly scheduleId: string;
|
|
67
|
+
readonly missedCount: number;
|
|
68
|
+
readonly windowStart: number;
|
|
69
|
+
readonly windowEnd: number;
|
|
70
|
+
constructor(scheduleId: string, missedCount: number, windowStart: number, windowEnd: number);
|
|
71
|
+
}
|