@astrale-os/sdk 0.6.0-beta.13 → 0.6.0-beta.15

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 (175) hide show
  1. package/README.md +4 -0
  2. package/dist/deployment/adapter/adapter.d.ts +9 -11
  3. package/dist/deployment/adapter/legacy/adapter.d.ts +0 -10
  4. package/dist/deployment/adapter/legacy/deploy/context.d.ts +0 -2
  5. package/dist/deployment/adapter/legacy/deploy/result.d.ts +2 -3
  6. package/dist/deployment/adapter/legacy/index.d.ts +12 -12
  7. package/dist/deployment/adapter/legacy/prepare/context.d.ts +0 -2
  8. package/dist/deployment/adapter/release/context.d.ts +23 -3
  9. package/dist/deployment/adapter/release/index.d.ts +1 -0
  10. package/dist/deployment/adapter/release/list.d.ts +41 -0
  11. package/dist/deployment/adapter/release/list.js +1 -0
  12. package/dist/deployment/address/index.d.ts +1 -1
  13. package/dist/deployment/address/index.js +1 -0
  14. package/dist/deployment/address/summary.d.ts +31 -1
  15. package/dist/deployment/address/summary.js +117 -1
  16. package/dist/deployment/build/index.d.ts +1 -1
  17. package/dist/deployment/build/index.js +1 -1
  18. package/dist/deployment/build/manifest.d.ts +5 -0
  19. package/dist/deployment/build/manifest.js +10 -0
  20. package/dist/deployment/index.d.ts +1 -1
  21. package/dist/deployment/release/legacy/index.d.ts +17 -12
  22. package/dist/deployment/release/legacy/index.js +17 -12
  23. package/dist/deployment/verify/readiness/deployment.js +3 -13
  24. package/dist/deployment/verify/readiness/fetch.d.ts +13 -0
  25. package/dist/deployment/verify/readiness/fetch.js +26 -0
  26. package/dist/deployment/verify/readiness/identity.d.ts +3 -6
  27. package/dist/deployment/verify/readiness/identity.js +3 -3
  28. package/dist/deployment/verify/readiness/index.d.ts +12 -8
  29. package/dist/deployment/verify/readiness/index.js +15 -4
  30. package/dist/deployment/verify/readiness/legacy/index.d.ts +2 -0
  31. package/dist/deployment/verify/readiness/legacy/index.js +2 -0
  32. package/dist/deployment/verify/readiness/legacy/publication.d.ts +12 -0
  33. package/dist/deployment/verify/readiness/legacy/publication.js +23 -0
  34. package/dist/deployment/verify/readiness/release.d.ts +8 -0
  35. package/dist/deployment/verify/readiness/release.js +22 -0
  36. package/dist/execution/identity/authentication.d.ts +14 -3
  37. package/dist/execution/identity/authentication.js +16 -7
  38. package/dist/execution/identity/callback.d.ts +5 -2
  39. package/dist/execution/identity/callback.js +11 -5
  40. package/dist/execution/identity/delivery.d.ts +11 -4
  41. package/dist/execution/identity/delivery.js +47 -20
  42. package/dist/execution/identity/identity.d.ts +12 -6
  43. package/dist/execution/identity/identity.js +3 -3
  44. package/dist/execution/invocation/admission/authentication.d.ts +1 -2
  45. package/dist/execution/invocation/admission/authentication.js +1 -2
  46. package/dist/execution/invocation/admission/authority.d.ts +10 -4
  47. package/dist/execution/invocation/admission/authority.js +5 -1
  48. package/dist/execution/invocation/invocation.js +51 -14
  49. package/dist/execution/runtime/index.d.ts +1 -0
  50. package/dist/execution/runtime/index.js +1 -0
  51. package/dist/execution/runtime/load.d.ts +3 -3
  52. package/dist/execution/runtime/load.js +3 -2
  53. package/dist/execution/runtime/release.d.ts +22 -0
  54. package/dist/execution/runtime/release.js +14 -0
  55. package/dist/execution/serve.d.ts +2 -2
  56. package/dist/execution/service/create.js +9 -7
  57. package/dist/execution/service/release.d.ts +2 -2
  58. package/dist/execution/service/release.js +3 -2
  59. package/dist/execution/service/service.d.ts +9 -5
  60. package/dist/execution/service/serving/delivery.d.ts +6 -0
  61. package/dist/execution/service/{publication → serving}/delivery.js +5 -1
  62. package/dist/execution/service/{publication → serving}/index.d.ts +1 -1
  63. package/dist/execution/service/serving/installation.d.ts +4 -0
  64. package/dist/execution/service/serving/installation.js +9 -0
  65. package/dist/execution/service/serving/legacy/index.d.ts +15 -0
  66. package/dist/execution/service/serving/legacy/index.js +19 -0
  67. package/dist/execution/service/serving/source.d.ts +18 -0
  68. package/dist/execution/service/serving/source.js +19 -0
  69. package/dist/execution/workflows/run.js +1 -1
  70. package/dist/platform/versioning/name.d.ts +4 -3
  71. package/dist/platform/versioning/name.js +4 -3
  72. package/dist/project/define.js +58 -28
  73. package/dist/project/install-command.d.ts +10 -0
  74. package/dist/project/install-command.js +13 -0
  75. package/dist/project/project.d.ts +4 -2
  76. package/dist/tooling/cli/arguments.d.ts +1 -3
  77. package/dist/tooling/cli/arguments.js +51 -22
  78. package/dist/tooling/cli/commit.d.ts +23 -0
  79. package/dist/tooling/cli/commit.js +216 -0
  80. package/dist/tooling/cli/deploy-mode.d.ts +16 -13
  81. package/dist/tooling/cli/deploy-mode.js +45 -36
  82. package/dist/tooling/cli/deploy-result.d.ts +10 -7
  83. package/dist/tooling/cli/deploy-result.js +4 -3
  84. package/dist/tooling/cli/dotenv.d.ts +2 -2
  85. package/dist/tooling/cli/dotenv.js +3 -33
  86. package/dist/tooling/cli/help.js +73 -29
  87. package/dist/tooling/cli/immutable-deployment.d.ts +27 -0
  88. package/dist/tooling/cli/immutable-deployment.js +95 -0
  89. package/dist/tooling/cli/index.d.ts +3 -4
  90. package/dist/tooling/cli/index.js +2 -3
  91. package/dist/tooling/cli/legacy/deploy-result.d.ts +5 -3
  92. package/dist/tooling/cli/legacy/deploy-result.js +5 -3
  93. package/dist/tooling/cli/{development → legacy/development}/candidate.d.ts +3 -4
  94. package/dist/tooling/cli/{development → legacy/development}/candidate.js +7 -14
  95. package/dist/tooling/cli/legacy/development/deployment.d.ts +10 -0
  96. package/dist/tooling/cli/legacy/development/deployment.js +20 -0
  97. package/dist/tooling/cli/legacy/development/deprecation.d.ts +11 -0
  98. package/dist/tooling/cli/legacy/development/deprecation.js +13 -0
  99. package/dist/tooling/cli/legacy/development/develop.d.ts +15 -0
  100. package/dist/tooling/cli/legacy/development/develop.js +142 -0
  101. package/dist/tooling/cli/legacy/development/index.d.ts +21 -0
  102. package/dist/tooling/cli/legacy/development/index.js +21 -0
  103. package/dist/tooling/cli/legacy/development/report.d.ts +7 -0
  104. package/dist/tooling/cli/{development → legacy/development}/report.js +2 -5
  105. package/dist/tooling/cli/legacy/development/secrets-file.d.ts +2 -0
  106. package/dist/tooling/cli/legacy/development/secrets-file.js +33 -0
  107. package/dist/tooling/cli/legacy/stable-target-adapter.d.ts +5 -3
  108. package/dist/tooling/cli/legacy/stable-target-deploy.d.ts +40 -0
  109. package/dist/tooling/cli/legacy/stable-target-deploy.js +102 -0
  110. package/dist/tooling/cli/list.d.ts +114 -0
  111. package/dist/tooling/cli/list.js +297 -0
  112. package/dist/tooling/cli/orchestrate.d.ts +1 -1
  113. package/dist/tooling/cli/orchestrate.js +91 -95
  114. package/dist/tooling/cli/secrets.d.ts +9 -0
  115. package/dist/tooling/cli/secrets.js +19 -0
  116. package/package.json +7 -7
  117. package/dist/deployment/verify/readiness/publication.d.ts +0 -11
  118. package/dist/deployment/verify/readiness/publication.js +0 -41
  119. package/dist/execution/service/publication/delivery.d.ts +0 -2
  120. package/dist/execution/service/publication/installation.d.ts +0 -3
  121. package/dist/execution/service/publication/installation.js +0 -8
  122. package/dist/execution/service/publication/source.d.ts +0 -3
  123. package/dist/execution/service/publication/source.js +0 -11
  124. package/dist/tooling/cli/astrale/authority.d.ts +0 -5
  125. package/dist/tooling/cli/astrale/authority.js +0 -11
  126. package/dist/tooling/cli/astrale/executable.d.ts +0 -2
  127. package/dist/tooling/cli/astrale/executable.js +0 -47
  128. package/dist/tooling/cli/astrale/failure.d.ts +0 -6
  129. package/dist/tooling/cli/astrale/failure.js +0 -48
  130. package/dist/tooling/cli/astrale/instance.d.ts +0 -11
  131. package/dist/tooling/cli/astrale/instance.js +0 -52
  132. package/dist/tooling/cli/astrale/process.d.ts +0 -13
  133. package/dist/tooling/cli/astrale/process.js +0 -94
  134. package/dist/tooling/cli/astrale/version.d.ts +0 -18
  135. package/dist/tooling/cli/astrale/version.js +0 -55
  136. package/dist/tooling/cli/development/deployment.d.ts +0 -16
  137. package/dist/tooling/cli/development/deployment.js +0 -39
  138. package/dist/tooling/cli/development/develop.d.ts +0 -11
  139. package/dist/tooling/cli/development/develop.js +0 -243
  140. package/dist/tooling/cli/development/release-evidence.d.ts +0 -4
  141. package/dist/tooling/cli/development/release-evidence.js +0 -10
  142. package/dist/tooling/cli/development/report.d.ts +0 -9
  143. package/dist/tooling/cli/development/session-file.d.ts +0 -53
  144. package/dist/tooling/cli/development/session-file.js +0 -337
  145. package/dist/tooling/cli/development/target-lock.d.ts +0 -16
  146. package/dist/tooling/cli/development/target-lock.js +0 -68
  147. package/dist/tooling/cli/development/view.d.ts +0 -28
  148. package/dist/tooling/cli/development/view.js +0 -151
  149. package/dist/tooling/cli/environment-release.d.ts +0 -24
  150. package/dist/tooling/cli/environment-release.js +0 -46
  151. package/dist/tooling/cli/evidence.d.ts +0 -14
  152. package/dist/tooling/cli/evidence.js +0 -53
  153. package/dist/tooling/cli/installation/index.d.ts +0 -2
  154. package/dist/tooling/cli/installation/index.js +0 -1
  155. package/dist/tooling/cli/installation/observation.d.ts +0 -10
  156. package/dist/tooling/cli/installation/observation.js +0 -44
  157. package/dist/tooling/cli/installation/reconcile.d.ts +0 -32
  158. package/dist/tooling/cli/installation/reconcile.js +0 -122
  159. /package/dist/execution/service/{publication → serving}/index.js +0 -0
  160. /package/dist/tooling/cli/{credential.d.ts → legacy/development/credential.d.ts} +0 -0
  161. /package/dist/tooling/cli/{credential.js → legacy/development/credential.js} +0 -0
  162. /package/dist/tooling/cli/{development → legacy/development}/lease.d.ts +0 -0
  163. /package/dist/tooling/cli/{development → legacy/development}/lease.js +0 -0
  164. /package/dist/tooling/cli/{development → legacy/development}/lifecycle.d.ts +0 -0
  165. /package/dist/tooling/cli/{development → legacy/development}/lifecycle.js +0 -0
  166. /package/dist/tooling/cli/{development → legacy/development}/project-imports.d.ts +0 -0
  167. /package/dist/tooling/cli/{development → legacy/development}/project-imports.js +0 -0
  168. /package/dist/tooling/cli/{development → legacy/development}/project-lock.d.ts +0 -0
  169. /package/dist/tooling/cli/{development → legacy/development}/project-lock.js +0 -0
  170. /package/dist/tooling/cli/{development → legacy/development}/rebuild.d.ts +0 -0
  171. /package/dist/tooling/cli/{development → legacy/development}/rebuild.js +0 -0
  172. /package/dist/tooling/cli/{development → legacy/development}/source-watch.d.ts +0 -0
  173. /package/dist/tooling/cli/{development → legacy/development}/source-watch.js +0 -0
  174. /package/dist/tooling/cli/{development → legacy/development}/sources.d.ts +0 -0
  175. /package/dist/tooling/cli/{development → legacy/development}/sources.js +0 -0
