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

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 (206) hide show
  1. package/README.md +32 -38
  2. package/dist/application/action/context.d.ts +29 -25
  3. package/dist/application/action/index.d.ts +1 -1
  4. package/dist/application/define.d.ts +3 -1
  5. package/dist/application/define.js +16 -2
  6. package/dist/application/dependency/invoker.d.ts +5 -5
  7. package/dist/application/domain.d.ts +3 -1
  8. package/dist/application/index.d.ts +1 -1
  9. package/dist/application/integration/operation.d.ts +2 -2
  10. package/dist/application/mutation/index.d.ts +1 -1
  11. package/dist/application/query/composite/plan.d.ts +0 -4
  12. package/dist/application/query/composite/plan.js +0 -2
  13. package/dist/application/runtime/workflows.d.ts +1 -1
  14. package/dist/application/runtime/workflows.js +1 -4
  15. package/dist/application/view/define.js +4 -6
  16. package/dist/application/view/frontend.d.ts +2 -2
  17. package/dist/application/view/index.d.ts +1 -1
  18. package/dist/application/view/route.d.ts +0 -14
  19. package/dist/application/view/route.js +1 -64
  20. package/dist/application/workflow/context.d.ts +1 -1
  21. package/dist/application/workflow/define.d.ts +1 -1
  22. package/dist/application/workflow/define.js +1 -1
  23. package/dist/application/workflow/workflow.d.ts +1 -3
  24. package/dist/deployment/adapter/adapter.d.ts +3 -20
  25. package/dist/deployment/adapter/bundle/file.d.ts +1 -1
  26. package/dist/deployment/adapter/define.d.ts +4 -25
  27. package/dist/deployment/adapter/define.js +12 -44
  28. package/dist/deployment/adapter/index.d.ts +0 -2
  29. package/dist/deployment/adapter/release/list.d.ts +1 -2
  30. package/dist/deployment/address/summary.d.ts +3 -7
  31. package/dist/deployment/authoring.d.ts +0 -2
  32. package/dist/deployment/authoring.js +0 -1
  33. package/dist/deployment/build/build.d.ts +6 -0
  34. package/dist/deployment/build/compile.js +2 -0
  35. package/dist/deployment/build/frontend/compilation.d.ts +2 -4
  36. package/dist/deployment/build/frontend/compilation.js +0 -5
  37. package/dist/deployment/build/frontend/digest.js +1 -5
  38. package/dist/deployment/build/material.d.ts +2 -2
  39. package/dist/deployment/build/material.js +28 -13
  40. package/dist/deployment/deployment.d.ts +4 -8
  41. package/dist/deployment/index.d.ts +3 -5
  42. package/dist/deployment/index.js +1 -2
  43. package/dist/deployment/release/addressing.d.ts +2 -9
  44. package/dist/deployment/release/addressing.js +2 -3
  45. package/dist/deployment/release/index.d.ts +0 -2
  46. package/dist/deployment/release/index.js +0 -2
  47. package/dist/deployment/release/release.d.ts +1 -1
  48. package/dist/deployment/release/runtime.d.ts +0 -2
  49. package/dist/deployment/release/runtime.js +0 -2
  50. package/dist/deployment/release/served/index.d.ts +1 -2
  51. package/dist/deployment/release/served/index.js +7 -3
  52. package/dist/deployment/release/served/views.js +0 -1
  53. package/dist/deployment/verify/index.d.ts +2 -4
  54. package/dist/deployment/verify/index.js +1 -3
  55. package/dist/deployment/verify/preflight/index.d.ts +0 -12
  56. package/dist/deployment/verify/preflight/index.js +0 -12
  57. package/dist/deployment/verify/readiness/index.d.ts +2 -6
  58. package/dist/deployment/verify/readiness/index.js +3 -12
  59. package/dist/deployment/worker/response.d.ts +1 -4
  60. package/dist/deployment/worker/response.js +2 -8
  61. package/dist/execution/identity/authentication.d.ts +10 -1
  62. package/dist/execution/identity/authentication.js +21 -0
  63. package/dist/execution/identity/delivery.d.ts +2 -7
  64. package/dist/execution/identity/delivery.js +1 -23
  65. package/dist/execution/identity/identity.d.ts +2 -3
  66. package/dist/execution/identity/identity.js +5 -1
  67. package/dist/execution/index.d.ts +1 -3
  68. package/dist/execution/index.js +1 -2
  69. package/dist/execution/invocation/admission/authentication.d.ts +8 -5
  70. package/dist/execution/invocation/admission/authentication.js +39 -21
  71. package/dist/execution/invocation/admission/authority.d.ts +21 -6
  72. package/dist/execution/invocation/admission/authority.js +6 -4
  73. package/dist/execution/invocation/admission/index.d.ts +2 -2
  74. package/dist/execution/invocation/admission/index.js +1 -1
  75. package/dist/execution/invocation/dependency/bind.d.ts +2 -0
  76. package/dist/execution/invocation/dependency/bind.js +1 -2
  77. package/dist/execution/invocation/dispatch/context.d.ts +5 -5
  78. package/dist/execution/invocation/dispatch/context.js +16 -30
  79. package/dist/execution/invocation/dispatch/workflow.js +0 -4
  80. package/dist/execution/invocation/index.d.ts +2 -2
  81. package/dist/execution/invocation/index.js +1 -1
  82. package/dist/execution/invocation/integration/call.d.ts +2 -1
  83. package/dist/execution/invocation/integration/call.js +1 -1
  84. package/dist/execution/invocation/integration/clients.d.ts +1 -1
  85. package/dist/execution/invocation/invocation.js +3 -12
  86. package/dist/execution/invocation/result/errors.d.ts +0 -10
  87. package/dist/execution/invocation/result/errors.js +0 -17
  88. package/dist/execution/invocation/result/index.d.ts +2 -2
  89. package/dist/execution/invocation/result/index.js +1 -1
  90. package/dist/execution/runtime/release.d.ts +6 -11
  91. package/dist/execution/runtime/release.js +2 -9
  92. package/dist/execution/service/create.js +3 -1
  93. package/dist/execution/service/service.d.ts +2 -3
  94. package/dist/execution/service/serving/delivery.d.ts +1 -2
  95. package/dist/execution/service/serving/delivery.js +1 -2
  96. package/dist/execution/service/serving/source.d.ts +3 -10
  97. package/dist/execution/service/serving/source.js +1 -5
  98. package/dist/execution/workflows/index.d.ts +1 -1
  99. package/dist/execution/workflows/index.js +1 -1
  100. package/dist/execution/workflows/options.d.ts +0 -6
  101. package/dist/execution/workflows/options.js +0 -18
  102. package/dist/execution/workflows/receiver.d.ts +1 -2
  103. package/dist/execution/workflows/receiver.js +13 -20
  104. package/dist/execution/workflows/route.d.ts +1 -3
  105. package/dist/execution/workflows/route.js +4 -9
  106. package/dist/execution/workflows/run.d.ts +1 -1
  107. package/dist/execution/workflows/run.js +1 -1
  108. package/dist/index.d.ts +1 -1
  109. package/dist/index.js +1 -1
  110. package/dist/platform/graph/alias.d.ts +1 -5
  111. package/dist/platform/graph/alias.js +1 -5
  112. package/dist/platform/graph/document/index.d.ts +1 -1
  113. package/dist/platform/graph/document/index.js +1 -1
  114. package/dist/platform/graph/index.d.ts +1 -1
  115. package/dist/platform/graph/index.js +1 -1
  116. package/dist/platform/release/index.d.ts +1 -26
  117. package/dist/platform/release/index.js +1 -26
  118. package/dist/platform/schema/class-icon-svg.d.ts +9 -0
  119. package/dist/platform/schema/class-icon-svg.js +29 -0
  120. package/dist/platform/schema/class-icon.d.ts +3 -8
  121. package/dist/platform/schema/class-icon.js +2 -29
  122. package/dist/platform/schema/index.d.ts +1 -1
  123. package/dist/platform/schema/schema-authoring.d.ts +14 -7
  124. package/dist/platform/schema/schema-authoring.js +5 -1
  125. package/dist/project/admit.js +0 -4
  126. package/dist/project/install-command.d.ts +0 -4
  127. package/dist/project/install-command.js +1 -5
  128. package/dist/tooling/cli/deploy-mode.d.ts +3 -59
  129. package/dist/tooling/cli/deploy-mode.js +46 -122
  130. package/dist/tooling/cli/deploy-result.d.ts +10 -15
  131. package/dist/tooling/cli/help.js +9 -16
  132. package/dist/tooling/cli/immutable-deployment.d.ts +3 -3
  133. package/dist/tooling/cli/index.d.ts +1 -1
  134. package/dist/tooling/cli/list.d.ts +5 -7
  135. package/dist/tooling/cli/list.js +9 -61
  136. package/dist/tooling/cli/orchestrate.js +6 -16
  137. package/dist/tooling/cli/publish/index.d.ts +2 -2
  138. package/dist/tooling/cli/registry/client.js +1 -1
  139. package/dist/tooling/cli/secrets.d.ts +2 -2
  140. package/dist/tooling/linter/implementations/source/global.js +0 -1
  141. package/dist/tooling/linter/implementations/source/verifiers.js +0 -2
  142. package/dist/tooling/linter/policy/generated.js +2 -51
  143. package/dist/tooling/linter/requirements/registry.js +0 -6
  144. package/package.json +9 -8
  145. package/dist/application/query/execution/projection.d.ts +0 -3
  146. package/dist/application/query/execution/projection.js +0 -3
  147. package/dist/deployment/adapter/legacy/adapter.d.ts +0 -40
  148. package/dist/deployment/adapter/legacy/adapter.js +0 -1
  149. package/dist/deployment/adapter/legacy/deploy/context.d.ts +0 -19
  150. package/dist/deployment/adapter/legacy/deploy/context.js +0 -1
  151. package/dist/deployment/adapter/legacy/deploy/index.d.ts +0 -2
  152. package/dist/deployment/adapter/legacy/deploy/index.js +0 -1
  153. package/dist/deployment/adapter/legacy/deploy/result.d.ts +0 -89
  154. package/dist/deployment/adapter/legacy/deploy/result.js +0 -1
  155. package/dist/deployment/adapter/legacy/index.d.ts +0 -24
  156. package/dist/deployment/adapter/legacy/index.js +0 -1
  157. package/dist/deployment/adapter/legacy/prepare/artifact.d.ts +0 -43
  158. package/dist/deployment/adapter/legacy/prepare/artifact.js +0 -1
  159. package/dist/deployment/adapter/legacy/prepare/context.d.ts +0 -33
  160. package/dist/deployment/adapter/legacy/prepare/context.js +0 -1
  161. package/dist/deployment/adapter/legacy/prepare/index.d.ts +0 -2
  162. package/dist/deployment/adapter/legacy/prepare/index.js +0 -1
  163. package/dist/deployment/deploy.d.ts +0 -20
  164. package/dist/deployment/deploy.js +0 -31
  165. package/dist/deployment/release/legacy/admission.d.ts +0 -3
  166. package/dist/deployment/release/legacy/admission.js +0 -8
  167. package/dist/deployment/release/legacy/assemble.d.ts +0 -5
  168. package/dist/deployment/release/legacy/assemble.js +0 -20
  169. package/dist/deployment/release/legacy/index.d.ts +0 -35
  170. package/dist/deployment/release/legacy/index.js +0 -34
  171. package/dist/deployment/release/legacy/release.d.ts +0 -12
  172. package/dist/deployment/release/legacy/release.js +0 -1
  173. package/dist/deployment/release/legacy/seal.d.ts +0 -10
  174. package/dist/deployment/release/legacy/seal.js +0 -17
  175. package/dist/deployment/verify/preflight/artifact.d.ts +0 -6
  176. package/dist/deployment/verify/preflight/artifact.js +0 -122
  177. package/dist/deployment/verify/preflight/publication.d.ts +0 -4
  178. package/dist/deployment/verify/preflight/publication.js +0 -15
  179. package/dist/deployment/verify/readiness/deployment.d.ts +0 -3
  180. package/dist/deployment/verify/readiness/deployment.js +0 -143
  181. package/dist/deployment/verify/readiness/legacy/index.d.ts +0 -2
  182. package/dist/deployment/verify/readiness/legacy/index.js +0 -2
  183. package/dist/deployment/verify/readiness/legacy/publication.d.ts +0 -12
  184. package/dist/deployment/verify/readiness/legacy/publication.js +0 -23
  185. package/dist/execution/service/errors.d.ts +0 -3
  186. package/dist/execution/service/errors.js +0 -3
  187. package/dist/execution/service/serving/legacy/index.d.ts +0 -15
  188. package/dist/execution/service/serving/legacy/index.js +0 -19
  189. package/dist/tooling/cli/deprecations.d.ts +0 -9
  190. package/dist/tooling/cli/deprecations.js +0 -15
  191. package/dist/tooling/cli/legacy/deploy-result.d.ts +0 -28
  192. package/dist/tooling/cli/legacy/deploy-result.js +0 -37
  193. package/dist/tooling/cli/legacy/stable-target-adapter.d.ts +0 -21
  194. package/dist/tooling/cli/legacy/stable-target-adapter.js +0 -14
  195. package/dist/tooling/cli/legacy/stable-target-deploy.d.ts +0 -40
  196. package/dist/tooling/cli/legacy/stable-target-deploy.js +0 -102
  197. package/dist/tooling/cli/legacy/uploaded-build.d.ts +0 -11
  198. package/dist/tooling/cli/legacy/uploaded-build.js +0 -22
  199. package/dist/tooling/linter/implementations/source/migrations.d.ts +0 -2
  200. package/dist/tooling/linter/implementations/source/migrations.js +0 -113
  201. package/dist/tooling/linter/qualification/index.d.ts +0 -10
  202. package/dist/tooling/linter/qualification/index.js +0 -2
  203. package/dist/tooling/linter/qualification/query-fixtures.d.ts +0 -2
  204. package/dist/tooling/linter/qualification/query-fixtures.js +0 -68
  205. package/dist/tooling/linter/qualification/runner.d.ts +0 -3
  206. package/dist/tooling/linter/qualification/runner.js +0 -6
