@x12i/analytix-tiers 1.0.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.
@@ -0,0 +1,18 @@
1
+ import { CataloxCommonFields } from "@x12i/analytix-contracts";
2
+ export interface TierDefinition extends CataloxCommonFields {
3
+ tierId: string;
4
+ levels: Array<{
5
+ level: number;
6
+ analytics: string[];
7
+ }>;
8
+ materialization: {
9
+ enabled: boolean;
10
+ storeIntermediateOutputs: boolean;
11
+ reuseWithinRun: boolean;
12
+ };
13
+ }
14
+ export declare class TierEngine {
15
+ static compileTierDag(tierDef: TierDefinition, resolveDependencies: (id: string) => string[]): string[];
16
+ static executeTier(tierDef: TierDefinition, executionOrder: string[], runNode: (id: string) => Promise<any>, materializationStore: Map<string, any>): Promise<Record<string, any>>;
17
+ }
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,WAAW,cAAe,SAAQ,mBAAmB;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC,CAAC;IACH,eAAe,EAAE;QACf,OAAO,EAAE,OAAO,CAAC;QACjB,wBAAwB,EAAE,OAAO,CAAC;QAClC,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;CACH;AAED,qBAAa,UAAU;IACrB,MAAM,CAAC,cAAc,CACnB,OAAO,EAAE,cAAc,EACvB,mBAAmB,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,EAAE,GAC5C,MAAM,EAAE;WAuFE,WAAW,CACtB,OAAO,EAAE,cAAc,EACvB,cAAc,EAAE,MAAM,EAAE,EACxB,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,EACrC,oBAAoB,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,GACrC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CA8BhC"}
package/dist/index.js ADDED
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TierEngine = void 0;
4
+ class TierEngine {
5
+ static compileTierDag(tierDef, resolveDependencies) {
6
+ // 1. Validation: levels are contiguous starting at 1
7
+ const levels = [...tierDef.levels].sort((a, b) => a.level - b.level);
8
+ for (let i = 0; i < levels.length; i++) {
9
+ if (levels[i].level !== i + 1) {
10
+ throw new Error("CATALOX_VALIDATION_FAILED");
11
+ }
12
+ }
13
+ // 2. Collect all nodes in this tier
14
+ const allNodes = new Set();
15
+ const nodeToLevel = new Map();
16
+ for (const lvl of levels) {
17
+ for (const ref of lvl.analytics) {
18
+ if (allNodes.has(ref)) {
19
+ throw new Error("CATALOX_VALIDATION_FAILED"); // Analytic in multiple levels
20
+ }
21
+ allNodes.add(ref);
22
+ nodeToLevel.set(ref, lvl.level);
23
+ }
24
+ }
25
+ const inDegree = new Map();
26
+ const graph = new Map();
27
+ for (const node of allNodes) {
28
+ inDegree.set(node, 0);
29
+ graph.set(node, []);
30
+ }
31
+ // 3. Build adjacency list and in-degrees
32
+ for (const node of allNodes) {
33
+ const deps = resolveDependencies(node);
34
+ const level = nodeToLevel.get(node);
35
+ for (const dep of deps) {
36
+ // Ignore tier-0 source database refs
37
+ if (dep === "main-events-db" || dep.startsWith("source:")) {
38
+ continue;
39
+ }
40
+ // Dependency must be in the tier
41
+ if (!allNodes.has(dep)) {
42
+ throw new Error("TIER_DEPENDENCY_MISSING");
43
+ }
44
+ // Dependency level must be strictly less than node level
45
+ const depLevel = nodeToLevel.get(dep);
46
+ if (depLevel >= level) {
47
+ throw new Error("TIER_DEPENDENCY_MISSING");
48
+ }
49
+ // dep -> node edge
50
+ graph.get(dep).push(node);
51
+ inDegree.set(node, inDegree.get(node) + 1);
52
+ }
53
+ }
54
+ // 4. Kahn's Algorithm
55
+ const queue = [];
56
+ for (const node of allNodes) {
57
+ if (inDegree.get(node) === 0) {
58
+ queue.push(node);
59
+ }
60
+ }
61
+ const order = [];
62
+ while (queue.length > 0) {
63
+ const u = queue.shift();
64
+ order.push(u);
65
+ const neighbors = graph.get(u) || [];
66
+ for (const v of neighbors) {
67
+ inDegree.set(v, inDegree.get(v) - 1);
68
+ if (inDegree.get(v) === 0) {
69
+ queue.push(v);
70
+ }
71
+ }
72
+ }
73
+ if (order.length !== allNodes.size) {
74
+ throw new Error("TIER_CYCLE_DETECTED");
75
+ }
76
+ return order;
77
+ }
78
+ static async executeTier(tierDef, executionOrder, runNode, materializationStore) {
79
+ const results = {};
80
+ for (const id of executionOrder) {
81
+ // Sibling reuse within run check
82
+ if (tierDef.materialization.reuseWithinRun && materializationStore.has(id)) {
83
+ results[id] = materializationStore.get(id);
84
+ continue;
85
+ }
86
+ try {
87
+ const output = await runNode(id);
88
+ results[id] = output;
89
+ if (tierDef.materialization.storeIntermediateOutputs) {
90
+ materializationStore.set(id, output);
91
+ }
92
+ }
93
+ catch (err) {
94
+ const errorDetails = {
95
+ code: "TIER_DEPENDENCY_MISSING",
96
+ message: `Tier execution failed at dependency: ${id}`,
97
+ failedDependency: id,
98
+ upstreamError: err.message,
99
+ };
100
+ throw new Error(JSON.stringify(errorDetails));
101
+ }
102
+ }
103
+ return results;
104
+ }
105
+ }
106
+ exports.TierEngine = TierEngine;
107
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "@x12i/analytix-tiers",
3
+ "version": "1.0.0",
4
+ "main": "dist/index.js",
5
+ "types": "dist/index.d.ts",
6
+ "dependencies": {
7
+ "@x12i/analytix-contracts": "^1.0.0"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "publishConfig": {
13
+ "access": "public",
14
+ "registry": "https://registry.npmjs.org/"
15
+ },
16
+ "scripts": {
17
+ "build": "tsc -p tsconfig.json"
18
+ }
19
+ }