@rikalabs/akter 0.1.0-alpha.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/CHANGELOG.md +15 -0
- package/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +116 -0
- package/dist/actor/codecs.d.ts +77 -0
- package/dist/actor/codecs.js +87 -0
- package/dist/actor/connections.d.ts +34 -0
- package/dist/actor/connections.js +145 -0
- package/dist/actor/definition.d.ts +893 -0
- package/dist/actor/definition.js +147 -0
- package/dist/actor/descriptor.d.ts +172 -0
- package/dist/actor/descriptor.js +367 -0
- package/dist/actor/handles.d.ts +77 -0
- package/dist/actor/handles.js +265 -0
- package/dist/actor/jobs.d.ts +10 -0
- package/dist/actor/jobs.js +137 -0
- package/dist/actor/layers.d.ts +41 -0
- package/dist/actor/layers.js +177 -0
- package/dist/actor/reads.d.ts +47 -0
- package/dist/actor/reads.js +224 -0
- package/dist/actor/served.d.ts +120 -0
- package/dist/actor/served.js +72 -0
- package/dist/actor/turns.d.ts +13 -0
- package/dist/actor/turns.js +332 -0
- package/dist/actor/workflows.d.ts +16 -0
- package/dist/actor/workflows.js +37 -0
- package/dist/client/calls.d.ts +47 -0
- package/dist/client/calls.js +425 -0
- package/dist/client/clock.d.ts +56 -0
- package/dist/client/clock.js +119 -0
- package/dist/client/fleet-page.d.ts +15 -0
- package/dist/client/fleet-page.js +13 -0
- package/dist/client/fleet.d.ts +29 -0
- package/dist/client/fleet.js +51 -0
- package/dist/client/index.d.ts +17 -0
- package/dist/client/index.js +6 -0
- package/dist/client/make.d.ts +157 -0
- package/dist/client/make.js +221 -0
- package/dist/client/offline/queue.d.ts +118 -0
- package/dist/client/offline/queue.js +292 -0
- package/dist/client/offline/store.d.ts +74 -0
- package/dist/client/offline/store.js +78 -0
- package/dist/client/optimistic.d.ts +57 -0
- package/dist/client/optimistic.js +136 -0
- package/dist/client/report.d.ts +2 -0
- package/dist/client/report.js +8 -0
- package/dist/client/sessions/connection.d.ts +118 -0
- package/dist/client/sessions/connection.js +162 -0
- package/dist/client/sessions/feed.d.ts +42 -0
- package/dist/client/sessions/feed.js +43 -0
- package/dist/client/sessions/sse.d.ts +47 -0
- package/dist/client/sessions/sse.js +112 -0
- package/dist/client/sessions/stream.d.ts +28 -0
- package/dist/client/sessions/stream.js +35 -0
- package/dist/client/sessions/watch.d.ts +34 -0
- package/dist/client/sessions/watch.js +40 -0
- package/dist/client/transport.d.ts +37 -0
- package/dist/client/transport.js +66 -0
- package/dist/contexts/command.d.ts +132 -0
- package/dist/contexts/command.js +20 -0
- package/dist/contexts/connection.d.ts +68 -0
- package/dist/contexts/connection.js +0 -0
- package/dist/contexts/job.d.ts +49 -0
- package/dist/contexts/job.js +0 -0
- package/dist/contexts/workflow.d.ts +147 -0
- package/dist/contexts/workflow.js +22 -0
- package/dist/errors/actor.d.ts +200 -0
- package/dist/errors/actor.js +271 -0
- package/dist/errors/content.d.ts +19 -0
- package/dist/errors/content.js +14 -0
- package/dist/errors/database.d.ts +22 -0
- package/dist/errors/database.js +23 -0
- package/dist/errors/events.d.ts +17 -0
- package/dist/errors/events.js +14 -0
- package/dist/errors/subscription.d.ts +12 -0
- package/dist/errors/subscription.js +8 -0
- package/dist/errors/workflow.d.ts +28 -0
- package/dist/errors/workflow.js +17 -0
- package/dist/handles/actors.d.ts +17 -0
- package/dist/handles/actors.js +7 -0
- package/dist/handles/content.d.ts +59 -0
- package/dist/handles/content.js +36 -0
- package/dist/handles/intents.d.ts +164 -0
- package/dist/handles/intents.js +214 -0
- package/dist/handles/run.d.ts +31 -0
- package/dist/handles/run.js +21 -0
- package/dist/handles/workflow.d.ts +27 -0
- package/dist/handles/workflow.js +23 -0
- package/dist/identity/caller.d.ts +105 -0
- package/dist/identity/caller.js +68 -0
- package/dist/identity/child.d.ts +18 -0
- package/dist/identity/child.js +39 -0
- package/dist/identity/command.d.ts +19 -0
- package/dist/identity/command.js +21 -0
- package/dist/identity/connection.d.ts +24 -0
- package/dist/identity/connection.js +29 -0
- package/dist/identity/content.d.ts +18 -0
- package/dist/identity/content.js +12 -0
- package/dist/identity/digest.d.ts +4 -0
- package/dist/identity/digest.js +5 -0
- package/dist/identity/execution.d.ts +32 -0
- package/dist/identity/execution.js +63 -0
- package/dist/identity/mint.d.ts +51 -0
- package/dist/identity/mint.js +76 -0
- package/dist/identity/version.d.ts +2 -0
- package/dist/identity/version.js +3 -0
- package/dist/index.d.ts +159 -0
- package/dist/index.js +97 -0
- package/dist/members/blob.d.ts +43 -0
- package/dist/members/blob.js +29 -0
- package/dist/members/command.d.ts +109 -0
- package/dist/members/command.js +61 -0
- package/dist/members/connection.d.ts +55 -0
- package/dist/members/connection.js +49 -0
- package/dist/members/event.d.ts +36 -0
- package/dist/members/event.js +24 -0
- package/dist/members/job.d.ts +157 -0
- package/dist/members/job.js +67 -0
- package/dist/members/payload.d.ts +93 -0
- package/dist/members/payload.js +145 -0
- package/dist/members/reducer.d.ts +64 -0
- package/dist/members/reducer.js +27 -0
- package/dist/members/stream.d.ts +36 -0
- package/dist/members/stream.js +14 -0
- package/dist/members/subscription.d.ts +182 -0
- package/dist/members/subscription.js +91 -0
- package/dist/members/workflow.d.ts +99 -0
- package/dist/members/workflow.js +2 -0
- package/dist/policies/access.d.ts +35 -0
- package/dist/policies/access.js +6 -0
- package/dist/policies/command.d.ts +127 -0
- package/dist/policies/command.js +45 -0
- package/dist/policies/job.d.ts +28 -0
- package/dist/policies/job.js +60 -0
- package/dist/policies/schedules.d.ts +33 -0
- package/dist/policies/schedules.js +131 -0
- package/dist/protocol/frames.d.ts +66 -0
- package/dist/protocol/frames.js +55 -0
- package/dist/protocol/inspection.d.ts +807 -0
- package/dist/protocol/inspection.js +243 -0
- package/dist/protocol/wire.d.ts +184 -0
- package/dist/protocol/wire.js +150 -0
- package/dist/runtime/actors.d.ts +155 -0
- package/dist/runtime/actors.js +4 -0
- package/dist/runtime/admission.d.ts +34 -0
- package/dist/runtime/admission.js +72 -0
- package/dist/runtime/adoption/backfill.d.ts +27 -0
- package/dist/runtime/adoption/backfill.js +144 -0
- package/dist/runtime/adoption/enforce.d.ts +55 -0
- package/dist/runtime/adoption/enforce.js +241 -0
- package/dist/runtime/adoption/observe.d.ts +43 -0
- package/dist/runtime/adoption/observe.js +139 -0
- package/dist/runtime/adoption/plan.d.ts +45 -0
- package/dist/runtime/adoption/plan.js +192 -0
- package/dist/runtime/adoption/startup.d.ts +32 -0
- package/dist/runtime/adoption/startup.js +76 -0
- package/dist/runtime/adoption/status.d.ts +23 -0
- package/dist/runtime/adoption/status.js +47 -0
- package/dist/runtime/adoption/target.d.ts +33 -0
- package/dist/runtime/adoption/target.js +49 -0
- package/dist/runtime/connections/holder.d.ts +221 -0
- package/dist/runtime/connections/holder.js +816 -0
- package/dist/runtime/connections/owner.d.ts +263 -0
- package/dist/runtime/connections/owner.js +896 -0
- package/dist/runtime/connections/protocol.d.ts +441 -0
- package/dist/runtime/connections/protocol.js +222 -0
- package/dist/runtime/connections/reads.d.ts +24 -0
- package/dist/runtime/connections/reads.js +19 -0
- package/dist/runtime/connections/streams.d.ts +62 -0
- package/dist/runtime/connections/streams.js +128 -0
- package/dist/runtime/connections/transport.d.ts +40 -0
- package/dist/runtime/connections/transport.js +68 -0
- package/dist/runtime/connections/watch.d.ts +52 -0
- package/dist/runtime/connections/watch.js +159 -0
- package/dist/runtime/content/grant.d.ts +34 -0
- package/dist/runtime/content/grant.js +58 -0
- package/dist/runtime/content/store.d.ts +63 -0
- package/dist/runtime/content/store.js +294 -0
- package/dist/runtime/cron/key.d.ts +2 -0
- package/dist/runtime/cron/key.js +2 -0
- package/dist/runtime/cron/schedule.d.ts +69 -0
- package/dist/runtime/cron/schedule.js +144 -0
- package/dist/runtime/database/bounded.d.ts +43 -0
- package/dist/runtime/database/bounded.js +108 -0
- package/dist/runtime/database/connection.d.ts +8 -0
- package/dist/runtime/database/connection.js +18 -0
- package/dist/runtime/database/coordination.d.ts +19 -0
- package/dist/runtime/database/coordination.js +72 -0
- package/dist/runtime/database/flock.d.ts +10 -0
- package/dist/runtime/database/flock.js +60 -0
- package/dist/runtime/database/gate.d.ts +26 -0
- package/dist/runtime/database/gate.js +54 -0
- package/dist/runtime/database/keepalive.d.ts +11 -0
- package/dist/runtime/database/keepalive.js +22 -0
- package/dist/runtime/database/migrations.d.ts +177 -0
- package/dist/runtime/database/migrations.js +1018 -0
- package/dist/runtime/database/neki/migrations.d.ts +31 -0
- package/dist/runtime/database/neki/migrations.js +276 -0
- package/dist/runtime/database/neki/session.d.ts +23 -0
- package/dist/runtime/database/neki/session.js +31 -0
- package/dist/runtime/database/pglite.d.ts +21 -0
- package/dist/runtime/database/pglite.js +74 -0
- package/dist/runtime/database/replica.d.ts +41 -0
- package/dist/runtime/database/replica.js +51 -0
- package/dist/runtime/database/shards.d.ts +21 -0
- package/dist/runtime/database/shards.js +37 -0
- package/dist/runtime/database/snapshot.d.ts +7 -0
- package/dist/runtime/database/snapshot.js +7 -0
- package/dist/runtime/database/tenancy.d.ts +69 -0
- package/dist/runtime/database/tenancy.js +145 -0
- package/dist/runtime/database/transient.d.ts +10 -0
- package/dist/runtime/database/transient.js +25 -0
- package/dist/runtime/drain.d.ts +132 -0
- package/dist/runtime/drain.js +109 -0
- package/dist/runtime/entity/mailbox.d.ts +86 -0
- package/dist/runtime/entity/mailbox.js +121 -0
- package/dist/runtime/entity/register.d.ts +424 -0
- package/dist/runtime/entity/register.js +669 -0
- package/dist/runtime/events/append.d.ts +192 -0
- package/dist/runtime/events/append.js +128 -0
- package/dist/runtime/events/cursor.d.ts +2 -0
- package/dist/runtime/events/cursor.js +5 -0
- package/dist/runtime/events/replay.d.ts +20 -0
- package/dist/runtime/events/replay.js +45 -0
- package/dist/runtime/feeds.d.ts +26 -0
- package/dist/runtime/feeds.js +100 -0
- package/dist/runtime/fleet/checks.d.ts +17 -0
- package/dist/runtime/fleet/checks.js +106 -0
- package/dist/runtime/fleet/maintainer.d.ts +38 -0
- package/dist/runtime/fleet/maintainer.js +383 -0
- package/dist/runtime/fleet/pgoutput.d.ts +41 -0
- package/dist/runtime/fleet/pgoutput.js +102 -0
- package/dist/runtime/fleet/setup.d.ts +36 -0
- package/dist/runtime/fleet/setup.js +58 -0
- package/dist/runtime/fleet/subscribe.d.ts +42 -0
- package/dist/runtime/fleet/subscribe.js +147 -0
- package/dist/runtime/index.d.ts +66 -0
- package/dist/runtime/index.js +37 -0
- package/dist/runtime/inspector/http.d.ts +19 -0
- package/dist/runtime/inspector/http.js +36 -0
- package/dist/runtime/inspector/layer.d.ts +46 -0
- package/dist/runtime/inspector/layer.js +180 -0
- package/dist/runtime/inspector/queries.d.ts +711 -0
- package/dist/runtime/inspector/queries.js +494 -0
- package/dist/runtime/jobs/attempt.d.ts +254 -0
- package/dist/runtime/jobs/attempt.js +413 -0
- package/dist/runtime/jobs/isolation.d.ts +20 -0
- package/dist/runtime/jobs/isolation.js +10 -0
- package/dist/runtime/jobs/progress.d.ts +95 -0
- package/dist/runtime/jobs/progress.js +144 -0
- package/dist/runtime/layer.d.ts +260 -0
- package/dist/runtime/layer.js +876 -0
- package/dist/runtime/members.d.ts +381 -0
- package/dist/runtime/members.js +8 -0
- package/dist/runtime/operators/audit.d.ts +64 -0
- package/dist/runtime/operators/audit.js +56 -0
- package/dist/runtime/operators/auth.d.ts +29 -0
- package/dist/runtime/operators/auth.js +42 -0
- package/dist/runtime/operators/export.d.ts +68 -0
- package/dist/runtime/operators/export.js +137 -0
- package/dist/runtime/operators/grants.d.ts +45 -0
- package/dist/runtime/operators/grants.js +40 -0
- package/dist/runtime/operators/repair.d.ts +206 -0
- package/dist/runtime/operators/repair.js +226 -0
- package/dist/runtime/operators/routes.d.ts +35 -0
- package/dist/runtime/operators/routes.js +190 -0
- package/dist/runtime/operators/seed.d.ts +123 -0
- package/dist/runtime/operators/seed.js +123 -0
- package/dist/runtime/payloads/versions.d.ts +65 -0
- package/dist/runtime/payloads/versions.js +240 -0
- package/dist/runtime/peering/authority.d.ts +42 -0
- package/dist/runtime/peering/authority.js +132 -0
- package/dist/runtime/peering/credentials.d.ts +21 -0
- package/dist/runtime/peering/credentials.js +13 -0
- package/dist/runtime/peering/transport.d.ts +51 -0
- package/dist/runtime/peering/transport.js +175 -0
- package/dist/runtime/queries.d.ts +18 -0
- package/dist/runtime/queries.js +169 -0
- package/dist/runtime/readiness.d.ts +36 -0
- package/dist/runtime/readiness.js +44 -0
- package/dist/runtime/registration.d.ts +58 -0
- package/dist/runtime/registration.js +186 -0
- package/dist/runtime/request.d.ts +158 -0
- package/dist/runtime/request.js +102 -0
- package/dist/runtime/retry.d.ts +8 -0
- package/dist/runtime/retry.js +11 -0
- package/dist/runtime/runner.d.ts +93 -0
- package/dist/runtime/runner.js +122 -0
- package/dist/runtime/storage/codec.d.ts +39 -0
- package/dist/runtime/storage/codec.js +41 -0
- package/dist/runtime/storage/generation.d.ts +69 -0
- package/dist/runtime/storage/generation.js +49 -0
- package/dist/runtime/storage/placements.d.ts +15 -0
- package/dist/runtime/storage/placements.js +38 -0
- package/dist/runtime/storage/platform.d.ts +6 -0
- package/dist/runtime/storage/platform.js +9 -0
- package/dist/runtime/storage/retention.d.ts +73 -0
- package/dist/runtime/storage/retention.js +158 -0
- package/dist/runtime/subscriptions/identity.d.ts +31 -0
- package/dist/runtime/subscriptions/identity.js +45 -0
- package/dist/runtime/subscriptions/relay.d.ts +175 -0
- package/dist/runtime/subscriptions/relay.js +763 -0
- package/dist/runtime/subscriptions/storage.d.ts +40 -0
- package/dist/runtime/subscriptions/storage.js +98 -0
- package/dist/runtime/sweeps.d.ts +39 -0
- package/dist/runtime/sweeps.js +54 -0
- package/dist/runtime/telemetry/defects.d.ts +57 -0
- package/dist/runtime/telemetry/defects.js +43 -0
- package/dist/runtime/telemetry/metrics.d.ts +52 -0
- package/dist/runtime/telemetry/metrics.js +138 -0
- package/dist/runtime/telemetry/routes.d.ts +19 -0
- package/dist/runtime/telemetry/routes.js +18 -0
- package/dist/runtime/telemetry/sampler.d.ts +26 -0
- package/dist/runtime/telemetry/sampler.js +101 -0
- package/dist/runtime/telemetry/spans.d.ts +38 -0
- package/dist/runtime/telemetry/spans.js +44 -0
- package/dist/runtime/telemetry/usage.d.ts +52 -0
- package/dist/runtime/telemetry/usage.js +30 -0
- package/dist/runtime/topology/admission.d.ts +13 -0
- package/dist/runtime/topology/admission.js +36 -0
- package/dist/runtime/topology/locks.d.ts +56 -0
- package/dist/runtime/topology/locks.js +81 -0
- package/dist/runtime/topology/messages.d.ts +15 -0
- package/dist/runtime/topology/messages.js +32 -0
- package/dist/runtime/turn/admission.d.ts +22 -0
- package/dist/runtime/turn/admission.js +41 -0
- package/dist/runtime/turn/blobs.d.ts +38 -0
- package/dist/runtime/turn/blobs.js +215 -0
- package/dist/runtime/turn/execute.d.ts +208 -0
- package/dist/runtime/turn/execute.js +972 -0
- package/dist/runtime/turn/group.d.ts +165 -0
- package/dist/runtime/turn/group.js +326 -0
- package/dist/runtime/turn/hooks.d.ts +44 -0
- package/dist/runtime/turn/hooks.js +28 -0
- package/dist/runtime/turn/outbox.d.ts +159 -0
- package/dist/runtime/turn/outbox.js +269 -0
- package/dist/runtime/turn/pipeline.d.ts +68 -0
- package/dist/runtime/turn/pipeline.js +83 -0
- package/dist/runtime/turn/receipt.d.ts +81 -0
- package/dist/runtime/turn/receipt.js +32 -0
- package/dist/runtime/turn/relay.d.ts +179 -0
- package/dist/runtime/turn/relay.js +685 -0
- package/dist/runtime/turn/rows.d.ts +43 -0
- package/dist/runtime/turn/rows.js +592 -0
- package/dist/runtime/workflows/compatibility.d.ts +125 -0
- package/dist/runtime/workflows/compatibility.js +285 -0
- package/dist/runtime/workflows/engine.d.ts +107 -0
- package/dist/runtime/workflows/engine.js +826 -0
- package/dist/runtime/workflows/manifest.d.ts +34 -0
- package/dist/runtime/workflows/manifest.js +39 -0
- package/dist/runtime/workflows/steps.d.ts +33 -0
- package/dist/runtime/workflows/steps.js +152 -0
- package/dist/serve/api.d.ts +99 -0
- package/dist/serve/api.js +403 -0
- package/dist/serve/assertion/binding.d.ts +41 -0
- package/dist/serve/assertion/binding.js +92 -0
- package/dist/serve/assertion/verify.d.ts +93 -0
- package/dist/serve/assertion/verify.js +189 -0
- package/dist/serve/auth.d.ts +200 -0
- package/dist/serve/auth.js +92 -0
- package/dist/serve/clock.d.ts +10 -0
- package/dist/serve/clock.js +25 -0
- package/dist/serve/jwt.d.ts +65 -0
- package/dist/serve/jwt.js +202 -0
- package/dist/serve/layer.d.ts +98 -0
- package/dist/serve/layer.js +809 -0
- package/dist/serve/mcp/endpoint.d.ts +39 -0
- package/dist/serve/mcp/endpoint.js +187 -0
- package/dist/serve/mcp/tools.d.ts +37 -0
- package/dist/serve/mcp/tools.js +125 -0
- package/dist/serve/origin.d.ts +6 -0
- package/dist/serve/origin.js +21 -0
- package/dist/serve/sessions/feed.d.ts +79 -0
- package/dist/serve/sessions/feed.js +115 -0
- package/dist/serve/sessions/socket.d.ts +56 -0
- package/dist/serve/sessions/socket.js +212 -0
- package/dist/serve/sessions/sse.d.ts +27 -0
- package/dist/serve/sessions/sse.js +26 -0
- package/dist/serve/sessions/stream.d.ts +9 -0
- package/dist/serve/sessions/stream.js +9 -0
- package/dist/serve/sessions/watch.d.ts +12 -0
- package/dist/serve/sessions/watch.js +11 -0
- package/dist/serve/wire.d.ts +16 -0
- package/dist/serve/wire.js +50 -0
- package/dist/state/blob.d.ts +71 -0
- package/dist/state/blob.js +0 -0
- package/dist/state/migration.d.ts +53 -0
- package/dist/state/migration.js +29 -0
- package/dist/tables/fleet.d.ts +170 -0
- package/dist/tables/fleet.js +214 -0
- package/dist/tables/owned.d.ts +250 -0
- package/dist/tables/owned.js +233 -0
- package/dist/testing/actor-test.d.ts +360 -0
- package/dist/testing/actor-test.js +337 -0
- package/dist/testing/cluster.d.ts +93 -0
- package/dist/testing/cluster.js +296 -0
- package/dist/testing/conformance/access.d.ts +5 -0
- package/dist/testing/conformance/access.js +531 -0
- package/dist/testing/conformance/admission.d.ts +11 -0
- package/dist/testing/conformance/admission.js +182 -0
- package/dist/testing/conformance/adoption.d.ts +2 -0
- package/dist/testing/conformance/adoption.js +1019 -0
- package/dist/testing/conformance/assertions.d.ts +202 -0
- package/dist/testing/conformance/assertions.js +849 -0
- package/dist/testing/conformance/batches.d.ts +41 -0
- package/dist/testing/conformance/batches.js +388 -0
- package/dist/testing/conformance/blobs.d.ts +14 -0
- package/dist/testing/conformance/blobs.js +405 -0
- package/dist/testing/conformance/capacity.d.ts +8 -0
- package/dist/testing/conformance/capacity.js +433 -0
- package/dist/testing/conformance/client.d.ts +5 -0
- package/dist/testing/conformance/client.js +719 -0
- package/dist/testing/conformance/cold-serve.d.ts +16 -0
- package/dist/testing/conformance/cold-serve.js +254 -0
- package/dist/testing/conformance/connections/actors.d.ts +1143 -0
- package/dist/testing/conformance/connections/actors.js +180 -0
- package/dist/testing/conformance/connections/harness.d.ts +1754 -0
- package/dist/testing/conformance/connections/harness.js +142 -0
- package/dist/testing/conformance/connections/holders.d.ts +4 -0
- package/dist/testing/conformance/connections/holders.js +165 -0
- package/dist/testing/conformance/connections/lifecycle.d.ts +4 -0
- package/dist/testing/conformance/connections/lifecycle.js +113 -0
- package/dist/testing/conformance/connections/limits.d.ts +4 -0
- package/dist/testing/conformance/connections/limits.js +127 -0
- package/dist/testing/conformance/connections/reauthorization.d.ts +4 -0
- package/dist/testing/conformance/connections/reauthorization.js +170 -0
- package/dist/testing/conformance/connections/resync.d.ts +4 -0
- package/dist/testing/conformance/connections/resync.js +360 -0
- package/dist/testing/conformance/connections/takeover.d.ts +4 -0
- package/dist/testing/conformance/connections/takeover.js +287 -0
- package/dist/testing/conformance/connections.d.ts +4 -0
- package/dist/testing/conformance/connections.js +15 -0
- package/dist/testing/conformance/content-blobs.d.ts +16 -0
- package/dist/testing/conformance/content-blobs.js +534 -0
- package/dist/testing/conformance/counter.d.ts +16 -0
- package/dist/testing/conformance/counter.js +813 -0
- package/dist/testing/conformance/cron.d.ts +5 -0
- package/dist/testing/conformance/cron.js +665 -0
- package/dist/testing/conformance/drain.d.ts +26 -0
- package/dist/testing/conformance/drain.js +540 -0
- package/dist/testing/conformance/effect-control.d.ts +38 -0
- package/dist/testing/conformance/effect-control.js +1059 -0
- package/dist/testing/conformance/effects.d.ts +23 -0
- package/dist/testing/conformance/effects.js +432 -0
- package/dist/testing/conformance/events.d.ts +28 -0
- package/dist/testing/conformance/events.js +335 -0
- package/dist/testing/conformance/export.d.ts +2 -0
- package/dist/testing/conformance/export.js +368 -0
- package/dist/testing/conformance/fleet.d.ts +444 -0
- package/dist/testing/conformance/fleet.js +1009 -0
- package/dist/testing/conformance/groups.d.ts +7 -0
- package/dist/testing/conformance/groups.js +353 -0
- package/dist/testing/conformance/heap.d.ts +3 -0
- package/dist/testing/conformance/heap.js +149 -0
- package/dist/testing/conformance/http.d.ts +2809 -0
- package/dist/testing/conformance/http.js +1234 -0
- package/dist/testing/conformance/inspection-views.d.ts +8 -0
- package/dist/testing/conformance/inspection-views.js +272 -0
- package/dist/testing/conformance/inspector.d.ts +7 -0
- package/dist/testing/conformance/inspector.js +650 -0
- package/dist/testing/conformance/mint.d.ts +58 -0
- package/dist/testing/conformance/mint.js +692 -0
- package/dist/testing/conformance/multi-runner.d.ts +8 -0
- package/dist/testing/conformance/multi-runner.js +403 -0
- package/dist/testing/conformance/neki/plan.d.ts +19 -0
- package/dist/testing/conformance/neki/plan.js +30 -0
- package/dist/testing/conformance/observability.d.ts +3 -0
- package/dist/testing/conformance/observability.js +343 -0
- package/dist/testing/conformance/offline.d.ts +4 -0
- package/dist/testing/conformance/offline.js +474 -0
- package/dist/testing/conformance/operator-harness.d.ts +57 -0
- package/dist/testing/conformance/operator-harness.js +78 -0
- package/dist/testing/conformance/operator.d.ts +3 -0
- package/dist/testing/conformance/operator.js +379 -0
- package/dist/testing/conformance/outbox-cross-shard.d.ts +14 -0
- package/dist/testing/conformance/outbox-cross-shard.js +160 -0
- package/dist/testing/conformance/outbox.d.ts +36 -0
- package/dist/testing/conformance/outbox.js +437 -0
- package/dist/testing/conformance/payload-migrations.d.ts +3 -0
- package/dist/testing/conformance/payload-migrations.js +612 -0
- package/dist/testing/conformance/pipeline.d.ts +3 -0
- package/dist/testing/conformance/pipeline.js +1040 -0
- package/dist/testing/conformance/placement.d.ts +22 -0
- package/dist/testing/conformance/placement.js +539 -0
- package/dist/testing/conformance/platform.d.ts +40 -0
- package/dist/testing/conformance/platform.js +101 -0
- package/dist/testing/conformance/progress.d.ts +39 -0
- package/dist/testing/conformance/progress.js +666 -0
- package/dist/testing/conformance/properties.d.ts +6 -0
- package/dist/testing/conformance/properties.js +295 -0
- package/dist/testing/conformance/protocols.d.ts +4 -0
- package/dist/testing/conformance/protocols.js +618 -0
- package/dist/testing/conformance/provider/advertise.d.ts +21 -0
- package/dist/testing/conformance/provider/advertise.js +44 -0
- package/dist/testing/conformance/read-your-writes.d.ts +20 -0
- package/dist/testing/conformance/read-your-writes.js +192 -0
- package/dist/testing/conformance/reducers.d.ts +8 -0
- package/dist/testing/conformance/reducers.js +258 -0
- package/dist/testing/conformance/relay.d.ts +42 -0
- package/dist/testing/conformance/relay.js +1115 -0
- package/dist/testing/conformance/restore.d.ts +43 -0
- package/dist/testing/conformance/restore.js +341 -0
- package/dist/testing/conformance/retention.d.ts +14 -0
- package/dist/testing/conformance/retention.js +463 -0
- package/dist/testing/conformance/rls.d.ts +24 -0
- package/dist/testing/conformance/rls.js +576 -0
- package/dist/testing/conformance/simulation.d.ts +31 -0
- package/dist/testing/conformance/simulation.js +167 -0
- package/dist/testing/conformance/single-shard.d.ts +2 -0
- package/dist/testing/conformance/single-shard.js +125 -0
- package/dist/testing/conformance/singleton.d.ts +3 -0
- package/dist/testing/conformance/singleton.js +293 -0
- package/dist/testing/conformance/statements.d.ts +60 -0
- package/dist/testing/conformance/statements.js +108 -0
- package/dist/testing/conformance/streams.d.ts +7 -0
- package/dist/testing/conformance/streams.js +280 -0
- package/dist/testing/conformance/subscriptions/access.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/access.js +98 -0
- package/dist/testing/conformance/subscriptions/actors.d.ts +4910 -0
- package/dist/testing/conformance/subscriptions/actors.js +372 -0
- package/dist/testing/conformance/subscriptions/cluster.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/cluster.js +89 -0
- package/dist/testing/conformance/subscriptions/delivery.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/delivery.js +253 -0
- package/dist/testing/conformance/subscriptions/deploys.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/deploys.js +162 -0
- package/dist/testing/conformance/subscriptions/epochs.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/epochs.js +169 -0
- package/dist/testing/conformance/subscriptions/failures.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/failures.js +108 -0
- package/dist/testing/conformance/subscriptions/feeds.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/feeds.js +218 -0
- package/dist/testing/conformance/subscriptions/harness.d.ts +124 -0
- package/dist/testing/conformance/subscriptions/harness.js +143 -0
- package/dist/testing/conformance/subscriptions/operator.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/operator.js +128 -0
- package/dist/testing/conformance/subscriptions/retention.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/retention.js +288 -0
- package/dist/testing/conformance/subscriptions/routing.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/routing.js +179 -0
- package/dist/testing/conformance/subscriptions.d.ts +4 -0
- package/dist/testing/conformance/subscriptions.js +19 -0
- package/dist/testing/conformance/tables.d.ts +125 -0
- package/dist/testing/conformance/tables.js +664 -0
- package/dist/testing/conformance/transports/actors.d.ts +1907 -0
- package/dist/testing/conformance/transports/actors.js +163 -0
- package/dist/testing/conformance/transports/client.d.ts +3 -0
- package/dist/testing/conformance/transports/client.js +237 -0
- package/dist/testing/conformance/transports/feeds.d.ts +3 -0
- package/dist/testing/conformance/transports/feeds.js +232 -0
- package/dist/testing/conformance/transports/harness.d.ts +93 -0
- package/dist/testing/conformance/transports/harness.js +84 -0
- package/dist/testing/conformance/transports/streams.d.ts +3 -0
- package/dist/testing/conformance/transports/streams.js +96 -0
- package/dist/testing/conformance/transports/websocket.d.ts +3 -0
- package/dist/testing/conformance/transports/websocket.js +384 -0
- package/dist/testing/conformance/transports/wire.d.ts +141 -0
- package/dist/testing/conformance/transports/wire.js +204 -0
- package/dist/testing/conformance/transports.d.ts +3 -0
- package/dist/testing/conformance/transports.js +11 -0
- package/dist/testing/conformance/watch.d.ts +59 -0
- package/dist/testing/conformance/watch.js +879 -0
- package/dist/testing/conformance/workflow-engine.d.ts +97 -0
- package/dist/testing/conformance/workflow-engine.js +253 -0
- package/dist/testing/conformance/workflow-versions.d.ts +3 -0
- package/dist/testing/conformance/workflow-versions.js +545 -0
- package/dist/testing/conformance/workflows/access.d.ts +4 -0
- package/dist/testing/conformance/workflows/access.js +147 -0
- package/dist/testing/conformance/workflows/actors.d.ts +2317 -0
- package/dist/testing/conformance/workflows/actors.js +305 -0
- package/dist/testing/conformance/workflows/basics.d.ts +4 -0
- package/dist/testing/conformance/workflows/basics.js +144 -0
- package/dist/testing/conformance/workflows/engine.d.ts +4 -0
- package/dist/testing/conformance/workflows/engine.js +80 -0
- package/dist/testing/conformance/workflows/guards.d.ts +4 -0
- package/dist/testing/conformance/workflows/guards.js +172 -0
- package/dist/testing/conformance/workflows/harness.d.ts +14 -0
- package/dist/testing/conformance/workflows/harness.js +44 -0
- package/dist/testing/conformance/workflows/recovery.d.ts +4 -0
- package/dist/testing/conformance/workflows/recovery.js +181 -0
- package/dist/testing/conformance/workflows/starts.d.ts +4 -0
- package/dist/testing/conformance/workflows/starts.js +57 -0
- package/dist/testing/conformance/workflows/suspension.d.ts +4 -0
- package/dist/testing/conformance/workflows/suspension.js +106 -0
- package/dist/testing/conformance/workflows/waits.d.ts +4 -0
- package/dist/testing/conformance/workflows/waits.js +284 -0
- package/dist/testing/conformance/workflows.d.ts +4 -0
- package/dist/testing/conformance/workflows.js +19 -0
- package/dist/testing/conformance.d.ts +330 -0
- package/dist/testing/conformance.js +364 -0
- package/dist/testing/database.d.ts +31 -0
- package/dist/testing/database.js +70 -0
- package/dist/testing/foundation.d.ts +41 -0
- package/dist/testing/foundation.js +517 -0
- package/dist/testing/index.d.ts +20 -0
- package/dist/testing/index.js +12 -0
- package/dist/testing/property.d.ts +40 -0
- package/dist/testing/property.js +95 -0
- package/dist/testing/simulate-cluster.d.ts +112 -0
- package/dist/testing/simulate-cluster.js +257 -0
- package/dist/testing/simulate.d.ts +90 -0
- package/dist/testing/simulate.js +127 -0
- package/package.json +1 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import { SqlClient } from "effect/sql";
|
|
3
|
+
import { type AnyWorkflow, type VersionRange } from "../../members/workflow.ts";
|
|
4
|
+
import { type Declared } from "./manifest.ts";
|
|
5
|
+
/** One reason a deployment cannot run the open executions it would inherit. */
|
|
6
|
+
export interface Incompatibility {
|
|
7
|
+
readonly actorType: string;
|
|
8
|
+
readonly workflow: string;
|
|
9
|
+
/** What changed, e.g. `step "label" removed` or `marker "fraud" 1 outside 2..3`. */
|
|
10
|
+
readonly problem: string;
|
|
11
|
+
/** Open executions the change strands. */
|
|
12
|
+
readonly open: number;
|
|
13
|
+
/** When the oldest of them started, in epoch milliseconds. */
|
|
14
|
+
readonly oldestStartedAtMs: number;
|
|
15
|
+
}
|
|
16
|
+
/** An actor type as a deployment declares it: its name and its workflow members. */
|
|
17
|
+
interface DeclaredActor {
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly workflows: ReadonlyArray<AnyWorkflow>;
|
|
20
|
+
}
|
|
21
|
+
/** The workflow members of an `Actor.make` definition. */
|
|
22
|
+
export declare const declaredOf: (actor: {
|
|
23
|
+
readonly name: string;
|
|
24
|
+
readonly api: object;
|
|
25
|
+
}) => DeclaredActor;
|
|
26
|
+
declare const StoredManifest: Schema.Struct<{
|
|
27
|
+
readonly payload: Schema.String;
|
|
28
|
+
readonly steps: Schema.$Array<Schema.Struct<{
|
|
29
|
+
readonly name: Schema.String;
|
|
30
|
+
readonly kind: Schema.String;
|
|
31
|
+
readonly result: Schema.String;
|
|
32
|
+
}>>;
|
|
33
|
+
}>;
|
|
34
|
+
type StoredManifest = typeof StoredManifest.Type;
|
|
35
|
+
/** Decodes the steps of a stored manifest. */
|
|
36
|
+
export declare const decodeStoredManifest: (manifest: string) => Effect.Effect<{
|
|
37
|
+
readonly payload: string;
|
|
38
|
+
readonly steps: readonly {
|
|
39
|
+
readonly name: string;
|
|
40
|
+
readonly kind: string;
|
|
41
|
+
readonly result: string;
|
|
42
|
+
}[];
|
|
43
|
+
}, Schema.SchemaError, never>;
|
|
44
|
+
/** Why `declared` cannot continue the executions a start manifest covers, and which of its steps it would decode under another result schema. */
|
|
45
|
+
export interface StartVerdict {
|
|
46
|
+
readonly problems: ReadonlyArray<string>;
|
|
47
|
+
readonly changed: ReadonlyArray<string>;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* The verdict on executions that started under `hash`, whose stored manifest is
|
|
51
|
+
* `start` (undefined when its row is missing). A start manifest has to list
|
|
52
|
+
* only steps `declared` registers as the same kind and share its payload schema.
|
|
53
|
+
* `newer` means it was accepted after `declared`: a runner then also refuses it
|
|
54
|
+
* when a shared step's result schema differs, because the newer deployment may
|
|
55
|
+
* record such results at any time.
|
|
56
|
+
*/
|
|
57
|
+
export declare const startVerdict: ({ declared, hash, start, newer, }: {
|
|
58
|
+
readonly declared: Declared;
|
|
59
|
+
readonly hash: string;
|
|
60
|
+
readonly start: StoredManifest | undefined;
|
|
61
|
+
readonly newer: boolean;
|
|
62
|
+
}) => StartVerdict;
|
|
63
|
+
/**
|
|
64
|
+
* Why an execution's value for marker `name` is unsupported: `recorded` is
|
|
65
|
+
* undefined when the execution predates the marker, and reads as 0.
|
|
66
|
+
*/
|
|
67
|
+
export declare const markerProblem: ({ versions, name, recorded, }: {
|
|
68
|
+
readonly versions: Readonly<Record<string, VersionRange>>;
|
|
69
|
+
readonly name: string;
|
|
70
|
+
readonly recorded: number | undefined;
|
|
71
|
+
}) => string[];
|
|
72
|
+
/**
|
|
73
|
+
* Why `declared` cannot replay a recorded step: it no longer registers the
|
|
74
|
+
* step as that kind, or the step settled under a result schema in `changed`.
|
|
75
|
+
*/
|
|
76
|
+
export declare const recordedStepProblem: ({ declared, step, kind, settled, changed, }: {
|
|
77
|
+
readonly declared: Declared;
|
|
78
|
+
readonly step: string;
|
|
79
|
+
readonly kind: string;
|
|
80
|
+
readonly settled: boolean;
|
|
81
|
+
readonly changed: ReadonlyArray<string>;
|
|
82
|
+
}) => string[];
|
|
83
|
+
/**
|
|
84
|
+
* Compares `declared` with every open execution of its actor types (of every
|
|
85
|
+
* actor type with `everyActorType`) and the manifests they started under.
|
|
86
|
+
* An open execution blocks a deployment when its actor type or workflow is
|
|
87
|
+
* gone, its start manifest has a step the deployment doesn't register as the
|
|
88
|
+
* same kind, a step it recorded changed its result schema, a marker it
|
|
89
|
+
* recorded is undeclared or outside `min..current`, or it predates a marker
|
|
90
|
+
* whose `min` is above 0. Grouped by actor type, workflow and problem.
|
|
91
|
+
*
|
|
92
|
+
* An execution that started after the groups were read brings its manifest into
|
|
93
|
+
* the comparison. A start manifest already reports a missing step for every
|
|
94
|
+
* execution under it, so those executions are not reported again.
|
|
95
|
+
*/
|
|
96
|
+
export declare const findIncompatibilities: (declared: readonly DeclaredActor[], options: {
|
|
97
|
+
readonly everyActorType: boolean;
|
|
98
|
+
}) => Effect.Effect<Incompatibility[], import("effect/sql/SqlError").SqlError, import("effect/Crypto").Crypto | SqlClient.SqlClient>;
|
|
99
|
+
/** `Order/Ship step "label" removed 412 open executions (oldest 2026-09-20T08:14:00.000Z)` */
|
|
100
|
+
export declare const formatIncompatibility: (incompatibility: Incompatibility) => string;
|
|
101
|
+
/**
|
|
102
|
+
* The startup check for one actor type. It skips the comparison when each
|
|
103
|
+
* workflow's manifest is already the most recently accepted one, no accepted
|
|
104
|
+
* workflow is gone and no open execution started under another manifest; otherwise it compares, and a passing deployment
|
|
105
|
+
* becomes the most recently accepted one, so a rollback is compared again.
|
|
106
|
+
* `retained`: the actor type has workflows or workflow rows retention sweeps.
|
|
107
|
+
*
|
|
108
|
+
* A runner of an older deployment may have started executions since the last
|
|
109
|
+
* comparison, and a comparison that finds no open execution of a dropped workflow
|
|
110
|
+
* lets the deployment pass.
|
|
111
|
+
*/
|
|
112
|
+
export declare const acceptWorkflows: (actor: DeclaredActor) => Effect.Effect<{
|
|
113
|
+
checked: boolean;
|
|
114
|
+
incompatibilities: Incompatibility[];
|
|
115
|
+
retained: boolean;
|
|
116
|
+
}, import("effect/sql/SqlError").SqlError, import("effect/Crypto").Crypto | SqlClient.SqlClient>;
|
|
117
|
+
/**
|
|
118
|
+
* The deploy check `durable workflows check` runs: every actor type in the
|
|
119
|
+
* database against `actors`, in one read-only snapshot.
|
|
120
|
+
*/
|
|
121
|
+
export declare const checkWorkflows: (actors: ReadonlyArray<{
|
|
122
|
+
readonly name: string;
|
|
123
|
+
readonly api: object;
|
|
124
|
+
}>) => Effect.Effect<Incompatibility[], import("effect/sql/SqlError").SqlError, import("effect/Crypto").Crypto | SqlClient.SqlClient>;
|
|
125
|
+
export {};
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
import { DateTime, Effect, Schema } from "effect";
|
|
2
|
+
import { SqlClient } from "effect/sql";
|
|
3
|
+
import { coordinated } from "../database/coordination.js";
|
|
4
|
+
import { isWorkflow } from "../../members/workflow.js";
|
|
5
|
+
import { inReadOnlySnapshot } from "../database/snapshot.js";
|
|
6
|
+
import { manifestOf, toJson } from "./manifest.js";
|
|
7
|
+
/** The workflow members of an `Actor.make` definition. */
|
|
8
|
+
export const declaredOf = (actor) => ({
|
|
9
|
+
name: actor.name,
|
|
10
|
+
workflows: Object.values(actor.api).filter(isWorkflow),
|
|
11
|
+
});
|
|
12
|
+
const StoredManifest = Schema.Struct({
|
|
13
|
+
payload: Schema.String,
|
|
14
|
+
steps: Schema.Array(Schema.Struct({
|
|
15
|
+
name: Schema.String,
|
|
16
|
+
kind: Schema.String,
|
|
17
|
+
result: Schema.String,
|
|
18
|
+
})),
|
|
19
|
+
});
|
|
20
|
+
const decodeManifest = Schema.decodeUnknownEffect(Schema.fromJsonString(StoredManifest));
|
|
21
|
+
/** Decodes the steps of a stored manifest. */
|
|
22
|
+
export const decodeStoredManifest = (manifest) => decodeManifest(manifest);
|
|
23
|
+
const sameManifest = { problems: [], changed: [] };
|
|
24
|
+
/**
|
|
25
|
+
* The verdict on executions that started under `hash`, whose stored manifest is
|
|
26
|
+
* `start` (undefined when its row is missing). A start manifest has to list
|
|
27
|
+
* only steps `declared` registers as the same kind and share its payload schema.
|
|
28
|
+
* `newer` means it was accepted after `declared`: a runner then also refuses it
|
|
29
|
+
* when a shared step's result schema differs, because the newer deployment may
|
|
30
|
+
* record such results at any time.
|
|
31
|
+
*/
|
|
32
|
+
export const startVerdict = ({ declared, hash, start, newer, }) => {
|
|
33
|
+
if (hash === declared.hash)
|
|
34
|
+
return sameManifest;
|
|
35
|
+
if (start === undefined)
|
|
36
|
+
return { problems: ["start manifest missing"], changed: [] };
|
|
37
|
+
const changed = start.steps.flatMap((entry) => {
|
|
38
|
+
const step = declared.steps.get(entry.name);
|
|
39
|
+
return step !== undefined && entry.result !== step.result ? [entry.name] : [];
|
|
40
|
+
});
|
|
41
|
+
const problems = start.steps.flatMap((entry) => {
|
|
42
|
+
const kind = declared.steps.get(entry.name)?.kind;
|
|
43
|
+
if (kind === undefined)
|
|
44
|
+
return [`step "${entry.name}" removed`];
|
|
45
|
+
return kind === entry.kind ? [] : [`step "${entry.name}" changed from ${entry.kind} to ${kind}`];
|
|
46
|
+
});
|
|
47
|
+
if (start.payload !== declared.manifest.payload)
|
|
48
|
+
problems.push("payload schema changed");
|
|
49
|
+
if (newer)
|
|
50
|
+
for (const name of changed)
|
|
51
|
+
problems.push(`step "${name}" result schema changed by a newer deployment`);
|
|
52
|
+
return { problems, changed };
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Why an execution's value for marker `name` is unsupported: `recorded` is
|
|
56
|
+
* undefined when the execution predates the marker, and reads as 0.
|
|
57
|
+
*/
|
|
58
|
+
export const markerProblem = ({ versions, name, recorded, }) => {
|
|
59
|
+
const range = versions[name];
|
|
60
|
+
if (range === undefined)
|
|
61
|
+
return recorded === undefined ? [] : [`marker "${name}" removed`];
|
|
62
|
+
if (recorded === undefined)
|
|
63
|
+
return range.min > 0
|
|
64
|
+
? [`marker "${name}" min ${range.min} > 0 for executions that predate it`]
|
|
65
|
+
: [];
|
|
66
|
+
return recorded < range.min || recorded > range.current
|
|
67
|
+
? [`marker "${name}" ${recorded} outside ${range.min}..${range.current}`]
|
|
68
|
+
: [];
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Why `declared` cannot replay a recorded step: it no longer registers the
|
|
72
|
+
* step as that kind, or the step settled under a result schema in `changed`.
|
|
73
|
+
*/
|
|
74
|
+
export const recordedStepProblem = ({ declared, step, kind, settled, changed, }) => {
|
|
75
|
+
const registered = declared.steps.get(step)?.kind;
|
|
76
|
+
if (registered === undefined)
|
|
77
|
+
return [`step "${step}" removed`];
|
|
78
|
+
if (registered !== kind)
|
|
79
|
+
return [`step "${step}" changed from ${kind} to ${registered}`];
|
|
80
|
+
return settled && changed.includes(step) ? [`step "${step}" result schema changed`] : [];
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Compares `declared` with every open execution of its actor types (of every
|
|
84
|
+
* actor type with `everyActorType`) and the manifests they started under.
|
|
85
|
+
* An open execution blocks a deployment when its actor type or workflow is
|
|
86
|
+
* gone, its start manifest has a step the deployment doesn't register as the
|
|
87
|
+
* same kind, a step it recorded changed its result schema, a marker it
|
|
88
|
+
* recorded is undeclared or outside `min..current`, or it predates a marker
|
|
89
|
+
* whose `min` is above 0. Grouped by actor type, workflow and problem.
|
|
90
|
+
*
|
|
91
|
+
* An execution that started after the groups were read brings its manifest into
|
|
92
|
+
* the comparison. A start manifest already reports a missing step for every
|
|
93
|
+
* execution under it, so those executions are not reported again.
|
|
94
|
+
*/
|
|
95
|
+
export const findIncompatibilities = Effect.fnUntraced(function* (declared, options) {
|
|
96
|
+
const sql = yield* SqlClient.SqlClient;
|
|
97
|
+
const current = new Map();
|
|
98
|
+
for (const actor of declared) {
|
|
99
|
+
const workflows = new Map();
|
|
100
|
+
for (const member of actor.workflows)
|
|
101
|
+
workflows.set(member.tag, { member, declared: yield* manifestOf(actor.name, member) });
|
|
102
|
+
current.set(actor.name, workflows);
|
|
103
|
+
}
|
|
104
|
+
const types = toJson([...current.keys()]);
|
|
105
|
+
const scope = options.everyActorType
|
|
106
|
+
? sql `TRUE`
|
|
107
|
+
: sql `x.actor_type IN (SELECT jsonb_array_elements_text(${types}::jsonb))`;
|
|
108
|
+
const found = new Map();
|
|
109
|
+
const add = (actorType, workflow, problem, open, oldest) => {
|
|
110
|
+
const key = toJson([actorType, workflow, problem]);
|
|
111
|
+
const seen = found.get(key);
|
|
112
|
+
found.set(key, {
|
|
113
|
+
actorType,
|
|
114
|
+
workflow,
|
|
115
|
+
problem,
|
|
116
|
+
open: (seen?.open ?? 0) + open,
|
|
117
|
+
oldestStartedAtMs: Math.min(seen?.oldestStartedAtMs ?? oldest, oldest),
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
const verdicts = new Map();
|
|
121
|
+
const verdictOf = Effect.fnUntraced(function* (actorType, workflow, hash, manifest) {
|
|
122
|
+
const key = toJson([actorType, workflow.member.tag, hash]);
|
|
123
|
+
const known = verdicts.get(key);
|
|
124
|
+
if (known !== undefined)
|
|
125
|
+
return known;
|
|
126
|
+
const verdict = startVerdict({
|
|
127
|
+
declared: workflow.declared,
|
|
128
|
+
hash,
|
|
129
|
+
start: manifest === null ? undefined : yield* decodeStoredManifest(manifest).pipe(Effect.orDie),
|
|
130
|
+
newer: false,
|
|
131
|
+
});
|
|
132
|
+
verdicts.set(key, verdict);
|
|
133
|
+
return verdict;
|
|
134
|
+
});
|
|
135
|
+
const groups = yield* sql `SELECT x.actor_type, x.workflow, x.manifest_hash, m.manifest::text AS manifest,
|
|
136
|
+
count(*)::integer AS open, min(x.started_at_ms)::text AS oldest
|
|
137
|
+
FROM actor_workflow_executions x
|
|
138
|
+
LEFT JOIN actor_workflow_manifests m ON m.actor_type = x.actor_type AND m.workflow = x.workflow
|
|
139
|
+
AND m.manifest_hash = x.manifest_hash
|
|
140
|
+
WHERE x.status <> 'finished' AND ${scope}
|
|
141
|
+
GROUP BY x.actor_type, x.workflow, x.manifest_hash, m.manifest::text`;
|
|
142
|
+
for (const group of groups) {
|
|
143
|
+
const oldest = Number(group.oldest);
|
|
144
|
+
const workflows = current.get(group.actor_type);
|
|
145
|
+
if (workflows === undefined) {
|
|
146
|
+
add(group.actor_type, group.workflow, "actor type removed", group.open, oldest);
|
|
147
|
+
continue;
|
|
148
|
+
}
|
|
149
|
+
const workflow = workflows.get(group.workflow);
|
|
150
|
+
if (workflow === undefined) {
|
|
151
|
+
add(group.actor_type, group.workflow, "workflow removed", group.open, oldest);
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
const verdict = yield* verdictOf(group.actor_type, workflow, group.manifest_hash, group.manifest);
|
|
155
|
+
for (const problem of verdict.problems)
|
|
156
|
+
add(group.actor_type, group.workflow, problem, group.open, oldest);
|
|
157
|
+
}
|
|
158
|
+
const recorded = yield* sql `SELECT x.actor_type, x.workflow, x.manifest_hash, m.manifest::text AS manifest, s.step, s.kind,
|
|
159
|
+
CASE WHEN s.kind = 'version' THEN s.version END AS version,
|
|
160
|
+
count(DISTINCT x.execution_id)::integer AS open, min(x.started_at_ms)::text AS oldest
|
|
161
|
+
FROM actor_workflow_executions x
|
|
162
|
+
JOIN actor_workflow_step s ON s.routing_key = x.routing_key AND s.execution_id = x.execution_id
|
|
163
|
+
LEFT JOIN actor_workflow_manifests m ON m.actor_type = x.actor_type AND m.workflow = x.workflow
|
|
164
|
+
AND m.manifest_hash = x.manifest_hash
|
|
165
|
+
WHERE x.status <> 'finished' AND ${scope} AND (s.kind = 'version' OR s.exit IS NOT NULL)
|
|
166
|
+
GROUP BY x.actor_type, x.workflow, x.manifest_hash, m.manifest::text, s.step, s.kind,
|
|
167
|
+
CASE WHEN s.kind = 'version' THEN s.version END`;
|
|
168
|
+
for (const row of recorded) {
|
|
169
|
+
const workflow = current.get(row.actor_type)?.get(row.workflow);
|
|
170
|
+
if (workflow === undefined)
|
|
171
|
+
continue;
|
|
172
|
+
const oldest = Number(row.oldest);
|
|
173
|
+
const problems = row.kind === "version"
|
|
174
|
+
? markerProblem({
|
|
175
|
+
versions: workflow.member.versions,
|
|
176
|
+
name: row.step,
|
|
177
|
+
recorded: row.version,
|
|
178
|
+
})
|
|
179
|
+
: workflow.declared.steps.get(row.step)?.kind !== row.kind && row.manifest !== null
|
|
180
|
+
? []
|
|
181
|
+
: recordedStepProblem({
|
|
182
|
+
declared: workflow.declared,
|
|
183
|
+
step: row.step,
|
|
184
|
+
kind: row.kind,
|
|
185
|
+
settled: true,
|
|
186
|
+
changed: (yield* verdictOf(row.actor_type, workflow, row.manifest_hash, row.manifest))
|
|
187
|
+
.changed,
|
|
188
|
+
});
|
|
189
|
+
for (const problem of problems)
|
|
190
|
+
add(row.actor_type, row.workflow, problem, row.open, oldest);
|
|
191
|
+
}
|
|
192
|
+
for (const [actorType, workflows] of current)
|
|
193
|
+
for (const [tag, { member }] of workflows)
|
|
194
|
+
for (const name of Object.keys(member.versions)) {
|
|
195
|
+
const problems = markerProblem({ versions: member.versions, name, recorded: undefined });
|
|
196
|
+
if (problems.length === 0)
|
|
197
|
+
continue;
|
|
198
|
+
const [predating] = yield* sql `
|
|
199
|
+
SELECT count(*)::integer AS open, min(x.started_at_ms)::text AS oldest
|
|
200
|
+
FROM actor_workflow_executions x
|
|
201
|
+
WHERE x.actor_type = ${actorType} AND x.workflow = ${tag} AND x.status <> 'finished'
|
|
202
|
+
AND NOT EXISTS (SELECT 1 FROM actor_workflow_step s WHERE s.routing_key = x.routing_key
|
|
203
|
+
AND s.execution_id = x.execution_id AND s.kind = 'version' AND s.step = ${name})`;
|
|
204
|
+
if (predating !== undefined && predating.open > 0)
|
|
205
|
+
for (const problem of problems)
|
|
206
|
+
add(actorType, tag, problem, predating.open, Number(predating.oldest));
|
|
207
|
+
}
|
|
208
|
+
return [...found.values()].sort((left, right) => left.actorType.localeCompare(right.actorType) ||
|
|
209
|
+
left.workflow.localeCompare(right.workflow) ||
|
|
210
|
+
left.problem.localeCompare(right.problem));
|
|
211
|
+
});
|
|
212
|
+
/** `Order/Ship step "label" removed 412 open executions (oldest 2026-09-20T08:14:00.000Z)` */
|
|
213
|
+
export const formatIncompatibility = (incompatibility) => `${incompatibility.actorType}/${incompatibility.workflow} ${incompatibility.problem} ${incompatibility.open} open execution${incompatibility.open === 1 ? "" : "s"} (oldest ${DateTime.formatIso(DateTime.makeUnsafe(incompatibility.oldestStartedAtMs))})`;
|
|
214
|
+
/**
|
|
215
|
+
* The startup check for one actor type. It skips the comparison when each
|
|
216
|
+
* workflow's manifest is already the most recently accepted one, no accepted
|
|
217
|
+
* workflow is gone and no open execution started under another manifest; otherwise it compares, and a passing deployment
|
|
218
|
+
* becomes the most recently accepted one, so a rollback is compared again.
|
|
219
|
+
* `retained`: the actor type has workflows or workflow rows retention sweeps.
|
|
220
|
+
*
|
|
221
|
+
* A runner of an older deployment may have started executions since the last
|
|
222
|
+
* comparison, and a comparison that finds no open execution of a dropped workflow
|
|
223
|
+
* lets the deployment pass.
|
|
224
|
+
*/
|
|
225
|
+
export const acceptWorkflows = Effect.fnUntraced(function* (actor) {
|
|
226
|
+
const sql = yield* SqlClient.SqlClient;
|
|
227
|
+
if (actor.workflows.length === 0) {
|
|
228
|
+
const [history] = yield* sql `SELECT
|
|
229
|
+
EXISTS (SELECT 1 FROM actor_workflow_manifests WHERE actor_type = ${actor.name}) AS accepted,
|
|
230
|
+
EXISTS (SELECT 1 FROM actor_workflow_executions WHERE actor_type = ${actor.name}) AS executions`;
|
|
231
|
+
if (!history.accepted)
|
|
232
|
+
return { checked: false, incompatibilities: [], retained: history.executions };
|
|
233
|
+
}
|
|
234
|
+
return yield* coordinated({
|
|
235
|
+
resource: `akter/workflows/${actor.name}`,
|
|
236
|
+
work: Effect.gen(function* () {
|
|
237
|
+
const latest = yield* sql `
|
|
238
|
+
SELECT DISTINCT ON (workflow) workflow, manifest_hash FROM actor_workflow_manifests
|
|
239
|
+
WHERE actor_type = ${actor.name}
|
|
240
|
+
ORDER BY workflow, accepted_at_ms DESC, manifest_hash`;
|
|
241
|
+
const rows = [];
|
|
242
|
+
for (const member of actor.workflows) {
|
|
243
|
+
const { manifest, hash } = yield* manifestOf(actor.name, member);
|
|
244
|
+
rows.push({
|
|
245
|
+
actor_type: actor.name,
|
|
246
|
+
workflow: member.tag,
|
|
247
|
+
manifest_hash: hash,
|
|
248
|
+
manifest: toJson(manifest),
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
const unchanged = latest.length === rows.length &&
|
|
252
|
+
latest.every((row) => rows.some((current) => current.workflow === row.workflow && current.manifest_hash === row.manifest_hash));
|
|
253
|
+
const foreign = unchanged &&
|
|
254
|
+
(yield* sql `SELECT 1 FROM actor_workflow_executions x
|
|
255
|
+
WHERE x.actor_type = ${actor.name} AND x.status <> 'finished'
|
|
256
|
+
AND NOT EXISTS (SELECT 1 FROM jsonb_to_recordset(${toJson(rows)}::jsonb)
|
|
257
|
+
AS d (workflow text, manifest_hash text)
|
|
258
|
+
WHERE d.workflow = x.workflow AND d.manifest_hash = x.manifest_hash)
|
|
259
|
+
LIMIT 1`).length > 0;
|
|
260
|
+
if (unchanged && !foreign)
|
|
261
|
+
return { checked: false, incompatibilities: [], retained: true };
|
|
262
|
+
const incompatibilities = yield* findIncompatibilities([actor], { everyActorType: false });
|
|
263
|
+
if (incompatibilities.length > 0)
|
|
264
|
+
return { checked: true, incompatibilities, retained: true };
|
|
265
|
+
if (rows.length > 0)
|
|
266
|
+
yield* sql `INSERT INTO actor_workflow_manifests AS a (actor_type, workflow, manifest_hash, manifest, accepted_at_ms)
|
|
267
|
+
SELECT m.actor_type, m.workflow, m.manifest_hash, m.manifest::jsonb,
|
|
268
|
+
GREATEST(floor(extract(epoch FROM clock_timestamp()) * 1000)::bigint,
|
|
269
|
+
(SELECT max(l.accepted_at_ms) + 1 FROM actor_workflow_manifests l
|
|
270
|
+
WHERE l.actor_type = m.actor_type AND l.workflow = m.workflow))
|
|
271
|
+
FROM jsonb_to_recordset(${toJson(rows)}::jsonb)
|
|
272
|
+
AS m (actor_type text, workflow text, manifest_hash text, manifest text)
|
|
273
|
+
ON CONFLICT (actor_type, workflow, manifest_hash)
|
|
274
|
+
DO UPDATE SET accepted_at_ms = EXCLUDED.accepted_at_ms`;
|
|
275
|
+
yield* sql `DELETE FROM actor_workflow_manifests WHERE actor_type = ${actor.name}
|
|
276
|
+
AND workflow NOT IN (SELECT jsonb_array_elements_text(${toJson(rows.map((row) => row.workflow))}::jsonb))`;
|
|
277
|
+
return { checked: true, incompatibilities: [], retained: true };
|
|
278
|
+
}),
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
/**
|
|
282
|
+
* The deploy check `durable workflows check` runs: every actor type in the
|
|
283
|
+
* database against `actors`, in one read-only snapshot.
|
|
284
|
+
*/
|
|
285
|
+
export const checkWorkflows = (actors) => Effect.suspend(() => inReadOnlySnapshot(findIncompatibilities(actors.map(declaredOf), { everyActorType: true })));
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { Context, Crypto, Effect, Schema, Scope } from "effect";
|
|
2
|
+
import { SqlClient, SqlError } from "effect/sql";
|
|
3
|
+
import { type RegisteredCommand, type Registration } from "../members.ts";
|
|
4
|
+
import { Outcome, Request } from "../request.ts";
|
|
5
|
+
import { type ActorRef } from "../../identity/caller.ts";
|
|
6
|
+
import { type ActivationCache } from "../storage/generation.ts";
|
|
7
|
+
/** A running activity re-arms its execution's timer this far ahead, so a lost runner's work resumes. */
|
|
8
|
+
export declare const RECOVERY_MS = 30000;
|
|
9
|
+
/** The outbox timer key of an execution's recovery timer. */
|
|
10
|
+
export declare const timerKey: (executionId: string) => string;
|
|
11
|
+
/**
|
|
12
|
+
* The reserved commands a workflow member adds to its owner: the member's own
|
|
13
|
+
* start, a start staged as an intent, the relay's resume, and interrupt.
|
|
14
|
+
*
|
|
15
|
+
* Interrupting a finished or unknown execution changes nothing.
|
|
16
|
+
*/
|
|
17
|
+
export declare const workflowCommands: ({ registration, routingKeyOf, services, }: {
|
|
18
|
+
readonly registration: Pick<Registration, "workflows" | "placement">;
|
|
19
|
+
readonly routingKeyOf: (ref: ActorRef) => bigint;
|
|
20
|
+
readonly services: Context.Context<SqlClient.SqlClient | Crypto.Crypto>;
|
|
21
|
+
}) => ReadonlyMap<string, RegisteredCommand>;
|
|
22
|
+
/** The execution a successful workflow command names, if it names one. */
|
|
23
|
+
export declare const kickedExecution: ({ request, outcome, }: {
|
|
24
|
+
readonly request: Request;
|
|
25
|
+
readonly outcome: Outcome;
|
|
26
|
+
}) => Effect.Effect<{
|
|
27
|
+
executionId: string;
|
|
28
|
+
interrupt: boolean;
|
|
29
|
+
} | undefined, never, never>;
|
|
30
|
+
/** Decodes a finished execution's stored result. */
|
|
31
|
+
export declare const decodeResult: (bytes: Uint8Array) => Effect.Effect<{
|
|
32
|
+
readonly _tag: "Die";
|
|
33
|
+
readonly message: string;
|
|
34
|
+
} | {
|
|
35
|
+
readonly _tag: "Failure";
|
|
36
|
+
readonly error: Schema.Json;
|
|
37
|
+
} | {
|
|
38
|
+
readonly _tag: "Interrupt";
|
|
39
|
+
} | {
|
|
40
|
+
readonly _tag: "Success";
|
|
41
|
+
readonly value: Schema.Json;
|
|
42
|
+
}, never, never>;
|
|
43
|
+
/**
|
|
44
|
+
* Runs one activation's workflow executions. Postgres holds every step; the
|
|
45
|
+
* live fibers here only save a replay. Each write is a short transaction that
|
|
46
|
+
* first checks the activation still holds the owner's generation.
|
|
47
|
+
*
|
|
48
|
+
* Compatibility: a runner leaves an execution for a compatible one when it lacks
|
|
49
|
+
* the workflow, its markers exclude the execution's, it lacks a recorded step or a
|
|
50
|
+
* step of the start manifest, or it would decode a recorded result or the payload
|
|
51
|
+
* differently. Once this runner's result schemas apply to the steps still to
|
|
52
|
+
* settle, its manifest becomes the execution's start manifest; a `newer` manifest
|
|
53
|
+
* is one accepted after this runner's own, as when a newer deployment starts
|
|
54
|
+
* executions while this runner still serves.
|
|
55
|
+
*
|
|
56
|
+
* Replay: an interrupted execution replays to its first unsettled step and stops
|
|
57
|
+
* there, so the compensation finalizers of completed steps run before the
|
|
58
|
+
* interrupt is recorded. A replay of a parked execution counts as running until it parks or
|
|
59
|
+
* finishes, so inspection never reports a working run as suspended. A wake that
|
|
60
|
+
* arrived during a pass replays the run once more unless the pass left the
|
|
61
|
+
* execution for another runner or lost its generation, and a pass the engine
|
|
62
|
+
* stopped to replay always replays. A parking step waits, on the pass's idle
|
|
63
|
+
* signal, until every other step of the pass has parked or finished: a parked branch would
|
|
64
|
+
* otherwise interrupt concurrent branches mid-step, losing a sibling's clock, wait
|
|
65
|
+
* or activity work and possibly replaying forever. A race branch parked on a clock
|
|
66
|
+
* or wait that can now settle stops the run so its replay settles it, and a
|
|
67
|
+
* running sibling activity reruns under the same attempt. The relay consumed the
|
|
68
|
+
* recovery timer, so a still-running activity needs another.
|
|
69
|
+
*
|
|
70
|
+
* Steps: only the caller and tenant are inherited from the activation, because
|
|
71
|
+
* steps run inside the body's fiber whose caller and tenant are the execution's
|
|
72
|
+
* recorded ones. Effect's workflow instance names a workflow, and compensation
|
|
73
|
+
* never reads more of it. Rows are keyed by step and attempt, so each
|
|
74
|
+
* `Activity.retry` attempt is its own row with its own exit. The pending row is
|
|
75
|
+
* committed before an activity runs, so a rerun after a crash reuses its attempt
|
|
76
|
+
* and derived ids. A clock's due time is recorded once, so a replay never moves it.
|
|
77
|
+
* Step writes run inside the body's fiber, where a failed statement is a defect
|
|
78
|
+
* and the timer resumes. A wait's `where` runs outside any lock, and the fenced
|
|
79
|
+
* conditional settle makes a racing timeout or second run settle once. Holding the
|
|
80
|
+
* generation lock, a suspend finds any event committed after a wait's scan, so its
|
|
81
|
+
* wake survives.
|
|
82
|
+
*
|
|
83
|
+
* Compensation: `Workflow.withCompensation` and `Workflow.addFinalizer` register
|
|
84
|
+
* on the run's instance scope. Only a run that records a result closes it, and a
|
|
85
|
+
* replay registers them again, so they run once per execution.
|
|
86
|
+
*/
|
|
87
|
+
export declare const activationEngine: (options: {
|
|
88
|
+
readonly registration: Registration;
|
|
89
|
+
readonly ref: ActorRef;
|
|
90
|
+
readonly routingKey: bigint;
|
|
91
|
+
readonly cache: ActivationCache;
|
|
92
|
+
readonly scope: Scope.Scope;
|
|
93
|
+
readonly deliveryMs: number;
|
|
94
|
+
}) => Effect.Effect<{
|
|
95
|
+
kick: (executionId: string, interrupt: boolean) => Effect.Effect<void, never, never>;
|
|
96
|
+
live: () => number;
|
|
97
|
+
}, never, Crypto.Crypto | SqlClient.SqlClient>;
|
|
98
|
+
/**
|
|
99
|
+
* Re-arms the resume timer of every execution with a pending wait for one of
|
|
100
|
+
* `tags`, inside the emitting turn. The turn holds the owner's generation
|
|
101
|
+
* lock, which a wait's registration also takes, so no event is missed.
|
|
102
|
+
*/
|
|
103
|
+
export declare const notifyWaits: (routingKey: bigint, ref: {
|
|
104
|
+
readonly tenant: string;
|
|
105
|
+
readonly actor: string;
|
|
106
|
+
readonly id: string;
|
|
107
|
+
}, tags: readonly string[]) => Effect.Effect<boolean, SqlError.SqlError, Crypto.Crypto | SqlClient.SqlClient>;
|