@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.
- package/dist/v1/builder/index.d.ts +1 -1
- package/dist/v1/builder/policy/authoring.d.ts +6 -1
- package/dist/v1/builder/policy/authoring.js +28 -8
- package/dist/v1/compiled/admission/accept.js +19 -2
- package/dist/v1/compiled/admission/semantics.js +32 -5
- package/dist/v1/language/index.d.ts +1 -0
- package/dist/v1/language/index.js +1 -0
- package/dist/v1/language/policy/analysis/branches.d.ts +2 -3
- package/dist/v1/language/policy/analysis/branches.js +2 -1
- package/dist/v1/language/policy/index.d.ts +1 -0
- package/dist/v1/language/policy/index.js +1 -0
- package/dist/v1/language/policy/model/policy.d.ts +26 -1
- package/dist/v1/language/policy/model/policy.js +9 -1
- package/dist/v1/language/policy/normalization/normalize.js +15 -5
- package/dist/v1/language/state/machine.d.ts +2 -2
- package/dist/v1/schema/resolution/origins.js +6 -1
- package/dist/v1/schema/validation/domain.structure.js +8 -4
- package/dist/v1/schema/validation/policy/budgets.js +5 -1
- package/dist/v1/schema/validation/policy/references.js +6 -2
- package/dist/v1/schema/validation/policy/typing.js +24 -5
- package/package.json +1 -1
- package/CHANGELOG.md +0 -254
|
@@ -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
|
|
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
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
nodes.push({
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
});
|
|
59
|
-
|
|
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
|
-
|
|
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
|
-
|
|
390
|
-
|
|
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
|
|
736
|
-
|
|
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.
|
|
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,8 +1,7 @@
|
|
|
1
|
-
import type {
|
|
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,
|
|
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
|
|
100
|
+
result.set(variableKey(namespace, variable.variable.id), policyVariableSelector(variable));
|
|
100
101
|
}
|
|
101
102
|
visit(node.exists.where);
|
|
102
103
|
}
|
|
@@ -11,13 +11,38 @@ export type PolicyPatternTerm = {
|
|
|
11
11
|
readonly kind: 'variable';
|
|
12
12
|
readonly id: number;
|
|
13
13
|
};
|
|
14
|
-
export interface
|
|
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
|
-
|
|
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,
|
|
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
|
-
|
|
191
|
-
|
|
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) =>
|
|
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
|
|
106
|
-
|
|
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.
|
|
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, {
|
|
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
|
-
|
|
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
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
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))
|