@astrale-os/sdk 0.6.0-beta.1 → 0.6.0-beta.11

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 (281) hide show
  1. package/README.md +124 -8
  2. package/dist/application/action/action.d.ts +6 -0
  3. package/dist/application/action/authoring.d.ts +1 -1
  4. package/dist/application/action/context.d.ts +12 -2
  5. package/dist/application/action/define.d.ts +3 -3
  6. package/dist/application/action/index.d.ts +1 -1
  7. package/dist/application/define.d.ts +5 -5
  8. package/dist/application/define.js +13 -13
  9. package/dist/application/dependency/index.d.ts +1 -1
  10. package/dist/application/dependency/invoker.d.ts +9 -4
  11. package/dist/application/domain.d.ts +28 -0
  12. package/dist/application/index.d.ts +3 -3
  13. package/dist/application/index.js +1 -1
  14. package/dist/application/mutation/authoring/properties.d.ts +5 -3
  15. package/dist/application/mutation/authoring/properties.js +35 -2
  16. package/dist/application/mutation/authoring/transition.js +4 -1
  17. package/dist/application/routes/admission.d.ts +2 -2
  18. package/dist/application/routes/admission.js +1 -1
  19. package/dist/application/routes/route.d.ts +2 -2
  20. package/dist/application/runtime/actions.js +3 -0
  21. package/dist/application/runtime/workflows.d.ts +2 -0
  22. package/dist/application/runtime/workflows.js +5 -0
  23. package/dist/application/workflow/authoring.d.ts +3 -2
  24. package/dist/application/workflow/context.d.ts +8 -2
  25. package/dist/application/workflow/define.d.ts +3 -3
  26. package/dist/application/workflow/define.js +19 -3
  27. package/dist/application/workflow/durable.d.ts +83 -0
  28. package/dist/application/workflow/index.d.ts +3 -2
  29. package/dist/application/workflow/runner/inline.js +3 -4
  30. package/dist/application/workflow/runner/runner.d.ts +2 -2
  31. package/dist/application/workflow/step/output.d.ts +2 -0
  32. package/dist/application/workflow/step/output.js +73 -0
  33. package/dist/application/workflow/workflow.d.ts +12 -0
  34. package/dist/deployment/adapter/adapter.d.ts +59 -10
  35. package/dist/deployment/adapter/bundle/bundle.d.ts +36 -0
  36. package/dist/deployment/adapter/bundle/file.d.ts +10 -0
  37. package/dist/deployment/adapter/bundle/index.d.ts +2 -0
  38. package/dist/deployment/adapter/define.d.ts +25 -3
  39. package/dist/deployment/adapter/define.js +101 -24
  40. package/dist/deployment/adapter/index.d.ts +5 -3
  41. package/dist/deployment/adapter/legacy/adapter.d.ts +50 -0
  42. package/dist/deployment/adapter/{deploy → legacy/deploy}/context.d.ts +6 -0
  43. package/dist/deployment/adapter/legacy/deploy/index.d.ts +2 -0
  44. package/dist/deployment/adapter/legacy/deploy/index.js +1 -0
  45. package/dist/deployment/adapter/legacy/deploy/result.d.ts +90 -0
  46. package/dist/deployment/adapter/legacy/deploy/result.js +1 -0
  47. package/dist/deployment/adapter/legacy/index.d.ts +24 -0
  48. package/dist/deployment/adapter/legacy/index.js +1 -0
  49. package/dist/deployment/adapter/legacy/prepare/artifact.d.ts +43 -0
  50. package/dist/deployment/adapter/legacy/prepare/artifact.js +1 -0
  51. package/dist/deployment/adapter/legacy/prepare/context.d.ts +36 -0
  52. package/dist/deployment/adapter/legacy/prepare/context.js +1 -0
  53. package/dist/deployment/adapter/legacy/prepare/index.d.ts +2 -0
  54. package/dist/deployment/adapter/legacy/prepare/index.js +1 -0
  55. package/dist/deployment/adapter/release/context.d.ts +75 -0
  56. package/dist/deployment/adapter/release/context.js +1 -0
  57. package/dist/deployment/adapter/release/index.d.ts +2 -0
  58. package/dist/deployment/adapter/release/index.js +1 -0
  59. package/dist/deployment/adapter/release/result.d.ts +56 -0
  60. package/dist/deployment/adapter/release/result.js +1 -0
  61. package/dist/deployment/address/configuration.d.ts +83 -0
  62. package/dist/deployment/address/configuration.js +262 -0
  63. package/dist/deployment/address/fingerprint.d.ts +5 -0
  64. package/dist/deployment/address/fingerprint.js +27 -0
  65. package/dist/deployment/address/index.d.ts +5 -0
  66. package/dist/deployment/address/index.js +4 -0
  67. package/dist/deployment/address/label.d.ts +42 -0
  68. package/dist/deployment/address/label.js +80 -0
  69. package/dist/deployment/address/line.d.ts +29 -0
  70. package/dist/deployment/address/line.js +53 -0
  71. package/dist/deployment/address/record.d.ts +52 -0
  72. package/dist/deployment/address/record.js +104 -0
  73. package/dist/deployment/address/summary.d.ts +26 -0
  74. package/dist/deployment/address/summary.js +1 -0
  75. package/dist/deployment/address/vectors.d.ts +60 -0
  76. package/dist/deployment/address/vectors.js +517 -0
  77. package/dist/deployment/build/build.d.ts +2 -2
  78. package/dist/deployment/build/compile.d.ts +4 -4
  79. package/dist/deployment/build/compile.js +17 -17
  80. package/dist/deployment/build/index.d.ts +1 -0
  81. package/dist/deployment/build/index.js +1 -0
  82. package/dist/deployment/build/manifest.d.ts +54 -0
  83. package/dist/deployment/build/manifest.js +108 -0
  84. package/dist/deployment/build/material.js +2 -2
  85. package/dist/deployment/build/schema.d.ts +2 -2
  86. package/dist/deployment/deploy.d.ts +10 -10
  87. package/dist/deployment/deploy.js +3 -3
  88. package/dist/deployment/deployment.d.ts +9 -4
  89. package/dist/deployment/environment.d.ts +6 -0
  90. package/dist/deployment/environment.js +6 -0
  91. package/dist/deployment/index.d.ts +4 -4
  92. package/dist/deployment/index.js +1 -1
  93. package/dist/deployment/release/addressing.d.ts +9 -1
  94. package/dist/deployment/release/assemble.d.ts +6 -3
  95. package/dist/deployment/release/assemble.js +12 -10
  96. package/dist/deployment/release/index.d.ts +2 -0
  97. package/dist/deployment/release/index.js +2 -0
  98. package/dist/deployment/release/legacy/admission.d.ts +3 -0
  99. package/dist/deployment/release/legacy/admission.js +8 -0
  100. package/dist/deployment/release/legacy/assemble.d.ts +5 -0
  101. package/dist/deployment/release/legacy/assemble.js +20 -0
  102. package/dist/deployment/release/legacy/index.d.ts +30 -0
  103. package/dist/deployment/release/legacy/index.js +29 -0
  104. package/dist/deployment/release/legacy/release.d.ts +12 -0
  105. package/dist/deployment/release/legacy/release.js +1 -0
  106. package/dist/deployment/release/{publication → legacy}/seal.d.ts +3 -3
  107. package/dist/deployment/release/legacy/seal.js +17 -0
  108. package/dist/deployment/release/release.d.ts +16 -5
  109. package/dist/deployment/release/runtime.d.ts +2 -0
  110. package/dist/deployment/release/runtime.js +2 -0
  111. package/dist/deployment/release/seal.d.ts +14 -0
  112. package/dist/deployment/release/seal.js +22 -0
  113. package/dist/deployment/release/{publication → served}/callables.d.ts +2 -2
  114. package/dist/deployment/release/{publication → served}/callables.js +2 -2
  115. package/dist/deployment/release/served/index.d.ts +12 -0
  116. package/dist/deployment/release/served/index.js +22 -0
  117. package/dist/deployment/release/{publication → served}/views.d.ts +2 -2
  118. package/dist/deployment/runtime/admission.d.ts +2 -2
  119. package/dist/deployment/runtime/admission.js +5 -5
  120. package/dist/deployment/verify/index.d.ts +2 -1
  121. package/dist/deployment/verify/index.js +1 -0
  122. package/dist/deployment/verify/preflight/artifact.d.ts +1 -1
  123. package/dist/deployment/verify/preflight/bundle.d.ts +18 -0
  124. package/dist/deployment/verify/preflight/bundle.js +71 -0
  125. package/dist/deployment/verify/preflight/index.d.ts +2 -1
  126. package/dist/deployment/verify/preflight/index.js +1 -0
  127. package/dist/deployment/verify/preflight/publication.d.ts +2 -2
  128. package/dist/deployment/verify/preflight/publication.js +4 -3
  129. package/dist/deployment/verify/readiness/deployment.js +4 -2
  130. package/dist/deployment/verify/readiness/index.d.ts +1 -1
  131. package/dist/deployment/verify/readiness/publication.d.ts +2 -2
  132. package/dist/deployment/verify/readiness/publication.js +1 -1
  133. package/dist/execution/identity/authentication.d.ts +9 -0
  134. package/dist/execution/identity/authentication.js +41 -34
  135. package/dist/execution/identity/callback.d.ts +12 -4
  136. package/dist/execution/identity/callback.js +9 -4
  137. package/dist/execution/identity/delivery.d.ts +1 -1
  138. package/dist/execution/identity/delivery.js +1 -1
  139. package/dist/execution/identity/identity.d.ts +10 -1
  140. package/dist/execution/identity/identity.js +6 -2
  141. package/dist/execution/index.d.ts +4 -2
  142. package/dist/execution/index.js +2 -1
  143. package/dist/execution/invocation/admission/authentication.d.ts +1 -1
  144. package/dist/execution/invocation/admission/authority.d.ts +5 -4
  145. package/dist/execution/invocation/admission/authority.js +1 -0
  146. package/dist/execution/invocation/admission/input.d.ts +2 -2
  147. package/dist/execution/invocation/admission/input.js +16 -2
  148. package/dist/execution/invocation/dependency/bind.js +35 -13
  149. package/dist/execution/invocation/dispatch/context.d.ts +2 -1
  150. package/dist/execution/invocation/dispatch/context.js +1 -0
  151. package/dist/execution/invocation/invocation.js +8 -3
  152. package/dist/execution/node/serve.d.ts +2 -2
  153. package/dist/execution/node/serve.js +1 -1
  154. package/dist/execution/runtime/load.d.ts +1 -1
  155. package/dist/execution/runtime/load.js +1 -1
  156. package/dist/execution/serve.d.ts +8 -2
  157. package/dist/execution/serve.js +3 -0
  158. package/dist/execution/service/create.js +30 -0
  159. package/dist/execution/service/initialization.d.ts +4 -4
  160. package/dist/execution/service/initialization.js +23 -14
  161. package/dist/execution/service/publication/installation.d.ts +1 -1
  162. package/dist/execution/service/release.d.ts +1 -1
  163. package/dist/execution/service/release.js +1 -1
  164. package/dist/execution/service/service.d.ts +7 -1
  165. package/dist/execution/workflows/discovery.d.ts +14 -0
  166. package/dist/execution/workflows/discovery.js +151 -0
  167. package/dist/execution/workflows/engine.d.ts +52 -0
  168. package/dist/execution/workflows/engine.js +1 -0
  169. package/dist/execution/workflows/envelope.d.ts +12 -0
  170. package/dist/execution/workflows/envelope.js +46 -0
  171. package/dist/execution/workflows/failure.d.ts +11 -0
  172. package/dist/execution/workflows/failure.js +43 -0
  173. package/dist/execution/workflows/index.d.ts +4 -0
  174. package/dist/execution/workflows/index.js +3 -0
  175. package/dist/execution/workflows/options.d.ts +40 -0
  176. package/dist/execution/workflows/options.js +83 -0
  177. package/dist/execution/workflows/receiver.d.ts +22 -0
  178. package/dist/execution/workflows/receiver.js +99 -0
  179. package/dist/execution/workflows/route.d.ts +14 -0
  180. package/dist/execution/workflows/route.js +40 -0
  181. package/dist/execution/workflows/run.d.ts +22 -0
  182. package/dist/execution/workflows/run.js +211 -0
  183. package/dist/index.d.ts +3 -3
  184. package/dist/index.js +1 -1
  185. package/dist/platform/release/index.d.ts +27 -0
  186. package/dist/platform/release/index.js +27 -0
  187. package/dist/platform/schema/index.d.ts +2 -1
  188. package/dist/platform/schema/property-input.d.ts +15 -0
  189. package/dist/platform/schema/property-input.js +1 -0
  190. package/dist/platform/versioning/dependents.d.ts +18 -0
  191. package/dist/platform/versioning/dependents.js +15 -0
  192. package/dist/platform/versioning/index.d.ts +5 -0
  193. package/dist/platform/versioning/index.js +5 -0
  194. package/dist/platform/versioning/name.d.ts +37 -0
  195. package/dist/platform/versioning/name.js +57 -0
  196. package/dist/platform/versioning/reference.d.ts +48 -0
  197. package/dist/platform/versioning/reference.js +95 -0
  198. package/dist/platform/versioning/version.d.ts +72 -0
  199. package/dist/platform/versioning/version.js +98 -0
  200. package/dist/project/admit.js +2 -2
  201. package/dist/project/define.d.ts +4 -4
  202. package/dist/project/define.js +10 -7
  203. package/dist/project/index.d.ts +1 -1
  204. package/dist/project/project.d.ts +6 -6
  205. package/dist/testing/dataset/builder.d.ts +3 -3
  206. package/dist/testing/dataset/define.d.ts +1 -1
  207. package/dist/testing/load.js +1 -1
  208. package/dist/tooling/cli/arguments.d.ts +1 -0
  209. package/dist/tooling/cli/arguments.js +7 -2
  210. package/dist/tooling/cli/build.d.ts +55 -0
  211. package/dist/tooling/cli/build.js +77 -0
  212. package/dist/tooling/cli/deploy-mode.d.ts +67 -0
  213. package/dist/tooling/cli/deploy-mode.js +124 -0
  214. package/dist/tooling/cli/deploy-result.d.ts +82 -0
  215. package/dist/tooling/cli/deploy-result.js +63 -0
  216. package/dist/tooling/cli/development/candidate.d.ts +3 -2
  217. package/dist/tooling/cli/development/candidate.js +5 -4
  218. package/dist/tooling/cli/development/report.d.ts +5 -2
  219. package/dist/tooling/cli/development/view.d.ts +1 -1
  220. package/dist/tooling/cli/environment-release.d.ts +5 -2
  221. package/dist/tooling/cli/evidence.d.ts +5 -2
  222. package/dist/tooling/cli/help.js +20 -10
  223. package/dist/tooling/cli/index.d.ts +2 -0
  224. package/dist/tooling/cli/installation/reconcile.d.ts +1 -1
  225. package/dist/tooling/cli/legacy/deploy-result.d.ts +26 -0
  226. package/dist/tooling/cli/legacy/deploy-result.js +35 -0
  227. package/dist/tooling/cli/legacy/stable-target-adapter.d.ts +19 -0
  228. package/dist/tooling/cli/legacy/stable-target-adapter.js +14 -0
  229. package/dist/tooling/cli/legacy/uploaded-build.d.ts +11 -0
  230. package/dist/tooling/cli/legacy/uploaded-build.js +22 -0
  231. package/dist/tooling/cli/log.d.ts +5 -0
  232. package/dist/tooling/cli/log.js +9 -0
  233. package/dist/tooling/cli/orchestrate.js +75 -15
  234. package/dist/tooling/cli/project.d.ts +3 -3
  235. package/dist/tooling/linter/adapters/typescript/discover.d.ts +2 -2
  236. package/dist/tooling/linter/adapters/typescript/discover.js +11 -7
  237. package/dist/tooling/linter/implementations/source/callable-requirements.d.ts +1 -1
  238. package/dist/tooling/linter/implementations/source/callable-requirements.js +10 -10
  239. package/dist/tooling/linter/implementations/source/dependencies.js +4 -4
  240. package/dist/tooling/linter/implementations/source/global.js +2 -2
  241. package/dist/tooling/linter/implementations/source/mutations.js +17 -17
  242. package/dist/tooling/linter/implementations/source/providers.js +5 -5
  243. package/dist/tooling/linter/implementations/source/views.js +2 -2
  244. package/dist/tooling/linter/lint.js +5 -4
  245. package/dist/tooling/linter/oxlint/run.d.ts +1 -1
  246. package/dist/tooling/linter/oxlint/run.js +5 -1
  247. package/dist/tooling/linter/policy/configuration.d.ts +3 -0
  248. package/dist/tooling/linter/policy/configuration.js +3 -1
  249. package/dist/tooling/linter/policy/generated.js +16 -16
  250. package/dist/tooling/linter/policy/ignore.d.ts +11 -0
  251. package/dist/tooling/linter/policy/ignore.js +101 -0
  252. package/dist/tooling/linter/policy/index.d.ts +1 -0
  253. package/dist/tooling/packaging/declarations/ownership.js +1 -1
  254. package/dist/tooling/packaging/finalize.d.ts +1 -1
  255. package/dist/tooling/packaging/finalize.js +1 -1
  256. package/package.json +31 -10
  257. package/dist/application/application.d.ts +0 -28
  258. package/dist/deployment/adapter/deploy/index.d.ts +0 -2
  259. package/dist/deployment/adapter/deploy/result.d.ts +0 -50
  260. package/dist/deployment/adapter/prepare/artifact.d.ts +0 -33
  261. package/dist/deployment/adapter/prepare/context.d.ts +0 -23
  262. package/dist/deployment/adapter/prepare/index.d.ts +0 -2
  263. package/dist/deployment/release/publication/index.d.ts +0 -6
  264. package/dist/deployment/release/publication/index.js +0 -6
  265. package/dist/deployment/release/publication/manifest.d.ts +0 -3
  266. package/dist/deployment/release/publication/manifest.js +0 -5
  267. package/dist/deployment/release/publication/requirements.d.ts +0 -3
  268. package/dist/deployment/release/publication/requirements.js +0 -3
  269. package/dist/deployment/release/publication/seal.js +0 -39
  270. package/dist/platform/publication/index.d.ts +0 -2
  271. package/dist/platform/publication/index.js +0 -2
  272. /package/dist/application/{application.js → domain.js} +0 -0
  273. /package/dist/{deployment/adapter/deploy/context.js → application/workflow/durable.js} +0 -0
  274. /package/dist/deployment/adapter/{deploy/index.js → bundle/bundle.js} +0 -0
  275. /package/dist/deployment/adapter/{deploy/result.js → bundle/file.js} +0 -0
  276. /package/dist/deployment/adapter/{prepare → bundle}/index.js +0 -0
  277. /package/dist/deployment/adapter/{prepare/artifact.js → legacy/adapter.js} +0 -0
  278. /package/dist/deployment/adapter/{prepare → legacy/deploy}/context.js +0 -0
  279. /package/dist/deployment/release/{publication → served}/routes.d.ts +0 -0
  280. /package/dist/deployment/release/{publication → served}/routes.js +0 -0
  281. /package/dist/deployment/release/{publication → served}/views.js +0 -0
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # SDK
2
2
 
