@astrale-os/sdk 0.6.0-beta.23 → 0.6.0-beta.24

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 (181) hide show
  1. package/README.md +30 -36
  2. package/dist/application/define.d.ts +3 -1
  3. package/dist/application/define.js +16 -2
  4. package/dist/application/domain.d.ts +3 -1
  5. package/dist/application/index.d.ts +1 -1
  6. package/dist/application/mutation/index.d.ts +1 -1
  7. package/dist/application/query/composite/plan.d.ts +0 -4
  8. package/dist/application/query/composite/plan.js +0 -2
  9. package/dist/application/view/define.js +4 -6
  10. package/dist/application/view/frontend.d.ts +2 -2
  11. package/dist/application/view/index.d.ts +1 -1
  12. package/dist/application/view/route.d.ts +0 -14
  13. package/dist/application/view/route.js +1 -64
  14. package/dist/deployment/adapter/adapter.d.ts +3 -20
  15. package/dist/deployment/adapter/bundle/file.d.ts +1 -1
  16. package/dist/deployment/adapter/define.d.ts +4 -25
  17. package/dist/deployment/adapter/define.js +12 -44
  18. package/dist/deployment/adapter/index.d.ts +0 -2
  19. package/dist/deployment/adapter/release/list.d.ts +1 -2
  20. package/dist/deployment/address/summary.d.ts +3 -7
  21. package/dist/deployment/authoring.d.ts +0 -2
  22. package/dist/deployment/authoring.js +0 -1
  23. package/dist/deployment/build/build.d.ts +6 -0
  24. package/dist/deployment/build/compile.js +2 -0
  25. package/dist/deployment/build/frontend/compilation.d.ts +2 -4
  26. package/dist/deployment/build/frontend/compilation.js +0 -5
  27. package/dist/deployment/build/frontend/digest.js +1 -5
  28. package/dist/deployment/build/material.d.ts +2 -2
  29. package/dist/deployment/build/material.js +28 -13
  30. package/dist/deployment/deployment.d.ts +4 -8
  31. package/dist/deployment/index.d.ts +3 -5
  32. package/dist/deployment/index.js +1 -2
  33. package/dist/deployment/release/addressing.d.ts +2 -9
  34. package/dist/deployment/release/addressing.js +2 -3
  35. package/dist/deployment/release/index.d.ts +0 -2
  36. package/dist/deployment/release/index.js +0 -2
  37. package/dist/deployment/release/release.d.ts +1 -1
  38. package/dist/deployment/release/runtime.d.ts +0 -2
  39. package/dist/deployment/release/runtime.js +0 -2
  40. package/dist/deployment/release/served/index.d.ts +1 -2
  41. package/dist/deployment/release/served/index.js +7 -3
  42. package/dist/deployment/release/served/views.js +0 -1
  43. package/dist/deployment/verify/index.d.ts +2 -4
  44. package/dist/deployment/verify/index.js +1 -3
  45. package/dist/deployment/verify/preflight/index.d.ts +0 -12
  46. package/dist/deployment/verify/preflight/index.js +0 -12
  47. package/dist/deployment/verify/readiness/index.d.ts +2 -6
  48. package/dist/deployment/verify/readiness/index.js +3 -12
  49. package/dist/deployment/worker/response.d.ts +1 -4
  50. package/dist/deployment/worker/response.js +2 -8
  51. package/dist/execution/identity/delivery.d.ts +2 -7
  52. package/dist/execution/identity/delivery.js +1 -23
  53. package/dist/execution/identity/identity.d.ts +2 -3
  54. package/dist/execution/index.d.ts +1 -3
  55. package/dist/execution/index.js +1 -2
  56. package/dist/execution/invocation/admission/authority.d.ts +4 -5
  57. package/dist/execution/invocation/admission/authority.js +1 -2
  58. package/dist/execution/invocation/index.d.ts +2 -2
  59. package/dist/execution/invocation/index.js +1 -1
  60. package/dist/execution/invocation/invocation.js +3 -12
  61. package/dist/execution/invocation/result/errors.d.ts +0 -10
  62. package/dist/execution/invocation/result/errors.js +0 -17
  63. package/dist/execution/invocation/result/index.d.ts +2 -2
  64. package/dist/execution/invocation/result/index.js +1 -1
  65. package/dist/execution/runtime/release.d.ts +6 -11
  66. package/dist/execution/runtime/release.js +2 -9
  67. package/dist/execution/service/create.js +3 -1
  68. package/dist/execution/service/service.d.ts +2 -3
  69. package/dist/execution/service/serving/delivery.d.ts +1 -2
  70. package/dist/execution/service/serving/delivery.js +1 -2
  71. package/dist/execution/service/serving/source.d.ts +3 -10
  72. package/dist/execution/service/serving/source.js +1 -5
  73. package/dist/execution/workflows/index.d.ts +1 -1
  74. package/dist/execution/workflows/index.js +1 -1
  75. package/dist/execution/workflows/options.d.ts +0 -6
  76. package/dist/execution/workflows/options.js +0 -18
  77. package/dist/execution/workflows/receiver.d.ts +1 -2
  78. package/dist/execution/workflows/receiver.js +13 -20
  79. package/dist/execution/workflows/route.d.ts +1 -3
  80. package/dist/execution/workflows/route.js +4 -9
  81. package/dist/execution/workflows/run.d.ts +1 -1
  82. package/dist/execution/workflows/run.js +1 -1
  83. package/dist/index.d.ts +1 -1
  84. package/dist/index.js +1 -1
  85. package/dist/platform/graph/alias.d.ts +1 -5
  86. package/dist/platform/graph/alias.js +1 -5
  87. package/dist/platform/graph/document/index.d.ts +1 -1
  88. package/dist/platform/graph/document/index.js +1 -1
  89. package/dist/platform/graph/index.d.ts +1 -1
  90. package/dist/platform/graph/index.js +1 -1
  91. package/dist/platform/release/index.d.ts +1 -26
  92. package/dist/platform/release/index.js +1 -26
  93. package/dist/platform/schema/class-icon-svg.d.ts +9 -0
  94. package/dist/platform/schema/class-icon-svg.js +29 -0
  95. package/dist/platform/schema/class-icon.d.ts +3 -8
  96. package/dist/platform/schema/class-icon.js +2 -29
  97. package/dist/platform/schema/index.d.ts +1 -1
  98. package/dist/platform/schema/schema-authoring.d.ts +14 -7
  99. package/dist/platform/schema/schema-authoring.js +5 -1
  100. package/dist/project/admit.js +0 -4
  101. package/dist/project/install-command.d.ts +0 -4
  102. package/dist/project/install-command.js +1 -5
  103. package/dist/tooling/cli/deploy-mode.d.ts +3 -59
  104. package/dist/tooling/cli/deploy-mode.js +46 -122
  105. package/dist/tooling/cli/deploy-result.d.ts +10 -15
  106. package/dist/tooling/cli/help.js +9 -16
  107. package/dist/tooling/cli/immutable-deployment.d.ts +3 -3
  108. package/dist/tooling/cli/index.d.ts +1 -1
  109. package/dist/tooling/cli/list.d.ts +5 -7
  110. package/dist/tooling/cli/list.js +9 -61
  111. package/dist/tooling/cli/orchestrate.js +6 -16
  112. package/dist/tooling/cli/publish/index.d.ts +2 -2
  113. package/dist/tooling/cli/registry/client.js +1 -1
  114. package/dist/tooling/cli/secrets.d.ts +2 -2
  115. package/dist/tooling/linter/implementations/source/global.js +0 -1
  116. package/dist/tooling/linter/implementations/source/verifiers.js +0 -2
  117. package/dist/tooling/linter/policy/generated.js +2 -51
  118. package/dist/tooling/linter/requirements/registry.js +0 -6
  119. package/package.json +6 -6
  120. package/dist/application/query/execution/projection.d.ts +0 -3
  121. package/dist/application/query/execution/projection.js +0 -3
  122. package/dist/deployment/adapter/legacy/adapter.d.ts +0 -40
  123. package/dist/deployment/adapter/legacy/adapter.js +0 -1
  124. package/dist/deployment/adapter/legacy/deploy/context.d.ts +0 -19
  125. package/dist/deployment/adapter/legacy/deploy/context.js +0 -1
  126. package/dist/deployment/adapter/legacy/deploy/index.d.ts +0 -2
  127. package/dist/deployment/adapter/legacy/deploy/index.js +0 -1
  128. package/dist/deployment/adapter/legacy/deploy/result.d.ts +0 -89
  129. package/dist/deployment/adapter/legacy/deploy/result.js +0 -1
  130. package/dist/deployment/adapter/legacy/index.d.ts +0 -24
  131. package/dist/deployment/adapter/legacy/index.js +0 -1
  132. package/dist/deployment/adapter/legacy/prepare/artifact.d.ts +0 -43
  133. package/dist/deployment/adapter/legacy/prepare/artifact.js +0 -1
  134. package/dist/deployment/adapter/legacy/prepare/context.d.ts +0 -33
  135. package/dist/deployment/adapter/legacy/prepare/context.js +0 -1
  136. package/dist/deployment/adapter/legacy/prepare/index.d.ts +0 -2
  137. package/dist/deployment/adapter/legacy/prepare/index.js +0 -1
  138. package/dist/deployment/deploy.d.ts +0 -20
  139. package/dist/deployment/deploy.js +0 -31
  140. package/dist/deployment/release/legacy/admission.d.ts +0 -3
  141. package/dist/deployment/release/legacy/admission.js +0 -8
  142. package/dist/deployment/release/legacy/assemble.d.ts +0 -5
  143. package/dist/deployment/release/legacy/assemble.js +0 -20
  144. package/dist/deployment/release/legacy/index.d.ts +0 -35
  145. package/dist/deployment/release/legacy/index.js +0 -34
  146. package/dist/deployment/release/legacy/release.d.ts +0 -12
  147. package/dist/deployment/release/legacy/release.js +0 -1
  148. package/dist/deployment/release/legacy/seal.d.ts +0 -10
  149. package/dist/deployment/release/legacy/seal.js +0 -17
  150. package/dist/deployment/verify/preflight/artifact.d.ts +0 -6
  151. package/dist/deployment/verify/preflight/artifact.js +0 -122
  152. package/dist/deployment/verify/preflight/publication.d.ts +0 -4
  153. package/dist/deployment/verify/preflight/publication.js +0 -15
  154. package/dist/deployment/verify/readiness/deployment.d.ts +0 -3
  155. package/dist/deployment/verify/readiness/deployment.js +0 -143
  156. package/dist/deployment/verify/readiness/legacy/index.d.ts +0 -2
  157. package/dist/deployment/verify/readiness/legacy/index.js +0 -2
  158. package/dist/deployment/verify/readiness/legacy/publication.d.ts +0 -12
  159. package/dist/deployment/verify/readiness/legacy/publication.js +0 -23
  160. package/dist/execution/service/errors.d.ts +0 -3
  161. package/dist/execution/service/errors.js +0 -3
  162. package/dist/execution/service/serving/legacy/index.d.ts +0 -15
  163. package/dist/execution/service/serving/legacy/index.js +0 -19
  164. package/dist/tooling/cli/deprecations.d.ts +0 -9
  165. package/dist/tooling/cli/deprecations.js +0 -15
  166. package/dist/tooling/cli/legacy/deploy-result.d.ts +0 -28
  167. package/dist/tooling/cli/legacy/deploy-result.js +0 -37
  168. package/dist/tooling/cli/legacy/stable-target-adapter.d.ts +0 -21
  169. package/dist/tooling/cli/legacy/stable-target-adapter.js +0 -14
  170. package/dist/tooling/cli/legacy/stable-target-deploy.d.ts +0 -40
  171. package/dist/tooling/cli/legacy/stable-target-deploy.js +0 -102
  172. package/dist/tooling/cli/legacy/uploaded-build.d.ts +0 -11
  173. package/dist/tooling/cli/legacy/uploaded-build.js +0 -22
  174. package/dist/tooling/linter/implementations/source/migrations.d.ts +0 -2
  175. package/dist/tooling/linter/implementations/source/migrations.js +0 -113
  176. package/dist/tooling/linter/qualification/index.d.ts +0 -10
  177. package/dist/tooling/linter/qualification/index.js +0 -2
  178. package/dist/tooling/linter/qualification/query-fixtures.d.ts +0 -2
  179. package/dist/tooling/linter/qualification/query-fixtures.js +0 -68
  180. package/dist/tooling/linter/qualification/runner.d.ts +0 -3
  181. package/dist/tooling/linter/qualification/runner.js +0 -6
