@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,57 @@
|
|
|
1
|
+
import type * as invocation from '@astrale-os/kernel-protocol/invocation';
|
|
2
|
+
import type { RuntimeRegistry } from '../../../application/runtime/index.js';
|
|
3
|
+
import type { DeploymentCache } from '../../cache/index.js';
|
|
4
|
+
import type { Admission, InvocationTarget } from './target.js';
|
|
5
|
+
/**
|
|
6
|
+
* How long reading a kept admission may take before the call asks its Kernel instead. Reads of a
|
|
7
|
+
* shared platform cache answer in single-digit milliseconds; `Function.admit` costs tens.
|
|
8
|
+
*/
|
|
9
|
+
export declare const ADMISSION_RECALL_TIMEOUT_MS = 30;
|
|
10
|
+
/** The callables a call can be admitted to, when one of them declares an admission age. */
|
|
11
|
+
export interface AdmissionScope {
|
|
12
|
+
/** Keys of the implementations the call target names: an admission to any other is not kept. */
|
|
13
|
+
readonly callables: ReadonlySet<string>;
|
|
14
|
+
/** The input fields their Policies read, the only part of the input an admission depends on. */
|
|
15
|
+
readonly fields: readonly string[];
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Whose admission one call asks for: the source Kernel, the release this deployment serves, and
|
|
19
|
+
* the caller its credential proved, verified here before any kept admission is read.
|
|
20
|
+
*/
|
|
21
|
+
export interface AdmissionPartition {
|
|
22
|
+
readonly kernel: string;
|
|
23
|
+
readonly release: string;
|
|
24
|
+
/** Absent for a call that carries no credential. */
|
|
25
|
+
readonly caller?: {
|
|
26
|
+
readonly principal: string;
|
|
27
|
+
readonly identity: string;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The scope of a call whose target names, before the graph is read, implementations of which one
|
|
32
|
+
* declares an admission age. Undefined otherwise: a target that names no local implementation (a
|
|
33
|
+
* callable Node id, a path ending in a traversal), only callables without an age, or a durable
|
|
34
|
+
* Workflow, which runs only as a Kernel Execution. The Path language dispatches exactly, so a named
|
|
35
|
+
* target selects one declaration; the fields are still the union over every implementation named.
|
|
36
|
+
*/
|
|
37
|
+
export declare function admissionScope(registry: RuntimeRegistry, call: invocation.Call): AdmissionScope | undefined;
|
|
38
|
+
/** Whether any implementation of this registry declares an admission age. */
|
|
39
|
+
export declare function declaresAdmissionAge(registry: RuntimeRegistry): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* The cache key of one call's admission: a SHA-256 over the source Kernel, the served release, the
|
|
42
|
+
* verified principal and caller, the canonical call target (receiver included) and the input
|
|
43
|
+
* projected on the fields its Policy reads. A missing field differs from `null`, object keys are
|
|
44
|
+
* sorted at every depth, and no other part of the input enters the key.
|
|
45
|
+
*/
|
|
46
|
+
export declare function admissionKey(scope: AdmissionScope, partition: AdmissionPartition, call: invocation.Call): Promise<string>;
|
|
47
|
+
/**
|
|
48
|
+
* The target of an admission this deployment kept under `key`, while it is younger than the age it
|
|
49
|
+
* carried. A missing, expired, malformed, out-of-scope, failed or late read is a miss.
|
|
50
|
+
*/
|
|
51
|
+
export declare function recallAdmission(cache: DeploymentCache, key: string, scope: AdmissionScope): Promise<InvocationTarget | undefined>;
|
|
52
|
+
/**
|
|
53
|
+
* Keep a successful admission that carries an age, until `sentAt` plus that age, `sentAt` being when
|
|
54
|
+
* `Function.admit` was asked. Written in the background: the call never waits on the cache, and a
|
|
55
|
+
* cache that fails to keep it only costs a later call its admission round trip.
|
|
56
|
+
*/
|
|
57
|
+
export declare function keepAdmission(cache: DeploymentCache, key: string, scope: AdmissionScope, admitted: Admission, sentAt: number, background: (task: () => PromiseLike<unknown>) => void): void;
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { callableAddress, Key } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
|
+
import { admissionInputFields, MAXIMUM_ADMISSION_AGE_SECONDS, } from '@astrale-os/kernel-dsl/v1/language';
|
|
3
|
+
import { Path } from '../../../platform/graph/path/index.js';
|
|
4
|
+
import { target as acceptTarget } from './target.js';
|
|
5
|
+
/**
|
|
6
|
+
* How long reading a kept admission may take before the call asks its Kernel instead. Reads of a
|
|
7
|
+
* shared platform cache answer in single-digit milliseconds; `Function.admit` costs tens.
|
|
8
|
+
*/
|
|
9
|
+
export const ADMISSION_RECALL_TIMEOUT_MS = 30;
|
|
10
|
+
/** Version of the key and entry encodings below; a change makes every kept admission a miss. */
|
|
11
|
+
const ENCODING = 'astrale.admission/1';
|
|
12
|
+
const ENTRY_FIELDS = new Set(['v', 'callable', 'receiver', 'expiresAt']);
|
|
13
|
+
/**
|
|
14
|
+
* The scope of a call whose target names, before the graph is read, implementations of which one
|
|
15
|
+
* declares an admission age. Undefined otherwise: a target that names no local implementation (a
|
|
16
|
+
* callable Node id, a path ending in a traversal), only callables without an age, or a durable
|
|
17
|
+
* Workflow, which runs only as a Kernel Execution. The Path language dispatches exactly, so a named
|
|
18
|
+
* target selects one declaration; the fields are still the union over every implementation named.
|
|
19
|
+
*/
|
|
20
|
+
export function admissionScope(registry, call) {
|
|
21
|
+
const names = declarationsNamedBy(call.target);
|
|
22
|
+
const named = registry.implementations.filter(({ callable }) => names(callable.key));
|
|
23
|
+
if (named.every(({ callable }) => callable.admission === undefined))
|
|
24
|
+
return undefined;
|
|
25
|
+
if (named.some((implementation) => implementation.kind === 'workflow' && implementation.durable)) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
const fields = new Set();
|
|
29
|
+
for (const { callable } of named) {
|
|
30
|
+
for (const field of admissionInputFields(callable.policy))
|
|
31
|
+
fields.add(field);
|
|
32
|
+
}
|
|
33
|
+
return Object.freeze({
|
|
34
|
+
callables: new Set(named.map(({ callable }) => callable.key)),
|
|
35
|
+
fields: Object.freeze([...fields].sort()),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
/** Whether any implementation of this registry declares an admission age. */
|
|
39
|
+
export function declaresAdmissionAge(registry) {
|
|
40
|
+
return registry.implementations.some(({ callable }) => callable.admission !== undefined);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The cache key of one call's admission: a SHA-256 over the source Kernel, the served release, the
|
|
44
|
+
* verified principal and caller, the canonical call target (receiver included) and the input
|
|
45
|
+
* projected on the fields its Policy reads. A missing field differs from `null`, object keys are
|
|
46
|
+
* sorted at every depth, and no other part of the input enters the key.
|
|
47
|
+
*/
|
|
48
|
+
export async function admissionKey(scope, partition, call) {
|
|
49
|
+
const encoded = JSON.stringify([
|
|
50
|
+
ENCODING,
|
|
51
|
+
partition.kernel,
|
|
52
|
+
partition.release,
|
|
53
|
+
partition.caller?.principal ?? null,
|
|
54
|
+
partition.caller?.identity ?? null,
|
|
55
|
+
canonical(call.target),
|
|
56
|
+
projection(call.input, scope.fields),
|
|
57
|
+
]);
|
|
58
|
+
const digest = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(encoded));
|
|
59
|
+
return `admission/${hex(new Uint8Array(digest))}`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* The target of an admission this deployment kept under `key`, while it is younger than the age it
|
|
63
|
+
* carried. A missing, expired, malformed, out-of-scope, failed or late read is a miss.
|
|
64
|
+
*/
|
|
65
|
+
export async function recallAdmission(cache, key, scope) {
|
|
66
|
+
const value = await boundedRead(cache, key);
|
|
67
|
+
return value === undefined ? undefined : keptTarget(value, scope, Date.now());
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Keep a successful admission that carries an age, until `sentAt` plus that age, `sentAt` being when
|
|
71
|
+
* `Function.admit` was asked. Written in the background: the call never waits on the cache, and a
|
|
72
|
+
* cache that fails to keep it only costs a later call its admission round trip.
|
|
73
|
+
*/
|
|
74
|
+
export function keepAdmission(cache, key, scope, admitted, sentAt, background) {
|
|
75
|
+
if (admitted.maxAge === undefined || !scope.callables.has(admitted.target.callable))
|
|
76
|
+
return;
|
|
77
|
+
const expiresAt = sentAt + admitted.maxAge * 1000;
|
|
78
|
+
const value = JSON.stringify({
|
|
79
|
+
v: 1,
|
|
80
|
+
callable: admitted.target.callable,
|
|
81
|
+
...(admitted.target.receiver === undefined ? {} : { receiver: admitted.target.receiver }),
|
|
82
|
+
expiresAt,
|
|
83
|
+
});
|
|
84
|
+
try {
|
|
85
|
+
background(async () => {
|
|
86
|
+
try {
|
|
87
|
+
await cache.put(key, value, expiresAt);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// A cache that cannot keep this admission leaves the next call to its Kernel.
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// A Server that no longer accepts background work keeps nothing; the call is unaffected.
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function keptTarget(value, scope, now) {
|
|
99
|
+
let entry;
|
|
100
|
+
try {
|
|
101
|
+
entry = JSON.parse(value);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
if (!isRecord(entry) || Reflect.ownKeys(entry).some((key) => !ENTRY_FIELDS.has(key))) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
const { v, callable, receiver, expiresAt } = entry;
|
|
110
|
+
if (v !== 1 ||
|
|
111
|
+
typeof callable !== 'string' ||
|
|
112
|
+
!scope.callables.has(callable) ||
|
|
113
|
+
typeof expiresAt !== 'number' ||
|
|
114
|
+
!Number.isSafeInteger(expiresAt) ||
|
|
115
|
+
expiresAt <= now ||
|
|
116
|
+
expiresAt > now + MAXIMUM_ADMISSION_AGE_SECONDS * 1000) {
|
|
117
|
+
return undefined;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
return acceptTarget({ callable, ...(receiver === undefined ? {} : { receiver }) });
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return undefined;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/** One read bounded in time; a cache error is a miss. No pending read is shared across calls. */
|
|
127
|
+
async function boundedRead(cache, key) {
|
|
128
|
+
let timer;
|
|
129
|
+
const read = Promise.resolve()
|
|
130
|
+
.then(() => cache.get(key))
|
|
131
|
+
.then((value) => (typeof value === 'string' ? value : undefined), () => undefined);
|
|
132
|
+
const late = new Promise((resolve) => {
|
|
133
|
+
timer = setTimeout(() => resolve(undefined), ADMISSION_RECALL_TIMEOUT_MS);
|
|
134
|
+
});
|
|
135
|
+
try {
|
|
136
|
+
return await Promise.race([read, late]);
|
|
137
|
+
}
|
|
138
|
+
finally {
|
|
139
|
+
if (timer !== undefined)
|
|
140
|
+
clearTimeout(timer);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/** The declarations `target` names before the graph is read, as a test on a callable key. */
|
|
144
|
+
function declarationsNamedBy(target) {
|
|
145
|
+
if (typeof target !== 'string')
|
|
146
|
+
return (key) => target.callable === key;
|
|
147
|
+
let path;
|
|
148
|
+
try {
|
|
149
|
+
path = Path.parse(target);
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return () => false;
|
|
153
|
+
}
|
|
154
|
+
const { anchor, steps } = path.ast;
|
|
155
|
+
const last = steps.at(-1);
|
|
156
|
+
const first = steps[0];
|
|
157
|
+
return (key) => {
|
|
158
|
+
const coordinate = callableAddress(key);
|
|
159
|
+
if (coordinate.kind === 'method') {
|
|
160
|
+
if (last?.kind !== 'method' || last.name !== coordinate.name)
|
|
161
|
+
return false;
|
|
162
|
+
if (last.dispatch === 'instance')
|
|
163
|
+
return last.class === Key.of(coordinate.owner);
|
|
164
|
+
return (anchor.kind === 'domain' &&
|
|
165
|
+
anchor.origin === coordinate.owner.origin &&
|
|
166
|
+
steps.length === 2 &&
|
|
167
|
+
first?.kind === 'projection' &&
|
|
168
|
+
first.projection.kind === 'class' &&
|
|
169
|
+
first.projection.name === coordinate.owner.name);
|
|
170
|
+
}
|
|
171
|
+
return (anchor.kind === 'domain' &&
|
|
172
|
+
anchor.origin === coordinate.origin &&
|
|
173
|
+
steps.length === 1 &&
|
|
174
|
+
first?.kind === 'projection' &&
|
|
175
|
+
first.projection.kind === 'function' &&
|
|
176
|
+
first.projection.name === coordinate.name);
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
/** The input on the fields a Policy reads: each present field with its value, or its name alone. */
|
|
180
|
+
function projection(input, fields) {
|
|
181
|
+
if (fields.length === 0)
|
|
182
|
+
return [];
|
|
183
|
+
if (!isRecord(input))
|
|
184
|
+
return ['other'];
|
|
185
|
+
return [
|
|
186
|
+
'object',
|
|
187
|
+
...fields.map((field) => Object.hasOwn(input, field) ? [field, canonical(input[field])] : [field]),
|
|
188
|
+
];
|
|
189
|
+
}
|
|
190
|
+
/** Canonical JSON text of a portable value: object keys sorted at every depth. */
|
|
191
|
+
function canonical(value) {
|
|
192
|
+
if (Array.isArray(value))
|
|
193
|
+
return `[${value.map(canonical).join(',')}]`;
|
|
194
|
+
if (value !== null && typeof value === 'object') {
|
|
195
|
+
const object = value;
|
|
196
|
+
return `{${Object.keys(object)
|
|
197
|
+
.sort()
|
|
198
|
+
.map((key) => `${JSON.stringify(key)}:${canonical(object[key])}`)
|
|
199
|
+
.join(',')}}`;
|
|
200
|
+
}
|
|
201
|
+
return JSON.stringify(value);
|
|
202
|
+
}
|
|
203
|
+
function isRecord(input) {
|
|
204
|
+
return input !== null && typeof input === 'object' && !Array.isArray(input);
|
|
205
|
+
}
|
|
206
|
+
function hex(bytes) {
|
|
207
|
+
return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('');
|
|
208
|
+
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import type { HandlerRequest } from '@astrale-os/kernel-server';
|
|
2
|
-
import type { AnonymousCaller,
|
|
3
|
-
import type { Release } from '../../../deployment/release/index.js';
|
|
2
|
+
import type { AnonymousCaller, ResolvedCallable } from '../../../application/action/index.js';
|
|
4
3
|
import type { Domain } from '../../../platform/schema/index.js';
|
|
5
|
-
import type { AuthenticatedInvocation, InvocationAuthority } from './authority.js';
|
|
6
|
-
|
|
4
|
+
import type { AuthenticatedInvocation, InvocationAuthority, SelfInvocation } from './authority.js';
|
|
5
|
+
/** A call without a credential: no caller, and the installed Domain's own capabilities. */
|
|
6
|
+
export interface AnonymousInvocation extends SelfInvocation {
|
|
7
7
|
readonly caller: AnonymousCaller;
|
|
8
|
-
readonly kernel: null;
|
|
9
|
-
readonly graph: null;
|
|
10
|
-
close(): void;
|
|
11
8
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
export
|
|
9
|
+
export type InvocationAuthentication = AnonymousInvocation | AuthenticatedInvocation;
|
|
10
|
+
/**
|
|
11
|
+
* The sessions one invocation holds toward its source Kernel: the Domain's own always, its
|
|
12
|
+
* caller's only when the call carried a credential.
|
|
13
|
+
*/
|
|
14
|
+
export type InvocationSessions = InvocationAuthentication['graph'];
|
|
15
|
+
export declare function authentication(callable: ResolvedCallable, request: HandlerRequest, domain: Domain, authority: InvocationAuthority): Promise<InvocationAuthentication>;
|
|
16
|
+
/** Verify the credential a call carries and admit the caller it proves, whatever the callable. */
|
|
17
|
+
export declare function credentialAuthentication(request: HandlerRequest, domain: Domain, authority: InvocationAuthority): Promise<AuthenticatedInvocation>;
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { issuer } from '../../../platform/auth/index.js';
|
|
2
2
|
import { bindSession } from '../../../platform/client/session/index.js';
|
|
3
3
|
import { NodeId } from '../../../platform/graph/node/index.js';
|
|
4
4
|
import { protocolError } from '../result/index.js';
|
|
5
5
|
import { requireVia } from './authority.js';
|
|
6
|
-
const ANONYMOUS = Object.freeze({
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
6
|
+
const ANONYMOUS = Object.freeze({ kind: 'anonymous' });
|
|
7
|
+
export async function authentication(callable, request, domain, authority) {
|
|
8
|
+
if (callable.auth === 'anonymous' && request.credential === undefined) {
|
|
9
|
+
return anonymous(await authority.self({ via: requireVia(request), domain, context: request.context }));
|
|
10
|
+
}
|
|
11
|
+
return credentialAuthentication(request, domain, authority);
|
|
12
|
+
}
|
|
13
|
+
/** Verify the credential a call carries and admit the caller it proves, whatever the callable. */
|
|
14
|
+
export async function credentialAuthentication(request, domain, authority) {
|
|
13
15
|
const credential = request.credential;
|
|
14
|
-
if (callable.auth === 'anonymous' && credential === undefined)
|
|
15
|
-
return ANONYMOUS;
|
|
16
16
|
if (credential === undefined) {
|
|
17
17
|
throw protocolError('AUTH_MISSING', 'Authentication is required.');
|
|
18
18
|
}
|
|
@@ -21,7 +21,6 @@ export async function authentication(callable, request, release, domain, authori
|
|
|
21
21
|
const authenticated = await authority.authenticate({
|
|
22
22
|
credential,
|
|
23
23
|
via: requireVia(request),
|
|
24
|
-
publication: release.publication,
|
|
25
24
|
domain,
|
|
26
25
|
context: request.context,
|
|
27
26
|
});
|
|
@@ -36,34 +35,54 @@ export async function authentication(callable, request, release, domain, authori
|
|
|
36
35
|
invalid();
|
|
37
36
|
}
|
|
38
37
|
const caller = admitCaller(authenticated.caller);
|
|
39
|
-
const graphInput = admitGraph(authenticated.graph);
|
|
38
|
+
const graphInput = admitGraph(authenticated.graph, ['caller', 'self']);
|
|
40
39
|
const graph = Object.freeze({
|
|
41
40
|
caller: bindSession(graphInput.caller),
|
|
42
41
|
self: bindSession(graphInput.self),
|
|
43
|
-
union: bindSession(graphInput.union),
|
|
44
42
|
});
|
|
45
43
|
return Object.freeze({ caller, graph, close });
|
|
46
44
|
}
|
|
47
45
|
catch (cause) {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
46
|
+
rejectClosing(close, cause);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/** Admit the Domain's own capabilities for a call that carries no credential. */
|
|
50
|
+
function anonymous(own) {
|
|
51
|
+
let close;
|
|
52
|
+
try {
|
|
53
|
+
close = captureClose(own);
|
|
54
|
+
if (own === null ||
|
|
55
|
+
typeof own !== 'object' ||
|
|
56
|
+
Array.isArray(own) ||
|
|
57
|
+
Reflect.ownKeys(own).some((key) => key !== 'graph' && key !== 'close') ||
|
|
58
|
+
close === undefined) {
|
|
59
|
+
invalid();
|
|
55
60
|
}
|
|
61
|
+
const graph = Object.freeze({ self: bindSession(admitGraph(own.graph, ['self']).self) });
|
|
62
|
+
return Object.freeze({ caller: ANONYMOUS, graph, close });
|
|
63
|
+
}
|
|
64
|
+
catch (cause) {
|
|
65
|
+
rejectClosing(close, cause);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Release whatever the authority opened before refusing its invalid capabilities. */
|
|
69
|
+
function rejectClosing(close, cause) {
|
|
70
|
+
if (close === undefined)
|
|
56
71
|
invalid(cause);
|
|
72
|
+
try {
|
|
73
|
+
close();
|
|
74
|
+
}
|
|
75
|
+
catch (cleanup) {
|
|
76
|
+
throw new AggregateError([cause, cleanup], 'Invocation authority returned invalid capabilities and cleanup failed.');
|
|
57
77
|
}
|
|
78
|
+
invalid(cause);
|
|
58
79
|
}
|
|
59
|
-
function admitGraph(input) {
|
|
80
|
+
function admitGraph(input, modes) {
|
|
60
81
|
if (input === null ||
|
|
61
82
|
typeof input !== 'object' ||
|
|
62
83
|
Array.isArray(input) ||
|
|
63
|
-
!Object.hasOwn(input,
|
|
64
|
-
|
|
65
|
-
!Object.hasOwn(input, 'union') ||
|
|
66
|
-
Reflect.ownKeys(input).some((key) => key !== 'caller' && key !== 'self' && key !== 'union')) {
|
|
84
|
+
modes.some((mode) => !Object.hasOwn(input, mode)) ||
|
|
85
|
+
Reflect.ownKeys(input).some((key) => !modes.includes(key))) {
|
|
67
86
|
invalid();
|
|
68
87
|
}
|
|
69
88
|
return input;
|
|
@@ -79,29 +98,18 @@ function admitCaller(input) {
|
|
|
79
98
|
invalid();
|
|
80
99
|
if (!Object.hasOwn(input, 'kind') ||
|
|
81
100
|
!Object.hasOwn(input, 'principal') ||
|
|
82
|
-
!Object.hasOwn(input, '
|
|
101
|
+
!Object.hasOwn(input, 'identity') ||
|
|
83
102
|
!Object.hasOwn(input, 'authentication') ||
|
|
84
|
-
Reflect.ownKeys(input).some((key) => key !== 'kind' && key !== 'principal' && key !== '
|
|
103
|
+
Reflect.ownKeys(input).some((key) => key !== 'kind' && key !== 'principal' && key !== 'identity' && key !== 'authentication') ||
|
|
85
104
|
Reflect.get(input, 'kind') !== 'authenticated') {
|
|
86
105
|
invalid();
|
|
87
106
|
}
|
|
88
|
-
|
|
89
|
-
const authority = grant.accept(Reflect.get(input, 'authority'));
|
|
90
|
-
const authentication = admitEvidence(Reflect.get(input, 'authentication'));
|
|
91
|
-
const caller = {
|
|
107
|
+
return Object.freeze({
|
|
92
108
|
kind: 'authenticated',
|
|
93
|
-
get identity
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
return authority.expr.id;
|
|
98
|
-
},
|
|
99
|
-
principal,
|
|
100
|
-
authority,
|
|
101
|
-
authentication,
|
|
102
|
-
};
|
|
103
|
-
Object.defineProperty(caller, 'identity', { enumerable: false });
|
|
104
|
-
return Object.freeze(caller);
|
|
109
|
+
identity: NodeId(Reflect.get(input, 'identity')),
|
|
110
|
+
principal: NodeId(Reflect.get(input, 'principal')),
|
|
111
|
+
authentication: admitEvidence(Reflect.get(input, 'authentication')),
|
|
112
|
+
});
|
|
105
113
|
}
|
|
106
114
|
function admitEvidence(input) {
|
|
107
115
|
if (input === null || typeof input !== 'object' || Array.isArray(input))
|
|
@@ -148,6 +156,6 @@ function optionalTime(input) {
|
|
|
148
156
|
return input === undefined || (typeof input === 'number' && Number.isFinite(input));
|
|
149
157
|
}
|
|
150
158
|
function invalid(cause) {
|
|
151
|
-
const message = 'Invocation authority returned invalid
|
|
159
|
+
const message = 'Invocation authority returned invalid capabilities.';
|
|
152
160
|
throw cause === undefined ? new TypeError(message) : new TypeError(message, { cause });
|
|
153
161
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type * as invocation from '@astrale-os/kernel-protocol/invocation';
|
|
2
|
-
import type * as publication from '@astrale-os/kernel-protocol/publication';
|
|
3
2
|
import type { HandlerRequest, InvocationContext } from '@astrale-os/kernel-server';
|
|
4
3
|
import type { AuthenticatedCaller } from '../../../application/action/index.js';
|
|
5
4
|
import type { BoundClientSession } from '../../../platform/client/session/index.js';
|
|
@@ -8,27 +7,50 @@ export interface InvocationAdmissionInput {
|
|
|
8
7
|
readonly call: invocation.Call;
|
|
9
8
|
readonly credential?: string;
|
|
10
9
|
readonly via: invocation.Via;
|
|
11
|
-
readonly publication: publication.Publication;
|
|
12
10
|
readonly domain: Domain;
|
|
13
11
|
readonly context: InvocationContext;
|
|
14
12
|
}
|
|
15
13
|
export interface InvocationAuthenticationInput {
|
|
16
14
|
readonly credential: string;
|
|
17
15
|
readonly via: invocation.Via;
|
|
18
|
-
readonly
|
|
16
|
+
readonly domain: Domain;
|
|
17
|
+
readonly context: InvocationContext;
|
|
18
|
+
}
|
|
19
|
+
export interface InvocationSelfInput {
|
|
20
|
+
readonly via: invocation.Via;
|
|
19
21
|
readonly domain: Domain;
|
|
20
22
|
readonly context: InvocationContext;
|
|
21
23
|
}
|
|
22
24
|
/** Authenticated capabilities before the SDK admits and derives application caller context. */
|
|
23
25
|
export interface AuthenticatedInvocation {
|
|
24
|
-
readonly caller:
|
|
25
|
-
readonly graph: Readonly<Record<'caller' | 'self'
|
|
26
|
+
readonly caller: AuthenticatedCaller;
|
|
27
|
+
readonly graph: Readonly<Record<'caller' | 'self', BoundClientSession>>;
|
|
28
|
+
close(): void;
|
|
29
|
+
}
|
|
30
|
+
/** The Domain's own capabilities, before the SDK admits them for a call without a credential. */
|
|
31
|
+
export interface SelfInvocation {
|
|
32
|
+
readonly graph: Readonly<Record<'self', BoundClientSession>>;
|
|
26
33
|
close(): void;
|
|
27
34
|
}
|
|
28
35
|
export interface InvocationAuthority {
|
|
36
|
+
/**
|
|
37
|
+
* The source Kernel's `Function.admit` of a remote call: resolves to the admitted target, or
|
|
38
|
+
* rejects with the public refusal. A refusal whose reason is `FUNCTION_MISS` (the Kernel no longer
|
|
39
|
+
* places the call on this deployment) is answered as the reserved miss, never as an error.
|
|
40
|
+
*/
|
|
29
41
|
admit(input: InvocationAdmissionInput): Promise<unknown>;
|
|
30
42
|
authenticate(input: InvocationAuthenticationInput): Promise<AuthenticatedInvocation>;
|
|
43
|
+
/**
|
|
44
|
+
* The Domain's own authority toward the source Kernel, for an admitted call to an `anonymous`
|
|
45
|
+
* callable that carries no credential: its handler acts as the installed Domain, never as a
|
|
46
|
+
* caller.
|
|
47
|
+
*/
|
|
48
|
+
self(input: InvocationSelfInput): Promise<SelfInvocation>;
|
|
31
49
|
}
|
|
32
|
-
/** Capture the execution Identity capability and receiver-bind
|
|
50
|
+
/** Capture the execution Identity capability and receiver-bind its privileged operations. */
|
|
33
51
|
export declare function authority(input: InvocationAuthority): InvocationAuthority;
|
|
52
|
+
/**
|
|
53
|
+
* The routed witness of a remote call, already admitted by the Kernel Server against the served
|
|
54
|
+
* snapshot: the exact ReleaseRef of this immutable deployment.
|
|
55
|
+
*/
|
|
34
56
|
export declare function requireVia(request: HandlerRequest): invocation.Via;
|
|
@@ -1,17 +1,24 @@
|
|
|
1
1
|
import { protocolError } from '../result/index.js';
|
|
2
|
-
/** Capture the execution Identity capability and receiver-bind
|
|
2
|
+
/** Capture the execution Identity capability and receiver-bind its privileged operations. */
|
|
3
3
|
export function authority(input) {
|
|
4
4
|
if (input === null || typeof input !== 'object' || Array.isArray(input))
|
|
5
5
|
invalid();
|
|
6
|
-
if (typeof input.admit !== 'function' ||
|
|
6
|
+
if (typeof input.admit !== 'function' ||
|
|
7
|
+
typeof input.authenticate !== 'function' ||
|
|
8
|
+
typeof input.self !== 'function') {
|
|
7
9
|
invalid();
|
|
8
10
|
}
|
|
9
11
|
const receiver = Object.freeze({ ...input });
|
|
10
12
|
return Object.freeze({
|
|
11
13
|
admit: receiver.admit.bind(receiver),
|
|
12
14
|
authenticate: receiver.authenticate.bind(receiver),
|
|
15
|
+
self: receiver.self.bind(receiver),
|
|
13
16
|
});
|
|
14
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* The routed witness of a remote call, already admitted by the Kernel Server against the served
|
|
20
|
+
* snapshot: the exact ReleaseRef of this immutable deployment.
|
|
21
|
+
*/
|
|
15
22
|
export function requireVia(request) {
|
|
16
23
|
if (request.via === undefined) {
|
|
17
24
|
throw protocolError('VALIDATION_ERROR', 'Remote invocation requires Via.');
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
export { ADMISSION_RECALL_TIMEOUT_MS, admissionKey, admissionScope, declaresAdmissionAge, keepAdmission, recallAdmission, type AdmissionPartition, type AdmissionScope, } from './age.js';
|
|
1
2
|
export { authority, requireVia } from './authority.js';
|
|
2
|
-
export type { AuthenticatedInvocation, InvocationAdmissionInput, InvocationAuthenticationInput, InvocationAuthority, } from './authority.js';
|
|
3
|
-
export { authentication, type InvocationAuthentication } from './authentication.js';
|
|
3
|
+
export type { AuthenticatedInvocation, InvocationAdmissionInput, InvocationAuthenticationInput, InvocationAuthority, InvocationSelfInput, SelfInvocation, } from './authority.js';
|
|
4
|
+
export { authentication, credentialAuthentication, type AnonymousInvocation, type InvocationAuthentication, type InvocationSessions, } from './authentication.js';
|
|
4
5
|
export { input } from './input.js';
|
|
5
|
-
export { target, type InvocationTarget } from './target.js';
|
|
6
|
+
export { admission, target, type Admission, type InvocationTarget } from './target.js';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
+
export { ADMISSION_RECALL_TIMEOUT_MS, admissionKey, admissionScope, declaresAdmissionAge, keepAdmission, recallAdmission, } from './age.js';
|
|
1
2
|
export { authority, requireVia } from './authority.js';
|
|
2
|
-
export { authentication } from './authentication.js';
|
|
3
|
+
export { authentication, credentialAuthentication, } from './authentication.js';
|
|
3
4
|
export { input } from './input.js';
|
|
4
|
-
export { target } from './target.js';
|
|
5
|
+
export { admission, target } from './target.js';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import type { ResolvedCallable } from '../../../application/action/index.js';
|
|
2
|
-
export declare function input(callable: ResolvedCallable, value: unknown): void;
|
|
1
|
+
import type { ResolvedCallable, ActionBinaryInput } from '../../../application/action/index.js';
|
|
2
|
+
export declare function input(callable: ResolvedCallable, value: unknown, binary?: ActionBinaryInput): void;
|
|
@@ -1,4 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { isBinaryInput } from '@astrale-os/kernel-dsl/v1/language';
|
|
2
|
+
import { validateInput, protocolError } from '../result/index.js';
|
|
3
|
+
export function input(callable, value, binary) {
|
|
4
|
+
if (isBinaryInput(callable.input)) {
|
|
5
|
+
if (binary === undefined) {
|
|
6
|
+
throw protocolError('VALIDATION_ERROR', 'Binary Function request body is required.');
|
|
7
|
+
}
|
|
8
|
+
if (!Number.isSafeInteger(binary.length) ||
|
|
9
|
+
binary.length < 0 ||
|
|
10
|
+
binary.length > callable.input.maximumBytes) {
|
|
11
|
+
throw protocolError('LIMIT_EXCEEDED', 'Binary Function request body exceeds its limit.');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
else if (binary !== undefined) {
|
|
15
|
+
throw protocolError('VALIDATION_ERROR', 'Callable does not accept a binary request body.');
|
|
16
|
+
}
|
|
3
17
|
validateInput(callable, value);
|
|
4
18
|
}
|
|
@@ -4,5 +4,16 @@ export interface InvocationTarget {
|
|
|
4
4
|
readonly callable: SemanticKey.Callable;
|
|
5
5
|
readonly receiver?: NodePath;
|
|
6
6
|
}
|
|
7
|
+
/** The source Kernel's answer to `Function.admit`. */
|
|
8
|
+
export interface Admission {
|
|
9
|
+
readonly target: InvocationTarget;
|
|
10
|
+
/**
|
|
11
|
+
* How long, in seconds from when it was asked, this deployment may reuse the admission: the
|
|
12
|
+
* callable's declared admission age bounded by the Kernel cap. Absent: this call only.
|
|
13
|
+
*/
|
|
14
|
+
readonly maxAge?: number;
|
|
15
|
+
}
|
|
16
|
+
/** Admit the `Function.admit` answer: the selected target and the admission age it carries. */
|
|
17
|
+
export declare function admission(input: unknown): Admission;
|
|
7
18
|
/** Admit the portable target selected by the execution Identity owner. */
|
|
8
19
|
export declare function target(input: unknown): InvocationTarget;
|
|
@@ -1,11 +1,25 @@
|
|
|
1
1
|
import { callableAddress, Key } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
|
+
import { isAdmissionMaxAge } from '@astrale-os/kernel-dsl/v1/language';
|
|
2
3
|
import { NodePath as acceptNodePath } from '../../../platform/graph/path/index.js';
|
|
3
4
|
import { InvocationDefect } from '../result/index.js';
|
|
5
|
+
/** Admit the `Function.admit` answer: the selected target and the admission age it carries. */
|
|
6
|
+
export function admission(input) {
|
|
7
|
+
const value = record(input);
|
|
8
|
+
if (Reflect.ownKeys(value).some((key) => key !== 'callable' && key !== 'receiver' && key !== 'maxAge')) {
|
|
9
|
+
invalid();
|
|
10
|
+
}
|
|
11
|
+
const { maxAge } = value;
|
|
12
|
+
if (maxAge !== undefined && !isAdmissionMaxAge(maxAge))
|
|
13
|
+
invalid();
|
|
14
|
+
const selected = target({
|
|
15
|
+
callable: value.callable,
|
|
16
|
+
...(value.receiver === undefined ? {} : { receiver: value.receiver }),
|
|
17
|
+
});
|
|
18
|
+
return Object.freeze({ target: selected, ...(maxAge === undefined ? {} : { maxAge }) });
|
|
19
|
+
}
|
|
4
20
|
/** Admit the portable target selected by the execution Identity owner. */
|
|
5
21
|
export function target(input) {
|
|
6
|
-
|
|
7
|
-
invalid();
|
|
8
|
-
const value = input;
|
|
22
|
+
const value = record(input);
|
|
9
23
|
if (!Object.hasOwn(value, 'callable') ||
|
|
10
24
|
Reflect.ownKeys(value).some((key) => key !== 'callable' && key !== 'receiver') ||
|
|
11
25
|
typeof value.callable !== 'string') {
|
|
@@ -25,6 +39,11 @@ export function target(input) {
|
|
|
25
39
|
}
|
|
26
40
|
return Object.freeze({ callable, ...(receiver === undefined ? {} : { receiver }) });
|
|
27
41
|
}
|
|
42
|
+
function record(input) {
|
|
43
|
+
if (input === null || typeof input !== 'object' || Array.isArray(input))
|
|
44
|
+
invalid();
|
|
45
|
+
return input;
|
|
46
|
+
}
|
|
28
47
|
function invalid() {
|
|
29
48
|
throw new InvocationDefect('INVOCATION_TARGET_INVALID', 'Invocation target is invalid.');
|
|
30
49
|
}
|