grafeo-ogm 2.1.0 → 2.2.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 (73) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/README.md +49 -0
  3. package/dist/cjs/compilers/mutation.compiler.d.ts.map +1 -1
  4. package/dist/cjs/compilers/mutation.compiler.js +23 -23
  5. package/dist/cjs/compilers/mutation.compiler.js.map +1 -1
  6. package/dist/cjs/compilers/where.compiler.d.ts +83 -6
  7. package/dist/cjs/compilers/where.compiler.d.ts.map +1 -1
  8. package/dist/cjs/compilers/where.compiler.js +156 -76
  9. package/dist/cjs/compilers/where.compiler.js.map +1 -1
  10. package/dist/cjs/execution/executor.d.ts +11 -1
  11. package/dist/cjs/execution/executor.d.ts.map +1 -1
  12. package/dist/cjs/execution/executor.js +6 -3
  13. package/dist/cjs/execution/executor.js.map +1 -1
  14. package/dist/cjs/index.d.ts +2 -2
  15. package/dist/cjs/index.d.ts.map +1 -1
  16. package/dist/cjs/index.js.map +1 -1
  17. package/dist/cjs/model.d.ts +38 -1
  18. package/dist/cjs/model.d.ts.map +1 -1
  19. package/dist/cjs/model.js +120 -2
  20. package/dist/cjs/model.js.map +1 -1
  21. package/dist/cjs/ogm.d.ts.map +1 -1
  22. package/dist/cjs/ogm.js +1 -0
  23. package/dist/cjs/ogm.js.map +1 -1
  24. package/dist/cjs/policy/explain.d.ts +59 -0
  25. package/dist/cjs/policy/explain.d.ts.map +1 -0
  26. package/dist/cjs/policy/explain.js +175 -0
  27. package/dist/cjs/policy/explain.js.map +1 -0
  28. package/dist/cjs/policy/resolver.d.ts +26 -2
  29. package/dist/cjs/policy/resolver.d.ts.map +1 -1
  30. package/dist/cjs/policy/resolver.js +103 -33
  31. package/dist/cjs/policy/resolver.js.map +1 -1
  32. package/dist/cjs/policy/types.d.ts +87 -0
  33. package/dist/cjs/policy/types.d.ts.map +1 -1
  34. package/dist/cjs/utils/write-coercion.d.ts +20 -19
  35. package/dist/cjs/utils/write-coercion.d.ts.map +1 -1
  36. package/dist/cjs/utils/write-coercion.js +120 -50
  37. package/dist/cjs/utils/write-coercion.js.map +1 -1
  38. package/dist/esm/compilers/mutation.compiler.d.ts.map +1 -1
  39. package/dist/esm/compilers/mutation.compiler.js +24 -24
  40. package/dist/esm/compilers/mutation.compiler.js.map +1 -1
  41. package/dist/esm/compilers/where.compiler.d.ts +83 -6
  42. package/dist/esm/compilers/where.compiler.d.ts.map +1 -1
  43. package/dist/esm/compilers/where.compiler.js +156 -77
  44. package/dist/esm/compilers/where.compiler.js.map +1 -1
  45. package/dist/esm/execution/executor.d.ts +11 -1
  46. package/dist/esm/execution/executor.d.ts.map +1 -1
  47. package/dist/esm/execution/executor.js +6 -3
  48. package/dist/esm/execution/executor.js.map +1 -1
  49. package/dist/esm/index.d.ts +2 -2
  50. package/dist/esm/index.d.ts.map +1 -1
  51. package/dist/esm/index.js.map +1 -1
  52. package/dist/esm/model.d.ts +38 -1
  53. package/dist/esm/model.d.ts.map +1 -1
  54. package/dist/esm/model.js +121 -3
  55. package/dist/esm/model.js.map +1 -1
  56. package/dist/esm/ogm.d.ts.map +1 -1
  57. package/dist/esm/ogm.js +1 -0
  58. package/dist/esm/ogm.js.map +1 -1
  59. package/dist/esm/policy/explain.d.ts +59 -0
  60. package/dist/esm/policy/explain.d.ts.map +1 -0
  61. package/dist/esm/policy/explain.js +169 -0
  62. package/dist/esm/policy/explain.js.map +1 -0
  63. package/dist/esm/policy/resolver.d.ts +26 -2
  64. package/dist/esm/policy/resolver.d.ts.map +1 -1
  65. package/dist/esm/policy/resolver.js +102 -33
  66. package/dist/esm/policy/resolver.js.map +1 -1
  67. package/dist/esm/policy/types.d.ts +87 -0
  68. package/dist/esm/policy/types.d.ts.map +1 -1
  69. package/dist/esm/utils/write-coercion.d.ts +20 -19
  70. package/dist/esm/utils/write-coercion.d.ts.map +1 -1
  71. package/dist/esm/utils/write-coercion.js +118 -48
  72. package/dist/esm/utils/write-coercion.js.map +1 -1
  73. package/package.json +1 -1
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Pure helpers behind `Model.explainPolicies()` (GitHub issue #6).
3
+ *
4
+ * The explain path never re-derives a policy predicate. It consumes the
5
+ * fragments `WhereCompiler.compileForExplain` produced for enforcement,
6
+ * projects one boolean per applied policy, and cross-checks the verdict
7
+ * implied by those outcomes against the literal enforcement predicate.
8
+ */
9
+ import { type CompiledPolicyFragments } from '../compilers/where.compiler';
10
+ import type { DetailedPolicy, DetailedResolution, PolicyClauseOutcome, PolicyExplanation } from './types';
11
+ /** Default candidate cap for one `explainPolicies` call. */
12
+ export declare const EXPLAIN_DEFAULT_LIMIT = 100;
13
+ /** Hard candidate cap — explain evaluates every policy per candidate. */
14
+ export declare const EXPLAIN_MAX_LIMIT = 1000;
15
+ /** Cypher variable holding the per-policy outcome list. */
16
+ export declare const EXPLAIN_OUTCOMES = "__explain_outcomes";
17
+ /** Cypher variable holding the literal enforcement verdict. */
18
+ export declare const EXPLAIN_VISIBLE = "__explain_visible";
19
+ /**
20
+ * Validate `options.limit` for an explain call: default 100, reject
21
+ * anything above 1,000 instead of silently clamping (a diagnostic must
22
+ * not quietly drop the candidate an operator asked about).
23
+ */
24
+ export declare function resolveExplainLimit(limit: number | undefined): number;
25
+ /** How one reported policy's outcome is determined for every candidate. */
26
+ type ExplainSlot = {
27
+ readonly entry: DetailedPolicy;
28
+ readonly projected: number;
29
+ } | {
30
+ readonly entry: DetailedPolicy;
31
+ readonly fixed: PolicyClauseOutcome;
32
+ };
33
+ export interface ExplainPlan {
34
+ /** Cypher boolean expressions projected as `__explain_outcomes`. */
35
+ readonly outcomeExpressions: ReadonlyArray<string>;
36
+ /** One slot per reported policy, in registration order. */
37
+ readonly slots: ReadonlyArray<ExplainSlot>;
38
+ readonly overriddenBy: string | null;
39
+ /** No policy is registered for the type — reads are unconstrained. */
40
+ readonly unrestricted: boolean;
41
+ }
42
+ /**
43
+ * Pair each detailed policy with its compiled fragments and decide which
44
+ * outcomes need a per-row projection. `fragments` must come from compiling
45
+ * `projectResolution(detailed)` — the SAME detailed object — so the
46
+ * positional alignment below holds; it is verified by identity anyway.
47
+ */
48
+ export declare function buildExplainPlan(detailed: DetailedResolution | null, fragments: CompiledPolicyFragments | null): ExplainPlan;
49
+ /**
50
+ * Turn one result row into its explanation and verify it. `rawVisible` is
51
+ * the enforcement predicate's own value (`coalesce(<clause>, false)`); the
52
+ * verdict recomputed from the per-policy outcomes MUST agree with it.
53
+ * AND/OR are monotone in Cypher's three-valued logic, so reading NULL as
54
+ * not-true at the leaves yields the same truth value as `coalesce` at the
55
+ * root — any disagreement is an engine bug, never a valid explanation.
56
+ */
57
+ export declare function interpretExplainRow(plan: ExplainPlan, rawOutcomes: unknown, rawVisible: unknown, typeName: string, row: number): Omit<PolicyExplanation<never>, 'node'>;
58
+ export {};
59
+ //# sourceMappingURL=explain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.d.ts","sourceRoot":"","sources":["../../../src/policy/explain.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAElB,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,4DAA4D;AAC5D,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,yEAAyE;AACzE,eAAO,MAAM,iBAAiB,OAAQ,CAAC;AACvC,2DAA2D;AAC3D,eAAO,MAAM,gBAAgB,uBAAuB,CAAC;AACrD,+DAA+D;AAC/D,eAAO,MAAM,eAAe,sBAAsB,CAAC;AAEnD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAUrE;AAED,2EAA2E;AAC3E,KAAK,WAAW,GACZ;IAAE,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC9D;IAAE,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAA;CAAE,CAAC;AAE5E,MAAM,WAAW,WAAW;IAC1B,oEAAoE;IACpE,QAAQ,CAAC,kBAAkB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACnD,2DAA2D;IAC3D,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,WAAW,CAAC,CAAC;IAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,sEAAsE;IACtE,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAQD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,kBAAkB,GAAG,IAAI,EACnC,SAAS,EAAE,uBAAuB,GAAG,IAAI,GACxC,WAAW,CAqFb;AAWD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,WAAW,EACjB,WAAW,EAAE,OAAO,EACpB,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CA0DxC"}
@@ -0,0 +1,169 @@
1
+ /**
2
+ * Pure helpers behind `Model.explainPolicies()` (GitHub issue #6).
3
+ *
4
+ * The explain path never re-derives a policy predicate. It consumes the
5
+ * fragments `WhereCompiler.compileForExplain` produced for enforcement,
6
+ * projects one boolean per applied policy, and cross-checks the verdict
7
+ * implied by those outcomes against the literal enforcement predicate.
8
+ */
9
+ import { policyValueExpression, } from '../compilers/where.compiler';
10
+ import { OGMError } from '../errors';
11
+ /** Default candidate cap for one `explainPolicies` call. */
12
+ export const EXPLAIN_DEFAULT_LIMIT = 100;
13
+ /** Hard candidate cap — explain evaluates every policy per candidate. */
14
+ export const EXPLAIN_MAX_LIMIT = 1000;
15
+ /** Cypher variable holding the per-policy outcome list. */
16
+ export const EXPLAIN_OUTCOMES = '__explain_outcomes';
17
+ /** Cypher variable holding the literal enforcement verdict. */
18
+ export const EXPLAIN_VISIBLE = '__explain_visible';
19
+ /**
20
+ * Validate `options.limit` for an explain call: default 100, reject
21
+ * anything above 1,000 instead of silently clamping (a diagnostic must
22
+ * not quietly drop the candidate an operator asked about).
23
+ */
24
+ export function resolveExplainLimit(limit) {
25
+ if (limit == null)
26
+ return EXPLAIN_DEFAULT_LIMIT;
27
+ const n = Math.trunc(Number(limit));
28
+ if (!Number.isFinite(n) || n < 0)
29
+ throw new OGMError('limit must be a non-negative integer');
30
+ if (n > EXPLAIN_MAX_LIMIT)
31
+ throw new OGMError(`explainPolicies: limit ${n} exceeds the maximum of ${EXPLAIN_MAX_LIMIT} candidates per call. Narrow the candidate \`where\` instead.`);
32
+ return n;
33
+ }
34
+ function internalError(message) {
35
+ return new OGMError(`explainPolicies: ${message}. No explanation was returned — please report this as a grafeo-ogm bug.`);
36
+ }
37
+ /**
38
+ * Pair each detailed policy with its compiled fragments and decide which
39
+ * outcomes need a per-row projection. `fragments` must come from compiling
40
+ * `projectResolution(detailed)` — the SAME detailed object — so the
41
+ * positional alignment below holds; it is verified by identity anyway.
42
+ */
43
+ export function buildExplainPlan(detailed, fragments) {
44
+ if (!detailed)
45
+ return {
46
+ outcomeExpressions: [],
47
+ slots: [],
48
+ overriddenBy: null,
49
+ unrestricted: true,
50
+ };
51
+ // An override fired: enforcement emits no predicate, nothing to project.
52
+ if (detailed.overriddenBy !== null)
53
+ return {
54
+ outcomeExpressions: [],
55
+ slots: detailed.entries.map((entry) => ({
56
+ entry,
57
+ fixed: entry.applied
58
+ ? 'pass'
59
+ : entry.skipped
60
+ ? 'skipped'
61
+ : 'not-applied',
62
+ })),
63
+ overriddenBy: detailed.overriddenBy,
64
+ unrestricted: false,
65
+ };
66
+ if (!fragments)
67
+ throw internalError('policy fragments are missing for the resolution');
68
+ const outcomeExpressions = [];
69
+ const slots = [];
70
+ let permIdx = 0;
71
+ let restIdx = 0;
72
+ for (const entry of detailed.entries) {
73
+ const { policy } = entry;
74
+ // No override fired, so every override evaluated to false.
75
+ if (policy.kind === 'override') {
76
+ slots.push({ entry, fixed: 'not-applied' });
77
+ continue;
78
+ }
79
+ // Non-applying permissives are dropped by the resolver — never compiled.
80
+ if (policy.kind === 'permissive' && !entry.applied) {
81
+ slots.push({ entry, fixed: 'not-applied' });
82
+ continue;
83
+ }
84
+ const compiled = policy.kind === 'permissive'
85
+ ? fragments.permissives[permIdx++]
86
+ : fragments.restrictives[restIdx++];
87
+ if (!compiled || compiled.policy !== policy)
88
+ throw internalError(`compiled fragments are misaligned with the resolution at policy "${entry.name}"`);
89
+ // Restrictives are compiled even when gated off (the compiler
90
+ // re-checks `appliesWhen` and emits nothing). Parts here would mean
91
+ // the two `appliesWhen` evaluations disagreed.
92
+ if (!entry.applied) {
93
+ if (compiled.parts.length > 0)
94
+ throw new OGMError(`explainPolicies: appliesWhen of policy "${entry.name}" returned different results across evaluations for the same ctx. appliesWhen must be a pure function of ctx.`);
95
+ slots.push({ entry, fixed: 'not-applied' });
96
+ continue;
97
+ }
98
+ const expr = policyValueExpression(policy.kind, compiled.parts);
99
+ if (expr === null) {
100
+ slots.push({ entry, fixed: 'abstain' });
101
+ continue;
102
+ }
103
+ slots.push({ entry, projected: outcomeExpressions.length });
104
+ outcomeExpressions.push(expr);
105
+ }
106
+ if (permIdx !== fragments.permissives.length ||
107
+ restIdx !== fragments.restrictives.length)
108
+ throw internalError('compiled fragments are misaligned with the resolution (unconsumed fragments)');
109
+ return { outcomeExpressions, slots, overriddenBy: null, unrestricted: false };
110
+ }
111
+ function toOutcome(value, policyName) {
112
+ if (value === true)
113
+ return 'pass';
114
+ if (value === false)
115
+ return 'fail';
116
+ if (value === null || value === undefined)
117
+ return 'null';
118
+ throw new OGMError(`explainPolicies: policy "${policyName}" evaluated to a non-boolean value (${typeof value}). Policy predicates must be boolean expressions.`);
119
+ }
120
+ /**
121
+ * Turn one result row into its explanation and verify it. `rawVisible` is
122
+ * the enforcement predicate's own value (`coalesce(<clause>, false)`); the
123
+ * verdict recomputed from the per-policy outcomes MUST agree with it.
124
+ * AND/OR are monotone in Cypher's three-valued logic, so reading NULL as
125
+ * not-true at the leaves yields the same truth value as `coalesce` at the
126
+ * root — any disagreement is an engine bug, never a valid explanation.
127
+ */
128
+ export function interpretExplainRow(plan, rawOutcomes, rawVisible, typeName, row) {
129
+ if (!Array.isArray(rawOutcomes) ||
130
+ rawOutcomes.length !== plan.outcomeExpressions.length)
131
+ throw internalError(`row ${row} of type "${typeName}" returned ${Array.isArray(rawOutcomes) ? rawOutcomes.length : typeof rawOutcomes} policy outcomes, expected ${plan.outcomeExpressions.length}`);
132
+ const policies = plan.slots.map((slot) => ({
133
+ name: slot.entry.name,
134
+ named: slot.entry.named,
135
+ kind: slot.entry.kind,
136
+ source: slot.entry.source,
137
+ applied: slot.entry.applied,
138
+ outcome: 'fixed' in slot
139
+ ? slot.fixed
140
+ : toOutcome(rawOutcomes[slot.projected], slot.entry.name),
141
+ }));
142
+ let visible;
143
+ let permissiveGranted;
144
+ if (plan.unrestricted || plan.overriddenBy !== null) {
145
+ visible = true;
146
+ permissiveGranted = true;
147
+ }
148
+ else {
149
+ permissiveGranted = policies.some((p) => p.kind === 'permissive' && p.outcome === 'pass');
150
+ const restrictivesHold = policies.every((p) => p.kind !== 'restrictive' ||
151
+ !p.applied ||
152
+ p.outcome === 'pass' ||
153
+ p.outcome === 'abstain');
154
+ visible = permissiveGranted && restrictivesHold;
155
+ }
156
+ if (rawVisible !== visible)
157
+ throw internalError(`consistency check failed for row ${row} of type "${typeName}": the enforcement predicate evaluated to ${String(rawVisible)} but the per-policy outcomes imply ${String(visible)}`);
158
+ return {
159
+ visible,
160
+ overriddenBy: plan.overriddenBy,
161
+ permissiveGranted,
162
+ failedRestrictives: policies
163
+ .filter((p) => p.kind === 'restrictive' &&
164
+ (p.outcome === 'fail' || p.outcome === 'null'))
165
+ .map((p) => p.name),
166
+ policies,
167
+ };
168
+ }
169
+ //# sourceMappingURL=explain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explain.js","sourceRoot":"","sources":["../../../src/policy/explain.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { SchemaMetadata } from '../schema/types';
2
- import type { Operation, Policy, PolicyContext, ResolvedPolicies } from './types';
2
+ import type { DetailedResolution, Operation, Policy, PolicyContext, ResolvedPolicies } from './types';
3
3
  /**
4
4
  * Build an immutable resolver from a registry. The registry is built by
5
5
  * the OGM constructor after schema validation.
@@ -24,12 +24,36 @@ export declare class PolicyResolver<C extends PolicyContext = PolicyContext> {
24
24
  * identical Cypher).
25
25
  */
26
26
  resolve(typeName: string, op: Operation, ctx: C): ResolvedPolicies<C> | null;
27
+ /**
28
+ * Resolve every operation-matching policy for `(typeName, op, ctx)`
29
+ * WITHOUT dropping any: `applied` records the `appliesWhen(ctx)` gate
30
+ * (or, for overrides, `when(ctx)`), and `skipped` marks policies never
31
+ * evaluated because an earlier override fired. This is the single place
32
+ * the resolver invokes `appliesWhen`; `resolve()` projects from it.
33
+ *
34
+ * Callback invocation order is unchanged from the pre-explain resolver:
35
+ * override `when` callbacks first (stopping at the first that fires),
36
+ * then `appliesWhen` in registration order — skipped entirely when an
37
+ * override fired.
38
+ *
39
+ * Returns `null` exactly when `resolve()` does.
40
+ */
41
+ resolveDetailed(typeName: string, op: Operation, ctx: C): DetailedResolution<C> | null;
27
42
  /**
28
43
  * Gather all sources of policy that apply to a given concrete type:
29
- * the type's own list, plus any interfaces it implements.
44
+ * the type's own list, plus any interfaces it implements — each tagged
45
+ * with the registry key that declared it.
30
46
  */
31
47
  private gatherSources;
32
48
  }
