@temelj/workflow 0.0.0-alpha.3 → 0.0.0-alpha.4
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 +394 -2
- package/dist/attributes.d.mts +11 -9
- package/dist/attributes.mjs +23 -5
- package/dist/bundle.d.mts +5 -23
- package/dist/bundle.mjs +2 -18
- package/dist/client/create.d.mts +26 -23
- package/dist/client/create.mjs +26 -32
- package/dist/client/facades.d.mts +12 -18
- package/dist/client/facades.mjs +102 -93
- package/dist/client/mod.mjs +1 -2
- package/dist/client/run-handle.d.mts +17 -54
- package/dist/client/run-handle.mjs +35 -105
- package/dist/client/worker-options.d.mts +8 -8
- package/dist/client/worker-options.mjs +11 -11
- package/dist/cloudflare/cloudflare.d.mts +4 -5
- package/dist/cloudflare/codec.d.mts +28 -13
- package/dist/cloudflare/codec.mjs +40 -17
- package/dist/cloudflare/entrypoint.d.mts +3 -4
- package/dist/cloudflare/entrypoint.mjs +4 -3
- package/dist/cloudflare/execution.d.mts +3 -4
- package/dist/cloudflare/execution.mjs +20 -13
- package/dist/cloudflare/host.d.mts +6 -7
- package/dist/cloudflare/host.mjs +7 -6
- package/dist/cloudflare/mod.d.mts +4 -4
- package/dist/cloudflare/mod.mjs +2 -2
- package/dist/cloudflare/name.d.mts +3 -4
- package/dist/cloudflare/name.mjs +3 -3
- package/dist/cloudflare/registry.d.mts +3 -23
- package/dist/cloudflare/registry.mjs +2 -20
- package/dist/cloudflare/runtime.d.mts +11 -18
- package/dist/cloudflare/runtime.mjs +52 -73
- package/dist/cloudflare/step.d.mts +6 -6
- package/dist/cloudflare/step.mjs +69 -57
- package/dist/cloudflare/types.d.mts +17 -36
- package/dist/collection.d.mts +8 -11
- package/dist/collection.mjs +10 -14
- package/dist/compiled-function.d.mts +14 -19
- package/dist/compiled-function.mjs +12 -24
- package/dist/compiled.d.mts +4 -0
- package/dist/compiled.mjs +4 -0
- package/dist/compiler/ast.d.mts +26 -0
- package/dist/{vite → compiler}/ast.mjs +24 -16
- package/dist/{vite → compiler}/error.d.mts +4 -6
- package/dist/{vite → compiler}/error.mjs +14 -16
- package/dist/compiler/manifest.d.mts +6 -0
- package/dist/{vite → compiler}/manifest.mjs +9 -7
- package/dist/compiler/plugin.d.mts +7 -0
- package/dist/{vite → compiler}/plugin.mjs +45 -46
- package/dist/compiler/safety.d.mts +12 -0
- package/dist/{vite → compiler}/safety.mjs +5 -11
- package/dist/{vite → compiler}/source-edit.d.mts +3 -4
- package/dist/{vite → compiler}/source-edit.mjs +1 -1
- package/dist/{vite → compiler}/source-map.d.mts +4 -3
- package/dist/{vite → compiler}/source-map.mjs +3 -3
- package/dist/compiler/source.d.mts +7 -0
- package/dist/{vite → compiler}/source.mjs +1 -1
- package/dist/compiler/transform.d.mts +12 -0
- package/dist/{vite → compiler}/transform.mjs +37 -38
- package/dist/definition.d.mts +17 -25
- package/dist/definition.mjs +19 -35
- package/dist/engine/child-workflow.d.mts +5 -9
- package/dist/engine/child-workflow.mjs +46 -67
- package/dist/engine/command-identity.d.mts +5 -6
- package/dist/engine/command-identity.mjs +9 -5
- package/dist/engine/context.d.mts +17 -0
- package/dist/engine/create.d.mts +36 -94
- package/dist/engine/create.mjs +55 -260
- package/dist/engine/deterministic.d.mts +6 -11
- package/dist/engine/deterministic.mjs +47 -68
- package/dist/engine/durable-command.d.mts +5 -5
- package/dist/engine/durable-command.mjs +2 -2
- package/dist/engine/execution-service.d.mts +20 -24
- package/dist/engine/execution-service.mjs +54 -52
- package/dist/engine/hooks.d.mts +17 -39
- package/dist/engine/hooks.mjs +73 -94
- package/dist/engine/inspection.d.mts +23 -15
- package/dist/engine/inspection.mjs +55 -29
- package/dist/engine/lifecycle.d.mts +6 -12
- package/dist/engine/lifecycle.mjs +5 -5
- package/dist/engine/lock-replay.d.mts +8 -15
- package/dist/engine/lock-replay.mjs +12 -25
- package/dist/engine/lock.d.mts +10 -15
- package/dist/engine/lock.mjs +65 -51
- package/dist/engine/message.d.mts +14 -34
- package/dist/engine/message.mjs +94 -127
- package/dist/engine/observation.d.mts +9 -11
- package/dist/engine/observation.mjs +18 -27
- package/dist/engine/replay.d.mts +18 -19
- package/dist/engine/replay.mjs +32 -56
- package/dist/engine/resume.d.mts +16 -0
- package/dist/engine/resume.mjs +24 -0
- package/dist/engine/retry.d.mts +15 -19
- package/dist/engine/retry.mjs +17 -17
- package/dist/engine/run-data.d.mts +4 -8
- package/dist/engine/run-data.mjs +24 -22
- package/dist/engine/run-service.d.mts +24 -33
- package/dist/engine/run-service.mjs +125 -93
- package/dist/engine/run-utils.d.mts +11 -13
- package/dist/engine/run-utils.mjs +23 -46
- package/dist/engine/schedule.d.mts +8 -22
- package/dist/engine/schedule.mjs +37 -34
- package/dist/engine/serialization.d.mts +9 -6
- package/dist/engine/serialization.mjs +30 -21
- package/dist/engine/signals.d.mts +23 -0
- package/dist/engine/signals.mjs +41 -0
- package/dist/engine/start.d.mts +18 -0
- package/dist/engine/start.mjs +88 -0
- package/dist/engine/state.d.mts +37 -67
- package/dist/engine/state.mjs +119 -280
- package/dist/engine/step-api.d.mts +5 -8
- package/dist/engine/step-api.mjs +16 -16
- package/dist/engine/stream-reader.d.mts +12 -0
- package/dist/engine/stream-reader.mjs +154 -0
- package/dist/engine/stream.d.mts +9 -54
- package/dist/engine/stream.mjs +54 -196
- package/dist/engine/summary/recovery.d.mts +35 -0
- package/dist/engine/summary/recovery.mjs +363 -0
- package/dist/engine/summary/runs.d.mts +43 -0
- package/dist/engine/summary/runs.mjs +294 -0
- package/dist/engine/summary/step-attempts.d.mts +5 -10
- package/dist/engine/summary/step-attempts.mjs +157 -36
- package/dist/engine/summary/tally.d.mts +44 -0
- package/dist/engine/summary/tally.mjs +142 -0
- package/dist/engine/task.d.mts +4 -5
- package/dist/engine/task.mjs +40 -48
- package/dist/errors/base.d.mts +17 -77
- package/dist/errors/base.mjs +26 -327
- package/dist/errors/capability.d.mts +3 -6
- package/dist/errors/capability.mjs +4 -8
- package/dist/errors/codes.d.mts +116 -0
- package/dist/{types/error-code.mjs → errors/codes.mjs} +2 -17
- package/dist/errors/definition.d.mts +3 -17
- package/dist/errors/definition.mjs +5 -42
- package/dist/errors/failures.d.mts +17 -51
- package/dist/errors/failures.mjs +35 -102
- package/dist/errors/hook.d.mts +5 -9
- package/dist/errors/hook.mjs +4 -16
- package/dist/errors/implementation.d.mts +3 -6
- package/dist/errors/implementation.mjs +7 -12
- package/dist/errors/lock.d.mts +7 -20
- package/dist/errors/lock.mjs +8 -44
- package/dist/errors/message.d.mts +14 -59
- package/dist/errors/message.mjs +13 -39
- package/dist/errors/mod.d.mts +4 -5
- package/dist/errors/mod.mjs +5 -7
- package/dist/errors/records.d.mts +10 -4
- package/dist/errors/records.mjs +256 -256
- package/dist/errors/run.d.mts +27 -68
- package/dist/errors/run.mjs +31 -85
- package/dist/errors/schedule.d.mts +7 -18
- package/dist/errors/schedule.mjs +7 -39
- package/dist/errors/step.d.mts +12 -45
- package/dist/errors/step.mjs +13 -34
- package/dist/errors/stream.d.mts +8 -16
- package/dist/errors/stream.mjs +7 -41
- package/dist/esbuild.d.mts +6 -4
- package/dist/esbuild.mjs +2 -1
- package/dist/events/descriptors.d.mts +12 -241
- package/dist/events/descriptors.mjs +12 -5
- package/dist/history/projection.d.mts +4 -6
- package/dist/history/projection.mjs +22 -26
- package/dist/history/replay-projection.d.mts +44 -48
- package/dist/history/replay-projection.mjs +41 -50
- package/dist/history/{mod.d.mts → replay.d.mts} +16 -21
- package/dist/history/{mod.mjs → replay.mjs} +21 -25
- package/dist/history/sequencer.d.mts +10 -11
- package/dist/history/sequencer.mjs +11 -7
- package/dist/history/step-attempts.d.mts +4 -7
- package/dist/history/step-attempts.mjs +8 -9
- package/dist/history/timeline.d.mts +4 -13
- package/dist/history/timeline.mjs +46 -265
- package/dist/history/validator.d.mts +5 -7
- package/dist/history/validator.mjs +9 -24
- package/dist/hook-token.d.mts +7 -0
- package/dist/hook-token.mjs +32 -0
- package/dist/ids.d.mts +8 -0
- package/dist/ids.mjs +21 -0
- package/dist/message-options.d.mts +11 -5
- package/dist/message-options.mjs +9 -7
- package/dist/mod.d.mts +32 -36
- package/dist/mod.mjs +9 -13
- package/dist/otel/metrics.d.mts +31 -0
- package/dist/otel/metrics.mjs +60 -0
- package/dist/otel/mod.d.mts +3 -0
- package/dist/otel/mod.mjs +3 -0
- package/dist/otel/spans.d.mts +24 -0
- package/dist/otel/spans.mjs +218 -0
- package/dist/otel/support.d.mts +15 -8
- package/dist/otel/support.mjs +18 -40
- package/dist/{otel.d.mts → otel/telemetry.d.mts} +5 -6
- package/dist/otel/telemetry.mjs +305 -0
- package/dist/pagination.d.mts +6 -12
- package/dist/pagination.mjs +10 -14
- package/dist/registry.d.mts +8 -5
- package/dist/registry.mjs +19 -10
- package/dist/rolldown.d.mts +6 -4
- package/dist/rolldown.mjs +2 -1
- package/dist/rollup.d.mts +6 -4
- package/dist/rollup.mjs +2 -1
- package/dist/rspack.d.mts +6 -4
- package/dist/rspack.mjs +2 -1
- package/dist/run-status.d.mts +29 -0
- package/dist/run-status.mjs +42 -0
- package/dist/schema/common.d.mts +22 -0
- package/dist/schema/common.mjs +54 -0
- package/dist/schema/error.d.mts +17 -0
- package/dist/schema/error.mjs +39 -0
- package/dist/schema/events.d.mts +446 -0
- package/dist/schema/events.mjs +235 -0
- package/dist/schema/pagination.d.mts +5 -0
- package/dist/schema/pagination.mjs +11 -0
- package/dist/schema/persisted-value.d.mts +8 -0
- package/dist/schema/persisted-value.mjs +94 -0
- package/dist/schema/run.d.mts +51 -0
- package/dist/schema/run.mjs +88 -0
- package/dist/schema/store.d.mts +94 -0
- package/dist/schema/store.mjs +116 -0
- package/dist/step-definition.d.mts +4 -9
- package/dist/step-definition.mjs +2 -2
- package/dist/store/capabilities.d.mts +8 -9
- package/dist/store/capabilities.mjs +7 -7
- package/dist/store/cleanup.d.mts +9 -14
- package/dist/store/cleanup.mjs +86 -85
- package/dist/store/create.d.mts +28 -29
- package/dist/store/create.mjs +10 -11
- package/dist/store/events.d.mts +48 -0
- package/dist/store/events.mjs +263 -0
- package/dist/store/indexes.d.mts +25 -0
- package/dist/store/indexes.mjs +282 -0
- package/dist/store/instrumentation.d.mts +2 -3
- package/dist/store/instrumentation.mjs +30 -30
- package/dist/store/lock.d.mts +4 -5
- package/dist/store/lock.mjs +5 -7
- package/dist/store/materialization.d.mts +10 -17
- package/dist/store/materialization.mjs +39 -33
- package/dist/store/mod.d.mts +3 -3
- package/dist/store/mod.mjs +2 -2
- package/dist/store/query.d.mts +13 -17
- package/dist/store/query.mjs +13 -13
- package/dist/store/run.d.mts +25 -34
- package/dist/store/run.mjs +67 -108
- package/dist/store/schedule.d.mts +6 -8
- package/dist/store/schedule.mjs +11 -11
- package/dist/store/step-attempt.d.mts +9 -12
- package/dist/store/step-attempt.mjs +9 -9
- package/dist/store/storage-value.d.mts +3 -3
- package/dist/store/storage-value.mjs +17 -1
- package/dist/store/validation.d.mts +17 -20
- package/dist/store/validation.mjs +30 -33
- package/dist/store-keys.d.mts +35 -47
- package/dist/store-keys.mjs +9 -17
- package/dist/telemetry.d.mts +16 -16
- package/dist/telemetry.mjs +3 -3
- package/dist/temporal.d.mts +11 -16
- package/dist/temporal.mjs +8 -9
- package/dist/timer.d.mts +12 -10
- package/dist/timer.mjs +11 -3
- package/dist/types/cleanup.d.mts +13 -50
- package/dist/types/cleanup.mjs +1 -22
- package/dist/types/client.d.mts +101 -162
- package/dist/types/{vite.d.mts → compiler.d.mts} +17 -24
- package/dist/types/compiler.mjs +1 -0
- package/dist/types/definition.d.mts +22 -34
- package/dist/types/engine-options.d.mts +10 -17
- package/dist/types/engine.d.mts +15 -274
- package/dist/types/error.d.mts +15 -217
- package/dist/types/error.mjs +1 -48
- package/dist/types/events.d.mts +59 -2730
- package/dist/types/events.mjs +1 -283
- package/dist/types/hook.d.mts +27 -85
- package/dist/types/hook.mjs +1 -66
- package/dist/types/ids.d.mts +9 -0
- package/dist/types/ids.mjs +1 -0
- package/dist/types/lock.d.mts +8 -26
- package/dist/types/lock.mjs +1 -18
- package/dist/types/message.d.mts +29 -43
- package/dist/types/observation.d.mts +43 -58
- package/dist/types/pagination.d.mts +6 -22
- package/dist/types/pagination.mjs +1 -13
- package/dist/types/result.d.mts +11 -43
- package/dist/types/retry.d.mts +7 -14
- package/dist/types/run-list.d.mts +9 -11
- package/dist/types/run-options.d.mts +25 -32
- package/dist/types/run.d.mts +35 -315
- package/dist/types/run.mjs +1 -207
- package/dist/types/runtime.d.mts +33 -145
- package/dist/types/runtime.mjs +1 -21
- package/dist/types/schedule.d.mts +13 -72
- package/dist/types/schedule.mjs +1 -48
- package/dist/types/step-attempts.d.mts +65 -261
- package/dist/types/step-attempts.mjs +1 -43
- package/dist/types/step.d.mts +66 -77
- package/dist/types/step.mjs +1 -5
- package/dist/types/store.d.mts +50 -182
- package/dist/types/stream.d.mts +19 -40
- package/dist/types/summary.d.mts +174 -278
- package/dist/types/telemetry.d.mts +23 -28
- package/dist/types/telemetry.mjs +1 -9
- package/dist/types/timeline.d.mts +46 -233
- package/dist/types/worker.d.mts +22 -29
- package/dist/values.d.mts +15 -0
- package/dist/values.mjs +57 -0
- package/dist/vite.d.mts +5 -6
- package/dist/vite.mjs +3 -4
- package/dist/webpack.d.mts +6 -4
- package/dist/webpack.mjs +2 -1
- package/dist/worker/error.d.mts +2 -9
- package/dist/worker/error.mjs +20 -32
- package/dist/worker/missing-implementation.d.mts +19 -0
- package/dist/worker/missing-implementation.mjs +62 -0
- package/dist/worker/worker.d.mts +18 -0
- package/dist/{worker.mjs → worker/worker.mjs} +64 -118
- package/package.json +28 -47
- package/dist/engine/execution-api.d.mts +0 -29
- package/dist/engine/execution-api.mjs +0 -33
- package/dist/engine/inspection-api.d.mts +0 -34
- package/dist/engine/inspection-api.mjs +0 -78
- package/dist/engine/mod.d.mts +0 -4
- package/dist/engine/mod.mjs +0 -2
- package/dist/engine/recovery.d.mts +0 -26
- package/dist/engine/recovery.mjs +0 -92
- package/dist/engine/retry-policy.d.mts +0 -4
- package/dist/engine/retry-policy.mjs +0 -4
- package/dist/engine/start-api.d.mts +0 -30
- package/dist/engine/start-api.mjs +0 -99
- package/dist/engine/summary/active-events.d.mts +0 -34
- package/dist/engine/summary/active-events.mjs +0 -69
- package/dist/engine/summary/child-workflow-runs.d.mts +0 -24
- package/dist/engine/summary/child-workflow-runs.mjs +0 -138
- package/dist/engine/summary/child-workflow-waits.d.mts +0 -21
- package/dist/engine/summary/child-workflow-waits.mjs +0 -67
- package/dist/engine/summary/recovery-child-workflow-waits.d.mts +0 -11
- package/dist/engine/summary/recovery-child-workflow-waits.mjs +0 -89
- package/dist/engine/summary/recovery-due-runs.d.mts +0 -16
- package/dist/engine/summary/recovery-due-runs.mjs +0 -52
- package/dist/engine/summary/recovery-failed-runs.d.mts +0 -14
- package/dist/engine/summary/recovery-failed-runs.mjs +0 -33
- package/dist/engine/summary/recovery-lease-runs.d.mts +0 -16
- package/dist/engine/summary/recovery-lease-runs.mjs +0 -69
- package/dist/engine/summary/recovery-locks.d.mts +0 -18
- package/dist/engine/summary/recovery-locks.mjs +0 -100
- package/dist/engine/summary/recovery-message-waits.d.mts +0 -11
- package/dist/engine/summary/recovery-message-waits.mjs +0 -74
- package/dist/engine/summary/recovery-retry-runs.d.mts +0 -17
- package/dist/engine/summary/recovery-retry-runs.mjs +0 -65
- package/dist/engine/summary/recovery-run-timestamps.d.mts +0 -13
- package/dist/engine/summary/recovery-run-timestamps.mjs +0 -18
- package/dist/engine/summary/recovery-runs.d.mts +0 -23
- package/dist/engine/summary/recovery-runs.mjs +0 -54
- package/dist/engine/summary/recovery-schedules.d.mts +0 -10
- package/dist/engine/summary/recovery-schedules.mjs +0 -46
- package/dist/engine/summary/recovery-sleep-waits.d.mts +0 -10
- package/dist/engine/summary/recovery-sleep-waits.mjs +0 -53
- package/dist/engine/summary/recovery-waits.d.mts +0 -21
- package/dist/engine/summary/recovery-waits.mjs +0 -29
- package/dist/engine/summary/run-availability.d.mts +0 -13
- package/dist/engine/summary/run-availability.mjs +0 -37
- package/dist/engine/summary/run-cleanup.d.mts +0 -14
- package/dist/engine/summary/run-cleanup.mjs +0 -44
- package/dist/engine/summary/run-failure.d.mts +0 -14
- package/dist/engine/summary/run-failure.mjs +0 -62
- package/dist/engine/summary/run-hooks.d.mts +0 -14
- package/dist/engine/summary/run-hooks.mjs +0 -63
- package/dist/engine/summary/run-lease.d.mts +0 -11
- package/dist/engine/summary/run-lease.mjs +0 -64
- package/dist/engine/summary/run-message-waits.d.mts +0 -15
- package/dist/engine/summary/run-message-waits.mjs +0 -62
- package/dist/engine/summary/run-metrics.d.mts +0 -31
- package/dist/engine/summary/run-metrics.mjs +0 -93
- package/dist/engine/summary/run-retry.d.mts +0 -9
- package/dist/engine/summary/run-retry.mjs +0 -69
- package/dist/engine/summary/run-sleeps.d.mts +0 -15
- package/dist/engine/summary/run-sleeps.mjs +0 -61
- package/dist/engine/summary/run-state.d.mts +0 -26
- package/dist/engine/summary/run-state.mjs +0 -48
- package/dist/engine/summary/run-status.d.mts +0 -16
- package/dist/engine/summary/run-status.mjs +0 -35
- package/dist/engine/summary/run-streams.d.mts +0 -14
- package/dist/engine/summary/run-streams.mjs +0 -46
- package/dist/engine/summary/run-transition.d.mts +0 -9
- package/dist/engine/summary/run-transition.mjs +0 -39
- package/dist/engine/summary/run-workflow.d.mts +0 -9
- package/dist/engine/summary/run-workflow.mjs +0 -47
- package/dist/engine/summary/step-attempt-active-child-workflows.d.mts +0 -13
- package/dist/engine/summary/step-attempt-active-child-workflows.mjs +0 -55
- package/dist/engine/summary/step-attempt-active-fields.d.mts +0 -23
- package/dist/engine/summary/step-attempt-active-fields.mjs +0 -14
- package/dist/engine/summary/step-attempt-active-message-waits.d.mts +0 -12
- package/dist/engine/summary/step-attempt-active-message-waits.mjs +0 -47
- package/dist/engine/summary/step-attempt-active-sleeps.d.mts +0 -19
- package/dist/engine/summary/step-attempt-active-sleeps.mjs +0 -44
- package/dist/engine/summary/step-attempt-buckets.d.mts +0 -22
- package/dist/engine/summary/step-attempt-buckets.mjs +0 -152
- package/dist/engine/summary/step-attempt-failure.d.mts +0 -12
- package/dist/engine/summary/step-attempt-failure.mjs +0 -61
- package/dist/engine/summary/step-attempt-lifecycle.d.mts +0 -13
- package/dist/engine/summary/step-attempt-lifecycle.mjs +0 -19
- package/dist/engine/summary.d.mts +0 -32
- package/dist/engine/summary.mjs +0 -37
- package/dist/errors/details.d.mts +0 -13
- package/dist/errors/details.mjs +0 -66
- package/dist/errors/record-view.d.mts +0 -11
- package/dist/errors/record-view.mjs +0 -24
- package/dist/errors/runtime.d.mts +0 -12
- package/dist/errors/runtime.mjs +0 -24
- package/dist/events/mod.d.mts +0 -3
- package/dist/events/mod.mjs +0 -2
- package/dist/history/attempt-key.d.mts +0 -6
- package/dist/history/attempt-key.mjs +0 -7
- package/dist/inspection/mod.d.mts +0 -5
- package/dist/inspection/mod.mjs +0 -3
- package/dist/otel.mjs +0 -590
- package/dist/runtime.d.mts +0 -35
- package/dist/runtime.mjs +0 -198
- package/dist/store/append-projection.d.mts +0 -15
- package/dist/store/append-projection.mjs +0 -26
- package/dist/store/compaction.d.mts +0 -5
- package/dist/store/compaction.mjs +0 -8
- package/dist/store/event-append-project.d.mts +0 -15
- package/dist/store/event-append-project.mjs +0 -77
- package/dist/store/event-append.d.mts +0 -37
- package/dist/store/event-append.mjs +0 -80
- package/dist/store/event-history.d.mts +0 -22
- package/dist/store/event-history.mjs +0 -75
- package/dist/store/event.d.mts +0 -10
- package/dist/store/event.mjs +0 -28
- package/dist/store/idempotency.d.mts +0 -10
- package/dist/store/idempotency.mjs +0 -167
- package/dist/store/message-index.d.mts +0 -21
- package/dist/store/message-index.mjs +0 -122
- package/dist/store/revision.d.mts +0 -4
- package/dist/store/revision.mjs +0 -7
- package/dist/store/schema.d.mts +0 -14
- package/dist/store/schema.mjs +0 -17
- package/dist/types/common.d.mts +0 -20
- package/dist/types/common.mjs +0 -16
- package/dist/types/error-code.d.mts +0 -256
- package/dist/types/message-id.d.mts +0 -7
- package/dist/types/message-id.mjs +0 -5
- package/dist/types/run-id.d.mts +0 -7
- package/dist/types/run-id.mjs +0 -5
- package/dist/types/step-id.d.mts +0 -7
- package/dist/types/step-id.mjs +0 -5
- package/dist/types/stream-id.d.mts +0 -7
- package/dist/types/stream-id.mjs +0 -5
- package/dist/types/worker-id.d.mts +0 -7
- package/dist/types/worker-id.mjs +0 -5
- package/dist/utility.d.mts +0 -49
- package/dist/utility.mjs +0 -122
- package/dist/vite/ast.d.mts +0 -23
- package/dist/vite/generated-name.d.mts +0 -7
- package/dist/vite/generated-name.mjs +0 -9
- package/dist/vite/manifest.d.mts +0 -7
- package/dist/vite/plugin.d.mts +0 -7
- package/dist/vite/safety.d.mts +0 -12
- package/dist/vite/source.d.mts +0 -7
- package/dist/vite/transform.d.mts +0 -7
- package/dist/webhook.d.mts +0 -16
- package/dist/webhook.mjs +0 -17
- package/dist/worker.d.mts +0 -19
- /package/dist/{types/vite.mjs → engine/context.mjs} +0 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import { earliestOptionalTimestamp, latestOptionalTimestamp } from "../../temporal.mjs";
|
|
2
|
+
import { WorkflowErrorCode } from "../../errors/codes.mjs";
|
|
3
|
+
import { matchesWorkflowError } from "../../errors/records.mjs";
|
|
4
|
+
import "../../errors/mod.mjs";
|
|
5
|
+
import { History } from "../../history/replay.mjs";
|
|
6
|
+
import { isScheduledRunStatus } from "../../run-status.mjs";
|
|
7
|
+
import { Earliest, sorted } from "./tally.mjs";
|
|
8
|
+
import { isString } from "@temelj/value";
|
|
9
|
+
//#region src/engine/summary/recovery.ts
|
|
10
|
+
/**
|
|
11
|
+
* Every run that can make progress now, and when the next sleep, retry, lease, schedule,
|
|
12
|
+
* lock wait, or external wait should be checked again.
|
|
13
|
+
*/
|
|
14
|
+
function summarizeRecovery(options) {
|
|
15
|
+
const { runs, now, inputs = {} } = options;
|
|
16
|
+
const due = new RunSet();
|
|
17
|
+
const pending = /* @__PURE__ */ new Set();
|
|
18
|
+
const waiting = /* @__PURE__ */ new Set();
|
|
19
|
+
const lease = new LeaseTally(now);
|
|
20
|
+
const retry = new RunSet();
|
|
21
|
+
const missingImplementation = new RunSet();
|
|
22
|
+
const failed = /* @__PURE__ */ new Set();
|
|
23
|
+
let latestFailedAt;
|
|
24
|
+
for (const run of runs) {
|
|
25
|
+
if (isScheduledRunStatus(run.status)) {
|
|
26
|
+
if (isDueAt(run.availableAt, now)) {
|
|
27
|
+
due.add(run.id, true);
|
|
28
|
+
(run.status === "pending" ? pending : waiting).add(run.id);
|
|
29
|
+
} else due.next.offer(run.availableAt, { runId: run.id });
|
|
30
|
+
if (run.retryReason !== void 0) {
|
|
31
|
+
const retryDue = isDueAt(run.retryAt, now);
|
|
32
|
+
retry.add(run.id, retryDue, run.retryAt);
|
|
33
|
+
if (run.retryReason === "missing_implementation") missingImplementation.add(run.id, retryDue, run.retryAt);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
lease.add(run);
|
|
37
|
+
if (run.status === "failed") {
|
|
38
|
+
failed.add(run.id);
|
|
39
|
+
latestFailedAt = latestOptionalTimestamp(latestFailedAt, run.finishedAt);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const sleep = summarizeSleepWaits(inputs.sleepAttempts ?? [], now);
|
|
43
|
+
const message = summarizeMessageWaits(inputs.messageWaitAttempts ?? [], inputs.eventsByRunId ?? /* @__PURE__ */ new Map(), now);
|
|
44
|
+
const childWorkflow = summarizeChildWorkflowWaits(inputs.childWorkflowAttempts ?? [], inputs.childRuns ?? [], now);
|
|
45
|
+
const lock = summarizeLocks(inputs.locks ?? [], inputs.lockWaitAttempts ?? [], runs, now);
|
|
46
|
+
const schedule = summarizeSchedules(inputs.schedules ?? [], now);
|
|
47
|
+
const next = new Earliest();
|
|
48
|
+
for (const candidate of [
|
|
49
|
+
due.next.next,
|
|
50
|
+
lease.next.next,
|
|
51
|
+
retry.next.next,
|
|
52
|
+
schedule.next,
|
|
53
|
+
lock.nextExpiry,
|
|
54
|
+
lock.nextWaitDeadline,
|
|
55
|
+
sleep.next,
|
|
56
|
+
message.next,
|
|
57
|
+
childWorkflow.next
|
|
58
|
+
]) next.offer(candidate?.at, {});
|
|
59
|
+
return {
|
|
60
|
+
total: runs.length,
|
|
61
|
+
recoverableRunIds: sorted(/* @__PURE__ */ new Set([
|
|
62
|
+
...due.dueIds,
|
|
63
|
+
...lease.staleRunIds,
|
|
64
|
+
...retry.dueIds,
|
|
65
|
+
...failed,
|
|
66
|
+
...sleep.dueRunIds,
|
|
67
|
+
...message.readyRunIds,
|
|
68
|
+
...message.timedOutRunIds,
|
|
69
|
+
...childWorkflow.terminalRunIds,
|
|
70
|
+
...childWorkflow.missingRunIds,
|
|
71
|
+
...childWorkflow.timedOutRunIds
|
|
72
|
+
])),
|
|
73
|
+
due: {
|
|
74
|
+
runIds: sorted(due.dueIds),
|
|
75
|
+
pendingRunIds: sorted(pending),
|
|
76
|
+
waitingRunIds: sorted(waiting),
|
|
77
|
+
next: due.next.next
|
|
78
|
+
},
|
|
79
|
+
lease: lease.finish(),
|
|
80
|
+
retry: retry.finish(),
|
|
81
|
+
missingImplementation: missingImplementation.finish(),
|
|
82
|
+
failed: {
|
|
83
|
+
runIds: sorted(failed),
|
|
84
|
+
latestFailedAt
|
|
85
|
+
},
|
|
86
|
+
schedule,
|
|
87
|
+
lock,
|
|
88
|
+
wait: {
|
|
89
|
+
sleep,
|
|
90
|
+
message,
|
|
91
|
+
childWorkflow
|
|
92
|
+
},
|
|
93
|
+
nextRecoveryAt: next.at
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/** The lock a failed step attempt was waiting for, when it failed because the lock was held. */
|
|
97
|
+
function lockWaitDetails(attempt) {
|
|
98
|
+
const error = attempt.error;
|
|
99
|
+
if (attempt.status !== "failed" || attempt.kind !== "run" || error === void 0 || !matchesWorkflowError(error, WorkflowErrorCode.LOCK_ALREADY_HELD) || !isString(error.details?.key) || error.details.key.trim() === "") return;
|
|
100
|
+
const deadline = error.details.waitDeadlineAt;
|
|
101
|
+
return {
|
|
102
|
+
key: error.details.key,
|
|
103
|
+
waitDeadlineAt: isString(deadline) && deadline.trim() !== "" ? parseInstant(deadline) : void 0
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function parseInstant(value) {
|
|
107
|
+
try {
|
|
108
|
+
return Temporal.Instant.from(value);
|
|
109
|
+
} catch {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function isDueAt(at, now) {
|
|
114
|
+
return at === void 0 || Temporal.Instant.compare(at, now) <= 0;
|
|
115
|
+
}
|
|
116
|
+
/** Runs of one kind, those that are due, and the earliest that is not yet due. */
|
|
117
|
+
var RunSet = class {
|
|
118
|
+
ids = /* @__PURE__ */ new Set();
|
|
119
|
+
dueIds = /* @__PURE__ */ new Set();
|
|
120
|
+
next = new Earliest();
|
|
121
|
+
add(id, due, at) {
|
|
122
|
+
this.ids.add(id);
|
|
123
|
+
if (due) this.dueIds.add(id);
|
|
124
|
+
else this.next.offer(at, { runId: id });
|
|
125
|
+
}
|
|
126
|
+
finish() {
|
|
127
|
+
return {
|
|
128
|
+
runIds: sorted(this.ids),
|
|
129
|
+
dueRunIds: sorted(this.dueIds),
|
|
130
|
+
next: this.next.next
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
var LeaseTally = class {
|
|
135
|
+
#now;
|
|
136
|
+
runIds = /* @__PURE__ */ new Set();
|
|
137
|
+
staleRunIds = /* @__PURE__ */ new Set();
|
|
138
|
+
#ownerless = /* @__PURE__ */ new Set();
|
|
139
|
+
#missingExpiresAt = /* @__PURE__ */ new Set();
|
|
140
|
+
#expired = /* @__PURE__ */ new Set();
|
|
141
|
+
#workerIds = /* @__PURE__ */ new Set();
|
|
142
|
+
next = new Earliest();
|
|
143
|
+
#oldestStaleAt;
|
|
144
|
+
constructor(now) {
|
|
145
|
+
this.#now = now;
|
|
146
|
+
}
|
|
147
|
+
add(run) {
|
|
148
|
+
if (run.status !== "running") return;
|
|
149
|
+
this.runIds.add(run.id);
|
|
150
|
+
if (run.workerId === void 0) {
|
|
151
|
+
this.staleRunIds.add(run.id);
|
|
152
|
+
this.#ownerless.add(run.id);
|
|
153
|
+
} else this.#workerIds.add(run.workerId);
|
|
154
|
+
if (run.leaseExpiresAt === void 0) {
|
|
155
|
+
this.staleRunIds.add(run.id);
|
|
156
|
+
this.#missingExpiresAt.add(run.id);
|
|
157
|
+
} else if (Temporal.Instant.compare(run.leaseExpiresAt, this.#now) <= 0) {
|
|
158
|
+
this.staleRunIds.add(run.id);
|
|
159
|
+
this.#expired.add(run.id);
|
|
160
|
+
this.#oldestStaleAt = earliestOptionalTimestamp(this.#oldestStaleAt, run.leaseExpiresAt);
|
|
161
|
+
} else if (run.workerId !== void 0) this.next.offer(run.leaseExpiresAt, { runId: run.id });
|
|
162
|
+
}
|
|
163
|
+
finish() {
|
|
164
|
+
return {
|
|
165
|
+
runIds: sorted(this.runIds),
|
|
166
|
+
staleRunIds: sorted(this.staleRunIds),
|
|
167
|
+
ownerlessRunIds: sorted(this.#ownerless),
|
|
168
|
+
missingExpiresAtRunIds: sorted(this.#missingExpiresAt),
|
|
169
|
+
expiredRunIds: sorted(this.#expired),
|
|
170
|
+
workerIds: sorted(this.#workerIds),
|
|
171
|
+
next: this.next.next,
|
|
172
|
+
oldestStaleAt: this.#oldestStaleAt
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
function summarizeSleepWaits(attempts, now) {
|
|
177
|
+
const runIds = /* @__PURE__ */ new Set();
|
|
178
|
+
const dueRunIds = /* @__PURE__ */ new Set();
|
|
179
|
+
const dueStepIds = /* @__PURE__ */ new Set();
|
|
180
|
+
const invalidUntilRunIds = /* @__PURE__ */ new Set();
|
|
181
|
+
const next = new Earliest();
|
|
182
|
+
for (const attempt of attempts) {
|
|
183
|
+
if (attempt.status !== "running" || attempt.kind !== "sleep") continue;
|
|
184
|
+
runIds.add(attempt.runId);
|
|
185
|
+
if (attempt.until === void 0) invalidUntilRunIds.add(attempt.runId);
|
|
186
|
+
if (isDueAt(attempt.until, now)) {
|
|
187
|
+
dueRunIds.add(attempt.runId);
|
|
188
|
+
dueStepIds.add(attempt.stepId);
|
|
189
|
+
} else next.offer(attempt.until, { runId: attempt.runId });
|
|
190
|
+
}
|
|
191
|
+
return {
|
|
192
|
+
runIds: sorted(runIds),
|
|
193
|
+
dueRunIds: sorted(dueRunIds),
|
|
194
|
+
dueStepIds: sorted(dueStepIds),
|
|
195
|
+
invalidUntilRunIds: sorted(invalidUntilRunIds),
|
|
196
|
+
next: next.next
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
function summarizeMessageWaits(attempts, eventsByRunId, now) {
|
|
200
|
+
const histories = /* @__PURE__ */ new Map();
|
|
201
|
+
const runIds = /* @__PURE__ */ new Set();
|
|
202
|
+
const readyRunIds = /* @__PURE__ */ new Set();
|
|
203
|
+
const readyStepIds = /* @__PURE__ */ new Set();
|
|
204
|
+
const timedOutRunIds = /* @__PURE__ */ new Set();
|
|
205
|
+
const timedOutStepIds = /* @__PURE__ */ new Set();
|
|
206
|
+
const messages = /* @__PURE__ */ new Set();
|
|
207
|
+
const next = new Earliest();
|
|
208
|
+
for (const attempt of attempts) {
|
|
209
|
+
if (attempt.status !== "running" || attempt.kind !== "message-wait") continue;
|
|
210
|
+
runIds.add(attempt.runId);
|
|
211
|
+
if (attempt.messageId !== void 0) {
|
|
212
|
+
messages.add(attempt.messageId);
|
|
213
|
+
const events = eventsByRunId.get(attempt.runId);
|
|
214
|
+
if (events !== void 0) {
|
|
215
|
+
let history = histories.get(attempt.runId);
|
|
216
|
+
if (history === void 0) {
|
|
217
|
+
history = new History(events);
|
|
218
|
+
histories.set(attempt.runId, history);
|
|
219
|
+
}
|
|
220
|
+
if (history.messageForWait(attempt.messageId, attempt.stepId, attempt.timeoutAt)) {
|
|
221
|
+
readyRunIds.add(attempt.runId);
|
|
222
|
+
readyStepIds.add(attempt.stepId);
|
|
223
|
+
continue;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (attempt.timeoutAt === void 0) continue;
|
|
228
|
+
if (Temporal.Instant.compare(attempt.timeoutAt, now) <= 0) {
|
|
229
|
+
timedOutRunIds.add(attempt.runId);
|
|
230
|
+
timedOutStepIds.add(attempt.stepId);
|
|
231
|
+
} else next.offer(attempt.timeoutAt, { runId: attempt.runId });
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
runIds: sorted(runIds),
|
|
235
|
+
readyRunIds: sorted(readyRunIds),
|
|
236
|
+
timedOutRunIds: sorted(timedOutRunIds),
|
|
237
|
+
readyStepIds: sorted(readyStepIds),
|
|
238
|
+
timedOutStepIds: sorted(timedOutStepIds),
|
|
239
|
+
messages: sorted(messages),
|
|
240
|
+
next: next.next
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
function summarizeChildWorkflowWaits(attempts, childRuns, now) {
|
|
244
|
+
const childById = new Map(childRuns.map((run) => [run.id, run]));
|
|
245
|
+
const runIds = /* @__PURE__ */ new Set();
|
|
246
|
+
const terminal = {
|
|
247
|
+
runIds: /* @__PURE__ */ new Set(),
|
|
248
|
+
stepIds: /* @__PURE__ */ new Set()
|
|
249
|
+
};
|
|
250
|
+
const missing = {
|
|
251
|
+
runIds: /* @__PURE__ */ new Set(),
|
|
252
|
+
stepIds: /* @__PURE__ */ new Set()
|
|
253
|
+
};
|
|
254
|
+
const timedOut = {
|
|
255
|
+
runIds: /* @__PURE__ */ new Set(),
|
|
256
|
+
stepIds: /* @__PURE__ */ new Set()
|
|
257
|
+
};
|
|
258
|
+
const childRunIds = /* @__PURE__ */ new Set();
|
|
259
|
+
const completed = /* @__PURE__ */ new Set();
|
|
260
|
+
const failed = /* @__PURE__ */ new Set();
|
|
261
|
+
const canceled = /* @__PURE__ */ new Set();
|
|
262
|
+
const next = new Earliest();
|
|
263
|
+
for (const attempt of attempts) {
|
|
264
|
+
if (attempt.status !== "running" || attempt.kind !== "workflow") continue;
|
|
265
|
+
runIds.add(attempt.runId);
|
|
266
|
+
if (attempt.childRunId !== void 0) childRunIds.add(attempt.childRunId);
|
|
267
|
+
const child = attempt.childRunId === void 0 ? void 0 : childById.get(attempt.childRunId);
|
|
268
|
+
if (child === void 0) {
|
|
269
|
+
missing.runIds.add(attempt.runId);
|
|
270
|
+
missing.stepIds.add(attempt.stepId);
|
|
271
|
+
continue;
|
|
272
|
+
}
|
|
273
|
+
if (child.status === "completed" || child.status === "failed" || child.status === "canceled") {
|
|
274
|
+
terminal.runIds.add(attempt.runId);
|
|
275
|
+
terminal.stepIds.add(attempt.stepId);
|
|
276
|
+
if (child.status === "completed") completed.add(child.id);
|
|
277
|
+
else if (child.status === "failed") failed.add(child.id);
|
|
278
|
+
else canceled.add(child.id);
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
if (attempt.timeoutAt === void 0) continue;
|
|
282
|
+
if (Temporal.Instant.compare(attempt.timeoutAt, now) <= 0) {
|
|
283
|
+
timedOut.runIds.add(attempt.runId);
|
|
284
|
+
timedOut.stepIds.add(attempt.stepId);
|
|
285
|
+
} else next.offer(attempt.timeoutAt, { runId: attempt.runId });
|
|
286
|
+
}
|
|
287
|
+
return {
|
|
288
|
+
runIds: sorted(runIds),
|
|
289
|
+
terminalRunIds: sorted(terminal.runIds),
|
|
290
|
+
missingRunIds: sorted(missing.runIds),
|
|
291
|
+
timedOutRunIds: sorted(timedOut.runIds),
|
|
292
|
+
terminalStepIds: sorted(terminal.stepIds),
|
|
293
|
+
missingStepIds: sorted(missing.stepIds),
|
|
294
|
+
timedOutStepIds: sorted(timedOut.stepIds),
|
|
295
|
+
childRunIds: sorted(childRunIds),
|
|
296
|
+
completedChildRunIds: sorted(completed),
|
|
297
|
+
failedChildRunIds: sorted(failed),
|
|
298
|
+
canceledChildRunIds: sorted(canceled),
|
|
299
|
+
next: next.next
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
function summarizeLocks(locks, waitAttempts, runs, now) {
|
|
303
|
+
const keys = /* @__PURE__ */ new Set();
|
|
304
|
+
const staleKeys = /* @__PURE__ */ new Set();
|
|
305
|
+
const holderIds = /* @__PURE__ */ new Set();
|
|
306
|
+
const nextExpiry = new Earliest();
|
|
307
|
+
let oldestStaleAt;
|
|
308
|
+
for (const lock of locks) {
|
|
309
|
+
if (lock.releasedAt !== void 0) continue;
|
|
310
|
+
keys.add(lock.key);
|
|
311
|
+
if (lock.holderId !== void 0) holderIds.add(lock.holderId);
|
|
312
|
+
if (Temporal.Instant.compare(lock.leaseExpiresAt, now) <= 0) {
|
|
313
|
+
staleKeys.add(lock.key);
|
|
314
|
+
oldestStaleAt = earliestOptionalTimestamp(oldestStaleAt, lock.leaseExpiresAt);
|
|
315
|
+
} else nextExpiry.offer(lock.leaseExpiresAt, { key: lock.key });
|
|
316
|
+
}
|
|
317
|
+
const runById = new Map(runs.map((run) => [run.id, run]));
|
|
318
|
+
const waitingRunIds = /* @__PURE__ */ new Set();
|
|
319
|
+
const dueWaitingRunIds = /* @__PURE__ */ new Set();
|
|
320
|
+
const waitingStepIds = /* @__PURE__ */ new Set();
|
|
321
|
+
const waitingKeys = /* @__PURE__ */ new Set();
|
|
322
|
+
const nextWaitDeadline = new Earliest();
|
|
323
|
+
for (const attempt of waitAttempts) {
|
|
324
|
+
const details = lockWaitDetails(attempt);
|
|
325
|
+
const run = runById.get(attempt.runId);
|
|
326
|
+
if (details === void 0 || run === void 0 || run.status !== "waiting" || run.retryReason !== "step") continue;
|
|
327
|
+
waitingRunIds.add(attempt.runId);
|
|
328
|
+
waitingStepIds.add(attempt.stepId);
|
|
329
|
+
waitingKeys.add(details.key);
|
|
330
|
+
if (isDueAt(run.retryAt, now)) dueWaitingRunIds.add(attempt.runId);
|
|
331
|
+
if (details.waitDeadlineAt !== void 0 && Temporal.Instant.compare(details.waitDeadlineAt, now) > 0) nextWaitDeadline.offer(details.waitDeadlineAt, { runId: attempt.runId });
|
|
332
|
+
}
|
|
333
|
+
return {
|
|
334
|
+
keys: sorted(keys),
|
|
335
|
+
staleKeys: sorted(staleKeys),
|
|
336
|
+
holderIds: sorted(holderIds),
|
|
337
|
+
waitingRunIds: sorted(waitingRunIds),
|
|
338
|
+
dueWaitingRunIds: sorted(dueWaitingRunIds),
|
|
339
|
+
waitingStepIds: sorted(waitingStepIds),
|
|
340
|
+
waitingKeys: sorted(waitingKeys),
|
|
341
|
+
oldestStaleAt,
|
|
342
|
+
nextExpiry: nextExpiry.next,
|
|
343
|
+
nextWaitDeadline: nextWaitDeadline.next
|
|
344
|
+
};
|
|
345
|
+
}
|
|
346
|
+
function summarizeSchedules(schedules, now) {
|
|
347
|
+
const ids = /* @__PURE__ */ new Set();
|
|
348
|
+
const dueIds = /* @__PURE__ */ new Set();
|
|
349
|
+
const next = new Earliest();
|
|
350
|
+
for (const schedule of schedules) {
|
|
351
|
+
if (schedule.status !== "active") continue;
|
|
352
|
+
ids.add(schedule.id);
|
|
353
|
+
if (Temporal.Instant.compare(schedule.nextFireAt, now) <= 0) dueIds.add(schedule.id);
|
|
354
|
+
next.offer(schedule.nextFireAt, { scheduleId: schedule.id });
|
|
355
|
+
}
|
|
356
|
+
return {
|
|
357
|
+
scheduleIds: sorted(ids),
|
|
358
|
+
dueScheduleIds: sorted(dueIds),
|
|
359
|
+
next: next.next
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
//#endregion
|
|
363
|
+
export { lockWaitDetails, summarizeRecovery };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { RunId } from "../../types/ids.mjs";
|
|
2
|
+
import { RunFailureSummary, RunRetrySummary, RunSummary } from "../../types/summary.mjs";
|
|
3
|
+
import { StepAttemptRecord } from "../../types/step-attempts.mjs";
|
|
4
|
+
import { RunRecord, RunStatus } from "../../types/run.mjs";
|
|
5
|
+
import { EventRecord } from "../../types/events.mjs";
|
|
6
|
+
import { WorkflowStore } from "../../types/store.mjs";
|
|
7
|
+
//#region src/engine/summary/runs.d.ts
|
|
8
|
+
export interface RunAttemptsInput {
|
|
9
|
+
readonly runId: RunId;
|
|
10
|
+
readonly attempts: readonly StepAttemptRecord[];
|
|
11
|
+
}
|
|
12
|
+
export interface RunChildWorkflowWaitInput extends RunAttemptsInput {
|
|
13
|
+
readonly childRuns: readonly RunRecord[];
|
|
14
|
+
}
|
|
15
|
+
export interface RunEventActivityInput {
|
|
16
|
+
readonly runId: RunId;
|
|
17
|
+
readonly events: readonly EventRecord[];
|
|
18
|
+
}
|
|
19
|
+
export interface RunSummaryInputs {
|
|
20
|
+
readonly runs: readonly RunRecord[];
|
|
21
|
+
readonly now: Temporal.Instant;
|
|
22
|
+
readonly cleanupCutoff?: Temporal.Instant;
|
|
23
|
+
readonly runningChildWorkflows?: readonly RunChildWorkflowWaitInput[];
|
|
24
|
+
readonly runningSleeps?: readonly RunAttemptsInput[];
|
|
25
|
+
readonly runningMessageWaits?: readonly RunAttemptsInput[];
|
|
26
|
+
readonly runningEvents?: readonly RunEventActivityInput[];
|
|
27
|
+
}
|
|
28
|
+
/** Summarizes run records and their active waits for inspection dashboards. */
|
|
29
|
+
export declare function summarizeRuns(inputs: RunSummaryInputs): RunSummary;
|
|
30
|
+
/** Child runs that belong to the given child-workflow step attempts of a parent run. */
|
|
31
|
+
export declare function getChildRunsForAttempts(store: WorkflowStore, parentRunId: RunId, attempts: readonly StepAttemptRecord[]): Promise<readonly RunRecord[]>;
|
|
32
|
+
interface ChildRunsSummary {
|
|
33
|
+
readonly childStatus: Record<RunStatus, number>;
|
|
34
|
+
readonly retryChildRunIds?: readonly string[];
|
|
35
|
+
readonly failedChildRunIds?: readonly string[];
|
|
36
|
+
readonly canceledChildRunIds?: readonly string[];
|
|
37
|
+
readonly childRetry?: RunRetrySummary;
|
|
38
|
+
readonly childFailure?: RunFailureSummary;
|
|
39
|
+
}
|
|
40
|
+
/** The state of the child runs that active child-workflow waits point at. */
|
|
41
|
+
export declare function summarizeChildRuns(runs: readonly RunRecord[]): ChildRunsSummary;
|
|
42
|
+
//#endregion
|
|
43
|
+
export {};
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import { earliestOptionalTimestamp, latestOptionalTimestamp } from "../../temporal.mjs";
|
|
2
|
+
import { runStepAttemptKey } from "../../store-keys.mjs";
|
|
3
|
+
import { isRunStatus, isScheduledRunStatus } from "../../run-status.mjs";
|
|
4
|
+
import { Earliest, FailureTally, RUN_STATUSES, RUN_TRANSITION_REASONS, RetryTally, TERMINAL_RUN_STATUSES, WaitTally, counts, sorted, sortedOrUndefined } from "./tally.mjs";
|
|
5
|
+
//#region src/engine/summary/runs.ts
|
|
6
|
+
/** Summarizes run records and their active waits for inspection dashboards. */
|
|
7
|
+
function summarizeRuns(inputs) {
|
|
8
|
+
const states = new RunStateTally(inputs.now, inputs.cleanupCutoff);
|
|
9
|
+
for (const run of inputs.runs) states.add(run);
|
|
10
|
+
const streams = new WaitTally();
|
|
11
|
+
const streamNames = /* @__PURE__ */ new Set();
|
|
12
|
+
let chunkCount = 0;
|
|
13
|
+
const hooks = new WaitTally();
|
|
14
|
+
const hookNames = /* @__PURE__ */ new Set();
|
|
15
|
+
const webhookNames = /* @__PURE__ */ new Set();
|
|
16
|
+
const hookMessages = /* @__PURE__ */ new Set();
|
|
17
|
+
let webhooks = 0;
|
|
18
|
+
for (const { runId, events } of inputs.runningEvents ?? []) {
|
|
19
|
+
const active = activeEvents(events);
|
|
20
|
+
for (const stream of active.streams) {
|
|
21
|
+
streams.add(stream.stepId, void 0, stream.startedAt);
|
|
22
|
+
streamNames.add(stream.stepName);
|
|
23
|
+
chunkCount += stream.chunkCount;
|
|
24
|
+
}
|
|
25
|
+
for (const hook of active.hooks) {
|
|
26
|
+
hooks.add(hook.stepId, void 0, hook.startedAt);
|
|
27
|
+
hooks.next.offer(hook.timeoutAt, {
|
|
28
|
+
runId,
|
|
29
|
+
stepId: hook.stepId
|
|
30
|
+
});
|
|
31
|
+
hookMessages.add(hook.messageId);
|
|
32
|
+
if (hook.source === "hook") hookNames.add(hook.name);
|
|
33
|
+
else {
|
|
34
|
+
webhooks++;
|
|
35
|
+
webhookNames.add(hook.name);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const sleeps = new WaitTally();
|
|
40
|
+
for (const { runId, attempts } of inputs.runningSleeps ?? []) for (const attempt of attempts) {
|
|
41
|
+
sleeps.add(attempt.stepId, void 0, attempt.startedAt);
|
|
42
|
+
sleeps.next.offer(attempt.until, {
|
|
43
|
+
runId,
|
|
44
|
+
stepId: attempt.stepId,
|
|
45
|
+
attemptKey: runStepAttemptKey(runId, attempt),
|
|
46
|
+
duration: attempt.duration instanceof Temporal.Duration ? attempt.duration : void 0
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
const messageWaits = new WaitTally();
|
|
50
|
+
const messages = /* @__PURE__ */ new Set();
|
|
51
|
+
for (const { runId, attempts } of inputs.runningMessageWaits ?? []) for (const attempt of attempts) {
|
|
52
|
+
messageWaits.add(attempt.stepId, void 0, attempt.startedAt);
|
|
53
|
+
messageWaits.next.offer(attempt.timeoutAt, {
|
|
54
|
+
runId,
|
|
55
|
+
stepId: attempt.stepId,
|
|
56
|
+
attemptKey: runStepAttemptKey(runId, attempt)
|
|
57
|
+
});
|
|
58
|
+
if (attempt.messageId !== void 0) messages.add(attempt.messageId);
|
|
59
|
+
}
|
|
60
|
+
return {
|
|
61
|
+
...states.finish(),
|
|
62
|
+
stream: streams.total === 0 ? void 0 : {
|
|
63
|
+
...waitSummary(streams),
|
|
64
|
+
names: sorted(streamNames),
|
|
65
|
+
chunkCount
|
|
66
|
+
},
|
|
67
|
+
hook: hooks.total === 0 ? void 0 : {
|
|
68
|
+
...waitSummary(hooks),
|
|
69
|
+
webhooks,
|
|
70
|
+
hookNames: sorted(hookNames),
|
|
71
|
+
webhookNames: sorted(webhookNames),
|
|
72
|
+
messages: sorted(hookMessages),
|
|
73
|
+
next: hooks.next.next
|
|
74
|
+
},
|
|
75
|
+
sleep: sleeps.total === 0 ? void 0 : {
|
|
76
|
+
...waitSummary(sleeps),
|
|
77
|
+
next: sleeps.next.next
|
|
78
|
+
},
|
|
79
|
+
message: messageWaits.total === 0 ? void 0 : {
|
|
80
|
+
...waitSummary(messageWaits),
|
|
81
|
+
messages: sorted(messages),
|
|
82
|
+
next: messageWaits.next.next
|
|
83
|
+
},
|
|
84
|
+
childWorkflow: summarizeChildWorkflowWaits(inputs.runningChildWorkflows ?? [])
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/** Child runs that belong to the given child-workflow step attempts of a parent run. */
|
|
88
|
+
async function getChildRunsForAttempts(store, parentRunId, attempts) {
|
|
89
|
+
const childRunIds = new Set(attempts.flatMap((attempt) => attempt.childRunId ?? []));
|
|
90
|
+
return (await Promise.all([...childRunIds].map((runId) => store.getRun(runId)))).filter((run) => run !== void 0 && attempts.some((attempt) => run.parentRunId === parentRunId && run.parentStepId === attempt.stepId && run.parentStepName === attempt.stepName && run.parentStepAttempt === attempt.attempt && attempt.childRunId === run.id && attempt.workflowName === run.workflowName && attempt.workflowVersion === run.workflowVersion));
|
|
91
|
+
}
|
|
92
|
+
function waitSummary(waits) {
|
|
93
|
+
return {
|
|
94
|
+
count: waits.total,
|
|
95
|
+
oldestStartedAt: waits.oldestStartedAt
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/** Everything a summary reads from the run records themselves. */
|
|
99
|
+
var RunStateTally = class {
|
|
100
|
+
#now;
|
|
101
|
+
#cleanupCutoff;
|
|
102
|
+
#total = 0;
|
|
103
|
+
#status = counts(RUN_STATUSES);
|
|
104
|
+
#workflows = /* @__PURE__ */ new Map();
|
|
105
|
+
#transitionReason = counts(RUN_TRANSITION_REASONS);
|
|
106
|
+
#latestTransitionAt;
|
|
107
|
+
#retry = new RetryTally();
|
|
108
|
+
#failure = new FailureTally();
|
|
109
|
+
#lease = {
|
|
110
|
+
count: 0,
|
|
111
|
+
expired: 0,
|
|
112
|
+
workerIds: /* @__PURE__ */ new Set(),
|
|
113
|
+
next: new Earliest()
|
|
114
|
+
};
|
|
115
|
+
#cleanup = { status: counts(TERMINAL_RUN_STATUSES) };
|
|
116
|
+
#nextAvailableAt;
|
|
117
|
+
#oldestPendingAt;
|
|
118
|
+
#oldestRunningAt;
|
|
119
|
+
constructor(now, cleanupCutoff) {
|
|
120
|
+
this.#now = now;
|
|
121
|
+
this.#cleanupCutoff = cleanupCutoff;
|
|
122
|
+
}
|
|
123
|
+
add(run) {
|
|
124
|
+
if (!isRunStatus(run.status)) return;
|
|
125
|
+
this.#total++;
|
|
126
|
+
this.#status[run.status]++;
|
|
127
|
+
this.#addWorkflow(run);
|
|
128
|
+
this.#transitionReason[run.lastTransitionReason]++;
|
|
129
|
+
this.#latestTransitionAt = latestOptionalTimestamp(this.#latestTransitionAt, run.lastTransitionAt);
|
|
130
|
+
this.#retry.add(run);
|
|
131
|
+
this.#failure.add(run);
|
|
132
|
+
this.#addLease(run);
|
|
133
|
+
this.#addCleanup(run, run.status);
|
|
134
|
+
if (isScheduledRunStatus(run.status)) {
|
|
135
|
+
this.#nextAvailableAt = earliestOptionalTimestamp(this.#nextAvailableAt, run.availableAt);
|
|
136
|
+
this.#oldestPendingAt = earliestOptionalTimestamp(this.#oldestPendingAt, run.createdAt);
|
|
137
|
+
}
|
|
138
|
+
if (run.status === "running") this.#oldestRunningAt = earliestOptionalTimestamp(this.#oldestRunningAt, run.startedAt ?? run.createdAt);
|
|
139
|
+
}
|
|
140
|
+
finish() {
|
|
141
|
+
const lease = this.#lease;
|
|
142
|
+
const cleanup = this.#cleanup;
|
|
143
|
+
return {
|
|
144
|
+
total: this.#total,
|
|
145
|
+
status: this.#status,
|
|
146
|
+
workflows: [...this.#workflows.values()].sort((left, right) => left.name.localeCompare(right.name) || (left.version ?? "").localeCompare(right.version ?? "")),
|
|
147
|
+
transition: {
|
|
148
|
+
reason: this.#transitionReason,
|
|
149
|
+
latestTransitionAt: this.#latestTransitionAt
|
|
150
|
+
},
|
|
151
|
+
retry: this.#retry.finish(),
|
|
152
|
+
failure: this.#failure.total === 0 ? void 0 : this.#failure.finish(),
|
|
153
|
+
lease: {
|
|
154
|
+
count: lease.count,
|
|
155
|
+
expired: lease.expired,
|
|
156
|
+
workerIds: sorted(lease.workerIds),
|
|
157
|
+
oldestExpiredAt: lease.oldestExpiredAt,
|
|
158
|
+
next: lease.next.next
|
|
159
|
+
},
|
|
160
|
+
cleanup: this.#cleanupCutoff === void 0 ? void 0 : {
|
|
161
|
+
status: cleanup.status,
|
|
162
|
+
oldestFinishedAt: cleanup.oldestFinishedAt,
|
|
163
|
+
newestFinishedAt: cleanup.newestFinishedAt
|
|
164
|
+
},
|
|
165
|
+
nextAvailableAt: this.#nextAvailableAt,
|
|
166
|
+
oldestPendingAt: this.#oldestPendingAt,
|
|
167
|
+
oldestRunningAt: this.#oldestRunningAt
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
#addWorkflow(run) {
|
|
171
|
+
const key = run.workflowVersion === void 0 ? run.workflowName : `${run.workflowName}\0${run.workflowVersion}`;
|
|
172
|
+
const entry = this.#workflows.get(key);
|
|
173
|
+
this.#workflows.set(key, {
|
|
174
|
+
name: run.workflowName,
|
|
175
|
+
version: run.workflowVersion,
|
|
176
|
+
count: (entry?.count ?? 0) + 1
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
#addLease(run) {
|
|
180
|
+
if (run.status !== "running") return;
|
|
181
|
+
const lease = this.#lease;
|
|
182
|
+
lease.count++;
|
|
183
|
+
if (run.workerId !== void 0) lease.workerIds.add(run.workerId);
|
|
184
|
+
if (run.workerId === void 0 || run.leaseExpiresAt === void 0) lease.expired++;
|
|
185
|
+
else if (Temporal.Instant.compare(run.leaseExpiresAt, this.#now) <= 0) {
|
|
186
|
+
lease.expired++;
|
|
187
|
+
lease.oldestExpiredAt = earliestOptionalTimestamp(lease.oldestExpiredAt, run.leaseExpiresAt);
|
|
188
|
+
} else lease.next.offer(run.leaseExpiresAt, { runId: run.id });
|
|
189
|
+
}
|
|
190
|
+
#addCleanup(run, status) {
|
|
191
|
+
const cutoff = this.#cleanupCutoff;
|
|
192
|
+
if (cutoff === void 0 || status !== "completed" && status !== "failed" && status !== "canceled" || run.finishedAt === void 0 || Temporal.Instant.compare(run.finishedAt, cutoff) >= 0) return;
|
|
193
|
+
const cleanup = this.#cleanup;
|
|
194
|
+
cleanup.status[status]++;
|
|
195
|
+
cleanup.oldestFinishedAt = earliestOptionalTimestamp(cleanup.oldestFinishedAt, run.finishedAt);
|
|
196
|
+
cleanup.newestFinishedAt = latestOptionalTimestamp(cleanup.newestFinishedAt, run.finishedAt);
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
function summarizeChildWorkflowWaits(inputs) {
|
|
200
|
+
const waits = new WaitTally();
|
|
201
|
+
const workflows = /* @__PURE__ */ new Set();
|
|
202
|
+
const childRuns = /* @__PURE__ */ new Map();
|
|
203
|
+
for (const { runId, attempts, childRuns: runs } of inputs) {
|
|
204
|
+
for (const attempt of attempts) {
|
|
205
|
+
waits.add(attempt.stepId, void 0, attempt.startedAt);
|
|
206
|
+
waits.next.offer(attempt.timeoutAt, {
|
|
207
|
+
runId,
|
|
208
|
+
stepId: attempt.stepId,
|
|
209
|
+
attemptKey: runStepAttemptKey(runId, attempt)
|
|
210
|
+
});
|
|
211
|
+
if (attempt.workflowName !== void 0) workflows.add(attempt.workflowVersion === void 0 ? attempt.workflowName : `${attempt.workflowName}@${attempt.workflowVersion}`);
|
|
212
|
+
}
|
|
213
|
+
for (const run of runs) childRuns.set(run.id, run);
|
|
214
|
+
}
|
|
215
|
+
if (waits.total === 0) return;
|
|
216
|
+
const { childStatus, childRetry, childFailure } = summarizeChildRuns([...childRuns.values()]);
|
|
217
|
+
return {
|
|
218
|
+
...waitSummary(waits),
|
|
219
|
+
workflows: sorted(workflows),
|
|
220
|
+
childStatus,
|
|
221
|
+
childRetry,
|
|
222
|
+
childFailure,
|
|
223
|
+
next: waits.next.next
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/** The state of the child runs that active child-workflow waits point at. */
|
|
227
|
+
function summarizeChildRuns(runs) {
|
|
228
|
+
const childStatus = counts(RUN_STATUSES);
|
|
229
|
+
const retry = new RetryTally();
|
|
230
|
+
const failure = new FailureTally();
|
|
231
|
+
const failedChildRunIds = /* @__PURE__ */ new Set();
|
|
232
|
+
const canceledChildRunIds = /* @__PURE__ */ new Set();
|
|
233
|
+
for (const run of runs) {
|
|
234
|
+
if (!isRunStatus(run.status)) continue;
|
|
235
|
+
childStatus[run.status]++;
|
|
236
|
+
retry.add(run);
|
|
237
|
+
failure.add(run);
|
|
238
|
+
if (run.status === "failed") failedChildRunIds.add(run.id);
|
|
239
|
+
else if (run.status === "canceled") canceledChildRunIds.add(run.id);
|
|
240
|
+
}
|
|
241
|
+
return {
|
|
242
|
+
childStatus,
|
|
243
|
+
retryChildRunIds: retry.runIds(),
|
|
244
|
+
failedChildRunIds: sortedOrUndefined(failedChildRunIds),
|
|
245
|
+
canceledChildRunIds: sortedOrUndefined(canceledChildRunIds),
|
|
246
|
+
childRetry: retry.total === 0 ? void 0 : retry.finish(),
|
|
247
|
+
childFailure: failure.total === 0 ? void 0 : failure.finish()
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
/** Streams and hooks of one run that have started and not yet ended. */
|
|
251
|
+
function activeEvents(events) {
|
|
252
|
+
const streams = /* @__PURE__ */ new Map();
|
|
253
|
+
const hooks = /* @__PURE__ */ new Map();
|
|
254
|
+
const ended = /* @__PURE__ */ new Set();
|
|
255
|
+
for (const event of events) switch (event.kind) {
|
|
256
|
+
case "stream_started":
|
|
257
|
+
streams.set(event.stepId, {
|
|
258
|
+
stepId: event.stepId,
|
|
259
|
+
stepName: event.stepName,
|
|
260
|
+
streamId: event.streamId,
|
|
261
|
+
startedAt: event.timestamp,
|
|
262
|
+
chunkCount: 0
|
|
263
|
+
});
|
|
264
|
+
break;
|
|
265
|
+
case "stream_chunk": {
|
|
266
|
+
const stream = streams.get(event.stepId);
|
|
267
|
+
if (stream !== void 0) streams.set(event.stepId, {
|
|
268
|
+
...stream,
|
|
269
|
+
chunkCount: stream.chunkCount + 1
|
|
270
|
+
});
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
case "message_wait_started":
|
|
274
|
+
if (event.source === "hook" || event.source === "webhook") hooks.set(event.stepId, {
|
|
275
|
+
stepId: event.stepId,
|
|
276
|
+
name: event.stepName,
|
|
277
|
+
messageId: event.messageId,
|
|
278
|
+
source: event.source,
|
|
279
|
+
startedAt: event.timestamp,
|
|
280
|
+
timeoutAt: event.timeoutAt
|
|
281
|
+
});
|
|
282
|
+
break;
|
|
283
|
+
case "stream_closed":
|
|
284
|
+
case "stream_failed":
|
|
285
|
+
case "message_wait_completed":
|
|
286
|
+
case "message_wait_failed": ended.add(`${event.kind.startsWith("stream") ? "stream" : "hook"}:${event.stepId}`);
|
|
287
|
+
}
|
|
288
|
+
return {
|
|
289
|
+
streams: [...streams.values()].filter((stream) => !ended.has(`stream:${stream.stepId}`)),
|
|
290
|
+
hooks: [...hooks.values()].filter((hook) => !ended.has(`hook:${hook.stepId}`))
|
|
291
|
+
};
|
|
292
|
+
}
|
|
293
|
+
//#endregion
|
|
294
|
+
export { getChildRunsForAttempts, summarizeChildRuns, summarizeRuns };
|