@lostgradient/weft 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +79 -24
- package/dist/cli/conformance.js +7 -1
- package/dist/cli/generated/operation-client.generated.d.ts +28 -13
- package/dist/cli/generated/operation-client.generated.js +1 -0
- package/dist/cli/help-text.d.ts +1 -1
- package/dist/cli/help-text.js +1 -0
- package/dist/cli/operation-catalog-snapshot.d.ts +8 -0
- package/dist/cli/operation-catalog-snapshot.js +11 -0
- package/dist/cli/parse-schedule-arguments.js +3 -1
- package/dist/cli/schedule.js +2 -1
- package/dist/cli/types.d.ts +1 -0
- package/dist/cli-main.js +79 -78
- package/dist/client/handle-delegation.d.ts +3 -2
- package/dist/client/handle-delegation.js +3 -1
- package/dist/client/http-client-requests.d.ts +2 -1
- package/dist/client/http-client-requests.js +7 -0
- package/dist/client/http-client.d.ts +9 -6
- package/dist/client/http-client.js +10 -1
- package/dist/client/http-request.d.ts +11 -1
- package/dist/client/http-request.js +17 -7
- package/dist/client/index.d.ts +1 -1
- package/dist/client/interface.d.ts +46 -5
- package/dist/client/local.d.ts +4 -1
- package/dist/client/local.js +12 -4
- package/dist/client/start-body.d.ts +4 -3
- package/dist/core/byte-arrays.d.ts +5 -0
- package/dist/core/byte-arrays.js +5 -0
- package/dist/core/checkpoint/lifecycle.d.ts +3 -0
- package/dist/core/checkpoint/lifecycle.js +9 -4
- package/dist/core/checkpoint/serialization.js +12 -5
- package/dist/core/codec/extension-codec.d.ts +16 -0
- package/dist/core/codec/extension-codec.js +100 -6
- package/dist/core/context/activity-retry-state.d.ts +38 -0
- package/dist/core/context/activity-retry-state.js +89 -0
- package/dist/core/context/activity-schedule-to-close.d.ts +159 -0
- package/dist/core/context/activity-schedule-to-close.js +69 -0
- package/dist/core/context/child-workflow-pipe.d.ts +5 -5
- package/dist/core/context/child-workflow-pipe.js +15 -2
- package/dist/core/context/context-presence.d.ts +19 -0
- package/dist/core/context/context-presence.js +13 -0
- package/dist/core/context/durable-operations.d.ts +25 -0
- package/dist/core/context/durable-operations.js +64 -0
- package/dist/core/context/index.d.ts +9 -5
- package/dist/core/context/index.js +17 -12
- package/dist/core/context/internals.d.ts +20 -0
- package/dist/core/context/internals.js +3 -1
- package/dist/core/context/operation-request.d.ts +35 -0
- package/dist/core/context/parallel-cache-entry.d.ts +14 -5
- package/dist/core/context/run-operation.d.ts +6 -1
- package/dist/core/context/run-operation.js +41 -87
- package/dist/core/context/session-state.js +7 -8
- package/dist/core/context/speculative-child.js +2 -0
- package/dist/core/context/types.d.ts +15 -0
- package/dist/core/context/version-patching.d.ts +8 -0
- package/dist/core/context/version-patching.js +40 -0
- package/dist/core/context/workflow-logger.d.ts +98 -0
- package/dist/core/context/workflow-logger.js +68 -0
- package/dist/core/engine/activity-heartbeat-tracking.d.ts +64 -0
- package/dist/core/engine/activity-heartbeat-tracking.js +42 -0
- package/dist/core/engine/activity-per-attempt-timeout.d.ts +41 -0
- package/dist/core/engine/activity-per-attempt-timeout.js +36 -0
- package/dist/core/engine/activity-reconciliation.d.ts +1 -0
- package/dist/core/engine/activity-reconciliation.js +12 -1
- package/dist/core/engine/activity-resolution.d.ts +23 -0
- package/dist/core/engine/activity-resolution.js +37 -0
- package/dist/core/engine/aggregate.js +66 -30
- package/dist/core/engine/async-activity-completion.d.ts +23 -6
- package/dist/core/engine/async-activity-completion.js +53 -12
- package/dist/core/engine/attributes-tags.js +9 -4
- package/dist/core/engine/bulk-operations-purge.d.ts +26 -0
- package/dist/core/engine/bulk-operations-purge.js +38 -3
- package/dist/core/engine/bulk-operations-shared.d.ts +2 -0
- package/dist/core/engine/bulk-operations-shared.js +8 -2
- package/dist/core/engine/bulk-operations.d.ts +4 -1
- package/dist/core/engine/bulk-operations.js +235 -24
- package/dist/core/engine/callback-creators-bundles.d.ts +9 -0
- package/dist/core/engine/callback-creators-bundles.js +30 -2
- package/dist/core/engine/callback-creators-core.js +6 -4
- package/dist/core/engine/callback-creators-router.js +10 -0
- package/dist/core/engine/callback-creators-schedule.d.ts +2 -2
- package/dist/core/engine/callback-creators-schedule.js +12 -8
- package/dist/core/engine/candidate-read-batching.d.ts +6 -0
- package/dist/core/engine/candidate-read-batching.js +1 -0
- package/dist/core/engine/checkpoint-io.js +61 -25
- package/dist/core/engine/checkpoint-reads.js +3 -2
- package/dist/core/engine/checkpoint-replay.d.ts +20 -0
- package/dist/core/engine/checkpoint-replay.js +242 -0
- package/dist/core/engine/checkpoint-side-effects.d.ts +23 -0
- package/dist/core/engine/checkpoint-side-effects.js +35 -0
- package/dist/core/engine/child-workflow-cancellation.d.ts +10 -0
- package/dist/core/engine/child-workflow-cancellation.js +40 -0
- package/dist/core/engine/child-workflow.js +27 -4
- package/dist/core/engine/condition-waiters.d.ts +14 -0
- package/dist/core/engine/condition-waiters.js +5 -0
- package/dist/core/engine/construction.d.ts +3 -0
- package/dist/core/engine/construction.js +21 -8
- package/dist/core/engine/coordination-branch-executors.d.ts +70 -0
- package/dist/core/engine/coordination-branch-executors.js +107 -0
- package/dist/core/engine/deferred-consume-envelope.d.ts +59 -0
- package/dist/core/engine/deferred-consume-envelope.js +14 -0
- package/dist/core/engine/disposal.js +13 -0
- package/dist/core/engine/engine-create-types.d.ts +14 -4
- package/dist/core/engine/engine-internal-types.d.ts +26 -3
- package/dist/core/engine/errors.d.ts +47 -0
- package/dist/core/engine/errors.js +20 -0
- package/dist/core/engine/event-log-compaction.d.ts +8 -0
- package/dist/core/engine/event-log-compaction.js +20 -2
- package/dist/core/engine/fenced-write.d.ts +65 -0
- package/dist/core/engine/fenced-write.js +71 -0
- package/dist/core/engine/finalizer-state.d.ts +28 -0
- package/dist/core/engine/finalizer-state.js +16 -0
- package/dist/core/engine/handles.d.ts +8 -0
- package/dist/core/engine/index.d.ts +34 -16
- package/dist/core/engine/index.js +133 -8
- package/dist/core/engine/inline-parking.js +3 -2
- package/dist/core/engine/internals.d.ts +107 -3
- package/dist/core/engine/lease-codec.d.ts +35 -0
- package/dist/core/engine/lease-codec.js +32 -0
- package/dist/core/engine/lease-deposition.d.ts +66 -0
- package/dist/core/engine/lease-deposition.js +10 -0
- package/dist/core/engine/lease-errors.d.ts +99 -0
- package/dist/core/engine/lease-errors.js +30 -0
- package/dist/core/engine/lease-manager.d.ts +114 -0
- package/dist/core/engine/lease-manager.js +135 -0
- package/dist/core/engine/lifecycle/persist.js +10 -32
- package/dist/core/engine/lifecycle/recovered-services.d.ts +8 -6
- package/dist/core/engine/lifecycle/recovered-services.js +18 -3
- package/dist/core/engine/lifecycle/resume.js +16 -9
- package/dist/core/engine/lifecycle/shared.d.ts +8 -1
- package/dist/core/engine/lifecycle/start-batch.d.ts +1 -1
- package/dist/core/engine/lifecycle/start-batch.js +2 -1
- package/dist/core/engine/lifecycle/start-commit.d.ts +9 -0
- package/dist/core/engine/lifecycle/start-commit.js +50 -8
- package/dist/core/engine/lifecycle/start-or-signal-create.d.ts +58 -0
- package/dist/core/engine/lifecycle/start-or-signal-create.js +95 -0
- package/dist/core/engine/lifecycle/start-or-signal.d.ts +3 -2
- package/dist/core/engine/lifecycle/start-or-signal.js +11 -81
- package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +39 -0
- package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +28 -0
- package/dist/core/engine/lifecycle/start.d.ts +4 -4
- package/dist/core/engine/lifecycle/start.js +17 -9
- package/dist/core/engine/lifecycle/transition.js +17 -5
- package/dist/core/engine/lifecycle.d.ts +1 -1
- package/dist/core/engine/list-candidate-resolution.js +2 -2
- package/dist/core/engine/listing.js +9 -5
- package/dist/core/engine/operations-activity.d.ts +4 -11
- package/dist/core/engine/operations-activity.js +22 -49
- package/dist/core/engine/operations-coordination.d.ts +10 -0
- package/dist/core/engine/operations-coordination.js +43 -8
- package/dist/core/engine/operations-router.d.ts +6 -0
- package/dist/core/engine/operations-router.js +2 -0
- package/dist/core/engine/operations-speculate.js +6 -2
- package/dist/core/engine/operations-stream.js +12 -2
- package/dist/core/engine/operations-time.d.ts +4 -2
- package/dist/core/engine/operations-time.js +14 -2
- package/dist/core/engine/operations-wait-condition.d.ts +23 -0
- package/dist/core/engine/operations-wait-condition.js +62 -0
- package/dist/core/engine/ownership-options.d.ts +23 -0
- package/dist/core/engine/ownership-options.js +26 -0
- package/dist/core/engine/payload-size-policy.d.ts +3 -0
- package/dist/core/engine/payload-size-policy.js +4 -0
- package/dist/core/engine/pending-updates.d.ts +17 -0
- package/dist/core/engine/pending-updates.js +33 -11
- package/dist/core/engine/queries.js +1 -1
- package/dist/core/engine/registration.d.ts +1 -0
- package/dist/core/engine/registration.js +18 -3
- package/dist/core/engine/schedule-jitter.d.ts +5 -0
- package/dist/core/engine/schedule-jitter.js +10 -0
- package/dist/core/engine/schedule-run.d.ts +17 -0
- package/dist/core/engine/schedule-run.js +38 -0
- package/dist/core/engine/schedule-timer.js +81 -17
- package/dist/core/engine/schedules.d.ts +7 -4
- package/dist/core/engine/schedules.js +37 -16
- package/dist/core/engine/search-attribute-records.d.ts +4 -0
- package/dist/core/engine/search-attribute-records.js +17 -0
- package/dist/core/engine/signals.d.ts +18 -2
- package/dist/core/engine/signals.js +42 -21
- package/dist/core/engine/state-utilities.d.ts +49 -2
- package/dist/core/engine/state-utilities.js +114 -3
- package/dist/core/engine/storage-io.d.ts +16 -2
- package/dist/core/engine/storage-io.js +26 -5
- package/dist/core/engine/stream-chunk-loading.d.ts +2 -0
- package/dist/core/engine/stream-chunk-loading.js +24 -1
- package/dist/core/engine/sub-operation.js +22 -3
- package/dist/core/engine/termination/cleanup.d.ts +3 -1
- package/dist/core/engine/termination/cleanup.js +25 -1
- package/dist/core/engine/termination/complete.js +44 -6
- package/dist/core/engine/termination/finalizer-activity.d.ts +53 -0
- package/dist/core/engine/termination/finalizer-activity.js +30 -0
- package/dist/core/engine/termination/finalizer-claim.d.ts +110 -0
- package/dist/core/engine/termination/finalizer-claim.js +80 -0
- package/dist/core/engine/termination/finalizer.d.ts +48 -0
- package/dist/core/engine/termination/finalizer.js +159 -0
- package/dist/core/engine/termination/suspend.d.ts +3 -1
- package/dist/core/engine/termination.d.ts +1 -0
- package/dist/core/engine/termination.js +4 -0
- package/dist/core/engine/updates.js +5 -25
- package/dist/core/engine/validation/schedule.d.ts +2 -1
- package/dist/core/engine/validation/schedule.js +51 -2
- package/dist/core/engine/validation.js +32 -5
- package/dist/core/engine/waiting-update-response.d.ts +8 -0
- package/dist/core/engine/waiting-update-response.js +22 -0
- package/dist/core/engine/workflow-concurrency.d.ts +10 -0
- package/dist/core/engine/workflow-concurrency.js +136 -0
- package/dist/core/engine/workflow-feed.d.ts +4 -5
- package/dist/core/engine/workflow-feed.js +4 -1
- package/dist/core/engine/workflow-indexes.d.ts +9 -0
- package/dist/core/engine/workflow-indexes.js +10 -0
- package/dist/core/engine/workflow-state-stream.js +33 -13
- package/dist/core/engine/workflow-visibility-queries.d.ts +2 -2
- package/dist/core/engine-helpers.js +1 -0
- package/dist/core/events/activity-events.d.ts +43 -12
- package/dist/core/events/activity-events.js +28 -0
- package/dist/core/events/attribute-events.d.ts +2 -3
- package/dist/core/events/event-map.d.ts +18 -12
- package/dist/core/events/index.d.ts +1 -0
- package/dist/core/events/index.js +1 -0
- package/dist/core/events/schedule-events.d.ts +71 -0
- package/dist/core/events/schedule-events.js +29 -0
- package/dist/core/events/signal-events.d.ts +4 -6
- package/dist/core/events/system-events.d.ts +29 -19
- package/dist/core/events/system-events.js +26 -0
- package/dist/core/events/update-events.d.ts +6 -8
- package/dist/core/events/workflow-events.d.ts +88 -23
- package/dist/core/events/workflow-events.js +26 -0
- package/dist/core/failure-categories.js +5 -17
- package/dist/core/fault-code.d.ts +9 -3
- package/dist/core/fault-code.js +1 -0
- package/dist/core/inline-execution-strategy.context-options.d.ts +69 -0
- package/dist/core/inline-execution-strategy.context-options.js +56 -0
- package/dist/core/inline-execution-strategy.d.ts +31 -36
- package/dist/core/inline-execution-strategy.js +16 -27
- package/dist/core/list-filter-validation.d.ts +1 -1
- package/dist/core/payload-size.d.ts +1 -1
- package/dist/core/persisted-data-incompatible-error.d.ts +9 -7
- package/dist/core/review/events.d.ts +6 -8
- package/dist/core/scheduler/scheduler-class.d.ts +10 -1
- package/dist/core/scheduler/scheduler-class.js +38 -11
- package/dist/core/scheduler/timer-batch.js +9 -1
- package/dist/core/scheduler/timer-sources.d.ts +1 -0
- package/dist/core/scheduler/timer-sources.js +11 -5
- package/dist/core/session-state.d.ts +0 -1
- package/dist/core/session-state.js +2 -2
- package/dist/core/start-workflow-validation.d.ts +34 -0
- package/dist/core/start-workflow-validation.js +19 -0
- package/dist/core/types/activity-verification.d.ts +67 -0
- package/dist/core/types/activity-verification.js +0 -0
- package/dist/core/types/activity.d.ts +80 -61
- package/dist/core/types/bulk.d.ts +50 -9
- package/dist/core/types/checkpoint.d.ts +44 -8
- package/dist/core/types/list-options.d.ts +146 -0
- package/dist/core/types/list-options.js +0 -0
- package/dist/core/types/options.d.ts +121 -165
- package/dist/core/types/schedules.d.ts +39 -3
- package/dist/core/types/services-resolution.d.ts +2 -2
- package/dist/core/types/workflow-builder-runtime.d.ts +12 -3
- package/dist/core/types/workflow-builder-runtime.js +11 -2
- package/dist/core/types/workflow-builder.d.ts +42 -11
- package/dist/core/types/workflow-concurrency.d.ts +39 -0
- package/dist/core/types/workflow-concurrency.js +0 -0
- package/dist/core/types/workflow-context.d.ts +157 -14
- package/dist/core/types/workflow-definition.d.ts +53 -10
- package/dist/core/types/workflow-function.d.ts +84 -9
- package/dist/core/types/workflow-log.d.ts +98 -0
- package/dist/core/types/workflow-log.js +0 -0
- package/dist/core/types/workflow-registries.d.ts +14 -3
- package/dist/core/types/workflow-registry.d.ts +3 -0
- package/dist/core/types.d.ts +4 -0
- package/dist/core/types.js +4 -0
- package/dist/core/versioning.d.ts +9 -39
- package/dist/core/versioning.js +2 -12
- package/dist/core/weft-error.d.ts +44 -1
- package/dist/core/weft-error.js +16 -0
- package/dist/core/worker-execution-strategy-options.d.ts +26 -0
- package/dist/core/worker-execution-strategy.js +40 -36
- package/dist/core/worker-inbound-message.d.ts +38 -0
- package/dist/core/worker-inbound-message.js +37 -0
- package/dist/core/worker-log-abuse-counter.d.ts +175 -0
- package/dist/core/worker-log-abuse-counter.js +107 -0
- package/dist/core/worker-message-helpers.d.ts +47 -0
- package/dist/core/worker-message-helpers.js +26 -0
- package/dist/core/worker-protocol-guard.js +1 -1
- package/dist/core/worker-protocol-log.d.ts +56 -0
- package/dist/core/worker-protocol-log.js +18 -0
- package/dist/core/worker-protocol.d.ts +23 -0
- package/dist/core/worker-protocol.js +12 -2
- package/dist/core/workflow-version-tuple.d.ts +3 -9
- package/dist/core/workflow-version-tuple.js +2 -3
- package/dist/diagnostics/format.js +1 -6
- package/dist/diagnostics/types.d.ts +4 -5
- package/dist/diagnostics/validate.d.ts +0 -1
- package/dist/diagnostics/version-check.d.ts +1 -1
- package/dist/diagnostics/version-check.js +4 -9
- package/dist/index.d.ts +12 -10
- package/dist/index.js +29 -3
- package/dist/json-schema.js +3 -3
- package/dist/mcp/cli.js +27 -27
- package/dist/mcp/dispatcher.js +1 -1
- package/dist/mcp/http.js +16 -6
- package/dist/mcp/protocol.d.ts +2 -0
- package/dist/mcp/protocol.js +1 -1
- package/dist/mcp/session.d.ts +16 -0
- package/dist/mcp/session.js +59 -6
- package/dist/mcp/tools.js +73 -6
- package/dist/observability/index.js +2 -2
- package/dist/server/asyncapi-channels.js +5 -2
- package/dist/server/attribute-filters.d.ts +8 -3
- package/dist/server/attribute-filters.js +6 -1
- package/dist/server/authentication/api-key.d.ts +2 -1
- package/dist/server/authentication/api-key.js +5 -2
- package/dist/server/authentication/constant-time-api-key.d.ts +15 -0
- package/dist/server/authentication/constant-time-api-key.js +24 -0
- package/dist/server/authentication/index.d.ts +1 -1
- package/dist/server/authentication/index.js +7 -4
- package/dist/server/authentication/rotating-api-key-store.d.ts +5 -3
- package/dist/server/authentication/rotating-api-key-store.js +19 -11
- package/dist/server/engine-event-feed-backend.d.ts +4 -5
- package/dist/server/fault-to-http.js +8 -1
- package/dist/server/fault-to-json-rpc.js +1 -0
- package/dist/server/fleet-event-feed.d.ts +31 -0
- package/dist/server/fleet-event-feed.js +157 -0
- package/dist/server/handler/index.js +1 -1
- package/dist/server/handler/response-helpers.js +2 -1
- package/dist/server/handler/route-dispatch.d.ts +6 -3
- package/dist/server/handler/route-dispatch.js +2 -2
- package/dist/server/handler.js +23 -23
- package/dist/server/index.d.ts +32 -2
- package/dist/server/index.js +26 -26
- package/dist/server/json-rpc-transport-helpers.d.ts +1 -0
- package/dist/server/json-rpc-transport-helpers.js +2 -1
- package/dist/server/json-rpc-websocket-runtime.d.ts +11 -2
- package/dist/server/json-rpc-websocket-runtime.js +1 -0
- package/dist/server/json-rpc-websocket-subscriptions.d.ts +10 -0
- package/dist/server/json-rpc-websocket-subscriptions.js +29 -0
- package/dist/server/json-rpc-websocket-types.d.ts +22 -0
- package/dist/server/json-rpc-websocket-types.js +0 -0
- package/dist/server/json-rpc-websocket-validation.js +20 -4
- package/dist/server/json-rpc-websocket.d.ts +2 -43
- package/dist/server/json-rpc-websocket.js +57 -74
- package/dist/server/openapi.d.ts +2 -1
- package/dist/server/openapi.js +1 -3
- package/dist/server/openrpc-document-schema.d.ts +78 -0
- package/dist/server/openrpc-document-schema.js +27 -1
- package/dist/server/openrpc-errors.d.ts +3 -0
- package/dist/server/openrpc-errors.js +2 -1
- package/dist/server/openrpc.js +32 -0
- package/dist/server/operation-catalog/index.d.ts +1 -1
- package/dist/server/operation-catalog/pipeline-helpers.js +1 -0
- package/dist/server/operation-catalog/pipeline-stages.js +26 -12
- package/dist/server/operation-catalog/pipeline.js +8 -1
- package/dist/server/operation-catalog/registry.js +13 -0
- package/dist/server/operation-catalog/types.d.ts +20 -9
- package/dist/server/operation-fault.d.ts +10 -0
- package/dist/server/operation-fault.js +2 -0
- package/dist/server/operation-registry.d.ts +12 -11
- package/dist/server/operation-registry.js +12 -3
- package/dist/server/operations/aggregate-workflows.d.ts +15 -15
- package/dist/server/operations/async-activity.d.ts +2 -2
- package/dist/server/operations/async-activity.js +12 -7
- package/dist/server/operations/bulk-cancel-workflows.d.ts +1 -1
- package/dist/server/operations/bulk-cancel-workflows.js +2 -2
- package/dist/server/operations/bulk-delete-workflows.d.ts +1 -1
- package/dist/server/operations/bulk-delete-workflows.js +2 -2
- package/dist/server/operations/bulk-filter-helpers.d.ts +8 -6
- package/dist/server/operations/bulk-filter-helpers.js +54 -24
- package/dist/server/operations/bulk-mutate-workflow-tags.d.ts +11 -9
- package/dist/server/operations/bulk-mutate-workflow-tags.js +2 -2
- package/dist/server/operations/bulk-operation-helpers.d.ts +2 -2
- package/dist/server/operations/bulk-retry-failed-workflows.d.ts +7 -0
- package/dist/server/operations/bulk-retry-failed-workflows.js +64 -0
- package/dist/server/operations/bulk-signal-workflows.d.ts +11 -9
- package/dist/server/operations/bulk-signal-workflows.js +2 -2
- package/dist/server/operations/cancel-schedule.d.ts +1 -1
- package/dist/server/operations/create-schedule.d.ts +3 -1
- package/dist/server/operations/create-schedule.js +29 -11
- package/dist/server/operations/fleet-events-subscription.d.ts +54 -0
- package/dist/server/operations/fleet-events-subscription.js +99 -0
- package/dist/server/operations/fork-workflow.d.ts +1 -1
- package/dist/server/operations/fork-workflow.js +3 -2
- package/dist/server/operations/get-checkpoint-at.d.ts +1 -1
- package/dist/server/operations/get-registry.d.ts +1 -1
- package/dist/server/operations/get-retention-overview.d.ts +1 -1
- package/dist/server/operations/get-review.d.ts +1 -1
- package/dist/server/operations/get-schedule.d.ts +1 -1
- package/dist/server/operations/get-stream-chunks.d.ts +1 -1
- package/dist/server/operations/get-system-metrics.d.ts +2 -2
- package/dist/server/operations/get-task-diagnostics.d.ts +45 -6
- package/dist/server/operations/get-task-diagnostics.js +101 -7
- package/dist/server/operations/get-update-result.d.ts +1 -1
- package/dist/server/operations/get-workflow-attributes.d.ts +1 -1
- package/dist/server/operations/get-workflow-events.d.ts +1 -1
- package/dist/server/operations/get-workflow-result.d.ts +1 -1
- package/dist/server/operations/get-workflow-timeline.d.ts +1 -1
- package/dist/server/operations/get-workflow.d.ts +1 -1
- package/dist/server/operations/list-checkpoints.d.ts +1 -1
- package/dist/server/operations/list-reviews.d.ts +1 -1
- package/dist/server/operations/list-schedules.d.ts +1 -1
- package/dist/server/operations/list-task-queues.d.ts +2 -2
- package/dist/server/operations/list-workers.d.ts +2 -2
- package/dist/server/operations/list-workflows.d.ts +1 -1
- package/dist/server/operations/operation-helpers.d.ts +16 -1
- package/dist/server/operations/operation-helpers.js +15 -3
- package/dist/server/operations/pause-schedule.d.ts +1 -1
- package/dist/server/operations/purge-workflows.d.ts +5 -5
- package/dist/server/operations/purge-workflows.js +2 -2
- package/dist/server/operations/query-workflow.d.ts +1 -1
- package/dist/server/operations/query-workflow.js +3 -2
- package/dist/server/operations/recover-all.d.ts +1 -1
- package/dist/server/operations/replay-workflow.d.ts +1 -1
- package/dist/server/operations/resume-schedule.d.ts +1 -1
- package/dist/server/operations/set-workflow-attributes.d.ts +1 -1
- package/dist/server/operations/set-workflow-attributes.js +6 -3
- package/dist/server/operations/signal-workflow.js +8 -3
- package/dist/server/operations/single-workflow-tag-mutation.js +13 -3
- package/dist/server/operations/start-or-signal-workflow.d.ts +6 -1
- package/dist/server/operations/start-or-signal-workflow.js +14 -24
- package/dist/server/operations/start-workflow-options.d.ts +6 -0
- package/dist/server/operations/start-workflow-rest-input.d.ts +14 -0
- package/dist/server/operations/start-workflow-rest-input.js +31 -0
- package/dist/server/operations/start-workflow.d.ts +1 -1
- package/dist/server/operations/start-workflow.js +8 -23
- package/dist/server/operations/storage.d.ts +6 -6
- package/dist/server/operations/storage.js +24 -14
- package/dist/server/operations/stream-workflow-sse.d.ts +1 -1
- package/dist/server/operations/submit-review-decision.d.ts +1 -1
- package/dist/server/operations/submit-review-decision.js +6 -3
- package/dist/server/operations/update-schedule.d.ts +1 -1
- package/dist/server/operations/update-schedule.js +7 -4
- package/dist/server/operations/update-workflow.d.ts +1 -1
- package/dist/server/operations/update-workflow.js +7 -3
- package/dist/server/operations/worker-drain.d.ts +8 -8
- package/dist/server/operations/worker-drain.js +11 -8
- package/dist/server/operations/workflow-events-subscription.d.ts +7 -8
- package/dist/server/operations/workflow-events-subscription.js +43 -8
- package/dist/server/rest-binding.d.ts +3 -1
- package/dist/server/rest-bindings.js +12 -0
- package/dist/server/rest-body.d.ts +10 -0
- package/dist/server/rest-body.js +80 -0
- package/dist/server/runtime/authentication-bridge.d.ts +1 -0
- package/dist/server/runtime/authentication-bridge.js +33 -6
- package/dist/server/runtime/client-visible-events.d.ts +3 -0
- package/dist/server/runtime/client-visible-events.js +65 -0
- package/dist/server/runtime/context.d.ts +7 -0
- package/dist/server/runtime/event-broadcasting.d.ts +6 -0
- package/dist/server/runtime/event-broadcasting.js +72 -38
- package/dist/server/runtime/retry.d.ts +1 -0
- package/dist/server/runtime/retry.js +14 -0
- package/dist/server/runtime/shutdown.d.ts +7 -6
- package/dist/server/runtime/shutdown.js +6 -1
- package/dist/server/runtime/task-polling.js +61 -20
- package/dist/server/runtime/task-reconciliation.js +9 -1
- package/dist/server/runtime/task-result-resolution.d.ts +15 -0
- package/dist/server/runtime/task-result-resolution.js +81 -0
- package/dist/server/runtime/websocket-stream.d.ts +20 -1
- package/dist/server/runtime/websocket-stream.js +173 -7
- package/dist/server/runtime/websocket-upgrade.js +22 -3
- package/dist/server/runtime/websocket-worker.d.ts +1 -1
- package/dist/server/runtime/websocket-worker.js +38 -30
- package/dist/server/serve-internals.d.ts +3 -1
- package/dist/server/serve-internals.js +18 -2
- package/dist/server/task-state.d.ts +30 -0
- package/dist/server/task-state.js +28 -0
- package/dist/server/workflow-event-feed.d.ts +36 -115
- package/dist/server/workflow-event-feed.js +92 -27
- package/dist/service-worker/index.js +30 -30
- package/dist/storage/auto.js +1 -1
- package/dist/storage/bun-sql.js +24 -0
- package/dist/storage/compressed-storage.js +1 -1
- package/dist/storage/default-scope.d.ts +7 -4
- package/dist/storage/http.js +2 -2
- package/dist/storage/index.d.ts +76 -4
- package/dist/storage/indexeddb.js +1 -1
- package/dist/storage/interface.d.ts +163 -0
- package/dist/storage/interface.js +1 -1
- package/dist/storage/key-prefixes.d.ts +1 -1
- package/dist/storage/key-prefixes.js +10 -0
- package/dist/storage/lmdb.d.ts +4 -3
- package/dist/storage/lmdb.js +1 -1
- package/dist/storage/memory.js +1 -1
- package/dist/storage/neon-batch.d.ts +30 -0
- package/dist/storage/neon-batch.js +30 -0
- package/dist/storage/neon-value-mapping.d.ts +30 -3
- package/dist/storage/neon-value-mapping.js +12 -0
- package/dist/storage/neon.d.ts +16 -0
- package/dist/storage/neon.js +9 -4
- package/dist/storage/node-sqlite.js +23 -0
- package/dist/storage/postgres-key-value-queries.d.ts +69 -44
- package/dist/storage/postgres-key-value-queries.js +62 -24
- package/dist/storage/resolve.js +1 -1
- package/dist/storage/scoped-storage.js +1 -1
- package/dist/storage/testing.d.ts +168 -0
- package/dist/storage/testing.js +2 -0
- package/dist/storage/turso.d.ts +8 -0
- package/dist/storage/turso.js +2 -2
- package/dist/storage/typed-storage.js +1 -1
- package/dist/storage/web-extension.js +1 -1
- package/dist/testing/index.js +28 -28
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker/protocol.js +1 -1
- package/dist/workers/worker-replay-state.d.ts +32 -0
- package/dist/workers/worker-replay-state.js +35 -0
- package/dist/workers/worker-state-namespace.d.ts +21 -0
- package/dist/workers/worker-state-namespace.js +13 -0
- package/dist/workers/workflow-runner.d.ts +19 -15
- package/dist/workers/workflow-runner.js +72 -60
- package/dist/workers/workflow-worker-entry.js +5 -2
- package/package.json +5 -1
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
WorkflowTerminalError
|
|
6
6
|
} from "../../core/updates.js";
|
|
7
7
|
import { defineOperation } from "../operation-registry.js";
|
|
8
|
+
import { readRestJsonBody } from "../rest-body.js";
|
|
8
9
|
import { isOperationFault, shapeRestFault } from "./operation-helpers.js";
|
|
9
10
|
const DEFAULT_UPDATE_TIMEOUT_MS = 30000, updateWorkflowInput = z.object({
|
|
10
11
|
workflowId: z.string().min(1),
|
|
@@ -85,17 +86,20 @@ export const updateWorkflowOperation = defineOperation({
|
|
|
85
86
|
timeout: { kind: "body-field", bodyField: "timeout" },
|
|
86
87
|
idempotencyKey: { kind: "body-field", bodyField: "idempotencyKey" }
|
|
87
88
|
},
|
|
88
|
-
extractInput: async (request, pathParams) => {
|
|
89
|
+
extractInput: async (request, pathParams, context) => {
|
|
89
90
|
let payload, timeout, idempotencyKey;
|
|
90
91
|
try {
|
|
91
|
-
const body = await request
|
|
92
|
+
const body = await readRestJsonBody(request, context);
|
|
92
93
|
if (typeof body === "object" && body !== null) {
|
|
93
94
|
const record = body;
|
|
94
95
|
payload = record.payload;
|
|
95
96
|
timeout = record.timeout;
|
|
96
97
|
idempotencyKey = record.idempotencyKey;
|
|
97
98
|
}
|
|
98
|
-
} catch {
|
|
99
|
+
} catch (error) {
|
|
100
|
+
if (isOperationFault(error))
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
99
103
|
return {
|
|
100
104
|
workflowId: pathParams.id ?? "",
|
|
101
105
|
updateName: pathParams.name ?? "",
|
|
@@ -37,31 +37,31 @@ type WorkerDrainOperationOptions = {
|
|
|
37
37
|
export declare function createDrainWorkerOperation(options?: WorkerDrainOperationOptions): import("../operation-catalog.ts").OperationDefinition<{
|
|
38
38
|
workerId: string;
|
|
39
39
|
reason?: string | undefined;
|
|
40
|
-
}, WorkerDrainMutationResult>;
|
|
40
|
+
}, WorkerDrainMutationResult, unknown>;
|
|
41
41
|
export declare function createClearWorkerDrainOperation(options?: WorkerDrainOperationOptions): import("../operation-catalog.ts").OperationDefinition<{
|
|
42
42
|
workerId: string;
|
|
43
|
-
}, WorkerDrainMutationResult>;
|
|
43
|
+
}, WorkerDrainMutationResult, unknown>;
|
|
44
44
|
export declare function createDrainDeploymentOperation(options?: WorkerDrainOperationOptions): import("../operation-catalog.ts").OperationDefinition<{
|
|
45
45
|
deploymentName: string;
|
|
46
46
|
reason?: string | undefined;
|
|
47
|
-
}, WorkerDrainMutationResult>;
|
|
47
|
+
}, WorkerDrainMutationResult, unknown>;
|
|
48
48
|
export declare function createClearDeploymentDrainOperation(options?: WorkerDrainOperationOptions): import("../operation-catalog.ts").OperationDefinition<{
|
|
49
49
|
deploymentName: string;
|
|
50
|
-
}, WorkerDrainMutationResult>;
|
|
50
|
+
}, WorkerDrainMutationResult, unknown>;
|
|
51
51
|
export declare const drainWorkerOperation: import("../operation-catalog.ts").OperationDefinition<{
|
|
52
52
|
workerId: string;
|
|
53
53
|
reason?: string | undefined;
|
|
54
|
-
}, WorkerDrainMutationResult>;
|
|
54
|
+
}, WorkerDrainMutationResult, unknown>;
|
|
55
55
|
export declare const clearWorkerDrainOperation: import("../operation-catalog.ts").OperationDefinition<{
|
|
56
56
|
workerId: string;
|
|
57
|
-
}, WorkerDrainMutationResult>;
|
|
57
|
+
}, WorkerDrainMutationResult, unknown>;
|
|
58
58
|
export declare const drainDeploymentOperation: import("../operation-catalog.ts").OperationDefinition<{
|
|
59
59
|
deploymentName: string;
|
|
60
60
|
reason?: string | undefined;
|
|
61
|
-
}, WorkerDrainMutationResult>;
|
|
61
|
+
}, WorkerDrainMutationResult, unknown>;
|
|
62
62
|
export declare const clearDeploymentDrainOperation: import("../operation-catalog.ts").OperationDefinition<{
|
|
63
63
|
deploymentName: string;
|
|
64
|
-
}, WorkerDrainMutationResult>;
|
|
64
|
+
}, WorkerDrainMutationResult, unknown>;
|
|
65
65
|
export declare function createDrainWorkerRestBinding(): UnknownRestBinding;
|
|
66
66
|
export declare function createClearWorkerDrainRestBinding(): UnknownRestBinding;
|
|
67
67
|
export declare function createDrainDeploymentRestBinding(): UnknownRestBinding;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { shapeOperationFaultAsJson } from "../operation-fault.js";
|
|
3
3
|
import { defineOperation } from "../operation-registry.js";
|
|
4
|
-
import {
|
|
4
|
+
import { readRestTextBody } from "../rest-body.js";
|
|
5
|
+
import { invalidParamsFault, isOperationFault } from "./operation-helpers.js";
|
|
5
6
|
const drainReasonSchema = z.string().min(1).max(256).optional(), workerDrainInput = z.object({
|
|
6
7
|
workerId: z.string().min(1),
|
|
7
8
|
reason: drainReasonSchema
|
|
@@ -153,9 +154,9 @@ function createWorkerDrainRestBinding(method, operationName) {
|
|
|
153
154
|
workerId: { kind: "path", pathParam: "workerId" },
|
|
154
155
|
...method === "POST" ? { reason: { kind: "body-field", bodyField: "reason" } } : {}
|
|
155
156
|
},
|
|
156
|
-
extractInput: async (request, pathParams) => ({
|
|
157
|
+
extractInput: async (request, pathParams, context) => ({
|
|
157
158
|
workerId: pathParams.workerId ?? "",
|
|
158
|
-
...method === "POST" ? await readDrainBody(request) : {}
|
|
159
|
+
...method === "POST" ? await readDrainBody(request, context) : {}
|
|
159
160
|
}),
|
|
160
161
|
success: { kind: "json", status: 200 },
|
|
161
162
|
shapeSuccess: shapeDrainSuccess,
|
|
@@ -172,9 +173,9 @@ function createDeploymentDrainRestBinding(method, operationName) {
|
|
|
172
173
|
deploymentName: { kind: "path", pathParam: "deploymentName" },
|
|
173
174
|
...method === "POST" ? { reason: { kind: "body-field", bodyField: "reason" } } : {}
|
|
174
175
|
},
|
|
175
|
-
extractInput: async (request, pathParams) => ({
|
|
176
|
+
extractInput: async (request, pathParams, context) => ({
|
|
176
177
|
deploymentName: pathParams.deploymentName ?? "",
|
|
177
|
-
...method === "POST" ? await readDrainBody(request) : {}
|
|
178
|
+
...method === "POST" ? await readDrainBody(request, context) : {}
|
|
178
179
|
}),
|
|
179
180
|
success: { kind: "json", status: 200 },
|
|
180
181
|
shapeSuccess: shapeDrainSuccess,
|
|
@@ -187,14 +188,16 @@ function shapeDrainSuccess(output) {
|
|
|
187
188
|
headers: { "Content-Type": "application/json" }
|
|
188
189
|
});
|
|
189
190
|
}
|
|
190
|
-
async function readDrainBody(request) {
|
|
191
|
-
const text = await request
|
|
191
|
+
async function readDrainBody(request, context) {
|
|
192
|
+
const text = await readRestTextBody(request, context);
|
|
192
193
|
if (text.trim().length === 0)
|
|
193
194
|
return {};
|
|
194
195
|
let parsed;
|
|
195
196
|
try {
|
|
196
197
|
parsed = JSON.parse(text);
|
|
197
|
-
} catch {
|
|
198
|
+
} catch (error) {
|
|
199
|
+
if (isOperationFault(error))
|
|
200
|
+
throw error;
|
|
198
201
|
throw invalidParamsFault("Drain request body must be valid JSON");
|
|
199
202
|
}
|
|
200
203
|
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed))
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import { type EventEnvelope } from '../workflow-event-feed.ts';
|
|
2
3
|
declare const workflowEventsSubscriptionInput: z.ZodObject<{
|
|
3
4
|
workflowId: z.ZodString;
|
|
4
5
|
selector: z.ZodDefault<z.ZodOptional<z.ZodEnum<{
|
|
@@ -28,13 +29,11 @@ export type WorkflowEventsSubscriptionEnvelope = z.infer<typeof workflowEventsSu
|
|
|
28
29
|
* subscriptions. This is documented as a known v1 constraint; per-event
|
|
29
30
|
* filtering is a planned future refinement.
|
|
30
31
|
*
|
|
31
|
-
* Access is
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
* without auth must add an authentication layer before exposing this
|
|
37
|
-
* endpoint to untrusted networks.
|
|
32
|
+
* Access is selector-specific: event envelopes require `events:read`, while
|
|
33
|
+
* token-stream envelopes require `streams:read`. Anonymous callers and
|
|
34
|
+
* authenticated callers without the matching scope are denied. Operators
|
|
35
|
+
* running `serve({ engine })` without auth must add an authentication layer
|
|
36
|
+
* before exposing this endpoint to untrusted networks.
|
|
38
37
|
*/
|
|
39
38
|
export declare const workflowEventsSubscriptionOperation: import("../operation-catalog.ts").OperationDefinition<{
|
|
40
39
|
workflowId: string;
|
|
@@ -43,5 +42,5 @@ export declare const workflowEventsSubscriptionOperation: import("../operation-c
|
|
|
43
42
|
}, {
|
|
44
43
|
subscriptionId: string;
|
|
45
44
|
cursor: string;
|
|
46
|
-
}>;
|
|
45
|
+
}, EventEnvelope>;
|
|
47
46
|
export {};
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { defineOperation } from "../operation-registry.js";
|
|
3
|
-
|
|
3
|
+
import { isAuthenticated } from "../principal.js";
|
|
4
|
+
import {
|
|
5
|
+
decodeCursor
|
|
6
|
+
} from "../workflow-event-feed.js";
|
|
7
|
+
import { invalidParamsFault } from "./operation-helpers.js";
|
|
8
|
+
const INITIAL_SUBSCRIPTION_CURSOR = "-1", MAX_WORKFLOW_SUBSCRIPTION_REPLAY_EVENTS = 1000, workflowEventsSubscriptionInput = z.object({
|
|
4
9
|
workflowId: z.string().min(1),
|
|
5
10
|
selector: z.enum(["events", "tokens"]).optional().default("events"),
|
|
6
|
-
fromCursor: z.string().optional()
|
|
11
|
+
fromCursor: z.string().refine((cursor) => decodeCursor(cursor) !== null, { message: "Invalid cursor" }).optional()
|
|
7
12
|
}), workflowEventsSubscriptionEnvelope = z.object({
|
|
8
13
|
subscriptionId: z.string(),
|
|
9
14
|
cursor: z.string()
|
|
@@ -13,10 +18,12 @@ export const workflowEventsSubscriptionOperation = defineOperation({
|
|
|
13
18
|
mcpExposable: !1,
|
|
14
19
|
kind: "subscription",
|
|
15
20
|
summary: "Subscribe to workflow events with replay-from-cursor",
|
|
21
|
+
description: '`selector: "events"` requires `events:read`; `selector: "tokens"` requires `streams:read`. The grant is checked when the WebSocket subscription starts and remains active until unsubscribe, socket close, or feed termination.',
|
|
16
22
|
destructive: !1,
|
|
17
23
|
tags: ["Events"],
|
|
18
24
|
inputSchema: workflowEventsSubscriptionInput,
|
|
19
25
|
outputSchema: workflowEventsSubscriptionEnvelope,
|
|
26
|
+
producibleFaults: ["InvalidParams"],
|
|
20
27
|
eventSchema: z.object({
|
|
21
28
|
kind: z.string(),
|
|
22
29
|
workflowId: z.string(),
|
|
@@ -26,20 +33,45 @@ export const workflowEventsSubscriptionOperation = defineOperation({
|
|
|
26
33
|
emittedAtMs: z.number(),
|
|
27
34
|
payload: z.unknown()
|
|
28
35
|
}),
|
|
29
|
-
access: {
|
|
30
|
-
|
|
31
|
-
|
|
36
|
+
access: { kind: "authenticated" },
|
|
37
|
+
parameterizedAccess: {
|
|
38
|
+
discriminator: "selector",
|
|
39
|
+
defaultValue: "events",
|
|
40
|
+
variants: [
|
|
41
|
+
{
|
|
42
|
+
value: "events",
|
|
43
|
+
access: { kind: "scoped", scopes: { kind: "anyOf", scopes: ["events:read"] } }
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
value: "tokens",
|
|
47
|
+
access: { kind: "scoped", scopes: { kind: "anyOf", scopes: ["streams:read"] } }
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
authorize: async ({ input, principal }) => {
|
|
52
|
+
const requiredScope = workflowSubscriptionScope(input.selector);
|
|
53
|
+
if (!isAuthenticated(principal))
|
|
54
|
+
return { allowed: !1, classification: "unauthorized", reason: "authentication required" };
|
|
55
|
+
if (principal.hasScope(requiredScope))
|
|
56
|
+
return { allowed: !0 };
|
|
57
|
+
return {
|
|
58
|
+
allowed: !1,
|
|
59
|
+
classification: "forbidden",
|
|
60
|
+
reason: `requires scope: ${requiredScope}`
|
|
61
|
+
};
|
|
32
62
|
},
|
|
33
63
|
discoverable: !0,
|
|
34
64
|
transports: { http: !1, jsonRpcHttp: !1, jsonRpcWebSocket: !0, jsonRpcStdio: !1 },
|
|
35
65
|
unknownKeyPolicy: { http: "strip", jsonRpc: "reject" },
|
|
36
66
|
invoke: async ({ input, engine }) => {
|
|
37
|
-
const feed = engine.feed, controller = new AbortController, startingCursor = input.fromCursor ?? INITIAL_SUBSCRIPTION_CURSOR,
|
|
67
|
+
const feed = engine.feed, controller = new AbortController, startingCursor = input.fromCursor ?? INITIAL_SUBSCRIPTION_CURSOR, subscribeOptions = {
|
|
38
68
|
workflowId: input.workflowId,
|
|
39
69
|
selector: input.selector,
|
|
40
70
|
...input.fromCursor === void 0 ? {} : { fromCursor: input.fromCursor },
|
|
41
|
-
signal: controller.signal
|
|
42
|
-
|
|
71
|
+
signal: controller.signal,
|
|
72
|
+
replayLimit: MAX_WORKFLOW_SUBSCRIPTION_REPLAY_EVENTS,
|
|
73
|
+
createReplayLimitError: (count, limit) => invalidParamsFault(`Workflow event replay window is ${count} events; maximum is ${limit}. Supply a more recent fromCursor.`)
|
|
74
|
+
}, iterable = feed.subscribe(subscribeOptions);
|
|
43
75
|
return {
|
|
44
76
|
envelope: { subscriptionId: `sub_${crypto.randomUUID()}`, cursor: startingCursor },
|
|
45
77
|
iterable,
|
|
@@ -49,3 +81,6 @@ export const workflowEventsSubscriptionOperation = defineOperation({
|
|
|
49
81
|
};
|
|
50
82
|
}
|
|
51
83
|
});
|
|
84
|
+
function workflowSubscriptionScope(selector) {
|
|
85
|
+
return selector === "tokens" ? "streams:read" : "events:read";
|
|
86
|
+
}
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { WeftError } from '../core/weft-error.ts';
|
|
14
14
|
import type { OperationFault } from './operation-fault.ts';
|
|
15
|
+
import type { RestBodyReadOptions } from './rest-body.ts';
|
|
15
16
|
import type { HttpMethod } from './route-model.ts';
|
|
16
17
|
/**
|
|
17
18
|
* Thrown by `bindingPathMatches` when a URL path parameter contains malformed
|
|
@@ -59,6 +60,7 @@ export type ResponseShape = {
|
|
|
59
60
|
readonly kind: 'streaming';
|
|
60
61
|
readonly mediaType: 'text/event-stream' | 'application/octet-stream' | 'application/x-ndjson';
|
|
61
62
|
};
|
|
63
|
+
export type RestInputContext = RestBodyReadOptions;
|
|
62
64
|
/**
|
|
63
65
|
* Binds a REST mount point to an `OperationDefinition`. Generic over
|
|
64
66
|
* `Input` / `Output` so `extractInput` returns a value the operation's
|
|
@@ -91,7 +93,7 @@ export type RestBinding<Input, Output> = {
|
|
|
91
93
|
* Called before `executeOperation`; the returned value is what the
|
|
92
94
|
* pipeline's schema parse step sees.
|
|
93
95
|
*/
|
|
94
|
-
readonly extractInput: (request: Request, pathParams: Record<string, string
|
|
96
|
+
readonly extractInput: (request: Request, pathParams: Record<string, string>, context: RestInputContext) => Promise<Input>;
|
|
95
97
|
/** Canonical response shape — OpenAPI reads this, handler may override via `shapeSuccess`. */
|
|
96
98
|
readonly success: ResponseShape;
|
|
97
99
|
/**
|
|
@@ -25,6 +25,10 @@ import {
|
|
|
25
25
|
bulkMutateWorkflowTagsOperation,
|
|
26
26
|
bulkMutateWorkflowTagsRestBinding
|
|
27
27
|
} from "./operations/bulk-mutate-workflow-tags.js";
|
|
28
|
+
import {
|
|
29
|
+
bulkRetryFailedWorkflowsOperation,
|
|
30
|
+
bulkRetryFailedWorkflowsRestBinding
|
|
31
|
+
} from "./operations/bulk-retry-failed-workflows.js";
|
|
28
32
|
import {
|
|
29
33
|
bulkSignalWorkflowsOperation,
|
|
30
34
|
bulkSignalWorkflowsRestBinding
|
|
@@ -41,6 +45,7 @@ import {
|
|
|
41
45
|
createScheduleOperation,
|
|
42
46
|
createScheduleRestBinding
|
|
43
47
|
} from "./operations/create-schedule.js";
|
|
48
|
+
import { fleetEventsSubscriptionOperation } from "./operations/fleet-events-subscription.js";
|
|
44
49
|
import { forkWorkflowOperation, forkWorkflowRestBinding } from "./operations/fork-workflow.js";
|
|
45
50
|
import {
|
|
46
51
|
getCheckpointAtOperation,
|
|
@@ -62,6 +67,8 @@ import {
|
|
|
62
67
|
createGetSystemMetricsRestBinding
|
|
63
68
|
} from "./operations/get-system-metrics.js";
|
|
64
69
|
import {
|
|
70
|
+
clearTaskDeadLetterOperation,
|
|
71
|
+
clearTaskDeadLetterRestBinding,
|
|
65
72
|
createGetTaskDiagnosticsOperation,
|
|
66
73
|
getTaskDiagnosticsOperation,
|
|
67
74
|
getTaskDiagnosticsRestBinding
|
|
@@ -206,6 +213,7 @@ export const REST_BINDINGS = [
|
|
|
206
213
|
purgeWorkflowsRestBinding,
|
|
207
214
|
bulkCancelWorkflowsRestBinding,
|
|
208
215
|
bulkSignalWorkflowsRestBinding,
|
|
216
|
+
bulkRetryFailedWorkflowsRestBinding,
|
|
209
217
|
bulkDeleteWorkflowsRestBinding,
|
|
210
218
|
bulkMutateWorkflowTagsRestBinding,
|
|
211
219
|
getWorkflowRestBinding,
|
|
@@ -243,6 +251,7 @@ export const REST_BINDINGS = [
|
|
|
243
251
|
getStreamChunksRestBinding,
|
|
244
252
|
streamWorkflowSseRestBinding,
|
|
245
253
|
getTaskDiagnosticsRestBinding,
|
|
254
|
+
clearTaskDeadLetterRestBinding,
|
|
246
255
|
listSchedulesRestBinding,
|
|
247
256
|
getScheduleRestBinding,
|
|
248
257
|
replayWorkflowRestBinding,
|
|
@@ -331,6 +340,7 @@ export function createLiveOperationRegistry(options) {
|
|
|
331
340
|
purgeWorkflowsOperation,
|
|
332
341
|
bulkCancelWorkflowsOperation,
|
|
333
342
|
bulkSignalWorkflowsOperation,
|
|
343
|
+
bulkRetryFailedWorkflowsOperation,
|
|
334
344
|
bulkDeleteWorkflowsOperation,
|
|
335
345
|
bulkMutateWorkflowTagsOperation,
|
|
336
346
|
getWorkflowOperation,
|
|
@@ -367,7 +377,9 @@ export function createLiveOperationRegistry(options) {
|
|
|
367
377
|
getStreamChunksOperation,
|
|
368
378
|
streamWorkflowSseOperation,
|
|
369
379
|
workflowEventsSubscriptionOperation,
|
|
380
|
+
fleetEventsSubscriptionOperation,
|
|
370
381
|
buildTaskDiagnosticsOperationForRegistry(resolved),
|
|
382
|
+
clearTaskDeadLetterOperation,
|
|
371
383
|
listSchedulesOperation,
|
|
372
384
|
getScheduleOperation,
|
|
373
385
|
replayWorkflowOperation,
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OperationFault } from './operation-fault.ts';
|
|
2
|
+
export declare const DEFAULT_REST_MAX_BODY_BYTES: number;
|
|
3
|
+
export type RestBodyReadOptions = {
|
|
4
|
+
readonly maxBodyBytes?: number;
|
|
5
|
+
};
|
|
6
|
+
export declare function payloadTooLargeFault(maxBytes: number): OperationFault;
|
|
7
|
+
export declare function readRestBodyBounded(request: Request, options?: RestBodyReadOptions): Promise<Uint8Array>;
|
|
8
|
+
export declare function readRestTextBody(request: Request, options?: RestBodyReadOptions): Promise<string>;
|
|
9
|
+
export declare function readRestJsonBody(request: Request, options?: RestBodyReadOptions): Promise<unknown>;
|
|
10
|
+
export declare function readOptionalRestJsonBody(request: Request, options?: RestBodyReadOptions): Promise<unknown>;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
export const DEFAULT_REST_MAX_BODY_BYTES = 1048576;
|
|
2
|
+
const CONTENT_LENGTH_PATTERN = /^(0|[1-9]\d*)$/;
|
|
3
|
+
export function payloadTooLargeFault(maxBytes) {
|
|
4
|
+
return {
|
|
5
|
+
code: "PayloadTooLarge",
|
|
6
|
+
message: "Payload Too Large",
|
|
7
|
+
data: { maxBytes }
|
|
8
|
+
};
|
|
9
|
+
}
|
|
10
|
+
function invalidContentLengthFault() {
|
|
11
|
+
return {
|
|
12
|
+
code: "InvalidParams",
|
|
13
|
+
message: "Invalid Content-Length header",
|
|
14
|
+
data: { issues: [] }
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function resolveMaxBodyBytes(options) {
|
|
18
|
+
const maxBytes = options?.maxBodyBytes ?? DEFAULT_REST_MAX_BODY_BYTES;
|
|
19
|
+
if (!Number.isSafeInteger(maxBytes) || maxBytes < 0)
|
|
20
|
+
throw Error("REST body size limit must be a non-negative safe integer");
|
|
21
|
+
return maxBytes;
|
|
22
|
+
}
|
|
23
|
+
function assertDeclaredContentLengthWithinLimit(request, maxBytes) {
|
|
24
|
+
const header = request.headers.get("content-length");
|
|
25
|
+
if (header === null)
|
|
26
|
+
return;
|
|
27
|
+
if (!CONTENT_LENGTH_PATTERN.test(header))
|
|
28
|
+
throw invalidContentLengthFault();
|
|
29
|
+
const declared = Number(header);
|
|
30
|
+
if (!Number.isSafeInteger(declared) || declared < 0)
|
|
31
|
+
throw invalidContentLengthFault();
|
|
32
|
+
if (declared > maxBytes)
|
|
33
|
+
throw payloadTooLargeFault(maxBytes);
|
|
34
|
+
}
|
|
35
|
+
async function cancelReaderAfterPayloadOverflow(reader) {
|
|
36
|
+
try {
|
|
37
|
+
await reader.cancel();
|
|
38
|
+
} catch {}
|
|
39
|
+
}
|
|
40
|
+
export async function readRestBodyBounded(request, options) {
|
|
41
|
+
const maxBytes = resolveMaxBodyBytes(options);
|
|
42
|
+
assertDeclaredContentLengthWithinLimit(request, maxBytes);
|
|
43
|
+
const body = request.body;
|
|
44
|
+
if (body === null)
|
|
45
|
+
return new Uint8Array;
|
|
46
|
+
const reader = body.getReader(), chunks = [];
|
|
47
|
+
let total = 0;
|
|
48
|
+
try {
|
|
49
|
+
while (!0) {
|
|
50
|
+
const { done, value } = await reader.read();
|
|
51
|
+
if (done)
|
|
52
|
+
break;
|
|
53
|
+
total += value.byteLength;
|
|
54
|
+
if (total > maxBytes) {
|
|
55
|
+
await cancelReaderAfterPayloadOverflow(reader);
|
|
56
|
+
throw payloadTooLargeFault(maxBytes);
|
|
57
|
+
}
|
|
58
|
+
chunks.push(value);
|
|
59
|
+
}
|
|
60
|
+
} finally {
|
|
61
|
+
reader.releaseLock();
|
|
62
|
+
}
|
|
63
|
+
const bytes = new Uint8Array(total);
|
|
64
|
+
let offset = 0;
|
|
65
|
+
for (const chunk of chunks) {
|
|
66
|
+
bytes.set(chunk, offset);
|
|
67
|
+
offset += chunk.byteLength;
|
|
68
|
+
}
|
|
69
|
+
return bytes;
|
|
70
|
+
}
|
|
71
|
+
export async function readRestTextBody(request, options) {
|
|
72
|
+
return new TextDecoder("utf-8").decode(await readRestBodyBounded(request, options));
|
|
73
|
+
}
|
|
74
|
+
export async function readRestJsonBody(request, options) {
|
|
75
|
+
return JSON.parse(await readRestTextBody(request, options));
|
|
76
|
+
}
|
|
77
|
+
export async function readOptionalRestJsonBody(request, options) {
|
|
78
|
+
const text = await readRestTextBody(request, options);
|
|
79
|
+
return text.trim() === "" ? void 0 : JSON.parse(text);
|
|
80
|
+
}
|
|
@@ -11,6 +11,7 @@ type ServerFetchOptions = {
|
|
|
11
11
|
discoveryInfo?: import('../discovery-info.ts').DiscoveryInfo;
|
|
12
12
|
publicOrigin?: string;
|
|
13
13
|
trustedHosts?: ReadonlyArray<string>;
|
|
14
|
+
maxRequestBodyBytes?: number;
|
|
14
15
|
};
|
|
15
16
|
export declare function deriveSupportedOpenApiSecuritySchemes(auth: AuthConfig | undefined): ReadonlySet<OpenApiSecuritySchemeName>;
|
|
16
17
|
export declare function handleServerFetchRequest(server: ReturnType<typeof Bun.serve>, context: ServerContext, options: ServerFetchOptions, originalRequest: Request): Promise<Response | undefined>;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { decode } from "../../core/codec.js";
|
|
2
|
+
import { WorkerDisconnectedEvent } from "../../core/events.js";
|
|
2
3
|
import { handleMcpHttpRequest } from "../../mcp/http.js";
|
|
3
4
|
import { KEYS } from "../../storage/interface.js";
|
|
4
5
|
import { authContextToPrincipal, handleRequest } from "../handler.js";
|
|
@@ -13,7 +14,15 @@ import { buildPreflightResponse, decorateResponseWithCors, isPreflightRequest }
|
|
|
13
14
|
import { gateRequest } from "./request-gate.js";
|
|
14
15
|
import { handleTaskPollRequest, handleTaskResultRequest } from "./task-polling.js";
|
|
15
16
|
import { reassignOrExpireTask } from "./task-reconciliation.js";
|
|
16
|
-
import {
|
|
17
|
+
import {
|
|
18
|
+
addStreamSocket,
|
|
19
|
+
addWatchSocket,
|
|
20
|
+
removeStreamSocket,
|
|
21
|
+
removeWatchSocket,
|
|
22
|
+
removeWorkflowStreamConnection,
|
|
23
|
+
replayTokenStream,
|
|
24
|
+
replayWatchEvents
|
|
25
|
+
} from "./websocket-stream.js";
|
|
17
26
|
import { handleWebSocketUpgrade } from "./websocket-upgrade.js";
|
|
18
27
|
import { handleWorkerWebSocketMessage, isInflightRecord } from "./websocket-worker.js";
|
|
19
28
|
export function deriveSupportedOpenApiSecuritySchemes(auth) {
|
|
@@ -72,7 +81,8 @@ async function dispatchServerFetchRequest(server, context, options, originalRequ
|
|
|
72
81
|
request,
|
|
73
82
|
registry: context.liveOperationRegistry,
|
|
74
83
|
engine: options.engine,
|
|
75
|
-
authContext: authentication.authContext
|
|
84
|
+
authContext: authentication.authContext,
|
|
85
|
+
...options.maxRequestBodyBytes !== void 0 ? { maxBodyBytes: options.maxRequestBodyBytes } : {}
|
|
76
86
|
});
|
|
77
87
|
return handleRequest(request, options.engine, buildHandlerOptions(context, options, authentication));
|
|
78
88
|
}
|
|
@@ -83,6 +93,7 @@ function buildHandlerOptions(context, options, authentication) {
|
|
|
83
93
|
...options.discoveryInfo !== void 0 ? { discoveryInfo: options.discoveryInfo } : {},
|
|
84
94
|
...options.publicOrigin !== void 0 ? { publicOrigin: options.publicOrigin } : {},
|
|
85
95
|
...options.trustedHosts !== void 0 ? { trustedHosts: options.trustedHosts } : {},
|
|
96
|
+
...options.maxRequestBodyBytes !== void 0 ? { maxRequestBodyBytes: options.maxRequestBodyBytes } : {},
|
|
86
97
|
operationRegistry: context.liveOperationRegistry,
|
|
87
98
|
restBindings: context.liveRestBindings,
|
|
88
99
|
supportedAuthenticationSchemes: context.supportedAuthenticationSchemes
|
|
@@ -92,12 +103,20 @@ export function createServerWebSocketHandlers(context, options, cleanupWorkflowI
|
|
|
92
103
|
return {
|
|
93
104
|
open(ws) {
|
|
94
105
|
const { pathname, connectionType, workflowId } = ws.data;
|
|
95
|
-
if (
|
|
106
|
+
if (connectionType === "watch" && workflowId && !addWatchSocket(context, workflowId, ws))
|
|
107
|
+
return;
|
|
108
|
+
if (connectionType === "watch" && workflowId) {
|
|
109
|
+
ws.data.watchReplayInProgress = !0;
|
|
110
|
+
ws.data.pendingWatchMessages = [];
|
|
111
|
+
replayWatchEvents(context, options.engine, ws, workflowId);
|
|
112
|
+
}
|
|
113
|
+
if (pathname && connectionType !== "stream" && connectionType !== "watch" && connectionType !== "jsonrpc")
|
|
96
114
|
ws.subscribe(pathname);
|
|
97
115
|
if (connectionType === "stream" && workflowId) {
|
|
98
|
-
ws.data.
|
|
116
|
+
ws.data.streamReplayInProgress = !0;
|
|
99
117
|
ws.data.pendingStreamMessages = [];
|
|
100
|
-
addStreamSocket(context, workflowId, ws)
|
|
118
|
+
if (!addStreamSocket(context, workflowId, ws))
|
|
119
|
+
return;
|
|
101
120
|
replayTokenStream(context, options.engine, ws, workflowId);
|
|
102
121
|
}
|
|
103
122
|
if (connectionType === "jsonrpc") {
|
|
@@ -106,6 +125,7 @@ export function createServerWebSocketHandlers(context, options, cleanupWorkflowI
|
|
|
106
125
|
registry: context.liveOperationRegistry,
|
|
107
126
|
engine: options.engine,
|
|
108
127
|
feed: context.workflowEventFeed,
|
|
128
|
+
fleetFeed: context.fleetEventFeed,
|
|
109
129
|
activeSessions: context.activeJsonRpcSessions
|
|
110
130
|
});
|
|
111
131
|
return;
|
|
@@ -133,8 +153,14 @@ export function createServerWebSocketHandlers(context, options, cleanupWorkflowI
|
|
|
133
153
|
});
|
|
134
154
|
return;
|
|
135
155
|
}
|
|
136
|
-
if (ws.data.connectionType === "stream")
|
|
156
|
+
if (ws.data.connectionType === "stream") {
|
|
137
157
|
removeStreamSocket(context, ws);
|
|
158
|
+
removeWorkflowStreamConnection(context, ws);
|
|
159
|
+
}
|
|
160
|
+
if (ws.data.connectionType === "watch") {
|
|
161
|
+
removeWatchSocket(context, ws);
|
|
162
|
+
removeWorkflowStreamConnection(context, ws);
|
|
163
|
+
}
|
|
138
164
|
const workerId = ws.data.workerId;
|
|
139
165
|
if (workerId) {
|
|
140
166
|
if (context.workerSockets.get(workerId) !== ws) {
|
|
@@ -167,6 +193,7 @@ function runWorkerDisconnectRequeue(context, options, workerId, _ws, cleanupWork
|
|
|
167
193
|
}
|
|
168
194
|
context.registry.unregister(workerId);
|
|
169
195
|
context.workerSockets.delete(workerId);
|
|
196
|
+
options.engine.dispatchEvent(new WorkerDisconnectedEvent(workerId, inFlightTasks.length));
|
|
170
197
|
for (const [workflowId, affinityWorkerId] of context.workerAffinity)
|
|
171
198
|
if (affinityWorkerId === workerId)
|
|
172
199
|
context.workerAffinity.delete(workflowId);
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const TOKEN_EVENT_TYPE = "stream:token";
|
|
2
|
+
export declare const EVENTS_READ_EVENT_TYPES: readonly ["workflow:started", "workflow:completed", "workflow:failed", "workflow:cancelled", "workflow:timed-out", "workflow:resumed", "workflow:suspended", "workflow:teardown", "activity:started", "activity:completed", "activity:failed", "activity:async-pending", "task:dead-lettered", "signal:received", "signal:delivered", "attributes:changed", "update:received", "update:completed", "schedule:fired", "schedule:missed-fire", "checkpoint:size-warning", "development:warning", "cleanup:warning", "storage:size-reported", "human-review:requested", "human-review:completed", "alert:fired", "alert:resolved", "constraint:violated", "worker:connected", "worker:disconnected"];
|
|
3
|
+
export declare const CLIENT_VISIBLE_EVENT_TYPES: readonly ["workflow:started", "workflow:completed", "workflow:failed", "workflow:cancelled", "workflow:timed-out", "workflow:resumed", "workflow:suspended", "workflow:teardown", "activity:started", "activity:completed", "activity:failed", "activity:async-pending", "task:dead-lettered", "signal:received", "signal:delivered", "attributes:changed", "update:received", "update:completed", "schedule:fired", "schedule:missed-fire", "checkpoint:size-warning", "development:warning", "cleanup:warning", "storage:size-reported", "human-review:requested", "human-review:completed", "alert:fired", "alert:resolved", "constraint:violated", "worker:connected", "worker:disconnected", "stream:token"];
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ActivityAsyncPendingEvent,
|
|
3
|
+
ActivityCompletedEvent,
|
|
4
|
+
ActivityFailedEvent,
|
|
5
|
+
ActivityStartedEvent,
|
|
6
|
+
AlertFiredEvent,
|
|
7
|
+
AlertResolvedEvent,
|
|
8
|
+
AttributesChangedEvent,
|
|
9
|
+
CheckpointSizeWarningEvent,
|
|
10
|
+
CleanupWarningEvent,
|
|
11
|
+
ConstraintViolatedEvent,
|
|
12
|
+
DevelopmentWarningEvent,
|
|
13
|
+
ScheduleFiredEvent,
|
|
14
|
+
ScheduleMissedFireEvent,
|
|
15
|
+
SignalDeliveredEvent,
|
|
16
|
+
SignalReceivedEvent,
|
|
17
|
+
StorageSizeReportedEvent,
|
|
18
|
+
TaskResultDeadLetteredEvent,
|
|
19
|
+
UpdateCompletedEvent,
|
|
20
|
+
UpdateReceivedEvent,
|
|
21
|
+
WorkerConnectedEvent,
|
|
22
|
+
WorkerDisconnectedEvent,
|
|
23
|
+
WorkflowCancelledEvent,
|
|
24
|
+
WorkflowCompletedEvent,
|
|
25
|
+
WorkflowFailedEvent,
|
|
26
|
+
WorkflowResumedEvent,
|
|
27
|
+
WorkflowStartedEvent,
|
|
28
|
+
WorkflowSuspendedEvent,
|
|
29
|
+
WorkflowTeardownEvent,
|
|
30
|
+
WorkflowTimedOutEvent
|
|
31
|
+
} from "../../core/events.js";
|
|
32
|
+
import { ReviewCompletedEvent, ReviewRequestedEvent } from "../../core/review/events.js";
|
|
33
|
+
export const TOKEN_EVENT_TYPE = "stream:token", EVENTS_READ_EVENT_TYPES = [
|
|
34
|
+
WorkflowStartedEvent.type,
|
|
35
|
+
WorkflowCompletedEvent.type,
|
|
36
|
+
WorkflowFailedEvent.type,
|
|
37
|
+
WorkflowCancelledEvent.type,
|
|
38
|
+
WorkflowTimedOutEvent.type,
|
|
39
|
+
WorkflowResumedEvent.type,
|
|
40
|
+
WorkflowSuspendedEvent.type,
|
|
41
|
+
WorkflowTeardownEvent.type,
|
|
42
|
+
ActivityStartedEvent.type,
|
|
43
|
+
ActivityCompletedEvent.type,
|
|
44
|
+
ActivityFailedEvent.type,
|
|
45
|
+
ActivityAsyncPendingEvent.type,
|
|
46
|
+
TaskResultDeadLetteredEvent.type,
|
|
47
|
+
SignalReceivedEvent.type,
|
|
48
|
+
SignalDeliveredEvent.type,
|
|
49
|
+
AttributesChangedEvent.type,
|
|
50
|
+
UpdateReceivedEvent.type,
|
|
51
|
+
UpdateCompletedEvent.type,
|
|
52
|
+
ScheduleFiredEvent.type,
|
|
53
|
+
ScheduleMissedFireEvent.type,
|
|
54
|
+
CheckpointSizeWarningEvent.type,
|
|
55
|
+
DevelopmentWarningEvent.type,
|
|
56
|
+
CleanupWarningEvent.type,
|
|
57
|
+
StorageSizeReportedEvent.type,
|
|
58
|
+
ReviewRequestedEvent.type,
|
|
59
|
+
ReviewCompletedEvent.type,
|
|
60
|
+
AlertFiredEvent.type,
|
|
61
|
+
AlertResolvedEvent.type,
|
|
62
|
+
ConstraintViolatedEvent.type,
|
|
63
|
+
WorkerConnectedEvent.type,
|
|
64
|
+
WorkerDisconnectedEvent.type
|
|
65
|
+
], CLIENT_VISIBLE_EVENT_TYPES = [...EVENTS_READ_EVENT_TYPES, TOKEN_EVENT_TYPE];
|
|
@@ -5,6 +5,7 @@ import type { WorkerRegistry } from '../../worker/registry.ts';
|
|
|
5
5
|
import type { Authenticator, RateLimiter } from '../authentication.ts';
|
|
6
6
|
import type { DeadlineTracker } from '../deadline-tracker.ts';
|
|
7
7
|
import type { createEngineEventFeedBackend } from '../engine-event-feed-backend.ts';
|
|
8
|
+
import type { FleetEventFeed } from '../fleet-event-feed.ts';
|
|
8
9
|
import type { WebSocketData } from '../json-rpc-websocket-runtime.ts';
|
|
9
10
|
import type { JsonRpcWebSocketSession } from '../json-rpc-websocket.ts';
|
|
10
11
|
import type { OpenApiSecuritySchemeName } from '../openapi.ts';
|
|
@@ -23,6 +24,9 @@ export interface ServerContext {
|
|
|
23
24
|
readonly taskQueue: TaskQueue;
|
|
24
25
|
readonly workerSockets: Map<string, ServerWebSocket<WebSocketData>>;
|
|
25
26
|
readonly streamSockets: Map<string, Set<ServerWebSocket<WebSocketData>>>;
|
|
27
|
+
readonly watchSockets: Map<string, Set<ServerWebSocket<WebSocketData>>>;
|
|
28
|
+
readonly workflowStreamConnectionCounts: Map<string, number>;
|
|
29
|
+
readonly maxStreamConnectionsPerWorkflow: number;
|
|
26
30
|
/** Tracks per-workflow worker affinity for sticky routing. Maps workflowId to workerId. */
|
|
27
31
|
readonly workerAffinity: Map<string, string>;
|
|
28
32
|
/** Reverse index: workflowId to set of operationIds currently in-flight for that workflow. */
|
|
@@ -42,6 +46,7 @@ export interface ServerContext {
|
|
|
42
46
|
readonly metricsCollector: MetricsCollector;
|
|
43
47
|
readonly eventFeedBackend: ReturnType<typeof createEngineEventFeedBackend>;
|
|
44
48
|
readonly workflowEventFeed: WorkflowEventFeed;
|
|
49
|
+
readonly fleetEventFeed: FleetEventFeed;
|
|
45
50
|
readonly activeJsonRpcSessions: Set<JsonRpcWebSocketSession>;
|
|
46
51
|
readonly mcpSessionManager: McpSessionManager;
|
|
47
52
|
readonly authenticatorPromise: Promise<Authenticator> | null;
|
|
@@ -59,6 +64,8 @@ export interface ServerContext {
|
|
|
59
64
|
* this window cancels the pending requeue. `0` means inline requeue.
|
|
60
65
|
*/
|
|
61
66
|
readonly workerReconnectGracePeriodMs: number;
|
|
67
|
+
/** Engine-level cap for activity results delivered by remote workers. */
|
|
68
|
+
readonly payloadSizeMaxBytes: number | null;
|
|
62
69
|
/**
|
|
63
70
|
* Pending requeue timers keyed by `workerId`. A successful re-register clears
|
|
64
71
|
* the timer for that worker, suppressing the deferred requeue.
|