3
- Schema-first SDK for authoring and deploying Astrale Applications. The public surface separates
3
+ Schema-first SDK for authoring and deploying Astrale Domains. The public surface separates
4
4
  single-step Actions, explicit multi-step Workflows, provider-neutral Integrations, concrete Providers, graph
5
- authoring, Application composition, Deployment, and Execution without exposing DSL callable
5
+ authoring, Domain composition, Deployment, and Execution without exposing DSL callable
6
6
  topology in implementation files.
7
7
 
8
8
  [![CI](https://github.com/astrale-os/sdk/actions/workflows/ci.yml/badge.svg)](https://github.com/astrale-os/sdk/actions/workflows/ci.yml)
@@ -17,7 +17,7 @@ npm install @astrale-os/sdk
17
17
  ```
18
18
 
19
19
  Zod schemas cross the SDK and Kernel compiler boundary by runtime identity. The SDK therefore
20
- declares one exact, non-optional Zod peer. If an Application declares Zod directly, it must use the
20
+ declares one exact, non-optional Zod peer. If a Domain declares Zod directly, it must use the
21
21
  same exact version rather than a range; a second physical Zod runtime is not an admitted authoring
22
22
  environment.
23
23
 
@@ -67,9 +67,10 @@ original issuer discovery endpoints and keys available; unadopted instances cont
67
67
  previous bindings. Deployment readiness checks the exact new Worker version separately from issuer
68
68
  discovery. No uninstall or identity rotation is involved.
69
69
 
70
- At the provider-neutral release boundary, use
71
- `addressing('https://services.example.com', { publicUrl: 'https://services-v2.example.com' })`.
72
- The one-argument form continues to use the issuer as the public URL.
70
+ At the provider-neutral release boundary, this stable-target path uses
71
+ `addressing('https://services.example.com', { publicUrl: 'https://services-v2.example.com' })` with
72
+ `legacy.assemble`. That split is deprecated with direct mode and goes with it: an immutable
73
+ deployment's URL is its issuer, so `assemble(build, buildDigest, url)` takes the URL alone.
73
74
 
74
75
  ## Handler authority and dependencies
75
76
 
@@ -78,6 +79,13 @@ Authenticated handlers use Domain self authority for `kernel`, `graph`, `query`,
78
79
  with the incoming caller Grant. Explicit authority remains on `kernel` and `graph`; the former
79
80
  handler `client` is removed. See [the API and migration guide](docs/handler-dependencies.md).
80
81
 
82
+ ## Durable Workflows
83
+
84
+ A callable declared with `execution: { durable: true }` is implemented by `defineWorkflow` and runs
85
+ on the Kernel's workflow engine: a call returns its `K.Execution` at once, and the run survives
86
+ restarts with journaled Steps, durable timers and signals. Serve it with `serve({ durable })`. See
87
+ [the durable Workflow guide](docs/durable-workflows.md).
88
+
81
89
  ## Node Class icons
82
90
 
83
91
  Every Node Class authored through the SDK must explicitly declare a self-contained SVG icon.
@@ -128,7 +136,7 @@ Error declarations are not yet published in the installed Kernel Schema.
128
136
  ### Core Identity requirements
129
137
 
130
138
  Use `requirements({ core: [{ subject, functions, classes, authority }] })` to declare capabilities
131
- for an Identity in the Application's local Core. `subject` is the resolved Core Node; each entry
139
+ for an Identity in the Domain's local Core. `subject` is the resolved Core Node; each entry
132
140
  must request at least one capability. The top-level `functions`, `classes`, and `authority` members
133
141
  describe capabilities for the Domain principal.
134
142
 
@@ -213,6 +221,21 @@ Disabled rules are skipped before evaluation and remain visible in lint coverage
213
221
  project rule disable does not bypass generic Oxlint, project admission, type-universe checks, or
214
222
  linter tool failures.
215
223
 
224
+ A committed tree that is not Domain source, such as client mockups or a preview harness, can be
225
+ excluded from `astrale-domain lint` with root-relative globs:
226
+
227
+ ```json
228
+ {
229
+ "ignore": ["mockups/**", "prototypes/**"]
230
+ }
231
+ ```
232
+
233
+ Ignored paths are pruned before discovery: they are never read, parsed, counted against source
234
+ limits, included in the source snapshot digest, or passed to generic Oxlint. Each glob starts with a
235
+ literal root entry and may use `*` and `?` within a segment and `**` as a whole segment; a matched
236
+ directory excludes everything below it. A glob that would cover a declared layer (including a
237
+ remapped `sourcePath`) or a governed root file is rejected, so `ignore` cannot bypass the layout.
238
+
216
239
  Structured review [issues](issues/README.md) retain observation-first evidence and later governance
217
240
  attachments without becoming current contract authority.
218
241
 
@@ -246,6 +269,96 @@ URL, size, and ETag checks. Concurrent publication and snapshot observations sha
246
269
  cancelling one observer does not cancel another. `session.snapshot()` remains the complete,
247
270
  coherent Publication, bundle, and View catalog observation.
248
271
 
272
+ ## Headless scripts and Domain callables
273
+
274
+ Function admission requires the principal itself to be able to use the Function. A credential
275
+ minted for a user or key, such as `astrale token`, carries that identity as principal: it passes
276
+ Kernel callables, but a Domain callable that the identity reaches only through a Policy fails with
277
+ `2004`. The Session `exchange` option presents each Domain callable with a credential its declaring
278
+ Domain exchanged for the caller instead. The Domain becomes the principal, and the Policy is still
279
+ evaluated against the caller. Kernel callables, including graph reads and writes, keep the source
280
+ credential.
281
+
282
+ ```ts
283
+ import { connect, createSessionCredentialProvider } from '@astrale-os/sdk/client/session'
284
+
285
+ const session = connect({
286
+ url: 'https://instance.example/api',
287
+ auth: createSessionCredentialProvider({
288
+ ttlSeconds: 60,
289
+ // Return { credential, expiresAt } with expiresAt in Unix milliseconds.
290
+ mint: (signal) => mintSourceCredential(signal),
291
+ }),
292
+ exchange: {},
293
+ })
294
+
295
+ await session.call({ target: '/:orders.example:class.Order:create', input }) // Domain callable
296
+ await session.graph.get('@order-id') // Kernel callable: the source credential
297
+ ```
298
+
299
+ - **Hold the source in a provider.** Domain credentials are cached per source credential, so a
300
+ `resolve` that returns a new token on every call also exchanges on every call. The provider also
301
+ lets the Session renew a source that is too close to expiry to feed a Domain credential.
302
+ - **Lifetimes.** `exchange.ttlSeconds` (default 300) must exceed the provider's `ttlSeconds` plus a
303
+ 5-second settlement skew. A Domain credential never outlives its source.
304
+ - **Reading as a Domain.** To call Kernel callables as a Domain, for example to read Shell-owned
305
+ Classes, feed a second Session from an explicit exchange:
306
+ `createSessionCredentialProvider({ ttlSeconds: 60, mint: (signal) => session.exchange(shellIssuer, { signal }) })`.
307
+ `session.exchange(issuer)` caches nothing.
308
+ - **Current identity.** Use `session.auth.whoami()`; `@self` is a CLI shorthand.
309
+ - **Failures.** A failed exchange raises `ExchangeError` from `@astrale-os/sdk/client`. Its
310
+ `failure` names the reason (`discovery`, `unsupported`, `unavailable`, `rejected`,
311
+ `invalid-response` or `source-exhausted`); a `rejected` error carries the Domain's public error
312
+ as its cause. Branch on `failure`, not on the message.
313
+
314
+ | Credential presented | Principal | Kernel callable | Domain callable reached by Policy |
315
+ | --- | --- | --- | --- |
316
+ | Source credential (minted or key) | the identity | ✅ | ❌ `2004`, unless the identity holds `can_use` on it through a Group |
317
+ | Session with `exchange` | the declaring Domain, for Domain callables | ✅ with the source credential | ✅ Policy evaluated against the identity |
318
+ | `session.exchange(issuer)` held by a second Session | that Domain | ✅ as that Domain | only what that Domain may use |
319
+
320
+ ## Deployment addresses
321
+
322
+ `@astrale-os/sdk/deployment/address` derives the one immutable URL of a deployment,
323
+ `https://<line>-<content>.<routingDomain>`, from its inputs alone. Whoever deploys and whoever
324
+ hosts compute it with the same pure, runtime-safe functions, so a host can refuse an address it
325
+ did not derive.
326
+
327
+ - **Line.** `deploymentLine({ origin, environment, addressing })` is shared by every deployment of
328
+ an origin in an environment. Its 16-character fingerprint, the first 80 bits of
329
+ `sha256(origin ‖ 0x00 ‖ environment)` in base32, makes it unique. A `readable` line (platform
330
+ Domains) prefixes it with a cosmetic part, so `agencies.example.com` in `staging` gives
331
+ `agencies-staging-354iwg4avm6wdmrs`. An `opaque` line (tenant Domains) is the fingerprint alone.
332
+ - **Content.** `deploymentContent(buildDigest, configuration)` covers the build and the
333
+ `FrozenConfigurationV1`: the plain variables and execution settings (with the durable Workflow
334
+ options, when declared), the services and dispatch namespaces it binds, and the names of the
335
+ bound secrets, never their values. A changed variable or binding gives another URL, and a rotated
336
+ secret keeps the URL. `configurationDigest` gives the full digest that a deployment record keeps. It checks
337
+ canonical form only: the host refuses settings no Worker runs under when it encodes
338
+ `ASTRALE_SETTINGS` (`encodeWorkerSettings`), before it uploads anything.
339
+ - **Label.** `deploymentLabel(line, content)` is at most 57 characters. `DEPLOYMENT_LABEL`
340
+ recognizes it, never a legacy UUID or stable Worker name, and `parseDeploymentLabel` splits it
341
+ and refuses anything longer than 57 characters.
342
+ - **Record.** `acceptDeploymentRecord` admits a `DeploymentRecordV1` only when its provider
343
+ script is the label that its own fields derive. A host admits the record a deploy declares with
344
+ it before storing it, so every stored record decodes.
345
+
346
+ ```ts
347
+ import {
348
+ deploymentContent,
349
+ deploymentLabel,
350
+ deploymentLine,
351
+ deploymentUrl,
352
+ } from '@astrale-os/sdk/deployment/address'
353
+
354
+ const line = deploymentLine({ origin, environment, addressing: 'opaque' })
355
+ const url = deploymentUrl(deploymentLabel(line, deploymentContent(build, configuration)), routingDomain)
356
+ ```
357
+
358
+ `@astrale-os/sdk/deployment/address/vectors` holds the conformance vectors: Worker uploads and
359
+ configurations with the manifest, build digest, label and URL each one gives. Every host that
360
+ recomputes an address tests against them.
361
+
249
362
  ## License
250
363
 
251
364
  Apache License 2.0 — see [LICENSE](LICENSE) for details.
@@ -268,10 +381,13 @@ routes: {
268
381
  ```
269
382
 
270
383
  These requirements are publication metadata, so changing them updates the publication ETag without
271
- changing the Application's business Schema. They require the `shell` handshake. Origins must use
384
+ changing the Domain's business Schema. They require the `shell` handshake. Origins must use
272
385
  HTTPS without credentials, paths, queries, fragments, or wildcards; authoring normalizes and sorts
273
386
  them. Supporting hosts admit them per mount and execute the existing `browser.openExternal`
274
387
  intent. Nested Views cannot expand their parent's grant.
275
388
 
276
389
  For the unified authentication facade and coordinated consumer update, see
277
390
  [the Auth API migration guide](docs/auth-api-migration.md).
391
+
392
+ The authored composition formerly called an Application is now a Domain definition: see
393
+ [the Domain definition migration guide](docs/domain-definition-migration.md).
@@ -29,6 +29,12 @@ export type ActionAddressOf<Callable> = Callable extends {
29
29
  export type ResolvedDomainOf<Schema extends schema.DomainSchema> = Extract<schema.DomainOf<Schema>, Domain>;
30
30
  /** SDK Action address derived mechanically from the canonical local callable key. */
31
31
  export type ActionAddress<Schema extends schema.DomainSchema> = ActionAddressOf<LocalCallable<ResolvedDomainOf<Schema>>>;
32
+ /** Address of a callable an Action may implement: a durable callable needs a Workflow. */
33
+ export type ImmediateActionAddress<Schema extends schema.DomainSchema> = ActionAddressOf<Exclude<LocalCallable<ResolvedDomainOf<Schema>>, {
34
+ readonly execution: {
35
+ readonly durable: true;
36
+ };
37
+ }>>;
32
38
  export type CallableAtAddress<Schema extends schema.DomainSchema, Address extends string> = LocalCallable<ResolvedDomainOf<Schema>> extends infer Callable ? Callable extends unknown ? ActionAddressOf<Callable> extends Address ? Callable : never : never : never;
33
39
  export type Action<Callable extends ResolvedCallable, Definitions extends Integrations = Readonly<Record<never, never>>, DomainValue extends Domain = Domain, Errors extends DeclaredErrors = NoDeclaredErrors> = (context: ActionContext<Callable, DomainValue, Definitions, Errors>) => Promise<ActionOutputOf<Callable>>;
34
40
  declare const ACTION_SCHEMA: unique symbol;
@@ -1,5 +1,5 @@
1
1
  export { defineAction } from './define.js';
2
2
  export type { Action, ActionDefinition } from './action.js';
3
- export type { ActionContext, ActionExecution, Caller, DomainGraphExecutor, DomainGraphExecutors, DomainKernelSessions, } from './context.js';
3
+ export type { ActionContext, ActionBinaryInput, ActionExecution, Caller, DomainGraphExecutor, DomainGraphExecutors, DomainKernelSessions, } from './context.js';
4
4
  export type { ActionBinary, ActionOutputOf } from './output.js';
5
5
  export type { DeclaredErrorDefinition, DeclaredErrorFactory, DeclaredErrorFamily, DeclaredErrorOptions, DeclaredErrors, } from '../error/index.js';
@@ -1,7 +1,7 @@
1
1
  import type { AuthenticationEvidence, Grant, IdentityId } from '../../platform/auth/index.js';
2
2
  import type { BoundClientSession } from '../../platform/client/session/index.js';
3
3
  import type { NodeId } from '../../platform/graph/node/index.js';
4
- import type { CallableInputOf, Domain, ResolvedFunction, ResolvedMethod } from '../../platform/schema/index.js';
4
+ import type { CallableInputOf, CallableInputModeOf, Domain, ResolvedFunction, ResolvedMethod } from '../../platform/schema/index.js';
5
5
  import type { HandlerDependencies } from '../dependency/index.js';
6
6
  import type { DeclaredErrorFactory, DeclaredErrors, NoDeclaredErrors } from '../error/index.js';
7
7
  import type { IntegrationClients, Integrations } from '../integration/index.js';
@@ -34,6 +34,16 @@ export interface ActionExecution {
34
34
  body(): Uint8Array;
35
35
  };
36
36
  }
37
+ /** One admitted, single-consumer binary Function request body. */
38
+ export interface ActionBinaryInput {
39
+ readonly body: ReadableStream<Uint8Array>;
40
+ readonly length: number;
41
+ }
42
+ type BinaryInputOf<Callable> = CallableInputModeOf<Callable> extends 'binary' ? {
43
+ readonly body: ActionBinaryInput;
44
+ } : {
45
+ readonly body?: never;
46
+ };
37
47
  export interface DomainGraphExecutor<DomainValue extends Domain = Domain> {
38
48
  readonly query: QueryExecutor<DomainValue>;
39
49
  readonly mutate: MutationExecutor<DomainValue>;
@@ -83,5 +93,5 @@ export type ActionContext<Callable extends ResolvedCallable, DomainValue extends
83
93
  readonly execution: ActionExecution;
84
94
  /** Construct one implementation-declared safe business error for `throw error(...)`. */
85
95
  readonly error: DeclaredErrorFactory<Errors>;
86
- } & AuthorityOf<Callable, DomainValue> & SelfOf<Callable>;
96
+ } & AuthorityOf<Callable, DomainValue> & SelfOf<Callable> & BinaryInputOf<Callable>;
87
97
  export {};
@@ -1,12 +1,12 @@
1
1
  import type { schema } from '../../platform/schema/index.js';
2
2
  import type { DeclaredErrorOptions, DeclaredErrors, NoDeclaredErrors } from '../error/index.js';
3
3
  import type { Integrations } from '../integration/index.js';
4
- import type { Action, ActionAddress, ActionDefinition, CallableAtAddress, ResolvedDomainOf } from './action.js';
4
+ import type { Action, ActionDefinition, CallableAtAddress, ImmediateActionAddress, ResolvedDomainOf } from './action.js';
5
5
  import type { ResolvedCallable } from './context.js';
6
6
  /** Define one simple single-step implementation by its SDK Action address. */
7
7
  export declare function defineAction<Schema extends schema.DomainSchema, Definitions extends Integrations = Readonly<Record<never, never>>>(): {
8
- <const Address extends ActionAddress<Schema>>(address: Address, run: Action<Extract<CallableAtAddress<Schema, Address>, ResolvedCallable>, Definitions, ResolvedDomainOf<Schema>, NoDeclaredErrors>): ActionDefinition<Schema, Address, Definitions, NoDeclaredErrors>;
9
- <const Address extends ActionAddress<Schema>, const Errors extends DeclaredErrors>(address: Address, options: DeclaredErrorOptions<Errors>, run: Action<Extract<CallableAtAddress<Schema, Address>, ResolvedCallable>, Definitions, ResolvedDomainOf<Schema>, Errors>): ActionDefinition<Schema, Address, Definitions, Errors>;
8
+ <const Address extends ImmediateActionAddress<Schema>>(address: Address, run: Action<Extract<CallableAtAddress<Schema, Address>, ResolvedCallable>, Definitions, ResolvedDomainOf<Schema>, NoDeclaredErrors>): ActionDefinition<Schema, Address, Definitions, NoDeclaredErrors>;
9
+ <const Address extends ImmediateActionAddress<Schema>, const Errors extends DeclaredErrors>(address: Address, options: DeclaredErrorOptions<Errors>, run: Action<Extract<CallableAtAddress<Schema, Address>, ResolvedCallable>, Definitions, ResolvedDomainOf<Schema>, Errors>): ActionDefinition<Schema, Address, Definitions, Errors>;
10
10
  };
11
11
  /** True only for an Action produced by defineAction in this SDK package root. */
12
12
  export declare function isAction(input: unknown): input is ActionDefinition;
@@ -1,5 +1,5 @@
1
1
  export { defineAction, isAction } from './define.js';
2
2
  export type { Action, ActionAddress, ActionAddressOf, ActionDefinition, CallableAtAddress, LocalCallable, ResolvedDomainOf, } from './action.js';
3
- export type { ActionContext, ActionExecution, AnonymousCaller, AuthenticatedCaller, Caller, DomainGraphExecutor, DomainGraphExecutors, DomainKernelSessions, ResolvedCallable, } from './context.js';
3
+ export type { ActionContext, ActionBinaryInput, ActionExecution, AnonymousCaller, AuthenticatedCaller, Caller, DomainGraphExecutor, DomainGraphExecutors, DomainKernelSessions, ResolvedCallable, } from './context.js';
4
4
  export type { ActionBinary, ActionOutputOf } from './output.js';
5
5
  export type { DeclaredErrorDefinition, DeclaredErrorFactory, DeclaredErrorFamily, DeclaredErrorOptions, DeclaredErrors, } from '../error/index.js';
@@ -1,16 +1,16 @@
1
1
  import type { schema } from '../platform/schema/index.js';
2
- import type { Application } from './application.js';
2
+ import type { DomainDefinition } from './domain.js';
3
3
  import type { Requirements } from './requirements/index.js';
4
4
  import type { Routes } from './routes/index.js';
5
5
  import type { Runtime } from './runtime/index.js';
6
6
  import type { Frontend } from './view/index.js';
7
- export interface ApplicationInput<Schema extends schema.DomainSchema, RuntimeValue extends Runtime<Schema>, FrontendValue extends Frontend<Schema> | undefined, RoutesValue extends Routes | undefined, RequirementsValue extends Requirements | undefined> {
7
+ export interface DomainDefinitionInput<Schema extends schema.DomainSchema, RuntimeValue extends Runtime<Schema>, FrontendValue extends Frontend<Schema> | undefined, RoutesValue extends Routes | undefined, RequirementsValue extends Requirements | undefined> {
8
8
  readonly schema: Schema;
9
9
  readonly runtime: RuntimeValue;
10
10
  readonly frontend?: FrontendValue;
11
11
  readonly routes?: RoutesValue;
12
12
  readonly requirements?: RequirementsValue;
13
13
  }
14
- /** Capture one inert authored Application without resolving, compiling, loading, or deploying it. */
15
- export declare function defineApplication<const Schema extends schema.DomainSchema, const RuntimeValue extends Runtime<Schema>, const FrontendValue extends Frontend<Schema> | undefined = undefined, const RoutesValue extends Routes | undefined = undefined, const RequirementsValue extends Requirements | undefined = undefined>(input: ApplicationInput<Schema, RuntimeValue, FrontendValue, RoutesValue, RequirementsValue>): Application<Schema, RuntimeValue, FrontendValue, RoutesValue, RequirementsValue>;
16
- export declare function isApplication(input: unknown): input is Application;
14
+ /** Capture one inert authored Domain without resolving, compiling, loading, or deploying it. */
15
+ export declare function defineDomain<const Schema extends schema.DomainSchema, const RuntimeValue extends Runtime<Schema>, const FrontendValue extends Frontend<Schema> | undefined = undefined, const RoutesValue extends Routes | undefined = undefined, const RequirementsValue extends Requirements | undefined = undefined>(input: DomainDefinitionInput<Schema, RuntimeValue, FrontendValue, RoutesValue, RequirementsValue>): DomainDefinition<Schema, RuntimeValue, FrontendValue, RoutesValue, RequirementsValue>;
16
+ export declare function isDomainDefinition(input: unknown): input is DomainDefinition;
@@ -2,39 +2,39 @@ import { isRequirements } from './requirements/index.js';
2
2
  import { isRoutes } from './routes/index.js';
3
3
  import { isRuntime } from './runtime/index.js';
4
4
  import { isFrontend } from './view/index.js';
5
- const admittedApplications = new WeakSet();
6
- /** Capture one inert authored Application without resolving, compiling, loading, or deploying it. */
7
- export function defineApplication(input) {
5
+ const admittedDomainDefinitions = new WeakSet();
6
+ /** Capture one inert authored Domain without resolving, compiling, loading, or deploying it. */
7
+ export function defineDomain(input) {
8
8
  if (input === null || typeof input !== 'object' || Array.isArray(input))
9
9
  invalid();
10
10
  const allowed = new Set(['schema', 'runtime', 'frontend', 'routes', 'requirements']);
11
11
  if (Reflect.ownKeys(input).some((key) => !allowed.has(key)))
12
12
  invalid();
13
13
  if (!isRuntime(input.runtime))
14
- throw new TypeError('Application Runtime is not admitted.');
14
+ throw new TypeError('Domain Runtime is not admitted.');
15
15
  if (input.frontend !== undefined &&
16
16
  (!isFrontend(input.frontend) || input.frontend.schema !== input.schema)) {
17
- throw new TypeError('Application Frontend is not admitted for its exact Schema.');
17
+ throw new TypeError('Domain Frontend is not admitted for its exact Schema.');
18
18
  }
19
19
  if (input.routes !== undefined && !isRoutes(input.routes)) {
20
- throw new TypeError('Application routes are not admitted.');
20
+ throw new TypeError('Domain routes are not admitted.');
21
21
  }
22
22
  if (input.requirements !== undefined && !isRequirements(input.requirements)) {
23
- throw new TypeError('Application requirements are not admitted.');
23
+ throw new TypeError('Domain requirements are not admitted.');
24
24
  }
25
- const application = Object.freeze({
25
+ const domain = Object.freeze({
26
26
  schema: input.schema,
27
27
  runtime: input.runtime,
28
28
  ...(input.frontend === undefined ? {} : { frontend: input.frontend }),
29
29
  ...(input.routes === undefined ? {} : { routes: input.routes }),
30
30
  ...(input.requirements === undefined ? {} : { requirements: input.requirements }),
31
31
  });
32
- admittedApplications.add(application);
33
- return application;
32
+ admittedDomainDefinitions.add(domain);
33
+ return domain;
34
34
  }
35
- export function isApplication(input) {
36
- return input !== null && typeof input === 'object' && admittedApplications.has(input);
35
+ export function isDomainDefinition(input) {
36
+ return input !== null && typeof input === 'object' && admittedDomainDefinitions.has(input);
37
37
  }
38
38
  function invalid() {
39
- throw new TypeError('Application definition may contain only schema, runtime, frontend, routes, and requirements.');
39
+ throw new TypeError('Domain definition may contain only schema, runtime, frontend, routes, and requirements.');
40
40
  }
@@ -1 +1 @@
1
- export type { DependencyCallOptions, DependencyInvoker, HandlerDependencies } from './invoker.js';
1
+ export type { DependencyBinaryCallOptions, DependencyCallOptions, DependencyInvoker, HandlerDependencies, } from './invoker.js';
@@ -1,18 +1,23 @@
1
1
  import type { Binary, Input } from '../../platform/client/index.js';
2
- import type { SessionRequestOptions } from '../../platform/client/session/index.js';
2
+ import type { SessionRequestOptions, SessionRequestOptionsWithBody } from '../../platform/client/session/index.js';
3
3
  import type { NodeId } from '../../platform/graph/node/index.js';
4
- import type { CallableInputOf, CallableOutputOf, CallableResultOf, Domain, ResolvedMethod, KernelSchema, schema } from '../../platform/schema/index.js';
4
+ import type { CallableInputOf, CallableInputModeOf, CallableOutputOf, CallableResultOf, Domain, ResolvedFunction, ResolvedMethod, KernelSchema, schema } from '../../platform/schema/index.js';
5
5
  import type { LocalCallable } from '../action/index.js';
6
- export type DependencyCallOptions = Pick<SessionRequestOptions, 'timeoutMs' | 'idempotencyKey'>;
6
+ export type DependencyCallOptions = Pick<SessionRequestOptions, 'timeoutMs' | 'idempotencyKey' | 'body'>;
7
+ export type DependencyBinaryCallOptions = Pick<SessionRequestOptionsWithBody, 'timeoutMs' | 'idempotencyKey' | 'body'>;
7
8
  type InstanceMethodOf<D extends Domain> = Extract<LocalCallable<D>, ResolvedMethod<unknown, unknown, false>>;
8
9
  type FunctionOrStaticMethodOf<D extends Domain> = Exclude<LocalCallable<D>, ResolvedMethod<unknown, unknown, false>>;
10
+ type WithInputMode<C, Mode extends 'value' | 'binary'> = C extends unknown ? CallableInputModeOf<C> extends Mode ? C : never : never;
11
+ type ValueFunctionOrStaticMethodOf<D extends Domain> = WithInputMode<FunctionOrStaticMethodOf<D>, 'value'>;
12
+ type BinaryFunctionOf<D extends Domain> = WithInputMode<Extract<LocalCallable<D>, ResolvedFunction>, 'binary'>;
9
13
  type DependencyInputOf<C> = C extends unknown ? unknown extends CallableInputOf<C> ? Input : [CallableInputOf<C>] extends [void] ? undefined : CallableInputOf<C> : never;
10
14
  type DependencyResultOf<C> = unknown extends CallableOutputOf<C> ? unknown : CallableResultOf<C, Binary>;
11
15
  /** One declared dependency, bound to one explicitly selected invocation authority. */
12
16
  export interface DependencyInvoker<D extends Domain> {
13
17
  readonly invoke: {
14
- <const C extends FunctionOrStaticMethodOf<D>>(select: (domain: D) => C, input: NoInfer<DependencyInputOf<C>>, options?: DependencyCallOptions): Promise<DependencyResultOf<C>>;
18
+ <const C extends ValueFunctionOrStaticMethodOf<D>>(select: (domain: D) => C, input: NoInfer<DependencyInputOf<C>>, options?: DependencyCallOptions): Promise<DependencyResultOf<C>>;
15
19
  <const C extends InstanceMethodOf<D>>(select: (domain: D) => C, instance: NodeId, input: NoInfer<DependencyInputOf<C>>, options?: DependencyCallOptions): Promise<DependencyResultOf<C>>;
20
+ <const C extends BinaryFunctionOf<D>>(select: (domain: D) => C, metadata: NoInfer<DependencyInputOf<C>>, options: DependencyBinaryCallOptions): Promise<DependencyResultOf<C>>;
16
21
  };
17
22
  }
18
23
  /**
@@ -0,0 +1,28 @@
1
+ import type { schema } from '../platform/schema/index.js';
2
+ import type { Requirements } from './requirements/index.js';
3
+ import type { Routes } from './routes/index.js';
4
+ import type { Runtime, SchemaOfRuntime as RuntimeSchemaOf } from './runtime/index.js';
5
+ import type { Frontend } from './view/index.js';
6
+ declare const DOMAIN_DEFINITION_IDENTITY: unique symbol;
7
+ declare const DOMAIN_DEFINITION_SCHEMA: unique symbol;
8
+ /** Schema-independent type witness shared by every admitted Domain definition. */
9
+ export interface DomainDefinitionIdentity {
10
+ readonly [DOMAIN_DEFINITION_IDENTITY]: true;
11
+ }
12
+ /** Inert source/build composition of one Domain: its exact Schema and authored Runtime. */
13
+ export interface DomainDefinition<Schema extends schema.DomainSchema = schema.DomainSchema, RuntimeValue extends Runtime<Schema> = Runtime<Schema>, FrontendValue extends Frontend<Schema> | undefined = undefined, RoutesValue extends Routes | undefined = undefined, RequirementsValue extends Requirements | undefined = undefined> extends DomainDefinitionIdentity {
14
+ readonly schema: Schema;
15
+ readonly runtime: RuntimeValue;
16
+ readonly frontend?: FrontendValue;
17
+ readonly routes?: RoutesValue;
18
+ readonly requirements?: RequirementsValue;
19
+ readonly [DOMAIN_DEFINITION_SCHEMA]: (schema: Schema) => Schema;
20
+ }
21
+ export type SchemaOfDomainDefinition<Value> = Value extends {
22
+ readonly schema: infer Schema;
23
+ } ? Extract<Schema, schema.DomainSchema> : never;
24
+ export type RuntimeOfDomainDefinition<Value> = Value extends {
25
+ readonly runtime: infer RuntimeValue;
26
+ } ? Extract<RuntimeValue, Runtime> : never;
27
+ export type SchemaOfRuntime<Value> = RuntimeSchemaOf<Value>;
28
+ export {};
@@ -1,9 +1,9 @@
1
- export { defineApplication, isApplication } from './define.js';
2
- export type { ApplicationInput } from './define.js';
1
+ export { defineDomain, isDomainDefinition } from './define.js';
2
+ export type { DomainDefinitionInput } from './define.js';
3
3
  export { requirements } from './requirements/index.js';
4
4
  export type { AuthorityRequirements, AuthorityRequirementsInput, ClassOperation, ClassRequirement, ClassRequirementInput, CoreRequirement, CoreRequirementInput, FunctionRequirementTarget, Requirements, RequirementsInput, } from './requirements/index.js';
5
5
  export { route, routes } from './routes/index.js';
6
6
  export type { Route, RouteInput, RouteTarget, Routes } from './routes/index.js';
7
7
  export { defineFrontend, external, vite } from './view/index.js';
8
8
  export type { Frontend, FrontendInput, FrontendSource, IframeRequirements, ViewHostRequirements, } from './view/index.js';
9
- export type { Application, ApplicationIdentity, RuntimeOfApplication, SchemaOfApplication, SchemaOfRuntime, } from './application.js';
9
+ export type { DomainDefinition, DomainDefinitionIdentity, RuntimeOfDomainDefinition, SchemaOfDomainDefinition, SchemaOfRuntime, } from './domain.js';
@@ -1,4 +1,4 @@
1
- export { defineApplication, isApplication } from './define.js';
1
+ export { defineDomain, isDomainDefinition } from './define.js';
2
2
  export { requirements } from './requirements/index.js';
3
3
  export { route, routes } from './routes/index.js';
4
4
  export { defineFrontend, external, vite } from './view/index.js';
@@ -1,9 +1,11 @@
1
1
  import type { MutationPropsInput } from '@astrale-os/kernel-core/graph/mutate';
2
2
  import type { PropertyInputOf, ResolvedClass, ResolvedProperty } from '@astrale-os/kernel-dsl/v1';
3
+ import { PropertyValues } from '@astrale-os/kernel-dsl/v1/language';
4
+ import type { StoredPropertyInputOf } from '../../../platform/schema/property-input.js';
3
5
  export type RichPropertyInput<Class> = PropertyInputOf<Class>;
4
6
  export type RichPropertyName<Class> = Extract<keyof PropertyInputOf<Class>, string>;
5
7
  export interface RichPropertyConditions<Class> {
6
- readonly equals?: RichPropertyInput<Class>;
8
+ readonly equals?: StoredPropertyInputOf<Class>;
7
9
  readonly absent?: readonly RichPropertyName<Class>[];
8
10
  }
9
11
  export interface RichPropertyDelta<Class> {
@@ -12,11 +14,11 @@ export interface RichPropertyDelta<Class> {
12
14
  }
13
15
  export declare function properties<Class extends ResolvedClass>(selected: Class, input: RichPropertyInput<Class>): MutationPropsInput;
14
16
  export declare function conditions<Class extends ResolvedClass>(selected: Class, input: RichPropertyConditions<Class>): Readonly<{
15
- equals?: Readonly<Record<`${string}:class.${string}.property.${string}`, import("@astrale-os/kernel-dsl/value").Value>> | undefined;
17
+ equals?: PropertyValues | undefined;
16
18
  absent?: readonly `${string}:class.${string}.property.${string}`[] | undefined;
17
19
  }>;
18
20
  export declare function delta<Class extends ResolvedClass>(selected: Class, input: RichPropertyDelta<Class>): Readonly<{
19
- set: Readonly<Record<`${string}:class.${string}.property.${string}`, import("@astrale-os/kernel-dsl/value").Value>>;
21
+ set: Readonly<Record<`${string}:class.${string}.property.${string}`, import("@astrale-os/kernel-dsl/v1/language").PropertyValue>>;
20
22
  unset: readonly `${string}:class.${string}.property.${string}`[];
21
23
  }>;
22
24
  export declare function resolvedProperty<Class extends ResolvedClass>(selected: Class, name: RichPropertyName<Class>): ResolvedProperty;
@@ -1,10 +1,39 @@
1
1
  import { PropertyKey } from '@astrale-os/kernel-dsl/v1/addressing';
2
+ import { PropertyValues } from '@astrale-os/kernel-dsl/v1/language';
2
3
  export function properties(selected, input) {
3
- return selected.properties.from(input);
4
+ const ordinary = Object.create(null);
5
+ const receipts = [];
6
+ const sources = new Map();
7
+ for (const [name, value] of Object.entries(input)) {
8
+ const property = resolvedProperty(selected, name);
9
+ const previous = sources.get(property.key);
10
+ if (previous !== undefined) {
11
+ throw new TypeError(`Property ${property.key} is supplied through both ${JSON.stringify(previous)} and ${JSON.stringify(name)}.`);
12
+ }
13
+ sources.set(property.key, name);
14
+ if (isBlobProperty(property)) {
15
+ if (typeof value !== 'string') {
16
+ throw new TypeError(`Blob Property ${property.key} requires an upload receipt.`);
17
+ }
18
+ receipts.push([property.key, value]);
19
+ }
20
+ else {
21
+ ordinary[name] = value;
22
+ }
23
+ }
24
+ // Blob receipts are admitted by the Kernel executor. A property's ordinary validator expects
25
+ // the stored Ref, so run it only for ordinary write values before combining the two sets.
26
+ const admitted = selected.properties.from(ordinary);
27
+ return receipts.length === 0
28
+ ? admitted
29
+ : PropertyValues.create([
30
+ ...Object.entries(admitted).map(([key, value]) => [PropertyKey(key), value]),
31
+ ...receipts,
32
+ ]);
4
33
  }
5
34
  export function conditions(selected, input) {
6
35
  return Object.freeze({
7
- ...(input.equals === undefined ? {} : { equals: properties(selected, input.equals) }),
36
+ ...(input.equals === undefined ? {} : { equals: selected.properties.from(input.equals) }),
8
37
  ...(input.absent === undefined
9
38
  ? {}
10
39
  : {
@@ -12,6 +41,10 @@ export function conditions(selected, input) {
12
41
  }),
13
42
  });
14
43
  }
44
+ function isBlobProperty(property) {
45
+ const contract = property.definition.schema;
46
+ return (contract !== null && typeof contract === 'object' && contract['x-astrale-value-kind'] === 'blob');
47
+ }
15
48
  export function delta(selected, input) {
16
49
  return Object.freeze({
17
50
  set: properties(selected, input.set ?? {}),
@@ -49,7 +49,10 @@ export function authorStateTransition(core, input) {
49
49
  class: selectedClassKey,
50
50
  props: conditions(selectedClass, {
51
51
  ...(suppliedAbsent === undefined ? {} : { absent: suppliedAbsent }),
52
- equals: { ...suppliedEquals, ...from },
52
+ equals: {
53
+ ...suppliedEquals,
54
+ ...from,
55
+ },
53
56
  }),
54
57
  });
55
58
  core.updateNode({
@@ -1,5 +1,5 @@
1
- import type { publication } from '@astrale-os/kernel-protocol';
1
+ import type { release } from '@astrale-os/kernel-protocol';
2
2
  import type { RuntimeRegistry } from '../runtime/index.js';
3
3
  import type { Routes } from './collection.js';
4
4
  /** Lower recipe identities to canonical callable keys after Runtime admission. */
5
- export declare function admit(input: Routes | undefined, registry: RuntimeRegistry): readonly publication.HttpRouteDeclaration[];
5
+ export declare function admit(input: Routes | undefined, registry: RuntimeRegistry): readonly release.HttpRouteDeclaration[];
@@ -4,7 +4,7 @@ export function admit(input, registry) {
4
4
  if (input === undefined)
5
5
  return Object.freeze([]);
6
6
  if (!isRoutes(input))
7
- throw new TypeError('Application routes are not admitted.');
7
+ throw new TypeError('Domain routes are not admitted.');
8
8
  return Object.freeze(input.entries.map(({ target, ...declaration }) => {
9
9
  const implementation = registry.implementations.find(({ definition }) => definition === target);
10
10
  if (implementation === undefined) {
@@ -1,9 +1,9 @@
1
- import type { publication } from '@astrale-os/kernel-protocol';
1
+ import type { release } from '@astrale-os/kernel-protocol';
2
2
  export interface RouteTarget {
3
3
  readonly kind: 'action' | 'workflow';
4
4
  readonly address: string;
5
5
  }
6
- export type RouteInput = Omit<publication.HttpRouteDeclaration, 'callable'>;
6
+ export type RouteInput = Omit<release.HttpRouteDeclaration, 'callable'>;
7
7
  /** One provider-neutral HTTP route targeting an admitted Action or Workflow recipe. */
8
8
  export interface Route<Target extends RouteTarget = RouteTarget> extends RouteInput {
9
9
  readonly target: Target;
@@ -16,6 +16,9 @@ export function admitActions(callables, input) {
16
16
  if (callable === undefined) {
17
17
  throw new TypeError(`Runtime Action ${definition.address} is not root-local and executable.`);
18
18
  }
19
+ if (callable.execution?.durable === true) {
20
+ throw new TypeError(`Runtime Action ${definition.address} is durable; implement it with defineWorkflow.`);
21
+ }
19
22
  return Object.freeze({
20
23
  kind: 'action',
21
24
  address: definition.address,
@@ -6,6 +6,8 @@ export interface RuntimeWorkflow {
6
6
  readonly address: string;
7
7
  readonly callable: ResolvedCallable;
8
8
  readonly definition: WorkflowDefinition;
9
+ /** Declared `execution: { durable: true }`: runs on the workflow engine, never inline. */
10
+ readonly durable: boolean;
9
11
  }
10
12
  /** Associate admitted Workflows with their exact authenticated value callables. */
11
13
  export declare function admitWorkflows(callables: readonly RuntimeCallable[], input: unknown): readonly RuntimeWorkflow[];
@@ -22,11 +22,16 @@ export function admitWorkflows(callables, input) {
22
22
  if (callable.output.mode !== 'value') {
23
23
  throw new TypeError(`Runtime Workflow ${definition.address} must have value output.`);
24
24
  }
25
+ const durable = callable.execution?.durable === true;
26
+ if (!durable && definition.compat !== undefined) {
27
+ throw new TypeError(`Runtime Workflow ${definition.address} declares compat but its callable is not durable.`);
28
+ }
25
29
  return Object.freeze({
26
30
  kind: 'workflow',
27
31
  address: definition.address,
28
32
  callable,
29
33
  definition,
34
+ durable,
30
35
  });
31
36
  });
32
37
  return Object.freeze(workflows);
@@ -1,4 +1,5 @@
1
1
  export { defineWorkflow } from './define.js';
2
- export type { WorkflowContext } from './context.js';
3
- export type { Workflow, WorkflowAddress, WorkflowDefinition } from './workflow.js';
2
+ export type { InlineWorkflowContext, WorkflowContext } from './context.js';
3
+ export type { DurableCallable, DurableExecution, DurableStep, DurableStepAuthority, DurableWorkflowContext, } from './durable.js';
4
+ export type { Workflow, WorkflowAddress, WorkflowDefinition, WorkflowOptions } from './workflow.js';
4
5
  export type { DeclaredErrorDefinition, DeclaredErrorFactory, DeclaredErrorFamily, DeclaredErrorOptions, DeclaredErrors, } from '../error/index.js';