@astrale-os/sdk 0.6.0-beta.12 → 0.6.0-beta.14

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.
Files changed (144) hide show
  1. package/README.md +7 -2
  2. package/dist/application/action/context.d.ts +5 -6
  3. package/dist/application/dependency/invoker.d.ts +2 -2
  4. package/dist/deployment/adapter/adapter.d.ts +1 -6
  5. package/dist/deployment/adapter/legacy/adapter.d.ts +0 -10
  6. package/dist/deployment/adapter/legacy/deploy/context.d.ts +0 -2
  7. package/dist/deployment/adapter/legacy/deploy/result.d.ts +2 -3
  8. package/dist/deployment/adapter/legacy/index.d.ts +10 -8
  9. package/dist/deployment/adapter/legacy/prepare/context.d.ts +0 -2
  10. package/dist/deployment/adapter/release/context.d.ts +16 -2
  11. package/dist/deployment/address/index.d.ts +1 -1
  12. package/dist/deployment/address/index.js +1 -0
  13. package/dist/deployment/address/summary.d.ts +30 -0
  14. package/dist/deployment/address/summary.js +117 -1
  15. package/dist/deployment/build/index.d.ts +1 -1
  16. package/dist/deployment/build/index.js +1 -1
  17. package/dist/deployment/build/manifest.d.ts +5 -0
  18. package/dist/deployment/build/manifest.js +10 -0
  19. package/dist/deployment/index.d.ts +1 -1
  20. package/dist/deployment/release/legacy/index.d.ts +15 -10
  21. package/dist/deployment/release/legacy/index.js +15 -10
  22. package/dist/deployment/verify/readiness/deployment.js +3 -13
  23. package/dist/deployment/verify/readiness/fetch.d.ts +13 -0
  24. package/dist/deployment/verify/readiness/fetch.js +26 -0
  25. package/dist/deployment/verify/readiness/identity.d.ts +3 -6
  26. package/dist/deployment/verify/readiness/identity.js +3 -3
  27. package/dist/deployment/verify/readiness/index.d.ts +12 -8
  28. package/dist/deployment/verify/readiness/index.js +15 -4
  29. package/dist/deployment/verify/readiness/legacy/index.d.ts +2 -0
  30. package/dist/deployment/verify/readiness/legacy/index.js +2 -0
  31. package/dist/deployment/verify/readiness/legacy/publication.d.ts +12 -0
  32. package/dist/deployment/verify/readiness/legacy/publication.js +23 -0
  33. package/dist/deployment/verify/readiness/release.d.ts +8 -0
  34. package/dist/deployment/verify/readiness/release.js +22 -0
  35. package/dist/execution/identity/authentication.d.ts +10 -2
  36. package/dist/execution/identity/authentication.js +21 -7
  37. package/dist/execution/identity/callback.d.ts +2 -12
  38. package/dist/execution/identity/callback.js +3 -9
  39. package/dist/execution/identity/delivery.d.ts +11 -4
  40. package/dist/execution/identity/delivery.js +47 -20
  41. package/dist/execution/identity/identity.d.ts +7 -3
  42. package/dist/execution/identity/identity.js +2 -2
  43. package/dist/execution/invocation/admission/authentication.d.ts +3 -8
  44. package/dist/execution/invocation/admission/authentication.js +10 -24
  45. package/dist/execution/invocation/admission/authority.d.ts +12 -6
  46. package/dist/execution/invocation/admission/authority.js +5 -1
  47. package/dist/execution/invocation/dependency/bind.d.ts +1 -1
  48. package/dist/execution/invocation/dependency/bind.js +0 -1
  49. package/dist/execution/invocation/dispatch/context.js +0 -1
  50. package/dist/execution/invocation/invocation.js +51 -14
  51. package/dist/execution/runtime/index.d.ts +1 -0
  52. package/dist/execution/runtime/index.js +1 -0
  53. package/dist/execution/runtime/load.d.ts +3 -3
  54. package/dist/execution/runtime/load.js +3 -2
  55. package/dist/execution/runtime/release.d.ts +22 -0
  56. package/dist/execution/runtime/release.js +14 -0
  57. package/dist/execution/serve.d.ts +2 -2
  58. package/dist/execution/service/create.js +9 -7
  59. package/dist/execution/service/release.d.ts +2 -2
  60. package/dist/execution/service/release.js +3 -2
  61. package/dist/execution/service/service.d.ts +9 -5
  62. package/dist/execution/service/serving/delivery.d.ts +6 -0
  63. package/dist/execution/service/{publication → serving}/delivery.js +5 -1
  64. package/dist/execution/service/{publication → serving}/index.d.ts +1 -1
  65. package/dist/execution/service/serving/installation.d.ts +4 -0
  66. package/dist/execution/service/serving/installation.js +9 -0
  67. package/dist/execution/service/serving/legacy/index.d.ts +15 -0
  68. package/dist/execution/service/serving/legacy/index.js +19 -0
  69. package/dist/execution/service/serving/source.d.ts +18 -0
  70. package/dist/execution/service/serving/source.js +19 -0
  71. package/dist/project/define.js +57 -28
  72. package/dist/project/install-command.d.ts +10 -0
  73. package/dist/project/install-command.js +13 -0
  74. package/dist/project/project.d.ts +4 -2
  75. package/dist/tooling/cli/arguments.d.ts +0 -2
  76. package/dist/tooling/cli/arguments.js +22 -15
  77. package/dist/tooling/cli/commit.d.ts +23 -0
  78. package/dist/tooling/cli/commit.js +216 -0
  79. package/dist/tooling/cli/deploy-mode.d.ts +19 -12
  80. package/dist/tooling/cli/deploy-mode.js +14 -32
  81. package/dist/tooling/cli/deploy-result.d.ts +10 -7
  82. package/dist/tooling/cli/deploy-result.js +4 -3
  83. package/dist/tooling/cli/development/candidate.d.ts +2 -3
  84. package/dist/tooling/cli/development/candidate.js +2 -9
  85. package/dist/tooling/cli/development/deployment.d.ts +2 -8
  86. package/dist/tooling/cli/development/deployment.js +2 -21
  87. package/dist/tooling/cli/development/develop.d.ts +4 -3
  88. package/dist/tooling/cli/development/develop.js +8 -112
  89. package/dist/tooling/cli/development/report.d.ts +1 -3
  90. package/dist/tooling/cli/development/report.js +1 -4
  91. package/dist/tooling/cli/help.js +28 -26
  92. package/dist/tooling/cli/immutable-deployment.d.ts +27 -0
  93. package/dist/tooling/cli/immutable-deployment.js +95 -0
  94. package/dist/tooling/cli/index.d.ts +2 -4
  95. package/dist/tooling/cli/index.js +2 -3
  96. package/dist/tooling/cli/legacy/deploy-result.d.ts +5 -3
  97. package/dist/tooling/cli/legacy/deploy-result.js +5 -3
  98. package/dist/tooling/cli/legacy/stable-target-adapter.d.ts +5 -3
  99. package/dist/tooling/cli/legacy/stable-target-deploy.d.ts +42 -0
  100. package/dist/tooling/cli/legacy/stable-target-deploy.js +104 -0
  101. package/dist/tooling/cli/orchestrate.js +46 -97
  102. package/dist/tooling/cli/secrets.d.ts +9 -0
  103. package/dist/tooling/cli/secrets.js +19 -0
  104. package/dist/tooling/linter/implementations/source/dependencies.js +8 -6
  105. package/dist/tooling/linter/policy/generated.js +2 -2
  106. package/package.json +1 -1
  107. package/dist/deployment/verify/readiness/publication.d.ts +0 -11
  108. package/dist/deployment/verify/readiness/publication.js +0 -41
  109. package/dist/execution/service/publication/delivery.d.ts +0 -2
  110. package/dist/execution/service/publication/installation.d.ts +0 -3
  111. package/dist/execution/service/publication/installation.js +0 -8
  112. package/dist/execution/service/publication/source.d.ts +0 -3
  113. package/dist/execution/service/publication/source.js +0 -11
  114. package/dist/tooling/cli/astrale/authority.d.ts +0 -5
  115. package/dist/tooling/cli/astrale/authority.js +0 -11
  116. package/dist/tooling/cli/astrale/executable.d.ts +0 -2
  117. package/dist/tooling/cli/astrale/executable.js +0 -47
  118. package/dist/tooling/cli/astrale/failure.d.ts +0 -6
  119. package/dist/tooling/cli/astrale/failure.js +0 -48
  120. package/dist/tooling/cli/astrale/instance.d.ts +0 -11
  121. package/dist/tooling/cli/astrale/instance.js +0 -52
  122. package/dist/tooling/cli/astrale/process.d.ts +0 -13
  123. package/dist/tooling/cli/astrale/process.js +0 -94
  124. package/dist/tooling/cli/astrale/version.d.ts +0 -18
  125. package/dist/tooling/cli/astrale/version.js +0 -55
  126. package/dist/tooling/cli/development/release-evidence.d.ts +0 -4
  127. package/dist/tooling/cli/development/release-evidence.js +0 -10
  128. package/dist/tooling/cli/development/session-file.d.ts +0 -53
  129. package/dist/tooling/cli/development/session-file.js +0 -337
  130. package/dist/tooling/cli/development/target-lock.d.ts +0 -16
  131. package/dist/tooling/cli/development/target-lock.js +0 -68
  132. package/dist/tooling/cli/development/view.d.ts +0 -28
  133. package/dist/tooling/cli/development/view.js +0 -151
  134. package/dist/tooling/cli/environment-release.d.ts +0 -24
  135. package/dist/tooling/cli/environment-release.js +0 -46
  136. package/dist/tooling/cli/evidence.d.ts +0 -14
  137. package/dist/tooling/cli/evidence.js +0 -53
  138. package/dist/tooling/cli/installation/index.d.ts +0 -2
  139. package/dist/tooling/cli/installation/index.js +0 -1
  140. package/dist/tooling/cli/installation/observation.d.ts +0 -10
  141. package/dist/tooling/cli/installation/observation.js +0 -44
  142. package/dist/tooling/cli/installation/reconcile.d.ts +0 -32
  143. package/dist/tooling/cli/installation/reconcile.js +0 -122
  144. /package/dist/execution/service/{publication → serving}/index.js +0 -0
