@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
|
@@ -6,7 +6,6 @@ export function createCheckpoint(workflowId, version, now) {
|
|
|
6
6
|
step: 0,
|
|
7
7
|
locals: {},
|
|
8
8
|
accumulatedResults: [],
|
|
9
|
-
pendingSignals: [],
|
|
10
9
|
searchAttributes: {},
|
|
11
10
|
version,
|
|
12
11
|
schemaVersion: CURRENT_CHECKPOINT_SCHEMA_VERSION,
|
|
@@ -19,9 +18,15 @@ export function advanceCheckpoint(checkpoint, locals, options) {
|
|
|
19
18
|
step: checkpoint.step + 1,
|
|
20
19
|
locals,
|
|
21
20
|
accumulatedResults: options?.accumulatedResults ?? checkpoint.accumulatedResults,
|
|
22
|
-
...checkpoint.
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
...(options?.accumulatedResultReplayWatermark ?? checkpoint.accumulatedResultReplayWatermark) === void 0 ? {} : {
|
|
22
|
+
accumulatedResultReplayWatermark: options?.accumulatedResultReplayWatermark ?? checkpoint.accumulatedResultReplayWatermark
|
|
23
|
+
},
|
|
24
|
+
...(options?.workerReplaySignatures ?? checkpoint.workerReplaySignatures) === void 0 ? {} : {
|
|
25
|
+
workerReplaySignatures: options?.workerReplaySignatures ?? checkpoint.workerReplaySignatures
|
|
26
|
+
},
|
|
27
|
+
...(options?.workerReplayFailures ?? checkpoint.workerReplayFailures) === void 0 ? {} : {
|
|
28
|
+
workerReplayFailures: options?.workerReplayFailures ?? checkpoint.workerReplayFailures
|
|
29
|
+
},
|
|
25
30
|
searchAttributes: {
|
|
26
31
|
...checkpoint.searchAttributes,
|
|
27
32
|
...options?.searchAttributes
|
|
@@ -26,9 +26,10 @@ export function validateCheckpointShape(value) {
|
|
|
26
26
|
assertRecordField(record, "locals");
|
|
27
27
|
validateSessionStateLocals(record.locals);
|
|
28
28
|
normalizeAccumulatedResults(record);
|
|
29
|
+
validateAccumulatedResultReplayWatermark(record);
|
|
29
30
|
validateWorkerReplaySignatures(record);
|
|
30
31
|
validateWorkerReplayFailures(record);
|
|
31
|
-
|
|
32
|
+
dropLegacyPendingSignals(record);
|
|
32
33
|
assertRecordField(record, "searchAttributes");
|
|
33
34
|
assertStringField(record, "version");
|
|
34
35
|
assertNumberField(record, "createdAt");
|
|
@@ -132,10 +133,6 @@ function assertRecordField(record, field) {
|
|
|
132
133
|
if (typeof record[field] !== "object" || record[field] === null)
|
|
133
134
|
throw Error(`Invalid checkpoint: missing or invalid "${field}" (expected object)`);
|
|
134
135
|
}
|
|
135
|
-
function assertArrayField(record, field) {
|
|
136
|
-
if (!Array.isArray(record[field]))
|
|
137
|
-
throw Error(`Invalid checkpoint: missing or invalid "${field}" (expected array)`);
|
|
138
|
-
}
|
|
139
136
|
function normalizeAccumulatedResults(record) {
|
|
140
137
|
if (!("accumulatedResults" in record)) {
|
|
141
138
|
record.accumulatedResults = [];
|
|
@@ -144,6 +141,16 @@ function normalizeAccumulatedResults(record) {
|
|
|
144
141
|
if (!Array.isArray(record.accumulatedResults))
|
|
145
142
|
throw Error('Invalid checkpoint: invalid "accumulatedResults" (expected array)');
|
|
146
143
|
}
|
|
144
|
+
function validateAccumulatedResultReplayWatermark(record) {
|
|
145
|
+
const watermark = record.accumulatedResultReplayWatermark;
|
|
146
|
+
if (watermark === void 0)
|
|
147
|
+
return;
|
|
148
|
+
if (typeof watermark !== "number" || !Number.isSafeInteger(watermark) || watermark < 0)
|
|
149
|
+
throw Error('Invalid checkpoint: invalid "accumulatedResultReplayWatermark" (expected non-negative safe integer)');
|
|
150
|
+
}
|
|
151
|
+
function dropLegacyPendingSignals(record) {
|
|
152
|
+
delete record.pendingSignals;
|
|
153
|
+
}
|
|
147
154
|
function assertCurrentSchemaVersion(record) {
|
|
148
155
|
const schemaVersion = record.schemaVersion;
|
|
149
156
|
if (schemaVersion === void 0)
|
|
@@ -1,7 +1,23 @@
|
|
|
1
1
|
import { ExtensionCodec } from '@msgpack/msgpack';
|
|
2
|
+
import { WeftError } from '../weft-error.ts';
|
|
3
|
+
declare const EXTENSION_TYPE_REGEXP = 2;
|
|
4
|
+
export declare class RegExpExtensionDecodeError extends WeftError<'RegExpExtensionDecodeError'> {
|
|
5
|
+
readonly extensionType: typeof EXTENSION_TYPE_REGEXP;
|
|
6
|
+
readonly source: string;
|
|
7
|
+
readonly flags: string;
|
|
8
|
+
readonly sourceByteLength: number;
|
|
9
|
+
constructor(parameters: {
|
|
10
|
+
source: string;
|
|
11
|
+
flags: string;
|
|
12
|
+
sourceByteLength: number;
|
|
13
|
+
reason: string;
|
|
14
|
+
cause?: unknown;
|
|
15
|
+
});
|
|
16
|
+
}
|
|
2
17
|
export declare const extensionCodec: ExtensionCodec<undefined>;
|
|
3
18
|
/**
|
|
4
19
|
* Recursively replace `undefined` with the sentinel so msgpack's encoder
|
|
5
20
|
* routes it through the extension codec instead of encoding it as null.
|
|
6
21
|
*/
|
|
7
22
|
export declare function replaceUndefined(value: unknown, visited: Set<object>): unknown;
|
|
23
|
+
export {};
|
|
@@ -5,8 +5,52 @@ import {
|
|
|
5
5
|
decodeCodecDate,
|
|
6
6
|
encodeCodecDate
|
|
7
7
|
} from "../codec-helpers.js";
|
|
8
|
-
|
|
8
|
+
import { WeftError } from "../weft-error.js";
|
|
9
|
+
import { bindSerializerRegistryToCodec, hasRegisteredSerializer } from "./serializer-registry.js";
|
|
10
|
+
const EXTENSION_TYPE_DATE = 1, EXTENSION_TYPE_REGEXP = 2, EXTENSION_TYPE_MAP = 3, EXTENSION_TYPE_SET = 4, EXTENSION_TYPE_UNDEFINED = 5, EXTENSION_TYPE_ERROR = 6, REGEXP_SOURCE_MAX_BYTES = 65535, regexpSourceTextEncoder = new TextEncoder;
|
|
11
|
+
|
|
12
|
+
export class RegExpExtensionDecodeError extends WeftError {
|
|
13
|
+
extensionType;
|
|
14
|
+
source;
|
|
15
|
+
flags;
|
|
16
|
+
sourceByteLength;
|
|
17
|
+
constructor(parameters) {
|
|
18
|
+
super("RegExpExtensionDecodeError", `RegExp extension type ${EXTENSION_TYPE_REGEXP} could not be decoded: source=${formatRegExpSourceForMessage(parameters.source, parameters.sourceByteLength)} flags=${JSON.stringify(parameters.flags)} ${parameters.reason}`, parameters.cause === void 0 ? void 0 : { cause: parameters.cause });
|
|
19
|
+
this.extensionType = EXTENSION_TYPE_REGEXP;
|
|
20
|
+
this.source = parameters.source;
|
|
21
|
+
this.flags = parameters.flags;
|
|
22
|
+
this.sourceByteLength = parameters.sourceByteLength;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function formatRegExpSourceForMessage(source, sourceByteLength) {
|
|
26
|
+
if (sourceByteLength <= 200)
|
|
27
|
+
return JSON.stringify(source);
|
|
28
|
+
return `${sourceByteLength}-byte string starting ${JSON.stringify(source.slice(0, 120))}`;
|
|
29
|
+
}
|
|
30
|
+
function decodeRegExpExtension(source, flags) {
|
|
31
|
+
const sourceByteLength = regexpSourceTextEncoder.encode(source).byteLength;
|
|
32
|
+
if (sourceByteLength > REGEXP_SOURCE_MAX_BYTES)
|
|
33
|
+
throw new RegExpExtensionDecodeError({
|
|
34
|
+
source,
|
|
35
|
+
flags,
|
|
36
|
+
sourceByteLength,
|
|
37
|
+
reason: `because source exceeds the ${REGEXP_SOURCE_MAX_BYTES}-byte limit.`
|
|
38
|
+
});
|
|
39
|
+
try {
|
|
40
|
+
return new RegExp(source, flags);
|
|
41
|
+
} catch (cause) {
|
|
42
|
+
const reason = cause instanceof Error ? cause.message : String(cause);
|
|
43
|
+
throw new RegExpExtensionDecodeError({
|
|
44
|
+
source,
|
|
45
|
+
flags,
|
|
46
|
+
sourceByteLength,
|
|
47
|
+
reason: `because ${reason}`,
|
|
48
|
+
cause
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
9
52
|
export const extensionCodec = new ExtensionCodec;
|
|
53
|
+
bindSerializerRegistryToCodec(extensionCodec, replaceUndefined);
|
|
10
54
|
extensionCodec.register({
|
|
11
55
|
type: EXTENSION_TYPE_DATE,
|
|
12
56
|
encode: encodeCodecDate,
|
|
@@ -21,7 +65,7 @@ extensionCodec.register({
|
|
|
21
65
|
},
|
|
22
66
|
decode(data) {
|
|
23
67
|
const decoded = coerceCodecRecord(msgpackDecode(data)), source = typeof decoded.source === "string" ? decoded.source : "", flags = typeof decoded.flags === "string" ? decoded.flags : "";
|
|
24
|
-
return
|
|
68
|
+
return decodeRegExpExtension(source, flags);
|
|
25
69
|
}
|
|
26
70
|
});
|
|
27
71
|
extensionCodec.register({
|
|
@@ -75,7 +119,7 @@ extensionCodec.register({
|
|
|
75
119
|
extensionCodec.register({
|
|
76
120
|
type: EXTENSION_TYPE_ERROR,
|
|
77
121
|
encode(value) {
|
|
78
|
-
if (value instanceof Error)
|
|
122
|
+
if (value instanceof Error && !hasRegisteredSerializer(value))
|
|
79
123
|
return msgpackEncode({
|
|
80
124
|
name: value.name,
|
|
81
125
|
message: value.message,
|
|
@@ -92,6 +136,11 @@ extensionCodec.register({
|
|
|
92
136
|
}
|
|
93
137
|
});
|
|
94
138
|
export function replaceUndefined(value, visited) {
|
|
139
|
+
if (!containsUndefined(value, visited))
|
|
140
|
+
return value;
|
|
141
|
+
return replaceUndefinedDeep(value, new Set);
|
|
142
|
+
}
|
|
143
|
+
function replaceUndefinedDeep(value, visited) {
|
|
95
144
|
if (value === void 0)
|
|
96
145
|
return undefinedSentinel;
|
|
97
146
|
if (value === null || typeof value !== "object")
|
|
@@ -119,27 +168,74 @@ function replaceObjectUndefined(value, visited) {
|
|
|
119
168
|
function replaceArrayUndefined(value, visited) {
|
|
120
169
|
const result = Array.from({ length: value.length });
|
|
121
170
|
for (let index = 0;index < value.length; index++)
|
|
122
|
-
result[index] =
|
|
171
|
+
result[index] = replaceUndefinedDeep(value[index], visited);
|
|
123
172
|
return result;
|
|
124
173
|
}
|
|
125
174
|
function replaceMapUndefined(value, visited) {
|
|
126
175
|
const result = new Map;
|
|
127
176
|
for (const [key, mapValue] of value)
|
|
128
|
-
result.set(
|
|
177
|
+
result.set(replaceUndefinedDeep(key, visited), replaceUndefinedDeep(mapValue, visited));
|
|
129
178
|
return result;
|
|
130
179
|
}
|
|
131
180
|
function replaceSetUndefined(value, visited) {
|
|
132
181
|
const result = new Set;
|
|
133
182
|
for (const setValue of value)
|
|
134
|
-
result.add(
|
|
183
|
+
result.add(replaceUndefinedDeep(setValue, visited));
|
|
135
184
|
return result;
|
|
136
185
|
}
|
|
137
186
|
function isNestedValueFree(value) {
|
|
138
|
-
return value instanceof Date || value instanceof RegExp || value instanceof Error || value instanceof Uint8Array || value instanceof ArrayBuffer;
|
|
187
|
+
return value instanceof Date || value instanceof RegExp || value instanceof Error || value instanceof Uint8Array || value instanceof ArrayBuffer || hasRegisteredSerializer(value);
|
|
139
188
|
}
|
|
140
189
|
function replaceRecordUndefined(value, visited) {
|
|
141
190
|
const record = value, result = {};
|
|
142
191
|
for (const key of Object.keys(record))
|
|
143
|
-
result[key] =
|
|
192
|
+
result[key] = replaceUndefinedDeep(record[key], visited);
|
|
144
193
|
return result;
|
|
145
194
|
}
|
|
195
|
+
function containsUndefined(value, visited) {
|
|
196
|
+
if (value === void 0)
|
|
197
|
+
return !0;
|
|
198
|
+
if (value === null || typeof value !== "object")
|
|
199
|
+
return !1;
|
|
200
|
+
if (visited.has(value))
|
|
201
|
+
return !1;
|
|
202
|
+
if (isNestedValueFree(value))
|
|
203
|
+
return !1;
|
|
204
|
+
visited.add(value);
|
|
205
|
+
try {
|
|
206
|
+
if (Array.isArray(value))
|
|
207
|
+
return arrayContainsUndefined(value, visited);
|
|
208
|
+
if (value instanceof Map)
|
|
209
|
+
return mapContainsUndefined(value, visited);
|
|
210
|
+
if (value instanceof Set)
|
|
211
|
+
return setContainsUndefined(value, visited);
|
|
212
|
+
return recordContainsUndefined(value, visited);
|
|
213
|
+
} finally {
|
|
214
|
+
visited.delete(value);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
function arrayContainsUndefined(value, visited) {
|
|
218
|
+
for (let index = 0;index < value.length; index++)
|
|
219
|
+
if (containsUndefined(value[index], visited))
|
|
220
|
+
return !0;
|
|
221
|
+
return !1;
|
|
222
|
+
}
|
|
223
|
+
function mapContainsUndefined(value, visited) {
|
|
224
|
+
for (const [key, mapValue] of value)
|
|
225
|
+
if (containsUndefined(key, visited) || containsUndefined(mapValue, visited))
|
|
226
|
+
return !0;
|
|
227
|
+
return !1;
|
|
228
|
+
}
|
|
229
|
+
function setContainsUndefined(value, visited) {
|
|
230
|
+
for (const setValue of value)
|
|
231
|
+
if (containsUndefined(setValue, visited))
|
|
232
|
+
return !0;
|
|
233
|
+
return !1;
|
|
234
|
+
}
|
|
235
|
+
function recordContainsUndefined(value, visited) {
|
|
236
|
+
const record = value;
|
|
237
|
+
for (const key of Object.keys(record))
|
|
238
|
+
if (containsUndefined(record[key], visited))
|
|
239
|
+
return !0;
|
|
240
|
+
return !1;
|
|
241
|
+
}
|
package/dist/core/codec/index.js
CHANGED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { ExtensionCodec } from '@msgpack/msgpack';
|
|
2
|
+
/**
|
|
3
|
+
* Encode/decode handlers for a custom structured type that crosses Weft's
|
|
4
|
+
* checkpoint codec. `toJSON` reduces an instance to a plain, msgpack-encodable
|
|
5
|
+
* value; `fromJSON` rebuilds the instance from that value on the far side.
|
|
6
|
+
*
|
|
7
|
+
* The handlers must round-trip deterministically: a value encoded and then
|
|
8
|
+
* decoded must reconstruct an equivalent instance, with field order and content
|
|
9
|
+
* stable across calls (the codec backs replay-deterministic checkpoints).
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```ts
|
|
13
|
+
* import { type SerializerHandlers } from '@lostgradient/weft';
|
|
14
|
+
*
|
|
15
|
+
* class ValidationError extends Error {
|
|
16
|
+
* constructor(
|
|
17
|
+
* message: string,
|
|
18
|
+
* readonly issues: string[],
|
|
19
|
+
* ) {
|
|
20
|
+
* super(message);
|
|
21
|
+
* this.name = 'ValidationError';
|
|
22
|
+
* }
|
|
23
|
+
* }
|
|
24
|
+
*
|
|
25
|
+
* const handlers: SerializerHandlers<ValidationError> = {
|
|
26
|
+
* toJSON: (error) => ({ message: error.message, issues: error.issues }),
|
|
27
|
+
* fromJSON: (data) => {
|
|
28
|
+
* const record = data as { message: string; issues: string[] };
|
|
29
|
+
* return new ValidationError(record.message, record.issues);
|
|
30
|
+
* },
|
|
31
|
+
* };
|
|
32
|
+
* void handlers;
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export type SerializerHandlers<T> = {
|
|
36
|
+
toJSON(value: T): unknown;
|
|
37
|
+
fromJSON(data: unknown): T;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Constructor of a registrable type. Uses a `never[]`-rest abstract constructor
|
|
41
|
+
* so it accepts any class (a concrete class is assignable to an abstract
|
|
42
|
+
* constructor whose parameters are `never[]`) without an `any`. The handlers,
|
|
43
|
+
* not the constructor signature, own (de)serialization; the constructor is used
|
|
44
|
+
* only for instance-identity matching.
|
|
45
|
+
*/
|
|
46
|
+
type RegistrableConstructor<T> = abstract new (...args: never[]) => T;
|
|
47
|
+
/**
|
|
48
|
+
* Register a custom (de)serializer for `constructor` on Weft's checkpoint codec.
|
|
49
|
+
* Once registered, any instance of `constructor` that crosses the codec — an
|
|
50
|
+
* activity result, workflow input, signal payload, or error — round-trips
|
|
51
|
+
* through `handlers` instead of the generic structured-clone fallback (which,
|
|
52
|
+
* for errors, would otherwise drop subclass fields like a `ZodError`'s
|
|
53
|
+
* `.issues`).
|
|
54
|
+
*
|
|
55
|
+
* `options.tag` is a stable, developer-chosen discriminant stored inside each
|
|
56
|
+
* encoded value. Decode resolves the handler by this tag, so registration order
|
|
57
|
+
* and count are irrelevant and a checkpoint stays decodable across deploys.
|
|
58
|
+
* Choose an explicit, durable string — do NOT rely on `constructor.name`, which
|
|
59
|
+
* a minified build mangles, silently breaking cross-build decode.
|
|
60
|
+
*
|
|
61
|
+
* Matching is by exact constructor identity, and the built-in `Error` encoder
|
|
62
|
+
* defers to a registered serializer. The other built-in extension types
|
|
63
|
+
* (`Date`, `RegExp`, `Map`, `Set`) do NOT defer: registering a serializer for a
|
|
64
|
+
* subclass of one of those built-ins has no effect, because the built-in
|
|
65
|
+
* encoder matches the instance first. Register serializers for your own classes
|
|
66
|
+
* (or `Error` subclasses), not for built-in-collection subclasses.
|
|
67
|
+
*
|
|
68
|
+
* Registration is process-global and one-shot per constructor and per tag: call
|
|
69
|
+
* it once at module load, before constructing any engine. Re-registering the
|
|
70
|
+
* same constructor, or reusing a `tag` already taken by another constructor,
|
|
71
|
+
* throws. A checkpoint written with a registered serializer is decodable by any
|
|
72
|
+
* process that registered the same tag → handler.
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```ts
|
|
76
|
+
* import { registerSerializer } from '@lostgradient/weft';
|
|
77
|
+
*
|
|
78
|
+
* class RateLimitError extends Error {
|
|
79
|
+
* constructor(readonly retryAfterMs: number) {
|
|
80
|
+
* super('rate limited');
|
|
81
|
+
* this.name = 'RateLimitError';
|
|
82
|
+
* }
|
|
83
|
+
* }
|
|
84
|
+
*
|
|
85
|
+
* registerSerializer(
|
|
86
|
+
* RateLimitError,
|
|
87
|
+
* {
|
|
88
|
+
* toJSON: (error) => ({ retryAfterMs: error.retryAfterMs }),
|
|
89
|
+
* fromJSON: (data) => new RateLimitError((data as { retryAfterMs: number }).retryAfterMs),
|
|
90
|
+
* },
|
|
91
|
+
* { tag: 'RateLimitError' },
|
|
92
|
+
* );
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export declare function registerSerializer<T>(constructor: RegistrableConstructor<T>, handlers: SerializerHandlers<T>, options: {
|
|
96
|
+
tag: string;
|
|
97
|
+
}): void;
|
|
98
|
+
/**
|
|
99
|
+
* Whether `value` is an instance of a registered constructor. The built-in
|
|
100
|
+
* Error extension encoder consults this to defer to a registered serializer
|
|
101
|
+
* (so a registered Error subclass uses its custom handler, not the generic
|
|
102
|
+
* Error encoding), regardless of extension-encoder registration order.
|
|
103
|
+
*/
|
|
104
|
+
export declare function hasRegisteredSerializer(value: object): boolean;
|
|
105
|
+
/**
|
|
106
|
+
* Wire the shared extensionCodec so the single custom-serializer extension type
|
|
107
|
+
* is registered on the live codec, along with the codec's `replaceUndefined`
|
|
108
|
+
* preprocessor so custom-serializer output is encoded with the same `undefined`
|
|
109
|
+
* semantics as the public `encode()`. Called once at codec construction.
|
|
110
|
+
* `replaceUndefined` is passed in rather than imported to avoid a static cycle:
|
|
111
|
+
* extension-codec.ts imports this module for `hasRegisteredSerializer`.
|
|
112
|
+
*/
|
|
113
|
+
export declare function bindSerializerRegistryToCodec(codec: ExtensionCodec, replaceUndefined: (value: unknown, visited: Set<object>) => unknown): void;
|
|
114
|
+
/**
|
|
115
|
+
* Test-only reset of the global registry. Production code never unregisters —
|
|
116
|
+
* a stale serializer could misread a checkpoint — but tests need isolation
|
|
117
|
+
* between registration cases. Clears both tag and constructor maps; the single
|
|
118
|
+
* extension-type decoder stays bound to the codec and simply finds an empty
|
|
119
|
+
* registry until the next registration.
|
|
120
|
+
*/
|
|
121
|
+
export declare function resetSerializerRegistryForTesting(): void;
|
|
122
|
+
export {};
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ExtensionCodec, decode as msgpackDecode, encode as msgpackEncode } from "@msgpack/msgpack";
|
|
2
|
+
const CUSTOM_SERIALIZER_EXTENSION_TYPE = 100, registryByConstructor = new Map, registryByTag = new Map;
|
|
3
|
+
export function registerSerializer(constructor, handlers, options) {
|
|
4
|
+
const key = constructor, { tag } = options;
|
|
5
|
+
if (typeof tag !== "string" || tag.length === 0)
|
|
6
|
+
throw Error("registerSerializer requires a non-empty string options.tag.");
|
|
7
|
+
if (registryByConstructor.has(key))
|
|
8
|
+
throw Error(`A serializer is already registered for ${constructor.name || "an anonymous constructor"}; registerSerializer is one-shot per constructor.`);
|
|
9
|
+
if (registryByTag.has(tag))
|
|
10
|
+
throw Error(`A serializer is already registered with tag "${tag}"; serializer tags must be unique.`);
|
|
11
|
+
const entry = {
|
|
12
|
+
tag,
|
|
13
|
+
constructor: key,
|
|
14
|
+
handlers
|
|
15
|
+
};
|
|
16
|
+
registryByConstructor.set(key, entry);
|
|
17
|
+
registryByTag.set(tag, entry);
|
|
18
|
+
}
|
|
19
|
+
export function hasRegisteredSerializer(value) {
|
|
20
|
+
return registryByConstructor.has(value.constructor);
|
|
21
|
+
}
|
|
22
|
+
export function bindSerializerRegistryToCodec(codec, replaceUndefined) {
|
|
23
|
+
codec.register({
|
|
24
|
+
type: CUSTOM_SERIALIZER_EXTENSION_TYPE,
|
|
25
|
+
encode(value) {
|
|
26
|
+
if (typeof value !== "object" || value === null)
|
|
27
|
+
return null;
|
|
28
|
+
const entry = registryByConstructor.get(value.constructor);
|
|
29
|
+
if (entry === void 0)
|
|
30
|
+
return null;
|
|
31
|
+
const data = replaceUndefined(entry.handlers.toJSON(value), new Set);
|
|
32
|
+
return msgpackEncode({ tag: entry.tag, data }, { extensionCodec: codec });
|
|
33
|
+
},
|
|
34
|
+
decode(bytes) {
|
|
35
|
+
const payload = msgpackDecode(bytes, { extensionCodec: codec });
|
|
36
|
+
if (typeof payload !== "object" || payload === null || !("tag" in payload))
|
|
37
|
+
throw Error("Corrupt custom-serializer payload: missing tag.");
|
|
38
|
+
const { tag, data } = payload;
|
|
39
|
+
if (typeof tag !== "string")
|
|
40
|
+
throw Error("Corrupt custom-serializer payload: tag is not a string.");
|
|
41
|
+
const entry = registryByTag.get(tag);
|
|
42
|
+
if (entry === void 0)
|
|
43
|
+
throw Error(`No serializer registered for tag "${tag}". Register it (with the same tag) before decoding a checkpoint that used it.`);
|
|
44
|
+
return entry.handlers.fromJSON(data);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
export function resetSerializerRegistryForTesting() {
|
|
49
|
+
registryByConstructor.clear();
|
|
50
|
+
registryByTag.clear();
|
|
51
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ContextInternals } from './internals.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Durable per-step retry bookkeeping for `ctx.run`, stored in the workflow's
|
|
4
|
+
* `checkpointLocals` so it survives crash/replay. One slot holds, per step: the
|
|
5
|
+
* current attempt number, how many backoff sleeps already completed, and the
|
|
6
|
+
* first-dispatch timestamp anchoring `scheduleToCloseTimeout`. Every mutator
|
|
7
|
+
* rebuilds the slot through {@link writeRetryStateSlot} so no sub-map is silently
|
|
8
|
+
* erased when another is updated.
|
|
9
|
+
*/
|
|
10
|
+
export declare const ACTIVITY_RETRY_STATE_LOCAL_KEY = "__weftActivityRetryState";
|
|
11
|
+
declare const ACTIVITY_RETRY_STATE_VERSION = 1;
|
|
12
|
+
export declare const MAX_CHECKPOINTED_RETRY_ATTEMPT = 10000;
|
|
13
|
+
export interface ActivityRetryState {
|
|
14
|
+
version: typeof ACTIVITY_RETRY_STATE_VERSION;
|
|
15
|
+
attempts: Record<string, number>;
|
|
16
|
+
completedRetrySleeps?: Record<string, number>;
|
|
17
|
+
/**
|
|
18
|
+
* First-dispatch engine-clock timestamp per step, the anchor for
|
|
19
|
+
* `scheduleToCloseTimeout`. Written ONCE on the first dispatch of a step and
|
|
20
|
+
* never overwritten, so the wall-clock budget is measured from the original
|
|
21
|
+
* dispatch even across crash/replay. Like `completedRetrySleeps`, it must be
|
|
22
|
+
* preserved whenever the retry-state slot is rebuilt.
|
|
23
|
+
*/
|
|
24
|
+
dispatchedAt?: Record<string, number>;
|
|
25
|
+
}
|
|
26
|
+
export declare function isActivityRetryState(value: unknown): value is ActivityRetryState;
|
|
27
|
+
export declare function readActivityRetryAttempt(internals: ContextInternals, step: number): number | undefined;
|
|
28
|
+
export declare function readCompletedRetrySleepCount(internals: ContextInternals, step: number): number;
|
|
29
|
+
export declare function writeActivityRetryAttempt(internals: ContextInternals, step: number, attempt: number): void;
|
|
30
|
+
export declare function completeActivityRetryAttempt(internals: ContextInternals, step: number, completedRetrySleepCount: number): void;
|
|
31
|
+
/**
|
|
32
|
+
* Read the first-dispatch anchor for a step's `scheduleToCloseTimeout`, writing
|
|
33
|
+
* `now` on the first dispatch. Read-first so a crash/replay never resets the
|
|
34
|
+
* window: the budget is measured from the original dispatch, and the anchor
|
|
35
|
+
* lands in the checkpoint committed at the dispatch `yield` that follows.
|
|
36
|
+
*/
|
|
37
|
+
export declare function readOrInitActivityDispatchedAt(internals: ContextInternals, step: number, now: number): number;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export const ACTIVITY_RETRY_STATE_LOCAL_KEY = "__weftActivityRetryState";
|
|
2
|
+
const ACTIVITY_RETRY_STATE_VERSION = 1;
|
|
3
|
+
export const MAX_CHECKPOINTED_RETRY_ATTEMPT = 1e4;
|
|
4
|
+
function isRecord(value) {
|
|
5
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
6
|
+
}
|
|
7
|
+
export function isActivityRetryState(value) {
|
|
8
|
+
return isRecord(value) && value.version === ACTIVITY_RETRY_STATE_VERSION && isRecord(value.attempts) && (value.completedRetrySleeps === void 0 || isRecord(value.completedRetrySleeps)) && (value.dispatchedAt === void 0 || isRecord(value.dispatchedAt));
|
|
9
|
+
}
|
|
10
|
+
function assertValidRetryAttempt(attempt, step) {
|
|
11
|
+
if (!Number.isInteger(attempt) || attempt <= 1 || attempt > MAX_CHECKPOINTED_RETRY_ATTEMPT)
|
|
12
|
+
throw Error(`Invalid checkpointed activity retry attempt ${String(attempt)} for step ${String(step)}`);
|
|
13
|
+
}
|
|
14
|
+
export function readActivityRetryAttempt(internals, step) {
|
|
15
|
+
const state = internals.checkpointLocals[ACTIVITY_RETRY_STATE_LOCAL_KEY];
|
|
16
|
+
if (!isActivityRetryState(state))
|
|
17
|
+
return;
|
|
18
|
+
const attempt = state.attempts[String(step)];
|
|
19
|
+
if (attempt === void 0)
|
|
20
|
+
return;
|
|
21
|
+
assertValidRetryAttempt(attempt, step);
|
|
22
|
+
return attempt;
|
|
23
|
+
}
|
|
24
|
+
export function readCompletedRetrySleepCount(internals, step) {
|
|
25
|
+
const state = internals.checkpointLocals[ACTIVITY_RETRY_STATE_LOCAL_KEY];
|
|
26
|
+
if (!isActivityRetryState(state))
|
|
27
|
+
return 0;
|
|
28
|
+
const count = state.completedRetrySleeps?.[String(step)];
|
|
29
|
+
if (count === void 0)
|
|
30
|
+
return 0;
|
|
31
|
+
if (!Number.isInteger(count) || count < 0 || count > MAX_CHECKPOINTED_RETRY_ATTEMPT)
|
|
32
|
+
throw Error(`Invalid checkpointed activity retry sleep count ${String(count)} for step ${String(step)}`);
|
|
33
|
+
return count;
|
|
34
|
+
}
|
|
35
|
+
function currentRetryState(internals) {
|
|
36
|
+
const current = internals.checkpointLocals[ACTIVITY_RETRY_STATE_LOCAL_KEY];
|
|
37
|
+
return isActivityRetryState(current) ? current : void 0;
|
|
38
|
+
}
|
|
39
|
+
function writeRetryStateSlot(internals, attempts, completedRetrySleeps, dispatchedAt) {
|
|
40
|
+
const { [ACTIVITY_RETRY_STATE_LOCAL_KEY]: _removed, ...remainingLocals } = internals.checkpointLocals, hasAttempts = Object.keys(attempts).length > 0, hasSleeps = completedRetrySleeps !== void 0 && Object.keys(completedRetrySleeps).length > 0, hasDispatched = dispatchedAt !== void 0 && Object.keys(dispatchedAt).length > 0;
|
|
41
|
+
if (!hasAttempts && !hasSleeps && !hasDispatched) {
|
|
42
|
+
internals.checkpointLocals = remainingLocals;
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
internals.checkpointLocals = {
|
|
46
|
+
...remainingLocals,
|
|
47
|
+
[ACTIVITY_RETRY_STATE_LOCAL_KEY]: {
|
|
48
|
+
version: ACTIVITY_RETRY_STATE_VERSION,
|
|
49
|
+
attempts,
|
|
50
|
+
...hasSleeps ? { completedRetrySleeps } : {},
|
|
51
|
+
...hasDispatched ? { dispatchedAt } : {}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export function writeActivityRetryAttempt(internals, step, attempt) {
|
|
56
|
+
assertValidRetryAttempt(attempt, step);
|
|
57
|
+
const current = currentRetryState(internals), attempts = current ? { ...current.attempts } : {};
|
|
58
|
+
attempts[String(step)] = attempt;
|
|
59
|
+
writeRetryStateSlot(internals, attempts, current?.completedRetrySleeps, current?.dispatchedAt);
|
|
60
|
+
}
|
|
61
|
+
function clearActivityRetryAttempt(internals, step) {
|
|
62
|
+
const current = currentRetryState(internals);
|
|
63
|
+
if (!current)
|
|
64
|
+
return;
|
|
65
|
+
const attempts = { ...current.attempts };
|
|
66
|
+
delete attempts[String(step)];
|
|
67
|
+
writeRetryStateSlot(internals, attempts, current.completedRetrySleeps, current.dispatchedAt);
|
|
68
|
+
}
|
|
69
|
+
export function completeActivityRetryAttempt(internals, step, completedRetrySleepCount) {
|
|
70
|
+
if (!Number.isInteger(completedRetrySleepCount) || completedRetrySleepCount < 0 || completedRetrySleepCount > MAX_CHECKPOINTED_RETRY_ATTEMPT)
|
|
71
|
+
throw Error(`Invalid completed activity retry sleep count ${String(completedRetrySleepCount)} for step ${String(step)}`);
|
|
72
|
+
clearActivityRetryAttempt(internals, step);
|
|
73
|
+
if (completedRetrySleepCount === 0)
|
|
74
|
+
return;
|
|
75
|
+
const current = currentRetryState(internals), attempts = current ? { ...current.attempts } : {}, completedRetrySleeps = current ? { ...current.completedRetrySleeps } : {};
|
|
76
|
+
completedRetrySleeps[String(step)] = completedRetrySleepCount;
|
|
77
|
+
writeRetryStateSlot(internals, attempts, completedRetrySleeps, current?.dispatchedAt);
|
|
78
|
+
}
|
|
79
|
+
export function readOrInitActivityDispatchedAt(internals, step, now) {
|
|
80
|
+
const current = currentRetryState(internals), existing = current?.dispatchedAt?.[String(step)];
|
|
81
|
+
if (typeof existing === "number" && Number.isFinite(existing))
|
|
82
|
+
return existing;
|
|
83
|
+
if (existing !== void 0)
|
|
84
|
+
throw Error(`Invalid checkpointed activity dispatch anchor ${String(existing)} for step ${String(step)}`);
|
|
85
|
+
const attempts = current ? { ...current.attempts } : {}, dispatchedAt = current?.dispatchedAt ? { ...current.dispatchedAt } : {};
|
|
86
|
+
dispatchedAt[String(step)] = now;
|
|
87
|
+
writeRetryStateSlot(internals, attempts, current?.completedRetrySleeps, dispatchedAt);
|
|
88
|
+
return now;
|
|
89
|
+
}
|