@astrale-os/sdk 0.5.0-beta.99 → 0.6.0-beta.0

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 (270) hide show
  1. package/README.md +165 -2
  2. package/dist/application/action/action.d.ts +7 -4
  3. package/dist/application/action/authoring.d.ts +2 -1
  4. package/dist/application/action/context.d.ts +18 -13
  5. package/dist/application/action/define.d.ts +5 -1
  6. package/dist/application/action/define.js +6 -1
  7. package/dist/application/action/index.d.ts +2 -1
  8. package/dist/application/dependency/index.d.ts +1 -0
  9. package/dist/application/dependency/invoker.d.ts +26 -0
  10. package/dist/application/error/error.d.ts +23 -0
  11. package/dist/application/error/error.js +87 -0
  12. package/dist/application/error/index.d.ts +2 -0
  13. package/dist/application/error/index.js +1 -0
  14. package/dist/application/index.d.ts +2 -2
  15. package/dist/application/integration/authentication.d.ts +10 -0
  16. package/dist/application/integration/authentication.typecheck.js +18 -0
  17. package/dist/application/integration/client.d.ts +2 -0
  18. package/dist/application/integration/client.js +19 -2
  19. package/dist/application/integration/index.d.ts +1 -0
  20. package/dist/application/integration/operation.d.ts +3 -0
  21. package/dist/application/mutation/authoring/builder.js +2 -2
  22. package/dist/application/mutation/authoring/endpoint.d.ts +3 -3
  23. package/dist/application/mutation/authoring/endpoint.js +9 -0
  24. package/dist/application/mutation/failure.js +13 -7
  25. package/dist/application/mutation/index.d.ts +1 -0
  26. package/dist/application/requirements/{profiles.d.ts → core.d.ts} +5 -3
  27. package/dist/application/requirements/{profiles.js → core.js} +6 -6
  28. package/dist/application/requirements/index.d.ts +4 -4
  29. package/dist/application/requirements/index.js +5 -5
  30. package/dist/application/requirements/requirement.d.ts +3 -2
  31. package/dist/application/runtime/authoring.d.ts +1 -0
  32. package/dist/application/runtime/callables.js +2 -2
  33. package/dist/application/runtime/declarations.d.ts +43 -0
  34. package/dist/application/runtime/define.d.ts +2 -1
  35. package/dist/application/view/index.d.ts +1 -1
  36. package/dist/application/view/route.d.ts +4 -0
  37. package/dist/application/view/route.js +5 -1
  38. package/dist/application/workflow/authoring.d.ts +1 -0
  39. package/dist/application/workflow/context.d.ts +2 -1
  40. package/dist/application/workflow/define.d.ts +5 -1
  41. package/dist/application/workflow/define.js +6 -1
  42. package/dist/application/workflow/index.d.ts +1 -0
  43. package/dist/application/workflow/runner/runner.d.ts +3 -2
  44. package/dist/application/workflow/workflow.d.ts +4 -3
  45. package/dist/deployment/adapter/adapter.d.ts +12 -7
  46. package/dist/deployment/adapter/define.d.ts +5 -2
  47. package/dist/deployment/adapter/define.js +15 -17
  48. package/dist/deployment/adapter/deploy/context.d.ts +6 -0
  49. package/dist/deployment/adapter/deploy/result.d.ts +2 -0
  50. package/dist/deployment/adapter/index.d.ts +2 -3
  51. package/dist/deployment/adapter/index.js +1 -1
  52. package/dist/deployment/adapter/prepare/context.d.ts +13 -5
  53. package/dist/deployment/authoring.d.ts +1 -1
  54. package/dist/deployment/build/compile.js +21 -19
  55. package/dist/deployment/build/frontend/compilation.d.ts +2 -1
  56. package/dist/deployment/build/frontend/compilation.js +1 -0
  57. package/dist/deployment/build/material.js +5 -5
  58. package/dist/deployment/deploy.d.ts +10 -4
  59. package/dist/deployment/deploy.js +5 -5
  60. package/dist/deployment/deployment.d.ts +8 -5
  61. package/dist/deployment/deployment.js +10 -1
  62. package/dist/deployment/index.d.ts +5 -4
  63. package/dist/deployment/index.js +3 -2
  64. package/dist/deployment/release/addressing.d.ts +6 -2
  65. package/dist/deployment/release/addressing.js +9 -4
  66. package/dist/deployment/release/publication/callables.js +1 -1
  67. package/dist/deployment/release/publication/index.d.ts +1 -1
  68. package/dist/deployment/release/publication/index.js +1 -1
  69. package/dist/deployment/release/publication/routes.js +1 -1
  70. package/dist/deployment/release/publication/seal.d.ts +0 -1
  71. package/dist/deployment/release/publication/seal.js +4 -5
  72. package/dist/deployment/release/publication/views.js +2 -1
  73. package/dist/deployment/verify/preflight/artifact.js +1 -1
  74. package/dist/deployment/verify/readiness/deployment.js +7 -3
  75. package/dist/deployment/verify/readiness/identity.js +1 -1
  76. package/dist/deployment/verify/readiness/publication.js +2 -2
  77. package/dist/execution/identity/authentication.js +0 -1
  78. package/dist/execution/identity/exchange.d.ts +1 -0
  79. package/dist/execution/identity/exchange.js +1 -1
  80. package/dist/execution/identity/jwks.js +1 -1
  81. package/dist/execution/invocation/admission/authentication.d.ts +6 -3
  82. package/dist/execution/invocation/admission/authentication.js +16 -6
  83. package/dist/execution/invocation/admission/authority.d.ts +2 -2
  84. package/dist/execution/invocation/dependency/bind.d.ts +5 -0
  85. package/dist/execution/invocation/dependency/bind.js +68 -0
  86. package/dist/execution/invocation/dependency/index.d.ts +1 -0
  87. package/dist/execution/invocation/dependency/index.js +1 -0
  88. package/dist/execution/invocation/dispatch/action.js +19 -2
  89. package/dist/execution/invocation/dispatch/context.d.ts +4 -4
  90. package/dist/execution/invocation/dispatch/context.js +29 -9
  91. package/dist/execution/invocation/dispatch/workflow.js +17 -4
  92. package/dist/execution/invocation/integration/authentication.d.ts +5 -0
  93. package/dist/execution/invocation/integration/authentication.js +53 -0
  94. package/dist/execution/invocation/integration/call.d.ts +7 -1
  95. package/dist/execution/invocation/integration/call.js +8 -3
  96. package/dist/execution/invocation/integration/clients.d.ts +2 -2
  97. package/dist/execution/invocation/integration/clients.js +2 -2
  98. package/dist/execution/invocation/lifecycle/active.js +30 -5
  99. package/dist/execution/invocation/result/errors.d.ts +1 -0
  100. package/dist/execution/invocation/result/errors.js +15 -10
  101. package/dist/execution/service/create.js +3 -1
  102. package/dist/execution/service/service.d.ts +1 -1
  103. package/dist/index.d.ts +3 -1
  104. package/dist/index.js +1 -0
  105. package/dist/platform/auth/index.d.ts +1 -1
  106. package/dist/platform/auth/index.js +0 -1
  107. package/dist/platform/graph/alias.d.ts +6 -0
  108. package/dist/platform/graph/alias.js +6 -0
  109. package/dist/platform/graph/document/index.d.ts +2 -1
  110. package/dist/platform/graph/document/index.js +2 -1
  111. package/dist/platform/graph/index.d.ts +2 -1
  112. package/dist/platform/graph/index.js +2 -1
  113. package/dist/platform/schema/class-authoring.d.ts +37 -0
  114. package/dist/platform/schema/class-authoring.js +20 -0
  115. package/dist/platform/schema/class-icon.d.ts +15 -0
  116. package/dist/platform/schema/class-icon.js +46 -0
  117. package/dist/platform/schema/error.d.ts +11 -0
  118. package/dist/platform/schema/error.js +34 -0
  119. package/dist/platform/schema/errors/index.d.ts +3 -0
  120. package/dist/platform/schema/errors/index.js +2 -0
  121. package/dist/platform/schema/icons/index.d.ts +2 -0
  122. package/dist/platform/schema/icons/index.js +2 -0
  123. package/dist/platform/schema/index.d.ts +20 -13
  124. package/dist/platform/schema/index.js +9 -4
  125. package/dist/platform/schema/kernel.d.ts +22 -0
  126. package/dist/platform/schema/kernel.js +5 -0
  127. package/dist/platform/schema/node-id.d.ts +3 -0
  128. package/dist/platform/schema/node-id.js +6 -0
  129. package/dist/platform/schema/property.d.ts +12 -0
  130. package/dist/platform/schema/property.js +3 -0
  131. package/dist/platform/schema/schema-authoring.d.ts +48 -0
  132. package/dist/platform/schema/schema-authoring.js +3 -0
  133. package/dist/platform/schema/state-property.d.ts +11 -0
  134. package/dist/platform/schema/state-property.js +3 -0
  135. package/dist/project/admit.d.ts +4 -0
  136. package/dist/project/admit.js +22 -0
  137. package/dist/project/define.d.ts +12 -0
  138. package/dist/project/define.js +106 -0
  139. package/dist/project/index.d.ts +4 -0
  140. package/dist/project/index.js +2 -0
  141. package/dist/project/project.d.ts +24 -0
  142. package/dist/project/project.js +1 -0
  143. package/dist/testing/dataset/admission.d.ts +13 -0
  144. package/dist/testing/dataset/admission.js +107 -0
  145. package/dist/testing/dataset/builder.d.ts +42 -0
  146. package/dist/testing/dataset/builder.js +127 -0
  147. package/dist/testing/dataset/codec.d.ts +6 -0
  148. package/dist/testing/dataset/codec.js +113 -0
  149. package/dist/testing/dataset/dataset.d.ts +58 -0
  150. package/dist/testing/dataset/dataset.js +2 -0
  151. package/dist/testing/dataset/define.d.ts +33 -0
  152. package/dist/testing/dataset/define.js +105 -0
  153. package/dist/testing/dataset/index.d.ts +8 -0
  154. package/dist/testing/dataset/index.js +4 -0
  155. package/dist/testing/dataset/references.d.ts +14 -0
  156. package/dist/testing/dataset/references.js +56 -0
  157. package/dist/testing/index.d.ts +9 -0
  158. package/dist/testing/index.js +5 -0
  159. package/dist/testing/load.d.ts +14 -0
  160. package/dist/testing/load.js +44 -0
  161. package/dist/testing/reference.d.ts +11 -0
  162. package/dist/testing/reference.js +19 -0
  163. package/dist/testing/tests.d.ts +12 -0
  164. package/dist/testing/tests.js +31 -0
  165. package/dist/tooling/cli/arguments.d.ts +7 -4
  166. package/dist/tooling/cli/arguments.js +82 -107
  167. package/dist/tooling/cli/astrale/authority.d.ts +5 -0
  168. package/dist/tooling/cli/astrale/authority.js +11 -0
  169. package/dist/tooling/cli/astrale/executable.d.ts +2 -0
  170. package/dist/tooling/cli/astrale/executable.js +47 -0
  171. package/dist/tooling/cli/astrale/failure.d.ts +6 -0
  172. package/dist/tooling/cli/astrale/failure.js +48 -0
  173. package/dist/tooling/cli/astrale/instance.d.ts +11 -0
  174. package/dist/tooling/cli/astrale/instance.js +52 -0
  175. package/dist/tooling/cli/astrale/process.d.ts +13 -0
  176. package/dist/tooling/cli/astrale/process.js +94 -0
  177. package/dist/tooling/cli/astrale/version.d.ts +18 -0
  178. package/dist/tooling/cli/astrale/version.js +55 -0
  179. package/dist/tooling/cli/bun.js +1 -1
  180. package/dist/tooling/cli/credential.d.ts +2 -0
  181. package/dist/tooling/cli/credential.js +57 -0
  182. package/dist/tooling/cli/development/candidate.d.ts +25 -0
  183. package/dist/tooling/cli/development/candidate.js +176 -0
  184. package/dist/tooling/cli/development/deployment.d.ts +16 -0
  185. package/dist/tooling/cli/development/deployment.js +39 -0
  186. package/dist/tooling/cli/development/develop.d.ts +4 -3
  187. package/dist/tooling/cli/development/develop.js +125 -289
  188. package/dist/tooling/cli/development/lease.d.ts +18 -0
  189. package/dist/tooling/cli/development/lease.js +163 -0
  190. package/dist/tooling/cli/development/lifecycle.js +4 -0
  191. package/dist/tooling/cli/development/project-imports.d.ts +22 -0
  192. package/dist/tooling/cli/development/project-imports.js +39 -0
  193. package/dist/tooling/cli/development/project-lock.d.ts +3 -4
  194. package/dist/tooling/cli/development/project-lock.js +14 -166
  195. package/dist/tooling/cli/development/release-evidence.d.ts +4 -0
  196. package/dist/tooling/cli/development/release-evidence.js +10 -0
  197. package/dist/tooling/cli/development/report.d.ts +6 -0
  198. package/dist/tooling/cli/development/report.js +14 -0
  199. package/dist/tooling/cli/development/source-watch.js +53 -5
  200. package/dist/tooling/cli/development/sources.d.ts +7 -0
  201. package/dist/tooling/cli/development/sources.js +48 -0
  202. package/dist/tooling/cli/development/target-lock.d.ts +16 -0
  203. package/dist/tooling/cli/development/target-lock.js +68 -0
  204. package/dist/tooling/cli/development/view.d.ts +28 -0
  205. package/dist/tooling/cli/development/view.js +151 -0
  206. package/dist/tooling/cli/environment-release.d.ts +21 -0
  207. package/dist/tooling/cli/environment-release.js +46 -0
  208. package/dist/tooling/cli/evidence.d.ts +11 -0
  209. package/dist/tooling/cli/evidence.js +53 -0
  210. package/dist/tooling/cli/help.js +78 -34
  211. package/dist/tooling/cli/index.d.ts +1 -1
  212. package/dist/tooling/cli/index.js +1 -1
  213. package/dist/tooling/cli/installation/index.d.ts +2 -0
  214. package/dist/tooling/cli/installation/index.js +1 -0
  215. package/dist/tooling/cli/installation/observation.d.ts +10 -0
  216. package/dist/tooling/cli/installation/observation.js +44 -0
  217. package/dist/tooling/cli/installation/reconcile.d.ts +32 -0
  218. package/dist/tooling/cli/installation/reconcile.js +122 -0
  219. package/dist/tooling/cli/orchestrate.js +84 -44
  220. package/dist/tooling/cli/project.d.ts +17 -0
  221. package/dist/tooling/cli/project.js +18 -0
  222. package/dist/tooling/cli/test.d.ts +12 -0
  223. package/dist/tooling/cli/test.js +47 -0
  224. package/dist/tooling/cli/upgrade/index.d.ts +6 -0
  225. package/dist/tooling/cli/upgrade/index.js +115 -0
  226. package/dist/tooling/cli/upgrade/manifest.d.ts +18 -0
  227. package/dist/tooling/cli/upgrade/manifest.js +77 -0
  228. package/dist/tooling/cli/upgrade/process.d.ts +2 -0
  229. package/dist/tooling/cli/upgrade/process.js +57 -0
  230. package/dist/tooling/linter/adapters/typescript/imports.js +2 -0
  231. package/dist/tooling/linter/adapters/typescript/index.d.ts +1 -0
  232. package/dist/tooling/linter/adapters/typescript/index.js +1 -0
  233. package/dist/tooling/linter/adapters/typescript/query-collection-type.js +4 -51
  234. package/dist/tooling/linter/adapters/typescript/type-analysis.d.ts +9 -0
  235. package/dist/tooling/linter/adapters/typescript/type-analysis.js +55 -0
  236. package/dist/tooling/linter/implementations/source/callable-requirements.d.ts +28 -0
  237. package/dist/tooling/linter/implementations/source/callable-requirements.js +234 -0
  238. package/dist/tooling/linter/implementations/source/dependencies.d.ts +2 -0
  239. package/dist/tooling/linter/implementations/source/dependencies.js +219 -0
  240. package/dist/tooling/linter/implementations/source/global.js +52 -2
  241. package/dist/tooling/linter/implementations/source/mutations.js +520 -38
  242. package/dist/tooling/linter/implementations/source/providers.js +19 -164
  243. package/dist/tooling/linter/implementations/source/schema.js +454 -2
  244. package/dist/tooling/linter/implementations/source/verifiers.js +2 -0
  245. package/dist/tooling/linter/implementations/source/workflows.js +8 -35
  246. package/dist/tooling/linter/policy/generated.js +2 -2
  247. package/dist/tooling/linter/requirements/registry.js +9 -3
  248. package/dist/tooling/packaging/declarations/normalize.js +3 -38
  249. package/dist/tooling/packaging/declarations/paths.d.ts +5 -0
  250. package/dist/tooling/packaging/declarations/paths.js +38 -0
  251. package/dist/tooling/packaging/finalize.d.ts +13 -0
  252. package/dist/tooling/packaging/finalize.js +62 -0
  253. package/dist/tooling/packaging/index.d.ts +2 -0
  254. package/dist/tooling/packaging/index.js +1 -0
  255. package/dist/tooling/packaging/javascript.d.ts +3 -0
  256. package/dist/tooling/packaging/javascript.js +45 -2
  257. package/dist/tooling/packaging/packaging.d.ts +2 -5
  258. package/dist/tooling/packaging/packaging.js +6 -30
  259. package/package.json +42 -12
  260. package/CHANGELOG.md +0 -1506
  261. package/dist/deployment/adapter/development/context.d.ts +0 -18
  262. package/dist/deployment/adapter/development/index.d.ts +0 -4
  263. package/dist/deployment/adapter/development/input.d.ts +0 -6
  264. package/dist/deployment/adapter/development/placement.d.ts +0 -15
  265. package/dist/deployment/adapter/development/session.d.ts +0 -9
  266. /package/dist/{deployment/adapter/development → application/dependency}/index.js +0 -0
  267. /package/dist/{deployment/adapter/development/context.js → application/dependency/invoker.js} +0 -0
  268. /package/dist/{deployment/adapter/development/input.js → application/integration/authentication.js} +0 -0
  269. /package/dist/{deployment/adapter/development/placement.js → application/integration/authentication.typecheck.d.ts} +0 -0
  270. /package/dist/{deployment/adapter/development/session.js → application/runtime/declarations.js} +0 -0