package/README.md CHANGED
@@ -75,8 +75,9 @@ deployment's URL is its issuer, so `assemble(build, buildDigest, url)` takes the
75
75
  ## Handler authority and dependencies
76
76
 
77
77
  Authenticated handlers use Domain self authority for `kernel`, `graph`, `query`, and `mutate`.
78
- `dependencies.directory.invoke(d => d.functions.lookup, input)` calls a direct declared dependency
79
- with the incoming caller Grant. Explicit authority remains on `kernel` and `graph`; the former
78
+ `dependencies.directory.caller.invoke(d => d.functions.lookup, input)` calls a direct declared
79
+ dependency on behalf of the incoming caller Identity; `.self` calls it as the executing Domain.
80
+ Explicit `caller` or `self` authority is also available on `kernel` and `graph`; the former
80
81
  handler `client` is removed. See [the API and migration guide](docs/handler-dependencies.md).
81
82
 
82
83
  ## Durable Workflows
@@ -344,6 +345,10 @@ did not derive.
344
345
  - **Record.** `acceptDeploymentRecord` admits a `DeploymentRecordV1` only when its provider
345
346
  script is the label that its own fields derive. A host admits the record a deploy declares with
346
347
  it before storing it, so every stored record decodes.
348
+ - **Platform summary.** `acceptPlatformDeploymentSummary` admits the `summary:<label>` a platform
349
+ dispatch namespace keeps beside `record:<label>`: the deployment's `DeploymentSummaryV1` without
350
+ its record, owned by `platform`, named by its label, with no provider version id and no
351
+ `lastCallAt` or `expiresAt`. `encodePlatformDeploymentSummary` gives its one canonical text.
347
352
 