@@ -1,3 +1,3 @@
1
1
  /** Canonical graph documents and local aliases. */
2
2
  export * from '@astrale-os/kernel-core/graph/graph';
3
- export { LocalAlias, isLocalAlias, LocalBinding, isLocalBinding } from '../alias.js';
3
+ export { LocalAlias, isLocalAlias } from '../alias.js';
@@ -1,3 +1,3 @@
1
1
  /** Canonical graph documents and local aliases. */
2
2
  export * from '@astrale-os/kernel-core/graph/graph';
3
- export { LocalAlias, isLocalAlias, LocalBinding, isLocalBinding } from '../alias.js';
3
+ export { LocalAlias, isLocalAlias } from '../alias.js';
@@ -1,6 +1,6 @@
1
1
  /** Curated aggregate over canonical graph values. */
2
2
  export { GraphData, GraphDataDecodeError, GraphSpec, GraphSpecDecodeError, } from '@astrale-os/kernel-core/graph/graph';
3
- export { LocalAlias, isLocalAlias, LocalBinding, isLocalBinding } from './alias.js';
3
+ export { LocalAlias, isLocalAlias } from './alias.js';
4
4
  export type { AnonymousNodeSpec, GraphDataJson, GraphSpecEdge, GraphSpecEndpoint, GraphSpecJson, GraphSpecNode, } from '@astrale-os/kernel-core/graph/graph';
5
5
  export * from './edge/index.js';
6
6
  export * from './node/index.js';
@@ -1,6 +1,6 @@
1
1
  /** Curated aggregate over canonical graph values. */
2
2
  export { GraphData, GraphDataDecodeError, GraphSpec, GraphSpecDecodeError, } from '@astrale-os/kernel-core/graph/graph';
3
- export { LocalAlias, isLocalAlias, LocalBinding, isLocalBinding } from './alias.js';
3
+ export { LocalAlias, isLocalAlias } from './alias.js';
4
4
  export * from './edge/index.js';
5
5
  export * from './node/index.js';
6
6
  export * from './path/index.js';
@@ -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
  /**