@@ -0,0 +1,107 @@
1
+ import { Graph, GraphAdmissionError } from '../../platform/graph/document/index.js';
2
+ import { ClassKey as ClassKeyValue, K } from '../../platform/schema/index.js';
3
+ export class DatasetAdmissionError extends TypeError {
4
+ dataset;
5
+ diagnostics;
6
+ code = 'DATASET_REJECTED';
7
+ constructor(dataset, diagnostics) {
8
+ super(`Dataset ${dataset} rejected: ${diagnostics
9
+ .map((diagnostic) => `${diagnostic.code} at ${diagnostic.path} (${diagnostic.message})`)
10
+ .join('; ')}`);
11
+ this.dataset = dataset;
12
+ this.diagnostics = diagnostics;
13
+ this.name = 'DatasetAdmissionError';
14
+ }
15
+ }
16
+ /** Admit Dataset facts through the canonical Kernel Graph admission over the resolved Domain. */
17
+ export function admitDatasetGraph(id, domain, data) {
18
+ try {
19
+ return Graph.admit(data, admissionContext(domain));
20
+ }
21
+ catch (error) {
22
+ if (error instanceof GraphAdmissionError) {
23
+ throw new DatasetAdmissionError(id, error.diagnostics);
24
+ }
25
+ throw error;
26
+ }
27
+ }
28
+ /** Project one resolved Domain closure into the Class knowledge Graph admission requires. */
29
+ export function admissionContext(domain) {
30
+ return {
31
+ inspectClass(key) {
32
+ const definition = classAt(domain, key);
33
+ if (definition === undefined)
34
+ return undefined;
35
+ return definition.kind === 'node'
36
+ ? Object.freeze({ key, kind: 'node', abstract: definition.abstract })
37
+ : Object.freeze({
38
+ key,
39
+ kind: 'edge',
40
+ abstract: definition.abstract,
41
+ orientation: definition.definition.orientation,
42
+ });
43
+ },
44
+ validateProperties(key, props) {
45
+ const definition = classAt(domain, key);
46
+ if (definition === undefined)
47
+ return [];
48
+ return definition.validateProperties(props).map((diagnostic) => Object.freeze({
49
+ code: diagnostic.code,
50
+ path: diagnostic.pointer,
51
+ message: diagnostic.message,
52
+ }));
53
+ },
54
+ validateEndpoints(edgeKey, sourceKey, targetKey) {
55
+ const edge = classAt(domain, edgeKey);
56
+ if (edge?.kind !== 'edge')
57
+ return [];
58
+ const source = sourceKey === undefined ? undefined : classAt(domain, sourceKey);
59
+ const target = targetKey === undefined ? undefined : classAt(domain, targetKey);
60
+ if ((sourceKey !== undefined && source?.kind !== 'node') ||
61
+ (targetKey !== undefined && target?.kind !== 'node')) {
62
+ return [];
63
+ }
64
+ const accepts = (node, values) => values.some((value) => nodeSatisfies(domain, node, value));
65
+ if (edge.definition.orientation === 'directed') {
66
+ const diagnostics = [];
67
+ if (source?.kind === 'node' && !accepts(source, edge.definition.endpoints.source.accepts)) {
68
+ diagnostics.push(endpointDiagnostic('/source', `${sourceKey} is not accepted at source.`));
69
+ }
70
+ if (target?.kind === 'node' && !accepts(target, edge.definition.endpoints.target.accepts)) {
71
+ diagnostics.push(endpointDiagnostic('/target', `${targetKey} is not accepted at target.`));
72
+ }
73
+ return diagnostics;
74
+ }
75
+ const [first, second] = edge.definition.endpoints;
76
+ const sourceFirst = source?.kind !== 'node' || accepts(source, first.accepts);
77
+ const sourceSecond = source?.kind !== 'node' || accepts(source, second.accepts);
78
+ const targetFirst = target?.kind !== 'node' || accepts(target, first.accepts);
79
+ const targetSecond = target?.kind !== 'node' || accepts(target, second.accepts);
80
+ return (sourceFirst && targetSecond) || (sourceSecond && targetFirst)
81
+ ? []
82
+ : [endpointDiagnostic('/endpoints', `${sourceKey} and ${targetKey} are not assignable.`)];
83
+ },
84
+ };
85
+ }
86
+ function endpointDiagnostic(path, message) {
87
+ return Object.freeze({ code: 'GRAPH_ENDPOINT_CLASS', path, message });
88
+ }
89
+ function nodeSatisfies(domain, node, target) {
90
+ if (sameRef(node.ref, target) || sameRef(target, K.classes.Node.ref))
91
+ return true;
92
+ const selected = classAt(domain, ClassKeyValue.of(target));
93
+ return selected?.kind === 'node' && node.satisfies(selected);
94
+ }
95
+ function classAt(domain, key) {
96
+ const definition = domain.definition(ClassKeyValue.ref(key));
97
+ return definition !== undefined && isResolvedClass(definition) ? definition : undefined;
98
+ }
99
+ function isResolvedClass(input) {
100
+ return (typeof input === 'object' &&
101
+ input !== null &&
102
+ 'ref' in input &&
103
+ input.ref.kind === 'class');
104
+ }
105
+ function sameRef(left, right) {
106
+ return left.origin === right.origin && left.kind === right.kind && left.name === right.name;
107
+ }
@@ -0,0 +1,42 @@
1
+ import type { Edge } from '../../platform/graph/edge/index.js';
2
+ import type { Node, NodeId } from '../../platform/graph/node/index.js';
3
+ import type { PropertyInputOf, ResolvedClass, schema } from '../../platform/schema/index.js';
4
+ import type { DatasetNode, DatasetReferences } from './dataset.js';
5
+ import { type DatasetReferenceInput } from './references.js';
6
+ /** Resolved Classes of the exact authored Schema, keyed by their authored names. */
7
+ export type DatasetClasses<Schema extends schema.DomainSchema> = schema.DomainOf<Schema>['classes'];
8
+ /** One Dataset Node, or one Node identity that names a Node already added to the same Dataset. */
9
+ export type DatasetEndpoint = Node | NodeId | string;
10
+ export interface DatasetNodeInput<Class extends ResolvedClass<'node'>> {
11
+ /** Stable identity within the Dataset; derived from the Class name and insertion order when omitted. */
12
+ readonly id?: string;
13
+ readonly props?: PropertyInputOf<Class>;
14
+ }
15
+ export interface DatasetEdgeInput<Class extends ResolvedClass<'edge'>> {
16
+ readonly slug?: string;
17
+ readonly props?: PropertyInputOf<Class>;
18
+ }
19
+ /** Graph authoring surface handed to one Dataset definition. Facts are canonical Kernel values. */
20
+ export interface DatasetGraph<Schema extends schema.DomainSchema> {
21
+ /** The exact resolved Domain, including dependency Domains under their authored aliases. */
22
+ readonly domain: schema.DomainOf<Schema>;
23
+ readonly classes: DatasetClasses<Schema>;
24
+ /** Materialize one local or direct-dependency projected Node, retaining its reference identity. */
25
+ ref(input: DatasetReferenceInput): DatasetNode;
26
+ node<Class extends ResolvedClass<'node'>>(definition: Class, input?: DatasetNodeInput<Class>): DatasetNode<Class>;
27
+ edge<Class extends ResolvedClass<'edge'>>(definition: Class, source: DatasetEndpoint, target: DatasetEndpoint, input?: DatasetEdgeInput<Class>): Edge;
28
+ }
29
+ export interface DatasetFacts {
30
+ readonly references: DatasetReferences;
31
+ readonly nodes: readonly Node[];
32
+ readonly edges: readonly Edge[];
33
+ /** Exact Node values handed out by `node()`, for variable admission by identity. */
34
+ readonly created: ReadonlySet<Node>;
35
+ }
36
+ export interface DatasetGraphSession<Schema extends schema.DomainSchema> {
37
+ readonly graph: DatasetGraph<Schema>;
38
+ /** Reject any later fact authoring and return the authored facts in insertion order. */
39
+ seal(): DatasetFacts;
40
+ }
41
+ /** Open one authoring session over a resolved Domain. Authored facts stay un-admitted until sealed. */
42
+ export declare function openDatasetGraph<Schema extends schema.DomainSchema>(domain: schema.ResolvedDomainOf<Schema>): DatasetGraphSession<Schema>;
@@ -0,0 +1,127 @@
1
+ import { edge as graphEdge, EdgeSlug } from '../../platform/graph/edge/index.js';
2
+ import { node as graphNode, NodeId as admitNodeId } from '../../platform/graph/node/index.js';
3
+ import { Path } from '../../platform/graph/path/index.js';
4
+ import { ClassKey } from '../../platform/schema/index.js';
5
+ import { datasetReferenceNodes } from './references.js';
6
+ /** Open one authoring session over a resolved Domain. Authored facts stay un-admitted until sealed. */
7
+ export function openDatasetGraph(domain) {
8
+ const nodes = [];
9
+ const edges = [];
10
+ const byId = new Map();
11
+ const created = new Set();
12
+ const ordinals = new Map();
13
+ const references = {};
14
+ let projected;
15
+ let referenceOrdinal = 0;
16
+ let sealed = false;
17
+ const graph = Object.freeze({
18
+ domain,
19
+ classes: domain.classes,
20
+ ref(input) {
21
+ open();
22
+ const ref = 'ref' in input ? input.ref : input;
23
+ const path = Path.project(ref).raw;
24
+ const existing = references[path];
25
+ if (existing !== undefined)
26
+ return byId.get(existing);
27
+ projected ??= datasetReferenceNodes(domain);
28
+ const facts = projected.get(path);
29
+ if (facts === undefined)
30
+ throw new TypeError(`Dataset reference ${path} is not local or a direct dependency member.`);
31
+ let id;
32
+ do {
33
+ id = admitNodeId(`reference-${++referenceOrdinal}`);
34
+ } while (byId.has(id));
35
+ const value = graphNode({ id, class: facts.class, props: facts.props });
36
+ nodes.push(value);
37
+ byId.set(id, value);
38
+ created.add(value);
39
+ references[path] = id;
40
+ return value;
41
+ },
42
+ node(definition, input = {}) {
43
+ open();
44
+ acceptClass(definition, 'node');
45
+ acceptInput(input, ['id', 'props'], 'Dataset node input');
46
+ const id = admitNodeId(input.id ?? nextId(definition));
47
+ if (byId.has(id))
48
+ throw new TypeError(`Dataset Node ${id} is already defined.`);
49
+ const value = graphNode({
50
+ id,
51
+ class: ClassKey.of(definition.ref),
52
+ props: definition.properties.from(input.props ?? {}),
53
+ });
54
+ nodes.push(value);
55
+ byId.set(id, value);
56
+ created.add(value);
57
+ return value;
58
+ },
59
+ edge(definition, source, target, input = {}) {
60
+ open();
61
+ acceptClass(definition, 'edge');
62
+ acceptInput(input, ['slug', 'props'], 'Dataset edge input');
63
+ const value = graphEdge({
64
+ source: endpoint(source, 'source'),
65
+ target: endpoint(target, 'target'),
66
+ class: ClassKey.of(definition.ref),
67
+ ...(input.slug === undefined ? {} : { slug: EdgeSlug(input.slug) }),
68
+ props: definition.properties.from(input.props ?? {}),
69
+ });
70
+ edges.push(value);
71
+ return value;
72
+ },
73
+ });
74
+ return Object.freeze({
75
+ graph,
76
+ seal() {
77
+ sealed = true;
78
+ return Object.freeze({
79
+ nodes: Object.freeze([...nodes]),
80
+ edges: Object.freeze([...edges]),
81
+ created,
82
+ references: Object.freeze({ ...references }),
83
+ });
84
+ },
85
+ });
86
+ function open() {
87
+ if (sealed)
88
+ throw new TypeError('Dataset graph cannot change after its definition completes.');
89
+ }
90
+ function nextId(definition) {
91
+ const name = definition.ref.name;
92
+ const ordinal = (ordinals.get(name) ?? 0) + 1;
93
+ ordinals.set(name, ordinal);
94
+ return `${name}-${ordinal}`;
95
+ }
96
+ function endpoint(input, role) {
97
+ const id = typeof input === 'string'
98
+ ? admitNodeId(input)
99
+ : input !== null && typeof input === 'object' && typeof input.id === 'string'
100
+ ? admitNodeId(input.id)
101
+ : invalidEndpoint(role);
102
+ if (!byId.has(id)) {
103
+ throw new TypeError(`Dataset edge ${role} ${id} is not a Node of this Dataset.`);
104
+ }
105
+ return id;
106
+ }
107
+ }
108
+ function acceptClass(definition, kind) {
109
+ if (definition === null ||
110
+ typeof definition !== 'object' ||
111
+ definition.kind !== kind ||
112
+ definition.ref?.kind !== 'class') {
113
+ throw new TypeError(`Dataset ${kind} requires a resolved ${kind} Class.`);
114
+ }
115
+ }
116
+ function acceptInput(input, allowed, label) {
117
+ if (input === null || typeof input !== 'object' || Array.isArray(input)) {
118
+ throw new TypeError(`${label} must be an object.`);
119
+ }
120
+ const unknown = Reflect.ownKeys(input).find((key) => typeof key !== 'string' || !allowed.includes(key));
121
+ if (unknown !== undefined) {
122
+ throw new TypeError(`${label} may contain only ${allowed.join(' and ')}.`);
123
+ }
124
+ }
125
+ function invalidEndpoint(role) {
126
+ throw new TypeError(`Dataset edge ${role} must be a Dataset Node or a Node identity.`);
127
+ }
@@ -0,0 +1,6 @@
1
+ import type { schema as schemaLanguage } from '../../platform/schema/index.js';
2
+ import type { Dataset, DatasetJson } from './dataset.js';
3
+ /** Encode exact portable Dataset bytes without retaining runtime object identity. */
4
+ export declare function encodeDataset(dataset: Dataset): DatasetJson;
5
+ /** Decode one portable Dataset and re-admit its facts against the exact authored Schema. */
6
+ export declare function decodeDataset<const Schema extends schemaLanguage.DomainSchema>(source: Schema, input: unknown): Dataset<Schema>;
@@ -0,0 +1,113 @@
1
+ import { GraphData } from '../../platform/graph/document/index.js';
2
+ import { isNodeId } from '../../platform/graph/node/index.js';
3
+ import { schema as schemaApi } from '../../platform/schema/index.js';
4
+ import { admitDatasetGraph } from './admission.js';
5
+ import { DATASET_FORMAT, DATASET_VERSION } from './dataset.js';
6
+ import { admitId, admitText, admitVariableName, assembleDataset } from './define.js';
7
+ import { decodeDatasetReferences } from './references.js';
8
+ /** Encode exact portable Dataset bytes without retaining runtime object identity. */
9
+ export function encodeDataset(dataset) {
10
+ const variables = Object.freeze(Object.fromEntries(Object.entries(dataset.variables)
11
+ .sort(([left], [right]) => compare(left, right))
12
+ .map(([name, value]) => [name, encodeVariable(value)])));
13
+ return Object.freeze({
14
+ format: DATASET_FORMAT,
15
+ version: DATASET_VERSION,
16
+ id: dataset.id,
17
+ ...(dataset.title === undefined ? {} : { title: dataset.title }),
18
+ ...(dataset.description === undefined ? {} : { description: dataset.description }),
19
+ domain: Object.freeze({
20
+ origin: dataset.schema.origin,
21
+ revision: schemaApi.revision(dataset.schema),
22
+ }),
23
+ graph: GraphData.encode({ nodes: dataset.nodes, edges: dataset.edges }),
24
+ variables,
25
+ references: dataset.references,
26
+ });
27
+ }
28
+ /** Decode one portable Dataset and re-admit its facts against the exact authored Schema. */
29
+ export function decodeDataset(source, input) {
30
+ if (!isRecord(input))
31
+ invalid('Dataset must be an object.');
32
+ exactKeys(input, [
33
+ 'format',
34
+ 'version',
35
+ 'id',
36
+ 'title',
37
+ 'description',
38
+ 'domain',
39
+ 'graph',
40
+ 'variables',
41
+ 'references',
42
+ ], ['format', 'version', 'id', 'domain', 'graph', 'variables', 'references'], 'Dataset');
43
+ if (input.format !== DATASET_FORMAT || input.version !== DATASET_VERSION) {
44
+ invalid('Dataset format or version is unsupported.');
45
+ }
46
+ const id = admitId(input.id);
47
+ const title = admitText(input.title, 'title');
48
+ const description = admitText(input.description, 'description');
49
+ if (!isRecord(input.domain))
50
+ invalid('Dataset domain must be an object.');
51
+ exactKeys(input.domain, ['origin', 'revision'], ['origin', 'revision'], 'Dataset domain');
52
+ if (input.domain.origin !== source.origin) {
53
+ invalid(`Dataset ${id} belongs to Domain ${String(input.domain.origin)}, not ${source.origin}.`);
54
+ }
55
+ const revision = schemaApi.revision(source);
56
+ if (input.domain.revision !== revision) {
57
+ invalid(`Dataset ${id} was encoded for Schema revision ${String(input.domain.revision)}.`);
58
+ }
59
+ const domain = schemaApi.resolve(source);
60
+ const graph = admitDatasetGraph(id, domain, GraphData.decode(input.graph));
61
+ const variables = decodeVariables(input.variables, graph);
62
+ const references = decodeDatasetReferences(input.references, domain, graph);
63
+ return assembleDataset({ schema: source, id, title, description, graph, variables, references });
64
+ }
65
+ function encodeVariable(value) {
66
+ return Array.isArray(value)
67
+ ? Object.freeze({ nodes: Object.freeze(value.map((node) => node.id)) })
68
+ : Object.freeze({ node: value.id });
69
+ }
70
+ function decodeVariables(input, graph) {
71
+ if (!isRecord(input))
72
+ invalid('Dataset variables must be an object.');
73
+ return Object.freeze(Object.fromEntries(Object.entries(input)
74
+ .sort(([left], [right]) => compare(left, right))
75
+ .map(([name, value]) => [name, decodeVariable(name, value, graph)])));
76
+ }
77
+ function decodeVariable(name, input, graph) {
78
+ admitVariableName(name);
79
+ if (!isRecord(input))
80
+ invalid(`Dataset variable ${name} is invalid.`);
81
+ if ('node' in input) {
82
+ exactKeys(input, ['node'], ['node'], `Dataset variable ${name}`);
83
+ return requiredNode(graph, input.node, name);
84
+ }
85
+ exactKeys(input, ['nodes'], ['nodes'], `Dataset variable ${name}`);
86
+ if (!Array.isArray(input.nodes))
87
+ invalid(`Dataset variable ${name} nodes must be an array.`);
88
+ return Object.freeze(input.nodes.map((id) => requiredNode(graph, id, name)));
89
+ }
90
+ function requiredNode(graph, input, name) {
91
+ if (!isNodeId(input))
92
+ invalid(`Dataset variable ${name} has an invalid Node ID.`);
93
+ const node = graph.nodes.byId(input);
94
+ if (node === undefined)
95
+ invalid(`Dataset variable ${name} references missing Node ${input}.`);
96
+ return node;
97
+ }
98
+ function exactKeys(input, allowed, required, label) {
99
+ const actual = Reflect.ownKeys(input);
100
+ if (actual.some((key) => typeof key !== 'string' || !allowed.includes(key)) ||
101
+ required.some((key) => !actual.includes(key))) {
102
+ invalid(`${label} has unknown or missing fields.`);
103
+ }
104
+ }
105
+ function isRecord(input) {
106
+ return input !== null && typeof input === 'object' && !Array.isArray(input);
107
+ }
108
+ function compare(left, right) {
109
+ return left < right ? -1 : left > right ? 1 : 0;
110
+ }
111
+ function invalid(message) {
112
+ throw new TypeError(message);
113
+ }
@@ -0,0 +1,58 @@
1
+ import type { Graph, GraphDataJson } from '../../platform/graph/document/index.js';
2
+ import type { Edge } from '../../platform/graph/edge/index.js';
3
+ import type { Node, NodeId } from '../../platform/graph/node/index.js';
4
+ import type { ResolvedClass, schema } from '../../platform/schema/index.js';
5
+ export declare const DATASET_FORMAT: 'astrale.sdk.dataset';
6
+ export declare const DATASET_VERSION: 1;
7
+ declare const DATASET_NODE_CLASS: unique symbol;
8
+ /** One canonical Node fact retaining its exact authored Class as a type-only witness. */
9
+ export type DatasetNode<Class extends ResolvedClass<'node'> = ResolvedClass<'node'>> = Node & {
10
+ readonly [DATASET_NODE_CLASS]: Class;
11
+ };
12
+ /** Canonical projected NodePath → explicit Dataset Node identity. */
13
+ export type DatasetReferences = Readonly<Record<string, NodeId>>;
14
+ export type DatasetVariable = DatasetNode | readonly DatasetNode[];
15
+ export type DatasetVariables = Readonly<Record<string, DatasetVariable>>;
16
+ /**
17
+ * One named, self-contained set of demo graph facts admitted against one exact Schema.
18
+ * It owns no deployment, authority, or execution policy; it is inert authoring material that
19
+ * tooling may render, encode, or seed.
20
+ */
21
+ export interface Dataset<Schema extends schema.DomainSchema = schema.DomainSchema, Variables extends DatasetVariables = DatasetVariables> {
22
+ readonly kind: 'dataset';
23
+ readonly schema: Schema;
24
+ readonly id: string;
25
+ readonly title?: string;
26
+ readonly description?: string;
27
+ /** Immutable indexed Kernel Graph over exactly the admitted facts below. */
28
+ readonly graph: Graph;
29
+ readonly nodes: readonly Node[];
30
+ readonly edges: readonly Edge[];
31
+ /** Named entry points into the facts, for tooling and tests. */
32
+ readonly references: DatasetReferences;
33
+ readonly variables: Variables;
34
+ }
35
+ export type DatasetVariableJson = {
36
+ readonly node: string;
37
+ } | {
38
+ readonly nodes: readonly string[];
39
+ };
40
+ /** Portable Dataset bytes; decoding re-admits the facts against the exact same Schema revision. */
41
+ export interface DatasetJson {
42
+ readonly format: typeof DATASET_FORMAT;
43
+ readonly version: typeof DATASET_VERSION;
44
+ readonly id: string;
45
+ readonly title?: string;
46
+ readonly description?: string;
47
+ readonly domain: {
48
+ readonly origin: string;
49
+ readonly revision: string;
50
+ };
51
+ readonly graph: GraphDataJson;
52
+ readonly references: Readonly<Record<string, string>>;
53
+ readonly variables: Readonly<Record<string, DatasetVariableJson>>;
54
+ }
55
+ export type SchemaOfDataset<Value> = Value extends {
56
+ readonly schema: infer Schema;
57
+ } ? Extract<Schema, schema.DomainSchema> : never;
58
+ export {};
@@ -0,0 +1,2 @@
1
+ export const DATASET_FORMAT = 'astrale.sdk.dataset';
2
+ export const DATASET_VERSION = 1;
@@ -0,0 +1,33 @@
1
+ import type { Graph } from '../../platform/graph/document/index.js';
2
+ import type { schema as schemaLanguage } from '../../platform/schema/index.js';
3
+ import type { DatasetGraph } from './builder.js';
4
+ import type { Dataset, DatasetReferences, DatasetVariables } from './dataset.js';
5
+ /** Variables returned by one graph author; `void` means the Dataset names no entry point. */
6
+ export type AuthoredDatasetVariables = DatasetVariables | void;
7
+ /** The exact variables record retained by a Dataset for one authored return type. */
8
+ export type DatasetVariablesOf<Value> = [Value] extends [void] ? Readonly<Record<never, never>> : Value extends DatasetVariables ? Value : never;
9
+ export interface DatasetInput<Schema extends schemaLanguage.DomainSchema, Variables extends AuthoredDatasetVariables> {
10
+ /** Stable lowercase identity, unique within one Application. */
11
+ readonly id: string;
12
+ readonly title?: string;
13
+ readonly description?: string;
14
+ /** Author every fact through the canonical graph surface; returned entries become named variables. */
15
+ readonly graph: (graph: DatasetGraph<Schema>) => Variables;
16
+ }
17
+ /** Define one inert, schema-admitted demo Dataset. Facts are validated exactly once, here. */
18
+ export declare function defineDataset<const Schema extends schemaLanguage.DomainSchema, Variables extends AuthoredDatasetVariables = void>(source: Schema, input: DatasetInput<Schema, Variables>): Dataset<Schema, DatasetVariablesOf<Variables>>;
19
+ /** True only for a Dataset produced by defineDataset or decodeDataset in this SDK package root. */
20
+ export declare function isDataset(input: unknown): input is Dataset;
21
+ /** Freeze one admitted Dataset value; shared by definition and decoding. */
22
+ export declare function assembleDataset<Schema extends schemaLanguage.DomainSchema>(input: {
23
+ readonly schema: Schema;
24
+ readonly id: string;
25
+ readonly title: string | undefined;
26
+ readonly description: string | undefined;
27
+ readonly graph: Graph;
28
+ readonly references: DatasetReferences;
29
+ readonly variables: DatasetVariables;
30
+ }): Dataset<Schema>;
31
+ export declare function admitId(input: unknown): string;
32
+ export declare function admitText(input: unknown, label: string): string | undefined;
33
+ export declare function admitVariableName(input: string): string;
@@ -0,0 +1,105 @@
1
+ import { schema as schemaApi } from '../../platform/schema/index.js';
2
+ import { admitDatasetGraph } from './admission.js';
3
+ import { openDatasetGraph } from './builder.js';
4
+ const DATASET_ID = /^[a-z][a-z0-9]*(?:[.-][a-z0-9]+)*$/u;
5
+ const VARIABLE_NAME = /^[A-Za-z][A-Za-z0-9_]*$/u;
6
+ const admittedDatasets = new WeakSet();
7
+ /** Define one inert, schema-admitted demo Dataset. Facts are validated exactly once, here. */
8
+ export function defineDataset(source, input) {
9
+ if (input === null || typeof input !== 'object' || Array.isArray(input))
10
+ invalid();
11
+ const allowed = new Set(['id', 'title', 'description', 'graph']);
12
+ if (Reflect.ownKeys(input).some((key) => !allowed.has(key)))
13
+ invalid();
14
+ const id = admitId(input.id);
15
+ const title = admitText(input.title, 'title');
16
+ const description = admitText(input.description, 'description');
17
+ if (typeof input.graph !== 'function')
18
+ throw new TypeError('Dataset graph must be a function.');
19
+ const domain = schemaApi.resolve(source);
20
+ const session = openDatasetGraph(domain);
21
+ const returned = input.graph(session.graph);
22
+ const facts = session.seal();
23
+ const graph = admitDatasetGraph(id, domain, { nodes: facts.nodes, edges: facts.edges });
24
+ const variables = admitVariables(returned, facts.created, graph);
25
+ return assembleDataset({
26
+ schema: source,
27
+ id,
28
+ title,
29
+ description,
30
+ graph,
31
+ variables,
32
+ references: facts.references,
33
+ });
34
+ }
35
+ /** True only for a Dataset produced by defineDataset or decodeDataset in this SDK package root. */
36
+ export function isDataset(input) {
37
+ return input !== null && typeof input === 'object' && admittedDatasets.has(input);
38
+ }
39
+ /** Freeze one admitted Dataset value; shared by definition and decoding. */
40
+ export function assembleDataset(input) {
41
+ const data = input.graph.toData();
42
+ const dataset = Object.freeze({
43
+ kind: 'dataset',
44
+ schema: input.schema,
45
+ id: input.id,
46
+ ...(input.title === undefined ? {} : { title: input.title }),
47
+ ...(input.description === undefined ? {} : { description: input.description }),
48
+ graph: input.graph,
49
+ nodes: data.nodes,
50
+ edges: data.edges,
51
+ variables: input.variables,
52
+ references: input.references,
53
+ });
54
+ admittedDatasets.add(dataset);
55
+ return dataset;
56
+ }
57
+ export function admitId(input) {
58
+ if (typeof input !== 'string' || !DATASET_ID.test(input)) {
59
+ throw new TypeError(`Dataset id ${JSON.stringify(input)} is invalid.`);
60
+ }
61
+ return input;
62
+ }
63
+ export function admitText(input, label) {
64
+ if (input === undefined)
65
+ return undefined;
66
+ if (typeof input !== 'string' || input.trim().length === 0) {
67
+ throw new TypeError(`Dataset ${label} must be a non-empty string.`);
68
+ }
69
+ return input;
70
+ }
71
+ export function admitVariableName(input) {
72
+ if (!VARIABLE_NAME.test(input))
73
+ throw new TypeError(`Dataset variable ${input} is invalid.`);
74
+ return input;
75
+ }
76
+ /** Resolve authored variables to the admitted Node values of the sealed Graph. */
77
+ function admitVariables(input, created, graph) {
78
+ if (input === undefined)
79
+ return Object.freeze({});
80
+ if (input === null || typeof input !== 'object' || Array.isArray(input)) {
81
+ throw new TypeError('Dataset graph must return named variables or nothing.');
82
+ }
83
+ const entries = Object.entries(input)
84
+ .sort(([left], [right]) => compare(left, right))
85
+ .map(([name, value]) => {
86
+ admitVariableName(name);
87
+ const resolve = (candidate) => {
88
+ if (!created.has(candidate)) {
89
+ throw new TypeError(`Dataset variable ${name} must reference Nodes of this Dataset.`);
90
+ }
91
+ return graph.nodes.byId(candidate.id);
92
+ };
93
+ const variable = Array.isArray(value)
94
+ ? Object.freeze(value.map(resolve))
95
+ : resolve(value);
96
+ return [name, variable];
97
+ });
98
+ return Object.freeze(Object.fromEntries(entries));
99
+ }
100
+ function compare(left, right) {
101
+ return left < right ? -1 : left > right ? 1 : 0;
102
+ }
103
+ function invalid() {
104
+ throw new TypeError('Dataset definition may contain only id, title, description, and graph.');
105
+ }
@@ -0,0 +1,8 @@
1
+ export { DatasetAdmissionError } from './admission.js';
2
+ export type { DatasetClasses, DatasetEdgeInput, DatasetEndpoint, DatasetGraph, DatasetNodeInput, } from './builder.js';
3
+ export { decodeDataset, encodeDataset } from './codec.js';
4
+ export { DATASET_FORMAT, DATASET_VERSION } from './dataset.js';
5
+ export type { Dataset, DatasetJson, DatasetNode, DatasetReferences, DatasetVariable, DatasetVariableJson, DatasetVariables, SchemaOfDataset, } from './dataset.js';
6
+ export { defineDataset, isDataset } from './define.js';
7
+ export type { AuthoredDatasetVariables, DatasetInput, DatasetVariablesOf } from './define.js';
8
+ export type { DatasetReferenceInput } from './references.js';
@@ -0,0 +1,4 @@
1
+ export { DatasetAdmissionError } from './admission.js';
2
+ export { decodeDataset, encodeDataset } from './codec.js';
3
+ export { DATASET_FORMAT, DATASET_VERSION } from './dataset.js';
4
+ export { defineDataset, isDataset } from './define.js';
@@ -0,0 +1,14 @@
1
+ import type { Graph } from '../../platform/graph/document/index.js';
2
+ import type { Node } from '../../platform/graph/node/index.js';
3
+ import type { ClassRef, CoreRef, FunctionRef, PolicyRef, ViewRef, schema } from '../../platform/schema/index.js';
4
+ import type { DatasetReferences } from './dataset.js';
5
+ type DatasetProjectionRef = ClassRef | FunctionRef | PolicyRef | ViewRef | CoreRef;
6
+ export type DatasetReferenceInput = DatasetProjectionRef | {
7
+ readonly ref: DatasetProjectionRef;
8
+ };
9
+ type ReferenceNode = Pick<Node, 'class' | 'props'>;
10
+ /** Symbolic projection supplies facts; only an explicit Dataset reference supplies identity. */
11
+ export declare function datasetReferenceNodes(domain: schema.ResolvedDomainOf<schema.DomainSchema>): ReadonlyMap<string, ReferenceNode>;
12
+ /** Serialized reference associations lose their proof and must match the exact projection again. */
13
+ export declare function decodeDatasetReferences(input: unknown, domain: schema.ResolvedDomainOf<schema.DomainSchema>, graph: Graph): DatasetReferences;
14
+ export {};