348
353
  ```ts
349
354
  import {
@@ -1,4 +1,4 @@
1
- import type { AuthenticationEvidence, Grant, IdentityId } from '../../platform/auth/index.js';
1
+ import type { AuthenticationEvidence, IdentityId } from '../../platform/auth/index.js';
2
2
  import type { BoundClientSession } from '../../platform/client/session/index.js';
3
3
  import type { NodeId } from '../../platform/graph/node/index.js';
4
4
  import type { CallableInputOf, CallableInputModeOf, Domain, ResolvedFunction, ResolvedMethod } from '../../platform/schema/index.js';
@@ -11,11 +11,10 @@ export type ResolvedCallable = ResolvedFunction | ResolvedMethod;
11
11
  /** Bearer-free caller evidence established before an Action or Workflow runs. */
12
12
  export interface AuthenticatedCaller {
13
13
  readonly kind: 'authenticated';
14
- /** Exact effective caller Identity. Access fails when authority is compound. */
14
+ /** The one Identity whose authority this invocation exercises: ownership and attribution. */
15
15
  readonly identity: IdentityId;
16
- /** Identity whose credential directly authenticated this invocation. */
16
+ /** Executor whose credential directly authenticated this invocation (for example this Domain). */
17
17
  readonly principal: IdentityId;
18
- readonly authority: Grant;
19
18
  readonly authentication: AuthenticationEvidence;
20
19
  }
21
20
  export interface AnonymousCaller {
@@ -48,9 +47,9 @@ export interface DomainGraphExecutor<DomainValue extends Domain = Domain> {
48
47
  readonly query: QueryExecutor<DomainValue>;
49
48
  readonly mutate: MutationExecutor<DomainValue>;
50
49
  }
51
- export type DomainGraphExecutors<DomainValue extends Domain = Domain> = Readonly<DomainGraphExecutor<DomainValue> & Record<'caller' | 'self' | 'union', DomainGraphExecutor<DomainValue>>>;
50
+ export type DomainGraphExecutors<DomainValue extends Domain = Domain> = Readonly<DomainGraphExecutor<DomainValue> & Record<'caller' | 'self', DomainGraphExecutor<DomainValue>>>;
52
51
  /** Self-default Kernel session with one level of explicit authority selection. */
53
- export type DomainKernelSessions = Readonly<BoundClientSession & Record<'caller' | 'self' | 'union', BoundClientSession>>;
52
+ export type DomainKernelSessions = Readonly<BoundClientSession & Record<'caller' | 'self', BoundClientSession>>;
54
53
  type AuthorityOf<Callable, DomainValue extends Domain> = Callable extends {
55
54
  readonly auth: 'anonymous';
56
55
  } ? {
@@ -22,10 +22,10 @@ export interface DependencyInvoker<D extends Domain> {
22
22
  }
23
23
  /**
24
24
  * Direct Schema aliases with explicit authority selection and no default invoke.
25
- * self is the executing Domain; caller forwards the incoming Grant; union combines both.
25
+ * self is the executing Domain; caller forwards the incoming caller Identity.
26
26
  * The canonical Kernel is exposed through context.kernel.
27
27
  */
28
28
  export type HandlerDependencies<D extends Domain> = Readonly<{
29
- [Alias in keyof D['dependencies'] as D['dependencies'][Alias] extends schema.DomainOf<KernelSchema> ? never : Alias]: Readonly<Record<'caller' | 'self' | 'union', DependencyInvoker<Extract<D['dependencies'][Alias], Domain>>>>;
29
+ [Alias in keyof D['dependencies'] as D['dependencies'][Alias] extends schema.DomainOf<KernelSchema> ? never : Alias]: Readonly<Record<'caller' | 'self', DependencyInvoker<Extract<D['dependencies'][Alias], Domain>>>>;
30
30
  }>;
31
31
  export {};
@@ -1,15 +1,10 @@
1
1
  import type { DeploymentSummaryV1, FrozenConfigurationV1 } from '../address/index.js';
2
2
  import type { Bundler } from './bundle/index.js';
3
- import type { ArtifactSource, DeployContext, DeployResult, InstallationTarget, PrepareContext } from './legacy/index.js';
3
+ import type { ArtifactSource, DeployContext, DeployResult, PrepareContext } from './legacy/index.js';
4
4
  import type { ConfigureContext, ListContext, Placement, PlacementContext, ReleaseDeployContext, ReleaseDeployResult, RetainContext } from './release/index.js';
5
5
  /** What `admit` receives when `defineProject` binds an adapter to one Environment. */
6
6
  export interface AdapterEnvironmentContext {
7
7
  readonly environment: string;
8
- /**
9
- * @deprecated Deploy-time installation, which the canonical path refuses (CT33). Replacement:
10
- * `astrale domain install <url> -i <instance>` after `astrale-domain deploy <environment>`.
11
- */
12
- readonly installation?: InstallationTarget;
13
8
  }
14
9
  /**
15
10
  * A provider adapter (adapter interface v2). It bundles a Build without any Environment, freezes
@@ -2,16 +2,6 @@ import type { AdapterEnvironmentContext } from '../adapter.js';
2
2
  import type { Bundler } from '../bundle/index.js';
3
3
  import type { DeployContext, DeployResult } from './deploy/index.js';
4
4
  import type { ArtifactSource, PrepareContext } from './prepare/index.js';
5
- /**
6
- * The instance an Environment's `installation` installs on after each deploy.
7
- *
8
- * @deprecated Deploy-time installation. Replacement: `astrale domain install <url> -i <instance>`
9
- * after `astrale-domain deploy <environment>`, which never installs.
10
- */
11
- export interface InstallationTarget {
12
- readonly instance: string;
13
- readonly identity?: string;
14
- }
15
5
  /**
16
6
  * A provider adapter on the contract before adapter interface v2: `prepare` places a build at one
17
7
  * stable target per Environment and `deploy` replaces that target's code in place. It declares no
@@ -1,4 +1,3 @@
1
- import type { InstallationTarget } from '../adapter.js';
2
1
  import type { PreparedArtifact } from '../prepare/index.js';
3
2
  /**
4
3
  * What a legacy `deploy` receives to replace one Environment's stable target in place.
@@ -9,7 +8,6 @@ import type { PreparedArtifact } from '../prepare/index.js';
9
8
  export interface DeployContext {
10
9
  readonly projectDir: string;
11
10
  readonly environment: string;
12
- readonly installation?: InstallationTarget;
13
11
  /** Optional command-scoped identity override (`--as`). */
14
12
  readonly identity?: string;
15
13
  /** Optional command-scoped credential; trusted adapters must neither retain nor disclose it. */
@@ -9,7 +9,7 @@ import type { MutationKnowledge } from '../../release/index.js';
9
9
  * @deprecated Legacy `prepare`/`deploy` contract (see `../index.ts`). Replacement:
10
10
  * `ReleaseDeploymentPhase`; an immutable deployment is neither addressed nor installed by its deploy.
11
11
  */
12
- export type DeploymentPhase = 'prerequisite' | 'provider' | 'addressing' | 'release' | 'configuration' | 'installation' | 'readiness';
12
+ export type DeploymentPhase = 'prerequisite' | 'provider' | 'addressing' | 'release' | 'configuration' | 'readiness';
13
13
  /**
14
14
  * What a provider reports for the stable target it replaced.
15
15
  *
@@ -43,13 +43,12 @@ export type AppliedProviderDeployment = {
43
43
  * What a legacy `deploy` changed, effect by effect.
44
44
  *
45
45
  * @deprecated Legacy `prepare`/`deploy` contract (see `../index.ts`). Replacement:
46
- * `FailedReleaseDeployResult.provider`; an immutable deployment's deploy installs nothing.
46
+ * `FailedReleaseDeployResult.provider`.
47
47
  */
48
48
  export interface DeploymentProgress {
49
49
  readonly prerequisite: MutationKnowledge;
50
50
  readonly provider: MutationKnowledge<ProviderDeploymentEvidence>;
51
51
  readonly configuration: MutationKnowledge;
52
- readonly installation: MutationKnowledge;
53
52
  }
54
53
  /**
55
54
  * A stable target replaced in place and ready.
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * The adapter contract before adapter interface v2: `prepare` places a build at one stable target
3
- * per Environment, `deploy` replaces that target's code in place and may install it, and the
4
- * stable target serves a v3 Publication under an issuer bound to it for life.
3
+ * per Environment, `deploy` replaces that target's code in place, and the stable target serves a
4
+ * v3 Publication under an issuer bound to it for life. Neither installs anything.
5
5
  *
6
6
  * @deprecated Replacement: `Adapter` (adapter interface v2): beside the same `bundler`, `configure`,
7
7
  * `placement` and `deployRelease`, which deploys one sealed release as one immutable deployment,
@@ -11,14 +11,16 @@
11
11
  * `astrale-domain dev` run through these operations:
12
12
  * - adapter-cloudflare direct mode (`route`, `workerName`, `identityIssuer`, `addressing`,
13
13
  * `signingIdentity`, or no `namespace`), which serves the configurations of domains ai-gateway,
14
- * closing, grc, integrations and issues (until SV15), shell (until SH2), the Services
15
- * `development` environment (until SV9) and ui:domain (until UI1);
14
+ * closing, grc, integrations and issues (until SV15), domains organization (until it leaves
15
+ * direct mode, AM-147), the Services `beta` and `prod` (until SV12), `development` (until SV9)
16
+ * and frozen `admin-beta` (until D19) environments, shell (until SH2) and its frozen `legacy-v3`
17
+ * (until D22), and ui:domain (until UI1);
16
18
  * - adapter-astrale, until S8 gives it `deployRelease`.
17
19
  *
18
- * Removal: D10, once no supported configuration selects the direct-mode path (CT33); it deletes
19
- * these types with `prepare`/`deploy`, `src/deployment/release/legacy` and the stable-target CLI
20
- * path.
20
+ * Removal: D10, once no configuration on any repository's main selects the direct-mode path
21
+ * (CT33, AM-147); it deletes these types with `prepare`/`deploy`, `src/deployment/release/legacy`
22
+ * and the stable-target CLI path.
21
23
  */
22
- export type { InstallationTarget, LegacyAdapter, LegacyAdapterInput } from './adapter.js';
24
+ export type { LegacyAdapter, LegacyAdapterInput } from './adapter.js';
23
25
  export type * from './prepare/index.js';
24
26
  export type * from './deploy/index.js';
@@ -1,7 +1,6 @@
1
1
  import type { Build } from '../../../build/index.js';
2
2
  import type { ResolvedRuntimeReference } from '../../../runtime/index.js';
3
3
  import type { Bundle } from '../../bundle/index.js';
4
- import type { InstallationTarget } from '../adapter.js';
5
4
  /**
6
5
  * What `prepare` receives to produce the artifact of one Environment's stable target.
7
6
  *
@@ -11,7 +10,6 @@ import type { InstallationTarget } from '../adapter.js';
11
10
  export interface PrepareContext<BuildValue extends Build = Build> {
12
11
  readonly projectDir: string;
13
12
  readonly environment: string;
14
- readonly installation?: InstallationTarget;
15
13
  /**
16
14
  * Preparation purpose. Remote development and one-shot deployment both
17
15
  * prepare complete release artifacts. Omitted by older custom callers means
@@ -1,9 +1,19 @@
1
1
  import type { DeploymentCommitV1, FrozenConfigurationV1, LineAddressing } from '../../address/index.js';
2
2
  import type { Release } from '../../release/index.js';
3
3
  import type { Bundle } from '../bundle/index.js';
4
- /** What `configure` receives: the Environment whose configuration it freezes, nothing else. */
4
+ /**
5
+ * What `configure` receives: the Environment whose configuration it freezes, and the names of the
6
+ * secrets its deployment binds. Never a secret value: a rotated value is not another configuration,
7
+ * a name added or removed is.
8
+ */
5
9
  export interface ConfigureContext {
6
10
  readonly environment: string;
11
+ /**
12
+ * The names of the Environment's current secrets (the adapter's `secretsFile`), sorted and
13
+ * unique: exactly the secrets `deployRelease` receives, which the configuration declares in
14
+ * `bindings.secrets`.
15
+ */
16
+ readonly secrets: readonly string[];
7
17
  }
8
18
  /**
9
19
  * Where the host places the deployments of one Environment. `routingDomain` is the DNS name every
@@ -56,7 +66,11 @@ export interface ReleaseDeployContext {
56
66
  * `DomainRelease` v4 the deployment serves at `release.json`, its `url` the deployment URL.
57
67
  */
58
68
  readonly release: Release;
59
- /** The commit the deployment is built from, as its deployment record declares it. */
69
+ /**
70
+ * The commit this deploy runs from, which the record of a deployment it creates declares. The
71
+ * label does not cover it: a reused deployment keeps the record, and so the commit, of the deploy
72
+ * that created it, and an adapter never refuses a reuse for another commit.
73
+ */
60
74
  readonly commit: DeploymentCommitV1 | null;
61
75
  /** Parent-owned lifecycle cancellation shared by every provider effect. */
62
76
  readonly signal: AbortSignal;
@@ -2,4 +2,4 @@ export { configurationDigest, frozenConfiguration, FROZEN_CONFIGURATION_FORMAT,
2
2
  export { DEPLOYMENT_LABEL, deploymentContent, deploymentLabel, deploymentUrl, parseDeploymentLabel, type DeploymentLabelParts, } from './label.js';
3
3
  export { deploymentLine, lineFingerprint, readablePart, type DeploymentLineInput, type LineAddressing, } from './line.js';
4
4
  export { acceptDeploymentRecord, DEPLOYMENT_RECORD_FORMAT, DEPLOYMENT_RECORD_VERSION, type DeploymentCommitV1, type DeploymentRecordV1, } from './record.js';
5
- export type { DeploymentSummaryV1 } from './summary.js';
5
+ export { acceptPlatformDeploymentSummary, encodePlatformDeploymentSummary, PLATFORM_OWNER, type DeploymentSummaryV1, type PlatformDeploymentSummaryV1, } from './summary.js';
@@ -2,3 +2,4 @@ export { configurationDigest, frozenConfiguration, FROZEN_CONFIGURATION_FORMAT,
2
2
  export { DEPLOYMENT_LABEL, deploymentContent, deploymentLabel, deploymentUrl, parseDeploymentLabel, } from './label.js';
3
3
  export { deploymentLine, lineFingerprint, readablePart, } from './line.js';
4
4
  export { acceptDeploymentRecord, DEPLOYMENT_RECORD_FORMAT, DEPLOYMENT_RECORD_VERSION, } from './record.js';
5
+ export { acceptPlatformDeploymentSummary, encodePlatformDeploymentSummary, PLATFORM_OWNER, } from './summary.js';
@@ -24,3 +24,33 @@ export interface DeploymentSummaryV1 {
24
24
  readonly signingKeyId: string;
25
25
  readonly record: DeploymentRecordV1;
26
26
  }
27
+ /** The owner every summary of a platform namespace names: the platform holds all of its lines. */
28
+ export declare const PLATFORM_OWNER = "platform";
29
+ /**
30
+ * `summary:<label>` in the routing KV of a platform dispatch namespace (CT20, AM-131): the
31
+ * `DeploymentSummaryV1` of one deployment without its record, which stays at `record:<label>`.
32
+ *
33
+ * Its writers are the deployer (`cloudflare({ namespace })`), which writes it once at activation,
34
+ * before `record:<label>`, then marks it published (`retain`), and the platform retirement tooling
35
+ * (SV6), which records a withdrawal. So it names the deployment by its label (`id` is the label),
36
+ * is owned by `platform`, is `active` until withdrawn, and carries no `lastCallAt` or `expiresAt`:
37
+ * nothing on the platform namespace keeps those clocks, and listings read them from the calls
38
+ * dataset (AM-133). It never carries a provider version id or a secret digest: an in-place secret
39
+ * write mints a new version id, which identifies nothing (OPS-2 X1).
40
+ */
41
+ export type PlatformDeploymentSummaryV1 = Omit<DeploymentSummaryV1, 'record' | 'lastCallAt' | 'expiresAt' | 'state' | 'retirement'> & {
42
+ readonly state: 'active' | 'retiring' | 'retired';
43
+ readonly retirement?: 'withdrawn';
44
+ };
45
+ /**
46
+ * Admit one platform deployment summary exactly. Any member outside its shape is refused, a
47
+ * provider version id or a clock among them; so is a summary whose id, line or URL is not its
48
+ * label's, whose owner is not the platform, or whose state and retirement disagree. A reader that
49
+ * meets a refused summary lists that label apart, never acting on it.
50
+ */
51
+ export declare function acceptPlatformDeploymentSummary(input: unknown): PlatformDeploymentSummaryV1;
52
+ /**
53
+ * The canonical JSON (RFC 8785) of one admitted platform summary, as `summary:<label>` holds it:
54
+ * one summary has one text, so a writer that reads it back compares texts.
55
+ */
56
+ export declare function encodePlatformDeploymentSummary(summary: PlatformDeploymentSummaryV1): string;
@@ -1 +1,117 @@
1
- export {};
1
+ import { json } from '@astrale-os/kernel-dsl/value';
2
+ import { deploymentUrl, parseDeploymentLabel } from './label.js';
3
+ /** The owner every summary of a platform namespace names: the platform holds all of its lines. */
4
+ export const PLATFORM_OWNER = 'platform';
5
+ const REQUIRED = [
6
+ 'id',
7
+ 'url',
8
+ 'label',
9
+ 'line',
10
+ 'owner',
11
+ 'state',
12
+ 'retention',
13
+ 'createdAt',
14
+ 'signingKeyId',
15
+ ];
16
+ const RETIREMENT = ['retiredAt', 'retirement'];
17
+ const STATES = ['active', 'retiring', 'retired'];
18
+ const RETENTIONS = ['preview', 'published'];
19
+ /** An instant as `Date.prototype.toISOString` writes it, in UTC. */
20
+ const INSTANT = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/u;
21
+ /** An RFC 7638 JWK thumbprint: the base64url SHA-256 of the public key, 43 characters. */
22
+ const KEY_ID = /^[A-Za-z0-9_-]{43}$/u;
23
+ /**
24
+ * Admit one platform deployment summary exactly. Any member outside its shape is refused, a
25
+ * provider version id or a clock among them; so is a summary whose id, line or URL is not its
26
+ * label's, whose owner is not the platform, or whose state and retirement disagree. A reader that
27
+ * meets a refused summary lists that label apart, never acting on it.
28
+ */
29
+ export function acceptPlatformDeploymentSummary(input) {
30
+ if (input === null || typeof input !== 'object' || Array.isArray(input))
31
+ invalid('members');
32
+ const value = input;
33
+ const keys = Reflect.ownKeys(value);
34
+ const retired = RETIREMENT.some((key) => Object.hasOwn(value, key));
35
+ const expected = retired ? [...REQUIRED, ...RETIREMENT] : REQUIRED;
36
+ if (keys.length !== expected.length || expected.some((key) => !Object.hasOwn(value, key))) {
37
+ invalid('members');
38
+ }
39
+ const label = text(value.label, 'label');
40
+ let line;
41
+ try {
42
+ line = parseDeploymentLabel(label).line;
43
+ }
44
+ catch {
45
+ invalid('label');
46
+ }
47
+ if (value.id !== label)
48
+ invalid('id');
49
+ if (value.line !== line)
50
+ invalid('line');
51
+ const url = text(value.url, 'url');
52
+ if (!sameDeploymentUrl(url, label))
53
+ invalid('url');
54
+ if (value.owner !== PLATFORM_OWNER)
55
+ invalid('owner');
56
+ const state = value.state;
57
+ if (typeof state !== 'string' || !STATES.includes(state))
58
+ invalid('state');
59
+ if (retired !== (state !== 'active'))
60
+ invalid('state');
61
+ const retention = value.retention;
62
+ if (typeof retention !== 'string' || !RETENTIONS.includes(retention))
63
+ invalid('retention');
64
+ const createdAt = instant(value.createdAt, 'createdAt');
65
+ const signingKeyId = text(value.signingKeyId, 'signingKeyId');
66
+ if (!KEY_ID.test(signingKeyId))
67
+ invalid('signingKeyId');
68
+ if (retired && value.retirement !== 'withdrawn')
69
+ invalid('retirement');
70
+ return Object.freeze({
71
+ id: label,
72
+ url,
73
+ label,
74
+ line,
75
+ owner: PLATFORM_OWNER,
76
+ state: state,
77
+ retention: retention,
78
+ createdAt,
79
+ signingKeyId,
80
+ ...(retired
81
+ ? { retiredAt: instant(value.retiredAt, 'retiredAt'), retirement: 'withdrawn' }
82
+ : {}),
83
+ });
84
+ }
85
+ /**
86
+ * The canonical JSON (RFC 8785) of one admitted platform summary, as `summary:<label>` holds it:
87
+ * one summary has one text, so a writer that reads it back compares texts.
88
+ */
89
+ export function encodePlatformDeploymentSummary(summary) {
90
+ return json.serialize(acceptPlatformDeploymentSummary(summary));
91
+ }
92
+ /** Whether `url` is exactly `https://<label>.<routing domain>` for some routing domain. */
93
+ function sameDeploymentUrl(url, label) {
94
+ const prefix = `https://${label}.`;
95
+ if (!url.startsWith(prefix))
96
+ return false;
97
+ try {
98
+ return deploymentUrl(label, url.slice(prefix.length)) === url;
99
+ }
100
+ catch {
101
+ return false;
102
+ }
103
+ }
104
+ function text(input, member) {
105
+ if (typeof input !== 'string' || input.length === 0)
106
+ invalid(member);
107
+ return input;
108
+ }
109
+ function instant(input, member) {
110
+ const value = text(input, member);
111
+ if (!INSTANT.test(value) || new Date(value).toISOString() !== value)
112
+ invalid(member);
113
+ return value;
114
+ }
115
+ function invalid(member) {
116
+ throw new TypeError(`Platform deployment summary has invalid ${member}.`);
117
+ }
@@ -2,6 +2,6 @@ export { isBuild } from './admission.js';
2
2
  export { compile } from './compile.js';
