@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.
Files changed (241) hide show
  1. package/dist/core/evaluation/decay.d.ts +13 -2
  2. package/dist/core/evaluation/decay.d.ts.map +1 -1
  3. package/dist/core/evaluation/decay.js +24 -0
  4. package/dist/core/evaluation/decay.js.map +1 -1
  5. package/dist/core/types/rule.d.ts +25 -1
  6. package/dist/core/types/rule.d.ts.map +1 -1
  7. package/dist/core/types/rule.js +28 -0
  8. package/dist/core/types/rule.js.map +1 -1
  9. package/dist/engines/bayesian/index.d.ts +1 -1
  10. package/dist/engines/bayesian/index.d.ts.map +1 -1
  11. package/dist/engines/bayesian/index.js +2 -1
  12. package/dist/engines/bayesian/index.js.map +1 -1
  13. package/dist/engines/bayesian/types.d.ts +10 -1
  14. package/dist/engines/bayesian/types.d.ts.map +1 -1
  15. package/dist/engines/bayesian/types.js +16 -1
  16. package/dist/engines/bayesian/types.js.map +1 -1
  17. package/dist/engines/constraint/types.d.ts +36 -5
  18. package/dist/engines/constraint/types.d.ts.map +1 -1
  19. package/dist/engines/constraint/types.js +44 -1
  20. package/dist/engines/constraint/types.js.map +1 -1
  21. package/dist/engines/decay/index.d.ts +1 -1
  22. package/dist/engines/decay/index.d.ts.map +1 -1
  23. package/dist/engines/decay/index.js +5 -1
  24. package/dist/engines/decay/index.js.map +1 -1
  25. package/dist/engines/decay/types.d.ts +26 -4
  26. package/dist/engines/decay/types.d.ts.map +1 -1
  27. package/dist/engines/decay/types.js +30 -1
  28. package/dist/engines/decay/types.js.map +1 -1
  29. package/dist/engines/defeasible/index.d.ts +1 -1
  30. package/dist/engines/defeasible/index.d.ts.map +1 -1
  31. package/dist/engines/defeasible/index.js +8 -1
  32. package/dist/engines/defeasible/index.js.map +1 -1
  33. package/dist/engines/defeasible/types.d.ts +40 -5
  34. package/dist/engines/defeasible/types.d.ts.map +1 -1
  35. package/dist/engines/defeasible/types.js +56 -1
  36. package/dist/engines/defeasible/types.js.map +1 -1
  37. package/dist/engines/ensemble/index.d.ts +1 -0
  38. package/dist/engines/ensemble/index.d.ts.map +1 -1
  39. package/dist/engines/ensemble/index.js +5 -1
  40. package/dist/engines/ensemble/index.js.map +1 -1
  41. package/dist/engines/ensemble/types.d.ts +17 -2
  42. package/dist/engines/ensemble/types.d.ts.map +1 -1
  43. package/dist/engines/ensemble/types.js +23 -0
  44. package/dist/engines/ensemble/types.js.map +1 -1
  45. package/dist/engines/expert/index.d.ts +1 -1
  46. package/dist/engines/expert/index.d.ts.map +1 -1
  47. package/dist/engines/expert/index.js +3 -1
  48. package/dist/engines/expert/index.js.map +1 -1
  49. package/dist/engines/expert/types.d.ts +11 -1
  50. package/dist/engines/expert/types.d.ts.map +1 -1
  51. package/dist/engines/expert/types.js +18 -1
  52. package/dist/engines/expert/types.js.map +1 -1
  53. package/dist/engines/fuzzy/fuzzy.types.d.ts +65 -8
  54. package/dist/engines/fuzzy/fuzzy.types.d.ts.map +1 -1
  55. package/dist/engines/fuzzy/fuzzy.types.js +89 -1
  56. package/dist/engines/fuzzy/fuzzy.types.js.map +1 -1
  57. package/dist/engines/loyalty/compiler.d.ts +11 -0
  58. package/dist/engines/loyalty/compiler.d.ts.map +1 -0
  59. package/dist/engines/loyalty/compiler.js +144 -0
  60. package/dist/engines/loyalty/compiler.js.map +1 -0
  61. package/dist/engines/loyalty/engine.d.ts +76 -0
  62. package/dist/engines/loyalty/engine.d.ts.map +1 -0
  63. package/dist/engines/loyalty/engine.js +132 -0
  64. package/dist/engines/loyalty/engine.js.map +1 -0
  65. package/dist/engines/loyalty/index.d.ts +9 -0
  66. package/dist/engines/loyalty/index.d.ts.map +1 -0
  67. package/dist/engines/loyalty/index.js +24 -0
  68. package/dist/engines/loyalty/index.js.map +1 -0
  69. package/dist/engines/loyalty/strategy.d.ts +35 -0
  70. package/dist/engines/loyalty/strategy.d.ts.map +1 -0
  71. package/dist/engines/loyalty/strategy.js +405 -0
  72. package/dist/engines/loyalty/strategy.js.map +1 -0
  73. package/dist/engines/loyalty/types.d.ts +221 -0
  74. package/dist/engines/loyalty/types.d.ts.map +1 -0
  75. package/dist/engines/loyalty/types.js +51 -0
  76. package/dist/engines/loyalty/types.js.map +1 -0
  77. package/dist/engines/menu-engineering/compiler.d.ts +11 -0
  78. package/dist/engines/menu-engineering/compiler.d.ts.map +1 -0
  79. package/dist/engines/menu-engineering/compiler.js +119 -0
  80. package/dist/engines/menu-engineering/compiler.js.map +1 -0
  81. package/dist/engines/menu-engineering/engine.d.ts +32 -0
  82. package/dist/engines/menu-engineering/engine.d.ts.map +1 -0
  83. package/dist/engines/menu-engineering/engine.js +40 -0
  84. package/dist/engines/menu-engineering/engine.js.map +1 -0
  85. package/dist/engines/menu-engineering/index.d.ts +9 -0
  86. package/dist/engines/menu-engineering/index.d.ts.map +1 -0
  87. package/dist/engines/menu-engineering/index.js +21 -0
  88. package/dist/engines/menu-engineering/index.js.map +1 -0
  89. package/dist/engines/menu-engineering/strategy.d.ts +18 -0
  90. package/dist/engines/menu-engineering/strategy.d.ts.map +1 -0
  91. package/dist/engines/menu-engineering/strategy.js +318 -0
  92. package/dist/engines/menu-engineering/strategy.js.map +1 -0
  93. package/dist/engines/menu-engineering/types.d.ts +187 -0
  94. package/dist/engines/menu-engineering/types.d.ts.map +1 -0
  95. package/dist/engines/menu-engineering/types.js +27 -0
  96. package/dist/engines/menu-engineering/types.js.map +1 -0
  97. package/dist/engines/monte-carlo/index.d.ts +1 -1
  98. package/dist/engines/monte-carlo/index.d.ts.map +1 -1
  99. package/dist/engines/monte-carlo/index.js +5 -1
  100. package/dist/engines/monte-carlo/index.js.map +1 -1
  101. package/dist/engines/monte-carlo/types.d.ts +16 -1
  102. package/dist/engines/monte-carlo/types.d.ts.map +1 -1
  103. package/dist/engines/monte-carlo/types.js +23 -1
  104. package/dist/engines/monte-carlo/types.js.map +1 -1
  105. package/dist/engines/negotiation/index.d.ts +1 -0
  106. package/dist/engines/negotiation/index.d.ts.map +1 -1
  107. package/dist/engines/negotiation/index.js +7 -1
  108. package/dist/engines/negotiation/index.js.map +1 -1
  109. package/dist/engines/negotiation/types.d.ts +23 -4
  110. package/dist/engines/negotiation/types.d.ts.map +1 -1
  111. package/dist/engines/negotiation/types.js +27 -0
  112. package/dist/engines/negotiation/types.js.map +1 -1
  113. package/dist/engines/prediction/index.d.ts +1 -1
  114. package/dist/engines/prediction/index.d.ts.map +1 -1
  115. package/dist/engines/prediction/index.js +6 -1
  116. package/dist/engines/prediction/index.js.map +1 -1
  117. package/dist/engines/prediction/types.d.ts +35 -5
  118. package/dist/engines/prediction/types.d.ts.map +1 -1
  119. package/dist/engines/prediction/types.js +39 -1
  120. package/dist/engines/prediction/types.js.map +1 -1
  121. package/dist/engines/pricing/index.d.ts +2 -2
  122. package/dist/engines/pricing/index.d.ts.map +1 -1
  123. package/dist/engines/pricing/index.js +3 -1
  124. package/dist/engines/pricing/index.js.map +1 -1
  125. package/dist/engines/pricing/types.d.ts +15 -1
  126. package/dist/engines/pricing/types.d.ts.map +1 -1
  127. package/dist/engines/pricing/types.js +16 -1
  128. package/dist/engines/pricing/types.js.map +1 -1
  129. package/dist/engines/ranking/index.d.ts +1 -1
  130. package/dist/engines/ranking/index.d.ts.map +1 -1
  131. package/dist/engines/ranking/index.js +6 -1
  132. package/dist/engines/ranking/index.js.map +1 -1
  133. package/dist/engines/ranking/types.d.ts +32 -5
  134. package/dist/engines/ranking/types.d.ts.map +1 -1
  135. package/dist/engines/ranking/types.js +36 -1
  136. package/dist/engines/ranking/types.js.map +1 -1
  137. package/dist/engines/recipe-costing/compiler.d.ts +11 -0
  138. package/dist/engines/recipe-costing/compiler.d.ts.map +1 -0
  139. package/dist/engines/recipe-costing/compiler.js +177 -0
  140. package/dist/engines/recipe-costing/compiler.js.map +1 -0
  141. package/dist/engines/recipe-costing/engine.d.ts +32 -0
  142. package/dist/engines/recipe-costing/engine.d.ts.map +1 -0
  143. package/dist/engines/recipe-costing/engine.js +40 -0
  144. package/dist/engines/recipe-costing/engine.js.map +1 -0
  145. package/dist/engines/recipe-costing/index.d.ts +9 -0
  146. package/dist/engines/recipe-costing/index.d.ts.map +1 -0
  147. package/dist/engines/recipe-costing/index.js +21 -0
  148. package/dist/engines/recipe-costing/index.js.map +1 -0
  149. package/dist/engines/recipe-costing/strategy.d.ts +20 -0
  150. package/dist/engines/recipe-costing/strategy.d.ts.map +1 -0
  151. package/dist/engines/recipe-costing/strategy.js +265 -0
  152. package/dist/engines/recipe-costing/strategy.js.map +1 -0
  153. package/dist/engines/recipe-costing/types.d.ts +213 -0
  154. package/dist/engines/recipe-costing/types.d.ts.map +1 -0
  155. package/dist/engines/recipe-costing/types.js +36 -0
  156. package/dist/engines/recipe-costing/types.js.map +1 -0
  157. package/dist/engines/scoring/index.d.ts +1 -1
  158. package/dist/engines/scoring/index.d.ts.map +1 -1
  159. package/dist/engines/scoring/index.js +3 -1
  160. package/dist/engines/scoring/index.js.map +1 -1
  161. package/dist/engines/scoring/types.d.ts +8 -1
  162. package/dist/engines/scoring/types.d.ts.map +1 -1
  163. package/dist/engines/scoring/types.js +18 -1
  164. package/dist/engines/scoring/types.js.map +1 -1
  165. package/dist/engines/sentiment/index.d.ts +1 -1
  166. package/dist/engines/sentiment/index.d.ts.map +1 -1
  167. package/dist/engines/sentiment/index.js +3 -1
  168. package/dist/engines/sentiment/index.js.map +1 -1
  169. package/dist/engines/sentiment/types.d.ts +13 -2
  170. package/dist/engines/sentiment/types.d.ts.map +1 -1
  171. package/dist/engines/sentiment/types.js +17 -1
  172. package/dist/engines/sentiment/types.js.map +1 -1
  173. package/dist/engines/state-machine/index.d.ts +1 -1
  174. package/dist/engines/state-machine/index.d.ts.map +1 -1
  175. package/dist/engines/state-machine/index.js +5 -1
  176. package/dist/engines/state-machine/index.js.map +1 -1
  177. package/dist/engines/state-machine/types.d.ts +7 -0
  178. package/dist/engines/state-machine/types.d.ts.map +1 -1
  179. package/dist/engines/state-machine/types.js +14 -0
  180. package/dist/engines/state-machine/types.js.map +1 -1
  181. package/dist/engines/utility/index.d.ts +2 -2
  182. package/dist/engines/utility/index.d.ts.map +1 -1
  183. package/dist/engines/utility/index.js +4 -1
  184. package/dist/engines/utility/index.js.map +1 -1
  185. package/dist/engines/utility/types.d.ts +21 -3
  186. package/dist/engines/utility/types.d.ts.map +1 -1
  187. package/dist/engines/utility/types.js +37 -1
  188. package/dist/engines/utility/types.js.map +1 -1
  189. package/dist/index.d.ts +30 -21
  190. package/dist/index.d.ts.map +1 -1
  191. package/dist/index.js +80 -3
  192. package/dist/index.js.map +1 -1
  193. package/package.json +1 -1
  194. package/src/core/evaluation/decay.ts +13 -2
  195. package/src/core/types/rule.ts +25 -1
  196. package/src/engines/bayesian/index.ts +1 -0
  197. package/src/engines/bayesian/types.ts +10 -8
  198. package/src/engines/constraint/types.ts +40 -11
  199. package/src/engines/decay/index.ts +4 -0
  200. package/src/engines/decay/types.ts +26 -4
  201. package/src/engines/defeasible/index.ts +7 -0
  202. package/src/engines/defeasible/types.ts +42 -18
  203. package/src/engines/ensemble/index.ts +6 -0
  204. package/src/engines/ensemble/types.ts +17 -13
  205. package/src/engines/expert/index.ts +1 -0
  206. package/src/engines/expert/types.ts +11 -9
  207. package/src/engines/fuzzy/fuzzy.types.ts +65 -31
  208. package/src/engines/loyalty/compiler.ts +174 -0
  209. package/src/engines/loyalty/engine.ts +174 -0
  210. package/src/engines/loyalty/index.ts +52 -0
  211. package/src/engines/loyalty/strategy.ts +532 -0
  212. package/src/engines/loyalty/types.ts +283 -0
  213. package/src/engines/menu-engineering/compiler.ts +145 -0
  214. package/src/engines/menu-engineering/engine.ts +48 -0
  215. package/src/engines/menu-engineering/index.ts +47 -0
  216. package/src/engines/menu-engineering/strategy.ts +414 -0
  217. package/src/engines/menu-engineering/types.ts +242 -0
  218. package/src/engines/monte-carlo/index.ts +1 -0
  219. package/src/engines/monte-carlo/types.ts +16 -21
  220. package/src/engines/negotiation/index.ts +8 -0
  221. package/src/engines/negotiation/types.ts +23 -4
  222. package/src/engines/prediction/index.ts +5 -0
  223. package/src/engines/prediction/types.ts +35 -5
  224. package/src/engines/pricing/index.ts +3 -1
  225. package/src/engines/pricing/types.ts +17 -1
  226. package/src/engines/ranking/index.ts +5 -0
  227. package/src/engines/ranking/types.ts +32 -11
  228. package/src/engines/recipe-costing/compiler.ts +219 -0
  229. package/src/engines/recipe-costing/engine.ts +48 -0
  230. package/src/engines/recipe-costing/index.ts +48 -0
  231. package/src/engines/recipe-costing/strategy.ts +357 -0
  232. package/src/engines/recipe-costing/types.ts +269 -0
  233. package/src/engines/scoring/index.ts +2 -0
  234. package/src/engines/scoring/types.ts +8 -6
  235. package/src/engines/sentiment/index.ts +2 -0
  236. package/src/engines/sentiment/types.ts +13 -2
  237. package/src/engines/state-machine/index.ts +3 -0
  238. package/src/engines/state-machine/types.ts +8 -0
  239. package/src/engines/utility/index.ts +5 -0
  240. package/src/engines/utility/types.ts +23 -3
  241. 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;;;AA+DH,wCAEC;AAKD,wCAEC;AA8OD,sDAmBC;AA7QD;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAe;IAC5C,OAAO,UAAU,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAe;IAC5C,OAAO,QAAQ,IAAI,IAAI,CAAC;AAC1B,CAAC;AAuOD,2CAA2C;AAC3C,oBAAoB;AACpB,2CAA2C;AAE3C;;GAEG;AACH,SAAgB,qBAAqB,CAAC,MAAuB;IAC3D,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,UAAU;YACb,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QACtC,KAAK,QAAQ;YACX,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QACzC,KAAK,UAAU;YACb,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxB,KAAK,UAAU;YACb,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACjC,KAAK,YAAY;YACf,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACjC,KAAK,UAAU;YACb,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC/C,KAAK,QAAQ;YACX,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAClD;YACE,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED;;GAEG;AACU,QAAA,eAAe,GAAqC;IAC/D,UAAU,EAAE,IAAI;IAChB,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,IAAI;IACZ,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF;;GAEG;AACU,QAAA,YAAY,GAAkC;IACzD,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,IAAI;IACd,QAAQ,EAAE,IAAI;IACd,MAAM,EAAE,IAAI;IACZ,WAAW,EAAE,IAAI;CAClB,CAAC"}
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"}