@@ -1,27 +1,2 @@
1
- /**
2
- * Canonical `DomainRelease` v4 wire contract and admission owned by the Astrale platform: the
3
- * document a deployment serves at `release.json`, its release digest and `ReleaseRef`.
4
- */
1
+ /** Canonical DomainRelease v4 and Delivery v2 wire contracts. */
5
2
  export * from '@astrale-os/kernel-protocol/release';
6
- /**
7
- * The Kernel's Publication v2/v3 codec (`@astrale-os/kernel-protocol/release/legacy`): `accept`,
8
- * `seal`, `encode`, `url`/`PATH`, the bundle helpers, `PublicationError` and Delivery v1, which
9
- * stable targets and pre-v4 Kernels still serve and read.
10
- *
11
- * @deprecated Read and seal `DomainRelease` v4 with this module's root exports.
12
- *
13
- * Short-term consumers, which took it from the removed `@astrale-os/sdk/publication`:
14
- * - cli `src/lib/domain-publication.ts` and its test (C1a: `accept`, `PATH`, `PublicationError`);
15
- * - admin `domain/providers/http-publication/resolver.ts`,
16
- * `domain/providers/remote-kernel/instance-gateway.ts`,
17
- * `domain/providers/scaleway/machine-provider.ts`, `domain/scripts/admin-bootstrap/cli.ts`,
18
- * `domain/scripts/e2e/install-domain-set.ts`, their tests and two `worker/src` tests, which also
19
- * seal v2/v3 fixtures (A10a);
20
- * - domains issues `tests/deployment/archived-errors.test.ts` (SV16).
21
- *
22
- * Removal, in a breaking SDK release: once those consumers no longer import it (the CLI and Admin
23
- * read `release.json`), at the latest with the Kernel folder it re-exports, which the Kernel
24
- * removes once no supported Kernel predates v4, no installation pins a v2/v3 document and no
25
- * stable Worker serves one (D10).
26
- */
27
- export { legacy } from '@astrale-os/kernel-protocol/release';
@@ -1,27 +1,2 @@
1
- /**
2
- * Canonical `DomainRelease` v4 wire contract and admission owned by the Astrale platform: the
3
- * document a deployment serves at `release.json`, its release digest and `ReleaseRef`.
4
- */
1
+ /** Canonical DomainRelease v4 and Delivery v2 wire contracts. */
5
2
  export * from '@astrale-os/kernel-protocol/release';
