@astrale-os/kernel-dsl 0.2.0-beta.22 → 0.2.0-beta.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,7 +17,7 @@ export type { CoreEdge, CoreEndpoint, CoreInput, CoreNode } from './core/authori
17
17
  export type { AuthoredPropertyProjection, AuthoredMethodProjection, Class, ClassIdentityProjection, ClassOwnerProjection, ClassReferenceProjection, ClassReferenceInput as ClassReference, DirectedEdgeInput, DirectedEdgeClass, DirectedSourceInput, DirectedTargetInput, EdgeClassCommon, EdgeClassInput, EdgeClass, EdgeClassReferenceInput as EdgeClassReference, IncidentEndpointInput, NodeClass, NodeClassInput, NodeClassReferenceInput as NodeClassReference, UndirectedEdgeInput, UndirectedEdgeClass, } from './class/authoring.js';
18
18
  export type { PathAuthoring } from './value/path.js';
19
19
  export type { Lazy } from './schema/lazy.js';
20
- export type { MatchPolicyInput, Policy, PolicyBuilder as PolicyFactory, PolicyEdgeInput, PolicyExistsContext, PolicyInput, PolicyPatternContext, } from './policy/authoring.js';
20
+ export type { MatchPolicyInput, Policy, PolicyBuilder as PolicyFactory, PolicyEdgeInput, PolicyExistsContext, PolicyInput, PolicyNodeBinder, PolicyPatternContext, } from './policy/authoring.js';
21
21
  export type { AutoOptions, AutoProperty, Property, PropertyFieldInput as PropertyField, PropertyOptions, ValueSchemaInput, } from './class/property.js';
22
22
  export type { CorePropertyInput } from './schema/projection.js';
23
23
  export type { ClassProjection, FunctionProjection, MethodProjection, PropertyProjection, } from './schema/projection.js';
@@ -12,8 +12,13 @@ export interface PolicyEdgeInput {
12
12
  readonly max: number;
13
13
  };
14
14
  }
15
+ export interface PolicyNodeBinder {
16
+ (): CanonicalPolicyPatternTerm;
17
+ (definition: Lazy<NodeClass>): CanonicalPolicyPatternTerm;
18
+ readonly exact: (definition: Lazy<NodeClass>) => CanonicalPolicyPatternTerm;
19
+ }
15
20
  export interface PolicyExistsContext {
16
- node(definition: Lazy<NodeClass>): CanonicalPolicyPatternTerm;
21
+ readonly node: PolicyNodeBinder;
17
22
  }
