@nifrajs/core 1.11.0 → 1.12.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.
- package/dist/causality.d.ts +132 -0
- package/dist/causality.d.ts.map +1 -0
- package/dist/causality.js +380 -0
- package/dist/causality.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/invariants.d.ts +4 -0
- package/dist/invariants.d.ts.map +1 -1
- package/dist/invariants.js +4 -0
- package/dist/invariants.js.map +1 -1
- package/dist/server/server.d.ts +6 -0
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +10 -0
- package/dist/server/server.js.map +1 -1
- package/package.json +6 -1
- package/src/causality.ts +550 -0
- package/src/index.ts +2 -1
- package/src/invariants.ts +4 -0
- package/src/server/server.ts +14 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-neutral execution causality.
|
|
3
|
+
*
|
|
4
|
+
* Traces describe one synchronous/remote observation tree. Causality survives the durable seams a
|
|
5
|
+
* trace cannot: a command commits an outbox event, a workflow resumes tomorrow, a projection
|
|
6
|
+
* consumes that event, and reconciliation repairs drift. This module carries only bounded identity
|
|
7
|
+
* tokens and links; payloads, tenant identifiers, request URLs, and arbitrary attributes cannot enter
|
|
8
|
+
* the graph by construction.
|
|
9
|
+
*/
|
|
10
|
+
/** A node category such as `request`, `command`, `event`, `workflow`, `projection`, or `repair`. */
|
|
11
|
+
export type CausalityKind = string;
|
|
12
|
+
/** A bounded identity within one execution graph. */
|
|
13
|
+
export interface CausalityRef {
|
|
14
|
+
readonly kind: CausalityKind;
|
|
15
|
+
readonly id: string;
|
|
16
|
+
}
|
|
17
|
+
/** Optional OpenTelemetry anchor for the nearest observed ancestor. */
|
|
18
|
+
export interface CausalityTrace {
|
|
19
|
+
readonly traceId: string;
|
|
20
|
+
readonly spanId: string;
|
|
21
|
+
}
|
|
22
|
+
/** The propagation shape carried across commands/events/jobs. */
|
|
23
|
+
export interface CausalityContext {
|
|
24
|
+
readonly executionId: string;
|
|
25
|
+
readonly current: CausalityRef;
|
|
26
|
+
/** Nearest observed ancestor; downstream observations can attach a real OTel span link to it. */
|
|
27
|
+
readonly trace?: CausalityTrace;
|
|
28
|
+
}
|
|
29
|
+
/** One immediate parent edge. Relation is a bounded token (`caused`, `emitted`, `projected`, …). */
|
|
30
|
+
export interface CausalityParent extends CausalityRef {
|
|
31
|
+
readonly relation: string;
|
|
32
|
+
}
|
|
33
|
+
/** One append-only graph record. It intentionally has no payload or metadata field. */
|
|
34
|
+
export interface CausalityRecord {
|
|
35
|
+
readonly executionId: string;
|
|
36
|
+
readonly node: CausalityRef & {
|
|
37
|
+
readonly at: number;
|
|
38
|
+
/** Present only when this node itself opened an observation. */
|
|
39
|
+
readonly trace?: CausalityTrace;
|
|
40
|
+
};
|
|
41
|
+
readonly parents: readonly CausalityParent[];
|
|
42
|
+
}
|
|
43
|
+
/** A propagation context plus the graph record a durable adapter should append. */
|
|
44
|
+
export interface CausalityStep {
|
|
45
|
+
readonly context: CausalityContext;
|
|
46
|
+
readonly record: CausalityRecord;
|
|
47
|
+
}
|
|
48
|
+
export interface CausalityRecorder<Tx = unknown> {
|
|
49
|
+
/** Idempotently append one node and its immediate incoming edges. */
|
|
50
|
+
record(record: CausalityRecord, tx?: Tx): Promise<"inserted" | "duplicate">;
|
|
51
|
+
}
|
|
52
|
+
export interface CausalityTimelineItem {
|
|
53
|
+
readonly cursor: string;
|
|
54
|
+
readonly record: CausalityRecord;
|
|
55
|
+
}
|
|
56
|
+
export interface CausalityTimelinePage {
|
|
57
|
+
readonly items: readonly CausalityTimelineItem[];
|
|
58
|
+
readonly nextCursor?: string;
|
|
59
|
+
}
|
|
60
|
+
export interface CausalityReader {
|
|
61
|
+
timeline(executionId: string, options?: {
|
|
62
|
+
readonly after?: string;
|
|
63
|
+
readonly limit?: number;
|
|
64
|
+
}): Promise<CausalityTimelinePage>;
|
|
65
|
+
}
|
|
66
|
+
export type CausalityGraphStore<Tx = unknown> = CausalityRecorder<Tx> & CausalityReader;
|
|
67
|
+
export declare class CausalityConflictError extends Error {
|
|
68
|
+
readonly executionId: string;
|
|
69
|
+
readonly node: CausalityRef;
|
|
70
|
+
constructor(executionId: string, node: CausalityRef);
|
|
71
|
+
}
|
|
72
|
+
export declare class CausalityCapacityError extends Error {
|
|
73
|
+
readonly maxRecords: number;
|
|
74
|
+
constructor(maxRecords: number);
|
|
75
|
+
}
|
|
76
|
+
export interface StartCausalityOptions {
|
|
77
|
+
/** Stable graph identity. Generate once at the ingress boundary, then propagate it. */
|
|
78
|
+
readonly executionId: string;
|
|
79
|
+
/** Epoch milliseconds. Injectable for deterministic tests. Default `Date.now()`. */
|
|
80
|
+
readonly at?: number;
|
|
81
|
+
/** Observation opened for this exact node. */
|
|
82
|
+
readonly trace?: CausalityTrace;
|
|
83
|
+
}
|
|
84
|
+
export interface ContinueCausalityOptions {
|
|
85
|
+
/** Edge relation. Default `caused`. */
|
|
86
|
+
readonly relation?: string;
|
|
87
|
+
/** Epoch milliseconds. Injectable for deterministic tests. Default `Date.now()`. */
|
|
88
|
+
readonly at?: number;
|
|
89
|
+
/** A new observation opened for this exact node; otherwise the nearest anchor is propagated. */
|
|
90
|
+
readonly trace?: CausalityTrace;
|
|
91
|
+
}
|
|
92
|
+
export type CausalityParseResult = {
|
|
93
|
+
readonly success: true;
|
|
94
|
+
readonly context: CausalityContext;
|
|
95
|
+
} | {
|
|
96
|
+
readonly success: false;
|
|
97
|
+
readonly reason: "missing" | "incomplete" | "invalid" | "unknown-field";
|
|
98
|
+
};
|
|
99
|
+
export type CausalityRecordParseResult = {
|
|
100
|
+
readonly success: true;
|
|
101
|
+
readonly record: CausalityRecord;
|
|
102
|
+
} | {
|
|
103
|
+
readonly success: false;
|
|
104
|
+
readonly reason: "incomplete" | "invalid" | "unknown-field";
|
|
105
|
+
};
|
|
106
|
+
export declare const CAUSALITY_EXECUTION_HEADER = "x-nifra-execution-id";
|
|
107
|
+
export declare const CAUSALITY_KIND_HEADER = "x-nifra-causality-kind";
|
|
108
|
+
export declare const CAUSALITY_NODE_HEADER = "x-nifra-causality-id";
|
|
109
|
+
export declare const CAUSALITY_TRACE_HEADER = "x-nifra-causality-trace";
|
|
110
|
+
/** Start a root execution node at an ingress boundary. */
|
|
111
|
+
export declare function startCausality(nodeKind: CausalityKind, id: string, options: StartCausalityOptions): CausalityStep;
|
|
112
|
+
/** Continue one execution from a single immediate parent. */
|
|
113
|
+
export declare function continueCausality(parent: CausalityContext, nodeKind: CausalityKind, id: string, options?: ContinueCausalityOptions): CausalityStep;
|
|
114
|
+
/** Join several immediate parents. Cross-execution joins fail closed. */
|
|
115
|
+
export declare function joinCausality(parents: readonly CausalityContext[], nodeKind: CausalityKind, id: string, options?: ContinueCausalityOptions): CausalityStep;
|
|
116
|
+
/** Parse an untrusted durable graph record. Unknown fields fail closed at every nesting level. */
|
|
117
|
+
export declare function parseCausalityRecord(input: unknown): CausalityRecordParseResult;
|
|
118
|
+
/** Parse an untrusted JSON causality context. Unknown fields fail closed so payloads cannot hitchhike. */
|
|
119
|
+
export declare function parseCausalityContext(input: unknown): CausalityParseResult;
|
|
120
|
+
/** Serialize the propagation context into bounded HTTP headers. */
|
|
121
|
+
export declare function causalityHeaders(context: CausalityContext): Readonly<Record<string, string>>;
|
|
122
|
+
/** Parse the public header convention without ever throwing on hostile input. */
|
|
123
|
+
export declare function readCausalityHeaders(headers: Headers): CausalityParseResult;
|
|
124
|
+
export interface MemoryCausalityStoreOptions {
|
|
125
|
+
/** Global record bound. Default 10,000. */
|
|
126
|
+
readonly maxRecords?: number;
|
|
127
|
+
/** In-memory evidence disappears on restart and is rejected in production unless explicitly allowed. */
|
|
128
|
+
readonly allowInProduction?: boolean;
|
|
129
|
+
}
|
|
130
|
+
/** Bounded dev/test graph store. Production callers should provide a durable adapter. */
|
|
131
|
+
export declare function createMemoryCausalityStore(options?: MemoryCausalityStoreOptions): CausalityGraphStore;
|
|
132
|
+
//# sourceMappingURL=causality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"causality.d.ts","sourceRoot":"","sources":["../src/causality.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,oGAAoG;AACpG,MAAM,MAAM,aAAa,GAAG,MAAM,CAAA;AAElC,qDAAqD;AACrD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CACpB;AAED,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;IAC9B,iGAAiG;IACjG,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAA;CAChC;AAED,oGAAoG;AACpG,MAAM,WAAW,eAAgB,SAAQ,YAAY;IACnD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAED,uFAAuF;AACvF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG;QAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;QACnB,gEAAgE;QAChE,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAA;KAChC,CAAA;IACD,QAAQ,CAAC,OAAO,EAAE,SAAS,eAAe,EAAE,CAAA;CAC7C;AAED,mFAAmF;AACnF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAA;IAClC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;CACjC;AAED,MAAM,WAAW,iBAAiB,CAAC,EAAE,GAAG,OAAO;IAC7C,qEAAqE;IACrE,MAAM,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,UAAU,GAAG,WAAW,CAAC,CAAA;CAC5E;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,SAAS,qBAAqB,EAAE,CAAA;IAChD,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CACN,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC7D,OAAO,CAAC,qBAAqB,CAAC,CAAA;CAClC;AAED,MAAM,MAAM,mBAAmB,CAAC,EAAE,GAAG,OAAO,IAAI,iBAAiB,CAAC,EAAE,CAAC,GAAG,eAAe,CAAA;AAEvF,qBAAa,sBAAuB,SAAQ,KAAK;IAE7C,QAAQ,CAAC,WAAW,EAAE,MAAM;IAC5B,QAAQ,CAAC,IAAI,EAAE,YAAY;gBADlB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,YAAY;CAK9B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;IACnC,QAAQ,CAAC,UAAU,EAAE,MAAM;gBAAlB,UAAU,EAAE,MAAM;CAIxC;AAED,MAAM,WAAW,qBAAqB;IACpC,uFAAuF;IACvF,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,oFAAoF;IACpF,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;IACpB,8CAA8C;IAC9C,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAA;CAChC;AAED,MAAM,WAAW,wBAAwB;IACvC,uCAAuC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;IACpB,gGAAgG;IAChG,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,CAAA;CAChC;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAA;CAAE,GAC9D;IACE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,SAAS,GAAG,YAAY,GAAG,SAAS,GAAG,eAAe,CAAA;CACxE,CAAA;AAEL,MAAM,MAAM,0BAA0B,GAClC;IAAE,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAA;CAAE,GAC5D;IACE,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,GAAG,eAAe,CAAA;CAC5D,CAAA;AAEL,eAAO,MAAM,0BAA0B,yBAAyB,CAAA;AAChE,eAAO,MAAM,qBAAqB,2BAA2B,CAAA;AAC7D,eAAO,MAAM,qBAAqB,yBAAyB,CAAA;AAC3D,eAAO,MAAM,sBAAsB,4BAA4B,CAAA;AA2G/D,0DAA0D;AAC1D,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,aAAa,EACvB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,qBAAqB,GAC7B,aAAa,CAKf;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,aAAa,EACvB,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,wBAA6B,GACrC,aAAa,CAEf;AAED,yEAAyE;AACzE,wBAAgB,aAAa,CAC3B,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,QAAQ,EAAE,aAAa,EACvB,EAAE,EAAE,MAAM,EACV,OAAO,GAAE,wBAA6B,GACrC,aAAa,CA6Bf;AASD,kGAAkG;AAClG,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,0BAA0B,CA8D/E;AAED,0GAA0G;AAC1G,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAwC1E;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAa5F;AAED,iFAAiF;AACjF,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,oBAAoB,CAsB3E;AAQD,MAAM,WAAW,2BAA2B;IAC1C,2CAA2C;IAC3C,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,wGAAwG;IACxG,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;CACrC;AAeD,yFAAyF;AACzF,wBAAgB,0BAA0B,CACxC,OAAO,GAAE,2BAAgC,GACxC,mBAAmB,CAmErB"}
|
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-neutral execution causality.
|
|
3
|
+
*
|
|
4
|
+
* Traces describe one synchronous/remote observation tree. Causality survives the durable seams a
|
|
5
|
+
* trace cannot: a command commits an outbox event, a workflow resumes tomorrow, a projection
|
|
6
|
+
* consumes that event, and reconciliation repairs drift. This module carries only bounded identity
|
|
7
|
+
* tokens and links; payloads, tenant identifiers, request URLs, and arbitrary attributes cannot enter
|
|
8
|
+
* the graph by construction.
|
|
9
|
+
*/
|
|
10
|
+
export class CausalityConflictError extends Error {
|
|
11
|
+
executionId;
|
|
12
|
+
node;
|
|
13
|
+
constructor(executionId, node) {
|
|
14
|
+
super(`causality conflict: ${node.kind}:${node.id} changed inside execution ${executionId}`);
|
|
15
|
+
this.executionId = executionId;
|
|
16
|
+
this.node = node;
|
|
17
|
+
this.name = "CausalityConflictError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export class CausalityCapacityError extends Error {
|
|
21
|
+
maxRecords;
|
|
22
|
+
constructor(maxRecords) {
|
|
23
|
+
super(`causality store capacity exceeded (${maxRecords} records)`);
|
|
24
|
+
this.maxRecords = maxRecords;
|
|
25
|
+
this.name = "CausalityCapacityError";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export const CAUSALITY_EXECUTION_HEADER = "x-nifra-execution-id";
|
|
29
|
+
export const CAUSALITY_KIND_HEADER = "x-nifra-causality-kind";
|
|
30
|
+
export const CAUSALITY_NODE_HEADER = "x-nifra-causality-id";
|
|
31
|
+
export const CAUSALITY_TRACE_HEADER = "x-nifra-causality-trace";
|
|
32
|
+
const IDENTITY = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
|
|
33
|
+
const KIND = /^[a-z][a-z0-9._-]{0,63}$/;
|
|
34
|
+
const RELATION = /^[a-z][a-z0-9._-]{0,63}$/;
|
|
35
|
+
const TRACE_ID = /^[0-9a-f]{32}$/;
|
|
36
|
+
const SPAN_ID = /^[0-9a-f]{16}$/;
|
|
37
|
+
const MAX_PARENTS = 16;
|
|
38
|
+
const DEFAULT_TIMELINE_LIMIT = 100;
|
|
39
|
+
const MAX_TIMELINE_LIMIT = 500;
|
|
40
|
+
function identity(value, label) {
|
|
41
|
+
if (!IDENTITY.test(value)) {
|
|
42
|
+
throw new TypeError(`causality: ${label} must be a bounded identity token`);
|
|
43
|
+
}
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
function kind(value) {
|
|
47
|
+
if (!KIND.test(value))
|
|
48
|
+
throw new TypeError("causality: kind must be a bounded lowercase token");
|
|
49
|
+
return value;
|
|
50
|
+
}
|
|
51
|
+
function relation(value) {
|
|
52
|
+
if (!RELATION.test(value)) {
|
|
53
|
+
throw new TypeError("causality: relation must be a bounded lowercase token");
|
|
54
|
+
}
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
function timestamp(value) {
|
|
58
|
+
const at = value ?? Date.now();
|
|
59
|
+
if (!Number.isSafeInteger(at) || at < 0) {
|
|
60
|
+
throw new TypeError("causality: at must be a non-negative safe-integer epoch millisecond");
|
|
61
|
+
}
|
|
62
|
+
return at;
|
|
63
|
+
}
|
|
64
|
+
function trace(value) {
|
|
65
|
+
if (value === undefined)
|
|
66
|
+
return undefined;
|
|
67
|
+
if (!TRACE_ID.test(value.traceId) || !SPAN_ID.test(value.spanId)) {
|
|
68
|
+
throw new TypeError("causality: trace must contain lowercase W3C trace/span ids");
|
|
69
|
+
}
|
|
70
|
+
return Object.freeze({ traceId: value.traceId, spanId: value.spanId });
|
|
71
|
+
}
|
|
72
|
+
function ref(nodeKind, id) {
|
|
73
|
+
return Object.freeze({ kind: kind(nodeKind), id: identity(id, "node id") });
|
|
74
|
+
}
|
|
75
|
+
function recordOf(value) {
|
|
76
|
+
return value !== null && typeof value === "object" && !Array.isArray(value)
|
|
77
|
+
? value
|
|
78
|
+
: undefined;
|
|
79
|
+
}
|
|
80
|
+
function onlyKeys(value, allowed) {
|
|
81
|
+
return Object.keys(value).every((key) => allowed.has(key));
|
|
82
|
+
}
|
|
83
|
+
function buildStep(executionId, current, parents, at, nodeTrace, propagatedTrace) {
|
|
84
|
+
const node = Object.freeze({
|
|
85
|
+
...current,
|
|
86
|
+
at,
|
|
87
|
+
...(nodeTrace === undefined ? {} : { trace: nodeTrace }),
|
|
88
|
+
});
|
|
89
|
+
const frozenParents = Object.freeze([...parents]);
|
|
90
|
+
const context = Object.freeze({
|
|
91
|
+
executionId,
|
|
92
|
+
current,
|
|
93
|
+
...(propagatedTrace === undefined ? {} : { trace: propagatedTrace }),
|
|
94
|
+
});
|
|
95
|
+
const record = Object.freeze({ executionId, node, parents: frozenParents });
|
|
96
|
+
return Object.freeze({ context, record });
|
|
97
|
+
}
|
|
98
|
+
function normalizeRecord(input) {
|
|
99
|
+
const executionId = identity(input.executionId, "executionId");
|
|
100
|
+
if (input.parents.length > MAX_PARENTS) {
|
|
101
|
+
throw new RangeError(`causality: a record cannot have more than ${MAX_PARENTS} parents`);
|
|
102
|
+
}
|
|
103
|
+
const current = ref(input.node.kind, input.node.id);
|
|
104
|
+
const nodeTrace = trace(input.node.trace);
|
|
105
|
+
const parents = input.parents.map((parent) => Object.freeze({
|
|
106
|
+
...ref(parent.kind, parent.id),
|
|
107
|
+
relation: relation(parent.relation),
|
|
108
|
+
}));
|
|
109
|
+
return Object.freeze({
|
|
110
|
+
executionId,
|
|
111
|
+
node: Object.freeze({
|
|
112
|
+
...current,
|
|
113
|
+
at: timestamp(input.node.at),
|
|
114
|
+
...(nodeTrace === undefined ? {} : { trace: nodeTrace }),
|
|
115
|
+
}),
|
|
116
|
+
parents: Object.freeze(parents),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
/** Start a root execution node at an ingress boundary. */
|
|
120
|
+
export function startCausality(nodeKind, id, options) {
|
|
121
|
+
const executionId = identity(options.executionId, "executionId");
|
|
122
|
+
const current = ref(nodeKind, id);
|
|
123
|
+
const nodeTrace = trace(options.trace);
|
|
124
|
+
return buildStep(executionId, current, [], timestamp(options.at), nodeTrace, nodeTrace);
|
|
125
|
+
}
|
|
126
|
+
/** Continue one execution from a single immediate parent. */
|
|
127
|
+
export function continueCausality(parent, nodeKind, id, options = {}) {
|
|
128
|
+
return joinCausality([parent], nodeKind, id, options);
|
|
129
|
+
}
|
|
130
|
+
/** Join several immediate parents. Cross-execution joins fail closed. */
|
|
131
|
+
export function joinCausality(parents, nodeKind, id, options = {}) {
|
|
132
|
+
if (parents.length === 0 || parents.length > MAX_PARENTS) {
|
|
133
|
+
throw new RangeError(`causality: parents must contain 1 to ${MAX_PARENTS} contexts`);
|
|
134
|
+
}
|
|
135
|
+
const executionId = identity(parents[0]?.executionId ?? "", "executionId");
|
|
136
|
+
if (parents.some((parent) => parent.executionId !== executionId)) {
|
|
137
|
+
throw new Error("causality: joined parents must belong to the same execution");
|
|
138
|
+
}
|
|
139
|
+
const edgeRelation = relation(options.relation ?? "caused");
|
|
140
|
+
const seen = new Set();
|
|
141
|
+
const incoming = [];
|
|
142
|
+
for (const parent of parents) {
|
|
143
|
+
const parentRef = ref(parent.current.kind, parent.current.id);
|
|
144
|
+
const key = `${parentRef.kind}\n${parentRef.id}`;
|
|
145
|
+
if (seen.has(key))
|
|
146
|
+
continue;
|
|
147
|
+
seen.add(key);
|
|
148
|
+
incoming.push(Object.freeze({ ...parentRef, relation: edgeRelation }));
|
|
149
|
+
}
|
|
150
|
+
const current = ref(nodeKind, id);
|
|
151
|
+
const nodeTrace = trace(options.trace);
|
|
152
|
+
const propagatedTrace = nodeTrace ?? parents.find((parent) => parent.trace !== undefined)?.trace;
|
|
153
|
+
return buildStep(executionId, current, incoming, timestamp(options.at), nodeTrace, propagatedTrace);
|
|
154
|
+
}
|
|
155
|
+
const CONTEXT_FIELDS = new Set(["executionId", "current", "trace"]);
|
|
156
|
+
const REF_FIELDS = new Set(["kind", "id"]);
|
|
157
|
+
const TRACE_FIELDS = new Set(["traceId", "spanId"]);
|
|
158
|
+
const RECORD_FIELDS = new Set(["executionId", "node", "parents"]);
|
|
159
|
+
const NODE_FIELDS = new Set(["kind", "id", "at", "trace"]);
|
|
160
|
+
const PARENT_FIELDS = new Set(["kind", "id", "relation"]);
|
|
161
|
+
/** Parse an untrusted durable graph record. Unknown fields fail closed at every nesting level. */
|
|
162
|
+
export function parseCausalityRecord(input) {
|
|
163
|
+
const value = recordOf(input);
|
|
164
|
+
if (value === undefined)
|
|
165
|
+
return { success: false, reason: "invalid" };
|
|
166
|
+
if (!onlyKeys(value, RECORD_FIELDS))
|
|
167
|
+
return { success: false, reason: "unknown-field" };
|
|
168
|
+
const node = recordOf(value.node);
|
|
169
|
+
if (node === undefined || !Array.isArray(value.parents)) {
|
|
170
|
+
return { success: false, reason: "incomplete" };
|
|
171
|
+
}
|
|
172
|
+
if (!onlyKeys(node, NODE_FIELDS))
|
|
173
|
+
return { success: false, reason: "unknown-field" };
|
|
174
|
+
const nodeTrace = value.node !== undefined && node.trace !== undefined ? recordOf(node.trace) : undefined;
|
|
175
|
+
if (node.trace !== undefined && nodeTrace === undefined) {
|
|
176
|
+
return { success: false, reason: "invalid" };
|
|
177
|
+
}
|
|
178
|
+
if (nodeTrace !== undefined && !onlyKeys(nodeTrace, TRACE_FIELDS)) {
|
|
179
|
+
return { success: false, reason: "unknown-field" };
|
|
180
|
+
}
|
|
181
|
+
const parents = [];
|
|
182
|
+
for (const rawParent of value.parents) {
|
|
183
|
+
const parent = recordOf(rawParent);
|
|
184
|
+
if (parent === undefined)
|
|
185
|
+
return { success: false, reason: "invalid" };
|
|
186
|
+
if (!onlyKeys(parent, PARENT_FIELDS))
|
|
187
|
+
return { success: false, reason: "unknown-field" };
|
|
188
|
+
if (typeof parent.kind !== "string" ||
|
|
189
|
+
typeof parent.id !== "string" ||
|
|
190
|
+
typeof parent.relation !== "string") {
|
|
191
|
+
return { success: false, reason: "incomplete" };
|
|
192
|
+
}
|
|
193
|
+
parents.push({ kind: parent.kind, id: parent.id, relation: parent.relation });
|
|
194
|
+
}
|
|
195
|
+
if (typeof value.executionId !== "string" ||
|
|
196
|
+
typeof node.kind !== "string" ||
|
|
197
|
+
typeof node.id !== "string" ||
|
|
198
|
+
typeof node.at !== "number" ||
|
|
199
|
+
(nodeTrace !== undefined &&
|
|
200
|
+
(typeof nodeTrace.traceId !== "string" || typeof nodeTrace.spanId !== "string"))) {
|
|
201
|
+
return { success: false, reason: "incomplete" };
|
|
202
|
+
}
|
|
203
|
+
try {
|
|
204
|
+
return {
|
|
205
|
+
success: true,
|
|
206
|
+
record: normalizeRecord({
|
|
207
|
+
executionId: value.executionId,
|
|
208
|
+
node: {
|
|
209
|
+
kind: node.kind,
|
|
210
|
+
id: node.id,
|
|
211
|
+
at: node.at,
|
|
212
|
+
...(nodeTrace === undefined
|
|
213
|
+
? {}
|
|
214
|
+
: {
|
|
215
|
+
trace: { traceId: nodeTrace.traceId, spanId: nodeTrace.spanId },
|
|
216
|
+
}),
|
|
217
|
+
},
|
|
218
|
+
parents,
|
|
219
|
+
}),
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
return { success: false, reason: "invalid" };
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/** Parse an untrusted JSON causality context. Unknown fields fail closed so payloads cannot hitchhike. */
|
|
227
|
+
export function parseCausalityContext(input) {
|
|
228
|
+
const value = recordOf(input);
|
|
229
|
+
if (value === undefined)
|
|
230
|
+
return { success: false, reason: "invalid" };
|
|
231
|
+
if (!onlyKeys(value, CONTEXT_FIELDS))
|
|
232
|
+
return { success: false, reason: "unknown-field" };
|
|
233
|
+
const current = recordOf(value.current);
|
|
234
|
+
if (current === undefined)
|
|
235
|
+
return { success: false, reason: "incomplete" };
|
|
236
|
+
if (!onlyKeys(current, REF_FIELDS))
|
|
237
|
+
return { success: false, reason: "unknown-field" };
|
|
238
|
+
const rawTrace = value.trace === undefined ? undefined : recordOf(value.trace);
|
|
239
|
+
if (value.trace !== undefined && rawTrace === undefined) {
|
|
240
|
+
return { success: false, reason: "invalid" };
|
|
241
|
+
}
|
|
242
|
+
if (rawTrace !== undefined && !onlyKeys(rawTrace, TRACE_FIELDS)) {
|
|
243
|
+
return { success: false, reason: "unknown-field" };
|
|
244
|
+
}
|
|
245
|
+
if (typeof value.executionId !== "string" ||
|
|
246
|
+
typeof current.kind !== "string" ||
|
|
247
|
+
typeof current.id !== "string" ||
|
|
248
|
+
(rawTrace !== undefined &&
|
|
249
|
+
(typeof rawTrace.traceId !== "string" || typeof rawTrace.spanId !== "string"))) {
|
|
250
|
+
return { success: false, reason: "incomplete" };
|
|
251
|
+
}
|
|
252
|
+
try {
|
|
253
|
+
const context = Object.freeze({
|
|
254
|
+
executionId: identity(value.executionId, "executionId"),
|
|
255
|
+
current: ref(current.kind, current.id),
|
|
256
|
+
...(rawTrace === undefined
|
|
257
|
+
? {}
|
|
258
|
+
: {
|
|
259
|
+
trace: trace({
|
|
260
|
+
traceId: rawTrace.traceId,
|
|
261
|
+
spanId: rawTrace.spanId,
|
|
262
|
+
}),
|
|
263
|
+
}),
|
|
264
|
+
});
|
|
265
|
+
return { success: true, context };
|
|
266
|
+
}
|
|
267
|
+
catch {
|
|
268
|
+
return { success: false, reason: "invalid" };
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/** Serialize the propagation context into bounded HTTP headers. */
|
|
272
|
+
export function causalityHeaders(context) {
|
|
273
|
+
const parsed = parseCausalityContext(context);
|
|
274
|
+
if (!parsed.success)
|
|
275
|
+
throw new TypeError(`causality: invalid context (${parsed.reason})`);
|
|
276
|
+
return Object.freeze({
|
|
277
|
+
[CAUSALITY_EXECUTION_HEADER]: parsed.context.executionId,
|
|
278
|
+
[CAUSALITY_KIND_HEADER]: parsed.context.current.kind,
|
|
279
|
+
[CAUSALITY_NODE_HEADER]: parsed.context.current.id,
|
|
280
|
+
...(parsed.context.trace === undefined
|
|
281
|
+
? {}
|
|
282
|
+
: {
|
|
283
|
+
[CAUSALITY_TRACE_HEADER]: `${parsed.context.trace.traceId}-${parsed.context.trace.spanId}`,
|
|
284
|
+
}),
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
/** Parse the public header convention without ever throwing on hostile input. */
|
|
288
|
+
export function readCausalityHeaders(headers) {
|
|
289
|
+
const executionId = headers.get(CAUSALITY_EXECUTION_HEADER);
|
|
290
|
+
const nodeKind = headers.get(CAUSALITY_KIND_HEADER);
|
|
291
|
+
const nodeId = headers.get(CAUSALITY_NODE_HEADER);
|
|
292
|
+
const encodedTrace = headers.get(CAUSALITY_TRACE_HEADER);
|
|
293
|
+
if (executionId === null && nodeKind === null && nodeId === null && encodedTrace === null) {
|
|
294
|
+
return { success: false, reason: "missing" };
|
|
295
|
+
}
|
|
296
|
+
if (executionId === null || nodeKind === null || nodeId === null) {
|
|
297
|
+
return { success: false, reason: "incomplete" };
|
|
298
|
+
}
|
|
299
|
+
let decodedTrace;
|
|
300
|
+
if (encodedTrace !== null) {
|
|
301
|
+
const match = /^([0-9a-f]{32})-([0-9a-f]{16})$/.exec(encodedTrace);
|
|
302
|
+
if (match === null)
|
|
303
|
+
return { success: false, reason: "invalid" };
|
|
304
|
+
decodedTrace = { traceId: match[1], spanId: match[2] };
|
|
305
|
+
}
|
|
306
|
+
return parseCausalityContext({
|
|
307
|
+
executionId,
|
|
308
|
+
current: { kind: nodeKind, id: nodeId },
|
|
309
|
+
...(decodedTrace === undefined ? {} : { trace: decodedTrace }),
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
const timelineCursor = (entry) => `${entry.record.node.at.toString(36)}:${entry.sequence.toString(36)}`;
|
|
313
|
+
function timelineLimit(value) {
|
|
314
|
+
const limit = value ?? DEFAULT_TIMELINE_LIMIT;
|
|
315
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > MAX_TIMELINE_LIMIT) {
|
|
316
|
+
throw new RangeError(`causality: timeline limit must be an integer from 1 to ${MAX_TIMELINE_LIMIT}`);
|
|
317
|
+
}
|
|
318
|
+
return limit;
|
|
319
|
+
}
|
|
320
|
+
/** Bounded dev/test graph store. Production callers should provide a durable adapter. */
|
|
321
|
+
export function createMemoryCausalityStore(options = {}) {
|
|
322
|
+
if (typeof process !== "undefined" &&
|
|
323
|
+
process.env.NODE_ENV === "production" &&
|
|
324
|
+
!options.allowInProduction) {
|
|
325
|
+
throw new Error("causality: the memory store is not durable; configure a production graph adapter");
|
|
326
|
+
}
|
|
327
|
+
const maxRecords = options.maxRecords ?? 10_000;
|
|
328
|
+
if (!Number.isSafeInteger(maxRecords) || maxRecords < 1) {
|
|
329
|
+
throw new RangeError("causality: maxRecords must be a positive safe integer");
|
|
330
|
+
}
|
|
331
|
+
const byNode = new Map();
|
|
332
|
+
const byExecution = new Map();
|
|
333
|
+
let sequence = 0;
|
|
334
|
+
return {
|
|
335
|
+
async record(input) {
|
|
336
|
+
const parsed = parseCausalityRecord(input);
|
|
337
|
+
if (!parsed.success)
|
|
338
|
+
throw new TypeError(`causality: invalid record (${parsed.reason})`);
|
|
339
|
+
const record = parsed.record;
|
|
340
|
+
const key = `${record.executionId}\n${record.node.kind}\n${record.node.id}`;
|
|
341
|
+
const canonical = JSON.stringify(record);
|
|
342
|
+
const prior = byNode.get(key);
|
|
343
|
+
if (prior !== undefined) {
|
|
344
|
+
if (prior.canonical !== canonical) {
|
|
345
|
+
throw new CausalityConflictError(record.executionId, record.node);
|
|
346
|
+
}
|
|
347
|
+
return "duplicate";
|
|
348
|
+
}
|
|
349
|
+
if (byNode.size >= maxRecords)
|
|
350
|
+
throw new CausalityCapacityError(maxRecords);
|
|
351
|
+
const entry = Object.freeze({ sequence: sequence++, canonical, record });
|
|
352
|
+
byNode.set(key, entry);
|
|
353
|
+
const execution = byExecution.get(record.executionId) ?? [];
|
|
354
|
+
execution.push(entry);
|
|
355
|
+
byExecution.set(record.executionId, execution);
|
|
356
|
+
return "inserted";
|
|
357
|
+
},
|
|
358
|
+
async timeline(rawExecutionId, query = {}) {
|
|
359
|
+
const executionId = identity(rawExecutionId, "executionId");
|
|
360
|
+
const limit = timelineLimit(query.limit);
|
|
361
|
+
const entries = [...(byExecution.get(executionId) ?? [])].sort((left, right) => left.record.node.at - right.record.node.at || left.sequence - right.sequence);
|
|
362
|
+
let start = 0;
|
|
363
|
+
if (query.after !== undefined) {
|
|
364
|
+
const index = entries.findIndex((entry) => timelineCursor(entry) === query.after);
|
|
365
|
+
if (index < 0)
|
|
366
|
+
throw new TypeError("causality: invalid timeline cursor");
|
|
367
|
+
start = index + 1;
|
|
368
|
+
}
|
|
369
|
+
const selected = entries.slice(start, start + limit);
|
|
370
|
+
const hasMore = start + selected.length < entries.length;
|
|
371
|
+
return Object.freeze({
|
|
372
|
+
items: Object.freeze(selected.map((entry) => Object.freeze({ cursor: timelineCursor(entry), record: entry.record }))),
|
|
373
|
+
...(hasMore && selected.length > 0
|
|
374
|
+
? { nextCursor: timelineCursor(selected[selected.length - 1]) }
|
|
375
|
+
: {}),
|
|
376
|
+
});
|
|
377
|
+
},
|
|
378
|
+
};
|
|
379
|
+
}
|
|
380
|
+
//# sourceMappingURL=causality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"causality.js","sourceRoot":"","sources":["../src/causality.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAuEH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAEpC;IACA;IAFX,YACW,WAAmB,EACnB,IAAkB;QAE3B,KAAK,CAAC,uBAAuB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,6BAA6B,WAAW,EAAE,CAAC,CAAA;QAHnF,gBAAW,GAAX,WAAW,CAAQ;QACnB,SAAI,GAAJ,IAAI,CAAc;QAG3B,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAA;IACtC,CAAC;CACF;AAED,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC1B;IAArB,YAAqB,UAAkB;QACrC,KAAK,CAAC,sCAAsC,UAAU,WAAW,CAAC,CAAA;QAD/C,eAAU,GAAV,UAAU,CAAQ;QAErC,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAA;IACtC,CAAC;CACF;AAkCD,MAAM,CAAC,MAAM,0BAA0B,GAAG,sBAAsB,CAAA;AAChE,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAAwB,CAAA;AAC7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,sBAAsB,CAAA;AAC3D,MAAM,CAAC,MAAM,sBAAsB,GAAG,yBAAyB,CAAA;AAE/D,MAAM,QAAQ,GAAG,qCAAqC,CAAA;AACtD,MAAM,IAAI,GAAG,0BAA0B,CAAA;AACvC,MAAM,QAAQ,GAAG,0BAA0B,CAAA;AAC3C,MAAM,QAAQ,GAAG,gBAAgB,CAAA;AACjC,MAAM,OAAO,GAAG,gBAAgB,CAAA;AAChC,MAAM,WAAW,GAAG,EAAE,CAAA;AACtB,MAAM,sBAAsB,GAAG,GAAG,CAAA;AAClC,MAAM,kBAAkB,GAAG,GAAG,CAAA;AAE9B,SAAS,QAAQ,CAAC,KAAa,EAAE,KAAa;IAC5C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,cAAc,KAAK,mCAAmC,CAAC,CAAA;IAC7E,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,IAAI,CAAC,KAAa;IACzB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,SAAS,CAAC,mDAAmD,CAAC,CAAA;IAC/F,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa;IAC7B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,uDAAuD,CAAC,CAAA;IAC9E,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,SAAS,CAAC,KAAyB;IAC1C,MAAM,EAAE,GAAG,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAA;IAC9B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,qEAAqE,CAAC,CAAA;IAC5F,CAAC;IACD,OAAO,EAAE,CAAA;AACX,CAAC;AAED,SAAS,KAAK,CAAC,KAAiC;IAC9C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IACzC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,SAAS,CAAC,4DAA4D,CAAC,CAAA;IACnF,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;AACxE,CAAC;AAED,SAAS,GAAG,CAAC,QAAgB,EAAE,EAAU;IACvC,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzE,CAAC,CAAE,KAA2C;QAC9C,CAAC,CAAC,SAAS,CAAA;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAwC,EAAE,OAA4B;IACtF,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;AAC5D,CAAC;AAED,SAAS,SAAS,CAChB,WAAmB,EACnB,OAAqB,EACrB,OAAmC,EACnC,EAAU,EACV,SAAqC,EACrC,eAA2C;IAE3C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC;QACzB,GAAG,OAAO;QACV,EAAE;QACF,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;KACzD,CAAC,CAAA;IACF,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAA;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,WAAW;QACX,OAAO;QACP,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC;KACrE,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAA;IAC3E,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;AAC3C,CAAC;AAED,SAAS,eAAe,CAAC,KAAsB;IAC7C,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA;IAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;QACvC,MAAM,IAAI,UAAU,CAAC,6CAA6C,WAAW,UAAU,CAAC,CAAA;IAC1F,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACnD,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC3C,MAAM,CAAC,MAAM,CAAC;QACZ,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9B,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC;KACpC,CAAC,CACH,CAAA;IACD,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,WAAW;QACX,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;YAClB,GAAG,OAAO;YACV,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;SACzD,CAAC;QACF,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;KAChC,CAAC,CAAA;AACJ,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,cAAc,CAC5B,QAAuB,EACvB,EAAU,EACV,OAA8B;IAE9B,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,aAAa,CAAC,CAAA;IAChE,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IACjC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACtC,OAAO,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAA;AACzF,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,iBAAiB,CAC/B,MAAwB,EACxB,QAAuB,EACvB,EAAU,EACV,UAAoC,EAAE;IAEtC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,CAAC,CAAA;AACvD,CAAC;AAED,yEAAyE;AACzE,MAAM,UAAU,aAAa,CAC3B,OAAoC,EACpC,QAAuB,EACvB,EAAU,EACV,UAAoC,EAAE;IAEtC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;QACzD,MAAM,IAAI,UAAU,CAAC,wCAAwC,WAAW,WAAW,CAAC,CAAA;IACtF,CAAC;IACD,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,IAAI,EAAE,EAAE,aAAa,CAAC,CAAA;IAC1E,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,WAAW,KAAK,WAAW,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,6DAA6D,CAAC,CAAA;IAChF,CAAC;IACD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAA;IAC3D,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,MAAM,QAAQ,GAAsB,EAAE,CAAA;IACtC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC7D,MAAM,GAAG,GAAG,GAAG,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC,EAAE,EAAE,CAAA;QAChD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAQ;QAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QACb,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,GAAG,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;IACxE,CAAC;IACD,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAA;IACjC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;IACtC,MAAM,eAAe,GAAG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,EAAE,KAAK,CAAA;IAChG,OAAO,SAAS,CACd,WAAW,EACX,OAAO,EACP,QAAQ,EACR,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,EACrB,SAAS,EACT,eAAe,CAChB,CAAA;AACH,CAAC;AAED,MAAM,cAAc,GAAwB,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;AACxF,MAAM,UAAU,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;AAC/D,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAA;AACxE,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;AACtF,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAA;AAC/E,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAA;AAE9E,kGAAkG;AAClG,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IACrE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA;IACvF,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACjC,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA;IACjD,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA;IACpF,MAAM,SAAS,GACb,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACzF,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACxD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC9C,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA;IACpD,CAAC;IACD,MAAM,OAAO,GAAsB,EAAE,CAAA;IACrC,KAAK,MAAM,SAAS,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;QAClC,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QACtE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA;QACxF,IACE,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;YAC/B,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ;YAC7B,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ,EACnC,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA;QACjD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAA;IAC/E,CAAC;IACD,IACE,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;QACrC,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QAC7B,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;QAC3B,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;QAC3B,CAAC,SAAS,KAAK,SAAS;YACtB,CAAC,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,EAClF,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA;IACjD,CAAC;IACD,IAAI,CAAC;QACH,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,eAAe,CAAC;gBACtB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,IAAI,EAAE;oBACJ,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,EAAE,EAAE,IAAI,CAAC,EAAE;oBACX,GAAG,CAAC,SAAS,KAAK,SAAS;wBACzB,CAAC,CAAC,EAAE;wBACJ,CAAC,CAAC;4BACE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,CAAC,OAAiB,EAAE,MAAM,EAAE,SAAS,CAAC,MAAgB,EAAE;yBACpF,CAAC;iBACP;gBACD,OAAO;aACR,CAAC;SACH,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC9C,CAAC;AACH,CAAC;AAED,0GAA0G;AAC1G,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAC7B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IACrE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA;IACxF,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACvC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA;IAC1E,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA;IACtF,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;IAC9E,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QACxD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC9C,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;QAChE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAA;IACpD,CAAC;IACD,IACE,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;QACrC,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ;QAChC,OAAO,OAAO,CAAC,EAAE,KAAK,QAAQ;QAC9B,CAAC,QAAQ,KAAK,SAAS;YACrB,CAAC,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,EAChF,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA;IACjD,CAAC;IACD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;YAC5B,WAAW,EAAE,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,aAAa,CAAC;YACvD,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;YACtC,GAAG,CAAC,QAAQ,KAAK,SAAS;gBACxB,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC;oBACE,KAAK,EAAE,KAAK,CAAC;wBACX,OAAO,EAAE,QAAQ,CAAC,OAAiB;wBACnC,MAAM,EAAE,QAAQ,CAAC,MAAgB;qBAClC,CAAmB;iBACrB,CAAC;SACP,CAAC,CAAA;QACF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAA;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC9C,CAAC;AACH,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,gBAAgB,CAAC,OAAyB;IACxD,MAAM,MAAM,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAA;IAC7C,IAAI,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,IAAI,SAAS,CAAC,+BAA+B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;IACzF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW;QACxD,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI;QACpD,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAClD,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS;YACpC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACE,CAAC,sBAAsB,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE;aAC3F,CAAC;KACP,CAAC,CAAA;AACJ,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;IAC3D,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;IACnD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;IACjD,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;IACxD,IAAI,WAAW,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1F,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;IAC9C,CAAC;IACD,IAAI,WAAW,KAAK,IAAI,IAAI,QAAQ,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACjE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAA;IACjD,CAAC;IACD,IAAI,YAAwC,CAAA;IAC5C,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,iCAAiC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAClE,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,CAAA;QAChE,YAAY,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAW,EAAE,CAAA;IAC5E,CAAC;IACD,OAAO,qBAAqB,CAAC;QAC3B,WAAW;QACX,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE;QACvC,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;KAC/D,CAAC,CAAA;AACJ,CAAC;AAeD,MAAM,cAAc,GAAG,CAAC,KAAkB,EAAU,EAAE,CACpD,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAA;AAEvE,SAAS,aAAa,CAAC,KAAyB;IAC9C,MAAM,KAAK,GAAG,KAAK,IAAI,sBAAsB,CAAA;IAC7C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,kBAAkB,EAAE,CAAC;QAC5E,MAAM,IAAI,UAAU,CAClB,0DAA0D,kBAAkB,EAAE,CAC/E,CAAA;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,0BAA0B,CACxC,UAAuC,EAAE;IAEzC,IACE,OAAO,OAAO,KAAK,WAAW;QAC9B,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;QACrC,CAAC,OAAO,CAAC,iBAAiB,EAC1B,CAAC;QACD,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAA;IACH,CAAC;IACD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAA;IAC/C,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,UAAU,CAAC,uDAAuD,CAAC,CAAA;IAC/E,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAA;IAC7C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAyB,CAAA;IACpD,IAAI,QAAQ,GAAG,CAAC,CAAA;IAEhB,OAAO;QACL,KAAK,CAAC,MAAM,CAAC,KAAK;YAChB,MAAM,MAAM,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAA;YAC1C,IAAI,CAAC,MAAM,CAAC,OAAO;gBAAE,MAAM,IAAI,SAAS,CAAC,8BAA8B,MAAM,CAAC,MAAM,GAAG,CAAC,CAAA;YACxF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;YAC5B,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,WAAW,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,CAAA;YAC3E,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;YACxC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;oBAClC,MAAM,IAAI,sBAAsB,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,CAAA;gBACnE,CAAC;gBACD,OAAO,WAAW,CAAA;YACpB,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,IAAI,UAAU;gBAAE,MAAM,IAAI,sBAAsB,CAAC,UAAU,CAAC,CAAA;YAC3E,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAA;YACxE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YACtB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAA;YAC3D,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACrB,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;YAC9C,OAAO,UAAU,CAAA;QACnB,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,cAAc,EAAE,KAAK,GAAG,EAAE;YACvC,MAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAA;YAC3D,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YACxC,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAC5D,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAC/E,CAAA;YACD,IAAI,KAAK,GAAG,CAAC,CAAA;YACb,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,CAAA;gBACjF,IAAI,KAAK,GAAG,CAAC;oBAAE,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAA;gBACxE,KAAK,GAAG,KAAK,GAAG,CAAC,CAAA;YACnB,CAAC;YACD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,CAAA;YACpD,MAAM,OAAO,GAAG,KAAK,GAAG,QAAQ,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;YACxD,OAAO,MAAM,CAAC,MAAM,CAAC;gBACnB,KAAK,EAAE,MAAM,CAAC,MAAM,CAClB,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACrB,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CACvE,CACF;gBACD,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;oBAChC,CAAC,CAAC,EAAE,UAAU,EAAE,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAgB,CAAC,EAAE;oBAC9E,CAAC,CAAC,EAAE,CAAC;aACR,CAAC,CAAA;QACJ,CAAC;KACF,CAAA;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -11,10 +11,11 @@
|
|
|
11
11
|
* (it shipped at "0.0.0" through 1.0.0 before those guards existed). Kept narrow (`as const`) so
|
|
12
12
|
* consumers can pin it at the type level — see `test/version.test-d.ts`.
|
|
13
13
|
*/
|
|
14
|
-
export declare const VERSION: "1.
|
|
14
|
+
export declare const VERSION: "1.12.0";
|
|
15
15
|
export type Version = typeof VERSION;
|
|
16
16
|
export * from "./assurance.js";
|
|
17
17
|
export * from "./capabilities.js";
|
|
18
|
+
export * from "./causality.js";
|
|
18
19
|
export * from "./classification.js";
|
|
19
20
|
export * from "./diff.js";
|
|
20
21
|
export { FrameworkError, RouteConfigError, type RouteConfigErrorCode } from "./errors.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -11,9 +11,10 @@
|
|
|
11
11
|
* (it shipped at "0.0.0" through 1.0.0 before those guards existed). Kept narrow (`as const`) so
|
|
12
12
|
* consumers can pin it at the type level — see `test/version.test-d.ts`.
|
|
13
13
|
*/
|
|
14
|
-
export const VERSION = "1.
|
|
14
|
+
export const VERSION = "1.12.0";
|
|
15
15
|
export * from "./assurance.js";
|
|
16
16
|
export * from "./capabilities.js";
|
|
17
|
+
export * from "./causality.js";
|
|
17
18
|
export * from "./classification.js";
|
|
18
19
|
export * from "./diff.js";
|
|
19
20
|
export { FrameworkError, RouteConfigError } from "./errors.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAiB,CAAA;AAIxC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,qBAAqB,CAAA;AACnC,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAA6B,MAAM,aAAa,CAAA;AACzF,cAAc,kBAAkB,CAAA;AAChC,OAAO,EAAE,cAAc,EAAsB,MAAM,qBAAqB,CAAA;AACxE,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,OAAO,EAAe,MAAM,EAAoB,MAAM,oBAAoB,CAAA;AAUnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAGL,MAAM,EAIN,OAAO,GACR,MAAM,UAAU,CAAA;AASjB,OAAO,EAGL,cAAc,EAEd,SAAS,GAKV,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAEL,YAAY,EACZ,eAAe,EACf,SAAS,EACT,WAAW,GACZ,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,oBAAoB,EACpB,UAAU,EAIV,eAAe,EACf,YAAY,GACb,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAKL,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAiBlB,MAAM,EAEN,MAAM,EAEN,cAAc,GACf,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAKL,GAAG,EAEH,cAAc,GACf,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAGL,aAAa,GAId,MAAM,qBAAqB,CAAA;AAS5B,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,QAAiB,CAAA;AAIxC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,qBAAqB,CAAA;AACnC,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAA6B,MAAM,aAAa,CAAA;AACzF,cAAc,kBAAkB,CAAA;AAChC,OAAO,EAAE,cAAc,EAAsB,MAAM,qBAAqB,CAAA;AACxE,cAAc,iBAAiB,CAAA;AAC/B,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,OAAO,EAAe,MAAM,EAAoB,MAAM,oBAAoB,CAAA;AAUnF,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACvD,OAAO,EAGL,MAAM,EAIN,OAAO,GACR,MAAM,UAAU,CAAA;AASjB,OAAO,EAGL,cAAc,EAEd,SAAS,GAKV,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAEL,YAAY,EACZ,eAAe,EACf,SAAS,EACT,WAAW,GACZ,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EACL,oBAAoB,EACpB,UAAU,EAIV,eAAe,EACf,YAAY,GACb,MAAM,oBAAoB,CAAA;AAE3B,OAAO,EAKL,oBAAoB,EACpB,YAAY,EACZ,kBAAkB,EAiBlB,MAAM,EAEN,MAAM,EAEN,cAAc,GACf,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAKL,GAAG,EAEH,cAAc,GACf,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAGL,aAAa,GAId,MAAM,qBAAqB,CAAA;AAS5B,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA"}
|
package/dist/invariants.d.ts
CHANGED
|
@@ -61,6 +61,10 @@ type ReflectableApp = object;
|
|
|
61
61
|
/** Deterministic PRNG (mulberry32). Ambient randomness would make failures unreproducible. */
|
|
62
62
|
export declare function createSeededRandom(seed: number): () => number;
|
|
63
63
|
/** Run the contract-derived invariant suite against a reflectable app. Pure; no ambient state. */
|
|
64
|
+
/**
|
|
65
|
+
* @deprecated Use `runAdversarialContract` from `@nifrajs/testing`. The testing package is the
|
|
66
|
+
* authoritative deep contract laboratory and powers CLI L4; this export remains for compatibility.
|
|
67
|
+
*/
|
|
64
68
|
export declare function runContractInvariants(app: ReflectableApp, options?: RunInvariantsOptions): Promise<InvariantReport>;
|
|
65
69
|
export {};
|
|
66
70
|
//# sourceMappingURL=invariants.d.ts.map
|
package/dist/invariants.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["../src/invariants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAWH,MAAM,MAAM,oBAAoB,GAC5B,4BAA4B,GAC5B,6BAA6B,GAC7B,2BAA2B,GAC3B,mBAAmB,GACnB,+BAA+B,CAAA;AAEnC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,oFAAoF;IACpF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;IACpB,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC9E,8FAA8F;IAC9F,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAA;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAC/C;AAED,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,8CAA8C;IAC9C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,6EAA6E;IAC7E,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IACtC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAA;CACtC;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAElF,sGAAsG;AACtG,KAAK,cAAc,GAAG,MAAM,CAAA;AA0B5B,8FAA8F;AAC9F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,MAAM,CAS7D;AA8ND,kGAAkG;AAClG,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,cAAc,EACnB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,eAAe,CAAC,CAmG1B"}
|
|
1
|
+
{"version":3,"file":"invariants.d.ts","sourceRoot":"","sources":["../src/invariants.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAWH,MAAM,MAAM,oBAAoB,GAC5B,4BAA4B,GAC5B,6BAA6B,GAC7B,2BAA2B,GAC3B,mBAAmB,GACnB,+BAA+B,CAAA;AAEnC,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAA;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,oFAAoF;IACpF,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;IACpB,oCAAoC;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;IAC9E,8FAA8F;IAC9F,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAA;IACzC,QAAQ,CAAC,QAAQ,EAAE,SAAS,gBAAgB,EAAE,CAAA;CAC/C;AAED,MAAM,WAAW,oBAAoB;IACnC,oDAAoD;IACpD,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,8CAA8C;IAC9C,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAA;IAC/B,6EAA6E;IAC7E,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IACtC;;;;OAIG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAA;CACtC;AAED,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAElF,sGAAsG;AACtG,KAAK,cAAc,GAAG,MAAM,CAAA;AA0B5B,8FAA8F;AAC9F,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,MAAM,CAS7D;AA8ND,kGAAkG;AAClG;;;GAGG;AACH,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,cAAc,EACnB,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,eAAe,CAAC,CAmG1B"}
|
package/dist/invariants.js
CHANGED
|
@@ -241,6 +241,10 @@ async function validateAgainst(standard, value) {
|
|
|
241
241
|
}
|
|
242
242
|
const FUZZABLE_METHODS = new Set(["GET", "POST", "PUT", "PATCH", "DELETE"]);
|
|
243
243
|
/** Run the contract-derived invariant suite against a reflectable app. Pure; no ambient state. */
|
|
244
|
+
/**
|
|
245
|
+
* @deprecated Use `runAdversarialContract` from `@nifrajs/testing`. The testing package is the
|
|
246
|
+
* authoritative deep contract laboratory and powers CLI L4; this export remains for compatibility.
|
|
247
|
+
*/
|
|
244
248
|
export async function runContractInvariants(app, options = {}) {
|
|
245
249
|
const seed = options.seed ?? 1;
|
|
246
250
|
if (!Number.isSafeInteger(seed))
|