@higher.archi/boe 1.0.29 → 1.0.31
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/core/evaluation/decay.d.ts +13 -2
- package/dist/core/evaluation/decay.d.ts.map +1 -1
- package/dist/core/evaluation/decay.js +24 -0
- package/dist/core/evaluation/decay.js.map +1 -1
- package/dist/core/types/rule.d.ts +25 -1
- package/dist/core/types/rule.d.ts.map +1 -1
- package/dist/core/types/rule.js +28 -0
- package/dist/core/types/rule.js.map +1 -1
- package/dist/engines/bayesian/index.d.ts +1 -1
- package/dist/engines/bayesian/index.d.ts.map +1 -1
- package/dist/engines/bayesian/index.js +2 -1
- package/dist/engines/bayesian/index.js.map +1 -1
- package/dist/engines/bayesian/types.d.ts +10 -1
- package/dist/engines/bayesian/types.d.ts.map +1 -1
- package/dist/engines/bayesian/types.js +16 -1
- package/dist/engines/bayesian/types.js.map +1 -1
- package/dist/engines/constraint/types.d.ts +36 -5
- package/dist/engines/constraint/types.d.ts.map +1 -1
- package/dist/engines/constraint/types.js +44 -1
- package/dist/engines/constraint/types.js.map +1 -1
- package/dist/engines/decay/index.d.ts +1 -1
- package/dist/engines/decay/index.d.ts.map +1 -1
- package/dist/engines/decay/index.js +5 -1
- package/dist/engines/decay/index.js.map +1 -1
- package/dist/engines/decay/types.d.ts +26 -4
- package/dist/engines/decay/types.d.ts.map +1 -1
- package/dist/engines/decay/types.js +30 -1
- package/dist/engines/decay/types.js.map +1 -1
- package/dist/engines/defeasible/index.d.ts +1 -1
- package/dist/engines/defeasible/index.d.ts.map +1 -1
- package/dist/engines/defeasible/index.js +8 -1
- package/dist/engines/defeasible/index.js.map +1 -1
- package/dist/engines/defeasible/types.d.ts +40 -5
- package/dist/engines/defeasible/types.d.ts.map +1 -1
- package/dist/engines/defeasible/types.js +56 -1
- package/dist/engines/defeasible/types.js.map +1 -1
- package/dist/engines/ensemble/index.d.ts +1 -0
- package/dist/engines/ensemble/index.d.ts.map +1 -1
- package/dist/engines/ensemble/index.js +5 -1
- package/dist/engines/ensemble/index.js.map +1 -1
- package/dist/engines/ensemble/types.d.ts +17 -2
- package/dist/engines/ensemble/types.d.ts.map +1 -1
- package/dist/engines/ensemble/types.js +23 -0
- package/dist/engines/ensemble/types.js.map +1 -1
- package/dist/engines/expert/index.d.ts +1 -1
- package/dist/engines/expert/index.d.ts.map +1 -1
- package/dist/engines/expert/index.js +3 -1
- package/dist/engines/expert/index.js.map +1 -1
- package/dist/engines/expert/types.d.ts +11 -1
- package/dist/engines/expert/types.d.ts.map +1 -1
- package/dist/engines/expert/types.js +18 -1
- package/dist/engines/expert/types.js.map +1 -1
- package/dist/engines/fuzzy/fuzzy.types.d.ts +65 -8
- package/dist/engines/fuzzy/fuzzy.types.d.ts.map +1 -1
- package/dist/engines/fuzzy/fuzzy.types.js +89 -1
- package/dist/engines/fuzzy/fuzzy.types.js.map +1 -1
- package/dist/engines/loyalty/compiler.d.ts +11 -0
- package/dist/engines/loyalty/compiler.d.ts.map +1 -0
- package/dist/engines/loyalty/compiler.js +144 -0
- package/dist/engines/loyalty/compiler.js.map +1 -0
- package/dist/engines/loyalty/engine.d.ts +76 -0
- package/dist/engines/loyalty/engine.d.ts.map +1 -0
- package/dist/engines/loyalty/engine.js +132 -0
- package/dist/engines/loyalty/engine.js.map +1 -0
- package/dist/engines/loyalty/index.d.ts +9 -0
- package/dist/engines/loyalty/index.d.ts.map +1 -0
- package/dist/engines/loyalty/index.js +24 -0
- package/dist/engines/loyalty/index.js.map +1 -0
- package/dist/engines/loyalty/strategy.d.ts +35 -0
- package/dist/engines/loyalty/strategy.d.ts.map +1 -0
- package/dist/engines/loyalty/strategy.js +405 -0
- package/dist/engines/loyalty/strategy.js.map +1 -0
- package/dist/engines/loyalty/types.d.ts +221 -0
- package/dist/engines/loyalty/types.d.ts.map +1 -0
- package/dist/engines/loyalty/types.js +51 -0
- package/dist/engines/loyalty/types.js.map +1 -0
- package/dist/engines/menu-engineering/compiler.d.ts +11 -0
- package/dist/engines/menu-engineering/compiler.d.ts.map +1 -0
- package/dist/engines/menu-engineering/compiler.js +119 -0
- package/dist/engines/menu-engineering/compiler.js.map +1 -0
- package/dist/engines/menu-engineering/engine.d.ts +32 -0
- package/dist/engines/menu-engineering/engine.d.ts.map +1 -0
- package/dist/engines/menu-engineering/engine.js +40 -0
- package/dist/engines/menu-engineering/engine.js.map +1 -0
- package/dist/engines/menu-engineering/index.d.ts +9 -0
- package/dist/engines/menu-engineering/index.d.ts.map +1 -0
- package/dist/engines/menu-engineering/index.js +21 -0
- package/dist/engines/menu-engineering/index.js.map +1 -0
- package/dist/engines/menu-engineering/strategy.d.ts +18 -0
- package/dist/engines/menu-engineering/strategy.d.ts.map +1 -0
- package/dist/engines/menu-engineering/strategy.js +318 -0
- package/dist/engines/menu-engineering/strategy.js.map +1 -0
- package/dist/engines/menu-engineering/types.d.ts +187 -0
- package/dist/engines/menu-engineering/types.d.ts.map +1 -0
- package/dist/engines/menu-engineering/types.js +27 -0
- package/dist/engines/menu-engineering/types.js.map +1 -0
- package/dist/engines/monte-carlo/index.d.ts +1 -1
- package/dist/engines/monte-carlo/index.d.ts.map +1 -1
- package/dist/engines/monte-carlo/index.js +5 -1
- package/dist/engines/monte-carlo/index.js.map +1 -1
- package/dist/engines/monte-carlo/types.d.ts +16 -1
- package/dist/engines/monte-carlo/types.d.ts.map +1 -1
- package/dist/engines/monte-carlo/types.js +23 -1
- package/dist/engines/monte-carlo/types.js.map +1 -1
- package/dist/engines/negotiation/index.d.ts +1 -0
- package/dist/engines/negotiation/index.d.ts.map +1 -1
- package/dist/engines/negotiation/index.js +7 -1
- package/dist/engines/negotiation/index.js.map +1 -1
- package/dist/engines/negotiation/types.d.ts +23 -4
- package/dist/engines/negotiation/types.d.ts.map +1 -1
- package/dist/engines/negotiation/types.js +27 -0
- package/dist/engines/negotiation/types.js.map +1 -1
- package/dist/engines/prediction/index.d.ts +1 -1
- package/dist/engines/prediction/index.d.ts.map +1 -1
- package/dist/engines/prediction/index.js +6 -1
- package/dist/engines/prediction/index.js.map +1 -1
- package/dist/engines/prediction/types.d.ts +35 -5
- package/dist/engines/prediction/types.d.ts.map +1 -1
- package/dist/engines/prediction/types.js +39 -1
- package/dist/engines/prediction/types.js.map +1 -1
- package/dist/engines/pricing/index.d.ts +2 -2
- package/dist/engines/pricing/index.d.ts.map +1 -1
- package/dist/engines/pricing/index.js +3 -1
- package/dist/engines/pricing/index.js.map +1 -1
- package/dist/engines/pricing/types.d.ts +15 -1
- package/dist/engines/pricing/types.d.ts.map +1 -1
- package/dist/engines/pricing/types.js +16 -1
- package/dist/engines/pricing/types.js.map +1 -1
- package/dist/engines/ranking/index.d.ts +1 -1
- package/dist/engines/ranking/index.d.ts.map +1 -1
- package/dist/engines/ranking/index.js +6 -1
- package/dist/engines/ranking/index.js.map +1 -1
- package/dist/engines/ranking/types.d.ts +32 -5
- package/dist/engines/ranking/types.d.ts.map +1 -1
- package/dist/engines/ranking/types.js +36 -1
- package/dist/engines/ranking/types.js.map +1 -1
- package/dist/engines/recipe-costing/compiler.d.ts +11 -0
- package/dist/engines/recipe-costing/compiler.d.ts.map +1 -0
- package/dist/engines/recipe-costing/compiler.js +177 -0
- package/dist/engines/recipe-costing/compiler.js.map +1 -0
- package/dist/engines/recipe-costing/engine.d.ts +32 -0
- package/dist/engines/recipe-costing/engine.d.ts.map +1 -0
- package/dist/engines/recipe-costing/engine.js +40 -0
- package/dist/engines/recipe-costing/engine.js.map +1 -0
- package/dist/engines/recipe-costing/index.d.ts +9 -0
- package/dist/engines/recipe-costing/index.d.ts.map +1 -0
- package/dist/engines/recipe-costing/index.js +21 -0
- package/dist/engines/recipe-costing/index.js.map +1 -0
- package/dist/engines/recipe-costing/strategy.d.ts +20 -0
- package/dist/engines/recipe-costing/strategy.d.ts.map +1 -0
- package/dist/engines/recipe-costing/strategy.js +265 -0
- package/dist/engines/recipe-costing/strategy.js.map +1 -0
- package/dist/engines/recipe-costing/types.d.ts +213 -0
- package/dist/engines/recipe-costing/types.d.ts.map +1 -0
- package/dist/engines/recipe-costing/types.js +36 -0
- package/dist/engines/recipe-costing/types.js.map +1 -0
- package/dist/engines/scoring/index.d.ts +1 -1
- package/dist/engines/scoring/index.d.ts.map +1 -1
- package/dist/engines/scoring/index.js +3 -1
- package/dist/engines/scoring/index.js.map +1 -1
- package/dist/engines/scoring/types.d.ts +8 -1
- package/dist/engines/scoring/types.d.ts.map +1 -1
- package/dist/engines/scoring/types.js +18 -1
- package/dist/engines/scoring/types.js.map +1 -1
- package/dist/engines/sentiment/index.d.ts +1 -1
- package/dist/engines/sentiment/index.d.ts.map +1 -1
- package/dist/engines/sentiment/index.js +3 -1
- package/dist/engines/sentiment/index.js.map +1 -1
- package/dist/engines/sentiment/types.d.ts +13 -2
- package/dist/engines/sentiment/types.d.ts.map +1 -1
- package/dist/engines/sentiment/types.js +17 -1
- package/dist/engines/sentiment/types.js.map +1 -1
- package/dist/engines/state-machine/index.d.ts +1 -1
- package/dist/engines/state-machine/index.d.ts.map +1 -1
- package/dist/engines/state-machine/index.js +5 -1
- package/dist/engines/state-machine/index.js.map +1 -1
- package/dist/engines/state-machine/types.d.ts +7 -0
- package/dist/engines/state-machine/types.d.ts.map +1 -1
- package/dist/engines/state-machine/types.js +14 -0
- package/dist/engines/state-machine/types.js.map +1 -1
- package/dist/engines/utility/index.d.ts +2 -2
- package/dist/engines/utility/index.d.ts.map +1 -1
- package/dist/engines/utility/index.js +4 -1
- package/dist/engines/utility/index.js.map +1 -1
- package/dist/engines/utility/types.d.ts +21 -3
- package/dist/engines/utility/types.d.ts.map +1 -1
- package/dist/engines/utility/types.js +37 -1
- package/dist/engines/utility/types.js.map +1 -1
- package/dist/index.d.ts +30 -21
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +80 -3
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/core/evaluation/decay.ts +13 -2
- package/src/core/types/rule.ts +25 -1
- package/src/engines/bayesian/index.ts +1 -0
- package/src/engines/bayesian/types.ts +10 -8
- package/src/engines/constraint/types.ts +40 -11
- package/src/engines/decay/index.ts +4 -0
- package/src/engines/decay/types.ts +26 -4
- package/src/engines/defeasible/index.ts +7 -0
- package/src/engines/defeasible/types.ts +42 -18
- package/src/engines/ensemble/index.ts +6 -0
- package/src/engines/ensemble/types.ts +17 -13
- package/src/engines/expert/index.ts +1 -0
- package/src/engines/expert/types.ts +11 -9
- package/src/engines/fuzzy/fuzzy.types.ts +65 -31
- package/src/engines/loyalty/compiler.ts +174 -0
- package/src/engines/loyalty/engine.ts +174 -0
- package/src/engines/loyalty/index.ts +52 -0
- package/src/engines/loyalty/strategy.ts +532 -0
- package/src/engines/loyalty/types.ts +283 -0
- package/src/engines/menu-engineering/compiler.ts +145 -0
- package/src/engines/menu-engineering/engine.ts +48 -0
- package/src/engines/menu-engineering/index.ts +47 -0
- package/src/engines/menu-engineering/strategy.ts +414 -0
- package/src/engines/menu-engineering/types.ts +242 -0
- package/src/engines/monte-carlo/index.ts +1 -0
- package/src/engines/monte-carlo/types.ts +16 -21
- package/src/engines/negotiation/index.ts +8 -0
- package/src/engines/negotiation/types.ts +23 -4
- package/src/engines/prediction/index.ts +5 -0
- package/src/engines/prediction/types.ts +35 -5
- package/src/engines/pricing/index.ts +3 -1
- package/src/engines/pricing/types.ts +17 -1
- package/src/engines/ranking/index.ts +5 -0
- package/src/engines/ranking/types.ts +32 -11
- package/src/engines/recipe-costing/compiler.ts +219 -0
- package/src/engines/recipe-costing/engine.ts +48 -0
- package/src/engines/recipe-costing/index.ts +48 -0
- package/src/engines/recipe-costing/strategy.ts +357 -0
- package/src/engines/recipe-costing/types.ts +269 -0
- package/src/engines/scoring/index.ts +2 -0
- package/src/engines/scoring/types.ts +8 -6
- package/src/engines/sentiment/index.ts +2 -0
- package/src/engines/sentiment/types.ts +13 -2
- package/src/engines/state-machine/index.ts +3 -0
- package/src/engines/state-machine/types.ts +8 -0
- package/src/engines/utility/index.ts +5 -0
- package/src/engines/utility/types.ts +23 -3
- package/src/index.ts +182 -7
|
@@ -6,10 +6,52 @@
|
|
|
6
6
|
* and fuzzy inference. Self-contained within the fuzzy engine.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.WIDTH_VALUES = exports.POSITION_VALUES = void 0;
|
|
9
|
+
exports.WIDTH_VALUES = exports.POSITION_VALUES = exports.DefuzzifyPresets = exports.TransformMethods = exports.DefuzzifyMethods = exports.AggregationMethods = exports.EdgeSemantics = exports.WidthSemantics = exports.PositionSemantics = exports.MembershipShapes = void 0;
|
|
10
10
|
exports.isSemanticTerm = isSemanticTerm;
|
|
11
11
|
exports.isExplicitTerm = isExplicitTerm;
|
|
12
12
|
exports.expandDefuzzifyPreset = expandDefuzzifyPreset;
|
|
13
|
+
// ========================================
|
|
14
|
+
// Membership Shape Types
|
|
15
|
+
// ========================================
|
|
16
|
+
/**
|
|
17
|
+
* Membership function shapes
|
|
18
|
+
* These define how membership degree (0-1) is calculated from a crisp value
|
|
19
|
+
*/
|
|
20
|
+
exports.MembershipShapes = {
|
|
21
|
+
triangle: 'triangle',
|
|
22
|
+
trapezoid: 'trapezoid',
|
|
23
|
+
gaussian: 'gaussian',
|
|
24
|
+
shoulder: 'shoulder',
|
|
25
|
+
block: 'block',
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Semantic position within domain (compiles to numeric center)
|
|
29
|
+
*/
|
|
30
|
+
exports.PositionSemantics = {
|
|
31
|
+
veryLow: 'very-low',
|
|
32
|
+
low: 'low',
|
|
33
|
+
medium: 'medium',
|
|
34
|
+
high: 'high',
|
|
35
|
+
veryHigh: 'very-high',
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Semantic width/spread (compiles to numeric spread as % of domain)
|
|
39
|
+
*/
|
|
40
|
+
exports.WidthSemantics = {
|
|
41
|
+
tight: 'tight',
|
|
42
|
+
narrow: 'narrow',
|
|
43
|
+
medium: 'medium',
|
|
44
|
+
wide: 'wide',
|
|
45
|
+
veryWide: 'very-wide',
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* Edge behavior for shoulder/block shapes
|
|
49
|
+
*/
|
|
50
|
+
exports.EdgeSemantics = {
|
|
51
|
+
openLeft: 'open-left',
|
|
52
|
+
openRight: 'open-right',
|
|
53
|
+
closed: 'closed',
|
|
54
|
+
};
|
|
13
55
|
/**
|
|
14
56
|
* Type guard for semantic terms
|
|
15
57
|
*/
|
|
@@ -23,6 +65,52 @@ function isExplicitTerm(term) {
|
|
|
23
65
|
return 'params' in term;
|
|
24
66
|
}
|
|
25
67
|
// ========================================
|
|
68
|
+
// Defuzzification Pipeline Types
|
|
69
|
+
// ========================================
|
|
70
|
+
/**
|
|
71
|
+
* Aggregation methods - combine multiple rule activations for same output
|
|
72
|
+
*/
|
|
73
|
+
exports.AggregationMethods = {
|
|
74
|
+
max: 'max',
|
|
75
|
+
sum: 'sum',
|
|
76
|
+
probor: 'probor',
|
|
77
|
+
bound: 'bound',
|
|
78
|
+
min: 'min',
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Defuzzification methods - convert fuzzy output to crisp value
|
|
82
|
+
*/
|
|
83
|
+
exports.DefuzzifyMethods = {
|
|
84
|
+
centroid: 'centroid',
|
|
85
|
+
bisector: 'bisector',
|
|
86
|
+
mom: 'mom',
|
|
87
|
+
som: 'som',
|
|
88
|
+
lom: 'lom',
|
|
89
|
+
wtaver: 'wtaver',
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Transform methods - post-process the crisp output
|
|
93
|
+
*/
|
|
94
|
+
exports.TransformMethods = {
|
|
95
|
+
clamp: 'clamp',
|
|
96
|
+
round: 'round',
|
|
97
|
+
deadband: 'deadband',
|
|
98
|
+
scale: 'scale',
|
|
99
|
+
quantize: 'quantize',
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Named presets that expand to full pipelines
|
|
103
|
+
*/
|
|
104
|
+
exports.DefuzzifyPresets = {
|
|
105
|
+
balanced: 'balanced',
|
|
106
|
+
smooth: 'smooth',
|
|
107
|
+
decisive: 'decisive',
|
|
108
|
+
cautious: 'cautious',
|
|
109
|
+
aggressive: 'aggressive',
|
|
110
|
+
discrete: 'discrete',
|
|
111
|
+
stable: 'stable',
|
|
112
|
+
};
|
|
113
|
+
// ========================================
|
|
26
114
|
// Preset Expansions
|
|
27
115
|
// ========================================
|
|
28
116
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fuzzy.types.js","sourceRoot":"","sources":["../../../src/engines/fuzzy/fuzzy.types.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;
|
|
1
|
+
{"version":3,"file":"fuzzy.types.js","sourceRoot":"","sources":["../../../src/engines/fuzzy/fuzzy.types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loyalty Engine Compiler
|
|
3
|
+
*
|
|
4
|
+
* Validates loyalty rulesets and resolves defaults.
|
|
5
|
+
*/
|
|
6
|
+
import type { LoyaltyRuleSet, CompiledLoyaltyRuleSet } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* Compile and validate a loyalty ruleset.
|
|
9
|
+
*/
|
|
10
|
+
export declare function compileLoyaltyRuleSet(ruleSet: LoyaltyRuleSet): CompiledLoyaltyRuleSet;
|
|
11
|
+
//# sourceMappingURL=compiler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../../src/engines/loyalty/compiler.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EAIvB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,cAAc,GACtB,sBAAsB,CAmBxB"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Loyalty Engine Compiler
|
|
4
|
+
*
|
|
5
|
+
* Validates loyalty rulesets and resolves defaults.
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.compileLoyaltyRuleSet = compileLoyaltyRuleSet;
|
|
9
|
+
const errors_1 = require("../../core/errors");
|
|
10
|
+
/**
|
|
11
|
+
* Compile and validate a loyalty ruleset.
|
|
12
|
+
*/
|
|
13
|
+
function compileLoyaltyRuleSet(ruleSet) {
|
|
14
|
+
if (!ruleSet.id) {
|
|
15
|
+
throw new errors_1.CompilationError('Loyalty ruleset requires an id');
|
|
16
|
+
}
|
|
17
|
+
if (ruleSet.mode !== 'loyalty') {
|
|
18
|
+
throw new errors_1.CompilationError(`Expected mode 'loyalty', got '${ruleSet.mode}'`);
|
|
19
|
+
}
|
|
20
|
+
switch (ruleSet.strategy) {
|
|
21
|
+
case 'earning':
|
|
22
|
+
return compileEarning(ruleSet);
|
|
23
|
+
case 'redemption':
|
|
24
|
+
return compileRedemption(ruleSet);
|
|
25
|
+
case 'tier-evaluation':
|
|
26
|
+
return compileTierEvaluation(ruleSet);
|
|
27
|
+
default:
|
|
28
|
+
throw new errors_1.CompilationError(`Unknown loyalty strategy: '${ruleSet.strategy}'`);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function compileEarning(ruleSet) {
|
|
32
|
+
if (!ruleSet.earningRules || ruleSet.earningRules.length === 0) {
|
|
33
|
+
throw new errors_1.CompilationError('Earning strategy requires at least one earning rule');
|
|
34
|
+
}
|
|
35
|
+
// Validate unique rule IDs
|
|
36
|
+
const ruleIds = new Set();
|
|
37
|
+
for (const rule of ruleSet.earningRules) {
|
|
38
|
+
if (!rule.id) {
|
|
39
|
+
throw new errors_1.CompilationError('Each earning rule requires an id');
|
|
40
|
+
}
|
|
41
|
+
if (ruleIds.has(rule.id)) {
|
|
42
|
+
throw new errors_1.CompilationError(`Duplicate earning rule id: '${rule.id}'`);
|
|
43
|
+
}
|
|
44
|
+
if (rule.baseRate < 0) {
|
|
45
|
+
throw new errors_1.CompilationError(`Earning rule '${rule.id}' baseRate must be non-negative`);
|
|
46
|
+
}
|
|
47
|
+
ruleIds.add(rule.id);
|
|
48
|
+
}
|
|
49
|
+
// Validate tier IDs are unique
|
|
50
|
+
validateTierIds(ruleSet.tiers);
|
|
51
|
+
// Validate promotions
|
|
52
|
+
validatePromotions(ruleSet.promotions);
|
|
53
|
+
return {
|
|
54
|
+
id: ruleSet.id,
|
|
55
|
+
name: ruleSet.name,
|
|
56
|
+
mode: 'loyalty',
|
|
57
|
+
strategy: 'earning',
|
|
58
|
+
earningRules: ruleSet.earningRules,
|
|
59
|
+
defaultRate: ruleSet.defaultRate ?? 1,
|
|
60
|
+
tiers: ruleSet.tiers ?? [],
|
|
61
|
+
expirationPolicy: ruleSet.expirationPolicy ?? {},
|
|
62
|
+
promotions: ruleSet.promotions ?? []
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function compileRedemption(ruleSet) {
|
|
66
|
+
if (!ruleSet.redemptionOptions || ruleSet.redemptionOptions.length === 0) {
|
|
67
|
+
throw new errors_1.CompilationError('Redemption strategy requires at least one redemption option');
|
|
68
|
+
}
|
|
69
|
+
// Validate unique option IDs
|
|
70
|
+
const optionIds = new Set();
|
|
71
|
+
for (const option of ruleSet.redemptionOptions) {
|
|
72
|
+
if (!option.id) {
|
|
73
|
+
throw new errors_1.CompilationError('Each redemption option requires an id');
|
|
74
|
+
}
|
|
75
|
+
if (optionIds.has(option.id)) {
|
|
76
|
+
throw new errors_1.CompilationError(`Duplicate redemption option id: '${option.id}'`);
|
|
77
|
+
}
|
|
78
|
+
if (option.pointsRequired <= 0) {
|
|
79
|
+
throw new errors_1.CompilationError(`Redemption option '${option.id}' pointsRequired must be positive`);
|
|
80
|
+
}
|
|
81
|
+
optionIds.add(option.id);
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
id: ruleSet.id,
|
|
85
|
+
name: ruleSet.name,
|
|
86
|
+
mode: 'loyalty',
|
|
87
|
+
strategy: 'redemption',
|
|
88
|
+
redemptionOptions: ruleSet.redemptionOptions,
|
|
89
|
+
tiers: ruleSet.tiers ?? [],
|
|
90
|
+
expirationPolicy: ruleSet.expirationPolicy ?? {},
|
|
91
|
+
promotions: ruleSet.promotions ?? []
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
function compileTierEvaluation(ruleSet) {
|
|
95
|
+
if (!ruleSet.tiers || ruleSet.tiers.length === 0) {
|
|
96
|
+
throw new errors_1.CompilationError('Tier-evaluation strategy requires at least one tier definition');
|
|
97
|
+
}
|
|
98
|
+
// Validate tier IDs are unique
|
|
99
|
+
validateTierIds(ruleSet.tiers);
|
|
100
|
+
// Validate tiers are sorted by threshold ascending
|
|
101
|
+
for (let i = 1; i < ruleSet.tiers.length; i++) {
|
|
102
|
+
if (ruleSet.tiers[i].qualifyingThreshold < ruleSet.tiers[i - 1].qualifyingThreshold) {
|
|
103
|
+
throw new errors_1.CompilationError(`Tier '${ruleSet.tiers[i].id}' threshold (${ruleSet.tiers[i].qualifyingThreshold}) ` +
|
|
104
|
+
`is less than previous tier '${ruleSet.tiers[i - 1].id}' (${ruleSet.tiers[i - 1].qualifyingThreshold}). ` +
|
|
105
|
+
`Tiers must be ordered by ascending threshold.`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
id: ruleSet.id,
|
|
110
|
+
name: ruleSet.name,
|
|
111
|
+
mode: 'loyalty',
|
|
112
|
+
strategy: 'tier-evaluation',
|
|
113
|
+
evaluationPeriod: ruleSet.evaluationPeriod ?? 'rolling-12-months',
|
|
114
|
+
tiers: ruleSet.tiers,
|
|
115
|
+
expirationPolicy: ruleSet.expirationPolicy ?? {},
|
|
116
|
+
promotions: ruleSet.promotions ?? []
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function validateTierIds(tiers) {
|
|
120
|
+
if (!tiers)
|
|
121
|
+
return;
|
|
122
|
+
const tierIds = new Set();
|
|
123
|
+
for (const tier of tiers) {
|
|
124
|
+
if (tierIds.has(tier.id)) {
|
|
125
|
+
throw new errors_1.CompilationError(`Duplicate tier id: '${tier.id}'`);
|
|
126
|
+
}
|
|
127
|
+
tierIds.add(tier.id);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function validatePromotions(promotions) {
|
|
131
|
+
if (!promotions)
|
|
132
|
+
return;
|
|
133
|
+
const promoIds = new Set();
|
|
134
|
+
for (const promo of promotions) {
|
|
135
|
+
if (!promo.id) {
|
|
136
|
+
throw new errors_1.CompilationError('Each promotion requires an id');
|
|
137
|
+
}
|
|
138
|
+
if (promoIds.has(promo.id)) {
|
|
139
|
+
throw new errors_1.CompilationError(`Duplicate promotion id: '${promo.id}'`);
|
|
140
|
+
}
|
|
141
|
+
promoIds.add(promo.id);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=compiler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../../src/engines/loyalty/compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loyalty Engine
|
|
3
|
+
*
|
|
4
|
+
* Point ledger engine that manages earning rules with category multipliers,
|
|
5
|
+
* point transactions, tier-qualified balances, and promotion stacking.
|
|
6
|
+
* Unlike other BOE engines, the Loyalty engine maintains a running balance
|
|
7
|
+
* ledger across operations.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const engine = new LoyaltyEngine();
|
|
12
|
+
* const compiled = compileLoyaltyRuleSet({ ... });
|
|
13
|
+
*
|
|
14
|
+
* // Stream purchases as they arrive
|
|
15
|
+
* const r1 = engine.ingest({ memberId: 'M001', amount: 250, category: 'dining' }, compiled);
|
|
16
|
+
* // r1.pointsEarned: 500, r1.newBalance: 500
|
|
17
|
+
*
|
|
18
|
+
* engine.getBalance('M001'); // { currentBalance: 500, ... }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import { WorkingMemory, Fact, FactInput, FactChange } from '../../core';
|
|
22
|
+
import type { CompiledLoyaltyRuleSet, CompiledEarningRuleSet, LoyaltyOptions, LoyaltyResult, LoyaltyIngestResult, MemberBalance } from './types';
|
|
23
|
+
export declare class LoyaltyEngine {
|
|
24
|
+
private wm;
|
|
25
|
+
private strategy;
|
|
26
|
+
private _ledger;
|
|
27
|
+
constructor(workingMemory?: WorkingMemory);
|
|
28
|
+
add<T = Record<string, any>>(input: FactInput<T>): Fact<T>;
|
|
29
|
+
remove(factId: string): Fact | undefined;
|
|
30
|
+
update<T = Record<string, any>>(input: FactInput<T>): Fact<T>;
|
|
31
|
+
get(factId: string): Fact | undefined;
|
|
32
|
+
getByType(type: string): Fact[];
|
|
33
|
+
getAll(): Fact[];
|
|
34
|
+
has(factId: string): boolean;
|
|
35
|
+
size(): number;
|
|
36
|
+
clear(): void;
|
|
37
|
+
getChanges(): FactChange[];
|
|
38
|
+
clearChanges(): void;
|
|
39
|
+
/**
|
|
40
|
+
* Execute a loyalty ruleset against all facts in working memory.
|
|
41
|
+
*
|
|
42
|
+
* @param ruleSet - Compiled loyalty ruleset
|
|
43
|
+
* @param options - Runtime options (asOf date)
|
|
44
|
+
* @returns Loyalty result (earning, redemption, or tier-evaluation)
|
|
45
|
+
*/
|
|
46
|
+
execute(ruleSet: CompiledLoyaltyRuleSet, options?: LoyaltyOptions): LoyaltyResult;
|
|
47
|
+
/**
|
|
48
|
+
* Process a single purchase/activity event incrementally.
|
|
49
|
+
*
|
|
50
|
+
* Each call computes points earned, updates the internal ledger,
|
|
51
|
+
* evaluates tier status, and returns the result with the new balance.
|
|
52
|
+
* Only works with earning strategy rulesets.
|
|
53
|
+
*
|
|
54
|
+
* @param eventData - Event data with memberId, amount, and optional category
|
|
55
|
+
* @param ruleSet - Compiled earning ruleset
|
|
56
|
+
* @param asOf - Reference time (default: now)
|
|
57
|
+
* @returns Earning result with updated balance
|
|
58
|
+
*/
|
|
59
|
+
ingest(eventData: Record<string, any>, ruleSet: CompiledEarningRuleSet, asOf?: Date): LoyaltyIngestResult;
|
|
60
|
+
/**
|
|
61
|
+
* Get the current balance for a member.
|
|
62
|
+
* Returns undefined if the member has no transactions.
|
|
63
|
+
*/
|
|
64
|
+
getBalance(memberId: string): MemberBalance | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Get the full ledger state (all member balances).
|
|
67
|
+
*/
|
|
68
|
+
getLedger(): Map<string, MemberBalance>;
|
|
69
|
+
/**
|
|
70
|
+
* Reset the ledger, clearing all member balances.
|
|
71
|
+
* Does not affect working memory.
|
|
72
|
+
*/
|
|
73
|
+
resetLedger(): void;
|
|
74
|
+
getWorkingMemory(): WorkingMemory;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/engines/loyalty/engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EACL,aAAa,EACb,IAAI,EACJ,SAAS,EACT,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EACtB,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,aAAa,EACd,MAAM,SAAS,CAAC;AAIjB,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAgB;IAC1B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,OAAO,CAAyC;gBAE5C,aAAa,CAAC,EAAE,aAAa;IASzC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAI1D,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIxC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAI7D,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAIrC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE;IAI/B,MAAM,IAAI,IAAI,EAAE;IAIhB,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAI5B,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,IAAI;IAIb,UAAU,IAAI,UAAU,EAAE;IAI1B,YAAY,IAAI,IAAI;IAQpB;;;;;;OAMG;IACH,OAAO,CACL,OAAO,EAAE,sBAAsB,EAC/B,OAAO,GAAE,cAAmB,GAC3B,aAAa;IAQhB;;;;;;;;;;;OAWG;IACH,MAAM,CACJ,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,OAAO,EAAE,sBAAsB,EAC/B,IAAI,GAAE,IAAiB,GACtB,mBAAmB;IAQtB;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAIvD;;OAEG;IACH,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC;IAIvC;;;OAGG;IACH,WAAW,IAAI,IAAI;IAQnB,gBAAgB,IAAI,aAAa;CAGlC"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Loyalty Engine
|
|
4
|
+
*
|
|
5
|
+
* Point ledger engine that manages earning rules with category multipliers,
|
|
6
|
+
* point transactions, tier-qualified balances, and promotion stacking.
|
|
7
|
+
* Unlike other BOE engines, the Loyalty engine maintains a running balance
|
|
8
|
+
* ledger across operations.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const engine = new LoyaltyEngine();
|
|
13
|
+
* const compiled = compileLoyaltyRuleSet({ ... });
|
|
14
|
+
*
|
|
15
|
+
* // Stream purchases as they arrive
|
|
16
|
+
* const r1 = engine.ingest({ memberId: 'M001', amount: 250, category: 'dining' }, compiled);
|
|
17
|
+
* // r1.pointsEarned: 500, r1.newBalance: 500
|
|
18
|
+
*
|
|
19
|
+
* engine.getBalance('M001'); // { currentBalance: 500, ... }
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
+
exports.LoyaltyEngine = void 0;
|
|
24
|
+
const core_1 = require("../../core");
|
|
25
|
+
const strategy_1 = require("./strategy");
|
|
26
|
+
class LoyaltyEngine {
|
|
27
|
+
wm;
|
|
28
|
+
strategy;
|
|
29
|
+
_ledger = new Map();
|
|
30
|
+
constructor(workingMemory) {
|
|
31
|
+
this.wm = workingMemory ?? new core_1.WorkingMemory();
|
|
32
|
+
this.strategy = new strategy_1.LoyaltyExecutor();
|
|
33
|
+
}
|
|
34
|
+
// ========================================
|
|
35
|
+
// IWorkingMemory Implementation
|
|
36
|
+
// ========================================
|
|
37
|
+
add(input) {
|
|
38
|
+
return this.wm.add(input);
|
|
39
|
+
}
|
|
40
|
+
remove(factId) {
|
|
41
|
+
return this.wm.remove(factId);
|
|
42
|
+
}
|
|
43
|
+
update(input) {
|
|
44
|
+
return this.wm.update(input);
|
|
45
|
+
}
|
|
46
|
+
get(factId) {
|
|
47
|
+
return this.wm.get(factId);
|
|
48
|
+
}
|
|
49
|
+
getByType(type) {
|
|
50
|
+
return this.wm.getByType(type);
|
|
51
|
+
}
|
|
52
|
+
getAll() {
|
|
53
|
+
return this.wm.getAll();
|
|
54
|
+
}
|
|
55
|
+
has(factId) {
|
|
56
|
+
return this.wm.has(factId);
|
|
57
|
+
}
|
|
58
|
+
size() {
|
|
59
|
+
return this.wm.size();
|
|
60
|
+
}
|
|
61
|
+
clear() {
|
|
62
|
+
this.wm.clear();
|
|
63
|
+
}
|
|
64
|
+
getChanges() {
|
|
65
|
+
return this.wm.getChanges();
|
|
66
|
+
}
|
|
67
|
+
clearChanges() {
|
|
68
|
+
this.wm.clearChanges();
|
|
69
|
+
}
|
|
70
|
+
// ========================================
|
|
71
|
+
// Engine Execution
|
|
72
|
+
// ========================================
|
|
73
|
+
/**
|
|
74
|
+
* Execute a loyalty ruleset against all facts in working memory.
|
|
75
|
+
*
|
|
76
|
+
* @param ruleSet - Compiled loyalty ruleset
|
|
77
|
+
* @param options - Runtime options (asOf date)
|
|
78
|
+
* @returns Loyalty result (earning, redemption, or tier-evaluation)
|
|
79
|
+
*/
|
|
80
|
+
execute(ruleSet, options = {}) {
|
|
81
|
+
return this.strategy.run(ruleSet, this.wm, this._ledger, options);
|
|
82
|
+
}
|
|
83
|
+
// ========================================
|
|
84
|
+
// Streaming Ingest
|
|
85
|
+
// ========================================
|
|
86
|
+
/**
|
|
87
|
+
* Process a single purchase/activity event incrementally.
|
|
88
|
+
*
|
|
89
|
+
* Each call computes points earned, updates the internal ledger,
|
|
90
|
+
* evaluates tier status, and returns the result with the new balance.
|
|
91
|
+
* Only works with earning strategy rulesets.
|
|
92
|
+
*
|
|
93
|
+
* @param eventData - Event data with memberId, amount, and optional category
|
|
94
|
+
* @param ruleSet - Compiled earning ruleset
|
|
95
|
+
* @param asOf - Reference time (default: now)
|
|
96
|
+
* @returns Earning result with updated balance
|
|
97
|
+
*/
|
|
98
|
+
ingest(eventData, ruleSet, asOf = new Date()) {
|
|
99
|
+
return this.strategy.earnSingle(eventData, ruleSet, this._ledger, asOf);
|
|
100
|
+
}
|
|
101
|
+
// ========================================
|
|
102
|
+
// Ledger Operations
|
|
103
|
+
// ========================================
|
|
104
|
+
/**
|
|
105
|
+
* Get the current balance for a member.
|
|
106
|
+
* Returns undefined if the member has no transactions.
|
|
107
|
+
*/
|
|
108
|
+
getBalance(memberId) {
|
|
109
|
+
return this._ledger.get(memberId);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get the full ledger state (all member balances).
|
|
113
|
+
*/
|
|
114
|
+
getLedger() {
|
|
115
|
+
return new Map(this._ledger);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Reset the ledger, clearing all member balances.
|
|
119
|
+
* Does not affect working memory.
|
|
120
|
+
*/
|
|
121
|
+
resetLedger() {
|
|
122
|
+
this._ledger.clear();
|
|
123
|
+
}
|
|
124
|
+
// ========================================
|
|
125
|
+
// Utility Methods
|
|
126
|
+
// ========================================
|
|
127
|
+
getWorkingMemory() {
|
|
128
|
+
return this.wm;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
exports.LoyaltyEngine = LoyaltyEngine;
|
|
132
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/engines/loyalty/engine.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH,qCAKoB;AAWpB,yCAA6C;AAE7C,MAAa,aAAa;IAChB,EAAE,CAAgB;IAClB,QAAQ,CAAkB;IAC1B,OAAO,GAA+B,IAAI,GAAG,EAAE,CAAC;IAExD,YAAY,aAA6B;QACvC,IAAI,CAAC,EAAE,GAAG,aAAa,IAAI,IAAI,oBAAa,EAAE,CAAC;QAC/C,IAAI,CAAC,QAAQ,GAAG,IAAI,0BAAe,EAAE,CAAC;IACxC,CAAC;IAED,2CAA2C;IAC3C,gCAAgC;IAChC,2CAA2C;IAE3C,GAAG,CAA0B,KAAmB;QAC9C,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAED,MAAM,CAA0B,KAAmB;QACjD,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,SAAS,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,GAAG,CAAC,MAAc;QAChB,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IACxB,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC;IAC9B,CAAC;IAED,YAAY;QACV,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC;IACzB,CAAC;IAED,2CAA2C;IAC3C,mBAAmB;IACnB,2CAA2C;IAE3C;;;;;;OAMG;IACH,OAAO,CACL,OAA+B,EAC/B,UAA0B,EAAE;QAE5B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,2CAA2C;IAC3C,mBAAmB;IACnB,2CAA2C;IAE3C;;;;;;;;;;;OAWG;IACH,MAAM,CACJ,SAA8B,EAC9B,OAA+B,EAC/B,OAAa,IAAI,IAAI,EAAE;QAEvB,OAAO,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC1E,CAAC;IAED,2CAA2C;IAC3C,oBAAoB;IACpB,2CAA2C;IAE3C;;;OAGG;IACH,UAAU,CAAC,QAAgB;QACzB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,SAAS;QACP,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAED,2CAA2C;IAC3C,kBAAkB;IAClB,2CAA2C;IAE3C,gBAAgB;QACd,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;CACF;AAtID,sCAsIC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loyalty Engine -- Point Ledger Management
|
|
3
|
+
*/
|
|
4
|
+
export type { LoyaltyStrategy, PointTransactionType, TierStatus, QualifyingMetric, EvaluationPeriod, EarningRule, RedemptionOption, LoyaltyTierDefinition, PromotionRule, ExpirationPolicy, PointTransaction, MemberBalance, EarningRuleSet, RedemptionRuleSet, TierEvaluationRuleSet, LoyaltyRuleSet, CompiledEarningRuleSet, CompiledRedemptionRuleSet, CompiledTierEvaluationRuleSet, CompiledLoyaltyRuleSet, EarningResult, RedemptionResult, MemberTierResult, TierEvaluationResult, LoyaltyResult, LoyaltyOptions, LoyaltyIngestResult } from './types';
|
|
5
|
+
export { LoyaltyStrategies, PointTransactionTypes, TierStatuses, QualifyingMetrics, EvaluationPeriods } from './types';
|
|
6
|
+
export { compileLoyaltyRuleSet } from './compiler';
|
|
7
|
+
export { LoyaltyExecutor, loyaltyStrategy } from './strategy';
|
|
8
|
+
export { LoyaltyEngine } from './engine';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/engines/loyalty/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,WAAW,EACX,gBAAgB,EAChB,qBAAqB,EACrB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,sBAAsB,EACtB,yBAAyB,EACzB,6BAA6B,EAC7B,sBAAsB,EACtB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,oBAAoB,EACpB,aAAa,EACb,cAAc,EACd,mBAAmB,EACpB,MAAM,SAAS,CAAC;AAGjB,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGnD,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG9D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Loyalty Engine -- Point Ledger Management
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.LoyaltyEngine = exports.loyaltyStrategy = exports.LoyaltyExecutor = exports.compileLoyaltyRuleSet = exports.EvaluationPeriods = exports.QualifyingMetrics = exports.TierStatuses = exports.PointTransactionTypes = exports.LoyaltyStrategies = void 0;
|
|
7
|
+
// Constants
|
|
8
|
+
var types_1 = require("./types");
|
|
9
|
+
Object.defineProperty(exports, "LoyaltyStrategies", { enumerable: true, get: function () { return types_1.LoyaltyStrategies; } });
|
|
10
|
+
Object.defineProperty(exports, "PointTransactionTypes", { enumerable: true, get: function () { return types_1.PointTransactionTypes; } });
|
|
11
|
+
Object.defineProperty(exports, "TierStatuses", { enumerable: true, get: function () { return types_1.TierStatuses; } });
|
|
12
|
+
Object.defineProperty(exports, "QualifyingMetrics", { enumerable: true, get: function () { return types_1.QualifyingMetrics; } });
|
|
13
|
+
Object.defineProperty(exports, "EvaluationPeriods", { enumerable: true, get: function () { return types_1.EvaluationPeriods; } });
|
|
14
|
+
// Compiler
|
|
15
|
+
var compiler_1 = require("./compiler");
|
|
16
|
+
Object.defineProperty(exports, "compileLoyaltyRuleSet", { enumerable: true, get: function () { return compiler_1.compileLoyaltyRuleSet; } });
|
|
17
|
+
// Strategy
|
|
18
|
+
var strategy_1 = require("./strategy");
|
|
19
|
+
Object.defineProperty(exports, "LoyaltyExecutor", { enumerable: true, get: function () { return strategy_1.LoyaltyExecutor; } });
|
|
20
|
+
Object.defineProperty(exports, "loyaltyStrategy", { enumerable: true, get: function () { return strategy_1.loyaltyStrategy; } });
|
|
21
|
+
// Engine
|
|
22
|
+
var engine_1 = require("./engine");
|
|
23
|
+
Object.defineProperty(exports, "LoyaltyEngine", { enumerable: true, get: function () { return engine_1.LoyaltyEngine; } });
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/engines/loyalty/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAiCH,YAAY;AACZ,iCAMiB;AALf,0GAAA,iBAAiB,OAAA;AACjB,8GAAA,qBAAqB,OAAA;AACrB,qGAAA,YAAY,OAAA;AACZ,0GAAA,iBAAiB,OAAA;AACjB,0GAAA,iBAAiB,OAAA;AAGnB,WAAW;AACX,uCAAmD;AAA1C,iHAAA,qBAAqB,OAAA;AAE9B,WAAW;AACX,uCAA8D;AAArD,2GAAA,eAAe,OAAA;AAAE,2GAAA,eAAe,OAAA;AAEzC,SAAS;AACT,mCAAyC;AAAhC,uGAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loyalty Engine Strategy
|
|
3
|
+
*
|
|
4
|
+
* Core execution logic for all loyalty strategies:
|
|
5
|
+
* - earning: compute points from purchase/activity events with category multipliers and promotion stacking
|
|
6
|
+
* - redemption: process point redemption with balance validation
|
|
7
|
+
* - tier-evaluation: evaluate members against tier thresholds with upgrade/downgrade detection
|
|
8
|
+
*/
|
|
9
|
+
import type { IWorkingMemory } from '../../core';
|
|
10
|
+
import type { CompiledLoyaltyRuleSet, CompiledEarningRuleSet, LoyaltyOptions, EarningResult, LoyaltyResult, PointTransaction, MemberBalance } from './types';
|
|
11
|
+
export declare class LoyaltyExecutor {
|
|
12
|
+
run(ruleSet: CompiledLoyaltyRuleSet, wm: IWorkingMemory, ledger: Map<string, MemberBalance>, options?: LoyaltyOptions): LoyaltyResult;
|
|
13
|
+
runEarning(ruleSet: CompiledEarningRuleSet, wm: IWorkingMemory, ledger: Map<string, MemberBalance>, options?: LoyaltyOptions): EarningResult;
|
|
14
|
+
/**
|
|
15
|
+
* Process a single earning event (for streaming ingest).
|
|
16
|
+
*/
|
|
17
|
+
earnSingle(eventData: Record<string, any>, ruleSet: CompiledEarningRuleSet, ledger: Map<string, MemberBalance>, asOf?: Date): {
|
|
18
|
+
memberId: string;
|
|
19
|
+
pointsEarned: number;
|
|
20
|
+
bonusPointsEarned: number;
|
|
21
|
+
promotionsApplied: string[];
|
|
22
|
+
newBalance: number;
|
|
23
|
+
transactions: PointTransaction[];
|
|
24
|
+
};
|
|
25
|
+
private runRedemption;
|
|
26
|
+
private runTierEvaluation;
|
|
27
|
+
private findMatchingEarningRules;
|
|
28
|
+
getOrCreateBalance(ledger: Map<string, MemberBalance>, memberId: string): MemberBalance;
|
|
29
|
+
private evaluateMemberTier;
|
|
30
|
+
private getTierMultiplierBonus;
|
|
31
|
+
private resolveTierStatus;
|
|
32
|
+
}
|
|
33
|
+
/** Singleton instance */
|
|
34
|
+
export declare const loyaltyStrategy: LoyaltyExecutor;
|
|
35
|
+
//# sourceMappingURL=strategy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategy.d.ts","sourceRoot":"","sources":["../../../src/engines/loyalty/strategy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EAGtB,cAAc,EACd,aAAa,EAGb,aAAa,EACb,gBAAgB,EAChB,aAAa,EAMd,MAAM,SAAS,CAAC;AAyCjB,qBAAa,eAAe;IAC1B,GAAG,CACD,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAClC,OAAO,GAAE,cAAmB,GAC3B,aAAa;IAiBhB,UAAU,CACR,OAAO,EAAE,sBAAsB,EAC/B,EAAE,EAAE,cAAc,EAClB,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAClC,OAAO,GAAE,cAAmB,GAC3B,aAAa;IAkGhB;;OAEG;IACH,UAAU,CACR,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC9B,OAAO,EAAE,sBAAsB,EAC/B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAClC,IAAI,GAAE,IAAiB,GACtB;QACD,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,iBAAiB,EAAE,MAAM,EAAE,CAAC;QAC5B,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,gBAAgB,EAAE,CAAC;KAClC;IAkFD,OAAO,CAAC,aAAa;IAqErB,OAAO,CAAC,iBAAiB;IAyFzB,OAAO,CAAC,wBAAwB;IAShC,kBAAkB,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,aAAa;IAgBvF,OAAO,CAAC,kBAAkB;IAoB1B,OAAO,CAAC,sBAAsB;IAS9B,OAAO,CAAC,iBAAiB;CAwB1B;AAED,yBAAyB;AACzB,eAAO,MAAM,eAAe,iBAAwB,CAAC"}
|