package/README.md CHANGED
@@ -345,6 +345,10 @@ did not derive.
345
345
  - **Record.** `acceptDeploymentRecord` admits a `DeploymentRecordV1` only when its provider
346
346
  script is the label that its own fields derive. A host admits the record a deploy declares with
347
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.
348
352
 
349
353
  ```ts
350
354
  import {
@@ -1,15 +1,10 @@
1
- import type { DeploymentSummaryV1, FrozenConfigurationV1 } from '../address/index.js';
1
+ import type { 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';
4
- import type { ConfigureContext, ListContext, Placement, PlacementContext, ReleaseDeployContext, ReleaseDeployResult, RetainContext } from './release/index.js';
3
+ import type { ArtifactSource, DeployContext, DeployResult, PrepareContext } from './legacy/index.js';
4
+ import type { ConfigureContext, ListContext, ListedDeployment, 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
@@ -37,8 +32,11 @@ export interface Adapter<Parameters extends object = object> {
37
32
  placement(parameters: Parameters, context: PlacementContext): Promise<Placement>;
38
33
  /** Create, or reuse, the immutable deployment of one sealed release. */
39
34
  deployRelease(parameters: Parameters, context: ReleaseDeployContext): Promise<ReleaseDeployResult>;
40
- /** The deployments of one origin the host keeps for the caller. */
41
- list?(parameters: Parameters, context: ListContext): Promise<readonly DeploymentSummaryV1[]>;
35
+ /**
36
+ * The deployments of one Environment of one origin the host keeps for the caller, each with
37
+ * where it is called. No effect at the host.
38
+ */
39
+ list?(parameters: Parameters, context: ListContext): Promise<readonly ListedDeployment[]>;
42
40
  /**
43
41
  * Keep one published deployment where the host has no registry principal to mark it (a platform
44
42
  * namespace). Called only after its Publication commits. Absent: the registry marks it (Admin's
@@ -66,7 +64,7 @@ export interface AdapterInput<Parameters extends object> {
66
64
  configure(parameters: Parameters, context: ConfigureContext): FrozenConfigurationV1;
67
65
  placement(parameters: Parameters, context: PlacementContext): Promise<Placement>;
68
66
  deployRelease(parameters: Parameters, context: ReleaseDeployContext): Promise<ReleaseDeployResult>;
69
- list?(parameters: Parameters, context: ListContext): Promise<readonly DeploymentSummaryV1[]>;
67
+ list?(parameters: Parameters, context: ListContext): Promise<readonly ListedDeployment[]>;
70
68
  retain?(parameters: Parameters, context: RetainContext): Promise<void>;
71
69
  /** @deprecated Legacy direct-mode path (CT33) only. Replacement: `configure`, `placement`. */
72
70
  prepare?(parameters: Parameters, context: PrepareContext): Promise<ArtifactSource>;
@@ -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,24 +1,24 @@
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,
8
8
  * created or reused, and installs nothing.
9
9
  *
10
10
  * Short-term consumers: the legacy direct-mode path (CT33), which `astrale-domain deploy` and
11
- * `astrale-domain dev` run through these operations:
12
- * - adapter-cloudflare direct mode (`route`, `workerName`, `identityIssuer`, `addressing`,
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);
16
- * - adapter-astrale, until S8 gives it `deployRelease`.
11
+ * `astrale-domain dev` run through these operations: adapter-cloudflare direct mode (`route`,
12
+ * `workerName`, `identityIssuer`, `addressing`, `signingIdentity`, or no `namespace`), which serves
13
+ * the configurations of domains ai-gateway, closing, grc, integrations and issues (until SV15),
14
+ * domains organization (until it leaves direct mode, AM-147), the Services `beta` and `prod` (until
15
+ * SV12), `development` (until SV9) and frozen `admin-beta` (until D19) environments, shell (until
16
+ * SH2) and its frozen `legacy-v3` (until D22), and ui:domain (until UI1).
17
17
  *
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.
18
+ * Removal: D10, once no configuration on any repository's main selects the direct-mode path
19
+ * (CT33, AM-147); it deletes these types with `prepare`/`deploy`, `src/deployment/release/legacy`
20
+ * and the stable-target CLI path.
21
21
  */
22
- export type { InstallationTarget, LegacyAdapter, LegacyAdapterInput } from './adapter.js';
22
+ export type { LegacyAdapter, LegacyAdapterInput } from './adapter.js';
23
23
  export type * from './prepare/index.js';
24
24
  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,15 +66,25 @@ 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;
63
77
  }
64
- /** What `list` receives: the origin whose deployments the host lists for the caller. */
78
+ /**
79
+ * What `list` receives: the origin and the Environment whose deployments the host lists for the
80
+ * caller. It answers without any effect at the host.
81
+ */
65
82
  export interface ListContext {
66
83
  readonly origin: string;
84
+ readonly environment: string;
85
+ /** Parent-owned lifecycle cancellation. */
67
86
  readonly signal: AbortSignal;
87
+ /** Optional command-scoped identity override (`--as`). */
68
88
  readonly identity?: string;
69
89
  }
70
90
  /** What `retain` receives: the label of the published deployment to keep. */
@@ -1,2 +1,3 @@
1
1
  export type { ConfigureContext, ListContext, Placement, PlacementContext, ReleaseDeployContext, RetainContext, } from './context.js';
2
+ export type { DeploymentCallTarget, ListedDeployment } from './list.js';
2
3
  export type { DeploymentSecretsState, FailedReleaseDeployResult, MutationKnowledge, ReadyReleaseDeployResult, ReleaseDeploymentPhase, ReleaseDeployResult, } from './result.js';
@@ -0,0 +1,41 @@
1
+ import type { DeploymentSummaryV1 } from '../../address/index.js';
2
+ /**
3
+ * Where one listed deployment is called on its host, so that an operator can act on that
4
+ * deployment alone, such as rotating one of its secrets in place (AM-4'):
5
+ *
6
+ * - `services`: a deployment Admin's Services hosts, called on the Admin instance with
7
+ * `astrale call "<path>.method.setSecret" --admin` (`--admin=<admin>` when `admin` names the
8
+ * Admin bookmark). `path` is the deployment's node, `@<id>`, qualified by its class:
9
+ * `@<id>::services.astrale.ai:class.CloudflareDeployment`.
10
+ * - `namespace`: a deployment of a platform dispatch namespace, which has no Services node: the
11
+ * namespace and the script the per-script tooling of that namespace takes.
12
+ */
13
+ export type DeploymentCallTarget = {
14
+ readonly kind: 'services';
15
+ readonly path: string;
16
+ /** The Admin bookmark the deployment is reached through; the CLI's own Admin target when absent. */
17
+ readonly admin?: string;
18
+ } | {
19
+ readonly kind: 'namespace';
20
+ readonly namespace: string;
21
+ readonly script: string;
22
+ };
23
+ /**
24
+ * One deployment as an adapter's `list` returns it: what its host knows of it, its record as the
25
+ * host stores it, and where it is called. `lastCallAt`, and a preview's `expiresAt`, are as of the
26
+ * listing: an adapter whose host records calls only now and then reads the calls counted since, and
27
+ * one that cannot read them for want of a permission omits both rather than print stale values.
28
+ *
29
+ * The adapter does not admit the record. The listing admits it with `acceptDeploymentRecord`, and a
30
+ * record it refuses (one a host on an older SDK still admits, say) never fails the listing: that
31
+ * deployment is listed from the facts its host owns.
32
+ */
33
+ export interface ListedDeployment extends Omit<DeploymentSummaryV1, 'record'> {
34
+ /**
35
+ * The record as the host stores it, unadmitted, whatever value that is (JSON `null` included).
36
+ * Absent when the host keeps no record of the deployment: a platform namespace keeps none until
37
+ * it activates the deployment.
38
+ */
39
+ readonly record?: unknown;
40
+ readonly callTarget: DeploymentCallTarget;
41
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -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';
@@ -17,10 +17,40 @@ export interface DeploymentSummaryV1 {
17
17
  readonly retention: 'preview' | 'published';
18
18
  readonly createdAt: string;
19
19
  readonly lastCallAt?: string;
20
- /** A preview's: 30 days after its creation or its last call, whichever is later. */
20
+ /** A preview's: 30 days after its activation or its last call, whichever is later (AM-123). */
21
21
  readonly expiresAt?: string;
22
22
  readonly retiredAt?: string;
23
23
  readonly retirement?: 'expired' | 'withdrawn';
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, DeploymentCallTarget, DeploymentPhase, DeploymentProgress, DeploymentSecretsState, DeployResult, FailedDeployResult, FailedReleaseDeployResult, LegacyAdapter, LegacyAdapterInput, ListContext, ListedDeployment, 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';
@@ -8,22 +8,27 @@
8
8
  * seal the `DomainRelease` v4 of an immutable deployment from its build digest and URL.
9
9
  *
10
10
  * Short-term consumers:
11
- * - the direct-mode deploy path (`prepare`/`deploy` of adapter-cloudflare and adapter-astrale,
12
- * whose `DeployResult.release` is this Release) and the stable Worker that assembles its Release
11
+ * - the direct-mode deploy path (`prepare`/`deploy` of adapter-cloudflare, whose
12
+ * `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';
@@ -8,22 +8,27 @@
8
8
  * seal the `DomainRelease` v4 of an immutable deployment from its build digest and URL.
9
9
  *
10
10
  * Short-term consumers:
11
- * - the direct-mode deploy path (`prepare`/`deploy` of adapter-cloudflare and adapter-astrale,
12
- * whose `DeployResult.release` is this Release) and the stable Worker that assembles its Release
11
+ * - the direct-mode deploy path (`prepare`/`deploy` of adapter-cloudflare, whose
12
+ * `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) {