@lostgradient/weft 0.23.1 → 0.24.1
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 +72 -4
- package/dist/cli/codegen-emit-dedup.d.ts +81 -0
- package/dist/cli/codegen-emit-dedup.js +45 -0
- package/dist/cli/codegen-emit-registry.d.ts +90 -0
- package/dist/cli/codegen-emit-registry.js +50 -0
- package/dist/cli/codegen-emit.d.ts +26 -39
- package/dist/cli/codegen-emit.js +4 -27
- package/dist/cli/codegen-validate.d.ts +49 -0
- package/dist/cli/codegen-validate.js +186 -0
- package/dist/cli/codegen.js +6 -87
- package/dist/cli/conformance.js +5 -2
- package/dist/cli/generated/operation-catalog.snapshot.json +381 -3
- package/dist/cli/generated/operation-client.generated.d.ts +350 -10
- package/dist/cli/generated/operation-client.generated.js +14 -0
- package/dist/cli/output.js +1 -1
- package/dist/cli/parse-schedule-arguments.js +15 -3
- package/dist/cli/schedule.js +2 -1
- package/dist/cli/storage-factory.js +2 -0
- package/dist/cli/types.d.ts +2 -1
- package/dist/cli/workflow-commands.js +2 -0
- package/dist/cli-main.js +1 -1
- package/dist/client/http-client-requests.js +6 -9
- package/dist/client/start-body.js +1 -0
- package/dist/core/application-payload-digest.d.ts +42 -0
- package/dist/core/application-payload-digest.js +76 -0
- package/dist/core/application-primitive-abort.d.ts +50 -0
- package/dist/core/application-primitive-abort.js +40 -0
- package/dist/core/application-primitive-attempt-registry.d.ts +74 -0
- package/dist/core/application-primitive-attempt-registry.js +73 -0
- package/dist/core/application-primitive-codec.d.ts +36 -0
- package/dist/core/application-primitive-codec.js +56 -0
- package/dist/core/application-primitive-commit.d.ts +67 -0
- package/dist/core/application-primitive-commit.js +66 -0
- package/dist/core/application-primitive-guards.d.ts +62 -0
- package/dist/core/application-primitive-guards.js +89 -0
- package/dist/core/application-primitive-payload.d.ts +29 -0
- package/dist/core/application-primitive-payload.js +65 -0
- package/dist/core/application-primitive-timing.d.ts +18 -0
- package/dist/core/application-primitive-timing.js +22 -0
- package/dist/core/atomic-state.js +2 -0
- package/dist/core/catalog/codec.d.ts +40 -0
- package/dist/core/catalog/codec.js +45 -0
- package/dist/core/catalog/errors.d.ts +104 -0
- package/dist/core/catalog/errors.js +41 -0
- package/dist/core/catalog/index.d.ts +25 -0
- package/dist/core/catalog/index.js +22 -0
- package/dist/core/catalog/reference-counts.d.ts +120 -0
- package/dist/core/catalog/reference-counts.js +28 -0
- package/dist/core/catalog/removal.d.ts +105 -0
- package/dist/core/catalog/removal.js +30 -0
- package/dist/core/catalog/storage-io.d.ts +101 -0
- package/dist/core/catalog/storage-io.js +106 -0
- package/dist/core/catalog/types.d.ts +108 -0
- package/dist/core/catalog/types.js +0 -0
- package/dist/core/catalog/workflow-catalog.d.ts +165 -0
- package/dist/core/catalog/workflow-catalog.js +198 -0
- package/dist/core/compare-codepoint.d.ts +13 -0
- package/dist/core/compare-codepoint.js +7 -0
- package/dist/core/compression.js +2 -0
- package/dist/core/context/attributes.d.ts +1 -1
- package/dist/core/context/durable-operations.d.ts +2 -2
- package/dist/core/context/index.js +5 -3
- package/dist/core/context/state-namespace.d.ts +1 -1
- package/dist/core/contract/build.d.ts +64 -0
- package/dist/core/contract/build.js +99 -0
- package/dist/core/contract/compatibility.d.ts +187 -0
- package/dist/core/contract/compatibility.js +37 -0
- package/dist/core/contract/failure.d.ts +64 -0
- package/dist/core/contract/failure.js +4 -0
- package/dist/core/contract/hash.d.ts +92 -0
- package/dist/core/contract/hash.js +34 -0
- package/dist/core/contract/index.d.ts +21 -0
- package/dist/core/contract/index.js +22 -0
- package/dist/core/contract/limits.d.ts +74 -0
- package/dist/core/contract/limits.js +1 -0
- package/dist/core/contract/manifest-parse-schema.d.ts +37 -0
- package/dist/core/contract/manifest-parse-schema.js +106 -0
- package/dist/core/contract/manifest-parse.d.ts +76 -0
- package/dist/core/contract/manifest-parse.js +189 -0
- package/dist/core/contract/manifest.d.ts +56 -0
- package/dist/core/contract/manifest.js +31 -0
- package/dist/core/contract/normalize.d.ts +97 -0
- package/dist/core/contract/normalize.js +127 -0
- package/dist/core/contract/revision.d.ts +29 -0
- package/dist/core/contract/revision.js +5 -0
- package/dist/core/contract/types.d.ts +274 -0
- package/dist/core/contract/types.js +1 -0
- package/dist/core/engine/activity-resolution.js +17 -17
- package/dist/core/engine/bulk-operations-purge.js +14 -20
- package/dist/core/engine/bulk-operations-retry.d.ts +9 -0
- package/dist/core/engine/bulk-operations-retry.js +177 -0
- package/dist/core/engine/bulk-operations-shared.d.ts +18 -0
- package/dist/core/engine/bulk-operations-shared.js +14 -0
- package/dist/core/engine/bulk-operations.js +8 -167
- package/dist/core/engine/callback-creators-bundles.js +4 -2
- package/dist/core/engine/callback-creators-core.js +9 -1
- package/dist/core/engine/callback-creators-schedule.js +2 -2
- package/dist/core/engine/catalog-activation.d.ts +40 -0
- package/dist/core/engine/catalog-activation.js +17 -0
- package/dist/core/engine/catalog-events.d.ts +36 -0
- package/dist/core/engine/catalog-events.js +15 -0
- package/dist/core/engine/catalog-readiness.d.ts +49 -0
- package/dist/core/engine/catalog-readiness.js +61 -0
- package/dist/core/engine/catalog-removal.d.ts +236 -0
- package/dist/core/engine/catalog-removal.js +123 -0
- package/dist/core/engine/catalog-tombstone-recovery.d.ts +56 -0
- package/dist/core/engine/catalog-tombstone-recovery.js +39 -0
- package/dist/core/engine/constraints.js +5 -1
- package/dist/core/engine/construction.d.ts +2 -2
- package/dist/core/engine/construction.js +4 -2
- package/dist/core/engine/decode-revision.d.ts +32 -0
- package/dist/core/engine/decode-revision.js +9 -0
- package/dist/core/engine/disposal.d.ts +6 -2
- package/dist/core/engine/disposal.js +26 -3
- package/dist/core/engine/dynamic-source-errors.d.ts +81 -0
- package/dist/core/engine/dynamic-source-errors.js +25 -0
- package/dist/core/engine/dynamic-source-execution.d.ts +173 -0
- package/dist/core/engine/dynamic-source-execution.js +108 -0
- package/dist/core/engine/engine-internal-types.d.ts +16 -0
- package/dist/core/engine/engine-workflows-namespace.d.ts +140 -0
- package/dist/core/engine/engine-workflows-namespace.js +51 -0
- package/dist/core/engine/finalizer-metadata.d.ts +22 -0
- package/dist/core/engine/finalizer-metadata.js +12 -0
- package/dist/core/engine/handle-result.js +2 -0
- package/dist/core/engine/index.d.ts +91 -0
- package/dist/core/engine/index.js +78 -6
- package/dist/core/engine/inline-launch-queue.js +1 -1
- package/dist/core/engine/internals.d.ts +54 -15
- package/dist/core/engine/internals.js +6 -0
- package/dist/core/engine/lifecycle/checkpoint-launch.d.ts +29 -0
- package/dist/core/engine/lifecycle/checkpoint-launch.js +75 -0
- package/dist/core/engine/lifecycle/delayed-start-registration.d.ts +30 -0
- package/dist/core/engine/lifecycle/delayed-start-registration.js +11 -0
- package/dist/core/engine/lifecycle/fork-helpers.d.ts +33 -1
- package/dist/core/engine/lifecycle/fork-helpers.js +3 -1
- package/dist/core/engine/lifecycle/recovery-revision-groups.d.ts +75 -0
- package/dist/core/engine/lifecycle/recovery-revision-groups.js +64 -0
- package/dist/core/engine/lifecycle/resume-generation-guard.d.ts +58 -0
- package/dist/core/engine/lifecycle/resume-generation-guard.js +11 -0
- package/dist/core/engine/lifecycle/resume.js +18 -9
- package/dist/core/engine/lifecycle/shared.d.ts +43 -0
- package/dist/core/engine/lifecycle/standalone-claim-acquire.d.ts +12 -0
- package/dist/core/engine/lifecycle/standalone-claim-acquire.js +6 -0
- package/dist/core/engine/lifecycle/start-commit-errors.d.ts +12 -0
- package/dist/core/engine/lifecycle/start-commit-errors.js +6 -0
- package/dist/core/engine/lifecycle/start-commit.d.ts +22 -7
- package/dist/core/engine/lifecycle/start-commit.js +49 -15
- package/dist/core/engine/lifecycle/start-exec.d.ts +18 -2
- package/dist/core/engine/lifecycle/start-exec.js +7 -5
- package/dist/core/engine/lifecycle/start-or-signal-create.js +1 -3
- package/dist/core/engine/lifecycle/start-or-signal.js +1 -1
- package/dist/core/engine/lifecycle/start-precondition-attribution.d.ts +49 -0
- package/dist/core/engine/lifecycle/start-precondition-attribution.js +13 -0
- package/dist/core/engine/lifecycle/start-revision-resolution.d.ts +34 -0
- package/dist/core/engine/lifecycle/start-revision-resolution.js +11 -0
- package/dist/core/engine/lifecycle/start-state.d.ts +16 -0
- package/dist/core/engine/lifecycle/start-state.js +60 -0
- package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +66 -3
- package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +13 -3
- package/dist/core/engine/lifecycle/start.d.ts +16 -6
- package/dist/core/engine/lifecycle/start.js +39 -66
- package/dist/core/engine/lifecycle/transition.d.ts +3 -4
- package/dist/core/engine/lifecycle/transition.js +30 -80
- package/dist/core/engine/lifecycle.d.ts +4 -2
- package/dist/core/engine/lifecycle.js +6 -6
- package/dist/core/engine/listing.js +15 -1
- package/dist/core/engine/memo-durable-activity.js +4 -1
- package/dist/core/engine/nonterminal-revision-count.d.ts +25 -0
- package/dist/core/engine/nonterminal-revision-count.js +16 -0
- package/dist/core/engine/operations-time.d.ts +5 -23
- package/dist/core/engine/operations-time.js +13 -11
- package/dist/core/engine/ownership-bootstrap.d.ts +1 -1
- package/dist/core/engine/pinned-schedule-revision-count.d.ts +26 -0
- package/dist/core/engine/pinned-schedule-revision-count.js +19 -0
- package/dist/core/engine/pinned-schedule-revision.d.ts +76 -0
- package/dist/core/engine/pinned-schedule-revision.js +53 -0
- package/dist/core/engine/registration.d.ts +106 -0
- package/dist/core/engine/registration.js +28 -7
- package/dist/core/engine/retention.js +9 -2
- package/dist/core/engine/revision-errors.d.ts +71 -0
- package/dist/core/engine/revision-errors.js +13 -0
- package/dist/core/engine/schedule-revision-fire.d.ts +17 -0
- package/dist/core/engine/schedule-revision-fire.js +3 -0
- package/dist/core/engine/schedule-run.js +2 -1
- package/dist/core/engine/schedules.d.ts +2 -1
- package/dist/core/engine/schedules.js +28 -9
- package/dist/core/engine/source-diagnostics.d.ts +76 -0
- package/dist/core/engine/source-diagnostics.js +105 -0
- package/dist/core/engine/source-registration.d.ts +42 -0
- package/dist/core/engine/source-registration.js +38 -0
- package/dist/core/engine/source-resolution.d.ts +101 -0
- package/dist/core/engine/source-resolution.js +154 -0
- package/dist/core/engine/source-runtime-state.d.ts +92 -0
- package/dist/core/engine/source-runtime-state.js +36 -0
- package/dist/core/engine/storage-io.d.ts +19 -2
- package/dist/core/engine/storage-io.js +21 -2
- package/dist/core/engine/termination/finalizer-registration.d.ts +18 -0
- package/dist/core/engine/termination/finalizer-registration.js +21 -0
- package/dist/core/engine/termination/finalizer.d.ts +16 -19
- package/dist/core/engine/termination/finalizer.js +3 -3
- package/dist/core/engine/time-operation-callbacks.d.ts +32 -0
- package/dist/core/engine/time-operation-callbacks.js +0 -0
- package/dist/core/engine/validation/schedule-cadence.d.ts +16 -0
- package/dist/core/engine/validation/schedule-cadence.js +20 -0
- package/dist/core/engine/validation/schedule-options.d.ts +4 -1
- package/dist/core/engine/validation/schedule-options.js +14 -0
- package/dist/core/engine/validation/schedule-revision.d.ts +24 -0
- package/dist/core/engine/validation/schedule-revision.js +21 -0
- package/dist/core/engine/validation/schedule-warnings.d.ts +11 -0
- package/dist/core/engine/validation/schedule-warnings.js +5 -0
- package/dist/core/engine/validation/schedule.d.ts +4 -3
- package/dist/core/engine/validation/schedule.js +15 -26
- package/dist/core/engine/validation.js +5 -2
- package/dist/core/engine/workflow-claim-reclaim-target.d.ts +1 -1
- package/dist/core/engine/workflow-claim-reclaim-target.js +16 -2
- package/dist/core/engine/workflow-retention-deadline.d.ts +16 -0
- package/dist/core/engine/workflow-retention-deadline.js +33 -0
- package/dist/core/events/catalog-events.d.ts +117 -0
- package/dist/core/events/catalog-events.js +62 -0
- package/dist/core/events/event-map.d.ts +11 -0
- package/dist/core/events/index.d.ts +2 -0
- package/dist/core/events/index.js +2 -0
- package/dist/core/events/workflow-source-events.d.ts +102 -0
- package/dist/core/events/workflow-source-events.js +57 -0
- package/dist/core/execution-strategy.d.ts +7 -0
- package/dist/core/inline-execution-strategy.context-options.d.ts +1 -1
- package/dist/core/inline-execution-strategy.js +1 -1
- package/dist/core/mailbox-admission.d.ts +26 -0
- package/dist/core/mailbox-admission.js +130 -0
- package/dist/core/mailbox-claims.d.ts +251 -0
- package/dist/core/mailbox-claims.js +0 -0
- package/dist/core/mailbox-codec.d.ts +32 -0
- package/dist/core/mailbox-codec.js +221 -0
- package/dist/core/mailbox-contract.d.ts +290 -0
- package/dist/core/mailbox-contract.js +0 -0
- package/dist/core/mailbox-delivery.d.ts +37 -0
- package/dist/core/mailbox-delivery.js +193 -0
- package/dist/core/mailbox-guards.d.ts +78 -0
- package/dist/core/mailbox-guards.js +58 -0
- package/dist/core/mailbox-index-codec.d.ts +41 -0
- package/dist/core/mailbox-index-codec.js +71 -0
- package/dist/core/mailbox-internals.d.ts +156 -0
- package/dist/core/mailbox-internals.js +154 -0
- package/dist/core/mailbox-maintenance.d.ts +29 -0
- package/dist/core/mailbox-maintenance.js +196 -0
- package/dist/core/mailbox-settlement.d.ts +69 -0
- package/dist/core/mailbox-settlement.js +206 -0
- package/dist/core/mailbox-storage.d.ts +117 -0
- package/dist/core/mailbox-storage.js +115 -0
- package/dist/core/mailbox-transition-helpers.d.ts +70 -0
- package/dist/core/mailbox-transition-helpers.js +43 -0
- package/dist/core/mailbox-transitions-recovery.d.ts +28 -0
- package/dist/core/mailbox-transitions-recovery.js +64 -0
- package/dist/core/mailbox-transitions.d.ts +138 -0
- package/dist/core/mailbox-transitions.js +180 -0
- package/dist/core/mailbox-types.d.ts +406 -0
- package/dist/core/mailbox-types.js +16 -0
- package/dist/core/mailbox-validation.d.ts +65 -0
- package/dist/core/mailbox-validation.js +73 -0
- package/dist/core/mailbox-waits.d.ts +50 -0
- package/dist/core/mailbox-waits.js +97 -0
- package/dist/core/mailbox.d.ts +163 -0
- package/dist/core/mailbox.js +211 -0
- package/dist/core/outbox-claims.d.ts +307 -0
- package/dist/core/outbox-claims.js +0 -0
- package/dist/core/outbox-codec.d.ts +24 -0
- package/dist/core/outbox-codec.js +257 -0
- package/dist/core/outbox-contract.d.ts +346 -0
- package/dist/core/outbox-contract.js +0 -0
- package/dist/core/outbox-delivery.d.ts +34 -0
- package/dist/core/outbox-delivery.js +149 -0
- package/dist/core/outbox-drain.d.ts +29 -0
- package/dist/core/outbox-drain.js +158 -0
- package/dist/core/outbox-enqueue.d.ts +24 -0
- package/dist/core/outbox-enqueue.js +115 -0
- package/dist/core/outbox-guards.d.ts +76 -0
- package/dist/core/outbox-guards.js +60 -0
- package/dist/core/outbox-index-codec.d.ts +33 -0
- package/dist/core/outbox-index-codec.js +71 -0
- package/dist/core/outbox-internals.d.ts +99 -0
- package/dist/core/outbox-internals.js +159 -0
- package/dist/core/outbox-listing.d.ts +12 -0
- package/dist/core/outbox-listing.js +38 -0
- package/dist/core/outbox-maintenance.d.ts +28 -0
- package/dist/core/outbox-maintenance.js +191 -0
- package/dist/core/outbox-operations.d.ts +18 -0
- package/dist/core/outbox-operations.js +46 -0
- package/dist/core/outbox-runner.d.ts +30 -0
- package/dist/core/outbox-runner.js +217 -0
- package/dist/core/outbox-settlement.d.ts +57 -0
- package/dist/core/outbox-settlement.js +183 -0
- package/dist/core/outbox-storage.d.ts +107 -0
- package/dist/core/outbox-storage.js +127 -0
- package/dist/core/outbox-transition-helpers.d.ts +83 -0
- package/dist/core/outbox-transition-helpers.js +63 -0
- package/dist/core/outbox-transitions-recovery.d.ts +30 -0
- package/dist/core/outbox-transitions-recovery.js +42 -0
- package/dist/core/outbox-transitions.d.ts +145 -0
- package/dist/core/outbox-transitions.js +236 -0
- package/dist/core/outbox-types.d.ts +400 -0
- package/dist/core/outbox-types.js +20 -0
- package/dist/core/outbox-validation.d.ts +101 -0
- package/dist/core/outbox-validation.js +127 -0
- package/dist/core/outbox-waits.d.ts +39 -0
- package/dist/core/outbox-waits.js +88 -0
- package/dist/core/outbox.d.ts +156 -0
- package/dist/core/outbox.js +234 -0
- package/dist/core/registry-limits.d.ts +49 -0
- package/dist/core/registry-limits.js +10 -0
- package/dist/core/registry-schema-conversion.d.ts +20 -0
- package/dist/core/registry-schema-conversion.js +22 -0
- package/dist/core/registry-snapshot.d.ts +91 -42
- package/dist/core/registry-snapshot.js +39 -77
- package/dist/core/registry-workflow-contract-draft.d.ts +32 -0
- package/dist/core/registry-workflow-contract-draft.js +28 -0
- package/dist/core/registry-workflow-manifest.d.ts +122 -0
- package/dist/core/registry-workflow-manifest.js +92 -0
- package/dist/core/source/errors.d.ts +55 -0
- package/dist/core/source/errors.js +13 -0
- package/dist/core/source/index.d.ts +19 -0
- package/dist/core/source/index.js +4 -0
- package/dist/core/source/resolvers.d.ts +45 -0
- package/dist/core/source/resolvers.js +9 -0
- package/dist/core/source/types.d.ts +211 -0
- package/dist/core/source/types.js +0 -0
- package/dist/core/source/validate.d.ts +91 -0
- package/dist/core/source/validate.js +62 -0
- package/dist/core/source/workflow-source.d.ts +43 -0
- package/dist/core/source/workflow-source.js +16 -0
- package/dist/core/types/checkpoint.d.ts +14 -0
- package/dist/core/types/schedules.d.ts +52 -1
- package/dist/core/types/state.d.ts +16 -0
- package/dist/core/types/workflow-registries.d.ts +7 -0
- package/dist/core/types/workflow-registry.d.ts +12 -0
- package/dist/core/versioning.js +2 -0
- package/dist/core/weft-error.d.ts +1 -1
- package/dist/core/weft-error.js +12 -1
- package/dist/core/worker-execution-strategy.d.ts +1 -0
- package/dist/core/worker-execution-strategy.js +13 -1
- package/dist/core/worker-fault-handling.d.ts +10 -0
- package/dist/core/worker-fault-handling.js +1 -0
- package/dist/core/worker-inbound-message.d.ts +1 -0
- package/dist/core/worker-inbound-message.js +1 -0
- package/dist/core/worker-protocol-guard.js +4 -0
- package/dist/core/worker-protocol.d.ts +7 -0
- package/dist/core/worker-protocol.js +2 -1
- package/dist/core/worker-turn-watchdog.d.ts +8 -1
- package/dist/core/worker-turn-watchdog.js +3 -2
- package/dist/diagnostics/format.js +5 -0
- package/dist/diagnostics/types.d.ts +24 -0
- package/dist/diagnostics/version-check.js +8 -2
- package/dist/http.js +2 -2
- package/dist/index.d.ts +25 -4
- package/dist/index.js +57 -0
- package/dist/indexeddb.js +1 -1
- package/dist/json-schema.js +3 -3
- package/dist/mcp/resources.js +2 -0
- package/dist/runtime/portable.d.ts +9 -1
- package/dist/server/fault-to-json-rpc.js +4 -1
- package/dist/server/handler/auth-context-principal.js +4 -0
- package/dist/server/index.d.ts +11 -0
- package/dist/server/json-rpc-http.js +2 -0
- package/dist/server/json-rpc-websocket.js +6 -4
- package/dist/server/operation-catalog/index.d.ts +1 -1
- package/dist/server/operation-catalog/pipeline-helpers.js +2 -0
- package/dist/server/operation-catalog/types.d.ts +17 -0
- package/dist/server/operation-fault.d.ts +5 -0
- package/dist/server/operation-fault.js +4 -1
- package/dist/server/operations/activate-workflow-revision.d.ts +30 -0
- package/dist/server/operations/activate-workflow-revision.js +69 -0
- package/dist/server/operations/create-schedule.d.ts +2 -0
- package/dist/server/operations/create-schedule.js +10 -6
- package/dist/server/operations/fleet-events-subscription.js +1 -1
- package/dist/server/operations/fork-workflow.js +1 -1
- package/dist/server/operations/get-active-workflow-revision.d.ts +32 -0
- package/dist/server/operations/get-active-workflow-revision.js +46 -0
- package/dist/server/operations/get-catalog-diagnostics.d.ts +113 -0
- package/dist/server/operations/get-catalog-diagnostics.js +65 -0
- package/dist/server/operations/get-registry.js +17 -4
- package/dist/server/operations/get-task-detail-schema.d.ts +8 -0
- package/dist/server/operations/get-task-detail-schema.js +1 -0
- package/dist/server/operations/get-task-detail.d.ts +8 -0
- package/dist/server/operations/get-task-detail.js +1 -0
- package/dist/server/operations/get-task-diagnostics.d.ts +4 -4
- package/dist/server/operations/get-workflow-revision.d.ts +25 -0
- package/dist/server/operations/get-workflow-revision.js +50 -0
- package/dist/server/operations/install-workflow-revision.d.ts +27 -0
- package/dist/server/operations/install-workflow-revision.js +46 -0
- package/dist/server/operations/list-workflow-revisions.d.ts +20 -0
- package/dist/server/operations/list-workflow-revisions.js +40 -0
- package/dist/server/operations/preload-workflow-revision.d.ts +28 -0
- package/dist/server/operations/preload-workflow-revision.js +60 -0
- package/dist/server/operations/schedule-faults.d.ts +1 -0
- package/dist/server/operations/schedule-faults.js +32 -4
- package/dist/server/operations/schedule-rest-body.d.ts +1 -0
- package/dist/server/operations/schedule-rest-body.js +2 -1
- package/dist/server/operations/start-or-signal-workflow.js +1 -1
- package/dist/server/operations/start-workflow.js +1 -1
- package/dist/server/operations/static-registrations.js +42 -0
- package/dist/server/operations/storage.js +2 -2
- package/dist/server/operations/submit-review-decision.js +1 -1
- package/dist/server/operations/update-schedule.d.ts +2 -0
- package/dist/server/operations/update-schedule.js +4 -2
- package/dist/server/operations/workflow-catalog-operation-helpers.d.ts +59 -0
- package/dist/server/operations/workflow-catalog-operation-helpers.js +162 -0
- package/dist/server/runtime/task-dispatch-envelope.d.ts +14 -0
- package/dist/server/runtime/task-dispatch-envelope.js +32 -0
- package/dist/server/runtime/task-dispatch-revision.d.ts +29 -0
- package/dist/server/runtime/task-dispatch-revision.js +13 -0
- package/dist/server/runtime/task-dispatch.js +12 -37
- package/dist/server/runtime/task-ledger-recovery.js +1 -1
- package/dist/server/runtime/task-ledger-runtime.d.ts +14 -2
- package/dist/server/runtime/task-ledger-runtime.js +5 -3
- package/dist/server/runtime/task-polling.js +9 -3
- package/dist/server/runtime/task-reconciliation.js +2 -1
- package/dist/server/runtime/websocket-upgrade.js +2 -0
- package/dist/server/runtime/websocket-worker.js +9 -0
- package/dist/server/task-ledger-codec.d.ts +9 -0
- package/dist/server/task-ledger-codec.js +4 -1
- package/dist/server/task-ledger-transition-helpers.js +1 -0
- package/dist/server/task-ledger-types.d.ts +9 -0
- package/dist/server/task-ledger.d.ts +1 -1
- package/dist/server/task-ledger.js +2 -1
- package/dist/server/task-queue-types.d.ts +2 -0
- package/dist/storage/bun-sql.js +51 -6
- package/dist/storage/catalog-keys.d.ts +64 -0
- package/dist/storage/catalog-keys.js +8 -0
- package/dist/storage/compressed-storage.js +1 -1
- package/dist/storage/derived-operations.js +1 -1
- package/dist/storage/index.d.ts +28 -1
- package/dist/storage/interface.d.ts +28 -1
- package/dist/storage/interface.js +1 -1
- package/dist/storage/key-encoding.d.ts +15 -0
- package/dist/storage/key-encoding.js +3 -0
- package/dist/storage/key-prefixes.d.ts +1 -1
- package/dist/storage/key-prefixes.js +16 -0
- package/dist/storage/lmdb.d.ts +54 -1
- package/dist/storage/lmdb.js +1 -1
- package/dist/storage/mailbox-keys.d.ts +80 -0
- package/dist/storage/mailbox-keys.js +14 -0
- package/dist/storage/memory.js +1 -1
- package/dist/storage/neon.js +2 -2
- package/dist/storage/node-sqlite-loader.d.ts +1 -1
- package/dist/storage/node-sqlite.js +51 -6
- package/dist/storage/outbox-keys.d.ts +77 -0
- package/dist/storage/outbox-keys.js +14 -0
- package/dist/storage/postgres.js +2 -2
- package/dist/storage/resolve.js +1 -1
- package/dist/storage/scoped-storage.js +1 -1
- package/dist/storage/storage-configuration.d.ts +6 -0
- package/dist/storage/testing.js +1 -1
- package/dist/storage/turso.js +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/web-extension.js +1 -1
- package/dist/worker/manifest/registry-contract-builder.d.ts +21 -3
- package/dist/worker/manifest/registry-contract-builder.js +40 -31
- package/dist/worker/protocol-messages.d.ts +17 -0
- package/dist/worker/protocol-schemas.d.ts +32 -0
- package/dist/worker/protocol-schemas.js +7 -3
- package/dist/worker/protocol-task-result.js +35 -3
- package/dist/worker/protocol.js +1 -1
- package/dist/worker/registry/types.d.ts +2 -0
- package/dist/worker/registry.d.ts +1 -1
- package/dist/worker/registry.js +3 -1
- package/dist/workers/workflow-runner.d.ts +9 -0
- package/dist/workers/workflow-runner.js +9 -2
- package/dist/workers/workflow-worker-entry.js +9 -4
- package/package.json +2 -2
|
@@ -1,15 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
KEYS,
|
|
3
|
-
requireStorageCapability,
|
|
4
|
-
storageHas
|
|
5
|
-
} from "../../storage/interface.js";
|
|
1
|
+
import { KEYS, storageHas } from "../../storage/interface.js";
|
|
6
2
|
import { assertScopedBulkWorkflowFilter } from "../bulk-workflow-filter.js";
|
|
7
|
-
import {
|
|
8
|
-
import { decode, encode } from "../codec.js";
|
|
9
|
-
import { buildTimerBatchOperations } from "../scheduler.js";
|
|
10
|
-
import { buildIndexOperations } from "../search-attributes.js";
|
|
11
|
-
import { buildTerminalWorkflowIndexOperations, bulkMutateWorkflowTags } from "./attributes-tags.js";
|
|
3
|
+
import { bulkMutateWorkflowTags } from "./attributes-tags.js";
|
|
12
4
|
import { purgeInternal, purgeWorkflow } from "./bulk-operations-purge.js";
|
|
5
|
+
import { runBulkFailedWorkflowRetry } from "./bulk-operations-retry.js";
|
|
13
6
|
import {
|
|
14
7
|
buildActionableBulkWorkflowFilter,
|
|
15
8
|
buildBulkOperationPreparation,
|
|
@@ -17,43 +10,19 @@ import {
|
|
|
17
10
|
normalizeBulkOperationOptions,
|
|
18
11
|
prepareBulkOperation,
|
|
19
12
|
resolveBulkOperationConcurrency,
|
|
13
|
+
runBulkWorkflowPool,
|
|
20
14
|
shouldPersistBulkAudit,
|
|
21
15
|
toBulkOperationError,
|
|
22
16
|
validateBulkConfirmation,
|
|
23
17
|
withBulkAuditEvent
|
|
24
18
|
} from "./bulk-operations-shared.js";
|
|
25
19
|
import { BulkDeleteRequiresTerminalWorkflowsError } from "./errors.js";
|
|
26
|
-
import {
|
|
27
|
-
assertLeaseHeldForEngineWork,
|
|
28
|
-
commitFencedEngineWriteAllowingPreconditionFailure
|
|
29
|
-
} from "./fenced-write.js";
|
|
20
|
+
import { assertLeaseHeldForEngineWork } from "./fenced-write.js";
|
|
30
21
|
import { BULK_OPERATION_BATCH_SIZE } from "./listing.js";
|
|
31
|
-
import {
|
|
32
|
-
import {
|
|
33
|
-
import { decodeWorkflowState, isTerminalWorkflowStatus } from "./validation.js";
|
|
34
|
-
import {
|
|
35
|
-
commitWithWorkflowClaimFold,
|
|
36
|
-
prepareWorkflowClaimFold,
|
|
37
|
-
throwWorkflowClaimUnavailable
|
|
38
|
-
} from "./workflow-claim-fold.js";
|
|
39
|
-
import { buildWorkflowConcurrencyStartOperations } from "./workflow-concurrency.js";
|
|
40
|
-
import { buildWorkflowVisibilityIndexTransition } from "./workflow-indexes.js";
|
|
22
|
+
import { loadWorkflowState } from "./storage-io.js";
|
|
23
|
+
import { isTerminalWorkflowStatus } from "./validation.js";
|
|
41
24
|
export { purgeInternal, TERMINAL_CLEANUP_DELAY_MS } from "./bulk-operations-purge.js";
|
|
42
|
-
const ACTIVE_WORKFLOW_STATUSES = ["pending", "running", "suspended"]
|
|
43
|
-
async function runBulkWorkflowPool(items, concurrencyLimit, operation) {
|
|
44
|
-
const results = [];
|
|
45
|
-
for (let batchStart = 0;batchStart < items.length; batchStart += concurrencyLimit) {
|
|
46
|
-
const batchItems = items.slice(batchStart, batchStart + concurrencyLimit);
|
|
47
|
-
results.push(...await Promise.all(batchItems.map(async (item) => {
|
|
48
|
-
try {
|
|
49
|
-
return { item, status: "fulfilled", value: await operation(item) };
|
|
50
|
-
} catch (reason) {
|
|
51
|
-
return { item, status: "rejected", reason };
|
|
52
|
-
}
|
|
53
|
-
})));
|
|
54
|
-
}
|
|
55
|
-
return results;
|
|
56
|
-
}
|
|
25
|
+
const ACTIVE_WORKFLOW_STATUSES = ["pending", "running", "suspended"];
|
|
57
26
|
export async function purge(internals, filter, cleanupWaiters) {
|
|
58
27
|
return purgeInternal(internals, filter, { expiredOnly: !1, now: internals.options.getNow() }, cleanupWaiters);
|
|
59
28
|
}
|
|
@@ -95,138 +64,10 @@ async function runBulkCancellation(internals, filter, options = {}) {
|
|
|
95
64
|
export async function cancelAll(internals, filter, options = {}) {
|
|
96
65
|
return runBulkCancellation(internals, filter, options);
|
|
97
66
|
}
|
|
98
|
-
async function runBulkFailedWorkflowRetry(internals, filter, options = {}) {
|
|
99
|
-
options = normalizeBulkOperationOptions(options);
|
|
100
|
-
assertScopedBulkWorkflowFilter(filter);
|
|
101
|
-
const actionableFilter = buildActionableBulkWorkflowFilter(internals, filter, FAILED_WORKFLOW_STATUSES), preparation = await prepareBulkOperation(internals, "retry-failed", actionableFilter, filter, {}, options);
|
|
102
|
-
if (options.dryRun === !0)
|
|
103
|
-
return preparation.preview;
|
|
104
|
-
validateBulkConfirmation(options, preparation);
|
|
105
|
-
const bulkConcurrency = resolveBulkOperationConcurrency(options);
|
|
106
|
-
let retried = 0;
|
|
107
|
-
const errors = [], retryResults = await runBulkWorkflowPool(preparation.workflowIds, bulkConcurrency, async (workflowId) => {
|
|
108
|
-
await retryFailedWorkflow(internals, workflowId);
|
|
109
|
-
return { status: "retried" };
|
|
110
|
-
});
|
|
111
|
-
for (const retryResult of retryResults) {
|
|
112
|
-
if (retryResult.status === "rejected") {
|
|
113
|
-
errors.push(toBulkOperationError(internals, retryResult.item, retryResult.reason));
|
|
114
|
-
continue;
|
|
115
|
-
}
|
|
116
|
-
retried += 1;
|
|
117
|
-
}
|
|
118
|
-
const result = { retried, failed: errors.length, errors };
|
|
119
|
-
if (!shouldPersistBulkAudit(options))
|
|
120
|
-
return result;
|
|
121
|
-
return withBulkAuditEvent(internals, preparation, options, result, retried);
|
|
122
|
-
}
|
|
123
67
|
export async function retryFailedAll(internals, filter, options = {}) {
|
|
124
68
|
assertLeaseHeldForEngineWork(internals);
|
|
125
69
|
return runBulkFailedWorkflowRetry(internals, filter, options);
|
|
126
70
|
}
|
|
127
|
-
async function retryFailedWorkflow(internals, workflowId) {
|
|
128
|
-
const state = await loadWorkflowState(internals, workflowId);
|
|
129
|
-
if (state === null)
|
|
130
|
-
throw Error("Workflow no longer exists");
|
|
131
|
-
if (state.status !== "failed")
|
|
132
|
-
throw Error(`Workflow is ${state.status}, not failed`);
|
|
133
|
-
if (await internals.storage.get(KEYS.checkpoint(workflowId)) !== null) {
|
|
134
|
-
await reactivateFailedWorkflowFromCheckpoint(internals, state);
|
|
135
|
-
await internals.engine.resume(workflowId);
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
await internals.engine.start(state.type, state.input, {
|
|
139
|
-
id: workflowId,
|
|
140
|
-
onTerminalConflict: "start-new",
|
|
141
|
-
...state.tags !== void 0 ? { tags: state.tags } : {}
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
async function reactivateFailedWorkflowFromCheckpoint(internals, state) {
|
|
145
|
-
const reactivated = await runSerializedWorkflowStateWrite(internals, state.id, async () => reactivateFailedWorkflowFromCheckpointSerialized(internals, state.id));
|
|
146
|
-
if (reactivated.terminalCleanupTimerId !== void 0)
|
|
147
|
-
await internals.scheduler.cancel(reactivated.terminalCleanupTimerId, state.id);
|
|
148
|
-
}
|
|
149
|
-
async function reactivateFailedWorkflowFromCheckpointSerialized(internals, workflowId) {
|
|
150
|
-
let lastConcurrencyStateKey;
|
|
151
|
-
for (let attempt = 0;attempt < CHECKPOINT_RETRY_CONCURRENCY_ADMISSION_MAX_ATTEMPTS; attempt += 1) {
|
|
152
|
-
const currentStateBytes = await internals.storage.get(KEYS.workflow(workflowId));
|
|
153
|
-
if (currentStateBytes === null)
|
|
154
|
-
throw Error("Workflow no longer exists");
|
|
155
|
-
const currentState = decodeWorkflowState(currentStateBytes);
|
|
156
|
-
if (currentState.status !== "failed")
|
|
157
|
-
throw Error(`Workflow is ${currentState.status}, not failed`);
|
|
158
|
-
const currentCheckpointBytes = await internals.storage.get(KEYS.checkpoint(workflowId));
|
|
159
|
-
if (currentCheckpointBytes === null)
|
|
160
|
-
throw Error("Checkpoint no longer exists");
|
|
161
|
-
const checkpoint = deserializeCheckpoint(currentCheckpointBytes), registration = internals.registrations.get(currentState.type);
|
|
162
|
-
if (registration === void 0)
|
|
163
|
-
throw Error(`No workflow registered with name "${currentState.type}" (needed to retry "${workflowId}")`);
|
|
164
|
-
const concurrencyStartOperations = registration.concurrency === void 0 ? void 0 : await buildWorkflowConcurrencyStartOperations(internals, currentState.type, workflowId, currentState.input, registration.concurrency);
|
|
165
|
-
lastConcurrencyStateKey = concurrencyStartOperations?.stateKey ?? lastConcurrencyStateKey;
|
|
166
|
-
const reactivatedState = buildReactivatedWorkflowState(internals, currentState), currentAttributes = await loadSearchAttributes(internals, workflowId), operations = [
|
|
167
|
-
...buildTerminalWorkflowIndexOperations(currentState, reactivatedState),
|
|
168
|
-
{ type: "put", key: KEYS.workflow(workflowId), value: encode(reactivatedState) },
|
|
169
|
-
...buildWorkflowVisibilityIndexTransition(workflowId, currentState, reactivatedState).batchOps,
|
|
170
|
-
...buildRetrySearchAttributeOperations(workflowId, currentAttributes, checkpoint.searchAttributes),
|
|
171
|
-
...reactivatedState.executionDeadline === void 0 ? [] : buildTimerBatchOperations({
|
|
172
|
-
id: `deadline:${workflowId}`,
|
|
173
|
-
workflowId,
|
|
174
|
-
fireAt: reactivatedState.executionDeadline,
|
|
175
|
-
kind: "execution-deadline"
|
|
176
|
-
}),
|
|
177
|
-
...concurrencyStartOperations?.operations ?? []
|
|
178
|
-
], conditions = concurrencyStartOperations?.conditions ?? [];
|
|
179
|
-
if (await commitFailedWorkflowReactivation(internals, workflowId, operations, conditions))
|
|
180
|
-
return {
|
|
181
|
-
terminalCleanupTimerId: currentState.terminalCleanupToken === void 0 ? void 0 : createTerminalCleanupTimerId(!1, currentState.terminalCleanupToken)
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
throw Error(`Workflow concurrency admission for "${lastConcurrencyStateKey ?? workflowId}" changed too many times while retrying failed workflow "${workflowId}"`);
|
|
185
|
-
}
|
|
186
|
-
async function commitFailedWorkflowReactivation(internals, workflowId, operations, conditions) {
|
|
187
|
-
const claimFold = await prepareWorkflowClaimFold(internals, workflowId);
|
|
188
|
-
if (claimFold === void 0) {
|
|
189
|
-
if (conditions.length > 0)
|
|
190
|
-
requireStorageCapability(internals.storage, "conditionalBatch", "retry failed workflow");
|
|
191
|
-
return commitFencedEngineWriteAllowingPreconditionFailure(internals, workflowId, operations, conditions);
|
|
192
|
-
}
|
|
193
|
-
const result = await commitWithWorkflowClaimFold(internals, claimFold, operations, conditions, "retry failed workflow claim acquisition");
|
|
194
|
-
if (result.status === "committed")
|
|
195
|
-
return !0;
|
|
196
|
-
return result.claimConflict ? throwWorkflowClaimUnavailable(internals, workflowId) : !1;
|
|
197
|
-
}
|
|
198
|
-
function buildReactivatedWorkflowState(internals, state) {
|
|
199
|
-
const reactivatedState = {
|
|
200
|
-
...state,
|
|
201
|
-
status: "running",
|
|
202
|
-
updatedAt: internals.options.getNow()
|
|
203
|
-
};
|
|
204
|
-
delete reactivatedState.error;
|
|
205
|
-
delete reactivatedState.errorStack;
|
|
206
|
-
delete reactivatedState.failureCategory;
|
|
207
|
-
delete reactivatedState.result;
|
|
208
|
-
delete reactivatedState.terminationReason;
|
|
209
|
-
delete reactivatedState.terminalCleanupToken;
|
|
210
|
-
return reactivatedState;
|
|
211
|
-
}
|
|
212
|
-
async function loadSearchAttributes(internals, workflowId) {
|
|
213
|
-
const attributeBytes = await internals.storage.get(KEYS.attribute(workflowId));
|
|
214
|
-
if (attributeBytes === null)
|
|
215
|
-
return {};
|
|
216
|
-
return decode(attributeBytes);
|
|
217
|
-
}
|
|
218
|
-
function buildRetrySearchAttributeOperations(workflowId, currentAttributes, checkpointAttributes) {
|
|
219
|
-
const operations = buildIndexOperations(workflowId, currentAttributes, checkpointAttributes);
|
|
220
|
-
if (Object.keys(checkpointAttributes).length === 0)
|
|
221
|
-
operations.push({ type: "delete", key: KEYS.attribute(workflowId) });
|
|
222
|
-
else
|
|
223
|
-
operations.push({
|
|
224
|
-
type: "put",
|
|
225
|
-
key: KEYS.attribute(workflowId),
|
|
226
|
-
value: encode(checkpointAttributes)
|
|
227
|
-
});
|
|
228
|
-
return operations;
|
|
229
|
-
}
|
|
230
71
|
export async function signalAll(internals, filter, name, payload, maybeOptions) {
|
|
231
72
|
const options = normalizeBulkOperationOptions(maybeOptions ?? {});
|
|
232
73
|
assertScopedBulkWorkflowFilter(filter);
|
|
@@ -16,6 +16,7 @@ import {
|
|
|
16
16
|
createReviewOperationCallbacks,
|
|
17
17
|
handleScheduleTimerForEngine
|
|
18
18
|
} from "./callback-creators-schedule.js";
|
|
19
|
+
import { resolveExecutableRegistrationForRevision } from "./dynamic-source-execution.js";
|
|
19
20
|
import { commitFencedEngineWrite } from "./fenced-write.js";
|
|
20
21
|
import { guardTerminalWorkflow, guardTerminalWorkflowAfterCoordinatedRequest } from "./guards.js";
|
|
21
22
|
import { getInternals } from "./internals.js";
|
|
@@ -122,7 +123,7 @@ export function createTimeOperationCallbacks(engine) {
|
|
|
122
123
|
loadWorkflowState: (workflowId) => loadWorkflowState(getInternals(engine), workflowId),
|
|
123
124
|
failWorkflow: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine)),
|
|
124
125
|
runSerializedWorkflowStateWrite: (workflowId, writeOperation) => runSerializedWorkflowStateWrite(getInternals(engine), workflowId, writeOperation),
|
|
125
|
-
beginWorkflowExecution: (workflowId, workflowExecutionToken, workflowType, input, checkpoint, executionDeadline, executionStateOwnerId, registration) => beginWorkflowExecution(getInternals(engine), workflowId, workflowExecutionToken, workflowType, input, checkpoint, executionDeadline, executionStateOwnerId, registration, createLifecycleCallbacks(engine)),
|
|
126
|
+
beginWorkflowExecution: (workflowId, workflowExecutionToken, workflowType, revision, input, checkpoint, executionDeadline, executionStateOwnerId, registration) => beginWorkflowExecution(getInternals(engine), workflowId, workflowExecutionToken, workflowType, revision, input, checkpoint, executionDeadline, executionStateOwnerId, registration, createLifecycleCallbacks(engine)),
|
|
126
127
|
workflowVersionTupleFromState: (state) => workflowVersionTupleFromState(getInternals(engine), state, createLifecycleCallbacks(engine)),
|
|
127
128
|
setWorkflowStartHeaders: (workflowId, headers) => setWorkflowStartHeaders(getInternals(engine), workflowId, headers, createLifecycleCallbacks(engine)),
|
|
128
129
|
loadWorkflowStartHeaders: (workflowId) => loadWorkflowStartHeaders(getInternals(engine), workflowId, createLifecycleCallbacks(engine)),
|
|
@@ -131,7 +132,8 @@ export function createTimeOperationCallbacks(engine) {
|
|
|
131
132
|
runWorkflowFinalizer: (workflowId, timerId) => runWorkflowFinalizer(getInternals(engine), workflowId, timerId, createTerminationCallbacks(engine)),
|
|
132
133
|
handleScheduleTimer: (entry) => handleScheduleTimerForEngine(engine, entry),
|
|
133
134
|
timeout: (workflowId) => engine.timeout(workflowId),
|
|
134
|
-
handleCleanupError: (source, error, workflowId) => createTerminationCallbacks(engine).handleCleanupError(source, error, workflowId)
|
|
135
|
+
handleCleanupError: (source, error, workflowId) => createTerminationCallbacks(engine).handleCleanupError(source, error, workflowId),
|
|
136
|
+
resolveExecutableRegistrationForRevision: (type, revision) => resolveExecutableRegistrationForRevision(engine, getInternals(engine), type, revision)
|
|
135
137
|
};
|
|
136
138
|
}
|
|
137
139
|
export function createUpdateCallbacks(engine) {
|
|
@@ -3,6 +3,10 @@ import {
|
|
|
3
3
|
broadcast as broadcastFromInternals,
|
|
4
4
|
forwardEventToHandle as forwardEventToHandleFromBroadcast
|
|
5
5
|
} from "./broadcast.js";
|
|
6
|
+
import {
|
|
7
|
+
resolveExecutableRegistration,
|
|
8
|
+
resolveExecutableRegistrationForRevision
|
|
9
|
+
} from "./dynamic-source-execution.js";
|
|
6
10
|
import { createWorkflowHandleWithResultPromise } from "./handle-result.js";
|
|
7
11
|
import {
|
|
8
12
|
hasLocalCheckpointOwnership,
|
|
@@ -79,7 +83,11 @@ export function createLifecycleCallbacks(engine) {
|
|
|
79
83
|
failWorkflowForUnavailableServices: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system"),
|
|
80
84
|
failWorkflowForRecoveryHook: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system"),
|
|
81
85
|
failWorkflowForCheckpointDecodeError: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system"),
|
|
82
|
-
failWorkflowForVersionMismatch: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system")
|
|
86
|
+
failWorkflowForVersionMismatch: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system"),
|
|
87
|
+
resolveExecutableRegistration: (type, onRevisionChosen) => resolveExecutableRegistration(engine, getInternals(engine), type, onRevisionChosen),
|
|
88
|
+
failWorkflowForUnavailableDynamicSource: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system"),
|
|
89
|
+
resolveExecutableRegistrationForRevision: (type, revision) => resolveExecutableRegistrationForRevision(engine, getInternals(engine), type, revision),
|
|
90
|
+
failWorkflowForRevisionUnavailable: (workflowId, error) => failWorkflow(getInternals(engine), workflowId, error, createTerminationCallbacks(engine), "system")
|
|
83
91
|
};
|
|
84
92
|
}
|
|
85
93
|
export function createTerminationCallbacksWith(engine, handleScheduledWorkflowTerminal) {
|
|
@@ -20,8 +20,8 @@ import { feedOperationResult } from "./strategy-helpers.js";
|
|
|
20
20
|
import { ensureTerminalCleanupTracked, failWorkflow, handleCleanupError } from "./termination.js";
|
|
21
21
|
export function createScheduleCallbacks(engine) {
|
|
22
22
|
return {
|
|
23
|
-
startWorkflow: async (type, input, options, additionalStartOperations) => {
|
|
24
|
-
await startWorkflow(getInternals(engine), type, input, options, additionalStartOperations, createLifecycleCallbacks(engine));
|
|
23
|
+
startWorkflow: async (type, input, options, additionalStartOperations, revisionOverride) => {
|
|
24
|
+
await startWorkflow(getInternals(engine), type, input, options, additionalStartOperations, createLifecycleCallbacks(engine), void 0, revisionOverride);
|
|
25
25
|
},
|
|
26
26
|
loadWorkflowState: (workflowId) => loadWorkflowState(getInternals(engine), workflowId),
|
|
27
27
|
cancelWorkflow: (workflowId) => engine.cancel(workflowId),
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `activateCatalogRevisionCandidate` — a thin engine-level wrapper around
|
|
3
|
+
* `WorkflowCatalog.activateCandidate()`, the guarded activation primitive
|
|
4
|
+
* (WFT-9/WFT-10). Awaits catalog readiness, reads pre-activation state,
|
|
5
|
+
* calls the guarded primitive, dispatches the correct catalog event(s), and
|
|
6
|
+
* returns the primitive's own structured result verbatim:
|
|
7
|
+
* the shared installed/activated/draining helper on success, or
|
|
8
|
+
* `WorkflowRevisionActivationRejectedEvent` directly on refusal.
|
|
9
|
+
*
|
|
10
|
+
* `engine.workflows.activate()` (WFT-11,
|
|
11
|
+
* `core/engine/engine-workflows-namespace.ts`) is this wrapper's production
|
|
12
|
+
* caller — the only practical way an external caller reaches the guarded
|
|
13
|
+
* candidate-activation primitive, so routing it through here (rather than
|
|
14
|
+
* calling `WorkflowCatalog.activateCandidate()` directly) is what makes a
|
|
15
|
+
* manual activation dispatch `catalog:revision-installed`/
|
|
16
|
+
* `catalog:revision-activated`/`catalog:revision-draining`/
|
|
17
|
+
* `catalog:activation-rejected` the same way `engine.register()`'s
|
|
18
|
+
* drain path already does.
|
|
19
|
+
*
|
|
20
|
+
* Never imports `./index.ts` as a value (only as a type, matching
|
|
21
|
+
* `catalog-readiness.ts`'s own import-cycle discipline for itself) — the
|
|
22
|
+
* `Engine` class import here is `import type`, erased at build time.
|
|
23
|
+
*
|
|
24
|
+
* @module core/engine/catalog-activation
|
|
25
|
+
*/
|
|
26
|
+
import type { ActivateCandidateOptions, WorkflowCatalogActivationResult } from '../catalog/index.ts';
|
|
27
|
+
import type { WorkflowRevisionManifest } from '../contract/types.ts';
|
|
28
|
+
import type { Engine } from './index.ts';
|
|
29
|
+
/**
|
|
30
|
+
* Activate `candidateManifest` for `name` through the catalog's guarded
|
|
31
|
+
* primitive (`checkWorkflowCompatibility`-gated, single-shot CAS), and
|
|
32
|
+
* return its structured result verbatim. On success, dispatches
|
|
33
|
+
* `catalog:revision-installed` (when genuinely new content),
|
|
34
|
+
* `catalog:revision-draining` (when displacing a prior active revision),
|
|
35
|
+
* and `catalog:revision-activated`. On refusal, dispatches
|
|
36
|
+
* `catalog:activation-rejected` carrying only the bounded `reason` code
|
|
37
|
+
* (and, for `'incompatible'`, the bounded `incompatibilityReasons` array) —
|
|
38
|
+
* never the full `WorkflowCompatibilityVerdict` object.
|
|
39
|
+
*/
|
|
40
|
+
export declare function activateCatalogRevisionCandidate(engine: Engine, name: string, candidateManifest: WorkflowRevisionManifest, options?: ActivateCandidateOptions): Promise<WorkflowCatalogActivationResult>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { WorkflowRevisionActivationRejectedEvent } from "../events/catalog-events.js";
|
|
2
|
+
import { dispatchCatalogInstallAndActivatedEvents } from "./catalog-events.js";
|
|
3
|
+
import { ensureWorkflowCatalogReady, getWorkflowCatalog } from "./catalog-readiness.js";
|
|
4
|
+
export async function activateCatalogRevisionCandidate(engine, name, candidateManifest, options) {
|
|
5
|
+
await ensureWorkflowCatalogReady(engine);
|
|
6
|
+
const catalog = getWorkflowCatalog(engine), preExisting = await catalog.hasInstalled(name, candidateManifest.revision), pointerBefore = await catalog.resolveActiveDurable(name) ?? null, result = await catalog.activateCandidate(name, candidateManifest, options);
|
|
7
|
+
if (result.applied) {
|
|
8
|
+
dispatchCatalogInstallAndActivatedEvents(engine, name, candidateManifest.revision, preExisting, pointerBefore, result.pointer);
|
|
9
|
+
return result;
|
|
10
|
+
}
|
|
11
|
+
if (result.reason === "incompatible") {
|
|
12
|
+
engine.dispatchEvent(new WorkflowRevisionActivationRejectedEvent(name, candidateManifest.revision, result.reason, result.verdict.compatible ? void 0 : result.verdict.reasons));
|
|
13
|
+
return result;
|
|
14
|
+
}
|
|
15
|
+
engine.dispatchEvent(new WorkflowRevisionActivationRejectedEvent(name, candidateManifest.revision, result.reason));
|
|
16
|
+
return result;
|
|
17
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared installed/activated/draining event-dispatch helper (WFT-12), used
|
|
3
|
+
* by BOTH producers of catalog activation: `catalog-readiness.ts`'s
|
|
4
|
+
* `drainPendingCatalogInstalls` (the `engine.register()`-drain path) and
|
|
5
|
+
* `catalog-activation.ts`'s `activateCatalogRevisionCandidate` (the guarded
|
|
6
|
+
* primitive). The two producers return different result shapes
|
|
7
|
+
* (`activateRegistered` always succeeds and returns a bare pointer;
|
|
8
|
+
* `activateCandidate` returns a union that can also refuse) — this helper
|
|
9
|
+
* takes already-normalized before/after pointer values instead of either
|
|
10
|
+
* raw return type, so it stays agnostic to which producer called it.
|
|
11
|
+
* `activation-rejected` is NOT dispatched here — only `activateCandidate`
|
|
12
|
+
* can refuse, so its one caller dispatches that event itself.
|
|
13
|
+
*
|
|
14
|
+
* @module core/engine/catalog-events
|
|
15
|
+
*/
|
|
16
|
+
import type { WorkflowCatalogActivePointer } from '../catalog/index.ts';
|
|
17
|
+
import type { Engine } from './index.ts';
|
|
18
|
+
/**
|
|
19
|
+
* Dispatch `catalog:revision-installed` (only when `preExisting` is
|
|
20
|
+
* `false` — genuinely new content, not a byte-identical reinstall or a
|
|
21
|
+
* cross-process durable adoption of already-present content), then decide
|
|
22
|
+
* activated/draining from how `pointerBefore` and `pointerAfter` compare:
|
|
23
|
+
*
|
|
24
|
+
* - Identical `revision` AND `generation` (a true no-op — nothing was
|
|
25
|
+
* durably written, e.g. `activateRegistered`'s own no-op branch): neither
|
|
26
|
+
* fires.
|
|
27
|
+
* - Same `revision`, different `generation` (a reactivation that still
|
|
28
|
+
* bumped the fencing counter, e.g. `activateCandidate` re-activating the
|
|
29
|
+
* currently active revision): `catalog:revision-activated` fires with
|
|
30
|
+
* `previousRevision: undefined` — nothing was actually displaced, so
|
|
31
|
+
* there is nothing to drain.
|
|
32
|
+
* - Different `revision`: `catalog:revision-draining` for `pointerBefore`
|
|
33
|
+
* (when it existed) followed by `catalog:revision-activated` for
|
|
34
|
+
* `pointerAfter`, `previousRevision` set to the displaced revision.
|
|
35
|
+
*/
|
|
36
|
+
export declare function dispatchCatalogInstallAndActivatedEvents(engine: Engine, name: string, revision: string, preExisting: boolean, pointerBefore: WorkflowCatalogActivePointer | null, pointerAfter: WorkflowCatalogActivePointer): void;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WorkflowRevisionActivatedEvent,
|
|
3
|
+
WorkflowRevisionDrainingEvent,
|
|
4
|
+
WorkflowRevisionInstalledEvent
|
|
5
|
+
} from "../events/catalog-events.js";
|
|
6
|
+
export function dispatchCatalogInstallAndActivatedEvents(engine, name, revision, preExisting, pointerBefore, pointerAfter) {
|
|
7
|
+
if (!preExisting)
|
|
8
|
+
engine.dispatchEvent(new WorkflowRevisionInstalledEvent(name, revision));
|
|
9
|
+
if (pointerBefore !== null && pointerBefore.revision === pointerAfter.revision && pointerBefore.generation === pointerAfter.generation)
|
|
10
|
+
return;
|
|
11
|
+
const previousRevision = pointerBefore !== null && pointerBefore.revision !== pointerAfter.revision ? pointerBefore.revision : void 0;
|
|
12
|
+
if (previousRevision !== void 0)
|
|
13
|
+
engine.dispatchEvent(new WorkflowRevisionDrainingEvent(name, previousRevision));
|
|
14
|
+
engine.dispatchEvent(new WorkflowRevisionActivatedEvent(name, pointerAfter.revision, pointerAfter.generation, previousRevision));
|
|
15
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sync/async boundary glue between `engine.register()` (synchronous,
|
|
3
|
+
* cannot itself build a manifest — that requires `crypto.subtle`) and the
|
|
4
|
+
* durable workflow catalog (async, WFT-9/WFT-10).
|
|
5
|
+
*
|
|
6
|
+
* `register()` stays byte-for-byte synchronous; `commitWorkflowDefinition`
|
|
7
|
+
* (`registration.ts`) only pushes the workflow's name onto
|
|
8
|
+
* `EngineInternals.pendingCatalogInstalls`. {@link ensureWorkflowCatalogReady}
|
|
9
|
+
* is the memoized function that, on first call, restores the catalog from
|
|
10
|
+
* storage, then drains `pendingCatalogInstalls` — building each pending
|
|
11
|
+
* workflow's manifest via the already-existing
|
|
12
|
+
* `buildWorkflowManifestForType` (`registry-workflow-manifest.ts`, reused
|
|
13
|
+
* rather than reimplemented) and unconditionally activating it via
|
|
14
|
+
* `WorkflowCatalog.activateRegistered`.
|
|
15
|
+
*
|
|
16
|
+
* Awaited at every entry point that can observe catalog state — see the
|
|
17
|
+
* call sites in `index.ts` — so "restore catalog state before recovery or
|
|
18
|
+
* any new start" holds.
|
|
19
|
+
*
|
|
20
|
+
* @module core/engine/catalog-readiness
|
|
21
|
+
*/
|
|
22
|
+
import type { Engine } from './index.ts';
|
|
23
|
+
export { getWorkflowCatalog } from './internals.ts';
|
|
24
|
+
/**
|
|
25
|
+
* Synchronous fast-path check: `true` once the catalog is restored and
|
|
26
|
+
* nothing is pending, `false` when {@link ensureWorkflowCatalogReady} would
|
|
27
|
+
* need to do real work. Every `ensureWorkflowCatalogReady` call site in
|
|
28
|
+
* `index.ts` guards its `await` with this check first — `await`ing an
|
|
29
|
+
* `async` function always costs one microtask tick even when the function's
|
|
30
|
+
* own body takes the fast path internally (JS's `await` semantics, not an
|
|
31
|
+
* implementation detail), so skipping the call entirely on an already-warm
|
|
32
|
+
* engine is what "avoid promise-machinery overhead on the hot path" (the
|
|
33
|
+
* WFT-9/WFT-10 design) actually requires — not just an early return inside
|
|
34
|
+
* the async function.
|
|
35
|
+
*/
|
|
36
|
+
export declare function isWorkflowCatalogReady(engine: Engine): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Restore the workflow catalog from storage (once per engine instance) and
|
|
39
|
+
* drain any workflow names `engine.register()` has queued since the last
|
|
40
|
+
* drain. Memoized: concurrent callers await the same in-flight promise, and
|
|
41
|
+
* a call after a prior drain resolved with newly queued names starts a
|
|
42
|
+
* fresh drain rather than re-scanning storage.
|
|
43
|
+
*
|
|
44
|
+
* Also checks the {@link isWorkflowCatalogReady} fast path itself, so a
|
|
45
|
+
* direct call (bypassing a call site's own guard — as in
|
|
46
|
+
* `buildRegistrySnapshot`, or any future caller) is still cheap and correct
|
|
47
|
+
* without relying on every caller remembering to pre-check.
|
|
48
|
+
*/
|
|
49
|
+
export declare function ensureWorkflowCatalogReady(engine: Engine): Promise<void>;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { restoreWorkflowCatalog, WorkflowCatalog } from "../catalog/index.js";
|
|
2
|
+
import { buildWorkflowManifestForType } from "../registry-workflow-manifest.js";
|
|
3
|
+
import { dispatchCatalogInstallAndActivatedEvents } from "./catalog-events.js";
|
|
4
|
+
import { resolveOrphanedCatalogTombstones } from "./catalog-tombstone-recovery.js";
|
|
5
|
+
import { EngineDisposedError } from "./errors.js";
|
|
6
|
+
import { getInternals } from "./internals.js";
|
|
7
|
+
export { getWorkflowCatalog } from "./internals.js";
|
|
8
|
+
async function drainPendingCatalogInstalls(engine) {
|
|
9
|
+
const internals = getInternals(engine), catalog = internals.workflowCatalog, pending = internals.pendingCatalogInstalls;
|
|
10
|
+
internals.pendingCatalogInstalls = [];
|
|
11
|
+
for (let index = 0;index < pending.length; index += 1) {
|
|
12
|
+
const name = pending[index];
|
|
13
|
+
try {
|
|
14
|
+
const manifest = await buildWorkflowManifestForType(engine, name);
|
|
15
|
+
if (manifest === void 0)
|
|
16
|
+
continue;
|
|
17
|
+
const definition = engine.getWorkflowDefinition(name);
|
|
18
|
+
if (definition === void 0)
|
|
19
|
+
continue;
|
|
20
|
+
const preExisting = await catalog.hasInstalled(name, manifest.revision), pointerBefore = await catalog.resolveActiveDurable(name) ?? null, pointerAfter = await catalog.activateRegistered(name, manifest, definition);
|
|
21
|
+
internals.registeredCatalogRevisions.set(name, manifest.revision);
|
|
22
|
+
dispatchCatalogInstallAndActivatedEvents(engine, name, manifest.revision, preExisting, pointerBefore, pointerAfter);
|
|
23
|
+
} catch (error) {
|
|
24
|
+
internals.pendingCatalogInstalls = [
|
|
25
|
+
...pending.slice(index),
|
|
26
|
+
...internals.pendingCatalogInstalls
|
|
27
|
+
];
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export function isWorkflowCatalogReady(engine) {
|
|
33
|
+
const internals = getInternals(engine);
|
|
34
|
+
return internals.catalogRestored && internals.pendingCatalogInstalls.length === 0;
|
|
35
|
+
}
|
|
36
|
+
export async function ensureWorkflowCatalogReady(engine) {
|
|
37
|
+
const internals = getInternals(engine);
|
|
38
|
+
if (isWorkflowCatalogReady(engine))
|
|
39
|
+
return;
|
|
40
|
+
if (internals.catalogDrainPromise !== null) {
|
|
41
|
+
await internals.catalogDrainPromise;
|
|
42
|
+
return ensureWorkflowCatalogReady(engine);
|
|
43
|
+
}
|
|
44
|
+
const drainPromise = (async () => {
|
|
45
|
+
if (internals.disposed)
|
|
46
|
+
throw new EngineDisposedError;
|
|
47
|
+
if (!internals.catalogRestored) {
|
|
48
|
+
await resolveOrphanedCatalogTombstones(internals.storage);
|
|
49
|
+
internals.workflowCatalog = new WorkflowCatalog(internals.storage, await restoreWorkflowCatalog(internals.storage));
|
|
50
|
+
internals.catalogRestored = !0;
|
|
51
|
+
}
|
|
52
|
+
await drainPendingCatalogInstalls(engine);
|
|
53
|
+
})();
|
|
54
|
+
internals.catalogDrainPromise = drainPromise;
|
|
55
|
+
try {
|
|
56
|
+
await drainPromise;
|
|
57
|
+
} finally {
|
|
58
|
+
if (internals.catalogDrainPromise === drainPromise)
|
|
59
|
+
internals.catalogDrainPromise = null;
|
|
60
|
+
}
|
|
61
|
+
}
|