49
+ /**
50
+ * Project a detailed resolution onto the `ResolvedPolicies` shape the
51
+ * compilers consume. `PolicyResolver.resolve()` is exactly
52
+ * `projectResolution(resolveDetailed(...))`; the explain path calls it on
53
+ * the SAME detailed object it reports on, so the compiled fragments stay
54
+ * positionally aligned with the reported entries.
55
+ */
56
+ export declare function projectResolution<C extends PolicyContext>(detailed: DetailedResolution<C>): ResolvedPolicies<C>;
33
57
  /**
34
58
  * Stable, value-free fingerprint of a context object. Used in audit
35
59
  * metadata so query logs can be correlated by ctx-shape WITHOUT leaking
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/policy/resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EACV,SAAS,EAGT,MAAM,EACN,aAAa,EACb,gBAAgB,EAEjB,MAAM,SAAS,CAAC;AAEjB;;;;;;;GAOG;AACH,qBAAa,cAAc,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IACjE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgD;IACzE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAGtC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EACvD,MAAM,EAAE,cAAc;IAMxB,kFAAkF;IAClF,MAAM,IAAI,OAAO;IAIjB;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;IA6C5E;;;OAGG;IACH,OAAO,CAAC,aAAa;CAgBtB;AAWD;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,CAK9D"}
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../../src/policy/resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,KAAK,EAEV,kBAAkB,EAClB,SAAS,EAGT,MAAM,EACN,aAAa,EACb,gBAAgB,EAEjB,MAAM,SAAS,CAAC;AAEjB;;;;;;;GAOG;AACH,qBAAa,cAAc,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IACjE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgD;IACzE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;gBAGtC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EACvD,MAAM,EAAE,cAAc;IAMxB,kFAAkF;IAClF,MAAM,IAAI,OAAO;IAIjB;;;;;;;;OAQG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI;IAK5E;;;;;;;;;;;;;OAaG;IACH,eAAe,CACb,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,SAAS,EACb,GAAG,EAAE,CAAC,GACL,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI;IA0D/B;;;;OAIG;IACH,OAAO,CAAC,aAAa;CAiBtB;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,aAAa,EACvD,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC9B,gBAAgB,CAAC,CAAC,CAAC,CAyCrB;AAWD;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,aAAa,GAAG,SAAS,GAAG,MAAM,CAK9D"}
@@ -26,67 +26,136 @@ export class PolicyResolver {
26
26
  * identical Cypher).
27
27
  */
