@astrale-os/sdk 0.6.0-beta.4 → 0.6.0-beta.41
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 +191 -58
- package/dist/application/action/action.d.ts +6 -0
- package/dist/application/action/authoring.d.ts +1 -1
- package/dist/application/action/context.d.ts +47 -31
- package/dist/application/action/define.d.ts +3 -3
- package/dist/application/action/index.d.ts +1 -1
- package/dist/application/define.d.ts +8 -6
- package/dist/application/define.js +28 -14
- package/dist/application/dependency/index.d.ts +1 -1
- package/dist/application/dependency/invoker.d.ts +21 -10
- package/dist/application/domain.d.ts +30 -0
- package/dist/application/index.d.ts +4 -4
- package/dist/application/index.js +1 -1
- package/dist/application/integration/define.d.ts +8 -1
- package/dist/application/integration/index.d.ts +2 -2
- package/dist/application/integration/integration.d.ts +13 -1
- package/dist/application/integration/operation.d.ts +16 -3
- package/dist/application/mutation/authoring/properties.d.ts +5 -3
- package/dist/application/mutation/authoring/properties.js +35 -2
- package/dist/application/mutation/authoring/transition.js +4 -1
- package/dist/application/mutation/execution/execute.js +1 -1
- package/dist/application/mutation/failure.d.ts +6 -0
- package/dist/application/mutation/failure.js +24 -18
- package/dist/application/mutation/index.d.ts +1 -1
- package/dist/application/query/collection/union.js +11 -4
- package/dist/application/query/composite/plan.d.ts +0 -4
- package/dist/application/query/composite/plan.js +0 -2
- package/dist/application/query/conformance.d.ts +15 -0
- package/dist/application/query/conformance.js +46 -0
- package/dist/application/query/define.js +4 -3
- package/dist/application/query/execution/execute.d.ts +0 -1
- package/dist/application/query/execution/execute.js +7 -1
- package/dist/application/query/failure.d.ts +8 -0
- package/dist/application/query/failure.js +8 -0
- package/dist/application/query/index.d.ts +1 -1
- package/dist/application/query/index.js +1 -1
- package/dist/application/routes/admission.d.ts +2 -2
- package/dist/application/routes/admission.js +1 -1
- package/dist/application/routes/route.d.ts +2 -2
- package/dist/application/runtime/actions.js +3 -0
- package/dist/application/runtime/workflows.d.ts +3 -1
- package/dist/application/runtime/workflows.js +3 -4
- package/dist/application/view/define.js +4 -6
- package/dist/application/view/frontend.d.ts +2 -2
- package/dist/application/view/index.d.ts +1 -1
- package/dist/application/view/route.d.ts +0 -14
- package/dist/application/view/route.js +1 -64
- package/dist/application/workflow/authoring.d.ts +3 -2
- package/dist/application/workflow/context.d.ts +8 -2
- package/dist/application/workflow/define.d.ts +4 -4
- package/dist/application/workflow/define.js +14 -9
- package/dist/application/workflow/durable.d.ts +197 -0
- package/dist/application/workflow/index.d.ts +3 -2
- package/dist/application/workflow/runner/inline.js +3 -4
- package/dist/application/workflow/runner/runner.d.ts +2 -2
- package/dist/application/workflow/step/output.d.ts +2 -0
- package/dist/application/workflow/step/output.js +73 -0
- package/dist/application/workflow/workflow.d.ts +5 -3
- package/dist/deployment/adapter/adapter.d.ts +55 -13
- package/dist/deployment/adapter/bundle/bundle.d.ts +36 -0
- package/dist/deployment/adapter/bundle/file.d.ts +10 -0
- package/dist/deployment/adapter/bundle/index.d.ts +2 -0
- package/dist/deployment/adapter/define.d.ts +4 -3
- package/dist/deployment/adapter/define.js +107 -23
- package/dist/deployment/adapter/index.d.ts +4 -3
- package/dist/deployment/adapter/index.js +1 -0
- package/dist/deployment/adapter/release/command.d.ts +33 -0
- package/dist/deployment/adapter/release/context.d.ts +94 -0
- package/dist/deployment/adapter/release/index.d.ts +4 -0
- package/dist/deployment/adapter/release/index.js +1 -0
- package/dist/deployment/adapter/release/list.d.ts +53 -0
- package/dist/deployment/adapter/release/list.js +1 -0
- package/dist/deployment/adapter/release/refusal.d.ts +10 -0
- package/dist/deployment/adapter/release/refusal.js +14 -0
- package/dist/deployment/adapter/release/result.d.ts +56 -0
- package/dist/deployment/adapter/release/result.js +1 -0
- package/dist/deployment/address/configuration.d.ts +96 -0
- package/dist/deployment/address/configuration.js +274 -0
- package/dist/deployment/address/fingerprint.d.ts +5 -0
- package/dist/deployment/address/fingerprint.js +27 -0
- package/dist/deployment/address/index.d.ts +5 -0
- package/dist/deployment/address/index.js +4 -0
- package/dist/deployment/address/label.d.ts +42 -0
- package/dist/deployment/address/label.js +80 -0
- package/dist/deployment/address/line.d.ts +29 -0
- package/dist/deployment/address/line.js +53 -0
- package/dist/deployment/address/record.d.ts +73 -0
- package/dist/deployment/address/record.js +138 -0
- package/dist/deployment/address/summary.d.ts +30 -0
- package/dist/deployment/address/summary.js +1 -0
- package/dist/deployment/address/vectors.d.ts +60 -0
- package/dist/deployment/address/vectors.js +517 -0
- package/dist/deployment/authoring.d.ts +0 -2
- package/dist/deployment/authoring.js +0 -1
- package/dist/deployment/build/build.d.ts +8 -2
- package/dist/deployment/build/compile.d.ts +4 -4
- package/dist/deployment/build/compile.js +19 -17
- package/dist/deployment/build/frontend/compilation.d.ts +2 -4
- package/dist/deployment/build/frontend/compilation.js +0 -5
- package/dist/deployment/build/frontend/digest.js +1 -5
- package/dist/deployment/build/index.d.ts +1 -0
- package/dist/deployment/build/index.js +1 -0
- package/dist/deployment/build/manifest.d.ts +59 -0
- package/dist/deployment/build/manifest.js +118 -0
- package/dist/deployment/build/material.d.ts +2 -2
- package/dist/deployment/build/material.js +28 -13
- package/dist/deployment/build/schema.d.ts +2 -2
- package/dist/deployment/deployment.d.ts +3 -2
- package/dist/deployment/environment.d.ts +6 -0
- package/dist/deployment/environment.js +6 -0
- package/dist/deployment/index.d.ts +4 -6
- package/dist/deployment/index.js +1 -2
- package/dist/deployment/release/addressing.d.ts +6 -5
- package/dist/deployment/release/addressing.js +2 -3
- package/dist/deployment/release/assemble.d.ts +6 -3
- package/dist/deployment/release/assemble.js +12 -10
- package/dist/deployment/release/release.d.ts +16 -5
- package/dist/deployment/release/seal.d.ts +14 -0
- package/dist/deployment/release/seal.js +22 -0
- package/dist/deployment/release/{publication → served}/callables.d.ts +2 -2
- package/dist/deployment/release/{publication → served}/callables.js +2 -2
- package/dist/deployment/release/served/index.d.ts +11 -0
- package/dist/deployment/release/served/index.js +26 -0
- package/dist/deployment/release/{publication → served}/views.d.ts +2 -2
- package/dist/deployment/release/{publication → served}/views.js +0 -1
- package/dist/deployment/runtime/admission.d.ts +2 -2
- package/dist/deployment/runtime/admission.js +5 -5
- package/dist/deployment/verify/index.d.ts +3 -4
- package/dist/deployment/verify/index.js +2 -3
- package/dist/deployment/verify/preflight/bundle.d.ts +18 -0
- package/dist/deployment/verify/preflight/bundle.js +71 -0
- package/dist/deployment/verify/preflight/index.d.ts +1 -12
- package/dist/deployment/verify/preflight/index.js +1 -12
- package/dist/deployment/verify/readiness/fetch.d.ts +13 -0
- package/dist/deployment/verify/readiness/fetch.js +26 -0
- package/dist/deployment/verify/readiness/identity.d.ts +3 -6
- package/dist/deployment/verify/readiness/identity.js +3 -3
- package/dist/deployment/verify/readiness/index.d.ts +15 -8
- package/dist/deployment/verify/readiness/index.js +25 -6
- package/dist/deployment/verify/readiness/release.d.ts +8 -0
- package/dist/deployment/verify/readiness/release.js +22 -0
- package/dist/deployment/worker/address.d.ts +26 -0
- package/dist/deployment/worker/address.js +43 -0
- package/dist/deployment/worker/build.d.ts +60 -0
- package/dist/deployment/worker/build.js +172 -0
- package/dist/deployment/worker/configuration.d.ts +73 -0
- package/dist/deployment/worker/configuration.js +165 -0
- package/dist/deployment/worker/content.d.ts +38 -0
- package/dist/deployment/worker/content.js +169 -0
- package/dist/deployment/worker/index.d.ts +29 -0
- package/dist/deployment/worker/index.js +29 -0
- package/dist/deployment/worker/limits.d.ts +30 -0
- package/dist/deployment/worker/limits.js +30 -0
- package/dist/deployment/worker/record.d.ts +29 -0
- package/dist/deployment/worker/record.js +69 -0
- package/dist/deployment/worker/request.d.ts +118 -0
- package/dist/deployment/worker/request.js +280 -0
- package/dist/deployment/worker/response.d.ts +101 -0
- package/dist/deployment/worker/response.js +207 -0
- package/dist/execution/cache/cache.d.ts +17 -0
- package/dist/execution/cache/cache.js +11 -0
- package/dist/execution/cache/index.d.ts +2 -0
- package/dist/execution/cache/index.js +2 -0
- package/dist/execution/cache/memory.d.ts +13 -0
- package/dist/execution/cache/memory.js +48 -0
- package/dist/execution/identity/authentication.d.ts +33 -3
- package/dist/execution/identity/authentication.js +90 -36
- package/dist/execution/identity/callback.d.ts +20 -20
- package/dist/execution/identity/callback.js +34 -26
- package/dist/execution/identity/delivery.d.ts +6 -4
- package/dist/execution/identity/delivery.js +25 -20
- package/dist/execution/identity/identity.d.ts +17 -3
- package/dist/execution/identity/identity.js +12 -4
- package/dist/execution/identity/jwks.d.ts +5 -0
- package/dist/execution/identity/jwks.js +92 -102
- package/dist/execution/index.d.ts +6 -4
- package/dist/execution/index.js +4 -2
- package/dist/execution/invocation/admission/age.d.ts +57 -0
- package/dist/execution/invocation/admission/age.js +208 -0
- package/dist/execution/invocation/admission/authentication.d.ts +13 -13
- package/dist/execution/invocation/admission/authentication.js +52 -44
- package/dist/execution/invocation/admission/authority.d.ts +28 -6
- package/dist/execution/invocation/admission/authority.js +9 -2
- package/dist/execution/invocation/admission/index.d.ts +4 -3
- package/dist/execution/invocation/admission/index.js +3 -2
- package/dist/execution/invocation/admission/input.d.ts +2 -2
- package/dist/execution/invocation/admission/input.js +16 -2
- package/dist/execution/invocation/admission/target.d.ts +11 -0
- package/dist/execution/invocation/admission/target.js +22 -3
- package/dist/execution/invocation/capabilities/bind.d.ts +11 -0
- package/dist/execution/invocation/capabilities/bind.js +25 -0
- package/dist/execution/invocation/capabilities/index.d.ts +1 -0
- package/dist/execution/invocation/capabilities/index.js +1 -0
- package/dist/execution/invocation/dependency/bind.d.ts +3 -1
- package/dist/execution/invocation/dependency/bind.js +36 -16
- package/dist/execution/invocation/dispatch/context.d.ts +7 -6
- package/dist/execution/invocation/dispatch/context.js +11 -44
- package/dist/execution/invocation/dispatch/workflow.js +0 -4
- package/dist/execution/invocation/handler.js +8 -2
- package/dist/execution/invocation/index.d.ts +2 -2
- package/dist/execution/invocation/index.js +1 -1
- package/dist/execution/invocation/integration/authentication.d.ts +3 -3
- package/dist/execution/invocation/integration/authentication.js +7 -7
- package/dist/execution/invocation/integration/call.d.ts +2 -1
- package/dist/execution/invocation/integration/call.js +3 -3
- package/dist/execution/invocation/integration/clients.d.ts +1 -1
- package/dist/execution/invocation/integration/index.d.ts +1 -0
- package/dist/execution/invocation/integration/index.js +1 -0
- package/dist/execution/invocation/invocation.d.ts +6 -0
- package/dist/execution/invocation/invocation.js +129 -21
- package/dist/execution/invocation/lifecycle/active.d.ts +8 -2
- package/dist/execution/invocation/lifecycle/active.js +3 -3
- package/dist/execution/invocation/lifecycle/index.d.ts +1 -1
- package/dist/execution/invocation/result/errors.d.ts +0 -10
- package/dist/execution/invocation/result/errors.js +0 -17
- package/dist/execution/invocation/result/index.d.ts +2 -2
- package/dist/execution/invocation/result/index.js +1 -1
- package/dist/execution/invocation/result/project.js +41 -1
- package/dist/execution/node/serve.d.ts +2 -2
- package/dist/execution/node/serve.js +1 -1
- package/dist/execution/runtime/index.d.ts +1 -0
- package/dist/execution/runtime/index.js +1 -0
- package/dist/execution/runtime/load.d.ts +3 -3
- package/dist/execution/runtime/load.js +3 -2
- package/dist/execution/runtime/release.d.ts +17 -0
- package/dist/execution/runtime/release.js +7 -0
- package/dist/execution/serve.d.ts +18 -4
- package/dist/execution/serve.js +10 -0
- package/dist/execution/service/create.js +43 -7
- package/dist/execution/service/initialization.d.ts +4 -4
- package/dist/execution/service/initialization.js +23 -14
- package/dist/execution/service/release.d.ts +2 -2
- package/dist/execution/service/release.js +3 -2
- package/dist/execution/service/service.d.ts +20 -5
- package/dist/execution/service/serving/delivery.d.ts +5 -0
- package/dist/execution/service/{publication → serving}/delivery.js +4 -1
- package/dist/execution/service/{publication → serving}/index.d.ts +1 -1
- package/dist/execution/service/serving/installation.d.ts +4 -0
- package/dist/execution/service/serving/installation.js +9 -0
- package/dist/execution/service/serving/source.d.ts +11 -0
- package/dist/execution/service/serving/source.js +15 -0
- package/dist/execution/workflows/attempts.d.ts +87 -0
- package/dist/execution/workflows/attempts.js +205 -0
- package/dist/execution/workflows/discovery.d.ts +14 -0
- package/dist/execution/workflows/discovery.js +151 -0
- package/dist/execution/workflows/engine.d.ts +83 -0
- package/dist/execution/workflows/engine.js +1 -0
- package/dist/execution/workflows/envelope.d.ts +12 -0
- package/dist/execution/workflows/envelope.js +46 -0
- package/dist/execution/workflows/failure.d.ts +39 -0
- package/dist/execution/workflows/failure.js +143 -0
- package/dist/execution/workflows/index.d.ts +4 -0
- package/dist/execution/workflows/index.js +3 -0
- package/dist/execution/workflows/integrations.d.ts +13 -0
- package/dist/execution/workflows/integrations.js +25 -0
- package/dist/execution/workflows/options.d.ts +81 -0
- package/dist/execution/workflows/options.js +158 -0
- package/dist/execution/workflows/receiver.d.ts +24 -0
- package/dist/execution/workflows/receiver.js +99 -0
- package/dist/execution/workflows/route.d.ts +12 -0
- package/dist/execution/workflows/route.js +35 -0
- package/dist/execution/workflows/run.d.ts +23 -0
- package/dist/execution/workflows/run.js +365 -0
- package/dist/execution/workflows/steps.d.ts +48 -0
- package/dist/execution/workflows/steps.js +93 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/platform/graph/alias.d.ts +1 -5
- package/dist/platform/graph/alias.js +1 -5
- package/dist/platform/graph/document/index.d.ts +1 -1
- package/dist/platform/graph/document/index.js +1 -1
- package/dist/platform/graph/index.d.ts +1 -1
- package/dist/platform/graph/index.js +1 -1
- package/dist/platform/release/index.d.ts +2 -0
- package/dist/platform/release/index.js +2 -0
- package/dist/platform/schema/callable-authoring.d.ts +21 -0
- package/dist/platform/schema/callable-authoring.js +27 -0
- package/dist/platform/schema/class-authoring.d.ts +61 -11
- package/dist/platform/schema/class-authoring.js +37 -4
- package/dist/platform/schema/class-icon-svg.d.ts +9 -0
- package/dist/platform/schema/class-icon-svg.js +29 -0
- package/dist/platform/schema/class-icon.d.ts +3 -8
- package/dist/platform/schema/class-icon.js +2 -29
- package/dist/platform/schema/index.d.ts +6 -4
- package/dist/platform/schema/index.js +2 -1
- package/dist/platform/schema/property.d.ts +5 -0
- package/dist/platform/schema/schema-authoring.d.ts +14 -7
- package/dist/platform/schema/schema-authoring.js +5 -1
- package/dist/platform/versioning/dependents.d.ts +18 -0
- package/dist/platform/versioning/dependents.js +15 -0
- package/dist/platform/versioning/index.d.ts +5 -0
- package/dist/platform/versioning/index.js +5 -0
- package/dist/platform/versioning/name.d.ts +38 -0
- package/dist/platform/versioning/name.js +58 -0
- package/dist/platform/versioning/reference.d.ts +48 -0
- package/dist/platform/versioning/reference.js +95 -0
- package/dist/platform/versioning/version.d.ts +72 -0
- package/dist/platform/versioning/version.js +98 -0
- package/dist/project/admit.js +1 -5
- package/dist/project/define.d.ts +4 -4
- package/dist/project/define.js +55 -35
- package/dist/project/index.d.ts +1 -1
- package/dist/project/install-command.d.ts +6 -0
- package/dist/project/install-command.js +9 -0
- package/dist/project/project.d.ts +10 -8
- package/dist/testing/dataset/define.d.ts +1 -1
- package/dist/testing/durable/engine.d.ts +128 -0
- package/dist/testing/durable/engine.js +619 -0
- package/dist/testing/durable/index.d.ts +3 -0
- package/dist/testing/durable/index.js +1 -0
- package/dist/testing/durable/steps.d.ts +30 -0
- package/dist/testing/durable/steps.js +45 -0
- package/dist/testing/index.d.ts +6 -1
- package/dist/testing/index.js +5 -1
- package/dist/testing/load.js +1 -1
- package/dist/tooling/cli/adapter-command.d.ts +35 -0
- package/dist/tooling/cli/adapter-command.js +66 -0
- package/dist/tooling/cli/arguments.d.ts +17 -6
- package/dist/tooling/cli/arguments.js +175 -52
- package/dist/tooling/cli/build.d.ts +55 -0
- package/dist/tooling/cli/build.js +77 -0
- package/dist/tooling/cli/bun.d.ts +0 -1
- package/dist/tooling/cli/bun.js +0 -7
- package/dist/tooling/cli/commit.d.ts +35 -0
- package/dist/tooling/cli/commit.js +235 -0
- package/dist/tooling/cli/deploy-mode.d.ts +26 -0
- package/dist/tooling/cli/deploy-mode.js +59 -0
- package/dist/tooling/cli/deploy-result.d.ts +80 -0
- package/dist/tooling/cli/deploy-result.js +64 -0
- package/dist/tooling/cli/diff/declared.d.ts +7 -0
- package/dist/tooling/cli/diff/declared.js +27 -0
- package/dist/tooling/cli/diff/index.d.ts +30 -0
- package/dist/tooling/cli/diff/index.js +58 -0
- package/dist/tooling/cli/diff/render.d.ts +15 -0
- package/dist/tooling/cli/diff/render.js +131 -0
- package/dist/tooling/cli/diff/report.d.ts +88 -0
- package/dist/tooling/cli/diff/report.js +154 -0
- package/dist/tooling/cli/dotenv.d.ts +5 -5
- package/dist/tooling/cli/dotenv.js +6 -36
- package/dist/tooling/cli/help.js +173 -60
- package/dist/tooling/cli/immutable-deployment.d.ts +83 -0
- package/dist/tooling/cli/immutable-deployment.js +135 -0
- package/dist/tooling/cli/index.d.ts +12 -4
- package/dist/tooling/cli/index.js +6 -3
- package/dist/tooling/cli/installed-on.d.ts +83 -0
- package/dist/tooling/cli/installed-on.js +156 -0
- package/dist/tooling/cli/list.d.ts +152 -0
- package/dist/tooling/cli/list.js +331 -0
- package/dist/tooling/cli/log.d.ts +5 -2
- package/dist/tooling/cli/log.js +9 -2
- package/dist/tooling/cli/orchestrate.d.ts +0 -6
- package/dist/tooling/cli/orchestrate.js +246 -90
- package/dist/tooling/cli/project.d.ts +3 -3
- package/dist/tooling/cli/publish/index.d.ts +81 -0
- package/dist/tooling/cli/publish/index.js +383 -0
- package/dist/tooling/cli/publish/report.d.ts +49 -0
- package/dist/tooling/cli/publish/report.js +15 -0
- package/dist/tooling/cli/registry/client.d.ts +121 -0
- package/dist/tooling/cli/registry/client.js +354 -0
- package/dist/tooling/cli/registry/error.d.ts +11 -0
- package/dist/tooling/cli/registry/error.js +17 -0
- package/dist/tooling/cli/registry/executable.d.ts +35 -0
- package/dist/tooling/cli/registry/executable.js +96 -0
- package/dist/tooling/cli/registry/index.d.ts +9 -0
- package/dist/tooling/cli/registry/index.js +8 -0
- package/dist/tooling/cli/registry/installations.d.ts +67 -0
- package/dist/tooling/cli/registry/installations.js +108 -0
- package/dist/tooling/cli/registry/process.d.ts +36 -0
- package/dist/tooling/cli/registry/process.js +119 -0
- package/dist/tooling/cli/secrets.d.ts +9 -0
- package/dist/tooling/cli/secrets.js +19 -0
- package/dist/tooling/cli/yank.d.ts +34 -0
- package/dist/tooling/cli/yank.js +32 -0
- package/dist/tooling/linter/adapters/typescript/imports.d.ts +0 -1
- package/dist/tooling/linter/adapters/typescript/imports.js +1 -5
- package/dist/tooling/linter/adapters/typescript/index.d.ts +1 -1
- package/dist/tooling/linter/adapters/typescript/index.js +1 -1
- package/dist/tooling/linter/adapters/typescript/syntax.d.ts +3 -3
- package/dist/tooling/linter/adapters/typescript/syntax.js +13 -25
- package/dist/tooling/linter/implementations/source/callable-requirements.d.ts +1 -2
- package/dist/tooling/linter/implementations/source/callable-requirements.js +11 -16
- package/dist/tooling/linter/implementations/source/dependencies.js +13 -72
- package/dist/tooling/linter/implementations/source/global.js +1 -2
- package/dist/tooling/linter/implementations/source/mutations.js +18 -29
- package/dist/tooling/linter/implementations/source/providers.js +5 -5
- package/dist/tooling/linter/implementations/source/queries.js +1 -17
- package/dist/tooling/linter/implementations/source/shared.d.ts +12 -4
- package/dist/tooling/linter/implementations/source/shared.js +101 -46
- package/dist/tooling/linter/implementations/source/verifiers.js +0 -2
- package/dist/tooling/linter/implementations/source/views.js +2 -2
- package/dist/tooling/linter/implementations/source/workflows.js +499 -17
- package/dist/tooling/linter/policy/generated.js +14 -63
- package/dist/tooling/linter/requirements/registry.js +6 -8
- package/dist/tooling/packaging/declarations/ownership.js +1 -1
- package/dist/tooling/packaging/finalize.d.ts +1 -1
- package/dist/tooling/packaging/finalize.js +1 -1
- package/docs/admission-age.md +88 -0
- package/docs/auth-api-migration.md +55 -0
- package/docs/business-errors.md +42 -0
- package/docs/domain-definition-migration.md +44 -0
- package/docs/domain-schema-migration.md +36 -0
- package/docs/durable-workflows.md +445 -0
- package/docs/handler-dependencies.md +213 -0
- package/docs/release.md +155 -0
- package/docs/schema-cost.md +124 -0
- package/package.json +45 -16
- package/dist/application/application.d.ts +0 -28
- package/dist/application/query/execution/projection.d.ts +0 -3
- package/dist/application/query/execution/projection.js +0 -3
- package/dist/deployment/adapter/deploy/context.d.ts +0 -15
- package/dist/deployment/adapter/deploy/index.d.ts +0 -2
- package/dist/deployment/adapter/deploy/result.d.ts +0 -50
- package/dist/deployment/adapter/prepare/artifact.d.ts +0 -33
- package/dist/deployment/adapter/prepare/context.d.ts +0 -23
- package/dist/deployment/adapter/prepare/index.d.ts +0 -2
- package/dist/deployment/deploy.d.ts +0 -20
- package/dist/deployment/deploy.js +0 -31
- package/dist/deployment/release/publication/index.d.ts +0 -6
- package/dist/deployment/release/publication/index.js +0 -6
- package/dist/deployment/release/publication/manifest.d.ts +0 -3
- package/dist/deployment/release/publication/manifest.js +0 -5
- package/dist/deployment/release/publication/requirements.d.ts +0 -3
- package/dist/deployment/release/publication/requirements.js +0 -3
- package/dist/deployment/release/publication/seal.d.ts +0 -10
- package/dist/deployment/release/publication/seal.js +0 -39
- package/dist/deployment/verify/preflight/artifact.d.ts +0 -6
- package/dist/deployment/verify/preflight/artifact.js +0 -122
- package/dist/deployment/verify/preflight/publication.d.ts +0 -4
- package/dist/deployment/verify/preflight/publication.js +0 -14
- package/dist/deployment/verify/readiness/deployment.d.ts +0 -3
- package/dist/deployment/verify/readiness/deployment.js +0 -151
- package/dist/deployment/verify/readiness/publication.d.ts +0 -11
- package/dist/deployment/verify/readiness/publication.js +0 -41
- package/dist/execution/service/errors.d.ts +0 -3
- package/dist/execution/service/errors.js +0 -3
- package/dist/execution/service/publication/delivery.d.ts +0 -2
- package/dist/execution/service/publication/installation.d.ts +0 -3
- package/dist/execution/service/publication/installation.js +0 -8
- package/dist/execution/service/publication/source.d.ts +0 -3
- package/dist/execution/service/publication/source.js +0 -11
- package/dist/platform/publication/index.d.ts +0 -2
- package/dist/platform/publication/index.js +0 -2
- package/dist/tooling/cli/astrale/authority.d.ts +0 -5
- package/dist/tooling/cli/astrale/authority.js +0 -11
- package/dist/tooling/cli/astrale/executable.d.ts +0 -2
- package/dist/tooling/cli/astrale/executable.js +0 -47
- package/dist/tooling/cli/astrale/failure.d.ts +0 -6
- package/dist/tooling/cli/astrale/failure.js +0 -48
- package/dist/tooling/cli/astrale/instance.d.ts +0 -11
- package/dist/tooling/cli/astrale/instance.js +0 -52
- package/dist/tooling/cli/astrale/process.d.ts +0 -13
- package/dist/tooling/cli/astrale/process.js +0 -94
- package/dist/tooling/cli/astrale/version.d.ts +0 -18
- package/dist/tooling/cli/astrale/version.js +0 -55
- package/dist/tooling/cli/credential.d.ts +0 -2
- package/dist/tooling/cli/credential.js +0 -57
- package/dist/tooling/cli/deprecations.d.ts +0 -9
- package/dist/tooling/cli/deprecations.js +0 -15
- package/dist/tooling/cli/development/candidate.d.ts +0 -25
- package/dist/tooling/cli/development/candidate.js +0 -176
- package/dist/tooling/cli/development/deployment.d.ts +0 -16
- package/dist/tooling/cli/development/deployment.js +0 -39
- package/dist/tooling/cli/development/develop.d.ts +0 -11
- package/dist/tooling/cli/development/develop.js +0 -243
- package/dist/tooling/cli/development/lease.d.ts +0 -18
- package/dist/tooling/cli/development/lease.js +0 -163
- package/dist/tooling/cli/development/lifecycle.d.ts +0 -9
- package/dist/tooling/cli/development/lifecycle.js +0 -43
- package/dist/tooling/cli/development/project-imports.d.ts +0 -22
- package/dist/tooling/cli/development/project-imports.js +0 -39
- package/dist/tooling/cli/development/project-lock.d.ts +0 -16
- package/dist/tooling/cli/development/project-lock.js +0 -41
- package/dist/tooling/cli/development/rebuild.d.ts +0 -13
- package/dist/tooling/cli/development/rebuild.js +0 -58
- package/dist/tooling/cli/development/release-evidence.d.ts +0 -4
- package/dist/tooling/cli/development/release-evidence.js +0 -10
- package/dist/tooling/cli/development/report.d.ts +0 -6
- package/dist/tooling/cli/development/report.js +0 -14
- package/dist/tooling/cli/development/session-file.d.ts +0 -53
- package/dist/tooling/cli/development/session-file.js +0 -337
- package/dist/tooling/cli/development/source-watch.d.ts +0 -14
- package/dist/tooling/cli/development/source-watch.js +0 -140
- package/dist/tooling/cli/development/sources.d.ts +0 -7
- package/dist/tooling/cli/development/sources.js +0 -48
- package/dist/tooling/cli/development/target-lock.d.ts +0 -16
- package/dist/tooling/cli/development/target-lock.js +0 -68
- package/dist/tooling/cli/development/view.d.ts +0 -28
- package/dist/tooling/cli/development/view.js +0 -151
- package/dist/tooling/cli/environment-release.d.ts +0 -21
- package/dist/tooling/cli/environment-release.js +0 -46
- package/dist/tooling/cli/evidence.d.ts +0 -11
- package/dist/tooling/cli/evidence.js +0 -53
- package/dist/tooling/cli/installation/index.d.ts +0 -2
- package/dist/tooling/cli/installation/index.js +0 -1
- package/dist/tooling/cli/installation/observation.d.ts +0 -10
- package/dist/tooling/cli/installation/observation.js +0 -44
- package/dist/tooling/cli/installation/reconcile.d.ts +0 -32
- package/dist/tooling/cli/installation/reconcile.js +0 -122
- package/dist/tooling/linter/implementations/source/migrations.d.ts +0 -2
- package/dist/tooling/linter/implementations/source/migrations.js +0 -113
- package/dist/tooling/linter/qualification/index.d.ts +0 -10
- package/dist/tooling/linter/qualification/index.js +0 -2
- package/dist/tooling/linter/qualification/query-fixtures.d.ts +0 -2
- package/dist/tooling/linter/qualification/query-fixtures.js +0 -68
- package/dist/tooling/linter/qualification/runner.d.ts +0 -3
- package/dist/tooling/linter/qualification/runner.js +0 -6
- /package/dist/application/{application.js → domain.js} +0 -0
- /package/dist/{deployment/adapter/deploy/context.js → application/workflow/durable.js} +0 -0
- /package/dist/deployment/adapter/{deploy/index.js → bundle/bundle.js} +0 -0
- /package/dist/deployment/adapter/{deploy/result.js → bundle/file.js} +0 -0
- /package/dist/deployment/adapter/{prepare → bundle}/index.js +0 -0
- /package/dist/deployment/adapter/{prepare/artifact.js → release/command.js} +0 -0
- /package/dist/deployment/adapter/{prepare → release}/context.js +0 -0
- /package/dist/deployment/release/{publication → served}/routes.d.ts +0 -0
- /package/dist/deployment/release/{publication → served}/routes.js +0 -0
- /package/dist/execution/service/{publication → serving}/index.js +0 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { WorkerRecord, WorkerRecordWireV1 } from './record.js';
|
|
2
|
+
/** Where a Worker host addresses Services and deployments. */
|
|
3
|
+
export interface WorkerHostingV1 {
|
|
4
|
+
/**
|
|
5
|
+
* The DNS name every URL ends with: `https://<service>.<routingDomain>` serves a Service's
|
|
6
|
+
* current deployment, `https://<label>.<routingDomain>` one deployment.
|
|
7
|
+
*/
|
|
8
|
+
readonly routingDomain: string;
|
|
9
|
+
}
|
|
10
|
+
/** What a host lists: the deployments of the caller's Services, optionally of one project or environment. */
|
|
11
|
+
export interface WorkerDeploymentListRequestV1 {
|
|
12
|
+
readonly project?: string;
|
|
13
|
+
readonly environment?: string;
|
|
14
|
+
}
|
|
15
|
+
/** The lifecycle of one deployment at its host. */
|
|
16
|
+
export type WorkerDeploymentState = 'deploying' | 'active' | 'retiring' | 'retired' | 'failed';
|
|
17
|
+
/**
|
|
18
|
+
* What a host knows of one deployment. It names a deployment by its label and URL, never by a
|
|
19
|
+
* provider version. A host keeps every deployment until it is retired: it has no preview, expiry or
|
|
20
|
+
* last call.
|
|
21
|
+
*/
|
|
22
|
+
export interface WorkerDeploymentSummaryV1 {
|
|
23
|
+
/** The host's id of the deployment (a node id on Admin's Services). */
|
|
24
|
+
readonly id: string;
|
|
25
|
+
readonly url: string;
|
|
26
|
+
readonly label: string;
|
|
27
|
+
/** The host's id of the Service this deployment is a version of. */
|
|
28
|
+
readonly serviceId: string;
|
|
29
|
+
/** The name of that Service: the first part of the label. */
|
|
30
|
+
readonly service: string;
|
|
31
|
+
readonly project: string;
|
|
32
|
+
readonly environment: string;
|
|
33
|
+
/** Who owns the Service (an Identity node path on Admin's Services). */
|
|
34
|
+
readonly owner: string;
|
|
35
|
+
readonly state: WorkerDeploymentState;
|
|
36
|
+
/** Whether the Service's stable URL serves this deployment. */
|
|
37
|
+
readonly current: boolean;
|
|
38
|
+
readonly createdAt: string;
|
|
39
|
+
/** When its retirement began; present once it is `retiring`. */
|
|
40
|
+
readonly retiredAt?: string;
|
|
41
|
+
readonly buildDigest: string;
|
|
42
|
+
/** The digest of its `WorkerConfigurationV1`. */
|
|
43
|
+
readonly configuration: string;
|
|
44
|
+
/** The RFC 7638 thumbprint of its key, when its configuration asked for a signing identity. */
|
|
45
|
+
readonly signingKeyId?: string;
|
|
46
|
+
/** The record it serves, when its configuration asked for one. */
|
|
47
|
+
readonly record?: WorkerRecordWireV1;
|
|
48
|
+
}
|
|
49
|
+
/** One summary with its record decoded. */
|
|
50
|
+
export type WorkerDeploymentSummary = Omit<WorkerDeploymentSummaryV1, 'record'> & {
|
|
51
|
+
readonly record?: WorkerRecord;
|
|
52
|
+
};
|
|
53
|
+
/** Why a host refused to host one Worker release. A refusal changed nothing (see each reason). */
|
|
54
|
+
export type WorkerDeploymentRejectionReason = 'invalid-deployment' | 'address-mismatch' | 'build-mismatch' | 'service-owned-elsewhere' | 'deployment-conflict' | 'deployment-retired' | 'hosting-unavailable' | 'service-unavailable';
|
|
55
|
+
export declare const WORKER_DEPLOYMENT_REJECTIONS: readonly WorkerDeploymentRejectionReason[];
|
|
56
|
+
/**
|
|
57
|
+
* `WorkerDeploymentResponseV1`: a deployment `created` with the request's secrets `bound` to it,
|
|
58
|
+
* or `reused` with its declared secrets rewritten in place (`updated`) or left `unchanged`, or a
|
|
59
|
+
* refusal. A refusal changed nothing, except that a `service-unavailable` may follow effects (a
|
|
60
|
+
* creation that lost its lease after uploading, an in-place rewrite that wrote part of the
|
|
61
|
+
* values): rerunning the same deploy converges.
|
|
62
|
+
*/
|
|
63
|
+
export type WorkerDeploymentResponseV1 = {
|
|
64
|
+
readonly kind: 'deployed';
|
|
65
|
+
readonly state: 'created' | 'reused';
|
|
66
|
+
readonly secrets: {
|
|
67
|
+
readonly state: 'bound' | 'updated' | 'unchanged';
|
|
68
|
+
};
|
|
69
|
+
readonly deployment: WorkerDeploymentSummaryV1;
|
|
70
|
+
} | WorkerDeploymentRejection;
|
|
71
|
+
export interface WorkerDeploymentRejection {
|
|
72
|
+
readonly kind: 'rejected';
|
|
73
|
+
readonly reason: WorkerDeploymentRejectionReason;
|
|
74
|
+
readonly message: string;
|
|
75
|
+
/** When a retry may succeed, for a refusal that only waits on another operation. */
|
|
76
|
+
readonly retryAfter?: string;
|
|
77
|
+
}
|
|
78
|
+
/** One decoded answer of a deploy. */
|
|
79
|
+
export type WorkerDeploymentResult = {
|
|
80
|
+
readonly kind: 'deployed';
|
|
81
|
+
readonly state: 'created' | 'reused';
|
|
82
|
+
readonly secrets: {
|
|
83
|
+
readonly state: 'bound' | 'updated' | 'unchanged';
|
|
84
|
+
};
|
|
85
|
+
readonly deployment: WorkerDeploymentSummary;
|
|
86
|
+
} | WorkerDeploymentRejection;
|
|
87
|
+
/** Admit the answer of a host's `hosting`: exactly its routing domain. */
|
|
88
|
+
export declare function decodeWorkerHosting(input: unknown): WorkerHostingV1;
|
|
89
|
+
/**
|
|
90
|
+
* Admit the answer of a deploy exactly: a deployment whose state reports the secret state it
|
|
91
|
+
* pairs with, or a refusal a host can give.
|
|
92
|
+
*/
|
|
93
|
+
export declare function decodeWorkerDeploymentResponse(input: unknown): WorkerDeploymentResult;
|
|
94
|
+
/** Admit the answer of a host's `list`: the summaries of the caller's deployments, in its order. */
|
|
95
|
+
export declare function decodeWorkerDeploymentList(input: unknown): readonly WorkerDeploymentSummary[];
|
|
96
|
+
/**
|
|
97
|
+
* Admit one summary exactly: node ids and names a person can read, a label whose first part is
|
|
98
|
+
* the Service's name, the URL of that label, a known state, instants, digests, and a record that
|
|
99
|
+
* decodes.
|
|
100
|
+
*/
|
|
101
|
+
export declare function decodeWorkerDeploymentSummary(input: unknown): WorkerDeploymentSummary;
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { parseDeploymentLabel } from '../address/label.js';
|
|
2
|
+
import { serviceName } from './address.js';
|
|
3
|
+
import { decodeWorkerRecord } from './record.js';
|
|
4
|
+
export const WORKER_DEPLOYMENT_REJECTIONS = Object.freeze([
|
|
5
|
+
'invalid-deployment',
|
|
6
|
+
'address-mismatch',
|
|
7
|
+
'build-mismatch',
|
|
8
|
+
'service-owned-elsewhere',
|
|
9
|
+
'deployment-conflict',
|
|
10
|
+
'deployment-retired',
|
|
11
|
+
'hosting-unavailable',
|
|
12
|
+
'service-unavailable',
|
|
13
|
+
]);
|
|
14
|
+
const STATES = Object.freeze([
|
|
15
|
+
'deploying',
|
|
16
|
+
'active',
|
|
17
|
+
'retiring',
|
|
18
|
+
'retired',
|
|
19
|
+
'failed',
|
|
20
|
+
]);
|
|
21
|
+
/** Which secret states each deployment state reports. */
|
|
22
|
+
const SECRETS_BY_STATE = Object.freeze({
|
|
23
|
+
created: Object.freeze(['bound']),
|
|
24
|
+
reused: Object.freeze(['updated', 'unchanged']),
|
|
25
|
+
});
|
|
26
|
+
/** Admit the answer of a host's `hosting`: exactly its routing domain. */
|
|
27
|
+
export function decodeWorkerHosting(input) {
|
|
28
|
+
const value = exact(input, ['routingDomain'], [], 'hosting');
|
|
29
|
+
if (typeof value.routingDomain !== 'string' || !isDnsName(value.routingDomain)) {
|
|
30
|
+
invalid('hosting', 'routingDomain');
|
|
31
|
+
}
|
|
32
|
+
return Object.freeze({ routingDomain: value.routingDomain });
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Admit the answer of a deploy exactly: a deployment whose state reports the secret state it
|
|
36
|
+
* pairs with, or a refusal a host can give.
|
|
37
|
+
*/
|
|
38
|
+
export function decodeWorkerDeploymentResponse(input) {
|
|
39
|
+
const value = exact(input, ['kind'], ['state', 'secrets', 'deployment', 'reason', 'message', 'retryAfter'], 'deploy');
|
|
40
|
+
if (value.kind === 'rejected') {
|
|
41
|
+
exact(value, ['kind', 'reason', 'message'], ['retryAfter'], 'refusal');
|
|
42
|
+
if (!WORKER_DEPLOYMENT_REJECTIONS.includes(value.reason)) {
|
|
43
|
+
invalid('refusal', 'reason');
|
|
44
|
+
}
|
|
45
|
+
if (typeof value.message !== 'string' ||
|
|
46
|
+
value.message.length < 1 ||
|
|
47
|
+
value.message.length > 500) {
|
|
48
|
+
invalid('refusal', 'message');
|
|
49
|
+
}
|
|
50
|
+
if (value.retryAfter !== undefined && !isInstant(value.retryAfter)) {
|
|
51
|
+
invalid('refusal', 'retryAfter');
|
|
52
|
+
}
|
|
53
|
+
return Object.freeze({
|
|
54
|
+
kind: 'rejected',
|
|
55
|
+
reason: value.reason,
|
|
56
|
+
message: value.message,
|
|
57
|
+
...(value.retryAfter === undefined ? {} : { retryAfter: value.retryAfter }),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
exact(value, ['kind', 'state', 'secrets', 'deployment'], [], 'deploy');
|
|
61
|
+
if (value.kind !== 'deployed')
|
|
62
|
+
invalid('deploy', 'kind');
|
|
63
|
+
if (value.state !== 'created' && value.state !== 'reused')
|
|
64
|
+
invalid('deploy', 'state');
|
|
65
|
+
const secrets = exact(value.secrets, ['state'], [], 'secrets');
|
|
66
|
+
const allowed = SECRETS_BY_STATE[value.state];
|
|
67
|
+
if (typeof secrets.state !== 'string' || !allowed.includes(secrets.state)) {
|
|
68
|
+
invalid('deploy', 'secrets.state');
|
|
69
|
+
}
|
|
70
|
+
return Object.freeze({
|
|
71
|
+
kind: 'deployed',
|
|
72
|
+
state: value.state,
|
|
73
|
+
secrets: Object.freeze({ state: secrets.state }),
|
|
74
|
+
deployment: decodeWorkerDeploymentSummary(value.deployment),
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
/** Admit the answer of a host's `list`: the summaries of the caller's deployments, in its order. */
|
|
78
|
+
export function decodeWorkerDeploymentList(input) {
|
|
79
|
+
const value = exact(input, ['deployments'], [], 'list');
|
|
80
|
+
if (!Array.isArray(value.deployments))
|
|
81
|
+
invalid('list', 'deployments');
|
|
82
|
+
return Object.freeze(value.deployments.map((deployment) => decodeWorkerDeploymentSummary(deployment)));
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Admit one summary exactly: node ids and names a person can read, a label whose first part is
|
|
86
|
+
* the Service's name, the URL of that label, a known state, instants, digests, and a record that
|
|
87
|
+
* decodes.
|
|
88
|
+
*/
|
|
89
|
+
export function decodeWorkerDeploymentSummary(input) {
|
|
90
|
+
const value = exact(input, [
|
|
91
|
+
'id',
|
|
92
|
+
'url',
|
|
93
|
+
'label',
|
|
94
|
+
'serviceId',
|
|
95
|
+
'service',
|
|
96
|
+
'project',
|
|
97
|
+
'environment',
|
|
98
|
+
'owner',
|
|
99
|
+
'state',
|
|
100
|
+
'current',
|
|
101
|
+
'createdAt',
|
|
102
|
+
'buildDigest',
|
|
103
|
+
'configuration',
|
|
104
|
+
], ['retiredAt', 'signingKeyId', 'record'], 'deployment');
|
|
105
|
+
for (const key of [
|
|
106
|
+
'id',
|
|
107
|
+
'url',
|
|
108
|
+
'label',
|
|
109
|
+
'serviceId',
|
|
110
|
+
'service',
|
|
111
|
+
'project',
|
|
112
|
+
'environment',
|
|
113
|
+
'owner',
|
|
114
|
+
]) {
|
|
115
|
+
if (typeof value[key] !== 'string' || !isPrintable(value[key]))
|
|
116
|
+
invalid('deployment', key);
|
|
117
|
+
}
|
|
118
|
+
if (value.signingKeyId !== undefined) {
|
|
119
|
+
if (typeof value.signingKeyId !== 'string' || !isPrintable(value.signingKeyId)) {
|
|
120
|
+
invalid('deployment', 'signingKeyId');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
let line;
|
|
124
|
+
try {
|
|
125
|
+
line = parseDeploymentLabel(value.label).line;
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
invalid('deployment', 'label');
|
|
129
|
+
}
|
|
130
|
+
if (value.service !== line)
|
|
131
|
+
invalid('deployment', 'service');
|
|
132
|
+
let named;
|
|
133
|
+
try {
|
|
134
|
+
named = serviceName(value.project, value.environment);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
invalid('deployment', 'project');
|
|
138
|
+
}
|
|
139
|
+
if (named !== line)
|
|
140
|
+
invalid('deployment', 'service');
|
|
141
|
+
if (!isDeploymentUrl(value.url, value.label))
|
|
142
|
+
invalid('deployment', 'url');
|
|
143
|
+
if (!STATES.includes(value.state))
|
|
144
|
+
invalid('deployment', 'state');
|
|
145
|
+
if (typeof value.current !== 'boolean')
|
|
146
|
+
invalid('deployment', 'current');
|
|
147
|
+
if (!isInstant(value.createdAt))
|
|
148
|
+
invalid('deployment', 'createdAt');
|
|
149
|
+
if (value.retiredAt !== undefined && !isInstant(value.retiredAt))
|
|
150
|
+
invalid('deployment', 'retiredAt');
|
|
151
|
+
for (const key of ['buildDigest', 'configuration']) {
|
|
152
|
+
if (typeof value[key] !== 'string' || !/^sha256:[0-9a-f]{64}$/u.test(value[key])) {
|
|
153
|
+
invalid('deployment', key);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
let record;
|
|
157
|
+
if (value.record !== undefined) {
|
|
158
|
+
try {
|
|
159
|
+
record = decodeWorkerRecord(value.record);
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
invalid('deployment', 'record');
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const summary = { ...value };
|
|
166
|
+
delete summary.record;
|
|
167
|
+
return Object.freeze({
|
|
168
|
+
...summary,
|
|
169
|
+
...(record === undefined ? {} : { record }),
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
/** `https://<label>.<routing domain>`, nothing more. */
|
|
173
|
+
function isDeploymentUrl(url, label) {
|
|
174
|
+
const prefix = `https://${label}.`;
|
|
175
|
+
return url.startsWith(prefix) && isDnsName(url.slice(prefix.length));
|
|
176
|
+
}
|
|
177
|
+
/** Text a person can read in a listing: at most 512 characters, none of them a control character. */
|
|
178
|
+
function isPrintable(value) {
|
|
179
|
+
return value.length > 0 && value.length <= 512 && !/[\p{Cc}]/u.test(value);
|
|
180
|
+
}
|
|
181
|
+
function isInstant(value) {
|
|
182
|
+
return (typeof value === 'string' &&
|
|
183
|
+
value.length > 0 &&
|
|
184
|
+
value.length <= 64 &&
|
|
185
|
+
!Number.isNaN(Date.parse(value)));
|
|
186
|
+
}
|
|
187
|
+
function isDnsName(value) {
|
|
188
|
+
return (value.length <= 253 &&
|
|
189
|
+
value.split('.').every((label) => /^[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?$/u.test(label)));
|
|
190
|
+
}
|
|
191
|
+
function exact(input, required, optional, label) {
|
|
192
|
+
if (input === null || typeof input !== 'object' || Array.isArray(input))
|
|
193
|
+
invalid(label);
|
|
194
|
+
const value = input;
|
|
195
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
196
|
+
if (typeof key !== 'string' || (!required.includes(key) && !optional.includes(key))) {
|
|
197
|
+
invalid(label, String(key));
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
for (const key of required)
|
|
201
|
+
if (!Object.hasOwn(value, key))
|
|
202
|
+
invalid(label, key);
|
|
203
|
+
return value;
|
|
204
|
+
}
|
|
205
|
+
function invalid(label, member) {
|
|
206
|
+
throw new TypeError(`The Worker host returned an invalid ${label} answer${member === undefined ? '' : ` (${member})`}.`);
|
|
207
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Disposable entries one deployment keeps across its requests, and across its isolates where the
|
|
3
|
+
* platform shares them. An entry may vanish at any time and never outlives its expiry. A reader
|
|
4
|
+
* treats a failed or late read as a miss, so nothing that must persist or be coordinated belongs
|
|
5
|
+
* here: every consumer stays correct when the cache keeps nothing.
|
|
6
|
+
*/
|
|
7
|
+
export interface DeploymentCache {
|
|
8
|
+
/** The value kept under `key`, or undefined when it expired, vanished or was never kept. */
|
|
9
|
+
get(key: string): Promise<string | undefined>;
|
|
10
|
+
/**
|
|
11
|
+
* Keep `value` under `key` until `expiresAt` (Unix milliseconds) at the latest. The cache may
|
|
12
|
+
* drop it sooner, or not keep it at all.
|
|
13
|
+
*/
|
|
14
|
+
put(key: string, value: string, expiresAt: number): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/** Capture a caller-supplied cache, receiver-bound, after checking its shape. */
|
|
17
|
+
export declare function deploymentCache(input: DeploymentCache): DeploymentCache;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Capture a caller-supplied cache, receiver-bound, after checking its shape. */
|
|
2
|
+
export function deploymentCache(input) {
|
|
3
|
+
if (input === null ||
|
|
4
|
+
typeof input !== 'object' ||
|
|
5
|
+
Array.isArray(input) ||
|
|
6
|
+
typeof input.get !== 'function' ||
|
|
7
|
+
typeof input.put !== 'function') {
|
|
8
|
+
throw new TypeError('Deployment cache is invalid.');
|
|
9
|
+
}
|
|
10
|
+
return Object.freeze({ get: input.get.bind(input), put: input.put.bind(input) });
|
|
11
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { DeploymentCache } from './cache.js';
|
|
2
|
+
/** Entries one memory cache keeps by default before it evicts the least recently used. */
|
|
3
|
+
export declare const DEFAULT_MEMORY_CACHE_ENTRIES = 1024;
|
|
4
|
+
export interface MemoryCacheOptions {
|
|
5
|
+
/** Most entries kept at once; the least recently used is evicted first. */
|
|
6
|
+
readonly maximumEntries?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A deployment cache held in this process or isolate: bounded, least recently used first out, and
|
|
10
|
+
* an entry is gone at its expiry. It keeps values only, never a pending operation, so no request
|
|
11
|
+
* waits on another's I/O.
|
|
12
|
+
*/
|
|
13
|
+
export declare function memoryCache(options?: MemoryCacheOptions, now?: () => number): DeploymentCache;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/** Entries one memory cache keeps by default before it evicts the least recently used. */
|
|
2
|
+
export const DEFAULT_MEMORY_CACHE_ENTRIES = 1_024;
|
|
3
|
+
/**
|
|
4
|
+
* A deployment cache held in this process or isolate: bounded, least recently used first out, and
|
|
5
|
+
* an entry is gone at its expiry. It keeps values only, never a pending operation, so no request
|
|
6
|
+
* waits on another's I/O.
|
|
7
|
+
*/
|
|
8
|
+
export function memoryCache(options = {}, now = Date.now) {
|
|
9
|
+
if (options === null || typeof options !== 'object' || Array.isArray(options))
|
|
10
|
+
invalid();
|
|
11
|
+
const maximum = options.maximumEntries ?? DEFAULT_MEMORY_CACHE_ENTRIES;
|
|
12
|
+
if (!Number.isSafeInteger(maximum) || maximum < 1) {
|
|
13
|
+
throw new TypeError('Memory cache maximumEntries must be a positive integer.');
|
|
14
|
+
}
|
|
15
|
+
const entries = new Map();
|
|
16
|
+
return Object.freeze({
|
|
17
|
+
async get(key) {
|
|
18
|
+
if (typeof key !== 'string')
|
|
19
|
+
invalid();
|
|
20
|
+
const entry = entries.get(key);
|
|
21
|
+
if (entry === undefined)
|
|
22
|
+
return undefined;
|
|
23
|
+
entries.delete(key);
|
|
24
|
+
if (entry.expiresAt <= now())
|
|
25
|
+
return undefined;
|
|
26
|
+
entries.set(key, entry);
|
|
27
|
+
return entry.value;
|
|
28
|
+
},
|
|
29
|
+
async put(key, value, expiresAt) {
|
|
30
|
+
if (typeof key !== 'string' || typeof value !== 'string' || !Number.isFinite(expiresAt)) {
|
|
31
|
+
invalid();
|
|
32
|
+
}
|
|
33
|
+
entries.delete(key);
|
|
34
|
+
if (expiresAt <= now())
|
|
35
|
+
return;
|
|
36
|
+
while (entries.size >= maximum) {
|
|
37
|
+
const oldest = entries.keys().next().value;
|
|
38
|
+
if (oldest === undefined)
|
|
39
|
+
break;
|
|
40
|
+
entries.delete(oldest);
|
|
41
|
+
}
|
|
42
|
+
entries.set(key, Object.freeze({ value, expiresAt }));
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
function invalid() {
|
|
47
|
+
throw new TypeError('Memory cache input is invalid.');
|
|
48
|
+
}
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
import type { Fetch } from '@astrale-os/kernel-client';
|
|
2
|
-
import type { CredentialInput,
|
|
3
|
-
import type { AuthenticatedInvocation } from '../invocation/index.js';
|
|
2
|
+
import type { CredentialInput, IdentityId, IssuerId } from '../../platform/auth/index.js';
|
|
3
|
+
import type { AuthenticatedInvocation, SelfInvocation } from '../invocation/index.js';
|
|
4
4
|
import type { InvocationAdmissionInput } from '../invocation/index.js';
|
|
5
5
|
import type { IdentityNetworkPolicy, VerificationBasis, VerificationBasisResolver } from './jwks.js';
|
|
6
6
|
import type { SigningMaterial } from './signing.js';
|
|
7
|
+
import { ClientSession } from '../../platform/client/session/index.js';
|
|
8
|
+
import { NodeId } from '../../platform/graph/node/index.js';
|
|
9
|
+
/**
|
|
10
|
+
* How long a callback Session reuses a learned route. It stays at most the Kernel's in-flight
|
|
11
|
+
* issuer window (`KERNEL_INFLIGHT_ISSUER_MS`, Host default 300 s; CT11): a route learned to a
|
|
12
|
+
* deployment replaced by a consented install ages out while that deployment is still accepted and
|
|
13
|
+
* answers the reserved miss, never after its own credential is refused (AM-85).
|
|
14
|
+
*/
|
|
15
|
+
export declare const DEFAULT_ROUTE_AGE_MS = 60000;
|
|
7
16
|
export declare function admit(request: InvocationAdmissionInput, configuration: AuthenticationConfiguration): Promise<unknown>;
|
|
8
17
|
export interface AuthenticationConfiguration {
|
|
9
18
|
readonly issuer: IssuerId;
|
|
@@ -17,5 +26,26 @@ export declare function authenticate(credentialInput: CredentialInput, expectedK
|
|
|
17
26
|
readonly deadline: number;
|
|
18
27
|
readonly signal: AbortSignal;
|
|
19
28
|
}, configuration: AuthenticationConfiguration): Promise<AuthenticatedInvocation>;
|
|
20
|
-
|
|
29
|
+
/**
|
|
30
|
+
* The Domain's own authority toward the source Kernel of an admitted call that carries no
|
|
31
|
+
* credential. No caller credential bounds it: its callbacks live as long as the execution, exactly
|
|
32
|
+
* as the `self` half of an authenticated call does within its carrier.
|
|
33
|
+
*/
|
|
34
|
+
export declare function selfInvocation(kernel: IssuerId, execution: {
|
|
35
|
+
readonly deadline: number;
|
|
36
|
+
readonly signal: AbortSignal;
|
|
37
|
+
}, configuration: AuthenticationConfiguration): SelfInvocation;
|
|
38
|
+
/**
|
|
39
|
+
* The Domain's own authority toward one Kernel for a step of the durable Execution `executionId`,
|
|
40
|
+
* which no caller credential carries: the run acts as its executor, never as its initiator. Every
|
|
41
|
+
* credential names `executionId` in `EXECUTION_CLAIM`, so the Kernel can accept a replaced issuer
|
|
42
|
+
* for the steps of a run in flight at a consented issuer change. The caller owns the returned
|
|
43
|
+
* Session.
|
|
44
|
+
*/
|
|
45
|
+
export declare function executorSession(kernel: IssuerId, executionId: NodeId, execution: {
|
|
46
|
+
readonly deadline: number;
|
|
47
|
+
readonly signal: AbortSignal;
|
|
48
|
+
}, configuration: AuthenticationConfiguration): ClientSession;
|
|
49
|
+
/** Accept a Kernel delegation proof claim naming exactly one resolved caller Identity. */
|
|
50
|
+
export declare function acceptResolvedDelegation(input: unknown): IdentityId;
|
|
21
51
|
export type { VerificationBasis };
|
|
@@ -7,10 +7,16 @@ import { bindSession, ClientSession } from '../../platform/client/session/index.
|
|
|
7
7
|
import { NodeId } from '../../platform/graph/node/index.js';
|
|
8
8
|
import { Path } from '../../platform/graph/path/index.js';
|
|
9
9
|
import { projectError, protocolError } from '../invocation/result/index.js';
|
|
10
|
-
import { callbackIdentities, createCallbackCredentialResolver, maximumCallbackDelegationTtlSeconds, signDomainCallback, } from './callback.js';
|
|
11
|
-
import { CredentialRejected, IssuerUnavailable, boundedFetch, callbackTtl, invocationUrl, admitEndpoint, requireLive, } from './errors.js';
|
|
10
|
+
import { callbackIdentities, createCallbackCredentialResolver, maximumCallbackDelegationTtlSeconds, selfIdentity, signDomainCallback, } from './callback.js';
|
|
11
|
+
import { CredentialRejected, IssuerUnavailable, boundedFetch, callbackTtl, httpIssuer, invocationUrl, admitEndpoint, requireLive, } from './errors.js';
|
|
12
12
|
import { verifyCredential, verifyCredentialAgainst } from './jwks.js';
|
|
13
|
-
|
|
13
|
+
/**
|
|
14
|
+
* How long a callback Session reuses a learned route. It stays at most the Kernel's in-flight
|
|
15
|
+
* issuer window (`KERNEL_INFLIGHT_ISSUER_MS`, Host default 300 s; CT11): a route learned to a
|
|
16
|
+
* deployment replaced by a consented install ages out while that deployment is still accepted and
|
|
17
|
+
* answers the reserved miss, never after its own credential is refused (AM-85).
|
|
18
|
+
*/
|
|
19
|
+
export const DEFAULT_ROUTE_AGE_MS = 60_000;
|
|
14
20
|
export async function admit(request, configuration) {
|
|
15
21
|
const execution = request.context.execution;
|
|
16
22
|
requireLive(execution);
|
|
@@ -50,15 +56,14 @@ export async function authenticate(credentialInput, expectedKernel, execution, c
|
|
|
50
56
|
throw protocolError('AUTH_INVALID', 'Credential is invalid.');
|
|
51
57
|
}
|
|
52
58
|
const expressions = callbackIdentities(established.delegation.credential);
|
|
59
|
+
const session = (expression, validUntil) => callbackSession(expectedKernel, expression, validUntil, execution, configuration);
|
|
53
60
|
const sessions = Object.freeze({
|
|
54
|
-
caller:
|
|
55
|
-
self:
|
|
56
|
-
union: callbackSession(expressions.union),
|
|
61
|
+
caller: session(expressions.caller, established.validUntil),
|
|
62
|
+
self: session(expressions.self, established.verified.exp),
|
|
57
63
|
});
|
|
58
64
|
const graph = Object.freeze({
|
|
59
65
|
caller: bindSession(sessions.caller, execution),
|
|
60
66
|
self: bindSession(sessions.self, execution),
|
|
61
|
-
union: bindSession(sessions.union, execution),
|
|
62
67
|
});
|
|
63
68
|
let closed = false;
|
|
64
69
|
return Object.freeze({
|
|
@@ -70,35 +75,72 @@ export async function authenticate(credentialInput, expectedKernel, execution, c
|
|
|
70
75
|
closed = true;
|
|
71
76
|
sessions.caller.close();
|
|
72
77
|
sessions.self.close();
|
|
73
|
-
sessions.union.close();
|
|
74
78
|
},
|
|
75
79
|
});
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The Domain's own authority toward the source Kernel of an admitted call that carries no
|
|
83
|
+
* credential. No caller credential bounds it: its callbacks live as long as the execution, exactly
|
|
84
|
+
* as the `self` half of an authenticated call does within its carrier.
|
|
85
|
+
*/
|
|
86
|
+
export function selfInvocation(kernel, execution, configuration) {
|
|
87
|
+
requireLive(execution);
|
|
88
|
+
const admitted = httpIssuer(kernel, configuration.policy.allowInsecureHttp === true);
|
|
89
|
+
admitEndpoint(invocationUrl(admitted), configuration.policy);
|
|
90
|
+
const session = callbackSession(admitted, selfIdentity, undefined, execution, configuration);
|
|
91
|
+
let closed = false;
|
|
92
|
+
return Object.freeze({
|
|
93
|
+
graph: Object.freeze({ self: bindSession(session, execution) }),
|
|
94
|
+
close() {
|
|
95
|
+
if (closed)
|
|
96
|
+
return;
|
|
97
|
+
closed = true;
|
|
98
|
+
session.close();
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The Domain's own authority toward one Kernel for a step of the durable Execution `executionId`,
|
|
104
|
+
* which no caller credential carries: the run acts as its executor, never as its initiator. Every
|
|
105
|
+
* credential names `executionId` in `EXECUTION_CLAIM`, so the Kernel can accept a replaced issuer
|
|
106
|
+
* for the steps of a run in flight at a consented issuer change. The caller owns the returned
|
|
107
|
+
* Session.
|
|
108
|
+
*/
|
|
109
|
+
export function executorSession(kernel, executionId, execution, configuration) {
|
|
110
|
+
const admitted = httpIssuer(kernel, configuration.policy.allowInsecureHttp === true);
|
|
111
|
+
admitEndpoint(invocationUrl(admitted), configuration.policy);
|
|
112
|
+
return callbackSession(admitted, selfIdentity, undefined, execution, configuration, executionId);
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* A Session whose callbacks carry `expression`, none outliving the execution or `validUntil`, the
|
|
116
|
+
* earliest expiry in Unix seconds of the credentials they derive from.
|
|
117
|
+
*/
|
|
118
|
+
function callbackSession(kernel, expression, validUntil, execution, configuration, executionId) {
|
|
119
|
+
const resolveCallback = createCallbackCredentialResolver(configuration.signing, configuration.issuer, configuration.subject, kernel, expression, validUntil, execution, executionId);
|
|
120
|
+
const expiresAt = Math.min(execution.deadline, (validUntil ?? Number.POSITIVE_INFINITY) * 1_000);
|
|
121
|
+
return new ClientSession({
|
|
122
|
+
kernel,
|
|
123
|
+
fetch: boundedFetch(configuration.fetch, execution.signal),
|
|
124
|
+
auth: {
|
|
125
|
+
ttlSeconds: Math.min(callbackTtl(expiresAt), maximumCallbackDelegationTtlSeconds),
|
|
126
|
+
async resolve(_call, signal) {
|
|
127
|
+
const callback = await resolveCallback(signal);
|
|
128
|
+
signal.throwIfAborted();
|
|
129
|
+
return {
|
|
130
|
+
credential: callback.credential,
|
|
131
|
+
delegate: { ttlSeconds: callback.delegateTtlSeconds },
|
|
132
|
+
};
|
|
98
133
|
},
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
134
|
+
},
|
|
135
|
+
policy: {
|
|
136
|
+
maximumRouteAgeMs: DEFAULT_ROUTE_AGE_MS,
|
|
137
|
+
...(configuration.policy.allowEndpoint === undefined
|
|
138
|
+
? {}
|
|
139
|
+
: { allowEndpoint: configuration.policy.allowEndpoint }),
|
|
140
|
+
...(configuration.policy.allowInsecureHttp === true ? { allowInsecureHttp: true } : {}),
|
|
141
|
+
},
|
|
142
|
+
timeoutMs: Math.max(1, execution.deadline - Date.now()),
|
|
143
|
+
});
|
|
102
144
|
}
|
|
103
145
|
async function establishCaller(input, audience, verification, execution, policy) {
|
|
104
146
|
requireLive(execution);
|
|
@@ -112,7 +154,7 @@ async function establishCaller(input, audience, verification, execution, policy)
|
|
|
112
154
|
if (proof.verified.sub !== context.verified.sub) {
|
|
113
155
|
throw new CredentialRejected('Destination carrier and authority proof subjects differ.');
|
|
114
156
|
}
|
|
115
|
-
const
|
|
157
|
+
const identity = acceptResolvedDelegation(proof.verified.claims.delegation);
|
|
116
158
|
let principal;
|
|
117
159
|
try {
|
|
118
160
|
principal = NodeId(context.verified.sub);
|
|
@@ -122,11 +164,12 @@ async function establishCaller(input, audience, verification, execution, policy)
|
|
|
122
164
|
}
|
|
123
165
|
return Object.freeze({
|
|
124
166
|
verified: context.verified,
|
|
167
|
+
validUntil: Math.min(context.verified.exp ?? Number.POSITIVE_INFINITY, proof.verified.exp ?? Number.POSITIVE_INFINITY),
|
|
125
168
|
delegation: carried,
|
|
126
169
|
caller: Object.freeze({
|
|
127
170
|
kind: 'authenticated',
|
|
128
171
|
principal,
|
|
129
|
-
|
|
172
|
+
identity,
|
|
130
173
|
authentication: credential.evidence(context),
|
|
131
174
|
}),
|
|
132
175
|
});
|
|
@@ -137,6 +180,7 @@ async function establishCaller(input, audience, verification, execution, policy)
|
|
|
137
180
|
throw protocolError('BACKEND_UNAVAILABLE', 'Credential issuer is unavailable.');
|
|
138
181
|
}
|
|
139
182
|
if (cause instanceof CredentialRejected ||
|
|
183
|
+
cause instanceof AuthValueError ||
|
|
140
184
|
cause instanceof joseErrors.JOSEError ||
|
|
141
185
|
cause instanceof protocolErrors.ProtocolError) {
|
|
142
186
|
throw protocolError('AUTH_INVALID', 'Credential is invalid.');
|
|
@@ -144,6 +188,7 @@ async function establishCaller(input, audience, verification, execution, policy)
|
|
|
144
188
|
throw cause;
|
|
145
189
|
}
|
|
146
190
|
}
|
|
191
|
+
/** Accept a Kernel delegation proof claim naming exactly one resolved caller Identity. */
|
|
147
192
|
export function acceptResolvedDelegation(input) {
|
|
148
193
|
if (input === null ||
|
|
149
194
|
typeof input !== 'object' ||
|
|
@@ -154,5 +199,14 @@ export function acceptResolvedDelegation(input) {
|
|
|
154
199
|
Reflect.get(input, 'v') !== 1) {
|
|
155
200
|
throw new AuthValueError('AUTH_GRANT_INVALID', 'Expected resolved delegation.');
|
|
156
201
|
}
|
|
157
|
-
|
|
202
|
+
const raw = Reflect.get(input, 'expr');
|
|
203
|
+
// grant.accept collapses duplicate operands (union(X, X) becomes X), so the leaf is checked as sent.
|
|
204
|
+
if (raw === null || typeof raw !== 'object' || Reflect.get(raw, 'kind') !== 'identity') {
|
|
205
|
+
throw new AuthValueError('AUTH_GRANT_INVALID', 'Expected one resolved caller Identity.');
|
|
206
|
+
}
|
|
207
|
+
const { expr } = grant.accept({ expr: raw });
|
|
208
|
+
if (expr.kind !== 'identity') {
|
|
209
|
+
throw new AuthValueError('AUTH_GRANT_INVALID', 'Expected one resolved caller Identity.');
|
|
210
|
+
}
|
|
211
|
+
return expr.id;
|
|
158
212
|
}
|