@astrale-os/sdk 0.6.0-beta.3 → 0.6.0-beta.30
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 +179 -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 +44 -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 +14 -9
- 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/operation.d.ts +2 -2
- 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/index.d.ts +1 -1
- package/dist/application/query/composite/plan.d.ts +0 -4
- package/dist/application/query/composite/plan.js +0 -2
- 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 +6 -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 +20 -4
- package/dist/application/workflow/durable.d.ts +87 -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 +13 -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 +95 -0
- package/dist/deployment/address/configuration.js +273 -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/identity/authentication.d.ts +33 -3
- package/dist/execution/identity/authentication.js +85 -40
- package/dist/execution/identity/callback.d.ts +16 -15
- package/dist/execution/identity/callback.js +21 -16
- 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 +4 -4
- package/dist/execution/index.js +2 -2
- package/dist/execution/invocation/admission/authentication.d.ts +11 -13
- package/dist/execution/invocation/admission/authentication.js +48 -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 +2 -2
- package/dist/execution/invocation/admission/index.js +1 -1
- package/dist/execution/invocation/admission/input.d.ts +2 -2
- package/dist/execution/invocation/admission/input.js +16 -2
- 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 +17 -31
- package/dist/execution/invocation/dispatch/workflow.js +0 -4
- package/dist/execution/invocation/index.d.ts +2 -2
- package/dist/execution/invocation/index.js +1 -1
- package/dist/execution/invocation/integration/call.d.ts +2 -1
- package/dist/execution/invocation/integration/call.js +1 -1
- package/dist/execution/invocation/integration/clients.d.ts +1 -1
- package/dist/execution/invocation/invocation.js +49 -16
- 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 +10 -4
- package/dist/execution/serve.js +3 -0
- package/dist/execution/service/create.js +41 -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 +14 -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/discovery.d.ts +14 -0
- package/dist/execution/workflows/discovery.js +151 -0
- package/dist/execution/workflows/engine.d.ts +52 -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 +11 -0
- package/dist/execution/workflows/failure.js +43 -0
- package/dist/execution/workflows/index.d.ts +4 -0
- package/dist/execution/workflows/index.js +3 -0
- package/dist/execution/workflows/options.d.ts +34 -0
- package/dist/execution/workflows/options.js +65 -0
- package/dist/execution/workflows/receiver.d.ts +21 -0
- package/dist/execution/workflows/receiver.js +92 -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 +22 -0
- package/dist/execution/workflows/run.js +223 -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/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 +2 -2
- package/dist/tooling/cli/dotenv.js +3 -33
- 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 -0
- package/dist/tooling/cli/log.js +9 -0
- 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/implementations/source/callable-requirements.d.ts +1 -1
- package/dist/tooling/linter/implementations/source/callable-requirements.js +10 -10
- package/dist/tooling/linter/implementations/source/dependencies.js +12 -10
- package/dist/tooling/linter/implementations/source/global.js +1 -2
- package/dist/tooling/linter/implementations/source/mutations.js +17 -17
- package/dist/tooling/linter/implementations/source/providers.js +5 -5
- package/dist/tooling/linter/implementations/source/verifiers.js +0 -2
- package/dist/tooling/linter/implementations/source/views.js +2 -2
- package/dist/tooling/linter/policy/generated.js +14 -63
- package/dist/tooling/linter/requirements/registry.js +1 -6
- 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/package.json +39 -13
- 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,223 @@
|
|
|
1
|
+
import { declaredErrorFactory } from '../../application/error/index.js';
|
|
2
|
+
import { bindMutation } from '../../application/mutation/execution/executor.js';
|
|
3
|
+
import { bindQuery } from '../../application/query/execution/executor.js';
|
|
4
|
+
import { acceptStepId } from '../../application/workflow/step/index.js';
|
|
5
|
+
import { acceptStepOutput } from '../../application/workflow/step/output.js';
|
|
6
|
+
import { ResponseError } from '../../platform/client/index.js';
|
|
7
|
+
import { bindSession, execution as executionMethods } from '../../platform/client/session/index.js';
|
|
8
|
+
import { validateOutput } from '../invocation/result/index.js';
|
|
9
|
+
import { decodeEnvelope } from './envelope.js';
|
|
10
|
+
import { replayedFailure, terminalFailure } from './failure.js';
|
|
11
|
+
/** Token of a Workflow that declares none. */
|
|
12
|
+
const DEFAULT_COMPAT = '0';
|
|
13
|
+
const MAXIMUM_SLEEP_MS = 365 * 24 * 60 * 60_000;
|
|
14
|
+
const MAXIMUM_PROMISE_NAME = 128;
|
|
15
|
+
/** Bounds of one `result` wait and of the durable pause between two of them. */
|
|
16
|
+
const AWAIT_WAIT_MS = 10_000;
|
|
17
|
+
const AWAIT_MAXIMUM_PAUSE_MS = 5 * 60_000;
|
|
18
|
+
/** Engine handlers of one durable Workflow: the `run` and the shared `signal`. */
|
|
19
|
+
export function durableHandlers(input) {
|
|
20
|
+
const { engine } = input.serving;
|
|
21
|
+
return Object.freeze({
|
|
22
|
+
run: (context, raw) => run(input, context, raw),
|
|
23
|
+
async signal(context, raw) {
|
|
24
|
+
const request = signalRequest(raw);
|
|
25
|
+
try {
|
|
26
|
+
await context.promise(request.name).resolve(request.value);
|
|
27
|
+
return { accepted: true };
|
|
28
|
+
}
|
|
29
|
+
catch (cause) {
|
|
30
|
+
// The engine refuses to resolve a promise twice with a terminal failure.
|
|
31
|
+
if (cause instanceof engine.TerminalError)
|
|
32
|
+
return { accepted: false };
|
|
33
|
+
throw cause;
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async function run(input, context, raw) {
|
|
39
|
+
const { workflow, serving } = input;
|
|
40
|
+
const { engine } = serving;
|
|
41
|
+
const definition = workflow.definition;
|
|
42
|
+
// Journaled first. A redeployment that changed the token cannot replay this run: it fails every
|
|
43
|
+
// attempt with this reason until the engine pauses it, then `resume` on compatible code or cancel.
|
|
44
|
+
const token = definition.compat ?? DEFAULT_COMPAT;
|
|
45
|
+
const recorded = await context.run('compat', async () => token);
|
|
46
|
+
if (recorded !== token) {
|
|
47
|
+
throw new Error(`Workflow ${workflow.address} started under compat token ${JSON.stringify(recorded)}; ` +
|
|
48
|
+
`this deployment declares ${JSON.stringify(token)}.`);
|
|
49
|
+
}
|
|
50
|
+
// Code that cannot read what the Kernel recorded pauses the run the same way.
|
|
51
|
+
const envelope = admitted(workflow, raw, input.kernel);
|
|
52
|
+
const durable = durableContext(input, context, envelope);
|
|
53
|
+
let output;
|
|
54
|
+
try {
|
|
55
|
+
output = await definition.run(durable);
|
|
56
|
+
}
|
|
57
|
+
catch (cause) {
|
|
58
|
+
throw terminalFailure(engine, cause, definition) ?? cause;
|
|
59
|
+
}
|
|
60
|
+
return validateOutput(workflow.callable, output);
|
|
61
|
+
}
|
|
62
|
+
function admitted(workflow, raw, kernel) {
|
|
63
|
+
const envelope = decodeEnvelope(raw);
|
|
64
|
+
if (envelope.execution.kernel !== kernel) {
|
|
65
|
+
throw new TypeError('Durable envelope Kernel differs from its authenticated endpoint.');
|
|
66
|
+
}
|
|
67
|
+
const diagnostics = workflow.callable.validateInput(envelope.input);
|
|
68
|
+
if (diagnostics.length > 0) {
|
|
69
|
+
throw new TypeError(`Workflow ${workflow.address} cannot read the recorded input.`);
|
|
70
|
+
}
|
|
71
|
+
const instance = 'static' in workflow.callable && workflow.callable.static === false;
|
|
72
|
+
if (instance !== (envelope.execution.receiver !== undefined)) {
|
|
73
|
+
throw new TypeError(`Workflow ${workflow.address} cannot use the recorded receiver.`);
|
|
74
|
+
}
|
|
75
|
+
return envelope;
|
|
76
|
+
}
|
|
77
|
+
function durableContext(input, context, envelope) {
|
|
78
|
+
const { serving, domain, workflow } = input;
|
|
79
|
+
const { engine } = serving;
|
|
80
|
+
const definition = workflow.definition;
|
|
81
|
+
const execution = envelope.execution;
|
|
82
|
+
const signal = context.request().attemptCompletedSignal;
|
|
83
|
+
const steps = new Set();
|
|
84
|
+
/** One journaled unit of work acting as the Domain, with keys derived from its name. */
|
|
85
|
+
const journal = (name, execute) => Promise.resolve(context.run(name, async () => {
|
|
86
|
+
const deadline = Date.now() + serving.stepTimeoutMs;
|
|
87
|
+
const session = input.executor(execution.kernel, execution.id, { deadline, signal });
|
|
88
|
+
try {
|
|
89
|
+
const kernel = keyed(bindSessionOf(session, deadline, signal), domain, await keySequence(execution.id, name));
|
|
90
|
+
const output = await execute(Object.freeze({
|
|
91
|
+
kernel,
|
|
92
|
+
query: bindQuery(kernel, domain),
|
|
93
|
+
mutate: bindMutation(kernel, domain),
|
|
94
|
+
}));
|
|
95
|
+
try {
|
|
96
|
+
return acceptStepOutput(output);
|
|
97
|
+
}
|
|
98
|
+
catch (cause) {
|
|
99
|
+
throw new TypeError(`Workflow ${name} output must be portable.`, { cause });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
catch (cause) {
|
|
103
|
+
throw terminalFailure(engine, cause, definition) ?? cause;
|
|
104
|
+
}
|
|
105
|
+
finally {
|
|
106
|
+
session.close();
|
|
107
|
+
}
|
|
108
|
+
})).catch((cause) => {
|
|
109
|
+
throw replayedFailure(engine, cause, definition) ?? cause;
|
|
110
|
+
});
|
|
111
|
+
const step = (id, execute) => {
|
|
112
|
+
let accepted;
|
|
113
|
+
try {
|
|
114
|
+
accepted = acceptStepId(id);
|
|
115
|
+
if (steps.has(accepted))
|
|
116
|
+
throw new TypeError(`Workflow Step ${accepted} occurs more than once.`);
|
|
117
|
+
}
|
|
118
|
+
catch (cause) {
|
|
119
|
+
return Promise.reject(cause);
|
|
120
|
+
}
|
|
121
|
+
steps.add(accepted);
|
|
122
|
+
return journal(`step:${accepted}`, execute);
|
|
123
|
+
};
|
|
124
|
+
return Object.freeze({
|
|
125
|
+
domain,
|
|
126
|
+
input: envelope.input,
|
|
127
|
+
execution,
|
|
128
|
+
error: declaredErrorFactory(definition),
|
|
129
|
+
step: Object.freeze({
|
|
130
|
+
run: step,
|
|
131
|
+
mutate: (id, mutation, value) => step(id, (authority) => authority.mutate(mutation, value)),
|
|
132
|
+
}),
|
|
133
|
+
async sleep(durationMs) {
|
|
134
|
+
if (!Number.isSafeInteger(durationMs) || durationMs < 0 || durationMs > MAXIMUM_SLEEP_MS) {
|
|
135
|
+
throw new TypeError(`Durable sleep must be an integer between 0 and ${MAXIMUM_SLEEP_MS} ms.`);
|
|
136
|
+
}
|
|
137
|
+
await context.sleep(durationMs);
|
|
138
|
+
},
|
|
139
|
+
async promise(name) {
|
|
140
|
+
if (typeof name !== 'string' || name.length === 0 || name.length > MAXIMUM_PROMISE_NAME) {
|
|
141
|
+
throw new TypeError('Durable promise name must have 1 to 128 characters.');
|
|
142
|
+
}
|
|
143
|
+
return (await context.promise(name).get());
|
|
144
|
+
},
|
|
145
|
+
cancelled: (error) => error instanceof engine.CancelledError,
|
|
146
|
+
async awaitExecution(target) {
|
|
147
|
+
for (let poll = 1;; poll++) {
|
|
148
|
+
const polled = await journal(`await:${target.id}:${poll}`, async ({ kernel }) => {
|
|
149
|
+
try {
|
|
150
|
+
const outcome = await kernel.invoke(executionMethods.result(target), {
|
|
151
|
+
waitMs: Math.min(AWAIT_WAIT_MS, Math.floor(serving.stepTimeoutMs / 2)),
|
|
152
|
+
});
|
|
153
|
+
return { ended: true, outcome };
|
|
154
|
+
}
|
|
155
|
+
catch (cause) {
|
|
156
|
+
if (cause instanceof ResponseError && cause.reason?.code === 'EXECUTION_PENDING') {
|
|
157
|
+
return { ended: false };
|
|
158
|
+
}
|
|
159
|
+
throw cause;
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
if (polled.ended)
|
|
163
|
+
return polled.outcome;
|
|
164
|
+
await context.sleep(Math.min(AWAIT_MAXIMUM_PAUSE_MS, 1_000 * 2 ** Math.min(poll, 16)));
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
...(execution.receiver === undefined ? {} : { self: execution.receiver }),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
function bindSessionOf(session, deadline, signal) {
|
|
171
|
+
return bindSession(session, { deadline, signal });
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Every Mutation and every `invoke` of a durable callable of one Step without its own key carries
|
|
175
|
+
* the next key of the Step's sequence. The sequence restarts with every attempt, so a retried Step
|
|
176
|
+
* replays the same keys: the Kernel answers a Mutation with its receipt and a durable call with the
|
|
177
|
+
* Execution it started, or refuses a request that changed under its key. Any other `invoke` carries
|
|
178
|
+
* no key, because the Kernel accepts one only for a durable Function, and runs again with the Step.
|
|
179
|
+
*/
|
|
180
|
+
function keyed(session, domain, next) {
|
|
181
|
+
const invokeSource = session.invoke;
|
|
182
|
+
const mutateSource = session.mutate;
|
|
183
|
+
const invoke = ((reference, value, options) => invokeSource(reference, value, declaredDurable(domain, reference) ? withKey(options, next) : options));
|
|
184
|
+
const mutate = ((author, options) => mutateSource(author, withKey(options, next)));
|
|
185
|
+
return Object.freeze({ ...session, invoke, mutate });
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Whether the Domain's Schema closure declares the referenced callable durable. An untyped Path
|
|
189
|
+
* names no declaration and a callable outside the closure has none here: both need their own key.
|
|
190
|
+
*/
|
|
191
|
+
function declaredDurable(domain, reference) {
|
|
192
|
+
if (reference === null || typeof reference !== 'object')
|
|
193
|
+
return false;
|
|
194
|
+
const key = reference.callable;
|
|
195
|
+
return (typeof key === 'string' && domain.callable(key)?.execution?.durable === true);
|
|
196
|
+
}
|
|
197
|
+
function withKey(options, next) {
|
|
198
|
+
if (options?.idempotencyKey !== undefined || options?.body !== undefined)
|
|
199
|
+
return options;
|
|
200
|
+
return { ...options, idempotencyKey: next() };
|
|
201
|
+
}
|
|
202
|
+
async function keySequence(execution, name) {
|
|
203
|
+
const digest = new Uint8Array(await crypto.subtle.digest('SHA-256', new TextEncoder().encode(name)));
|
|
204
|
+
const prefix = `${execution}.${Array.from(digest.subarray(0, 12), hex).join('')}`;
|
|
205
|
+
let position = 0;
|
|
206
|
+
return () => `${prefix}.${++position}`;
|
|
207
|
+
}
|
|
208
|
+
function hex(byte) {
|
|
209
|
+
return byte.toString(16).padStart(2, '0');
|
|
210
|
+
}
|
|
211
|
+
function signalRequest(input) {
|
|
212
|
+
if (input === null ||
|
|
213
|
+
typeof input !== 'object' ||
|
|
214
|
+
Array.isArray(input) ||
|
|
215
|
+
typeof input.name !== 'string') {
|
|
216
|
+
throw new TypeError('Durable signal request is invalid.');
|
|
217
|
+
}
|
|
218
|
+
const { name, value } = input;
|
|
219
|
+
if (name.length === 0 || name.length > MAXIMUM_PROMISE_NAME) {
|
|
220
|
+
throw new TypeError('Durable signal name must have 1 to 128 characters.');
|
|
221
|
+
}
|
|
222
|
+
return { name, value: value ?? null };
|
|
223
|
+
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
/** Curated SDK authoring journey. Semantic values remain available from focused subpaths. */
|
|
2
2
|
export { defineAction } from './application/action/index.js';
|
|
3
3
|
export type { Action, ActionContext, ActionOutputOf, Caller, DeclaredErrorDefinition, DeclaredErrorFactory, DeclaredErrorFamily, DeclaredErrorOptions, DeclaredErrors, } from './application/action/index.js';
|
|
4
|
-
export {
|
|
5
|
-
export type {
|
|
4
|
+
export { defineDomain, defineFrontend, external, requirements, route, routes, vite, } from './application/index.js';
|
|
5
|
+
export type { DomainDefinition, Frontend, Requirements, Route, Routes, } from './application/index.js';
|
|
6
6
|
export { defineIntegration, defineProvider } from './application/integration/index.js';
|
|
7
7
|
export type { IntegrationClient, IntegrationDefinition, Provider, } from './application/integration/index.js';
|
|
8
8
|
export { defineMutation, executeMutation } from './application/mutation/index.js';
|
|
@@ -13,9 +13,9 @@ export { defineRuntime } from './application/runtime/index.js';
|
|
|
13
13
|
export type { Runtime } from './application/runtime/index.js';
|
|
14
14
|
export { defineWorkflow } from './application/workflow/index.js';
|
|
15
15
|
export type { Workflow, WorkflowContext } from './application/workflow/index.js';
|
|
16
|
-
export { compile,
|
|
16
|
+
export { compile, runtime } from './deployment/index.js';
|
|
17
17
|
export type { Build, Deployment, Release } from './deployment/index.js';
|
|
18
18
|
export { defineProject } from './project/index.js';
|
|
19
19
|
export type { Project } from './project/index.js';
|
|
20
20
|
export { serve } from './execution/index.js';
|
|
21
|
-
export type {
|
|
21
|
+
export type { ServedDomain } from './execution/index.js';
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/** Curated SDK authoring journey. Semantic values remain available from focused subpaths. */
|
|
2
2
|
export { defineAction } from './application/action/index.js';
|
|
3
|
-
export {
|
|
3
|
+
export { defineDomain, defineFrontend, external, requirements, route, routes, vite, } from './application/index.js';
|
|
4
4
|
export { defineIntegration, defineProvider } from './application/integration/index.js';
|
|
5
5
|
export { defineMutation, executeMutation } from './application/mutation/index.js';
|
|
6
6
|
export { defineCollectionQuery, defineCompositeQuery, defineQuery, executeQuery, } from './application/query/index.js';
|
|
7
7
|
export { defineRuntime } from './application/runtime/index.js';
|
|
8
8
|
export { defineWorkflow } from './application/workflow/index.js';
|
|
9
|
-
export { compile,
|
|
9
|
+
export { compile, runtime } from './deployment/index.js';
|
|
10
10
|
export { defineProject } from './project/index.js';
|
|
11
11
|
export { serve } from './execution/index.js';
|
|
@@ -1,6 +1,2 @@
|
|
|
1
1
|
/** Graph-local names retain the canonical Kernel type and constructor identity. */
|
|
2
|
-
export {
|
|
3
|
-
/** @deprecated Use LocalAlias. */
|
|
4
|
-
export { LocalBinding } from '@astrale-os/kernel-core/graph/graph';
|
|
5
|
-
/** @deprecated Use isLocalAlias. */
|
|
6
|
-
export { isLocalBinding } from '@astrale-os/kernel-core/graph/graph';
|
|
2
|
+
export { LocalAlias, isLocalAlias } from '@astrale-os/kernel-core/graph/graph';
|
|
@@ -1,6 +1,2 @@
|
|
|
1
1
|
/** Graph-local names retain the canonical Kernel type and constructor identity. */
|
|
2
|
-
export {
|
|
3
|
-
/** @deprecated Use LocalAlias. */
|
|
4
|
-
export { LocalBinding } from '@astrale-os/kernel-core/graph/graph';
|
|
5
|
-
/** @deprecated Use isLocalAlias. */
|
|
6
|
-
export { isLocalBinding } from '@astrale-os/kernel-core/graph/graph';
|
|
2
|
+
export { LocalAlias, isLocalAlias } from '@astrale-os/kernel-core/graph/graph';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Curated aggregate over canonical graph values. */
|
|
2
2
|
export { GraphData, GraphDataDecodeError, GraphSpec, GraphSpecDecodeError, } from '@astrale-os/kernel-core/graph/graph';
|
|
3
|
-
export { LocalAlias, isLocalAlias
|
|
3
|
+
export { LocalAlias, isLocalAlias } from './alias.js';
|
|
4
4
|
export type { AnonymousNodeSpec, GraphDataJson, GraphSpecEdge, GraphSpecEndpoint, GraphSpecJson, GraphSpecNode, } from '@astrale-os/kernel-core/graph/graph';
|
|
5
5
|
export * from './edge/index.js';
|
|
6
6
|
export * from './node/index.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Curated aggregate over canonical graph values. */
|
|
2
2
|
export { GraphData, GraphDataDecodeError, GraphSpec, GraphSpecDecodeError, } from '@astrale-os/kernel-core/graph/graph';
|
|
3
|
-
export { LocalAlias, isLocalAlias
|
|
3
|
+
export { LocalAlias, isLocalAlias } from './alias.js';
|
|
4
4
|
export * from './edge/index.js';
|
|
5
5
|
export * from './node/index.js';
|
|
6
6
|
export * from './path/index.js';
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { func as kernelFunc, method as kernelMethod, type CallablePolicyBuilder, type FunctionInput, type Method, type MethodInput } from '@astrale-os/kernel-dsl/v1/builder';
|
|
2
|
+
/** Who may call an authorized callable: Policy checks, or the constant `true` or `false`. */
|
|
3
|
+
export type CallerRule = CallablePolicyBuilder | boolean;
|
|
4
|
+
/**
|
|
5
|
+
* An executable `authorized` callable declares its caller rule. An abstract Method is a contract
|
|
6
|
+
* on an abstract Class and executable on a concrete one, so its rule is settled by the Class that
|
|
7
|
+
* declares it.
|
|
8
|
+
*/
|
|
9
|
+
export type DeclaredCallerRule<Config> = Config extends {
|
|
10
|
+
readonly auth: 'authorized';
|
|
11
|
+
} ? Config extends {
|
|
12
|
+
readonly abstract: true;
|
|
13
|
+
} ? unknown : {
|
|
14
|
+
readonly policy: CallerRule;
|
|
15
|
+
} : unknown;
|
|
16
|
+
/** Author a Function. An `authorized` Function declares its caller rule. */
|
|
17
|
+
export declare function func<const Config extends FunctionInput>(config: Config & DeclaredCallerRule<Config>): ReturnType<typeof kernelFunc<Config>>;
|
|
18
|
+
/** Author a Method. An executable `authorized` Method declares its caller rule. */
|
|
19
|
+
export declare function method<const Config extends MethodInput>(config: Config & DeclaredCallerRule<Config>): ReturnType<typeof kernelMethod<Config>>;
|
|
20
|
+
/** A concrete Class executes every Method it declares, abstract contracts included. */
|
|
21
|
+
export declare function assertNoUndeclaredCallerRule(methods: Readonly<Record<string, Method>> | undefined): void;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { func as kernelFunc, method as kernelMethod, } from '@astrale-os/kernel-dsl/v1/builder';
|
|
2
|
+
/** Authorized abstract Methods authored without a caller rule, until a Class declares them. */
|
|
3
|
+
const undeclared = new WeakSet();
|
|
4
|
+
export function func(config) {
|
|
5
|
+
if (config.auth === 'authorized' && config.policy === undefined)
|
|
6
|
+
undeclaredCallerRule('Function');
|
|
7
|
+
return kernelFunc(config);
|
|
8
|
+
}
|
|
9
|
+
export function method(config) {
|
|
10
|
+
const value = kernelMethod(config);
|
|
11
|
+
if (config.auth === 'authorized' && config.policy === undefined) {
|
|
12
|
+
if (config.abstract !== true)
|
|
13
|
+
undeclaredCallerRule('Method');
|
|
14
|
+
undeclared.add(value);
|
|
15
|
+
}
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
/** A concrete Class executes every Method it declares, abstract contracts included. */
|
|
19
|
+
export function assertNoUndeclaredCallerRule(methods) {
|
|
20
|
+
for (const [name, value] of Object.entries(methods ?? {})) {
|
|
21
|
+
if (undeclared.has(value))
|
|
22
|
+
undeclaredCallerRule(`Method ${name}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function undeclaredCallerRule(subject) {
|
|
26
|
+
throw new TypeError(`${subject} is authorized and executable: declare its policy with Policy checks, true or false.`);
|
|
27
|
+
}
|
|
@@ -1,36 +1,86 @@
|
|
|
1
|
-
import { nodeClass as kernelNodeClass, type DirectedEdgeClass, type DirectedEdgeInput, type NodeClass, type NodeClassInput as KernelNodeClassInput, type UndirectedEdgeClass, type UndirectedEdgeInput } from '@astrale-os/kernel-dsl/v1/builder';
|
|
1
|
+
import { edgeClass as kernelEdgeClass, nodeClass as kernelNodeClass, type DirectedEdgeClass, type DirectedEdgeInput, type Lazy, type NodeClass, type NodeClassInput as KernelNodeClassInput, type NodeClassPolicyInput, type Policy, type UndirectedEdgeClass, type UndirectedEdgeInput } from '@astrale-os/kernel-dsl/v1/builder';
|
|
2
2
|
import { type ClassIcon } from './class-icon.js';
|
|
3
|
-
/**
|
|
3
|
+
/**
|
|
4
|
+
* SDK Node Class input: every author must make an explicit, admitted icon choice, and every
|
|
5
|
+
* concrete Class must declare its read rule.
|
|
6
|
+
*/
|
|
4
7
|
export type NodeClassInput = Omit<KernelNodeClassInput, 'icon'> & {
|
|
5
8
|
readonly icon: ClassIcon;
|
|
6
9
|
};
|
|
10
|
+
/** Who may read or traverse an Edge Class: a named Policy, or the constant `true` or `false`. */
|
|
11
|
+
export type ClassReadRule = Lazy<Policy> | boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Who may read or traverse a Node Class: a named Policy, the constant `true` or `false`, or Policy
|
|
14
|
+
* checks over the observed Node (`self`) and fixed members (`ref(...)`), composed as the checks of
|
|
15
|
+
* an authorized callable.
|
|
16
|
+
*/
|
|
17
|
+
export type NodeClassReadRule = NodeClassPolicyInput;
|
|
18
|
+
/**
|
|
19
|
+
* The observation rules of a concrete Class. A Node stays traversable through either rule, so a
|
|
20
|
+
* read rule other than `true` leaves every caller able to reach it, and to select its reference,
|
|
21
|
+
* until the traverse rule is declared too.
|
|
22
|
+
*/
|
|
23
|
+
export type DeclaredObservation<Rule = ClassReadRule> = {
|
|
24
|
+
readonly read: true;
|
|
25
|
+
readonly traverse?: Rule;
|
|
26
|
+
} | {
|
|
27
|
+
readonly read: Exclude<Rule, true>;
|
|
28
|
+
readonly traverse: Rule;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* A concrete Class declares its read rule, and its traverse rule whenever the read rule is not
|
|
32
|
+
* `true`. An abstract Class is never observed directly, so it declares neither.
|
|
33
|
+
*/
|
|
34
|
+
export type DeclaredReadRule<Config, Rule = ClassReadRule> = Config extends {
|
|
35
|
+
readonly abstract: true;
|
|
36
|
+
} ? unknown : {
|
|
37
|
+
readonly policies: DeclaredObservation<Rule>;
|
|
38
|
+
};
|
|
7
39
|
/** Preserve authored input instead of serializing expanded inheritance projections in consumers. */
|
|
8
40
|
export interface AuthoredNodeClass<Config extends NodeClassInput> extends ReturnType<typeof kernelNodeClass<Config>> {
|
|
9
41
|
}
|
|
42
|
+
type DirectedOptions = Omit<DirectedEdgeInput, 'orientation'>;
|
|
43
|
+
type UndirectedOptions = Omit<UndirectedEdgeInput, 'orientation'>;
|
|
44
|
+
/** The two states `defineClass` admits: abstract, or concrete with declared observation rules. */
|
|
45
|
+
type Declared<Input, Rule = ClassReadRule> = (Input & {
|
|
46
|
+
readonly abstract: true;
|
|
47
|
+
}) | (Input & {
|
|
48
|
+
readonly abstract: false;
|
|
49
|
+
} & {
|
|
50
|
+
readonly policies: DeclaredObservation<Rule>;
|
|
51
|
+
});
|
|
10
52
|
type NodeInput = {
|
|
11
53
|
readonly kind: 'node';
|
|
12
|
-
|
|
13
|
-
} & NodeClassInput;
|
|
54
|
+
} & Declared<NodeClassInput, NodeClassReadRule>;
|
|
14
55
|
type DirectedInput = {
|
|
15
56
|
readonly kind: 'edge';
|
|
16
57
|
readonly orientation: 'directed';
|
|
17
|
-
|
|
18
|
-
} & Omit<DirectedEdgeInput, 'orientation'>;
|
|
58
|
+
} & Declared<DirectedOptions>;
|
|
19
59
|
type UndirectedInput = {
|
|
20
60
|
readonly kind: 'edge';
|
|
21
61
|
readonly orientation: 'undirected';
|
|
22
|
-
|
|
23
|
-
} & Omit<UndirectedEdgeInput, 'orientation'>;
|
|
62
|
+
} & Declared<UndirectedOptions>;
|
|
24
63
|
/**
|
|
25
64
|
* Author a Node Class whose materialized configuration always carries an explicitly selected,
|
|
26
|
-
* admitted SVG icon. The mapped input retains inference
|
|
27
|
-
* Config interface names into portable structure for downstream
|
|
65
|
+
* admitted SVG icon and, when concrete, a declared read rule. The mapped input retains inference
|
|
66
|
+
* while expanding package-private Config interface names into portable structure for downstream
|
|
67
|
+
* declaration emit.
|
|
28
68
|
*/
|
|
29
|
-
export declare function nodeClass<const Config extends NodeClassInput>(config: Config & Record<Exclude<keyof Config, keyof NodeClassInput>, never>): AuthoredNodeClass<{
|
|
69
|
+
export declare function nodeClass<const Config extends NodeClassInput>(config: Config & Record<Exclude<keyof Config, keyof NodeClassInput>, never> & DeclaredReadRule<Config, NodeClassReadRule>): AuthoredNodeClass<{
|
|
30
70
|
[Key in keyof Config]: Key extends 'properties' | 'methods' | 'policies' ? {
|
|
31
71
|
[Member in keyof NonNullable<Config[Key]>]: NonNullable<Config[Key]>[Member];
|
|
32
72
|
} | Extract<Config[Key], undefined> : Key extends 'extends' ? Config[Key] extends infer Parents extends NodeClassInput['extends'] ? Parents extends readonly unknown[] ? readonly [...Parents] : Parents : never : Config[Key];
|
|
33
73
|
}>;
|
|
74
|
+
declare function directed<const Input extends DirectedOptions>(input: Input & Parameters<typeof kernelEdgeClass.directed<Input>>[0] & DeclaredReadRule<Input>): ReturnType<typeof kernelEdgeClass.directed<Input>>;
|
|
75
|
+
declare function undirected<const Input extends UndirectedOptions>(input: Input & Parameters<typeof kernelEdgeClass.undirected<Input>>[0] & DeclaredReadRule<Input>): ReturnType<typeof kernelEdgeClass.undirected<Input>>;
|
|
76
|
+
/**
|
|
77
|
+
* Author an Edge Class. A concrete Edge Class declares its read rule exactly as a Node Class
|
|
78
|
+
* does; the handle is the canonical DSL handle.
|
|
79
|
+
*/
|
|
80
|
+
export declare const edgeClass: Readonly<{
|
|
81
|
+
directed: typeof directed;
|
|
82
|
+
undirected: typeof undirected;
|
|
83
|
+
}>;
|
|
34
84
|
export declare function defineClass(config: NodeInput): NodeClass;
|
|
35
85
|
export declare function defineClass(config: DirectedInput): DirectedEdgeClass;
|
|
36
86
|
export declare function defineClass(config: UndirectedInput): UndirectedEdgeClass;
|
|
@@ -1,20 +1,53 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { edgeClass as kernelEdgeClass, nodeClass as kernelNodeClass, } from '@astrale-os/kernel-dsl/v1/builder';
|
|
2
|
+
import { assertNoUndeclaredCallerRule } from './callable-authoring.js';
|
|
2
3
|
import { classIcon } from './class-icon.js';
|
|
3
4
|
export function nodeClass(config) {
|
|
4
5
|
if (config === undefined || config.icon === undefined) {
|
|
5
6
|
throw new TypeError('Node Class icon is required; use classIcon.neutral to make an explicit neutral choice.');
|
|
6
7
|
}
|
|
8
|
+
assertDeclaredReadRule('Node', config);
|
|
9
|
+
if (config.abstract !== true)
|
|
10
|
+
assertNoUndeclaredCallerRule(config.methods);
|
|
7
11
|
return kernelNodeClass({
|
|
8
12
|
...config,
|
|
9
13
|
icon: classIcon.svg(config.icon),
|
|
10
14
|
});
|
|
11
15
|
}
|
|
16
|
+
function directed(input) {
|
|
17
|
+
assertDeclaredReadRule('Edge', input);
|
|
18
|
+
return kernelEdgeClass.directed(input);
|
|
19
|
+
}
|
|
20
|
+
function undirected(input) {
|
|
21
|
+
assertDeclaredReadRule('Edge', input);
|
|
22
|
+
return kernelEdgeClass.undirected(input);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Author an Edge Class. A concrete Edge Class declares its read rule exactly as a Node Class
|
|
26
|
+
* does; the handle is the canonical DSL handle.
|
|
27
|
+
*/
|
|
28
|
+
export const edgeClass = Object.freeze({ directed, undirected });
|
|
12
29
|
export function defineClass(config) {
|
|
13
30
|
if (config.kind === 'node') {
|
|
14
31
|
const { kind: _, ...input } = config;
|
|
15
32
|
return nodeClass(input);
|
|
16
33
|
}
|
|
17
|
-
if (config.orientation === 'directed')
|
|
18
|
-
|
|
19
|
-
|
|
34
|
+
if (config.orientation === 'directed') {
|
|
35
|
+
const { kind: _, orientation: __, ...input } = config;
|
|
36
|
+
return edgeClass.directed(input);
|
|
37
|
+
}
|
|
38
|
+
const { kind: _, orientation: __, ...input } = config;
|
|
39
|
+
return edgeClass.undirected(input);
|
|
40
|
+
}
|
|
41
|
+
/** The authoring boundary restates the type contract for untyped and widened configurations. */
|
|
42
|
+
function assertDeclaredReadRule(kind, config) {
|
|
43
|
+
if (config.abstract === true)
|
|
44
|
+
return;
|
|
45
|
+
const rule = kind === 'Node' ? 'a Policy, Policy checks, true or false' : 'a Policy, true or false';
|
|
46
|
+
const read = config.policies?.read;
|
|
47
|
+
if (read === undefined) {
|
|
48
|
+
throw new TypeError(`${kind} Class read rule is required; declare policies.read with ${rule}.`);
|
|
49
|
+
}
|
|
50
|
+
if (read !== true && config.policies?.traverse === undefined) {
|
|
51
|
+
throw new TypeError(`${kind} Class traverse rule is required when its read rule is not true; declare policies.traverse with ${rule}.`);
|
|
52
|
+
}
|
|
20
53
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
declare const CLASS_ICON: unique symbol;
|
|
2
|
+
/** An admitted, self-contained SVG suitable for a Node Class presentation icon. */
|
|
3
|
+
export type ClassIcon = string & {
|
|
4
|
+
readonly [CLASS_ICON]: true;
|
|
5
|
+
};
|
|
6
|
+
/** Stable empty SVG used when an author explicitly chooses to render no icon glyph. */
|
|
7
|
+
export declare const NEUTRAL_CLASS_ICON_SVG = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"></svg>";
|
|
8
|
+
export declare function admitClassIconSvg(source: string): ClassIcon;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
const MAX_CLASS_ICON_LENGTH = 8_000;
|
|
2
|
+
const SVG_ROOT = /^<svg(?:\s[^>]*)?>[\s\S]*<\/svg>$/u;
|
|
3
|
+
const SVG_ROOT_OPEN = /<svg(?:\s|>)/gu;
|
|
4
|
+
const SVG_ROOT_CLOSE = /<\/svg\s*>/gu;
|
|
5
|
+
const SVG_GRAPHIC = /<(?:circle|ellipse|line|path|polygon|polyline|rect)\b/iu;
|
|
6
|
+
const UNSAFE_SVG = /<\s*(?:animate|discard|embed|foreignObject|iframe|image|object|script|set|style|use)\b|<!DOCTYPE\b|<!ENTITY\b|\son[a-z][\w:.-]*\s*=|(?:href|xlink:href)\s*=|javascript\s*:|url\s*\(/iu;
|
|
7
|
+
/** Stable empty SVG used when an author explicitly chooses to render no icon glyph. */
|
|
8
|
+
export const NEUTRAL_CLASS_ICON_SVG = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"></svg>';
|
|
9
|
+
export function admitClassIconSvg(source) {
|
|
10
|
+
if (typeof source !== 'string') {
|
|
11
|
+
throw new TypeError('Class icon must be an inline SVG string.');
|
|
12
|
+
}
|
|
13
|
+
const value = source.trim();
|
|
14
|
+
if (Array.from(value).length > MAX_CLASS_ICON_LENGTH) {
|
|
15
|
+
throw new TypeError(`Class icon must contain at most ${MAX_CLASS_ICON_LENGTH} characters.`);
|
|
16
|
+
}
|
|
17
|
+
if (!SVG_ROOT.test(value) ||
|
|
18
|
+
(value.match(SVG_ROOT_OPEN)?.length ?? 0) !== 1 ||
|
|
19
|
+
(value.match(SVG_ROOT_CLOSE)?.length ?? 0) !== 1) {
|
|
20
|
+
throw new TypeError('Class icon must be one complete inline <svg> element.');
|
|
21
|
+
}
|
|
22
|
+
if (UNSAFE_SVG.test(value)) {
|
|
23
|
+
throw new TypeError('Class icon SVG must be self-contained and contain no executable content.');
|
|
24
|
+
}
|
|
25
|
+
if (value !== NEUTRAL_CLASS_ICON_SVG && !SVG_GRAPHIC.test(value)) {
|
|
26
|
+
throw new TypeError('Class icon SVG must contain a visible vector element.');
|
|
27
|
+
}
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
import type { LucideIconData } from '@lucide/icons';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
export
|
|
5
|
-
readonly [CLASS_ICON]: true;
|
|
6
|
-
};
|
|
7
|
-
/** Stable empty SVG used when an author explicitly chooses to render no icon glyph. */
|
|
8
|
-
export declare const NEUTRAL_CLASS_ICON_SVG = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"></svg>";
|
|
2
|
+
import type { ClassIcon } from './class-icon-svg.js';
|
|
3
|
+
export type { ClassIcon } from './class-icon-svg.js';
|
|
4
|
+
export { NEUTRAL_CLASS_ICON_SVG } from './class-icon-svg.js';
|
|
9
5
|
/** Framework-neutral constructors for canonical Node Class icons. */
|
|
10
6
|
export declare const classIcon: Readonly<{
|
|
11
7
|
readonly neutral: ClassIcon;
|
|
12
8
|
svg(source: string): ClassIcon;
|
|
13
9
|
lucide(icon: LucideIconData): ClassIcon;
|
|
14
10
|
}>;
|
|
15
|
-
export {};
|
|
@@ -1,33 +1,6 @@
|
|
|
1
1
|
import { buildLucideSvg } from '@lucide/icons/build';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const SVG_ROOT_OPEN = /<svg(?:\s|>)/gu;
|
|
5
|
-
const SVG_ROOT_CLOSE = /<\/svg\s*>/gu;
|
|
6
|
-
const SVG_GRAPHIC = /<(?:circle|ellipse|line|path|polygon|polyline|rect)\b/iu;
|
|
7
|
-
const UNSAFE_SVG = /<\s*(?:animate|discard|embed|foreignObject|iframe|image|object|script|set|style|use)\b|<!DOCTYPE\b|<!ENTITY\b|\son[a-z][\w:.-]*\s*=|(?:href|xlink:href)\s*=|javascript\s*:|url\s*\(/iu;
|
|
8
|
-
/** Stable empty SVG used when an author explicitly chooses to render no icon glyph. */
|
|
9
|
-
export const NEUTRAL_CLASS_ICON_SVG = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"></svg>';
|
|
10
|
-
function svg(source) {
|
|
11
|
-
if (typeof source !== 'string') {
|
|
12
|
-
throw new TypeError('Class icon must be an inline SVG string.');
|
|
13
|
-
}
|
|
14
|
-
const value = source.trim();
|
|
15
|
-
if (Array.from(value).length > MAX_CLASS_ICON_LENGTH) {
|
|
16
|
-
throw new TypeError(`Class icon must contain at most ${MAX_CLASS_ICON_LENGTH} characters.`);
|
|
17
|
-
}
|
|
18
|
-
if (!SVG_ROOT.test(value) ||
|
|
19
|
-
(value.match(SVG_ROOT_OPEN)?.length ?? 0) !== 1 ||
|
|
20
|
-
(value.match(SVG_ROOT_CLOSE)?.length ?? 0) !== 1) {
|
|
21
|
-
throw new TypeError('Class icon must be one complete inline <svg> element.');
|
|
22
|
-
}
|
|
23
|
-
if (UNSAFE_SVG.test(value)) {
|
|
24
|
-
throw new TypeError('Class icon SVG must be self-contained and contain no executable content.');
|
|
25
|
-
}
|
|
26
|
-
if (value !== NEUTRAL_CLASS_ICON_SVG && !SVG_GRAPHIC.test(value)) {
|
|
27
|
-
throw new TypeError('Class icon SVG must contain a visible vector element.');
|
|
28
|
-
}
|
|
29
|
-
return value;
|
|
30
|
-
}
|
|
2
|
+
import { admitClassIconSvg as svg, NEUTRAL_CLASS_ICON_SVG } from './class-icon-svg.js';
|
|
3
|
+
export { NEUTRAL_CLASS_ICON_SVG } from './class-icon-svg.js';
|
|
31
4
|
function lucide(icon) {
|
|
32
5
|
let source;
|
|
33
6
|
try {
|