3
3
  export { material, generatedMaterial, restoreBuild, restoreGeneratedBuild, type BuildMaterial, type GeneratedBuildMaterial, } from './material.js';
4
4
  export type { Build } from './build.js';
5
- export { buildDigest, buildManifest, BUILD_MANIFEST_FORMAT, BUILD_MANIFEST_VERSION, type BuildDigest, type BuildManifestInput, type BuildManifestV1, } from './manifest.js';
5
+ export { acceptBuildDigest, buildDigest, buildManifest, BUILD_MANIFEST_FORMAT, BUILD_MANIFEST_VERSION, type BuildDigest, type BuildManifestInput, type BuildManifestV1, } from './manifest.js';
6
6
  export * as frontend from './frontend/index.js';
7
7
  export type { BuildBundle, BuildSchema } from './schema.js';
@@ -1,5 +1,5 @@
1
1
  export { isBuild } from './admission.js';
2
2
  export { compile } from './compile.js';
3
3
  export { material, generatedMaterial, restoreBuild, restoreGeneratedBuild, } from './material.js';
4
- export { buildDigest, buildManifest, BUILD_MANIFEST_FORMAT, BUILD_MANIFEST_VERSION, } from './manifest.js';
4
+ export { acceptBuildDigest, buildDigest, buildManifest, BUILD_MANIFEST_FORMAT, BUILD_MANIFEST_VERSION, } from './manifest.js';
5
5
  export * as frontend from './frontend/index.js';