28
28
  resolve(typeName, op, ctx) {
29
+ const detailed = this.resolveDetailed(typeName, op, ctx);
30
+ return detailed ? projectResolution(detailed) : null;
31
+ }
32
+ /**
33
+ * Resolve every operation-matching policy for `(typeName, op, ctx)`
34
+ * WITHOUT dropping any: `applied` records the `appliesWhen(ctx)` gate
35
+ * (or, for overrides, `when(ctx)`), and `skipped` marks policies never
36
+ * evaluated because an earlier override fired. This is the single place
37
+ * the resolver invokes `appliesWhen`; `resolve()` projects from it.
38
+ *
39
+ * Callback invocation order is unchanged from the pre-explain resolver:
40
+ * override `when` callbacks first (stopping at the first that fires),
41
+ * then `appliesWhen` in registration order — skipped entirely when an
42
+ * override fired.
43
+ *
44
+ * Returns `null` exactly when `resolve()` does.
45
+ */
46
+ resolveDetailed(typeName, op, ctx) {
29
47
  const sources = this.gatherSources(typeName);
30
48
  if (sources.length === 0)
31
49
  return null;
32
50
  const matching = [];
33
- for (const list of sources)
34
- for (const p of list)
35
- if (operationMatches(p.operations, op))
36
- matching.push(p);
51
+ for (const { source, policies } of sources)
52
+ policies.forEach((policy, index) => {
53
+ if (operationMatches(policy.operations, op))
54
+ matching.push({ policy, source, index });
55
+ });
37
56
  if (matching.length === 0)
38
57
  return null;
39
58
  // Override short-circuit. First matching override whose `when` returns
40
- // true wins — emit nothing.
41
- for (const p of matching)
42
- if (p.kind === 'override' && p.when(ctx))
43
- return {
44
- overridden: true,
45
- permissives: [],
46
- restrictives: [],
47
- evaluated: [p.name ?? 'override'],
48
- };
49
- const permissives = [];
50
- const restrictives = [];
51
- const evaluated = [];
52
- for (const p of matching)
53
- if (p.kind === 'permissive') {
54
- // appliesWhen is compile-time. False → drop policy entirely.
55
- if (p.appliesWhen && !p.appliesWhen(ctx))
56
- continue;
57
- permissives.push(p);
58
- evaluated.push(p.name ?? 'permissive');
59
+ // true wins — nothing after it is evaluated.
60
+ let firing = -1;
61
+ for (let i = 0; i < matching.length; i++) {
62
+ const p = matching[i].policy;
63
+ if (p.kind === 'override' && p.when(ctx)) {
64
+ firing = i;
65
+ break;
59
66
  }
60
- else if (p.kind === 'restrictive') {
61
- restrictives.push(p);
62
- evaluated.push(p.name ?? 'restrictive');
67
+ }
68
+ const entries = matching.map(({ policy, source, index }, i) => {
69
+ const named = Boolean(policy.name);
70
+ const name = named
71
+ ? policy.name
72
+ : `${source}.${policy.kind}[${index}]`;
73
+ const base = { policy, kind: policy.kind, source, index, name, named };
74
+ if (firing >= 0) {
75
+ if (i === firing)
76
+ return { ...base, applied: true, skipped: false };
77
+ // Overrides before the firing one WERE evaluated (to false).
78
+ if (policy.kind === 'override' && i < firing)
79
+ return { ...base, applied: false, skipped: false };
80
+ return { ...base, applied: false, skipped: true };
63
81
  }
82
+ if (policy.kind === 'override')
83
+ return { ...base, applied: false, skipped: false };
84
+ const applied = !policy.appliesWhen || policy.appliesWhen(ctx);
85
+ return { ...base, applied, skipped: false };
86
+ });
64
87
  return {
65
- overridden: false,
66
- permissives,
67
- restrictives,
68
- evaluated,
88
+ overriddenBy: firing >= 0 ? entries[firing].name : null,
89
+ entries,
69
90
  };
70
91
  }
71
92
  /**
72
93
  * Gather all sources of policy that apply to a given concrete type:
73
- * the type's own list, plus any interfaces it implements.
94
+ * the type's own list, plus any interfaces it implements — each tagged
95
+ * with the registry key that declared it.
74
96
  */
75
97
  gatherSources(typeName) {
76
98
  const out = [];
77
99
  const own = this.registry.get(typeName);
78
100
  if (own)
79
- out.push(own);
101
+ out.push({ source: typeName, policies: own });
80
102
  const nodeDef = this.schema.nodes.get(typeName);
81
103
  if (nodeDef)
82
104
  for (const ifaceName of nodeDef.implementsInterfaces) {
83
105
  const ifacePolicies = this.registry.get(ifaceName);
84
106
  if (ifacePolicies)
85
- out.push(ifacePolicies);
107
+ out.push({ source: ifaceName, policies: ifacePolicies });
86
108
  }
87
109
  return out;
88
110
  }
89
111
  }
112
+ /**
113
+ * Project a detailed resolution onto the `ResolvedPolicies` shape the
114
+ * compilers consume. `PolicyResolver.resolve()` is exactly
115
+ * `projectResolution(resolveDetailed(...))`; the explain path calls it on
116
+ * the SAME detailed object it reports on, so the compiled fragments stay
117
+ * positionally aligned with the reported entries.
118
+ */
119
+ export function projectResolution(detailed) {
120
+ if (detailed.overriddenBy !== null) {
121
+ const firing = detailed.entries.find((e) => e.policy.kind === 'override' && e.applied);
122
+ return {
123
+ overridden: true,
124
+ permissives: [],
125
+ restrictives: [],
126
+ evaluated: [firing.policy.name ?? 'override'],
127
+ };
128
+ }
129
+ const permissives = [];
130
+ const restrictives = [];
131
+ const evaluated = [];
132
+ for (const { policy: p, applied } of detailed.entries)
133
+ if (p.kind === 'permissive') {
134
+ // appliesWhen is compile-time. False → drop policy entirely.
135
+ if (!applied)
136
+ continue;
137
+ permissives.push(p);
138
+ evaluated.push(p.name ?? 'permissive');
139
+ }
140
+ else if (p.kind === 'restrictive') {
141
+ // Restrictives are kept even when `appliesWhen(ctx)` is false —
142
+ // the compiler / `evaluateWriteRestrictives` enforce the gate
143
+ // downstream. Dropping them here would change what
144
+ // `InterfaceModel.compileInterfacePolicyClause` sees: an
145
+ // implementer left with no permissives AND no restrictives is
146
+ // treated as unconstrained (`THEN true`) instead of default-deny.
147
+ restrictives.push(p);
148
+ // Audit metadata lists only policies that actually applied.
149
+ if (applied)
150
+ evaluated.push(p.name ?? 'restrictive');
151
+ }
152
+ return {
153
+ overridden: false,
154
+ permissives,
155
+ restrictives,
156
+ evaluated,
157
+ };
158
+ }
90
159
  function operationMatches(operations, op) {
91
160
  for (const candidate of operations)
92
161
  if (candidate === '*' || candidate === op)
@@ -1 +1 @@
1
- {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/policy/resolver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/policy/resolver.ts"],"names":[],"mappings":"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"}
@@ -167,6 +167,93 @@ export interface ResolvedPolicies<C extends PolicyContext = PolicyContext> {
167
167
  /** Names of policies that fired (for audit logging). */
168
168
  evaluated: ReadonlyArray<string>;
169
169
  }
170
+ /**
171
+ * One operation-matching policy as seen by
172
+ * `PolicyResolver.resolveDetailed()`. Unlike `ResolvedPolicies`, nothing
173
+ * is dropped: policies gated off by `appliesWhen` and policies never
174
+ * evaluated because an override fired are reported too. Consumed by the
175
+ * explain path (`Model.explainPolicies`).
176
+ */
177
+ export interface DetailedPolicy<C extends PolicyContext = PolicyContext> {
178
+ readonly policy: Policy<C>;
179
+ readonly kind: Policy<C>['kind'];
180
+ /** Type or interface whose registry entry declared this policy. */
181
+ readonly source: string;
182
+ /** Position in `source`'s registration list (all operations counted). */
183
+ readonly index: number;
184
+ /** `policy.name`, or `<source>.<kind>[<index>]` when unnamed. */
185
+ readonly name: string;
186
+ /** False when `name` is the synthesized fallback identifier. */
187
+ readonly named: boolean;
188
+ /**
189
+ * `appliesWhen(ctx)` held (absent counts as held). For an override:
190
+ * its `when(ctx)` returned true. Always false when `skipped`.
191
+ */
192
+ readonly applied: boolean;
193
+ /** Not evaluated at all because an earlier override fired. */
194
+ readonly skipped: boolean;
195
+ }
196
+ /**
197
+ * Outcome of one policy for one candidate node, as reported by
198
+ * `Model.explainPolicies()`:
199
+ *
200
+ * - `pass` — applied; its predicate evaluated to `true`.
201
+ * - `fail` — applied; evaluated to `false` (includes a restrictive hard
202
+ * deny, `when: () => false`).
203
+ * - `null` — applied; evaluated to NULL (three-valued logic, e.g. a
204
+ * missing property). Enforcement treats it as not-true.
205
+ * - `abstain` — applied, but emitted no predicate. A permissive abstain
206
+ * grants nothing; a restrictive abstain restricts nothing.
207
+ * - `not-applied` — `appliesWhen(ctx)` was false (override: `when(ctx)`
208
+ * was false). Not compiled or evaluated.
209
+ * - `skipped` — not evaluated because an earlier override fired.
210
+ */
211
+ export type PolicyClauseOutcome = 'pass' | 'fail' | 'null' | 'abstain' | 'not-applied' | 'skipped';
212
+ /** One policy's report within a `PolicyExplanation`. */
213
+ export interface PolicyClauseExplanation {
214
+ /** `policy.name`, or `<source>.<kind>[<index>]` when unnamed. */
215
+ readonly name: string;
216
+ /** False when `name` is the synthesized fallback identifier. */
217
+ readonly named: boolean;
218
+ readonly kind: 'override' | 'permissive' | 'restrictive';
219
+ /** Type or interface whose registry entry declared the policy. */
220
+ readonly source: string;
221
+ /** `appliesWhen(ctx)` held (override: `when(ctx)` was true). */
222
+ readonly applied: boolean;
223
+ readonly outcome: PolicyClauseOutcome;
224
+ }
225
+ /**
226
+ * Per-candidate result of `Model.explainPolicies()`. `visible` is the
227
+ * exact verdict `find` enforces for the same bound context; the other
228
+ * fields explain it.
229
+ */
230
+ export interface PolicyExplanation<T = Record<string, unknown>> {
231
+ /** The candidate, projected with the requested selection. */
232
+ readonly node: T;
233
+ /** Would `find` return this node for the bound context? */
234
+ readonly visible: boolean;
235
+ /** Name of the override that fired, else `null`. */
236
+ readonly overriddenBy: string | null;
237
+ /**
238
+ * Some permissive granted access (`true` when an override fired or the
239
+ * type has no policies). `false` → default deny.
240
+ */
241
+ readonly permissiveGranted: boolean;
242
+ /** Names of applied restrictives whose outcome is `fail` or `null`. */
243
+ readonly failedRestrictives: ReadonlyArray<string>;
244
+ /** Every `read` policy for the type, in registration order. */
245
+ readonly policies: ReadonlyArray<PolicyClauseExplanation>;
246
+ }
247
+ /**
248
+ * Full resolution for one (typeName, operation, ctx) triple. Entries are
249
+ * in registration order — the type's own policies first, then each
250
+ * implemented interface's.
251
+ */
252
+ export interface DetailedResolution<C extends PolicyContext = PolicyContext> {
253
+ /** Fallback-aware name of the override that fired, else `null`. */
254
+ readonly overriddenBy: string | null;
255
+ readonly entries: ReadonlyArray<DetailedPolicy<C>>;
256
+ }
170
257
  /**
171
258
  * Carries policy state through one compile pass. Created per query in
172
259
  * `Model` / `InterfaceModel` and threaded into `WhereCompiler` /
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/policy/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/policy/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEpD;;;GAGG;AACH,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,WAAW,GACX,OAAO,CAAC;AAEZ,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,GAAG,CAAC;AAElD;;;;;GAKG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IACrE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;IACnC,gEAAgE;IAChE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,gBAAgB,CAC/B,CAAC,SAAS,aAAa,GAAG,aAAa,EACvC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,mBAAmB,CAAC,CAAC;IACxD,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IAC9B,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,KAAK,MAAM,CAAC;QACtD,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC7C,CAAC;IACF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,OAAO,CAAC;AAEtE;;;;;;;;;GASG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjD;;;;;GAKG;AACH,MAAM,WAAW,qBAAqB,CACpC,CAAC,SAAS,aAAa,GAAG,aAAa,EACvC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC;IAClD,oEAAoE;IACpE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,KAAK,MAAM,CAAC;QACtD,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KAC7C,CAAC;IACF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,sBAAsB,CACrC,CAAC,SAAS,aAAa,GAAG,aAAa,EACvC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAE3D,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC;IACnD,wEAAwE;IACxE,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC;IAC3C;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC;IAC7C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;;;;;;;;;GAUG;AACH,MAAM,MAAM,iBAAiB,CAC3B,CAAC,SAAS,aAAa,GAAG,aAAa,EACvC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACzD,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAE/D,MAAM,MAAM,MAAM,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,IACtD,cAAc,CAAC,CAAC,CAAC,GACjB,gBAAgB,CAAC,CAAC,CAAC,GACnB,iBAAiB,CAAC,CAAC,CAAC,CAAC;AAEzB;;;;;;;;GAQG;AACH,MAAM,MAAM,eAAe,CACzB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,CAAC,SAAS,aAAa,GAAG,aAAa,IACrC;KACD,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;CACnD,GAAG;IACF,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;CAC1D,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,gEAAgE;IAChE,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC3B,2EAA2E;IAC3E,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA0CD,wBAAgB,QAAQ,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa,EAC9D,IAAI,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,GACpC,cAAc,CAAC,CAAC,CAAC,CAQnB;AAED,wBAAgB,UAAU,CACxB,CAAC,SAAS,aAAa,GAAG,aAAa,EACvC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,IAAI,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAkBpE;AAwCD,wBAAgB,WAAW,CACzB,CAAC,SAAS,aAAa,GAAG,aAAa,EACvC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAE3D,IAAI,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,GAC/C,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAChC,wBAAgB,WAAW,CACzB,CAAC,SAAS,aAAa,GAAG,aAAa,EACvC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC3D,IAAI,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,qBAAqB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAsDhF,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,aAAa,EACvD,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GACtB,CAAC,IAAI,qBAAqB,CAAC,CAAC,CAAC,CAI/B;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,aAAa,EACxD,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GACtB,CAAC,IAAI,sBAAsB,CAAC,CAAC,CAAC,CAIhC;AAED;;;;GAIG;AACH,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IACvE,yEAAyE;IACzE,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,YAAY,EAAE,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IAClD,wDAAwD;IACxD,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CAClC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IACrE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IACjC,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yEAAyE;IACzE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,8DAA8D;IAC9D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,mBAAmB,GAC3B,MAAM,GACN,MAAM,GACN,MAAM,GACN,SAAS,GACT,aAAa,GACb,SAAS,CAAC;AAEd,wDAAwD;AACxD,MAAM,WAAW,uBAAuB;IACtC,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,YAAY,GAAG,aAAa,CAAC;IACzD,kEAAkE;IAClE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;CACvC;AAED;;;;GAIG;AACH,MAAM,WAAW,iBAAiB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC5D,6DAA6D;IAC7D,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IACjB,2DAA2D;IAC3D,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC;;;OAGG;IACH,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,uEAAuE;IACvE,QAAQ,CAAC,kBAAkB,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IACnD,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,uBAAuB,CAAC,CAAC;CAC3D;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IACzE,mEAAmE;IACnE,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;CACpD;AAED;;;;GAIG;AACH,MAAM,WAAW,mBAAmB,CAAC,CAAC,SAAS,aAAa,GAAG,aAAa;IAC1E,GAAG,EAAE,CAAC,CAAC;IACP,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC9B,SAAS,EAAE,SAAS,CAAC;IACrB;;;;;OAKG;IACH,cAAc,EAAE,CACd,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,SAAS,KACV,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAChC,0DAA0D;IAC1D,QAAQ,EAAE,cAAc,CAAC;CAC1B"}