18
23
  export interface PolicyPatternContext {
19
24
  readonly subject: CanonicalPolicyPatternTerm;
@@ -49,16 +49,36 @@ export function createPatternContext(options) {
49
49
  },
50
50
  exists(build) {
51
51
  const nodes = [];
52
- const where = build({
53
- node(definition) {
54
- const variable = Object.freeze({ kind: 'variable', id: nextVariable++ });
55
- nodes.push({
56
- variable,
57
- class: options.resolveNodeClass(definition, `${options.pointer}/match/exists/nodes`),
58
- });
59
- return variable;
52
+ const bind = (selector, definition) => {
53
+ const variable = Object.freeze({ kind: 'variable', id: nextVariable++ });
54
+ if (selector === 'any') {
55
+ nodes.push({ variable, selector: Object.freeze({ kind: 'any' }) });
56
+ }
57
+ else {
58
+ const classRef = options.resolveNodeClass(definition, `${options.pointer}/match/exists/nodes`);
59
+ nodes.push(selector === 'exact'
60
+ ? { variable, class: classRef }
61
+ : { variable, selector: Object.freeze({ kind: 'satisfies', class: classRef }) });
62
+ }
63
+ return variable;
64
+ };
65
+ const node = function (...args) {
66
+ if (args.length > 1 || (args.length === 1 && args[0] === undefined)) {
67
+ fail('BUILDER_POLICY', `${options.pointer}/match/exists/nodes`, 'node(...) accepts either no arguments or one Node Class.');
68
+ }
69
+ return args.length === 0 ? bind('any') : bind('satisfies', args[0]);
70
+ };
71
+ Object.defineProperty(node, 'exact', {
72
+ enumerable: true,
73
+ value(definition) {
74
+ if (arguments.length !== 1 || definition === undefined) {
75
+ fail('BUILDER_POLICY', `${options.pointer}/match/exists/nodes`, 'node.exact(...) requires exactly one Node Class.');
76
+ }
77
+ return bind('exact', definition);
60
78
  },
61
79
  });
80
+ Object.freeze(node);
81
+ const where = build({ node });
62
82
  if (nodes.length === 0) {
63
83
  fail('BUILDER_POLICY_EMPTY_EXISTS', `${options.pointer}/match/exists/nodes`, 'exists(...) must declare at least one variable Node.');
64
84
  }
@@ -433,9 +433,26 @@ function policyPattern(input, depth, path) {
433
433
  for (const [index, node] of nodes.entries()) {
434
434
  const variablePath = `${nodesPath}/${index}`;
435
435
  const variable = object(node, 'Policy variable', variablePath);
436
- exact(variable, ['variable', 'class'], 'Policy variable', variablePath);
437
436
  policyTerm(variable.variable, true, `${variablePath}/variable`);
438
- definitionRef(variable.class, 'class', 'Policy variable Class', `${variablePath}/class`);
437
+ if (Object.hasOwn(variable, 'class')) {
438
+ exact(variable, ['variable', 'class'], 'Policy variable', variablePath);
439
+ definitionRef(variable.class, 'class', 'Policy variable Class', `${variablePath}/class`);
440
+ }
441
+ else {
442
+ exact(variable, ['variable', 'selector'], 'Policy variable', variablePath);
443
+ const selectorPath = `${variablePath}/selector`;
444
+ const selector = object(variable.selector, 'Policy variable selector', selectorPath);
445
+ if (selector.kind === 'any') {
446
+ exact(selector, ['kind'], 'Policy variable selector', selectorPath);
447
+ }
448
+ else if (selector.kind === 'satisfies') {
449
+ exact(selector, ['kind', 'class'], 'Policy variable selector', selectorPath);
450
+ definitionRef(selector.class, 'class', 'Policy variable selector Class', `${selectorPath}/class`);
451
+ }
452
+ else {
453
+ invalid('Policy variable selector kind', undefined, `${selectorPath}/kind`);
454
+ }
455
+ }
439
456
  }
440
457
  policyPattern(exists.where, depth + 1, `${existsPath}/where`);
441
458
  return;
@@ -3,6 +3,7 @@ import { Key, PropertyKey as PropertyKeyValue } from '../../addressing/index.js'
3
3
  import { compareUnicode } from '../../addressing/ordering.js';
4
4
  import { branchesOf, branchProduct, capBranches, isConnected, targetMode, termKey, } from '../../language/policy/analysis/branches.js';
5
5
  import { BRANCH_OVERFLOW, MAX_BRANCHES, MAX_CHECK_DEPTH, MAX_CHECK_LEAVES, MAX_DOMAINS, MAX_EDGES, MAX_PATTERN_DEPTH, MAX_REPEAT, MAX_VARIABLES, measureChecks, } from '../../language/policy/analysis/budgets.js';
6
+ import { policyVariableClass } from '../../language/policy/model/policy.js';
6
7
  import { normalizePolicyChecks, normalizePolicyExpression, } from '../../language/policy/normalization/normalize.js';
7
8
  import { validateValueProgram } from '../../language/value/evaluate/program.js';
8
9
  import { GRAPH_NODE_PATH_SCHEMA_ID } from '../../language/value/syntax/node-path/schema.js';
@@ -386,8 +387,9 @@ function validatePattern(context, expression, path, scope, declared) {
386
387
  fail(`${path}/exists/nodes/${index}/variable/id`, 'Policy variable IDs must be globally unique and cannot shadow.');
387
388
  declared.add(id);
388
389
  nested.add(id);
389
- if (context.classes.get(Key.of(node.class))?.value.kind !== 'node')
390
- fail(`${path}/exists/nodes/${index}/class`, 'Policy variable Class must resolve to a Node Class.');
390
+ const classRef = policyVariableClass(node);
391
+ if (classRef !== undefined && context.classes.get(Key.of(classRef))?.value.kind !== 'node')
392
+ fail(`${path}/exists/nodes/${index}/${'class' in node ? 'class' : 'selector/class'}`, 'Policy variable Class must resolve to a Node Class.');
391
393
  }
392
394
  validatePattern(context, expression.exists.where, `${path}/exists/where`, nested, declared);
393
395
  return;
@@ -732,8 +734,14 @@ class CompiledPolicyTyping {
732
734
  ? this.applyExact(candidates, contract.ref)
733
735
  : uniqueCompiledCandidates(this.allNodeClasses.flatMap((ref) => this.applyExact(candidates, ref)));
734
736
  }
735
- const exact = branch.variables.get(term);
736
- return exact === undefined ? [] : this.applyExact(candidates, exact);
737
+ const selector = branch.variables.get(term);
738
+ if (selector === undefined)
739
+ return [];
740
+ if (selector.kind === 'exact')
741
+ return this.applyExact(candidates, selector.class);
742
+ if (selector.kind === 'any')
743
+ return candidates;
744
+ return this.applyRequirement(candidates, selector.class);
737
745
  }
738
746
  applyExact(candidates, exact) {
739
747
  return uniqueCompiledCandidates(candidates.flatMap((candidate) => {
@@ -751,6 +759,22 @@ class CompiledPolicyTyping {
751
759
  .filter((ref) => candidate.requirements.every((required) => classSatisfiesAny(this.context, ref, [required])))
752
760
  .map((ref) => ({ kind: 'exact', ref }))));
753
761
  }
762
+ applyRequirement(candidates, required) {
763
+ const result = [];
764
+ for (const candidate of candidates) {
765
+ if (candidate.kind === 'exact') {
766
+ if (classSatisfiesAny(this.context, candidate.ref, [required]))
767
+ result.push(candidate);
768
+ }
769
+ else {
770
+ result.push({
771
+ kind: 'open',
772
+ requirements: uniqueClassRefs([...candidate.requirements, required]),
773
+ });
774
+ }
775
+ }
776
+ return uniqueCompiledCandidates(result);
777
+ }
754
778
  applyEndpoint(candidates, accepts) {
755
779
  const result = [];
756
780
  for (const candidate of candidates) {
@@ -873,7 +897,10 @@ function measureCompiledPattern(pattern, origin) {
873
897
  edgeCounts: child.edgeCounts,
874
898
  domains: new Set([
875
899
  ...child.domains,
876
- ...pattern.exists.nodes.map(({ class: ref }) => ref.origin),
900
+ ...pattern.exists.nodes.flatMap((node) => {
901
+ const ref = policyVariableClass(node);
902
+ return ref === undefined ? [] : [ref.origin];
903
+ }),
877
904
  ]),
878
905
  };
879
906
  }
@@ -20,6 +20,7 @@ export type { Definition } from './definition.js';
20
20
  export type { ResolvedDefinition, ResolvedDefinitionOf } from './resolved.js';
21
21
  export type { Diagnostic, DiagnosticCode } from './validation/diagnostic.js';
22
22
  export type * from './policy/model/policy.js';
23
+ export { policyVariableClass, policyVariableSelector } from './policy/model/policy.js';
23
24
  export type * from './policy/resolved.js';
24
25
  export type * from './view/model/view.js';
25
26
  export type * from './view/resolved.js';
@@ -1,2 +1,3 @@
1
1
  export { stateMachine } from './state/index.js';
2
2
  export { PropertyValues } from './class/property-values.js';
3
+ export { policyVariableClass, policyVariableSelector } from './policy/model/policy.js';
@@ -1,8 +1,7 @@
1
- import type { ClassRef } from '../../../addressing/index.js';
2
- import type { PolicyEdgePattern, PolicyPatternExpression, PolicyPatternTerm } from '../model/policy.js';
1
+ import type { PolicyEdgePattern, PolicyPatternExpression, PolicyPatternTerm, PolicyVariableSelector } from '../model/policy.js';
3
2
  export interface PatternBranch {
4
3
  readonly edges: readonly PatternEdgeUse[];
5
- readonly variables: ReadonlyMap<string, ClassRef>;
4
+ readonly variables: ReadonlyMap<string, PolicyVariableSelector>;
6
5
  readonly requiredVariables: ReadonlySet<string>;
7
6
  readonly namespace: string;
8
7
  }
@@ -1,3 +1,4 @@
1
+ import { policyVariableSelector } from '../model/policy.js';
1
2
  import { BRANCH_OVERFLOW } from './budgets.js';
2
3
  export function branchesOf(pattern, namespace) {
3
4
  const variables = collectVariableClasses(pattern, namespace);
@@ -96,7 +97,7 @@ function collectVariableClasses(pattern, namespace) {
96
97
  const visit = (node) => {
97
98
  if ('exists' in node) {
98
99
  for (const variable of node.exists.nodes) {
99
- result.set(variableKey(namespace, variable.variable.id), variable.class);
100
+ result.set(variableKey(namespace, variable.variable.id), policyVariableSelector(variable));
100
101
  }
101
102
  visit(node.exists.where);
102
103
  }
@@ -1,3 +1,4 @@
1
1
  export type * from './model/policy.js';
2
+ export { policyVariableClass, policyVariableSelector } from './model/policy.js';
2
3
  export type * from './resolved.js';
3
4
  export * from './normalization/normalize.js';
@@ -1 +1,2 @@
1
+ export { policyVariableClass, policyVariableSelector } from './model/policy.js';
1
2
  export * from './normalization/normalize.js';
@@ -11,13 +11,38 @@ export type PolicyPatternTerm = {
11
11
  readonly kind: 'variable';
12
12
  readonly id: number;
13
13
  };
14
- export interface PolicyVariable {
14
+ export interface ExactPolicyVariable {
15
15
  readonly variable: {
16
16
  readonly kind: 'variable';
17
17
  readonly id: number;
18
18
  };
19
19
  readonly class: ClassRef;
20
20
  }
21
+ export interface SelectedPolicyVariable {
22
+ readonly variable: {
23
+ readonly kind: 'variable';
24
+ readonly id: number;
25
+ };
26
+ readonly selector: {
27
+ readonly kind: 'any';
28
+ } | {
29
+ readonly kind: 'satisfies';
30
+ readonly class: ClassRef;
31
+ };
32
+ }
33
+ /**
34
+ * An existential Node binding. The class-bearing legacy form is deliberately retained as the
35
+ * canonical exact selector so persisted V1 DomainSchema documents keep their original meaning.
36
+ */
37
+ export type PolicyVariable = ExactPolicyVariable | SelectedPolicyVariable;
38
+ export type PolicyVariableSelector = {
39
+ readonly kind: 'exact';
40
+ readonly class: ClassRef;
41
+ } | SelectedPolicyVariable['selector'];
42
+ /** Resolve the semantic selector while preserving the legacy exact wire representation. */
43
+ export declare function policyVariableSelector(variable: PolicyVariable): PolicyVariableSelector;
44
+ /** Return the selector's referenced Class, when it has one. */
45
+ export declare function policyVariableClass(variable: PolicyVariable): ClassRef | undefined;
21
46
  export interface PolicyRepeat {
22
47
  readonly min: number;
23
48
  readonly max: number;
@@ -1 +1,9 @@
1
- export {};
1
+ /** Resolve the semantic selector while preserving the legacy exact wire representation. */
2
+ export function policyVariableSelector(variable) {
3
+ return 'class' in variable ? { kind: 'exact', class: variable.class } : variable.selector;
4
+ }
5
+ /** Return the selector's referenced Class, when it has one. */
6
+ export function policyVariableClass(variable) {
7
+ const selector = policyVariableSelector(variable);
8
+ return selector.kind === 'any' ? undefined : selector.class;
9
+ }
@@ -1,5 +1,6 @@
1
1
  import { json } from '@astrale-os/kernel-dsl/value';
2
2
  import { definitionRefIndex, compareDefinitionRefs } from '../../../addressing/ordering.js';
3
+ import { policyVariableSelector } from '../model/policy.js';
3
4
  const textEncoder = new TextEncoder();
4
5
  export function normalizePolicyExpression(value) {
5
6
  if ('match' in value) {
@@ -101,7 +102,7 @@ function canonicalVariableIds(value) {
101
102
  function collectDeclarations(value, result) {
102
103
  if ('exists' in value) {
103
104
  for (const node of value.exists.nodes) {
104
- result.set(node.variable.id, definitionRefIndex(node.class));
105
+ result.set(node.variable.id, selectorSignature(node));
105
106
  }
106
107
  collectDeclarations(value.exists.where, result);
107
108
  return;
@@ -186,10 +187,15 @@ function rewriteVariables(value, ids) {
186
187
  if ('exists' in value) {
187
188
  return {
188
189
  exists: {
189
- nodes: value.exists.nodes.map((node) => ({
190
- variable: { kind: 'variable', id: ids.get(node.variable.id) ?? node.variable.id },
191
- class: node.class,
192
- })),
190
+ nodes: value.exists.nodes.map((node) => {
191
+ const variable = {
192
+ kind: 'variable',
193
+ id: ids.get(node.variable.id) ?? node.variable.id,
194
+ };
195
+ return 'class' in node
196
+ ? { variable, class: node.class }
197
+ : { variable, selector: node.selector };
198
+ }),
193
199
  where: rewriteVariables(value.exists.where, ids),
194
200
  },
195
201
  };
@@ -198,6 +204,10 @@ function rewriteVariables(value, ids) {
198
204
  return { allOf: value.allOf.map((child) => rewriteVariables(child, ids)) };
199
205
  return { anyOf: value.anyOf.map((child) => rewriteVariables(child, ids)) };
200
206
  }
207
+ function selectorSignature(node) {
208
+ const selector = policyVariableSelector(node);
209
+ return selector.kind === 'any' ? 'any' : `${selector.kind}:${definitionRefIndex(selector.class)}`;
210
+ }
201
211
  function rewriteTerm(value, ids) {
202
212
  return value.kind === 'variable' ? { kind: 'variable', id: ids.get(value.id) ?? value.id } : value;
203
213
  }
@@ -1,8 +1,8 @@
1
1
  import { type ZodType } from 'zod';
2
2
  import type { EventName, StateName, StateTopology, TransitionRelation, ValidTransitionRelation } from './topology.js';
3
3
  export interface StateMachine<Transitions extends TransitionRelation = any, Initial extends StateName<Transitions> = StateName<Transitions>> extends StateTopology<Transitions, Initial> {
4
- readonly stateSchema: ZodType<StateName<Transitions>>;
5
- readonly eventSchema: ZodType<EventName<Transitions>>;
4
+ readonly stateSchema: ZodType<StateName<Transitions>, StateName<Transitions>>;
5
+ readonly eventSchema: ZodType<EventName<Transitions>, EventName<Transitions>>;
6
6
  eventsFrom<State extends StateName<Transitions>>(state: State): readonly EventName<Transitions, State>[];
7
7
  decide<State extends StateName<Transitions>, Event extends EventName<Transitions>>(state: State, event: Event): TransitionDecision<Transitions, State, Event>;
8
8
  }
@@ -1,4 +1,5 @@
1
1
  import { compareDefinitionRefs, definitionRefIndex } from '../../addressing/ordering.js';
2
+ import { policyVariableClass } from '../../language/policy/model/policy.js';
2
3
  import { isValueObject as isJsonObject } from '../../language/value/model/object.js';
3
4
  import { walkSchema } from '../../language/value/syntax/walk.js';
4
5
  /** Collect only semantic refs, never strings or objects embedded as JSON data. */
@@ -83,7 +84,11 @@ function collectPolicyPatternRefs(expression, add) {
83
84
  return;
84
85
  }
85
86
  if ('exists' in expression) {
86
- expression.exists.nodes.forEach((node) => add(node.class));
87
+ expression.exists.nodes.forEach((node) => {
88
+ const ref = policyVariableClass(node);
89
+ if (ref !== undefined)
90
+ add(ref);
91
+ });
87
92
  collectPolicyPatternRefs(expression.exists.where, add);
88
93
  return;
89
94
  }
@@ -102,10 +102,14 @@ const policyPatternNodeSchema = discriminatedUnion('kind', [
102
102
  policyPatternTargetSchema,
103
103
  policyPatternVariableSchema,
104
104
  ]);
105
- const policyVariableSchema = strictObject({
106
- variable: policyPatternVariableSchema,
107
- class: classRefSchema,
108
- });
105
+ const policyVariableSelectorSchema = discriminatedUnion('kind', [
106
+ strictObject({ kind: literal('any') }),
107
+ strictObject({ kind: literal('satisfies'), class: classRefSchema }),
108
+ ]);
109
+ const policyVariableSchema = union([
110
+ strictObject({ variable: policyPatternVariableSchema, class: classRefSchema }),
111
+ strictObject({ variable: policyPatternVariableSchema, selector: policyVariableSelectorSchema }),
112
+ ]);
109
113
  const policyRepeatSchema = strictObject({
110
114
  min: number().int().min(0).max(3),
111
115
  max: number().int().min(0).max(3),
@@ -1,4 +1,5 @@
1
1
  import { BRANCH_OVERFLOW, MAX_BRANCHES, MAX_CHECK_DEPTH, MAX_CHECK_LEAVES, MAX_DOMAINS, MAX_EDGES, MAX_PATTERN_DEPTH, MAX_REPEAT, MAX_VARIABLES, measureChecks, } from '../../../language/policy/analysis/budgets.js';
2
+ import { policyVariableClass } from '../../../language/policy/model/policy.js';
2
3
  import { escapePointer } from './context.js';
3
4
  export { BRANCH_OVERFLOW, MAX_BRANCHES, MAX_CHECK_DEPTH, MAX_CHECK_LEAVES, MAX_DOMAINS, MAX_EDGES, MAX_PATTERN_DEPTH, MAX_REPEAT, MAX_VARIABLES, measureChecks, };
4
5
  export function validatePolicyBudgets(context) {
@@ -59,7 +60,10 @@ function measurePattern(pattern, ownOrigin) {
59
60
  edgeCounts: child.edgeCounts,
60
61
  domains: new Set([
61
62
  ...child.domains,
62
- ...pattern.exists.nodes.map((node) => node.class.origin),
63
+ ...pattern.exists.nodes.flatMap((node) => {
64
+ const ref = policyVariableClass(node);
65
+ return ref === undefined ? [] : [ref.origin];
66
+ }),
63
67
  ]),
64
68
  };
65
69
  }
@@ -1,4 +1,5 @@
1
1
  import { branchesOf, isConnected, targetMode } from '../../../language/policy/analysis/branches.js';
2
+ import { policyVariableClass } from '../../../language/policy/model/policy.js';
2
3
  import { normalizePolicyExpression, normalizePolicyPattern, } from '../../../language/policy/normalization/normalize.js';
3
4
  import { MAX_REPEAT, MAX_VARIABLES } from './budgets.js';
4
5
  import { escapePointer } from './context.js';
@@ -71,13 +72,16 @@ function validatePatternNode(context, pattern, pointer, scope, declarations, use
71
72
  context.add('PL_VARIABLE_SCOPE', `${declarationPointer}/variable/id`, `Variable ${id} is declared more than once; variable IDs are globally unique.`);
72
73
  }
73
74
  else {
74
- declarations.set(id, { ref: node.class, pointer: declarationPointer });
75
+ declarations.set(id, { pointer: declarationPointer });
75
76
  }
76
77
  if (nested.has(id)) {
77
78
  context.add('PL_VARIABLE_SCOPE', `${declarationPointer}/variable/id`, `Variable ${id} shadows an enclosing variable.`);
78
79
  }
79
80
  nested.add(id);
80
- context.resolveNodeClass(node.class, `${declarationPointer}/class`);
81
+ const classRef = policyVariableClass(node);
82
+ if (classRef !== undefined) {
83
+ context.resolveNodeClass(classRef, `${declarationPointer}/${'class' in node ? 'class' : 'selector/class'}`);
84
+ }
81
85
  }
82
86
  validatePatternNode(context, pattern.exists.where, `${pointer}/exists/where`, nested, declarations, uses);
83
87
  return;
@@ -136,11 +136,14 @@ export class PolicyTyping {
136
136
  }
137
137
  return candidates;
138
138
  }
139
- const exact = this.#exactInitial(term, branch);
140
- return exact === undefined ? [] : this.#applyExact(candidates, exact);
141
- }
142
- #exactInitial(term, branch) {
143
- return branch.variables.get(term);
139
+ const selector = branch.variables.get(term);
140
+ if (selector === undefined)
141
+ return [];
142
+ if (selector.kind === 'exact')
143
+ return this.#applyExact(candidates, selector.class);
144
+ if (selector.kind === 'any')
145
+ return candidates;
146
+ return this.#applyRequirement(candidates, selector.class);
144
147
  }
145
148
  #applyExact(candidates, exact) {
146
149
  const result = [];
@@ -162,6 +165,22 @@ export class PolicyTyping {
162
165
  .filter((ref) => candidate.requirements.every((required) => this.context.classExtends(ref, required)))
163
166
  .map((ref) => ({ kind: 'exact', ref }))));
164
167
  }
168
+ #applyRequirement(candidates, required) {
169
+ const result = [];
170
+ for (const candidate of candidates) {
171
+ if (candidate.kind === 'exact') {
172
+ if (this.context.classExtends(candidate.ref, required))
173
+ result.push(candidate);
174
+ }
175
+ else {
176
+ result.push({
177
+ kind: 'open',
178
+ requirements: uniqueClasses([...candidate.requirements, required]),
179
+ });
180
+ }
181
+ }
182
+ return uniqueCandidates(result);
183
+ }
165
184
  #applyEndpoint(candidates, accepts) {
166
185
  const result = [];
167
186
  for (const candidate of candidates) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astrale-os/kernel-dsl",
3
- "version": "0.2.0-beta.22",
3
+ "version": "0.2.0-beta.24",
4
4
  "description": "Astrale Kernel DSL - Schema authoring, inference, and IR serialization",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
package/CHANGELOG.md DELETED
@@ -1,254 +0,0 @@
1
- # Changelog
2
-
3
- ## [0.2.0-beta.22](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.21...kernel-dsl-v0.2.0-beta.22) (2026-08-31)
4
-
5
-
6
- ### Features
7
-
8
- * **auth:** enforce two-gate Function authority ([#561](https://github.com/astrale-os/kernel/issues/561)) ([c681d4b](https://github.com/astrale-os/kernel/commit/c681d4b391520906b2cad9171cd251962b200faf))
9
-
10
- ## [0.2.0-beta.21](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.20...kernel-dsl-v0.2.0-beta.21) (2026-08-30)
11
-
12
-
13
- ### Documentation
14
-
15
- * **dsl:** correct edge policy consumer census ([#558](https://github.com/astrale-os/kernel/issues/558)) ([badb249](https://github.com/astrale-os/kernel/commit/badb2490419a6d6bd5022c138202056954cf38b6))
16
-
17
- ## [0.2.0-beta.20](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.19...kernel-dsl-v0.2.0-beta.20) (2026-08-30)
18
-
19
-
20
- ### Bug Fixes
21
-
22
- * **dsl:** admit endpoint-selective edge policies ([#557](https://github.com/astrale-os/kernel/issues/557)) ([117e8c8](https://github.com/astrale-os/kernel/commit/117e8c888b3911a44a43ffd29572356a8cb03790))
23
-
24
-
25
- ### Performance Improvements
26
-
27
- * **core:** make Zod imports tree-shakeable ([#553](https://github.com/astrale-os/kernel/issues/553)) ([9f16257](https://github.com/astrale-os/kernel/commit/9f1625735e06331d67731a70be8f56378cd4c67c))
28
-
29
- ## [0.2.0-beta.19](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.18...kernel-dsl-v0.2.0-beta.19) (2026-08-29)
30
-
31
-
32
- ### Bug Fixes
33
-
34
- * **system:** clear specification diagnostic debt ([#539](https://github.com/astrale-os/kernel/issues/539)) ([2e88cf5](https://github.com/astrale-os/kernel/commit/2e88cf5a84c7026122f680249bbea20202b92ac6))
35
-
36
- ## [0.2.0-beta.18](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.17...kernel-dsl-v0.2.0-beta.18) (2026-08-29)
37
-
38
-
39
- ### Features
40
-
41
- * **dsl:** make StateProperty topology portable ([#534](https://github.com/astrale-os/kernel/issues/534)) ([f71cf87](https://github.com/astrale-os/kernel/commit/f71cf879e68475ffd002cafe6688be0649eb9c49))
42
-
43
- ## [0.2.0-beta.17](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.16...kernel-dsl-v0.2.0-beta.17) (2026-08-29)
44
-
45
-
46
- ### ⚠ BREAKING CHANGES
47
-
48
- * View declarations now contain only target and optional description. Legacy View.auth fields are rejected; callable authorization, View.resolve admission, Policies, and Shell handshakes remain independent.
49
- * **dsl:** make edge direction explicit
50
-
51
- ### Features
52
-
53
- * add aliased domain dependency projection ([afb799b](https://github.com/astrale-os/kernel/commit/afb799b0d61fd6f7436fe659f558a6a62ef1e7a1))
54
- * add aliased Domain dependency projection ([9c4c4fb](https://github.com/astrale-os/kernel/commit/9c4c4fb4f942c0c5e3961faf4428ed299d42f847))
55
- * add compiled remote domain serving ([ac9e365](https://github.com/astrale-os/kernel/commit/ac9e36538982a91359712e4cbbc68353ea2cc1a2))
56
- * add compiled remote Domain serving ([6149628](https://github.com/astrale-os/kernel/commit/6149628820d1294981156ff5b50ceaa522ea0403))
57
- * **callable:** preserve native binary streams and status ([d14c6f1](https://github.com/astrale-os/kernel/commit/d14c6f13492c14a3363b2c4af59c738034752fa2))
58
- * **dsl:** authorize Edge value reads with policies ([#502](https://github.com/astrale-os/kernel/issues/502)) ([a27e129](https://github.com/astrale-os/kernel/commit/a27e129378ff64e69031a011cbfa21299998a35e))
59
- * **dsl:** make edge direction explicit ([3f05bf5](https://github.com/astrale-os/kernel/commit/3f05bf52ce5b20e9f549ec0fd98cb0e4e03de1ea))
60
- * remove Property visibility and cut DSL V2 ([#518](https://github.com/astrale-os/kernel/issues/518)) ([4d99e8f](https://github.com/astrale-os/kernel/commit/4d99e8f0837136cf6be257ab3a6df666b62e06b5))
61
- * remove View authentication declarations ([4a5bfe0](https://github.com/astrale-os/kernel/commit/4a5bfe016717267d31257748f95e7f646782f876))
62
- * **runtime:** implement auto property projection lifecycle ([#451](https://github.com/astrale-os/kernel/issues/451)) ([e0c484a](https://github.com/astrale-os/kernel/commit/e0c484a79f2d5314b6a54597c340bd09d3e4e566))
63
- * **schema:** split inspection and add convergence ([6afbd39](https://github.com/astrale-os/kernel/commit/6afbd39506b8a9e37225aded1c02f94ffa64e54b))
64
-
65
-
66
- ### Bug Fixes
67
-
68
- * admit optional callable node paths ([#464](https://github.com/astrale-os/kernel/issues/464)) ([8f261d5](https://github.com/astrale-os/kernel/commit/8f261d54dfb489541d2976892c5cacadf688f1a1))
69
- * **api:** retain visibility-free DSL as V1 ([#526](https://github.com/astrale-os/kernel/issues/526)) ([e24c1ea](https://github.com/astrale-os/kernel/commit/e24c1ea257e8567d9bd33c6ada0de63bb346a496))
70
- * **boot:** point local host CLI at graph.query ([8341e10](https://github.com/astrale-os/kernel/commit/8341e1020cd32848ffb95de80e66936f17db3087))
71
- * **boot:** point local host CLI at graph.query ([70c656b](https://github.com/astrale-os/kernel/commit/70c656bc7162b477a97ace4b999f8e7f6bf3a988))
72
- * **ci:** enforce the official Kernel cohort ([#469](https://github.com/astrale-os/kernel/issues/469)) ([f6ea87a](https://github.com/astrale-os/kernel/commit/f6ea87a47f7b1f9c415e404dc1a09b480a2a3f5f))
73
- * **core:** preserve callable identity and runtime boundaries ([#394](https://github.com/astrale-os/kernel/issues/394)) ([ad67dad](https://github.com/astrale-os/kernel/commit/ad67dad84aef3c8b79f769009595ea1f1229026b))
74
- * **deps:** refresh the Kernel dependency cohort ([#393](https://github.com/astrale-os/kernel/issues/393)) ([883e7bb](https://github.com/astrale-os/kernel/commit/883e7bb7ce17eecb7dad1c94ad2089c576ba3746))
75
- * **dsl:** close runtime facade contracts ([ff99450](https://github.com/astrale-os/kernel/commit/ff99450ce3889013f57c39293e7022b32e186ca6))
76
- * **dsl:** close semantic qualification gaps ([4a48cd7](https://github.com/astrale-os/kernel/commit/4a48cd729bcaf839ceda880b26ade064d6505fe2))
77
- * **dsl:** expose runtime-clean load paths ([7dba075](https://github.com/astrale-os/kernel/commit/7dba075887e4796e5464d5a41ddb03212eed887f))
78
- * **dsl:** keep schema projections declaration-nameable ([#432](https://github.com/astrale-os/kernel/issues/432)) ([448d23d](https://github.com/astrale-os/kernel/commit/448d23d58fc2b564ef93be4a54dc8ebd385b5066))
79
- * **dsl:** make schema declarations portable ([55e13c0](https://github.com/astrale-os/kernel/commit/55e13c06896eb5d6cf195607aec10f176b585504))
80
- * **dsl:** make schema declarations portable ([90c04ac](https://github.com/astrale-os/kernel/commit/90c04acfa5af714c70a92dc90999675d53f159bc))
81
- * **dsl:** preserve generic resolved domain type ([46f306b](https://github.com/astrale-os/kernel/commit/46f306bc3d1c73c822608c777a82f4502591d3e2))
82
- * **dsl:** reject unknown authoring fields on edge endpoints ([0483aa9](https://github.com/astrale-os/kernel/commit/0483aa9d985459c873922262b6f60363ffb3902b))
83
- * **dsl:** reject unknown authoring fields on edge endpoints ([cb90dae](https://github.com/astrale-os/kernel/commit/cb90dae6e165166ddcfe5e31ee2780d36b07ea53))
84
- * **dsl:** reject unknown edge endpoint fields ([06a47ed](https://github.com/astrale-os/kernel/commit/06a47edf1bb1ba58d0ac7258e810ef2d20b30c69))
85
- * **dsl:** reject unknown edge endpoint fields ([2d83dbf](https://github.com/astrale-os/kernel/commit/2d83dbf25a3e3818f9db2519b15741d109750727))
86
- * **dsl:** trust exact generated build material ([#466](https://github.com/astrale-os/kernel/issues/466)) ([77f2686](https://github.com/astrale-os/kernel/commit/77f26862d8041928029c04da9f2b2521a101c17e))
87
- * **packages:** keep workspace guard private ([e0ba76c](https://github.com/astrale-os/kernel/commit/e0ba76c5ae163245e31115e2a72e0663db0f5320))
88
- * **packages:** keep workspace guard private ([d260a52](https://github.com/astrale-os/kernel/commit/d260a52329cde5ce4b0260c43a3bbf28cb78f408))
89
- * **packages:** keep workspace guard private ([a3e82ec](https://github.com/astrale-os/kernel/commit/a3e82ec671f07252a5966b4de988e275e4078b8c))
90
- * publish a TypeScript-compatible cohort ([#406](https://github.com/astrale-os/kernel/issues/406)) ([f1a0cd0](https://github.com/astrale-os/kernel/commit/f1a0cd09f2f0b4498f9fa8924b2e319cac6552b7))
91
- * **release:** add package repository metadata ([8238077](https://github.com/astrale-os/kernel/commit/8238077d47a96c0f7b50a1bae8769fe4faab45b7))
92
- * **release:** harden public package closure ([#397](https://github.com/astrale-os/kernel/issues/397)) ([5a5886f](https://github.com/astrale-os/kernel/commit/5a5886fe66c7b3ea0a014766a5df8c04fd93efeb))
93
- * **schema:** harden introspection evidence and caches ([9516eb5](https://github.com/astrale-os/kernel/commit/9516eb510242427296861ef9e730b01861e45463))
94
- * stabilize governed Kernel integration ([#347](https://github.com/astrale-os/kernel/issues/347)) ([6869e3f](https://github.com/astrale-os/kernel/commit/6869e3fc4de1e73ff701bb38383e89c934ddfdf2))
95
- * **system:** clear Codegraph diagnostic debt ([f7a8e1f](https://github.com/astrale-os/kernel/commit/f7a8e1f5c5694d9c3c45d95fde184f0d5f2c7343))
96
- * **system:** clear Codegraph diagnostic debt ([45f86a9](https://github.com/astrale-os/kernel/commit/45f86a9ce14a224efed0e07966a5df8d7a892078))
97
- * **system:** preserve erased domain and runtime facade contracts ([b525d47](https://github.com/astrale-os/kernel/commit/b525d4781d2d58776ec6b4bbe1e045a3c1accebb))
98
- * **system:** preserve public revision vocabulary ([5e990d0](https://github.com/astrale-os/kernel/commit/5e990d0b28578a040b80c508943552c46b8632ae))
99
- * **test:** preserve authored semantic contracts ([bedb8cd](https://github.com/astrale-os/kernel/commit/bedb8cd2d36f4a95cb8d219067df0d0e39100f08))
100
-
101
-
102
- ### Documentation
103
-
104
- * **release:** align kernel beta changelogs ([ad59dbc](https://github.com/astrale-os/kernel/commit/ad59dbc8df458d8bd025692d594b0b4666cd2e1f))
105
-
106
- ## [0.2.0-beta.16](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.15...kernel-dsl-v0.2.0-beta.16) (2026-08-29)
107
-
108
-
109
- ### Features
110
-
111
- * remove Property visibility and cut DSL V2 ([#518](https://github.com/astrale-os/kernel/issues/518)) ([4d99e8f](https://github.com/astrale-os/kernel/commit/4d99e8f0837136cf6be257ab3a6df666b62e06b5))
112
-
113
-
114
- ### Bug Fixes
115
-
116
- * **api:** retain visibility-free DSL as V1 ([#526](https://github.com/astrale-os/kernel/issues/526)) ([e24c1ea](https://github.com/astrale-os/kernel/commit/e24c1ea257e8567d9bd33c6ada0de63bb346a496))
117
-
118
- ## [0.2.0-beta.15](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.14...kernel-dsl-v0.2.0-beta.15) (2026-08-27)
119
-
120
-
121
- ### Features
122
-
123
- * **dsl:** authorize Edge value reads with policies ([#502](https://github.com/astrale-os/kernel/issues/502)) ([a27e129](https://github.com/astrale-os/kernel/commit/a27e129378ff64e69031a011cbfa21299998a35e))
124
-
125
- ## [0.2.0-beta.14](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.13...kernel-dsl-v0.2.0-beta.14) (2026-08-26)
126
-
127
-
128
- ### Bug Fixes
129
-
130
- * **ci:** enforce the official Kernel cohort ([#469](https://github.com/astrale-os/kernel/issues/469)) ([f6ea87a](https://github.com/astrale-os/kernel/commit/f6ea87a47f7b1f9c415e404dc1a09b480a2a3f5f))
131
-
132
- ## [0.2.0-beta.13](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.12...kernel-dsl-v0.2.0-beta.13) (2026-08-26)
133
-
134
-
135
- ### Features
136
-
137
- * **runtime:** implement auto property projection lifecycle ([#451](https://github.com/astrale-os/kernel/issues/451)) ([e0c484a](https://github.com/astrale-os/kernel/commit/e0c484a79f2d5314b6a54597c340bd09d3e4e566))
138
-
139
-
140
- ### Bug Fixes
141
-
142
- * **dsl:** trust exact generated build material ([#466](https://github.com/astrale-os/kernel/issues/466)) ([77f2686](https://github.com/astrale-os/kernel/commit/77f26862d8041928029c04da9f2b2521a101c17e))
143
-
144
- ## [0.2.0-beta.12](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.11...kernel-dsl-v0.2.0-beta.12) (2026-08-26)
145
-
146
-
147
- ### Bug Fixes
148
-
149
- * admit optional callable node paths ([#464](https://github.com/astrale-os/kernel/issues/464)) ([8f261d5](https://github.com/astrale-os/kernel/commit/8f261d54dfb489541d2976892c5cacadf688f1a1))
150
- * **system:** clear Codegraph diagnostic debt ([f7a8e1f](https://github.com/astrale-os/kernel/commit/f7a8e1f5c5694d9c3c45d95fde184f0d5f2c7343))
151
-
152
- ## [0.2.0-beta.11](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.10...kernel-dsl-v0.2.0-beta.11) (2026-08-25)
153
-
154
-
155
- ### Features
156
-
157
- * **callable:** preserve native binary streams and status ([d14c6f1](https://github.com/astrale-os/kernel/commit/d14c6f13492c14a3363b2c4af59c738034752fa2))
158
- * **schema:** split inspection and add convergence ([6afbd39](https://github.com/astrale-os/kernel/commit/6afbd39506b8a9e37225aded1c02f94ffa64e54b))
159
-
160
-
161
- ### Bug Fixes
162
-
163
- * **schema:** harden introspection evidence and caches ([9516eb5](https://github.com/astrale-os/kernel/commit/9516eb510242427296861ef9e730b01861e45463))
164
-
165
- ## [0.2.0-beta.10](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.9...kernel-dsl-v0.2.0-beta.10) (2026-08-25)
166
-
167
-
168
- ### Bug Fixes
169
-
170
- * **dsl:** keep schema projections declaration-nameable ([#432](https://github.com/astrale-os/kernel/issues/432)) ([448d23d](https://github.com/astrale-os/kernel/commit/448d23d58fc2b564ef93be4a54dc8ebd385b5066))
171
-
172
- ## [0.2.0-beta.9](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.8...kernel-dsl-v0.2.0-beta.9) (2026-08-24)
173
-
174
-
175
- ### Bug Fixes
176
-
177
- * **packages:** keep workspace guard private ([e0ba76c](https://github.com/astrale-os/kernel/commit/e0ba76c5ae163245e31115e2a72e0663db0f5320))
178
- * **packages:** keep workspace guard private ([d260a52](https://github.com/astrale-os/kernel/commit/d260a52329cde5ce4b0260c43a3bbf28cb78f408))
179
- * **packages:** keep workspace guard private ([a3e82ec](https://github.com/astrale-os/kernel/commit/a3e82ec671f07252a5966b4de988e275e4078b8c))
180
-
181
- ## [0.2.0-beta.8](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.7...kernel-dsl-v0.2.0-beta.8) (2026-08-24)
182
-
183
-
184
- ### Features
185
-
186
- * add aliased domain dependency projection ([afb799b](https://github.com/astrale-os/kernel/commit/afb799b0d61fd6f7436fe659f558a6a62ef1e7a1))
187
- * add aliased Domain dependency projection ([9c4c4fb](https://github.com/astrale-os/kernel/commit/9c4c4fb4f942c0c5e3961faf4428ed299d42f847))
188
-
189
- ## [0.2.0-beta.7](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.6...kernel-dsl-v0.2.0-beta.7) (2026-08-24)
190
-
191
-
192
- ### Bug Fixes
193
-
194
- * **dsl:** make schema declarations portable ([55e13c0](https://github.com/astrale-os/kernel/commit/55e13c06896eb5d6cf195607aec10f176b585504))
195
- * publish a TypeScript-compatible cohort ([#406](https://github.com/astrale-os/kernel/issues/406)) ([f1a0cd0](https://github.com/astrale-os/kernel/commit/f1a0cd09f2f0b4498f9fa8924b2e319cac6552b7))
196
-
197
- ## [0.2.0-beta.6](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.5...kernel-dsl-v0.2.0-beta.6) (2026-08-23)
198
-
199
-
200
- ### Bug Fixes
201
-
202
- * **core:** preserve callable identity and runtime boundaries ([#394](https://github.com/astrale-os/kernel/issues/394)) ([ad67dad](https://github.com/astrale-os/kernel/commit/ad67dad84aef3c8b79f769009595ea1f1229026b))
203
- * **deps:** refresh the Kernel dependency cohort ([#393](https://github.com/astrale-os/kernel/issues/393)) ([883e7bb](https://github.com/astrale-os/kernel/commit/883e7bb7ce17eecb7dad1c94ad2089c576ba3746))
204
- * **dsl:** close runtime facade contracts ([ff99450](https://github.com/astrale-os/kernel/commit/ff99450ce3889013f57c39293e7022b32e186ca6))
205
- * **dsl:** close semantic qualification gaps ([4a48cd7](https://github.com/astrale-os/kernel/commit/4a48cd729bcaf839ceda880b26ade064d6505fe2))
206
- * **dsl:** expose runtime-clean load paths ([7dba075](https://github.com/astrale-os/kernel/commit/7dba075887e4796e5464d5a41ddb03212eed887f))
207
- * **dsl:** preserve generic resolved domain type ([46f306b](https://github.com/astrale-os/kernel/commit/46f306bc3d1c73c822608c777a82f4502591d3e2))
208
- * **release:** harden public package closure ([#397](https://github.com/astrale-os/kernel/issues/397)) ([5a5886f](https://github.com/astrale-os/kernel/commit/5a5886fe66c7b3ea0a014766a5df8c04fd93efeb))
209
- * **system:** preserve erased domain and runtime facade contracts ([b525d47](https://github.com/astrale-os/kernel/commit/b525d4781d2d58776ec6b4bbe1e045a3c1accebb))
210
- * **system:** preserve public revision vocabulary ([5e990d0](https://github.com/astrale-os/kernel/commit/5e990d0b28578a040b80c508943552c46b8632ae))
211
- * **test:** preserve authored semantic contracts ([bedb8cd](https://github.com/astrale-os/kernel/commit/bedb8cd2d36f4a95cb8d219067df0d0e39100f08))
212
-
213
- ## [0.2.0-beta.5](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.4...kernel-dsl-v0.2.0-beta.5) (2026-08-21)
214
-
215
-
216
- ### ⚠ BREAKING CHANGES
217
-
218
- * View declarations now contain only target and optional description. Legacy View.auth fields are rejected; callable authorization, View.resolve admission, Policies, and Shell handshakes remain independent.
219
-
220
- ### Features
221
-
222
- * remove View authentication declarations ([4a5bfe0](https://github.com/astrale-os/kernel/commit/4a5bfe016717267d31257748f95e7f646782f876))
223
-
224
- ## [0.2.0-beta.4](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.2.0-beta.3...kernel-dsl-v0.2.0-beta.4) (2026-08-21)
225
-
226
-
227
- ### Bug Fixes
228
-
229
- * **release:** add package repository metadata ([8238077](https://github.com/astrale-os/kernel/commit/8238077d47a96c0f7b50a1bae8769fe4faab45b7))
230
-
231
- ## [0.1.5](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.1.4...kernel-dsl-v0.1.5) (2026-08-07)
232
-
233
-
234
- ### Features
235
-
236
- * **dsl:** add non-breaking policy IR preview ([1202d29](https://github.com/astrale-os/kernel/commit/1202d294cc7f32bc8e3e29d7537d3604403d09a5))
237
- * **dsl:** align policy authoring with v1 ([514961f](https://github.com/astrale-os/kernel/commit/514961f9902d97e96535126b0a983764bb0f30ac))
238
- * **dsl:** align policy authoring with v1 ([d082d5e](https://github.com/astrale-os/kernel/commit/d082d5e923458c0eec4ee28358f1b41309067843))
239
-
240
- ## [0.1.4](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.1.3...kernel-dsl-v0.1.4) (2026-07-10)
241
-
242
-
243
- ### Bug Fixes
244
-
245
- * export ./package.json from all published packages ([9560a34](https://github.com/astrale-os/kernel/commit/9560a34379c68d475f09a863e9d1962b560d83a0))
246
- * export ./package.json from all published packages ([8633acb](https://github.com/astrale-os/kernel/commit/8633acba8953644805fc43840732bd16c3e19ab1))
247
- * export ./package.json in publishConfig.exports too — the map that ships ([85ba0a1](https://github.com/astrale-os/kernel/commit/85ba0a121466ed5ef33fced51d28c0d09a7c0ec4))
248
-
249
- ## [0.1.3](https://github.com/astrale-os/kernel/compare/kernel-dsl-v0.1.2...kernel-dsl-v0.1.3) (2026-07-08)
250
-
251
-
252
- ### Features
253
-
254
- * support top-level functions of the kernel domain ([db45b06](https://github.com/astrale-os/kernel/commit/db45b061d0a7562950277344778991592f0a19eb))