@@ -51,4 +51,9 @@ export interface BuildManifestInput {
51
51
  export declare function buildManifest(input: BuildManifestInput): BuildManifestV1;
52
52
  /** `sha256` of the canonical JSON (RFC 8785) of one admitted build manifest. */
53
53
  export declare function buildDigest(manifest: BuildManifestV1): BuildDigest;
54
+ /**
55
+ * Admit a build digest as it travels outside its manifest (a deployment binding, a record): exactly
56
+ * `sha256:` and 64 lowercase hex digits. Anything else throws, so a reader fails closed.
57
+ */
58
+ export declare function acceptBuildDigest(input: unknown): BuildDigest;
54
59
  export {};
@@ -30,6 +30,16 @@ export function buildManifest(input) {
30
30
  export function buildDigest(manifest) {
31
31
  return identify(json.encode(admit(manifest)), MANIFEST_MEDIA_TYPE).digest;
32
32
  }
33
+ /**
34
+ * Admit a build digest as it travels outside its manifest (a deployment binding, a record): exactly
35
+ * `sha256:` and 64 lowercase hex digits. Anything else throws, so a reader fails closed.
36
+ */
37
+ export function acceptBuildDigest(input) {
38
+ if (typeof input !== 'string' || !DIGEST.test(input)) {
39
+ throw new TypeError('Build digest must be sha256: followed by 64 lowercase hex digits.');
40
+ }
41
+ return input;
42
+ }
33
43
  function admit(input) {
34
44
  if (input === null || typeof input !== 'object')
35
45
  invalid();
@@ -1,5 +1,5 @@
1
1
  export { defineAdapter, defineDeployment, isAdapter } from './adapter/index.js';
2
- export type { Adapter, AdapterEnvironmentContext, AdapterInput, AddressingPlan, ArtifactFile, ArtifactSource, Bundle, BundleContext, Bundler, BundleSource, ConfigureContext, DeployContext, DeploymentPhase, DeploymentProgress, DeploymentSecretsState, DeployResult, FailedDeployResult, FailedReleaseDeployResult, InstallationTarget, LegacyAdapter, LegacyAdapterInput, ListContext, MutationKnowledge, Placement, PlacementContext, PreparedArtifact, PreparedArtifactFile, PrepareContext, ReadyDeployResult, ReadyReleaseDeployResult, ReleaseDeployContext, ReleaseDeploymentPhase, ReleaseDeployResult, RetainContext, } from './adapter/index.js';
2
+ export type { Adapter, AdapterEnvironmentContext, AdapterInput, AddressingPlan, ArtifactFile, ArtifactSource, Bundle, BundleContext, Bundler, BundleSource, ConfigureContext, DeployContext, DeploymentPhase, DeploymentProgress, DeploymentSecretsState, DeployResult, FailedDeployResult, FailedReleaseDeployResult, LegacyAdapter, LegacyAdapterInput, ListContext, MutationKnowledge, Placement, PlacementContext, PreparedArtifact, PreparedArtifactFile, PrepareContext, ReadyDeployResult, ReadyReleaseDeployResult, ReleaseDeployContext, ReleaseDeploymentPhase, ReleaseDeployResult, RetainContext, } from './adapter/index.js';
3
3
  export { compile, isBuild } from './build/index.js';
4
4
  export type { Build, BuildBundle, BuildDigest, BuildManifestV1, BuildSchema, } from './build/index.js';
5
5
  export { deploy } from './deploy.js';
@@ -11,19 +11,24 @@
11
11
  * - the direct-mode deploy path (`prepare`/`deploy` of adapter-cloudflare and adapter-astrale,
12
12
  * whose `DeployResult.release` is this Release) and the stable Worker that assembles its Release
13
13
  * at runtime, which serve the direct-mode configurations of domains ai-gateway, closing, grc,
14
- * integrations and issues (until SV15), shell (until SH2), the Services `development`
15
- * environment (until SV9) and ui:domain (until UI1);
16
- * - the SDK's serving surface, typed on this Release until S4b serves the v4 Release: `serve` and
17
- * `createService` (`execution/service`), runtime loading (`execution/runtime/load.ts`),
18
- * invocation admission (`execution/invocation/admission/authentication.ts`), Domain identity
19
- * and delivery (`execution/identity`), preflight (`deployment/verify/preflight/publication.ts`)
20
- * and readiness (`deployment/verify/readiness`);
14
+ * integrations and issues (until SV15), domains organization (until it leaves direct mode,
15
+ * AM-147), the Services `beta` and `prod` (until SV12), `development` (until SV9) and frozen
16
+ * `admin-beta` (until D19) environments, shell (until SH2) and its frozen `legacy-v3` (until
17
+ * D22), and ui:domain (until UI1);
18
+ * - the stable-target branch of the SDK's serving surface, which serves this Release beside the v4
19
+ * one (`execution/runtime/release.ts` `ServedRelease`): its Kernel Server source
20
+ * (`execution/service/serving/legacy/`), the Delivery v1-only answer of a Publication
21
+ * (`execution/identity/delivery.ts`), its pinned-snapshot check
22
+ * (`execution/invocation/invocation.ts`), its readiness at `domain.json`
23
+ * (`deployment/verify/readiness/legacy/`) and the preflight of the direct-mode prepare path
24
+ * (`deployment/verify/preflight/publication.ts`);
21
25
  * - the split-issuer option of `addressing` (`publicUrl` distinct from the issuer), used only by
22
26
  * adapter-cloudflare direct mode (`identityIssuer`).
23
27
  *
24
- * Removal: D10, once no supported configuration selects the direct-mode path (CT33) and S4b serves
25
- * the v4 Release; canonical deploys reach adapters through `deployRelease` (S7a, CT23), and D10
26
- * deletes `prepare`/`deploy` and their `DeployResult`.
28
+ * Removal: D10, once no configuration on any repository's main selects the direct-mode path
29
+ * (CT33, AM-147); the serving surface already serves the v4 Release (S4b), canonical deploys reach
30
+ * adapters through `deployRelease` (S7a, CT23), and D10 deletes `prepare`/`deploy` and their
31
+ * `DeployResult` with every branch listed above.
27
32
  */
28
33
  export { assemble } from './assemble.js';
29
34
  export { isRelease } from './admission.js';
@@ -11,19 +11,24 @@
11
11
  * - the direct-mode deploy path (`prepare`/`deploy` of adapter-cloudflare and adapter-astrale,
12
12
  * whose `DeployResult.release` is this Release) and the stable Worker that assembles its Release
13
13
  * at runtime, which serve the direct-mode configurations of domains ai-gateway, closing, grc,
14
- * integrations and issues (until SV15), shell (until SH2), the Services `development`
15
- * environment (until SV9) and ui:domain (until UI1);
16
- * - the SDK's serving surface, typed on this Release until S4b serves the v4 Release: `serve` and
17
- * `createService` (`execution/service`), runtime loading (`execution/runtime/load.ts`),
18
- * invocation admission (`execution/invocation/admission/authentication.ts`), Domain identity
19
- * and delivery (`execution/identity`), preflight (`deployment/verify/preflight/publication.ts`)
20
- * and readiness (`deployment/verify/readiness`);
14
+ * integrations and issues (until SV15), domains organization (until it leaves direct mode,
15
+ * AM-147), the Services `beta` and `prod` (until SV12), `development` (until SV9) and frozen
16
+ * `admin-beta` (until D19) environments, shell (until SH2) and its frozen `legacy-v3` (until
17
+ * D22), and ui:domain (until UI1);
18
+ * - the stable-target branch of the SDK's serving surface, which serves this Release beside the v4
19
+ * one (`execution/runtime/release.ts` `ServedRelease`): its Kernel Server source
20
+ * (`execution/service/serving/legacy/`), the Delivery v1-only answer of a Publication
21
+ * (`execution/identity/delivery.ts`), its pinned-snapshot check
22
+ * (`execution/invocation/invocation.ts`), its readiness at `domain.json`
23
+ * (`deployment/verify/readiness/legacy/`) and the preflight of the direct-mode prepare path
24
+ * (`deployment/verify/preflight/publication.ts`);
21
25
  * - the split-issuer option of `addressing` (`publicUrl` distinct from the issuer), used only by
22
26
  * adapter-cloudflare direct mode (`identityIssuer`).
23
27
  *
24
- * Removal: D10, once no supported configuration selects the direct-mode path (CT33) and S4b serves
25
- * the v4 Release; canonical deploys reach adapters through `deployRelease` (S7a, CT23), and D10
26
- * deletes `prepare`/`deploy` and their `DeployResult`.
28
+ * Removal: D10, once no configuration on any repository's main selects the direct-mode path
29
+ * (CT33, AM-147); the serving surface already serves the v4 Release (S4b), canonical deploys reach
30
+ * adapters through `deployRelease` (S7a, CT23), and D10 deletes `prepare`/`deploy` and their
31
+ * `DeployResult` with every branch listed above.
27
32
  */
28
33
  export { assemble } from './assemble.js';
29
34
  export { isRelease } from './admission.js';
@@ -15,23 +15,14 @@ export function verifyDeployment(artifact, input) {
15
15
  progress.provider.kind !== 'applied' ||
16
16
  progress.provider.evidence.issuer === undefined ||
17
17
  !terminal(progress.prerequisite) ||
18
- !terminal(progress.configuration) ||
19
- !terminal(progress.installation)) {
18
+ !terminal(progress.configuration)) {
20
19
  invalid();
21
20
  }
22
21
  return Object.freeze({ status: 'ready', phase: 'complete', progress, release });
23
22
  }
24
23
  if (input.status === 'failed') {
25
24
  exact(input, ['status', 'phase', 'progress', 'error'], ['release']);
26
- if (![
27
- 'prerequisite',
28
- 'provider',
29
- 'addressing',
30
- 'release',
31
- 'configuration',
32
- 'installation',
33
- 'readiness',
34
- ].includes(input.phase) ||
25
+ if (!['prerequisite', 'provider', 'addressing', 'release', 'configuration', 'readiness'].includes(input.phase) ||
35
26
  !(input.error instanceof Error)) {
36
27
  invalid();
37
28
  }
@@ -59,12 +50,11 @@ function verifyRelease(artifact, release) {
59
50
  function verifyProgress(artifact, input, release) {
60
51
  if (input === null || typeof input !== 'object' || Array.isArray(input))
61
52
  invalid();
62
- exact(input, ['prerequisite', 'provider', 'configuration', 'installation']);
53
+ exact(input, ['prerequisite', 'provider', 'configuration']);
63
54
  return Object.freeze({
64
55
  prerequisite: knowledge(input.prerequisite),
65
56
  provider: providerKnowledge(artifact, input.provider, release),
66
57
  configuration: knowledge(input.configuration),
67
- installation: knowledge(input.installation),
68
58
  });
69
59
  }
70
60
  function providerKnowledge(artifact, input, release) {
@@ -0,0 +1,13 @@
1
+ export type ReadinessFetch = (input: string, init: {
2
+ readonly redirect: 'error';
3
+ readonly signal?: AbortSignal;
4
+ }) => Promise<Response>;
5
+ export interface ReadinessOptions {
6
+ readonly fetch?: ReadinessFetch;
7
+ readonly signal?: AbortSignal;
8
+ }
9
+ export declare const MAXIMUM_DOCUMENT_BYTES: number;
10
+ export declare const MAXIMUM_BUNDLE_BYTES: number;
11
+ export declare function fetchRequired(fetcher: ReadinessFetch, url: string, signal: AbortSignal | undefined): Promise<Response>;
12
+ export declare function bounded(response: Response, url: string, maximum: number): Promise<ArrayBuffer>;
13
+ export declare function text(response: Response, url: string, maximum: number): Promise<string>;
@@ -0,0 +1,26 @@
1
+ export const MAXIMUM_DOCUMENT_BYTES = 1024 * 1024;
2
+ export const MAXIMUM_BUNDLE_BYTES = 16 * 1024 * 1024;
3
+ export async function fetchRequired(fetcher, url, signal) {
4
+ const response = await fetcher(url, {
5
+ redirect: 'error',
6
+ ...(signal === undefined ? {} : { signal }),
7
+ });
8
+ if (!response.ok)
9
+ throw new Error(`GET ${url} returned ${response.status}.`);
10
+ return response;
11
+ }
12
+ export async function bounded(response, url, maximum) {
13
+ const bytes = await response.arrayBuffer();
14
+ if (bytes.byteLength > maximum)
15
+ throw new Error(`GET ${url} exceeded ${maximum} bytes.`);
16
+ return bytes;
17
+ }
18
+ export async function text(response, url, maximum) {
19
+ const bytes = await bounded(response, url, maximum);
20
+ try {
21
+ return new TextDecoder('utf-8', { fatal: true, ignoreBOM: false }).decode(bytes);
22
+ }
23
+ catch (cause) {
24
+ throw new Error(`GET ${url} returned invalid UTF-8.`, { cause });
25
+ }
26
+ }
@@ -1,7 +1,4 @@
1
- import type { Addressing } from '../../release/index.js';
2
- import type { ReadinessFetch } from './publication.js';
1
+ import type { IssuerId } from '../../../platform/auth/index.js';
2
+ import type { ReadinessOptions } from './fetch.js';
3
3
  /** Verify issuer discovery and at least one admitted signing key at the serving identity. */
4
- export declare function verifyIdentity(addressing: Addressing, options?: {
5
- readonly fetch?: ReadinessFetch;
6
- readonly signal?: AbortSignal;
7
- }): Promise<void>;
4
+ export declare function verifyIdentity(serving: IssuerId, options?: ReadinessOptions): Promise<void>;