6
- /**
7
- * The Kernel's Publication v2/v3 codec (`@astrale-os/kernel-protocol/release/legacy`): `accept`,
8
- * `seal`, `encode`, `url`/`PATH`, the bundle helpers, `PublicationError` and Delivery v1, which
9
- * stable targets and pre-v4 Kernels still serve and read.
10
- *
11
- * @deprecated Read and seal `DomainRelease` v4 with this module's root exports.
12
- *
13
- * Short-term consumers, which took it from the removed `@astrale-os/sdk/publication`:
14
- * - cli `src/lib/domain-publication.ts` and its test (C1a: `accept`, `PATH`, `PublicationError`);
15
- * - admin `domain/providers/http-publication/resolver.ts`,
16
- * `domain/providers/remote-kernel/instance-gateway.ts`,
17
- * `domain/providers/scaleway/machine-provider.ts`, `domain/scripts/admin-bootstrap/cli.ts`,
18
- * `domain/scripts/e2e/install-domain-set.ts`, their tests and two `worker/src` tests, which also
19
- * seal v2/v3 fixtures (A10a);
20
- * - domains issues `tests/deployment/archived-errors.test.ts` (SV16).
21
- *
22
- * Removal, in a breaking SDK release: once those consumers no longer import it (the CLI and Admin
23
- * read `release.json`), at the latest with the Kernel folder it re-exports, which the Kernel
24
- * removes once no supported Kernel predates v4, no installation pins a v2/v3 document and no
25
- * stable Worker serves one (D10).
26
- */
27
- export { legacy } from '@astrale-os/kernel-protocol/release';
@@ -0,0 +1,9 @@
1
+ declare const CLASS_ICON: unique symbol;
2
+ /** An admitted, self-contained SVG suitable for a Node Class presentation icon. */
3
+ export type ClassIcon = string & {
4
+ readonly [CLASS_ICON]: true;
5
+ };
6
+ /** Stable empty SVG used when an author explicitly chooses to render no icon glyph. */
7
+ export declare const NEUTRAL_CLASS_ICON_SVG = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"></svg>";
8
+ export declare function admitClassIconSvg(source: string): ClassIcon;
9
+ export {};
@@ -0,0 +1,29 @@
1
+ const MAX_CLASS_ICON_LENGTH = 8_000;
2
+ const SVG_ROOT = /^<svg(?:\s[^>]*)?>[\s\S]*<\/svg>$/u;
3
+ const SVG_ROOT_OPEN = /<svg(?:\s|>)/gu;
4
+ const SVG_ROOT_CLOSE = /<\/svg\s*>/gu;
5
+ const SVG_GRAPHIC = /<(?:circle|ellipse|line|path|polygon|polyline|rect)\b/iu;
6
+ const UNSAFE_SVG = /<\s*(?:animate|discard|embed|foreignObject|iframe|image|object|script|set|style|use)\b|<!DOCTYPE\b|<!ENTITY\b|\son[a-z][\w:.-]*\s*=|(?:href|xlink:href)\s*=|javascript\s*:|url\s*\(/iu;
7
+ /** Stable empty SVG used when an author explicitly chooses to render no icon glyph. */
8
+ export const NEUTRAL_CLASS_ICON_SVG = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"></svg>';
9
+ export function admitClassIconSvg(source) {
10
+ if (typeof source !== 'string') {
11
+ throw new TypeError('Class icon must be an inline SVG string.');
12
+ }
13
+ const value = source.trim();
14
+ if (Array.from(value).length > MAX_CLASS_ICON_LENGTH) {
15
+ throw new TypeError(`Class icon must contain at most ${MAX_CLASS_ICON_LENGTH} characters.`);
16
+ }
17
+ if (!SVG_ROOT.test(value) ||
18
+ (value.match(SVG_ROOT_OPEN)?.length ?? 0) !== 1 ||
19
+ (value.match(SVG_ROOT_CLOSE)?.length ?? 0) !== 1) {
20
+ throw new TypeError('Class icon must be one complete inline <svg> element.');
21
+ }
22
+ if (UNSAFE_SVG.test(value)) {
23
+ throw new TypeError('Class icon SVG must be self-contained and contain no executable content.');
24
+ }
25
+ if (value !== NEUTRAL_CLASS_ICON_SVG && !SVG_GRAPHIC.test(value)) {
26
+ throw new TypeError('Class icon SVG must contain a visible vector element.');
27
+ }
28
+ return value;
29
+ }
@@ -1,15 +1,10 @@
1
1
  import type { LucideIconData } from '@lucide/icons';
2
- declare const CLASS_ICON: unique symbol;
3
- /** An admitted, self-contained SVG suitable for a Node Class presentation icon. */
4
- export type ClassIcon = string & {
5
- readonly [CLASS_ICON]: true;
6
- };
7
- /** Stable empty SVG used when an author explicitly chooses to render no icon glyph. */
8
- export declare const NEUTRAL_CLASS_ICON_SVG = "<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\"></svg>";
2
+ import type { ClassIcon } from './class-icon-svg.js';
3
+ export type { ClassIcon } from './class-icon-svg.js';
4
+ export { NEUTRAL_CLASS_ICON_SVG } from './class-icon-svg.js';
9
5
  /** Framework-neutral constructors for canonical Node Class icons. */
10
6
  export declare const classIcon: Readonly<{
11
7
  readonly neutral: ClassIcon;
12
8
  svg(source: string): ClassIcon;
13
9
  lucide(icon: LucideIconData): ClassIcon;
14
10
  }>;
15
- export {};
@@ -1,33 +1,6 @@
1
1
  import { buildLucideSvg } from '@lucide/icons/build';
2
- const MAX_CLASS_ICON_LENGTH = 8_000;
3
- const SVG_ROOT = /^<svg(?:\s[^>]*)?>[\s\S]*<\/svg>$/u;
4
- const SVG_ROOT_OPEN = /<svg(?:\s|>)/gu;
5
- const SVG_ROOT_CLOSE = /<\/svg\s*>/gu;
6
- const SVG_GRAPHIC = /<(?:circle|ellipse|line|path|polygon|polyline|rect)\b/iu;
7
- const UNSAFE_SVG = /<\s*(?:animate|discard|embed|foreignObject|iframe|image|object|script|set|style|use)\b|<!DOCTYPE\b|<!ENTITY\b|\son[a-z][\w:.-]*\s*=|(?:href|xlink:href)\s*=|javascript\s*:|url\s*\(/iu;
8
- /** Stable empty SVG used when an author explicitly chooses to render no icon glyph. */
9
- export const NEUTRAL_CLASS_ICON_SVG = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"></svg>';
10
- function svg(source) {
11
- if (typeof source !== 'string') {
12
- throw new TypeError('Class icon must be an inline SVG string.');
13
- }
14
- const value = source.trim();
15
- if (Array.from(value).length > MAX_CLASS_ICON_LENGTH) {
16
- throw new TypeError(`Class icon must contain at most ${MAX_CLASS_ICON_LENGTH} characters.`);
17
- }
18
- if (!SVG_ROOT.test(value) ||
19
- (value.match(SVG_ROOT_OPEN)?.length ?? 0) !== 1 ||
20
- (value.match(SVG_ROOT_CLOSE)?.length ?? 0) !== 1) {
21
- throw new TypeError('Class icon must be one complete inline <svg> element.');
22
- }
23
- if (UNSAFE_SVG.test(value)) {
24
- throw new TypeError('Class icon SVG must be self-contained and contain no executable content.');
25
- }
26
- if (value !== NEUTRAL_CLASS_ICON_SVG && !SVG_GRAPHIC.test(value)) {
27
- throw new TypeError('Class icon SVG must contain a visible vector element.');
28
- }
29
- return value;
30
- }
2
+ import { admitClassIconSvg as svg, NEUTRAL_CLASS_ICON_SVG } from './class-icon-svg.js';
3
+ export { NEUTRAL_CLASS_ICON_SVG } from './class-icon-svg.js';
31
4
  function lucide(icon) {
32
5
  let source;
33
6
  try {
@@ -16,7 +16,7 @@ export type { ClassIcon } from './class-icon.js';
16
16
  export type { StoredPropertyInputOf } from './property-input.js';
17
17
  export type { CallablePolicyBuilder, CallablePolicyContext, CallableProjection, AuthoredMethodProjection, AuthoredPropertyProjection, ClassIdentityProjection, ClassOwnerProjection, CoreEdge, CoreEndpoint, CoreNode, DefinedSchema, DirectedEdgeClass, ClassReferenceProjection, ClassProjection, FunctionProjection, EdgeClass, Function, Method, MethodProjection, Lazy, NodeClass, Policy, PolicyExistsContext, PolicyNodeBinder, PolicyPatternContext, Property, PropertyProjection, ResolvedDomainOfInput, View, } from '@astrale-os/kernel-dsl/v1/builder';
18
18
  export type { Array, Object, Value } from '@astrale-os/kernel-dsl/value';
19
- export type { CallableExecution, ClassKind, DirectedEdgeContract, EdgeClassPolicies, NodeClassDefinition, PolicyCheckObject, PolicyObjectRef, PropertyFacet, StateTopology, UndirectedEdgeContract, } from '@astrale-os/kernel-dsl/v1/language';
19
+ export type { CallableExecution, ClassKind, DirectedEdgeContract, EdgeClassPolicies, NodeClassDefinition, PolicyCheckObject, PolicyObjectRef, PropertyFacet, PropertyImmutability, StateTopology, UndirectedEdgeContract, } from '@astrale-os/kernel-dsl/v1/language';
20
20
  export type { DomainSchema } from '@astrale-os/kernel-dsl/v1/schema';
21
21
  /** Kernel-owned Schema values used by authored product Schemas and graph operations. */
22
22
  export { AuthorityOperationOrder, AuthorityOperations, AuthorityRelations, KernelRootFunctions, OperationCore, operationOf, } from '@astrale-os/kernel-core/schema';
@@ -1,9 +1,8 @@
1
- import type { DefinedSchema, ResolvedDomainOfInput } from '@astrale-os/kernel-dsl/v1/builder';
1
+ import type { DefinedSchema, EntrypointOf, ResolvedDomainOfInput, SchemaInput } from '@astrale-os/kernel-dsl/v1/builder';
2
2
  import type { DomainSchema } from '@astrale-os/kernel-dsl/v1/schema';
3
- import { defineSchema as kernelDefineSchema } from '@astrale-os/kernel-dsl/v1';
4
- type DomainSchemaInput = Parameters<typeof kernelDefineSchema>[1];
3
+ type DomainSchemaInput = SchemaInput;
5
4
  declare const authoredGraph: unique symbol;
6
- /** Opaque legacy Schemas retain their witness; SDK Schemas retain authored input and edges. */
5
+ /** Resolved Schemas retain their witness; authored Schemas retain input and dependency edges. */
7
6
  type Entry = readonly [origin: string, schema: DomainSchema] | readonly [
8
7
  origin: string,
9
8
  input: DomainSchemaInput,
@@ -34,7 +33,7 @@ type InputOf<Origin extends string, Graph extends Entry> = Extract<Graph, readon
34
33
  readonly [Alias in keyof Dependencies]: SchemaOf<Dependencies[Alias], Graph>;
35
34
  };
36
35
  } : never;
37
- type SchemaOf<Origin extends string, Graph extends Entry> = Extract<Graph, readonly [Origin, DomainSchema]> extends infer Legacy ? [Legacy] extends [never] ? AuthoredSchema<Origin, Graph> : Legacy extends readonly [string, infer Schema extends DomainSchema] ? Schema : never : never;
36
+ type SchemaOf<Origin extends string, Graph extends Entry> = Extract<Graph, readonly [Origin, DomainSchema]> extends infer Resolved ? [Resolved] extends [never] ? AuthoredSchema<Origin, Graph> : Resolved extends readonly [string, infer Schema extends DomainSchema] ? Schema : never : never;
38
37
  /** Resolve a dependency graph without expanding a shared Schema at each dependency edge. */
39
38
  export interface AuthoredDomain<Origin extends string, Graph extends Entry> extends ResolvedDomainOfInput<Origin, InputOf<Origin, Graph>> {
40
39
  }
@@ -42,7 +41,15 @@ export interface AuthoredDomain<Origin extends string, Graph extends Entry> exte
42
41
  export interface AuthoredSchema<Origin extends string, Graph extends Entry> extends DefinedSchema<Origin, AuthoredDomain<Origin, Graph>> {
43
42
  readonly [authoredGraph]?: Graph;
44
43
  }
45
- type DefineSchema = <const Origin extends string, const Input extends DomainSchemaInput>(origin: Origin, input: Input) => string extends Origin | Extract<Dependencies<Input>[keyof Dependencies<Input>], DomainSchema>['origin'] ? DefinedSchema<Origin, ResolvedDomainOfInput<Origin, Input>> : AuthoredSchema<Origin, Extract<UniqueEntries<GraphOfInput<Origin, Input>>, Entry>>;
46
- /** The canonical implementation with a portable, automatically inferred declaration. */
44
+ type DefineSchema = <const Origin extends string, const Input extends DomainSchemaInput & {
45
+ readonly name: string;
46
+ }>(origin: Origin, input: Input & {
47
+ readonly entrypoint?: EntrypointOf<Input>;
48
+ }) => string extends Origin | Extract<Dependencies<Input>[keyof Dependencies<Input>], DomainSchema>['origin'] ? DefinedSchema<Origin, ResolvedDomainOfInput<Origin, Input>> : AuthoredSchema<Origin, Extract<UniqueEntries<GraphOfInput<Origin, Input>>, Entry>>;
49
+ /**
50
+ * The canonical implementation with a portable, automatically inferred declaration. Its type
51
+ * requires the Domain `name`, which the Kernel requires to install a new revision; `defineDomain`
52
+ * refuses an unnamed root Schema at runtime. `entrypoint` names one of the declared Views.
53
+ */
47
54
  export declare const defineSchema: DefineSchema;
48
55
  export {};
@@ -1,3 +1,7 @@
1
1
  import { defineSchema as kernelDefineSchema } from '@astrale-os/kernel-dsl/v1';
2
- /** The canonical implementation with a portable, automatically inferred declaration. */
2
+ /**
3
+ * The canonical implementation with a portable, automatically inferred declaration. Its type
4
+ * requires the Domain `name`, which the Kernel requires to install a new revision; `defineDomain`
5
+ * refuses an unnamed root Schema at runtime. `entrypoint` names one of the declared Views.
6
+ */
3
7
  export const defineSchema = kernelDefineSchema;
@@ -1,4 +1,3 @@
1
- import { isLegacyDeployment } from '../deployment/deploy.js';
2
1
  import { isProject } from './define.js';
3
2
  export const PROJECT_EXPORT_HINT = 'astrale.config.ts must export exactly one default Project:\n' +
4
3
  " import { defineProject } from '@astrale-os/sdk/project'\n" +
@@ -15,8 +14,5 @@ export function admitProjectModule(loaded) {
15
14
  const value = Reflect.get(loaded, 'default');
16
15
  if (isProject(value))
17
16
  return value;
18
- if (isLegacyDeployment(value)) {
19
- throw new TypeError(`astrale.config.ts exports the legacy deploy() aggregate; migrate the Domain and Environments into defineProject().\n${PROJECT_EXPORT_HINT}`);
20
- }
21
17
  throw new TypeError(`Default export must be created by defineProject().\n${PROJECT_EXPORT_HINT}`);
22
18
  }
@@ -2,9 +2,5 @@
2
2
  * The command that installs a deployed URL on an instance, as every SDK refusal and help text
3
3
  * names it. A deploy never installs (DX [.81399], AM-72): `astrale-domain deploy <environment>`
4
4
  * prints a URL, and this command installs it.
5
- *
6
- * `--direct` sends a URL install to the instance Kernel, which the astrale CLI requires today and
7
- * accepts until D13. When the CLI retires it, this is the one SDK text to change; the adapter and
8
- * scaffold READMEs and templates repeat it as prose.
9
5
  */
10
6
  export declare function installCommand(instance?: string, identity?: string): string;
@@ -2,12 +2,8 @@
2
2
  * The command that installs a deployed URL on an instance, as every SDK refusal and help text
3
3
  * names it. A deploy never installs (DX [.81399], AM-72): `astrale-domain deploy <environment>`
4
4
  * prints a URL, and this command installs it.
5
- *
6
- * `--direct` sends a URL install to the instance Kernel, which the astrale CLI requires today and
7
- * accepts until D13. When the CLI retires it, this is the one SDK text to change; the adapter and
8
- * scaffold READMEs and templates repeat it as prose.
9
5
  */
10
6
  export function installCommand(instance = '<instance>', identity) {
11
- return (`astrale domain install <url> --direct -i ${instance}` +
7
+ return (`astrale domain install <url> -i ${instance}` +
12
8
  (identity === undefined ? '' : ` --as ${identity}`));
13
9
  }
@@ -1,75 +1,19 @@
1
- /**
2
- * The deploy mode of one Environment for one command (CT33), chosen by the configuration itself:
3
- * an unchanged configuration keeps its mode, and so its behaviour, across an SDK upgrade, as long as
4
- * that mode still has a consumer (AM-16, AM-72).
5
- *
6
- * - `canonical`: an immutable deployment of one sealed release through the adapter's
7
- * `deployRelease`, with a key generated for it, and no call to any instance.
8
- * - `legacy-direct`: today's stable target, replaced in place through `prepare` and `deploy`, which
9
- * serves a v3 Publication only. Its `reasons` name what selected it.
10
- * - `refused`: a shape no deploy of this SDK serves, refused before any effect. Each refusal
11
- * carries the configuration or command to write instead.
12
- *
13
- * A deploy never installs, so two shapes are refused before a mode is selected at all: an
14
- * Environment that declares `installation` by `defineProject`, and `--deploy-only` by the
15
- * command-line parser (AM-72).
16
- */
1
+ /** A supported immutable deployment, or a configuration refused before provider effects. */
17
2
  export type DeployMode = {
18
3
  readonly kind: 'canonical';
19
- } | {
20
- readonly kind: 'legacy-direct';
21
- readonly reasons: readonly LegacyDirectReason[];
22
4
  } | {
23
5
  readonly kind: 'refused';
24
6
  readonly refusals: readonly DeployRefusal[];
25
7
  };
26
- /** What puts an Environment on the legacy direct-mode path. */
27
- export type LegacyDirectReason =
28
- /** An adapter-cloudflare parameter of direct mode. */
29
- {
30
- readonly reason: 'direct-parameter';
31
- readonly parameter: CloudflareDirectParameter;
32
- }
33
- /** adapter-cloudflare without a dispatch `namespace`: direct mode is its default. */
34
- | {
35
- readonly reason: 'no-namespace';
36
- }
37
- /** An adapter that declares no `deployRelease`: the contract before adapter interface v2. */
38
- | {
39
- readonly reason: 'no-deploy-release';
40
- };
41
- export type CloudflareDirectParameter = 'route' | 'workerName' | 'identityIssuer' | 'addressing' | 'signingIdentity';
42
8
  export interface DeployRefusal {
43
- readonly reason: 'astrale-instance' | 'astrale-signing-identity' | 'mixed-parameters' | 'scheduled-triggers' | 'publish-legacy-direct';
44
- /** The configuration or command to write instead, for the author. */
9
+ readonly reason: 'invalid-parameters' | 'missing-namespace' | 'scheduled-triggers' | 'unsupported-adapter';
45
10
  readonly guidance: string;
46
11
  }
47
- /**
48
- * The commands that select a deploy mode. `publish` names only an immutable deployment, so it
49
- * refuses every Environment that is not canonical (CT33, R-G03).
50
- */
51
12
  export type DeployModeCommand = 'deploy' | 'publish';
52
- /**
53
- * Select the deploy mode of one Environment (CT33). It reads the configuration and the command
54
- * only, and has no effect.
55
- *
56
- * A refusal wins over every other reason. adapter-astrale deploys immutable deployments only
57
- * (`deployRelease`): its removed instance mode's `instance` and `signingIdentity` are refused
58
- * before any effect, since their one consumer pins an older SDK (AM-72). Otherwise the Environment
59
- * is on the legacy direct-mode path when adapter-cloudflare names a direct-mode parameter or no
60
- * `namespace`, or when its adapter declares no `deployRelease`. Everything else is canonical,
61
- * and `publish` refuses the legacy direct-mode path: a stable target serves no release, so no
62
- * version can name it.
63
- *
64
- * Within canonical adapter-cloudflare (with `namespace`), a direct-mode parameter is refused
65
- * rather than silently selecting either mode, and so is `wrangler.triggers`: an immutable
66
- * deployment runs no cron of its own (D13). The bundling-affecting `wrangler` keys are refused by
67
- * adapter-cloudflare itself for every Environment (AM-51).
68
- */
13
+ /** Inspect one Environment's deployment contract without building or changing any provider. */
69
14
  export declare function selectDeployMode(input: {
70
15
  readonly command: DeployModeCommand;
71
16
  readonly environment: string;
72
- /** The Environment's definition, of which selection reads only the adapter and its parameters. */
73
17
  readonly definition: {
74
18
  readonly deployment: {
75
19
  readonly adapter: {
@@ -1,135 +1,59 @@
1
- import { installCommand } from '../../project/install-command.js';
2
- /** The adapter names of the first-party adapters whose parameters CT33 classifies. */
3
- const CLOUDFLARE = 'cloudflare';
4
- const ASTRALE = 'astrale';
5
- /** The parameters that named the stable Service of adapter-astrale's removed instance mode. */
6
- const ASTRALE_SERVICE_PARAMETERS = ['serviceKey', 'name'];
7
- const CLOUDFLARE_DIRECT_PARAMETERS = [
8
- 'route',
9
- 'workerName',
10
- 'identityIssuer',
11
- 'addressing',
12
- 'signingIdentity',
13
- ];
14
- /**
15
- * Select the deploy mode of one Environment (CT33). It reads the configuration and the command
16
- * only, and has no effect.
17
- *
18
- * A refusal wins over every other reason. adapter-astrale deploys immutable deployments only
19
- * (`deployRelease`): its removed instance mode's `instance` and `signingIdentity` are refused
20
- * before any effect, since their one consumer pins an older SDK (AM-72). Otherwise the Environment
21
- * is on the legacy direct-mode path when adapter-cloudflare names a direct-mode parameter or no
22
- * `namespace`, or when its adapter declares no `deployRelease`. Everything else is canonical,
23
- * and `publish` refuses the legacy direct-mode path: a stable target serves no release, so no
24
- * version can name it.
25
- *
26
- * Within canonical adapter-cloudflare (with `namespace`), a direct-mode parameter is refused
27
- * rather than silently selecting either mode, and so is `wrangler.triggers`: an immutable
28
- * deployment runs no cron of its own (D13). The bundling-affecting `wrangler` keys are refused by
29
- * adapter-cloudflare itself for every Environment (AM-51).
30
- */
1
+ /** Inspect one Environment's deployment contract without building or changing any provider. */
31
2
  export function selectDeployMode(input) {
32
- const { command, environment, definition } = input;
33
- const { adapter } = definition.deployment;
34
- const parameters = definition.deployment.parameters;
3
+ const { adapter, parameters } = input.definition.deployment;
4
+ const values = parameters;
35
5
  const refusals = [];
36
- const reasons = [];
37
- const releases = 'deployRelease' in adapter && typeof adapter.deployRelease === 'function';
38
- if (adapter.name === ASTRALE && releases) {
39
- if (declares(parameters, 'instance')) {
6
+ if (typeof adapter.deployRelease !== 'function') {
7
+ refusals.push({
8
+ reason: 'unsupported-adapter',
9
+ guidance: `Adapter ${adapter.name} must implement configure, placement and deployRelease for immutable deployments.`,
10
+ });
11
+ }
12
+ if (adapter.name === 'cloudflare') {
13
+ if (values.namespace === undefined) {
40
14
  refusals.push({
41
- reason: 'astrale-instance',
42
- guidance: astraleInstanceGuidance(parameters, environment),
15
+ reason: 'missing-namespace',
16
+ guidance: 'cloudflare requires namespace: { name, routingDomain }. Use astrale() for managed deployments.',
43
17
  });
44
18
  }
45
- if (declares(parameters, 'signingIdentity')) {
19
+ const allowed = [
20
+ 'namespace',
21
+ 'secrets',
22
+ 'vars',
23
+ 'maximumRequestBytes',
24
+ 'invocationTimeoutMs',
25
+ 'tokenExchange',
26
+ 'durable',
27
+ 'wrangler',
28
+ 'router',
29
+ ];
30
+ const unknown = Reflect.ownKeys(values).filter((key) => typeof key !== 'string' || !allowed.includes(key));
31
+ if (unknown.length > 0)
32
+ refusals.push({
33
+ reason: 'invalid-parameters',
34
+ guidance: `Cloudflare Environment ${input.environment} declares unknown parameters ${unknown.map(String).join(', ')}.`,
35
+ });
36
+ const wrangler = values.wrangler;
37
+ if (wrangler !== undefined && Object.hasOwn(wrangler, 'triggers')) {
46
38
  refusals.push({
47
- reason: 'astrale-signing-identity',
48
- guidance: 'astrale({ signingIdentity }) is no longer accepted: each deployment gets a signing key ' +
49
- 'generated when it is deployed. Remove `signingIdentity`.',
39
+ reason: 'scheduled-triggers',
40
+ guidance: 'Immutable deployments run no cron of their own. Remove wrangler.triggers.',
50
41
  });
51
42
  }
52
43
  }
53
- if (adapter.name === CLOUDFLARE) {
54
- const direct = CLOUDFLARE_DIRECT_PARAMETERS.filter((name) => declares(parameters, name));
55
- if (declares(parameters, 'namespace')) {
56
- if (direct.length > 0) {
57
- refusals.push({
58
- reason: 'mixed-parameters',
59
- guidance: `cloudflare({ namespace }) deploys immutable deployments and cannot also name ` +
60
- `${direct.join(', ')}, which select the legacy direct mode. Keep \`namespace\` and ` +
61
- `remove ${direct.join(', ')}, or remove \`namespace\` to stay on the direct mode.`,
62
- });
63
- }
64
- const wrangler = parameters.wrangler;
65
- if (wrangler !== undefined && declares(wrangler, 'triggers')) {
66
- refusals.push({
67
- reason: 'scheduled-triggers',
68
- guidance: 'cloudflare({ namespace }) refuses `wrangler.triggers`: an immutable deployment runs ' +
69
- 'no cron of its own. Remove `wrangler.triggers`, or keep the cron on a direct-mode ' +
70
- 'Environment.',
71
- });
72
- }
73
- }
74
- else {
75
- reasons.push(...direct.map((parameter) => ({ reason: 'direct-parameter', parameter })), { reason: 'no-namespace' });
76
- }
44
+ if (adapter.name === 'astrale') {
45
+ const allowed = ['admin', 'secrets', 'vars', 'maximumRequestBytes', 'tokenExchange', 'durable'];
46
+ const unknown = Reflect.ownKeys(values).filter((key) => typeof key !== 'string' || !allowed.includes(key));
47
+ if (unknown.length > 0)
48
+ refusals.push({
49
+ reason: 'invalid-parameters',
50
+ guidance: `Astrale Environment ${input.environment} declares unknown parameters ${unknown.map(String).join(', ')}.`,
51
+ });
77
52
  }
78
- if (!releases)
79
- reasons.push({ reason: 'no-deploy-release' });
80
- if (refusals.length > 0)
81
- return Object.freeze({ kind: 'refused', refusals: freeze(refusals) });
82
- if (reasons.length > 0 && command === 'publish') {
83
- return Object.freeze({
53
+ return refusals.length === 0
54
+ ? Object.freeze({ kind: 'canonical' })
55
+ : Object.freeze({
84
56
  kind: 'refused',
85
- refusals: freeze([
86
- { reason: 'publish-legacy-direct', guidance: publishGuidance(environment, reasons) },
87
- ]),
57
+ refusals: Object.freeze(refusals.map((r) => Object.freeze(r))),
88
58
  });
89
- }
90
- if (reasons.length > 0)
91
- return Object.freeze({ kind: 'legacy-direct', reasons: freeze(reasons) });
92
- return Object.freeze({ kind: 'canonical' });
93
- }
94
- /**
95
- * How an adapter-astrale Environment of the removed instance mode deploys now: without `instance`
96
- * (nor `serviceKey` and `name`, which named its stable Service), then installed by URL on the
97
- * instance it used to deploy through.
98
- */
99
- function astraleInstanceGuidance(parameters, environment) {
100
- const instance = String(parameters.instance);
101
- const service = ASTRALE_SERVICE_PARAMETERS.filter((name) => declares(parameters, name));
102
- const removed = service.length === 0
103
- ? 'Remove `instance`'
104
- : `Remove \`instance\` with ${service.map((name) => `\`${name}\``).join(' and ')}, ` +
105
- `which named its stable Service`;
106
- return (`astrale({ instance: '${instance}' }) deployed through that instance's Services, which no ` +
107
- `longer hosts deployments. ${removed}: \`astrale-domain deploy ${environment}\` ` +
108
- `makes an immutable deployment on Admin's Services, and \`${installCommand(instance)}\` ` +
109
- 'installs it.');
110
- }
111
- /**
112
- * Why a legacy direct-mode Environment cannot be published, and the configuration that makes it
113
- * publishable: a version names an immutable deployment's release, which a stable target never
114
- * serves.
115
- */
116
- function publishGuidance(environment, reasons) {
117
- const deploys = `\`astrale-domain publish ${environment}\` names an immutable deployment's release, and ${environment} deploys`;
118
- if (reasons.some(({ reason }) => reason === 'no-deploy-release')) {
119
- return (`${deploys} through an adapter without deployRelease, which replaces a stable target in ` +
120
- 'place and serves no release. Use an adapter that implements deployRelease (adapter ' +
121
- "interface v2), such as astrale() on Admin's Services.");
122
- }
123
- const direct = reasons.flatMap((reason) => reason.reason === 'direct-parameter' ? [reason.parameter] : []);
124
- return (`${deploys} on cloudflare()'s legacy direct mode, which serves no release. Deploy it into a ` +
125
- 'dispatch namespace with cloudflare({ namespace })' +
126
- (direct.length === 0 ? '' : ` and remove ${direct.join(', ')}`) +
127
- ", or on Admin's Services with astrale().");
128
- }
129
- /** A parameter is declared when its value is not `undefined`, as optional adapter parameters read. */
130
- function declares(parameters, name) {
131
- return Object.hasOwn(parameters, name) && parameters[name] !== undefined;
132
- }
133
- function freeze(values) {
134
- return Object.freeze(values.map((value) => Object.freeze(value)));
135
59
  }
@@ -15,23 +15,21 @@ export interface DeployResultV1 {
15
15
  readonly environment: string;
16
16
  /**
17
17
  * The URL `astrale domain install <url>` takes: an immutable deployment's URL, which is also its
18
- * issuer, or the public URL of a stable target.
18
+ * issuer.
19
19
  */
20
20
  readonly url: string;
21
21
  /**
22
- * The digest of the `DomainRelease` v4 the deployment serves at `release.json`. `null` for a
23
- * stable target, which serves a v3 Publication and no release.
22
+ * The digest of the DomainRelease v4 served at release.json.
24
23
  */
25
24
  readonly release: {
26
25
  readonly digest: ReleaseDigest;
27
- } | null;
26
+ };
28
27
  /**
29
- * The build digest of the code the deployment runs, as `astrale-domain build` prints it. `null`
30
- * for a stable target, which never serves a build digest.
28
+ * The build digest of the code the deployment runs, as astrale-domain build prints it.
31
29
  */
32
30
  readonly build: {
33
31
  readonly digest: BuildDigest;
34
- } | null;
32
+ };
35
33
  readonly schema: {
36
34
  readonly revision: Revision;
37
35
  };
@@ -40,24 +38,21 @@ export interface DeployResultV1 {
40
38
  readonly adapter: string;
41
39
  /**
42
40
  * The provider script that serves this deployment: an immutable deployment's label, which is
43
- * also the first label of its URL. `null` for a stable target, whose legacy adapter operations
44
- * never report the script they replace.
41
+ * also the first label of its URL.
45
42
  */
46
- readonly script: string | null;
43
+ readonly script: string;
47
44
  /**
48
45
  * `created`: a new immutable deployment. `reused`: the immutable deployment of this exact
49
- * release already existed. `replaced`: a stable target now runs this code in place of what it
50
- * ran, if anything (the legacy direct-mode path cannot tell a first deploy from a later one);
51
- * only that path replaces.
46
+ * release already existed.
52
47
  */
53
- readonly state: 'created' | 'reused' | 'replaced';
48
+ readonly state: 'created' | 'reused';
54
49
  };
55
50
  /**
56
51
  * Immutable deployments only: the environment's current secrets were `bound` to a new
57
52
  * deployment, or `updated` or left `unchanged` in place on the reused one. A deploy never writes
58
53
  * the secrets of any other deployment.
59
54
  */
60
- readonly secrets?: {
55
+ readonly secrets: {
61
56
  readonly state: DeploymentSecretsState;
62
57
  };
63
58
  /**
@@ -101,16 +101,11 @@ Behavior:
101
101
  does, loads declared secrets, and deploys through the selected adapter. It never
102
102
  installs the Domain: install the URL it prints with
103
103
  ${installCommand()}.
104
- The Environment's configuration selects how it deploys. An adapter that implements
105
- deployRelease makes one immutable deployment per release and calls no instance: the
106
- SDK seals the release for the deployment's URL, records the commit it was built
107
- from, and the adapter creates that deployment or reuses it (adapter-astrale on
108
- Admin's Services, through astrale call --admin). A new deployment binds the
109
- Environment's current secrets; a reused one has its own secrets updated in place,
110
- served once propagated; no other deployment's secrets change. Any other Environment
111
- replaces its stable target in place (legacy direct mode, deprecated), warns on
112
- stderr, serves a v3 Publication only, and warns when the uploaded code has another
113
- build digest than the Bundle.
104
+ Each Environment deploys one immutable release through configure, placement and
105
+ deployRelease. The SDK seals the release at the deployment URL and records the
106
+ source commit. Its adapter creates that deployment or reuses it. A new deployment
107
+ binds the Environment's current secrets; reuse updates only that deployment's
108
+ secrets. Cloudflare requires a dispatch namespace; astrale() uses Admin's Services.
114
109
  With --json, stdout holds only one DeployResultV1: the deployment's URL, which
115
110
  astrale domain install takes, its digests, adapter and state. Exit status: 0 deployed,
116
111
  1 failed or refused, 2 usage error; a failed run prints nothing on stdout.
@@ -131,8 +126,7 @@ Options:
131
126
  Behavior:
132
127
  Asks the adapter of each Environment that deploys immutable deployments for the
133
128
  deployments its host keeps for the caller, and prints each one's release, its version
134
- or name, Environment and state, the instances it is installed on, its last call and
135
- its expiry, and the URL ${installCommand()} takes.
129
+ or name, Environment and state, the instances it is installed on, and the URL ${installCommand()} takes.
136
130
  A deployment is named by the registry's version of its release (1.5.0) or of its build
137
131
  (1.5.0 · staging), else from its record's commit, such as 1.4.2 + 7 commits · a1b2c3d ·
138
132
  staging. Names are computed, never stored, and printed whole.
@@ -144,11 +138,10 @@ Behavior:
144
138
  The registry and the instances are read through the Astrale CLI (${MINIMUM_INSTALLATIONS_CLI_VERSION} or
145
139
  newer) with the caller's identity, only once a deployment is listed.
146
140
  A registry that cannot be read fails the listing; an unknown instance never does.
147
- Admin's Services and a Cloudflare dispatch namespace keep every deployment until its
148
- owner retires it, and report no last call or expiry; LAST CALL and EXPIRES show one
149
- only when an older adapter reports it.
141
+ Admin's Services and a Cloudflare dispatch namespace keep deployments until their
142
+ owner retires them.
150
143
  Listing changes nothing, at any host, registry or instance.
151
- An Environment in legacy direct mode, refused by deploy, or whose adapter lists no
144
+ An Environment refused by deploy, or whose adapter lists no
152
145
  deployments is reported on stderr and, with --json, under unlisted. A deployment
153
146
  whose record this SDK does not admit is still listed, from what its host knows.
154
147
  With --json, each deployment carries its installedOn and its call target: the path of