flowgrid-sdk 1.4.2 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/dist/browser.js +12 -9
  2. package/dist/browser.js.map +1 -1
  3. package/dist/flowgrid-enterprise.flowgrid.chunk.js +2 -0
  4. package/dist/flowgrid-enterprise.flowgrid.chunk.js.map +1 -0
  5. package/dist/flowgrid-replay.flowgrid.chunk.js +3 -0
  6. package/dist/flowgrid-replay.flowgrid.chunk.js.LICENSE.txt +14 -0
  7. package/dist/flowgrid-replay.flowgrid.chunk.js.map +1 -0
  8. package/dist/flowgrid-vitals.flowgrid.chunk.js +2 -0
  9. package/dist/flowgrid-vitals.flowgrid.chunk.js.map +1 -0
  10. package/dist/flowgrid.min.js +1 -1
  11. package/dist/flowgrid.min.js.LICENSE.txt +14 -0
  12. package/dist/flowgrid.min.js.map +1 -1
  13. package/dist/index.js +63 -10
  14. package/dist/index.js.map +1 -1
  15. package/dist/lib/client/transport.js +12 -3
  16. package/dist/lib/client/transport.js.map +1 -1
  17. package/dist/lib/consent/index.js +5 -1
  18. package/dist/lib/consent/index.js.map +1 -1
  19. package/dist/lib/consent/manager.js +5 -1
  20. package/dist/lib/consent/manager.js.map +1 -1
  21. package/dist/lib/consent/types.js +2 -1
  22. package/dist/lib/consent/types.js.map +1 -1
  23. package/dist/lib/features/analytics/attribution.js +11 -7
  24. package/dist/lib/features/analytics/attribution.js.map +1 -1
  25. package/dist/lib/features/analytics/events.js +7 -3
  26. package/dist/lib/features/analytics/events.js.map +1 -1
  27. package/dist/lib/features/analytics/funnels.js +7 -3
  28. package/dist/lib/features/analytics/funnels.js.map +1 -1
  29. package/dist/lib/features/analytics/heatmaps.js +27 -14
  30. package/dist/lib/features/analytics/heatmaps.js.map +1 -1
  31. package/dist/lib/features/analytics/identify.js +7 -3
  32. package/dist/lib/features/analytics/identify.js.map +1 -1
  33. package/dist/lib/features/analytics/index.js +24 -10
  34. package/dist/lib/features/analytics/index.js.map +1 -1
  35. package/dist/lib/features/analytics/page-views.js +12 -8
  36. package/dist/lib/features/analytics/page-views.js.map +1 -1
  37. package/dist/lib/features/analytics/performance.js +46 -9
  38. package/dist/lib/features/analytics/performance.js.map +1 -1
  39. package/dist/lib/features/analytics/replay.js +55 -9
  40. package/dist/lib/features/analytics/replay.js.map +1 -1
  41. package/dist/lib/features/analytics/retention.js +7 -3
  42. package/dist/lib/features/analytics/retention.js.map +1 -1
  43. package/dist/lib/features/analytics/sessions.js +12 -8
  44. package/dist/lib/features/analytics/sessions.js.map +1 -1
  45. package/dist/lib/features/core/activation.js +7 -3
  46. package/dist/lib/features/core/activation.js.map +1 -1
  47. package/dist/lib/features/core/experiment.js +9 -5
  48. package/dist/lib/features/core/experiment.js.map +1 -1
  49. package/dist/lib/features/core/index.js +11 -4
  50. package/dist/lib/features/core/index.js.map +1 -1
  51. package/dist/lib/features/core/track-feature.js +7 -3
  52. package/dist/lib/features/core/track-feature.js.map +1 -1
  53. package/dist/lib/features/core/track-prompt.js +7 -3
  54. package/dist/lib/features/core/track-prompt.js.map +1 -1
  55. package/dist/lib/features/ecommerce/cart.js +7 -3
  56. package/dist/lib/features/ecommerce/cart.js.map +1 -1
  57. package/dist/lib/features/ecommerce/checkout.js +7 -3
  58. package/dist/lib/features/ecommerce/checkout.js.map +1 -1
  59. package/dist/lib/features/ecommerce/index.js +23 -10
  60. package/dist/lib/features/ecommerce/index.js.map +1 -1
  61. package/dist/lib/features/ecommerce/ltv.js +7 -3
  62. package/dist/lib/features/ecommerce/ltv.js.map +1 -1
  63. package/dist/lib/features/ecommerce/products.js +7 -3
  64. package/dist/lib/features/ecommerce/products.js.map +1 -1
  65. package/dist/lib/features/ecommerce/promotions.js +7 -3
  66. package/dist/lib/features/ecommerce/promotions.js.map +1 -1
  67. package/dist/lib/features/ecommerce/purchases.js +7 -3
  68. package/dist/lib/features/ecommerce/purchases.js.map +1 -1
  69. package/dist/lib/features/ecommerce/refunds.js +7 -3
  70. package/dist/lib/features/ecommerce/refunds.js.map +1 -1
  71. package/dist/lib/features/ecommerce/search.js +7 -3
  72. package/dist/lib/features/ecommerce/search.js.map +1 -1
  73. package/dist/lib/features/ecommerce/subscriptions.js +7 -3
  74. package/dist/lib/features/ecommerce/subscriptions.js.map +1 -1
  75. package/dist/lib/features/ecommerce/wishlist.js +7 -3
  76. package/dist/lib/features/ecommerce/wishlist.js.map +1 -1
  77. package/dist/lib/features/enterprise/acquisition.js +16 -7
  78. package/dist/lib/features/enterprise/acquisition.js.map +1 -1
  79. package/dist/lib/features/enterprise/alerts.js +18 -8
  80. package/dist/lib/features/enterprise/alerts.js.map +1 -1
  81. package/dist/lib/features/enterprise/churn.js +12 -5
  82. package/dist/lib/features/enterprise/churn.js.map +1 -1
  83. package/dist/lib/features/enterprise/cohorts.js +10 -4
  84. package/dist/lib/features/enterprise/cohorts.js.map +1 -1
  85. package/dist/lib/features/enterprise/engagement.js +19 -12
  86. package/dist/lib/features/enterprise/engagement.js.map +1 -1
  87. package/dist/lib/features/enterprise/forecasting.js +18 -8
  88. package/dist/lib/features/enterprise/forecasting.js.map +1 -1
  89. package/dist/lib/features/enterprise/index.js +75 -22
  90. package/dist/lib/features/enterprise/index.js.map +1 -1
  91. package/dist/lib/features/enterprise/monetization.js +16 -7
  92. package/dist/lib/features/enterprise/monetization.js.map +1 -1
  93. package/dist/lib/features/enterprise/multi-path-funnels.js +16 -7
  94. package/dist/lib/features/enterprise/multi-path-funnels.js.map +1 -1
  95. package/dist/lib/features/enterprise/paths.js +18 -8
  96. package/dist/lib/features/enterprise/paths.js.map +1 -1
  97. package/dist/lib/features/enterprise/security.js +14 -6
  98. package/dist/lib/features/enterprise/security.js.map +1 -1
  99. package/dist/lib/features/enterprise/support.js +14 -6
  100. package/dist/lib/features/enterprise/support.js.map +1 -1
  101. package/dist/lib/flowgrid.d.ts +27 -15
  102. package/dist/lib/flowgrid.js +162 -64
  103. package/dist/lib/flowgrid.js.map +1 -1
  104. package/dist/lib/tracking/analytics/attribution.d.ts +3 -3
  105. package/dist/lib/tracking/analytics/attribution.js +5 -1
  106. package/dist/lib/tracking/analytics/attribution.js.map +1 -1
  107. package/dist/lib/tracking/analytics/events.d.ts +6 -6
  108. package/dist/lib/tracking/analytics/events.js +5 -1
  109. package/dist/lib/tracking/analytics/events.js.map +1 -1
  110. package/dist/lib/tracking/analytics/funnels.d.ts +4 -4
  111. package/dist/lib/tracking/analytics/funnels.js +5 -1
  112. package/dist/lib/tracking/analytics/funnels.js.map +1 -1
  113. package/dist/lib/tracking/analytics/heatmaps.d.ts +3 -3
  114. package/dist/lib/tracking/analytics/heatmaps.js +5 -1
  115. package/dist/lib/tracking/analytics/heatmaps.js.map +1 -1
  116. package/dist/lib/tracking/analytics/identify.d.ts +4 -4
  117. package/dist/lib/tracking/analytics/identify.js +5 -1
  118. package/dist/lib/tracking/analytics/identify.js.map +1 -1
  119. package/dist/lib/tracking/analytics/index.js +23 -10
  120. package/dist/lib/tracking/analytics/index.js.map +1 -1
  121. package/dist/lib/tracking/analytics/page-views.d.ts +4 -4
  122. package/dist/lib/tracking/analytics/page-views.js +5 -1
  123. package/dist/lib/tracking/analytics/page-views.js.map +1 -1
  124. package/dist/lib/tracking/analytics/performance.d.ts +3 -3
  125. package/dist/lib/tracking/analytics/performance.js +5 -1
  126. package/dist/lib/tracking/analytics/performance.js.map +1 -1
  127. package/dist/lib/tracking/analytics/replay.js +5 -1
  128. package/dist/lib/tracking/analytics/replay.js.map +1 -1
  129. package/dist/lib/tracking/analytics/retention.d.ts +1 -1
  130. package/dist/lib/tracking/analytics/retention.js +5 -1
  131. package/dist/lib/tracking/analytics/retention.js.map +1 -1
  132. package/dist/lib/tracking/analytics/sessions.d.ts +4 -4
  133. package/dist/lib/tracking/analytics/sessions.js +5 -1
  134. package/dist/lib/tracking/analytics/sessions.js.map +1 -1
  135. package/dist/lib/tracking/core/activation.d.ts +5 -5
  136. package/dist/lib/tracking/core/activation.js +5 -1
  137. package/dist/lib/tracking/core/activation.js.map +1 -1
  138. package/dist/lib/tracking/core/experiment.d.ts +4 -4
  139. package/dist/lib/tracking/core/experiment.js +5 -1
  140. package/dist/lib/tracking/core/experiment.js.map +1 -1
  141. package/dist/lib/tracking/core/feature.d.ts +2 -2
  142. package/dist/lib/tracking/core/feature.js +5 -1
  143. package/dist/lib/tracking/core/feature.js.map +1 -1
  144. package/dist/lib/tracking/core/index.js +11 -4
  145. package/dist/lib/tracking/core/index.js.map +1 -1
  146. package/dist/lib/tracking/core/prompt.d.ts +5 -5
  147. package/dist/lib/tracking/core/prompt.js +5 -1
  148. package/dist/lib/tracking/core/prompt.js.map +1 -1
  149. package/dist/lib/tracking/ecommerce/cart.d.ts +4 -4
  150. package/dist/lib/tracking/ecommerce/cart.js +5 -1
  151. package/dist/lib/tracking/ecommerce/cart.js.map +1 -1
  152. package/dist/lib/tracking/ecommerce/checkout.d.ts +4 -4
  153. package/dist/lib/tracking/ecommerce/checkout.js +5 -1
  154. package/dist/lib/tracking/ecommerce/checkout.js.map +1 -1
  155. package/dist/lib/tracking/ecommerce/index.js +23 -10
  156. package/dist/lib/tracking/ecommerce/index.js.map +1 -1
  157. package/dist/lib/tracking/ecommerce/ltv.d.ts +2 -2
  158. package/dist/lib/tracking/ecommerce/ltv.js +5 -1
  159. package/dist/lib/tracking/ecommerce/ltv.js.map +1 -1
  160. package/dist/lib/tracking/ecommerce/products.d.ts +3 -3
  161. package/dist/lib/tracking/ecommerce/products.js +5 -1
  162. package/dist/lib/tracking/ecommerce/products.js.map +1 -1
  163. package/dist/lib/tracking/ecommerce/promotions.d.ts +3 -3
  164. package/dist/lib/tracking/ecommerce/promotions.js +5 -1
  165. package/dist/lib/tracking/ecommerce/promotions.js.map +1 -1
  166. package/dist/lib/tracking/ecommerce/purchases.d.ts +1 -1
  167. package/dist/lib/tracking/ecommerce/purchases.js +5 -1
  168. package/dist/lib/tracking/ecommerce/purchases.js.map +1 -1
  169. package/dist/lib/tracking/ecommerce/refunds.d.ts +4 -4
  170. package/dist/lib/tracking/ecommerce/refunds.js +5 -1
  171. package/dist/lib/tracking/ecommerce/refunds.js.map +1 -1
  172. package/dist/lib/tracking/ecommerce/search.d.ts +4 -4
  173. package/dist/lib/tracking/ecommerce/search.js +5 -1
  174. package/dist/lib/tracking/ecommerce/search.js.map +1 -1
  175. package/dist/lib/tracking/ecommerce/subscriptions.d.ts +6 -6
  176. package/dist/lib/tracking/ecommerce/subscriptions.js +5 -1
  177. package/dist/lib/tracking/ecommerce/subscriptions.js.map +1 -1
  178. package/dist/lib/tracking/ecommerce/wishlist.d.ts +5 -5
  179. package/dist/lib/tracking/ecommerce/wishlist.js +5 -1
  180. package/dist/lib/tracking/ecommerce/wishlist.js.map +1 -1
  181. package/dist/lib/tracking/enterprise/acquisition.js +5 -1
  182. package/dist/lib/tracking/enterprise/acquisition.js.map +1 -1
  183. package/dist/lib/tracking/enterprise/alerts.js +5 -1
  184. package/dist/lib/tracking/enterprise/alerts.js.map +1 -1
  185. package/dist/lib/tracking/enterprise/churn.d.ts +1 -1
  186. package/dist/lib/tracking/enterprise/churn.js +5 -1
  187. package/dist/lib/tracking/enterprise/churn.js.map +1 -1
  188. package/dist/lib/tracking/enterprise/cohorts.d.ts +1 -1
  189. package/dist/lib/tracking/enterprise/cohorts.js +5 -1
  190. package/dist/lib/tracking/enterprise/cohorts.js.map +1 -1
  191. package/dist/lib/tracking/enterprise/engagement.d.ts +4 -4
  192. package/dist/lib/tracking/enterprise/engagement.js +5 -1
  193. package/dist/lib/tracking/enterprise/engagement.js.map +1 -1
  194. package/dist/lib/tracking/enterprise/forecasting.d.ts +4 -4
  195. package/dist/lib/tracking/enterprise/forecasting.js +5 -1
  196. package/dist/lib/tracking/enterprise/forecasting.js.map +1 -1
  197. package/dist/lib/tracking/enterprise/index.js +25 -11
  198. package/dist/lib/tracking/enterprise/index.js.map +1 -1
  199. package/dist/lib/tracking/enterprise/monetization.js +5 -1
  200. package/dist/lib/tracking/enterprise/monetization.js.map +1 -1
  201. package/dist/lib/tracking/enterprise/multi-path-funnels.js +5 -1
  202. package/dist/lib/tracking/enterprise/multi-path-funnels.js.map +1 -1
  203. package/dist/lib/tracking/enterprise/paths.js +5 -1
  204. package/dist/lib/tracking/enterprise/paths.js.map +1 -1
  205. package/dist/lib/tracking/enterprise/security.js +5 -1
  206. package/dist/lib/tracking/enterprise/security.js.map +1 -1
  207. package/dist/lib/tracking/enterprise/support.js +5 -1
  208. package/dist/lib/tracking/enterprise/support.js.map +1 -1
  209. package/dist/lib/tracking/index.js +20 -4
  210. package/dist/lib/tracking/index.js.map +1 -1
  211. package/dist/lib/types/analytics.js +2 -1
  212. package/dist/lib/types/analytics.js.map +1 -1
  213. package/dist/lib/types/common.js +2 -1
  214. package/dist/lib/types/common.js.map +1 -1
  215. package/dist/lib/types/ecommerce.js +2 -1
  216. package/dist/lib/types/ecommerce.js.map +1 -1
  217. package/dist/lib/types/index.js +19 -3
  218. package/dist/lib/types/index.js.map +1 -1
  219. package/dist/lib/utils/browser.js +10 -4
  220. package/dist/lib/utils/browser.js.map +1 -1
  221. package/dist/lib/utils/identity.js +8 -4
  222. package/dist/lib/utils/identity.js.map +1 -1
  223. package/dist/lib/utils/storage.js +14 -6
  224. package/dist/lib/utils/storage.js.map +1 -1
  225. package/dist/umd/index.js +2 -1
  226. package/dist/umd/index.js.LICENSE.txt +14 -0
  227. package/dist/umd/index.js.map +1 -1
  228. package/package.json +2 -1
package/dist/browser.js CHANGED
@@ -1,3 +1,4 @@
1
+ "use strict";
1
2
  /**
2
3
  * @fileoverview FlowGrid SDK - Browser Bundle
3
4
  * @module browser
@@ -18,9 +19,12 @@
18
19
  * </script>
19
20
  * ```
20
21
  */
21
- import { FlowGrid } from "./lib/flowgrid";
22
+ Object.defineProperty(exports, "__esModule", { value: true });
23
+ exports.FlowGrid = void 0;
24
+ const flowgrid_1 = require("./lib/flowgrid");
25
+ Object.defineProperty(exports, "FlowGrid", { enumerable: true, get: function () { return flowgrid_1.FlowGrid; } });
22
26
  function getInstance() {
23
- const instance = FlowGrid.instance();
27
+ const instance = flowgrid_1.FlowGrid.instance();
24
28
  if (!instance) {
25
29
  throw new Error("FlowGrid not initialized. Call FlowGrid.init() first.");
26
30
  }
@@ -54,19 +58,19 @@ function normalizeOrder(order) {
54
58
  }
55
59
  const browserFlowGrid = {
56
60
  init(config) {
57
- return FlowGrid.init(config);
61
+ return flowgrid_1.FlowGrid.init(config);
58
62
  },
59
63
  instance() {
60
- return FlowGrid.instance();
64
+ return flowgrid_1.FlowGrid.instance();
61
65
  },
62
66
  reset() {
63
- FlowGrid.reset();
67
+ flowgrid_1.FlowGrid.reset();
64
68
  },
65
69
  setConsent(consent) {
66
- FlowGrid.setConsent(consent);
70
+ flowgrid_1.FlowGrid.setConsent(consent);
67
71
  },
68
72
  hasConsent(category) {
69
- return FlowGrid.hasConsent(category);
73
+ return flowgrid_1.FlowGrid.hasConsent(category);
70
74
  },
71
75
  autoTrack(options) {
72
76
  return getInstance().autoTrack(options);
@@ -97,6 +101,5 @@ if (typeof window !== "undefined") {
97
101
  window.FlowGrid = browserFlowGrid;
98
102
  window.flowgrid = browserFlowGrid;
99
103
  }
100
- export { FlowGrid };
101
- export default browserFlowGrid;
104
+ exports.default = browserFlowGrid;
102
105
  //# sourceMappingURL=browser.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";(this.webpackChunkflowgrid=this.webpackChunkflowgrid||[]).push([[137],{78(t,e,n){n.r(e),n.d(e,{AcquisitionAnalytics:()=>z,AlertsAnalytics:()=>X,ChurnAnalytics:()=>g,Cohorts:()=>h,Engagement:()=>o,Forecasting:()=>pt,Monetization:()=>k,MultiPathFunnels:()=>C,PathAnalytics:()=>W,SecurityAnalytics:()=>it,SupportAnalytics:()=>L,applyConfidenceInterval:()=>lt,calculateARPU:()=>f,calculateAnomalyScore:()=>J,calculateAvgGrowthRate:()=>ut,calculateAvgResponseTime:()=>A,calculateCAC:()=>E,calculateChurnRiskScore:()=>d,calculateConversionRate:()=>_,calculateDropOffRate:()=>D,calculateEngagementScore:()=>a,calculateExitRate:()=>$,calculateFCRRate:()=>O,calculateFailedLoginRate:()=>et,calculateGRR:()=>S,calculateLTV:()=>v,calculateLTVCACRatio:()=>x,calculateMAPE:()=>at,calculateMicroConversionScore:()=>M,calculateNRR:()=>w,calculatePathSimilarity:()=>j,calculateR2:()=>ct,calculateRMSE:()=>st,calculateROAS:()=>P,calculateSessionDepthScore:()=>c,calculateStdDev:()=>Y,calculateZScore:()=>H,checkAlertCondition:()=>Q,classifyCSAT:()=>b,classifyEngagementLevel:()=>s,classifyRiskLevel:()=>m,classifySecurityRiskLevel:()=>tt,classifySeverity:()=>K,classifySource:()=>U,classifyTrend:()=>ot,determineEventSeverity:()=>rt,evaluateCohortRules:()=>u,findBestPath:()=>F,findCommonSubPaths:()=>G,formatDuration:()=>R,generateCohortId:()=>p,generatePathId:()=>T,generateRecommendations:()=>y,isAnomaly:()=>Z,isDeadEnd:()=>B,isSuspiciousLoginPattern:()=>nt,monthlyToAnnual:()=>I,parseUTMParams:()=>q,pathToString:()=>N,stringToPath:()=>V});var r=n(748),i=n(547);function a(t,e,n,r){return Math.round(100*(.25*t+.25*e+.3*n+.2*r))/100}function s(t){return t<25?"low":t<50?"medium":t<75?"high":"power"}function c(t,e,n){const r=30*Math.min(t/10,1),i=40*Math.min(e/5,1),a=30*Math.min(n/20,1);return Math.round(r+i+a)}class o extends r.o{async trackDwellTime(t){return await this.initFeature("engagement.dwell_time",{type:"engagement",featureId:t.featureId,userId:t.userId,sessionId:t.sessionId,dwellTimeMs:t.dwellTimeMs,wasActive:t.wasActive??!0,...t.properties,timestamp:(new Date).toISOString()})}async trackSessionDepth(t){const e=c(t.pagesVisited,t.featuresUsed,t.actionsTaken);return await this.initFeature("engagement.session_depth",{type:"engagement",sessionId:t.sessionId,userId:t.userId,pagesVisited:t.pagesVisited,featuresUsed:t.featuresUsed,actionsTaken:t.actionsTaken,durationMs:t.durationMs,depthScore:e,timestamp:(new Date).toISOString()})}async trackContentConsumption(t){return await this.initFeature("engagement.content_consumption",{type:"engagement",contentId:t.contentId,contentType:t.contentType,userId:t.userId,percentageConsumed:t.percentageConsumed,timeSpentMs:t.timeSpentMs,completed:t.completed??t.percentageConsumed>=90,...t.properties,timestamp:(new Date).toISOString()})}async trackUserActivity(t){return await this.initFeature("engagement.user_activity",{type:"engagement",userId:t.userId,activityType:t.activityType,durationMs:t.durationMs,sessionId:t.sessionId,timestamp:(new Date).toISOString()})}autoTrackDwell(t,e={}){if(!(0,i.Bd)())return()=>{};const n=(0,i.YE)();if(!n)return()=>{};let r=0,a="visible"===n.visibilityState?Date.now():0;const s=()=>{const t=Date.now();"visible"===n.visibilityState?a=t:a&&(r+=t-a,a=0)};n.addEventListener("visibilitychange",s);let c=!1;return()=>{c||(c=!0,n.removeEventListener("visibilitychange",s),a&&(r+=Date.now()-a,a=0),r>0&&this.trackDwellTime({featureId:t,dwellTimeMs:r,userId:e.userId,sessionId:e.sessionId,wasActive:!0}))}}autoTrack(t={}){if(!(0,i.Bd)())return()=>{};const e=(0,i.zk)(),n=(0,i.YE)();if(!e||!n)return()=>{};const r=t.idleAfterMs??3e4,a=t.pollMs??5e3;let s=t.sessionId;if(!s)try{s=e.sessionStorage.getItem("flowgrid:sessionId")||void 0}catch{}s||(s=`eng_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`);const c=Date.now();let o=1;const u=new Set;let l=0,p=Date.now(),h="visible"===n.visibilityState?"active":"idle",d=Date.now();const m=e.history.pushState,y=e.history.replaceState,g=()=>{o++};e.history.pushState=function(...t){const e=m.apply(this,t);return g(),e},e.history.replaceState=function(...t){const e=y.apply(this,t);return g(),e},e.addEventListener("popstate",g);const f=t=>{l++,p=Date.now();const e=t.target,n=e?.closest?.("[data-flowgrid-feature]")?.getAttribute("data-flowgrid-feature");n&&u.add(n)};n.addEventListener("click",f,{capture:!0}),n.addEventListener("keydown",f,{capture:!0}),n.addEventListener("scroll",f,{capture:!0,passive:!0});const w=e=>{if(e===h)return;const n=Date.now(),r=n-d,i=h;h=e,d=n,r>0&&t.userId&&this.trackUserActivity({userId:t.userId,activityType:i,durationMs:r,sessionId:s})},S=()=>{const t=Date.now();let e;e="visible"!==n.visibilityState?"idle":t-p<r?"active":"passive",w(e)},I=e.setInterval(S,a),v=()=>S();n.addEventListener("visibilitychange",v);let k=!1;const _=()=>{if(k)return;k=!0,w("visible"===n.visibilityState?h:"idle");const e=Date.now()-c;e<=0||this.trackSessionDepth({sessionId:s,userId:t.userId,pagesVisited:o,featuresUsed:u.size,actionsTaken:l,durationMs:e})};return e.addEventListener("pagehide",_),(0,i.vs)(()=>e.clearInterval(I),()=>n.removeEventListener("visibilitychange",v),()=>n.removeEventListener("click",f,!0),()=>n.removeEventListener("keydown",f,!0),()=>n.removeEventListener("scroll",f,!0),()=>e.removeEventListener("popstate",g),()=>e.removeEventListener("pagehide",_),()=>{e.history.pushState=m,e.history.replaceState=y},()=>_())}}function u(t,e){let n=!0,r="and";for(const i of e){const e=l(t[i.attribute],i.operator,i.value);n="and"===r?n&&e:n||e,r=i.logicalOperator??"and"}return n}function l(t,e,n){switch(e){case"equals":return t===n;case"not_equals":return t!==n;case"contains":return String(t).includes(String(n));case"not_contains":return!String(t).includes(String(n));case"gt":return Number(t)>Number(n);case"gte":return Number(t)>=Number(n);case"lt":return Number(t)<Number(n);case"lte":return Number(t)<=Number(n);case"in":return Array.isArray(n)&&n.includes(t);case"not_in":return Array.isArray(n)&&!n.includes(t);case"exists":return null!=t;case"not_exists":return null==t;case"between":if(Array.isArray(n)&&2===n.length){const e=Number(t);return e>=Number(n[0])&&e<=Number(n[1])}return!1;default:return!1}}function p(t){return t.toLowerCase().replace(/[^a-z0-9]+/g,"_").replace(/^_|_$/g,"")}class h extends r.o{async createCohort(t){const e=t.cohortId??p(t.name);return await this.initFeature("cohorts.create",{type:"cohorts",cohortId:e,name:t.name,description:t.description,cohortType:t.type,rules:t.rules,dynamic:t.dynamic??!0,timeWindow:t.timeWindow,timestamp:(new Date).toISOString()})}async updateCohort(t,e){const{type:n,...r}=e;return await this.initFeature("cohorts.update",{type:"cohorts",cohortId:t,cohortType:n,...r,timestamp:(new Date).toISOString()})}async deleteCohort(t){return await this.initFeature("cohorts.delete",{type:"cohorts",cohortId:t,timestamp:(new Date).toISOString()})}async listCohorts(t){return await this.initFeature("cohorts.list",{type:"cohorts",filter:t,timestamp:(new Date).toISOString()})}async isUserInCohort(t,e){return await this.initFeature("cohorts.check_membership",{type:"cohorts",userId:t,cohortId:e,timestamp:(new Date).toISOString()})}async createSegment(t){return await this.initFeature("cohorts.create_segment",{type:"cohorts",...t,timestamp:(new Date).toISOString()})}async compareCohorts(t){return await this.initFeature("cohorts.compare",{type:"cohorts",...t,timestamp:(new Date).toISOString()})}}function d(t){let e=0;return e+=100*Math.min(t.daysSinceLastActivity/30,1)*.25,e+=.2*Math.max(0,-t.usageTrend),e+=.15*Math.max(0,-t.sessionFrequencyChange),e+=.1*Math.max(0,-t.featureUsageChange),e+=.1*Math.min(10*t.supportTickets,100),void 0!==t.npsScore&&(e+=.1*(100-10*t.npsScore)),e+=.05*Math.min(25*t.paymentFailures,100),void 0!==t.daysUntilRenewal&&(e+=.05*Math.max(0,100-t.daysUntilRenewal)),Math.round(Math.min(e,100))}function m(t){return t<25?"low":t<50?"medium":t<75?"high":"critical"}function y(t){const e=[],n={daysSinceLastActivity:"Send a re-engagement email or push notification",usageTrend:"Schedule a product walkthrough or training session",sessionFrequencyChange:"Offer incentives to increase usage frequency",featureUsageChange:"Highlight underutilized features via in-app messaging",supportTickets:"Escalate to customer success for personalized support",npsScore:"Conduct a follow-up call to address concerns",paymentFailures:"Reach out to resolve payment issues proactively",daysUntilRenewal:"Start renewal conversation early with value recap"};for(const r of t.slice(0,3))n[r.factor]&&e.push(n[r.factor]);return e}class g extends r.o{async trackUsageDecay(t){return await this.initFeature("churn.usage_decay",{type:"churn",...t,timestamp:(new Date).toISOString()})}async trackNPS(t){return await this.initFeature("churn.nps",{type:"churn",...t,timestamp:(new Date).toISOString()})}async trackChurn(t){return await this.initFeature("churn.churn_event",{type:"churn",...t,timestamp:(new Date).toISOString()})}async trackPreventionAction(t){return await this.initFeature("churn.prevention_action",{type:"churn",...t,timestamp:(new Date).toISOString()})}async updatePreventionOutcome(t,e,n){return await this.initFeature("churn.update_prevention_outcome",{type:"churn",userId:t,actionType:e,outcome:n,timestamp:(new Date).toISOString()})}}function f(t,e,n){const r=e>0?t/e:0;return{amount:Math.round(100*r)/100,currency:n}}function w(t,e,n,r){return 0===t?0:Math.round((t+e-n-r)/t*1e4)/100}function S(t,e,n){return 0===t?0:Math.round((t-e-n)/t*1e4)/100}function I(t){return{amount:12*t.amount,currency:t.currency}}function v(t,e,n){if(e<=0)return{amount:60*t,currency:n};const r=t/e;return{amount:Math.round(100*r)/100,currency:n}}class k extends r.o{async trackRevenue(t){const{type:e,...n}=t;return await this.initFeature("monetization.revenue",{type:"monetization",revenueType:e,...n,timestamp:(new Date).toISOString()})}async trackExpansion(t,e,n,r){return await this.initFeature("monetization.expansion",{type:"monetization",userId:t,fromPlan:e,toPlan:n,additionalRevenue:r,revenueType:"expansion",timestamp:(new Date).toISOString()})}async trackContraction(t,e,n,r){return await this.initFeature("monetization.contraction",{type:"monetization",userId:t,fromPlan:e,toPlan:n,reducedRevenue:r,revenueType:"downgrade",timestamp:(new Date).toISOString()})}}function _(t,e){return 0===t?0:Math.round(e/t*1e4)/100}function D(t,e){return 0===t?0:Math.round((t-e)/t*1e4)/100}function F(t){return 0===t.length?null:t.reduce((t,e)=>e.completionRate>t.completionRate?e:t)}function M(t,e){let n=0,r=0;for(const i of e){const e=i.weight??1;n+=e;const a=t.find(t=>t.id===i.id);a&&(r+=e*a.completionRate)}return n>0?Math.round(r/n*100)/100:0}function T(t){return t.join("_").toLowerCase().replace(/[^a-z0-9_]/g,"")}class C extends r.o{async defineFunnel(t){const e=t.funnelId??t.name.toLowerCase().replace(/[^a-z0-9]+/g,"_"),n=t.paths.map(t=>({...t,pathId:t.pathId??T(t.steps)}));return await this.initFeature("multi_path_funnels.define",{type:"multi_path_funnels",funnelId:e,name:t.name,description:t.description,paths:n,microConversions:t.microConversions,goalEvent:t.goalEvent,timestamp:(new Date).toISOString()})}async updateFunnel(t,e){return await this.initFeature("multi_path_funnels.update",{type:"multi_path_funnels",funnelId:t,...e,timestamp:(new Date).toISOString()})}async deleteFunnel(t){return await this.initFeature("multi_path_funnels.delete",{type:"multi_path_funnels",funnelId:t,timestamp:(new Date).toISOString()})}async trackStep(t){return await this.initFeature("multi_path_funnels.track_step",{type:"multi_path_funnels",...t,timestamp:(new Date).toISOString()})}async trackMicroConversion(t){return await this.initFeature("multi_path_funnels.track_micro_conversion",{type:"multi_path_funnels",...t,timestamp:(new Date).toISOString()})}async trackGoal(t,e,n){return await this.initFeature("multi_path_funnels.track_goal",{type:"multi_path_funnels",funnelId:t,userId:e,...n,timestamp:(new Date).toISOString()})}async analyzeFunnel(t){return await this.initFeature("multi_path_funnels.analyze",{type:"multi_path_funnels",...t,timestamp:(new Date).toISOString()})}async comparePaths(t,e){return await this.initFeature("multi_path_funnels.compare_paths",{type:"multi_path_funnels",funnelId:t,filter:e,timestamp:(new Date).toISOString()})}async listFunnels(){return await this.initFeature("multi_path_funnels.list",{type:"multi_path_funnels",timestamp:(new Date).toISOString()})}}function O(t,e){return 0===e?0:Math.round(t/e*1e4)/100}function A(t){if(0===t.length)return 0;const e=t.reduce((t,e)=>t+e,0);return Math.round(e/t.length)}function b(t){return t<2?"poor":t<3?"fair":t<4?"good":"excellent"}function R(t){return t<6e4?`${Math.round(t/1e3)}s`:t<36e5?`${Math.round(t/6e4)}m`:t<864e5?`${Math.round(t/36e5)}h`:`${Math.round(t/864e5)}d`}class L extends r.o{async trackTicket(t){return await this.initFeature("support.ticket_created",{type:"support",...t,status:"open",createdAt:(new Date).toISOString(),timestamp:(new Date).toISOString()})}async updateTicket(t){return await this.initFeature("support.ticket_updated",{type:"support",...t,timestamp:(new Date).toISOString()})}async trackResponse(t,e,n){return await this.initFeature("support.ticket_response",{type:"support",ticketId:t,agentId:e,responseTimeMs:n,timestamp:(new Date).toISOString()})}async trackResolution(t,e,n){return await this.initFeature("support.ticket_resolved",{type:"support",ticketId:t,resolutionTimeMs:e,interactionCount:n,firstContactResolution:1===n,timestamp:(new Date).toISOString()})}async trackCSAT(t){return await this.initFeature("support.csat",{type:"support",...t,timestamp:(new Date).toISOString()})}async trackFeatureComplaint(t){return await this.initFeature("support.feature_complaint",{type:"support",...t,timestamp:(new Date).toISOString()})}}function E(t,e,n){return 0===e?{amount:0,currency:n}:{amount:Math.round(t/e*100)/100,currency:n}}function P(t,e){return 0===e?0:Math.round(t/e*100)/100}function x(t,e){return 0===e?0:Math.round(t/e*100)/100}function q(t){const e={};try{const n=new URL(t),r=["utm_source","utm_medium","utm_campaign","utm_term","utm_content"];for(const t of r){const r=n.searchParams.get(t);r&&(e[t.replace("utm_","")]=r)}}catch{}return e}function U(t,e){if(!t&&!e)return"direct";const n=t?.toLowerCase()??"",r=e?.toLowerCase()??"";return r.includes("cpc")||r.includes("paid")?n.includes("facebook")||n.includes("instagram")||n.includes("linkedin")?"paid_social":"paid_search":n.includes("facebook")||n.includes("twitter")||n.includes("linkedin")?"organic_social":"email"===r?"email":"referral"===r?"referral":"affiliate"===r?"affiliate":"organic"}class z extends r.o{async trackAcquisition(t){return await this.initFeature("acquisition.acquired",{type:"acquisition",...t,timestamp:(new Date).toISOString()})}async trackLifecycleTransition(t){return await this.initFeature("acquisition.lifecycle_transition",{type:"acquisition",...t,timestamp:(new Date).toISOString()})}async createCampaign(t){return await this.initFeature("acquisition.create_campaign",{type:"acquisition",...t,timestamp:(new Date).toISOString()})}async trackCampaignSpend(t){return await this.initFeature("acquisition.campaign_spend",{type:"acquisition",...t,timestamp:(new Date).toISOString()})}}function N(t){return t.join(" → ")}function V(t){return t.split(" → ").map(t=>t.trim())}function $(t,e){return 0===e?0:Math.round(t/e*1e4)/100}function B(t,e,n=50){return t>n&&!e}function j(t,e){const n=new Set(t),r=new Set(e),i=new Set([...n].filter(t=>r.has(t))),a=new Set([...n,...r]);return i.size/a.size}function G(t,e=2){const n=new Map;for(const r of t)for(let t=0;t<=r.length-e;t++)for(let i=t+e;i<=r.length;i++){const e=N(r.slice(t,i));n.set(e,(n.get(e)??0)+1)}return Array.from(n.entries()).filter(([,t])=>t>1).map(([t,e])=>({subPath:V(t),count:e})).sort((t,e)=>e.count-t.count)}class W extends r.o{async trackTransition(t){return await this.initFeature("paths.transition",{type:"paths",...t,timestamp:(new Date).toISOString()})}async trackFeatureSequence(t){return await this.initFeature("paths.feature_sequence",{type:"paths",...t,timestamp:(new Date).toISOString()})}async definePath(t){return await this.initFeature("paths.define_path",{type:"paths",...t,timestamp:(new Date).toISOString()})}async comparePaths(t,e){return await this.initFeature("paths.compare_paths",{type:"paths",paths:t,filter:e,timestamp:(new Date).toISOString()})}}function Y(t){if(0===t.length)return 0;const e=t.reduce((t,e)=>t+e,0)/t.length,n=t.map(t=>Math.pow(t-e,2)),r=n.reduce((t,e)=>t+e,0)/n.length;return Math.sqrt(r)}function H(t,e,n){return 0===n?0:(t-e)/n}function Z(t,e=.5){const n=4-2*e;return Math.abs(t)>n}function J(t){const e=Math.abs(t);return e<=2?e/10:e<=3?.2+.3*(e-2):e<=4?.5+.3*(e-3):Math.min(.8+.1*(e-4),1)}function K(t){return t<.25?"info":t<.5?"warning":t<.75?"high":"critical"}function Q(t,e,n,r,i){switch(e){case"exceeds":return t>n;case"drops_below":return t<n;case"changes_by":return void 0!==r&&void 0!==i&&100*Math.abs((t-r)/r)>=i;case"no_data":return 0===t||null===t;default:return!1}}class X extends r.o{async createAlert(t){return await this.initFeature("alerts.create",{type:"alerts",...t,alertId:t.alertId??t.name.toLowerCase().replace(/[^a-z0-9]+/g,"_"),enabled:t.enabled??!0,timestamp:(new Date).toISOString()})}async updateAlert(t,e){return await this.initFeature("alerts.update",{type:"alerts",alertId:t,...e,timestamp:(new Date).toISOString()})}async deleteAlert(t){return await this.initFeature("alerts.delete",{type:"alerts",alertId:t,timestamp:(new Date).toISOString()})}async toggleAlert(t,e){return await this.initFeature("alerts.toggle",{type:"alerts",alertId:t,enabled:e,timestamp:(new Date).toISOString()})}async listAlerts(t){return await this.initFeature("alerts.list",{type:"alerts",enabled:t,timestamp:(new Date).toISOString()})}async acknowledgeAlert(t,e){return await this.initFeature("alerts.acknowledge",{type:"alerts",instanceId:t,acknowledgedBy:e,timestamp:(new Date).toISOString()})}async resolveAlert(t,e){return await this.initFeature("alerts.resolve",{type:"alerts",instanceId:t,notes:e,timestamp:(new Date).toISOString()})}async muteAlert(t,e){return await this.initFeature("alerts.mute",{type:"alerts",alertId:t,durationMinutes:e,timestamp:(new Date).toISOString()})}async detectAnomalies(t){return await this.initFeature("alerts.detect_anomalies",{type:"alerts",...t,timestamp:(new Date).toISOString()})}async configureNotification(t){return await this.initFeature("alerts.configure_notification",{type:"alerts",...t,timestamp:(new Date).toISOString()})}async testNotification(t){return await this.initFeature("alerts.test_notification",{type:"alerts",channel:t,timestamp:(new Date).toISOString()})}}function tt(t){return t<25?"low":t<50?"medium":t<75?"high":"critical"}function et(t,e){return 0===e?0:Math.round(t/e*1e4)/100}function nt(t,e,n=5){return t>=n&&e<=15}function rt(t,e){return["suspicious_activity"].includes(t)?"critical":["role_change","permission_change","data_deletion","api_key_revoked"].includes(t)?"high":["login_failure","password_reset","data_export"].includes(t)?e?"medium":"high":"low"}class it extends r.o{async trackLoginAttempt(t){const e=t.success?"login_success":"login_failure",n=rt(e,t.success);return await this.initFeature("security.login_attempt",{type:"security",...t,eventType:e,severity:n,timestamp:(new Date).toISOString()})}async trackLogout(t,e){return await this.initFeature("security.logout",{type:"security",userId:t,sessionId:e,eventType:"logout",timestamp:(new Date).toISOString()})}async trackPasswordChange(t,e=!1){return await this.initFeature("security.password_change",{type:"security",userId:t,forced:e,eventType:"password_change",timestamp:(new Date).toISOString()})}async trackRoleChange(t){return await this.initFeature("security.role_change",{type:"security",...t,eventType:"role_change",timestamp:(new Date).toISOString()})}async trackPermissionChange(t){return await this.initFeature("security.permission_change",{type:"security",...t,eventType:"permission_change",timestamp:(new Date).toISOString()})}async trackDataAccess(t){return await this.initFeature("security.data_access",{type:"security",...t,eventType:"data_access",timestamp:(new Date).toISOString()})}async trackDataExport(t,e,n){return await this.initFeature("security.data_export",{type:"security",userId:t,resourceType:e,recordCount:n,eventType:"data_export",timestamp:(new Date).toISOString()})}async trackSuspiciousActivity(t,e,n){return await this.initFeature("security.suspicious_activity",{type:"security",userId:t,activityType:e,details:n,eventType:"suspicious_activity",severity:"critical",timestamp:(new Date).toISOString()})}async trackComplianceEvent(t){return await this.initFeature("security.compliance_event",{type:"security",...t,timestamp:(new Date).toISOString()})}}function at(t,e){if(t.length!==e.length||0===t.length)return 0;let n=0,r=0;for(let i=0;i<t.length;i++)0!==t[i]&&(n+=Math.abs((t[i]-e[i])/t[i]),r++);return r>0?Math.round(n/r*1e4)/100:0}function st(t,e){if(t.length!==e.length||0===t.length)return 0;let n=0;for(let r=0;r<t.length;r++)n+=Math.pow(t[r]-e[r],2);return Math.round(100*Math.sqrt(n/t.length))/100}function ct(t,e){if(t.length!==e.length||0===t.length)return 0;const n=t.reduce((t,e)=>t+e,0)/t.length;let r=0,i=0;for(let a=0;a<t.length;a++)r+=Math.pow(t[a]-e[a],2),i+=Math.pow(t[a]-n,2);return 0!==i?Math.round(1e4*(1-r/i))/1e4:0}function ot(t,e,n=5){if(0===t)return e>0?"growing":"stable";const r=(e-t)/t*100;return r>n?"growing":r<-n?"declining":"stable"}function ut(t){if(t.length<2)return 0;let e=0,n=0;for(let r=1;r<t.length;r++)0!==t[r-1]&&(e+=(t[r]-t[r-1])/t[r-1],n++);return n>0?Math.round(e/n*1e4)/100:0}function lt(t,e,n=.95){const r=({.9:1.645,.95:1.96,.99:2.576}[n]??1.96)*e;return{lower:Math.max(0,t-r),upper:t+r}}class pt extends r.o{async forecastActiveUsers(t){return await this.initFeature("forecasting.active_users",{type:"forecasting",...t,model:t.model??"ensemble",includeConfidence:t.includeConfidence??!0,timestamp:(new Date).toISOString()})}async forecastRevenue(t){return await this.initFeature("forecasting.revenue",{type:"forecasting",...t,metric:"revenue",currency:t.currency??"USD",timestamp:(new Date).toISOString()})}async forecastMRR(t){return await this.initFeature("forecasting.mrr",{type:"forecasting",...t,metric:"mrr",timestamp:(new Date).toISOString()})}async forecastFeatureAdoption(t){return await this.initFeature("forecasting.feature_adoption",{type:"forecasting",...t,metric:"feature_usage",timestamp:(new Date).toISOString()})}async forecastChurn(t){return await this.initFeature("forecasting.churn",{type:"forecasting",...t,metric:"churn_rate",timestamp:(new Date).toISOString()})}async forecastSignups(t){return await this.initFeature("forecasting.signups",{type:"forecasting",...t,metric:"signups",timestamp:(new Date).toISOString()})}async compareScenarios(t){return await this.initFeature("forecasting.scenarios",{type:"forecasting",...t,timestamp:(new Date).toISOString()})}async forecastCustomMetric(t,e){return await this.initFeature("forecasting.custom",{type:"forecasting",...e,metric:"custom",customMetricName:t,timestamp:(new Date).toISOString()})}}},544(t,e,n){n.r(e),n.d(e,{AcquisitionTracker:()=>u,AlertTracker:()=>p,ChurnTracker:()=>a,CohortTracker:()=>i,EngagementTracker:()=>r,ForecastingTracker:()=>d,MonetizationTracker:()=>s,MultiPathFunnelTracker:()=>c,PathTracker:()=>l,SecurityTracker:()=>h,SupportTracker:()=>o});class r{constructor(t){this.client=t}dwell(t,e,n){return this.client.trackDwellTime({featureId:t,dwellTimeMs:e,properties:n})}sessionDepth(t,e,n,r,i){return this.client.trackSessionDepth({sessionId:t,pagesVisited:e,featuresUsed:n,actionsTaken:r,durationMs:i})}contentConsumption(t,e,n,r){return this.client.trackContentConsumption({contentId:t,contentType:e,percentageConsumed:n,timeSpentMs:r})}activity(t,e,n){return this.client.trackUserActivity({userId:t,activityType:e,durationMs:n})}autoTrackDwell(t,e){return this.client.autoTrackDwell(t,e)}autoTrack(t){return this.client.autoTrack(t)}}class i{constructor(t){this.client=t}create(t){return this.client.createCohort(t)}segment(t){return this.client.createSegment(t)}isMember(t,e){return this.client.isUserInCohort(t,e)}}class a{constructor(t){this.client=t}decay(t,e,n){return this.client.trackUsageDecay({userId:t,metric:e,periods:n})}nps(t,e,n){return this.client.trackNPS({userId:t,score:e,feedback:n})}churned(t,e,n){return this.client.trackChurn({userId:t,churnType:e,reason:n})}prevention(t,e,n){return this.client.trackPreventionAction({userId:t,actionType:e,details:n})}}class s{constructor(t){this.client=t}revenue(t,e,n,r,i){return this.client.trackRevenue({userId:t,amount:e,currency:n,type:r,properties:i})}}class c{constructor(t){this.client=t}define(t){return this.client.defineFunnel(t)}step(t,e,n,r){return this.client.trackStep({funnelId:t,step:e,userId:n,properties:r})}microConversion(t,e,n){return this.client.trackMicroConversion({conversionId:t,userId:e,properties:n})}}class o{constructor(t){this.client=t}ticket(t,e,n,r,i,a){return this.client.trackTicket({ticketId:t,userId:e,subject:n,category:r,priority:i,channel:a})}update(t,e,n){return this.client.updateTicket({ticketId:t,status:e,properties:n})}csat(t,e,n,r){return this.client.trackCSAT({ticketId:t,userId:e,score:n,feedback:r})}featureComplaint(t,e,n,r){return this.client.trackFeatureComplaint({userId:t,featureId:e,complaintType:n,severity:r})}}class u{constructor(t){this.client=t}acquired(t,e,n){return this.client.trackAcquisition({userId:t,source:e,properties:n})}campaign(t){return this.client.createCampaign(t)}spend(t,e,n){return this.client.trackCampaignSpend({campaignId:t,amount:e,date:n})}lifecycle(t,e,n){return this.client.trackLifecycleTransition({userId:t,fromStage:e,toStage:n})}}class l{constructor(t){this.client=t}transition(t,e,n,r){return this.client.trackTransition({userId:t,fromScreen:e,toScreen:n,properties:r})}sequence(t,e,n){return this.client.trackFeatureSequence({userId:t,feature:e,order:n})}define(t){return this.client.definePath(t)}}class p{constructor(t){this.client=t}create(t){return this.client.createAlert(t)}update(t,e){return this.client.updateAlert(t,e)}delete(t){return this.client.deleteAlert(t)}acknowledge(t,e){return this.client.acknowledgeAlert(t,e)}resolve(t,e){return this.client.resolveAlert(t,e)}mute(t,e){return this.client.muteAlert(t,e)}}class h{constructor(t){this.client=t}login(t,e,n){return this.client.trackLoginAttempt({userId:t,success:e,properties:n})}roleChange(t,e,n,r){return this.client.trackRoleChange({userId:t,changedBy:e,previousRole:n,newRole:r})}permissionChange(t,e,n,r){return this.client.trackPermissionChange({userId:t,changedBy:e,permission:n,action:r})}dataAccess(t,e,n,r){return this.client.trackDataAccess({userId:t,resourceType:e,accessType:n,properties:r})}compliance(t,e,n){return this.client.trackComplianceEvent({userId:t,eventType:e,properties:n})}}class d{constructor(t){this.client=t}activeUsers(t,e,n){return this.client.forecastActiveUsers({metric:t,periods:e,granularity:n})}revenue(t,e){return this.client.forecastRevenue({periods:t,granularity:e})}featureAdoption(t,e,n){return this.client.forecastFeatureAdoption({featureId:t,periods:e,granularity:n})}churn(t,e){return this.client.forecastChurn({periods:t,granularity:e})}}}}]);
2
+ //# sourceMappingURL=flowgrid-enterprise.flowgrid.chunk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowgrid-enterprise.flowgrid.chunk.js","mappings":"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","sources":["webpack://flowgrid/./src/lib/features/enterprise/engagement.ts","webpack://flowgrid/./src/lib/features/enterprise/cohorts.ts","webpack://flowgrid/./src/lib/features/enterprise/churn.ts","webpack://flowgrid/./src/lib/features/enterprise/monetization.ts","webpack://flowgrid/./src/lib/features/enterprise/multi-path-funnels.ts","webpack://flowgrid/./src/lib/features/enterprise/support.ts","webpack://flowgrid/./src/lib/features/enterprise/acquisition.ts","webpack://flowgrid/./src/lib/features/enterprise/paths.ts","webpack://flowgrid/./src/lib/features/enterprise/alerts.ts","webpack://flowgrid/./src/lib/features/enterprise/security.ts","webpack://flowgrid/./src/lib/features/enterprise/forecasting.ts","webpack://flowgrid/./src/lib/tracking/enterprise/engagement.ts","webpack://flowgrid/./src/lib/tracking/enterprise/cohorts.ts","webpack://flowgrid/./src/lib/tracking/enterprise/churn.ts","webpack://flowgrid/./src/lib/tracking/enterprise/monetization.ts","webpack://flowgrid/./src/lib/tracking/enterprise/multi-path-funnels.ts","webpack://flowgrid/./src/lib/tracking/enterprise/support.ts","webpack://flowgrid/./src/lib/tracking/enterprise/acquisition.ts","webpack://flowgrid/./src/lib/tracking/enterprise/paths.ts","webpack://flowgrid/./src/lib/tracking/enterprise/alerts.ts","webpack://flowgrid/./src/lib/tracking/enterprise/security.ts","webpack://flowgrid/./src/lib/tracking/enterprise/forecasting.ts"],"sourcesContent":["/**\n * @fileoverview Enterprise - Engagement Analytics\n * @module features/enterprise/engagement\n * \n * @description\n * Track deep user engagement beyond activation including\n * feature dwell time, session depth, and content consumption.\n * \n * @useCases\n * - Measure feature dwell time\n * - Track session depth and engagement\n * - Monitor content consumption patterns\n * - Distinguish active vs passive users\n * - Correlate engagement with retention\n * \n * @metrics\n * - Average engagement time\n * - Feature dwell time\n * - Session depth score\n * - Content consumption rate\n * - Active user ratio\n * \n * @chartData\n * - Line chart: Engagement over time\n * - Bar chart: Engagement by feature\n * - Heatmap: Engagement by time of day\n * - Distribution: User engagement scores\n * \n * @example\n * ```typescript\n * const engagement = new Engagement(webId, endpoint, apiKey);\n * \n * // Track feature dwell time\n * await engagement.trackDwellTime({\n * featureId: 'dashboard',\n * userId: 'user_123',\n * dwellTimeMs: 45000\n * });\n * ```\n */\n\nimport { FlowGridTransport } from \"../../client/transport\";\nimport { DateRangeFilter, TimeSeriesData, TimeGranularity, ActiveUsersConfig, ActiveUsersResponse, ActiveUserRatios } from \"../../types\";\nimport { isBrowser, getDocument, getWindow, combineTeardowns, type Teardown } from \"../../utils/browser\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Configuration for tracking feature dwell time.\n */\nexport interface DwellTimeConfig {\n /** Feature identifier */\n featureId: string;\n /** User ID */\n userId?: string;\n /** Session ID */\n sessionId?: string;\n /** Time spent on feature (ms) */\n dwellTimeMs: number;\n /** Whether user was actively interacting */\n wasActive?: boolean;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Configuration for tracking session depth.\n */\nexport interface SessionDepthConfig {\n /** Session ID */\n sessionId: string;\n /** User ID */\n userId?: string;\n /** Number of pages/screens visited */\n pagesVisited: number;\n /** Number of features used */\n featuresUsed: number;\n /** Number of actions taken */\n actionsTaken: number;\n /** Total session duration (ms) */\n durationMs: number;\n}\n\n/**\n * Configuration for tracking content consumption.\n */\nexport interface ContentConsumptionConfig {\n /** Content identifier */\n contentId: string;\n /** Content type */\n contentType: 'article' | 'video' | 'audio' | 'document' | 'course' | 'other';\n /** User ID */\n userId?: string;\n /** Percentage consumed (0-100) */\n percentageConsumed: number;\n /** Time spent consuming (ms) */\n timeSpentMs: number;\n /** Whether content was completed */\n completed?: boolean;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * User activity classification.\n */\nexport interface UserActivityConfig {\n /** User ID */\n userId: string;\n /** Activity type */\n activityType: 'active' | 'passive' | 'idle';\n /** Duration in this state (ms) */\n durationMs: number;\n /** Session ID */\n sessionId?: string;\n}\n\n/**\n * Engagement score configuration.\n */\nexport interface EngagementScoreConfig {\n /** User ID */\n userId: string;\n /** Time period for score calculation */\n period?: 'day' | 'week' | 'month';\n}\n\n/**\n * Engagement analytics filter.\n */\nexport interface EngagementAnalyticsFilter extends DateRangeFilter {\n /** Filter by feature */\n featureId?: string;\n /** Filter by user segment */\n segment?: string;\n /** Minimum engagement score */\n minScore?: number;\n}\n\n/**\n * Engagement response from API.\n */\nexport interface EngagementResponse {\n eventName: string;\n properties: Record<string, unknown>;\n response: {\n tracked: boolean;\n engagementId: string;\n timestamp: string;\n };\n}\n\n/**\n * Engagement score result.\n */\nexport interface EngagementScore {\n userId: string;\n score: number;\n percentile: number;\n breakdown: {\n dwellTime: number;\n sessionDepth: number;\n contentConsumption: number;\n activityLevel: number;\n };\n trend: 'increasing' | 'stable' | 'decreasing';\n period: string;\n}\n\n/**\n * Engagement analytics result.\n */\nexport interface EngagementAnalytics {\n averageEngagementScore: number;\n averageDwellTimeMs: number;\n averageSessionDepth: number;\n activeUserRatio: number;\n contentCompletionRate: number;\n topEngagedFeatures: Array<{\n featureId: string;\n averageDwellTime: number;\n userCount: number;\n }>;\n engagementTrend: TimeSeriesData;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Calculate engagement score from multiple factors.\n */\nexport function calculateEngagementScore(\n dwellTime: number,\n sessionDepth: number,\n activityRatio: number,\n contentCompletion: number\n): number {\n const weights = {\n dwellTime: 0.25,\n sessionDepth: 0.25,\n activityRatio: 0.30,\n contentCompletion: 0.20\n };\n\n return Math.round(\n (dwellTime * weights.dwellTime +\n sessionDepth * weights.sessionDepth +\n activityRatio * weights.activityRatio +\n contentCompletion * weights.contentCompletion) * 100\n ) / 100;\n}\n\n/**\n * Classify user engagement level.\n */\nexport function classifyEngagementLevel(score: number): 'low' | 'medium' | 'high' | 'power' {\n if (score < 25) return 'low';\n if (score < 50) return 'medium';\n if (score < 75) return 'high';\n return 'power';\n}\n\n/**\n * Calculate session depth score.\n */\nexport function calculateSessionDepthScore(\n pagesVisited: number,\n featuresUsed: number,\n actionsTaken: number\n): number {\n const pageScore = Math.min(pagesVisited / 10, 1) * 30;\n const featureScore = Math.min(featuresUsed / 5, 1) * 40;\n const actionScore = Math.min(actionsTaken / 20, 1) * 30;\n return Math.round(pageScore + featureScore + actionScore);\n}\n\n// ============================================================================\n// MAIN CLASS\n// ============================================================================\n\n/**\n * Engagement analytics tracking class.\n */\nexport class Engagement extends FlowGridTransport {\n /**\n * Track feature dwell time.\n */\n async trackDwellTime(config: DwellTimeConfig): Promise<EngagementResponse> {\n return await this.initFeature(\"engagement.dwell_time\", {\n type: \"engagement\",\n featureId: config.featureId,\n userId: config.userId,\n sessionId: config.sessionId,\n dwellTimeMs: config.dwellTimeMs,\n wasActive: config.wasActive ?? true,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track session depth.\n */\n async trackSessionDepth(config: SessionDepthConfig): Promise<EngagementResponse> {\n const depthScore = calculateSessionDepthScore(\n config.pagesVisited,\n config.featuresUsed,\n config.actionsTaken\n );\n\n return await this.initFeature(\"engagement.session_depth\", {\n type: \"engagement\",\n sessionId: config.sessionId,\n userId: config.userId,\n pagesVisited: config.pagesVisited,\n featuresUsed: config.featuresUsed,\n actionsTaken: config.actionsTaken,\n durationMs: config.durationMs,\n depthScore,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track content consumption.\n */\n async trackContentConsumption(config: ContentConsumptionConfig): Promise<EngagementResponse> {\n return await this.initFeature(\"engagement.content_consumption\", {\n type: \"engagement\",\n contentId: config.contentId,\n contentType: config.contentType,\n userId: config.userId,\n percentageConsumed: config.percentageConsumed,\n timeSpentMs: config.timeSpentMs,\n completed: config.completed ?? config.percentageConsumed >= 90,\n ...config.properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track user activity state.\n */\n async trackUserActivity(config: UserActivityConfig): Promise<EngagementResponse> {\n return await this.initFeature(\"engagement.user_activity\", {\n type: \"engagement\",\n userId: config.userId,\n activityType: config.activityType,\n durationMs: config.durationMs,\n sessionId: config.sessionId,\n timestamp: new Date().toISOString()\n });\n }\n\n // ---------------------------------------------------------------------------\n // DAU / WAU / MAU\n // ---------------------------------------------------------------------------\n\n /**\n * Auto-accumulate dwell time on a feature while the page is visible. Returns\n * a teardown that emits a single `trackDwellTime` event with the elapsed\n * active milliseconds.\n */\n autoTrackDwell(\n featureId: string,\n options: { userId?: string; sessionId?: string } = {},\n ): Teardown {\n if (!isBrowser()) return () => {};\n const doc = getDocument();\n if (!doc) return () => {};\n\n let activeMs = 0;\n let lastTick = doc.visibilityState === \"visible\" ? Date.now() : 0;\n\n const onVisibility = () => {\n const now = Date.now();\n if (doc.visibilityState === \"visible\") {\n lastTick = now;\n } else if (lastTick) {\n activeMs += now - lastTick;\n lastTick = 0;\n }\n };\n doc.addEventListener(\"visibilitychange\", onVisibility);\n\n let torndown = false;\n return () => {\n if (torndown) return;\n torndown = true;\n doc.removeEventListener(\"visibilitychange\", onVisibility);\n if (lastTick) {\n activeMs += Date.now() - lastTick;\n lastTick = 0;\n }\n if (activeMs > 0) {\n void this.trackDwellTime({\n featureId,\n dwellTimeMs: activeMs,\n userId: options.userId,\n sessionId: options.sessionId,\n wasActive: true,\n });\n }\n };\n }\n\n /**\n * Auto-track session-level engagement signals in the browser:\n *\n * - **Session depth** — counts SPA navigations, click/keyboard actions, and\n * total session duration; emits a single `trackSessionDepth` on\n * `pagehide`.\n * - **User activity** — classifies the user as `active` (recent input),\n * `passive` (visible but idle) or `idle` (tab hidden), and emits\n * `trackUserActivity` on every state transition with the time spent in\n * the previous state.\n *\n * The session id is read from the same `sessionStorage` key written by\n * {@link Sessions.autoTrack} (`flowgrid:sessionId`) so the two modules\n * stay correlated. If no session id is present, a synthetic one is\n * generated for the page lifetime.\n *\n * Safe no-op outside the browser.\n *\n * @example\n * ```ts\n * const stop = fg.engagement.client.autoTrack({ userId: \"u_1\" });\n * // ...later\n * stop();\n * ```\n */\n autoTrack(options: {\n userId?: string;\n sessionId?: string;\n /** Idle threshold (ms) without input before a visible user is \"passive\". Default 30s. */\n idleAfterMs?: number;\n /** Activity polling interval (ms). Default 5s. */\n pollMs?: number;\n } = {}): Teardown {\n if (!isBrowser()) return () => {};\n const win = getWindow();\n const doc = getDocument();\n if (!win || !doc) return () => {};\n\n const idleAfterMs = options.idleAfterMs ?? 30_000;\n const pollMs = options.pollMs ?? 5_000;\n\n // Resolve session id: prefer the one written by Sessions.autoTrack so\n // depth / activity events line up with the canonical session.\n let sessionId = options.sessionId;\n if (!sessionId) {\n try { sessionId = win.sessionStorage.getItem(\"flowgrid:sessionId\") || undefined; } catch { /* private mode */ }\n }\n if (!sessionId) {\n sessionId = `eng_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n }\n\n const startedAt = Date.now();\n let pagesVisited = 1;\n const featuresUsed = new Set<string>();\n let actionsTaken = 0;\n let lastInputAt = Date.now();\n\n // Activity state\n type ActivityType = \"active\" | \"passive\" | \"idle\";\n let currentState: ActivityType =\n doc.visibilityState === \"visible\" ? \"active\" : \"idle\";\n let stateEnteredAt = Date.now();\n\n // --- SPA navigation count\n const origPush = win.history.pushState;\n const origReplace = win.history.replaceState;\n const onNav = () => { pagesVisited++; };\n win.history.pushState = function (...args: Parameters<typeof origPush>) {\n const r = origPush.apply(this, args);\n onNav();\n return r;\n };\n win.history.replaceState = function (...args: Parameters<typeof origReplace>) {\n const r = origReplace.apply(this, args);\n onNav();\n return r;\n };\n win.addEventListener(\"popstate\", onNav);\n\n // --- User input → action count + activity ping\n const onInput = (ev: Event) => {\n actionsTaken++;\n lastInputAt = Date.now();\n // Optionally collect feature ids from a `data-flowgrid-feature` attribute.\n const target = ev.target as Element | null;\n const featureAttr = target?.closest?.(\"[data-flowgrid-feature]\")\n ?.getAttribute(\"data-flowgrid-feature\");\n if (featureAttr) featuresUsed.add(featureAttr);\n };\n doc.addEventListener(\"click\", onInput, { capture: true });\n doc.addEventListener(\"keydown\", onInput, { capture: true });\n doc.addEventListener(\"scroll\", onInput, { capture: true, passive: true });\n\n const transition = (next: ActivityType) => {\n if (next === currentState) return;\n const now = Date.now();\n const durationMs = now - stateEnteredAt;\n const prev = currentState;\n currentState = next;\n stateEnteredAt = now;\n if (durationMs > 0 && options.userId) {\n void this.trackUserActivity({\n userId: options.userId,\n activityType: prev,\n durationMs,\n sessionId,\n });\n }\n };\n\n // --- Periodic activity classifier\n const tick = () => {\n const now = Date.now();\n let next: ActivityType;\n if (doc.visibilityState !== \"visible\") next = \"idle\";\n else if (now - lastInputAt < idleAfterMs) next = \"active\";\n else next = \"passive\";\n transition(next);\n };\n const ticker = win.setInterval(tick, pollMs);\n\n const onVisibility = () => tick();\n doc.addEventListener(\"visibilitychange\", onVisibility);\n\n // --- Emit final session depth on pagehide\n let depthSent = false;\n const sendDepth = () => {\n if (depthSent) return;\n depthSent = true;\n transition(doc.visibilityState === \"visible\" ? currentState : \"idle\");\n const durationMs = Date.now() - startedAt;\n if (durationMs <= 0) return;\n void this.trackSessionDepth({\n sessionId: sessionId!,\n userId: options.userId,\n pagesVisited,\n featuresUsed: featuresUsed.size,\n actionsTaken,\n durationMs,\n });\n };\n win.addEventListener(\"pagehide\", sendDepth);\n\n return combineTeardowns(\n () => win.clearInterval(ticker),\n () => doc.removeEventListener(\"visibilitychange\", onVisibility),\n () => doc.removeEventListener(\"click\", onInput, true),\n () => doc.removeEventListener(\"keydown\", onInput, true),\n () => doc.removeEventListener(\"scroll\", onInput, true),\n () => win.removeEventListener(\"popstate\", onNav),\n () => win.removeEventListener(\"pagehide\", sendDepth),\n () => { win.history.pushState = origPush; win.history.replaceState = origReplace; },\n () => sendDepth(),\n );\n }\n}\n","/**\n * @fileoverview Enterprise - Advanced Cohorts & Segmentation\n * @module features/enterprise/cohorts\n * \n * @description\n * Generate behavioral and acquisition cohorts for granular analysis.\n * Segment users by behavior, acquisition source, and custom criteria.\n * \n * @useCases\n * - Create behavior-based cohorts\n * - Segment by acquisition source\n * - Track paid vs free user cohorts\n * - Dynamic segmentation rules\n * - Cohort comparison analysis\n * \n * @metrics\n * - Cohort size\n * - Cohort retention\n * - Cohort conversion\n * - Segment growth rate\n * - Cross-segment behavior\n * \n * @chartData\n * - Bar chart: Cohort sizes\n * - Line chart: Cohort trends\n * - Heatmap: Cohort retention matrix\n * - Comparison: Cohort A vs B\n * \n * @example\n * ```typescript\n * const cohorts = new Cohorts(webId, endpoint, apiKey);\n * \n * // Create a behavioral cohort\n * await cohorts.createCohort({\n * name: 'Power Users',\n * type: 'behavioral',\n * rules: [{ attribute: 'sessions_per_week', operator: 'gte', value: 5 }]\n * });\n * ```\n */\n\nimport { FlowGridTransport } from \"../../client/transport\";\nimport { DateRangeFilter } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Cohort rule operators.\n */\nexport type CohortOperator = \n | 'equals' | 'not_equals'\n | 'contains' | 'not_contains'\n | 'gt' | 'gte' | 'lt' | 'lte'\n | 'in' | 'not_in'\n | 'between' | 'exists' | 'not_exists';\n\n/**\n * Cohort rule definition.\n */\nexport interface CohortRule {\n /** Attribute to evaluate */\n attribute: string;\n /** Comparison operator */\n operator: CohortOperator;\n /** Value to compare against */\n value: unknown;\n /** Logical operator for combining rules */\n logicalOperator?: 'and' | 'or';\n}\n\n/**\n * Cohort type classification.\n */\nexport type CohortType = \n | 'behavioral' // Based on user actions\n | 'acquisition' // Based on how users were acquired\n | 'demographic' // Based on user traits\n | 'lifecycle' // Based on user lifecycle stage\n | 'custom'; // Custom rules\n\n/**\n * Cohort definition configuration.\n */\nexport interface CohortDefinition {\n /** Unique cohort identifier */\n cohortId?: string;\n /** Cohort name */\n name: string;\n /** Cohort description */\n description?: string;\n /** Cohort type */\n type: CohortType;\n /** Rules for cohort membership */\n rules: CohortRule[];\n /** Whether cohort membership is dynamic */\n dynamic?: boolean;\n /** Time window for evaluation (for behavioral cohorts) */\n timeWindow?: {\n value: number;\n unit: 'hours' | 'days' | 'weeks' | 'months';\n };\n}\n\n/**\n * Segment definition configuration.\n */\nexport interface SegmentDefinition {\n /** Segment identifier */\n segmentId?: string;\n /** Segment name */\n name: string;\n /** Segment description */\n description?: string;\n /** Segmentation attribute */\n attribute: string;\n /** Segment values/buckets */\n buckets: Array<{\n name: string;\n rules: CohortRule[];\n }>;\n}\n\n/**\n * User cohort assignment.\n */\nexport interface CohortAssignment {\n /** User ID */\n userId: string;\n /** Cohort ID */\n cohortId: string;\n /** Assignment timestamp */\n assignedAt: string;\n /** Whether user currently matches cohort rules */\n isActive: boolean;\n}\n\n/**\n * Cohort comparison configuration.\n */\nexport interface CohortComparisonConfig {\n /** First cohort ID */\n cohortA: string;\n /** Second cohort ID */\n cohortB: string;\n /** Metrics to compare */\n metrics: string[];\n /** Date range for comparison */\n filter?: DateRangeFilter;\n}\n\n/**\n * Cohort analytics filter.\n */\nexport interface CohortAnalyticsFilter extends DateRangeFilter {\n /** Filter by cohort type */\n type?: CohortType;\n /** Minimum cohort size */\n minSize?: number;\n}\n\n/**\n * Cohort response from API.\n */\nexport interface CohortResponse {\n cohortId: string;\n name: string;\n type: CohortType;\n size: number;\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Cohort member.\n */\nexport interface CohortMember {\n userId: string;\n joinedAt: string;\n traits: Record<string, unknown>;\n isActive: boolean;\n}\n\n/**\n * Cohort analytics result.\n */\nexport interface CohortAnalytics {\n cohortId: string;\n name: string;\n currentSize: number;\n growthRate: number;\n retention: {\n day1: number;\n day7: number;\n day30: number;\n };\n conversion: number;\n avgEngagementScore: number;\n}\n\n/**\n * Cohort comparison result.\n */\nexport interface CohortComparison {\n cohortA: CohortAnalytics;\n cohortB: CohortAnalytics;\n differences: Record<string, {\n cohortAValue: number;\n cohortBValue: number;\n percentDiff: number;\n significant: boolean;\n }>;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Evaluate if a user matches cohort rules.\n */\nexport function evaluateCohortRules(\n userAttributes: Record<string, unknown>,\n rules: CohortRule[]\n): boolean {\n let result = true;\n let currentOperator: 'and' | 'or' = 'and';\n\n for (const rule of rules) {\n const attributeValue = userAttributes[rule.attribute];\n const ruleResult = evaluateRule(attributeValue, rule.operator, rule.value);\n\n if (currentOperator === 'and') {\n result = result && ruleResult;\n } else {\n result = result || ruleResult;\n }\n\n currentOperator = rule.logicalOperator ?? 'and';\n }\n\n return result;\n}\n\n/**\n * Evaluate a single rule.\n */\nfunction evaluateRule(\n attributeValue: unknown,\n operator: CohortOperator,\n ruleValue: unknown\n): boolean {\n switch (operator) {\n case 'equals':\n return attributeValue === ruleValue;\n case 'not_equals':\n return attributeValue !== ruleValue;\n case 'contains':\n return String(attributeValue).includes(String(ruleValue));\n case 'not_contains':\n return !String(attributeValue).includes(String(ruleValue));\n case 'gt':\n return Number(attributeValue) > Number(ruleValue);\n case 'gte':\n return Number(attributeValue) >= Number(ruleValue);\n case 'lt':\n return Number(attributeValue) < Number(ruleValue);\n case 'lte':\n return Number(attributeValue) <= Number(ruleValue);\n case 'in':\n return Array.isArray(ruleValue) && ruleValue.includes(attributeValue);\n case 'not_in':\n return Array.isArray(ruleValue) && !ruleValue.includes(attributeValue);\n case 'exists':\n return attributeValue !== undefined && attributeValue !== null;\n case 'not_exists':\n return attributeValue === undefined || attributeValue === null;\n case 'between':\n if (Array.isArray(ruleValue) && ruleValue.length === 2) {\n const num = Number(attributeValue);\n return num >= Number(ruleValue[0]) && num <= Number(ruleValue[1]);\n }\n return false;\n default:\n return false;\n }\n}\n\n/**\n * Generate cohort ID from name.\n */\nexport function generateCohortId(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_|_$/g, '');\n}\n\n// ============================================================================\n// MAIN CLASS\n// ============================================================================\n\n/**\n * Advanced cohorts and segmentation class.\n */\nexport class Cohorts extends FlowGridTransport {\n /**\n * Create a new cohort.\n */\n async createCohort(definition: CohortDefinition): Promise<CohortResponse> {\n const cohortId = definition.cohortId ?? generateCohortId(definition.name);\n\n return await this.initFeature(\"cohorts.create\", {\n type: \"cohorts\",\n cohortId,\n name: definition.name,\n description: definition.description,\n cohortType: definition.type,\n rules: definition.rules,\n dynamic: definition.dynamic ?? true,\n timeWindow: definition.timeWindow,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Update an existing cohort.\n */\n async updateCohort(cohortId: string, updates: Partial<CohortDefinition>): Promise<CohortResponse> {\n const { type: cohortType, ...rest } = updates;\n return await this.initFeature(\"cohorts.update\", {\n type: \"cohorts\",\n cohortId,\n cohortType,\n ...rest,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Delete a cohort.\n */\n async deleteCohort(cohortId: string): Promise<{ deleted: boolean }> {\n return await this.initFeature(\"cohorts.delete\", {\n type: \"cohorts\",\n cohortId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * List all cohorts.\n */\n async listCohorts(filter?: CohortAnalyticsFilter): Promise<CohortResponse[]> {\n return await this.initFeature(\"cohorts.list\", {\n type: \"cohorts\",\n filter,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Check if user belongs to cohort.\n */\n async isUserInCohort(userId: string, cohortId: string): Promise<{ isMember: boolean }> {\n return await this.initFeature(\"cohorts.check_membership\", {\n type: \"cohorts\",\n userId,\n cohortId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Create a segment.\n */\n async createSegment(definition: SegmentDefinition): Promise<{ segmentId: string }> {\n return await this.initFeature(\"cohorts.create_segment\", {\n type: \"cohorts\",\n ...definition,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Compare two cohorts.\n */\n async compareCohorts(config: CohortComparisonConfig): Promise<CohortComparison> {\n return await this.initFeature(\"cohorts.compare\", {\n type: \"cohorts\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n}\n","/**\n * @fileoverview Enterprise - Churn & Predictive Analytics\n * @module features/enterprise/churn\n * \n * @description\n * Predict and measure churn proactively using usage patterns,\n * engagement signals, and predictive scoring models.\n * \n * @useCases\n * - Detect usage decay patterns\n * - Identify at-risk users\n * - Predict churn probability\n * - Correlate NPS with churn\n * - Track churn prevention success\n * \n * @metrics\n * - Churn rate\n * - Churn risk score\n * - Days to churn prediction\n * - At-risk user count\n * - Prevention success rate\n * \n * @chartData\n * - Line chart: Churn rate over time\n * - Distribution: Risk score distribution\n * - Bar chart: Churn by segment\n * - Funnel: Churn prevention funnel\n * \n * @example\n * ```typescript\n * const churn = new ChurnAnalytics(webId, endpoint, apiKey);\n * \n * // Get user churn risk\n * const risk = await churn.getUserRiskScore('user_123');\n * \n * // Get at-risk users\n * const atRisk = await churn.getAtRiskUsers({ minScore: 70 });\n * ```\n */\n\nimport { FlowGridTransport } from \"../../client/transport\";\nimport { DateRangeFilter, TimeSeriesData, TimeGranularity } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Churn risk factors.\n */\nexport interface ChurnRiskFactors {\n /** Days since last activity */\n daysSinceLastActivity: number;\n /** Usage trend (negative = declining) */\n usageTrend: number;\n /** Session frequency change */\n sessionFrequencyChange: number;\n /** Feature usage breadth change */\n featureUsageChange: number;\n /** Support tickets opened */\n supportTickets: number;\n /** NPS score (if available) */\n npsScore?: number;\n /** Payment failures */\n paymentFailures: number;\n /** Contract/subscription end approaching */\n daysUntilRenewal?: number;\n}\n\n/**\n * Churn risk score result.\n */\nexport interface ChurnRiskScore {\n /** User ID */\n userId: string;\n /** Risk score (0-100, higher = more likely to churn) */\n score: number;\n /** Risk level classification */\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n /** Predicted days until churn */\n predictedDaysToChurn?: number;\n /** Top contributing factors */\n topFactors: Array<{\n factor: string;\n contribution: number;\n value: unknown;\n }>;\n /** Recommended actions */\n recommendations: string[];\n /** Last updated */\n updatedAt: string;\n}\n\n/**\n * Usage decay configuration.\n */\nexport interface UsageDecayConfig {\n /** User ID */\n userId: string;\n /** Metric to track decay */\n metric: 'sessions' | 'events' | 'features' | 'time_spent';\n /** Comparison periods */\n periods: {\n current: DateRangeFilter;\n previous: DateRangeFilter;\n };\n}\n\n/**\n * Usage decay result.\n */\nexport interface UsageDecay {\n userId: string;\n metric: string;\n currentValue: number;\n previousValue: number;\n changePercent: number;\n isDecaying: boolean;\n decayRate: number;\n}\n\n/**\n * NPS tracking configuration.\n */\nexport interface NPSConfig {\n /** User ID */\n userId: string;\n /** NPS score (0-10) */\n score: number;\n /** Feedback comment */\n feedback?: string;\n /** Survey context */\n context?: string;\n}\n\n/**\n * Churn event configuration.\n */\nexport interface ChurnEventConfig {\n /** User ID */\n userId: string;\n /** Churn type */\n churnType: 'voluntary' | 'involuntary' | 'downgrade';\n /** Churn reason */\n reason?: string;\n /** Subscription/account value lost */\n valueLost?: {\n amount: number;\n currency: string;\n };\n /** Win-back attempted */\n winbackAttempted?: boolean;\n}\n\n/**\n * Prevention action configuration.\n */\nexport interface PreventionActionConfig {\n /** User ID */\n userId: string;\n /** Action type */\n actionType: 'outreach' | 'discount' | 'feature_unlock' | 'support_call' | 'other';\n /** Action details */\n details?: Record<string, unknown>;\n /** Outcome */\n outcome?: 'success' | 'pending' | 'failed';\n}\n\n/**\n * At-risk users filter.\n */\nexport interface AtRiskUsersFilter extends DateRangeFilter {\n /** Minimum risk score */\n minScore?: number;\n /** Risk level filter */\n riskLevel?: 'low' | 'medium' | 'high' | 'critical';\n /** User segment */\n segment?: string;\n /** Limit results */\n limit?: number;\n}\n\n/**\n * Churn analytics result.\n */\nexport interface ChurnAnalyticsResult {\n /** Total churn rate */\n churnRate: number;\n /** Voluntary churn rate */\n voluntaryChurnRate: number;\n /** Involuntary churn rate */\n involuntaryChurnRate: number;\n /** At-risk user count */\n atRiskUserCount: number;\n /** Revenue at risk */\n revenueAtRisk: {\n amount: number;\n currency: string;\n };\n /** Prevention success rate */\n preventionSuccessRate: number;\n /** Average NPS of churned users */\n avgChurnedNPS: number;\n /** Top churn reasons */\n topReasons: Array<{ reason: string; count: number; percentage: number }>;\n /** Churn trend */\n trend: TimeSeriesData;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Calculate churn risk score from factors.\n */\nexport function calculateChurnRiskScore(factors: ChurnRiskFactors): number {\n const weights = {\n daysSinceLastActivity: 0.25,\n usageTrend: 0.20,\n sessionFrequencyChange: 0.15,\n featureUsageChange: 0.10,\n supportTickets: 0.10,\n npsScore: 0.10,\n paymentFailures: 0.05,\n daysUntilRenewal: 0.05\n };\n\n let score = 0;\n\n // Days since last activity (0-30 days mapped to 0-100)\n score += Math.min(factors.daysSinceLastActivity / 30, 1) * 100 * weights.daysSinceLastActivity;\n\n // Usage trend (negative trend increases risk)\n score += Math.max(0, -factors.usageTrend) * weights.usageTrend;\n\n // Session frequency change (negative increases risk)\n score += Math.max(0, -factors.sessionFrequencyChange) * weights.sessionFrequencyChange;\n\n // Feature usage change (negative increases risk)\n score += Math.max(0, -factors.featureUsageChange) * weights.featureUsageChange;\n\n // Support tickets (more tickets = higher risk)\n score += Math.min(factors.supportTickets * 10, 100) * weights.supportTickets;\n\n // NPS score (lower NPS = higher risk)\n if (factors.npsScore !== undefined) {\n score += (100 - factors.npsScore * 10) * weights.npsScore;\n }\n\n // Payment failures\n score += Math.min(factors.paymentFailures * 25, 100) * weights.paymentFailures;\n\n // Days until renewal (closer = higher urgency)\n if (factors.daysUntilRenewal !== undefined) {\n score += Math.max(0, 100 - factors.daysUntilRenewal) * weights.daysUntilRenewal;\n }\n\n return Math.round(Math.min(score, 100));\n}\n\n/**\n * Classify risk level from score.\n */\nexport function classifyRiskLevel(score: number): 'low' | 'medium' | 'high' | 'critical' {\n if (score < 25) return 'low';\n if (score < 50) return 'medium';\n if (score < 75) return 'high';\n return 'critical';\n}\n\n/**\n * Generate churn prevention recommendations.\n */\nexport function generateRecommendations(\n riskFactors: Array<{ factor: string; contribution: number }>\n): string[] {\n const recommendations: string[] = [];\n \n const factorActions: Record<string, string> = {\n daysSinceLastActivity: 'Send a re-engagement email or push notification',\n usageTrend: 'Schedule a product walkthrough or training session',\n sessionFrequencyChange: 'Offer incentives to increase usage frequency',\n featureUsageChange: 'Highlight underutilized features via in-app messaging',\n supportTickets: 'Escalate to customer success for personalized support',\n npsScore: 'Conduct a follow-up call to address concerns',\n paymentFailures: 'Reach out to resolve payment issues proactively',\n daysUntilRenewal: 'Start renewal conversation early with value recap'\n };\n\n for (const factor of riskFactors.slice(0, 3)) {\n if (factorActions[factor.factor]) {\n recommendations.push(factorActions[factor.factor]);\n }\n }\n\n return recommendations;\n}\n\n// ============================================================================\n// MAIN CLASS\n// ============================================================================\n\n/**\n * Churn and predictive analytics class.\n */\nexport class ChurnAnalytics extends FlowGridTransport {\n /**\n * Track usage decay.\n */\n async trackUsageDecay(config: UsageDecayConfig): Promise<UsageDecay> {\n return await this.initFeature(\"churn.usage_decay\", {\n type: \"churn\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track NPS score.\n */\n async trackNPS(config: NPSConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"churn.nps\", {\n type: \"churn\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track churn event.\n */\n async trackChurn(config: ChurnEventConfig): Promise<{ tracked: boolean; churnId: string }> {\n return await this.initFeature(\"churn.churn_event\", {\n type: \"churn\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track churn prevention action.\n */\n async trackPreventionAction(config: PreventionActionConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"churn.prevention_action\", {\n type: \"churn\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Update prevention action outcome.\n */\n async updatePreventionOutcome(\n userId: string,\n actionType: string,\n outcome: 'success' | 'failed'\n ): Promise<{ updated: boolean }> {\n return await this.initFeature(\"churn.update_prevention_outcome\", {\n type: \"churn\",\n userId,\n actionType,\n outcome,\n timestamp: new Date().toISOString()\n });\n }\n\n}\n","/**\n * @fileoverview Enterprise - Revenue & Monetization Analytics\n * @module features/enterprise/monetization\n * \n * @description\n * Track detailed revenue and monetization KPIs including ARPU,\n * cohort-based revenue, and pricing plan impact analysis.\n * \n * @useCases\n * - Calculate ARPU/ARPA per segment\n * - Track cohort-based revenue\n * - Analyze pricing plan impact\n * - Revenue forecasting\n * - Expansion revenue tracking\n * \n * @metrics\n * - ARPU (Average Revenue Per User)\n * - ARPA (Average Revenue Per Account)\n * - Revenue by cohort\n * - Revenue by plan\n * - Expansion revenue\n * - Net Revenue Retention\n * \n * @chartData\n * - Line chart: Revenue over time\n * - Bar chart: Revenue by segment\n * - Waterfall: Revenue movement\n * - Cohort: Revenue retention\n * \n * @example\n * ```typescript\n * const monetization = new Monetization(webId, endpoint, apiKey);\n * \n * // Get ARPU by segment\n * const arpu = await monetization.getARPU({ segment: 'enterprise' });\n * \n * // Track revenue event\n * await monetization.trackRevenue({\n * userId: 'user_123',\n * amount: 99.00,\n * currency: 'USD',\n * type: 'subscription'\n * });\n * ```\n */\n\nimport { FlowGridTransport } from \"../../client/transport\";\nimport { DateRangeFilter, TimeSeriesData, TimeGranularity, MoneyValue, CurrencyCode } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Revenue event types.\n */\nexport type RevenueType = \n | 'subscription'\n | 'one_time'\n | 'expansion'\n | 'renewal'\n | 'downgrade'\n | 'refund'\n | 'credit';\n\n/**\n * Revenue tracking configuration.\n */\nexport interface RevenueTrackConfig {\n /** User ID */\n userId: string;\n /** Account/company ID (for B2B) */\n accountId?: string;\n /** Revenue amount */\n amount: number;\n /** Currency code */\n currency: CurrencyCode;\n /** Revenue type */\n type: RevenueType;\n /** Associated plan/product */\n planId?: string;\n /** Transaction ID */\n transactionId?: string;\n /** Billing period */\n billingPeriod?: 'monthly' | 'quarterly' | 'annual';\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * ARPU calculation configuration.\n */\nexport interface ARPUConfig {\n /** Date range */\n filter?: DateRangeFilter;\n /** Segment by attribute */\n segment?: string;\n /** User type filter */\n userType?: 'all' | 'paid' | 'free';\n /** Calculation period */\n period?: 'daily' | 'monthly' | 'annual';\n}\n\n/**\n * ARPU result.\n */\nexport interface ARPUResult {\n /** ARPU value */\n arpu: MoneyValue;\n /** Number of users in calculation */\n userCount: number;\n /** Total revenue in period */\n totalRevenue: MoneyValue;\n /** Period of calculation */\n period: string;\n /** Comparison with previous period */\n change?: {\n absolute: MoneyValue;\n percentage: number;\n };\n}\n\n/**\n * Cohort revenue configuration.\n */\nexport interface CohortRevenueConfig {\n /** Cohort identifier or definition */\n cohortId?: string;\n /** Cohort start date */\n cohortDate?: string;\n /** Periods to track */\n periods: number;\n /** Granularity */\n granularity: 'week' | 'month' | 'quarter';\n}\n\n/**\n * Cohort revenue result.\n */\nexport interface CohortRevenueResult {\n cohortId: string;\n cohortDate: string;\n cohortSize: number;\n periods: Array<{\n period: number;\n revenue: MoneyValue;\n arpu: MoneyValue;\n retainedUsers: number;\n retentionRate: number;\n cumulativeRevenue: MoneyValue;\n }>;\n ltvProjection: MoneyValue;\n}\n\n/**\n * Plan analysis configuration.\n */\nexport interface PlanAnalysisConfig {\n /** Date range */\n filter?: DateRangeFilter;\n /** Specific plans to analyze */\n planIds?: string[];\n}\n\n/**\n * Plan analysis result.\n */\nexport interface PlanAnalysis {\n planId: string;\n planName: string;\n activeUsers: number;\n revenue: MoneyValue;\n arpu: MoneyValue;\n churnRate: number;\n upgrades: number;\n downgrades: number;\n growthRate: number;\n}\n\n/**\n * Revenue breakdown configuration.\n */\nexport interface RevenueBreakdownConfig {\n /** Date range */\n filter?: DateRangeFilter;\n /** Breakdown dimension */\n dimension: 'type' | 'plan' | 'segment' | 'country' | 'source';\n}\n\n/**\n * Revenue breakdown result.\n */\nexport interface RevenueBreakdown {\n dimension: string;\n breakdown: Array<{\n value: string;\n revenue: MoneyValue;\n percentage: number;\n userCount: number;\n }>;\n total: MoneyValue;\n}\n\n/**\n * Net revenue retention configuration.\n */\nexport interface NRRConfig {\n /** Date range */\n filter?: DateRangeFilter;\n /** Calculation period */\n period?: 'monthly' | 'quarterly' | 'annual';\n}\n\n/**\n * Net revenue retention result.\n */\nexport interface NRRResult {\n /** Net Revenue Retention rate */\n nrr: number;\n /** Gross Revenue Retention */\n grr: number;\n /** Starting MRR */\n startingMRR: MoneyValue;\n /** Expansion revenue */\n expansion: MoneyValue;\n /** Contraction revenue */\n contraction: MoneyValue;\n /** Churned revenue */\n churned: MoneyValue;\n /** Ending MRR */\n endingMRR: MoneyValue;\n /** Period */\n period: string;\n}\n\n/**\n * Revenue forecast configuration.\n */\nexport interface RevenueForecastConfig {\n /** Periods to forecast */\n periods: number;\n /** Granularity */\n granularity: 'month' | 'quarter';\n /** Include confidence intervals */\n includeConfidence?: boolean;\n}\n\n/**\n * Revenue forecast result.\n */\nexport interface RevenueForecast {\n forecasts: Array<{\n period: string;\n predicted: MoneyValue;\n confidence?: {\n low: MoneyValue;\n high: MoneyValue;\n };\n }>;\n model: string;\n accuracy: number;\n}\n\n/**\n * Monetization analytics result.\n */\nexport interface MonetizationAnalytics {\n totalRevenue: MoneyValue;\n mrr: MoneyValue;\n arr: MoneyValue;\n arpu: MoneyValue;\n nrr: number;\n grr: number;\n expansionRate: number;\n revenueGrowthRate: number;\n paidUserCount: number;\n conversionRate: number;\n revenueByType: RevenueBreakdown;\n trend: TimeSeriesData;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Calculate ARPU from total revenue and user count.\n */\nexport function calculateARPU(\n totalRevenue: number,\n userCount: number,\n currency: CurrencyCode\n): MoneyValue {\n const arpu = userCount > 0 ? totalRevenue / userCount : 0;\n return {\n amount: Math.round(arpu * 100) / 100,\n currency\n };\n}\n\n/**\n * Calculate Net Revenue Retention.\n */\nexport function calculateNRR(\n startingMRR: number,\n expansion: number,\n contraction: number,\n churned: number\n): number {\n if (startingMRR === 0) return 0;\n return Math.round(((startingMRR + expansion - contraction - churned) / startingMRR) * 10000) / 100;\n}\n\n/**\n * Calculate Gross Revenue Retention.\n */\nexport function calculateGRR(\n startingMRR: number,\n contraction: number,\n churned: number\n): number {\n if (startingMRR === 0) return 0;\n return Math.round(((startingMRR - contraction - churned) / startingMRR) * 10000) / 100;\n}\n\n/**\n * Convert monthly to annual revenue.\n */\nexport function monthlyToAnnual(mrr: MoneyValue): MoneyValue {\n return {\n amount: mrr.amount * 12,\n currency: mrr.currency\n };\n}\n\n/**\n * Calculate LTV from ARPU and churn rate.\n */\nexport function calculateLTV(arpu: number, monthlyChurnRate: number, currency: CurrencyCode): MoneyValue {\n if (monthlyChurnRate <= 0) {\n return { amount: arpu * 60, currency }; // Cap at 5 years\n }\n const ltv = arpu / monthlyChurnRate;\n return {\n amount: Math.round(ltv * 100) / 100,\n currency\n };\n}\n\n// ============================================================================\n// MAIN CLASS\n// ============================================================================\n\n/**\n * Revenue and monetization analytics class.\n */\nexport class Monetization extends FlowGridTransport {\n /**\n * Track revenue event.\n */\n async trackRevenue(config: RevenueTrackConfig): Promise<{ tracked: boolean; revenueId: string }> {\n const { type: revenueType, ...restConfig } = config;\n return await this.initFeature(\"monetization.revenue\", {\n type: \"monetization\",\n revenueType,\n ...restConfig,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track expansion revenue.\n */\n async trackExpansion(\n userId: string,\n fromPlan: string,\n toPlan: string,\n additionalRevenue: MoneyValue\n ): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"monetization.expansion\", {\n type: \"monetization\",\n userId,\n fromPlan,\n toPlan,\n additionalRevenue,\n revenueType: 'expansion',\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track contraction/downgrade.\n */\n async trackContraction(\n userId: string,\n fromPlan: string,\n toPlan: string,\n reducedRevenue: MoneyValue\n ): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"monetization.contraction\", {\n type: \"monetization\",\n userId,\n fromPlan,\n toPlan,\n reducedRevenue,\n revenueType: 'downgrade',\n timestamp: new Date().toISOString()\n });\n }\n\n}\n","/**\n * @fileoverview Enterprise - Multi-Path Funnels & Micro-Conversions\n * @module features/enterprise/multi-path-funnels\n * \n * @description\n * Track complex user journeys and micro-conversions with support\n * for non-linear funnel analysis and segment-based drop-off.\n * \n * @useCases\n * - Define multi-path funnels\n * - Track micro-conversions\n * - Analyze drop-off by segment\n * - Non-linear journey tracking\n * - Onboarding step analysis\n * \n * @metrics\n * - Path completion rates\n * - Micro-conversion rates\n * - Drop-off by segment\n * - Time between steps\n * - Alternative path analysis\n * \n * @chartData\n * - Sankey diagram: User flow paths\n * - Funnel chart: Multi-path visualization\n * - Heatmap: Drop-off by segment\n * - Timeline: Step progression\n * \n * @example\n * ```typescript\n * const funnels = new MultiPathFunnels(webId, endpoint, apiKey);\n * \n * // Define a multi-path funnel\n * await funnels.defineFunnel({\n * name: 'Onboarding',\n * paths: [\n * { steps: ['signup', 'profile', 'first_action'] },\n * { steps: ['signup', 'skip_profile', 'first_action'] }\n * ]\n * });\n * ```\n */\n\nimport { FlowGridTransport } from \"../../client/transport\";\nimport { DateRangeFilter } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Funnel path definition.\n */\nexport interface FunnelPath {\n /** Path identifier */\n pathId?: string;\n /** Path name */\n name?: string;\n /** Ordered list of step events */\n steps: string[];\n /** Whether steps must be in order */\n ordered?: boolean;\n /** Maximum time window between first and last step */\n timeWindowMs?: number;\n}\n\n/**\n * Multi-path funnel definition.\n */\nexport interface MultiPathFunnelDefinition {\n /** Funnel identifier */\n funnelId?: string;\n /** Funnel name */\n name: string;\n /** Funnel description */\n description?: string;\n /** Alternative paths to conversion */\n paths: FunnelPath[];\n /** Micro-conversion definitions */\n microConversions?: MicroConversionDefinition[];\n /** Goal event (final conversion) */\n goalEvent: string;\n}\n\n/**\n * Micro-conversion definition.\n */\nexport interface MicroConversionDefinition {\n /** Micro-conversion identifier */\n id: string;\n /** Display name */\n name: string;\n /** Event that triggers this micro-conversion */\n event: string;\n /** Weight/importance (0-1) */\n weight?: number;\n /** Prerequisite micro-conversions */\n prerequisites?: string[];\n}\n\n/**\n * Funnel step tracking configuration.\n */\nexport interface MultiPathStepConfig {\n /** Funnel ID */\n funnelId: string;\n /** Step/event name */\n step: string;\n /** User ID */\n userId: string;\n /** Session ID */\n sessionId?: string;\n /** Path ID (if known) */\n pathId?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Micro-conversion tracking configuration.\n */\nexport interface MicroConversionConfig {\n /** Micro-conversion ID */\n conversionId: string;\n /** User ID */\n userId: string;\n /** Session ID */\n sessionId?: string;\n /** Value associated with conversion */\n value?: number;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Funnel analysis configuration.\n */\nexport interface FunnelAnalysisConfig {\n /** Funnel ID */\n funnelId: string;\n /** Date range */\n filter?: DateRangeFilter;\n /** Segment by attribute */\n segmentBy?: string;\n /** Include path breakdown */\n includePaths?: boolean;\n /** Include micro-conversions */\n includeMicroConversions?: boolean;\n}\n\n/**\n * Path analysis result.\n */\nexport interface PathAnalysis {\n pathId: string;\n pathName: string;\n steps: string[];\n userCount: number;\n completionRate: number;\n avgTimeToComplete: number;\n stepAnalysis: Array<{\n step: string;\n entered: number;\n completed: number;\n dropOffRate: number;\n avgTimeSpent: number;\n }>;\n}\n\n/**\n * Micro-conversion analysis.\n */\nexport interface MicroConversionAnalysis {\n id: string;\n name: string;\n completions: number;\n completionRate: number;\n avgValue: number;\n correlation: number; // Correlation with goal conversion\n}\n\n/**\n * Multi-path funnel analysis result.\n */\nexport interface MultiPathFunnelAnalysis {\n funnelId: string;\n funnelName: string;\n totalUsers: number;\n goalCompletions: number;\n overallConversionRate: number;\n paths: PathAnalysis[];\n microConversions?: MicroConversionAnalysis[];\n topDropOffPoints: Array<{\n step: string;\n dropOffRate: number;\n userCount: number;\n }>;\n avgTimeToConversion: number;\n}\n\n/**\n * Segment drop-off analysis.\n */\nexport interface SegmentDropOffAnalysis {\n funnelId: string;\n segmentAttribute: string;\n segments: Array<{\n segment: string;\n conversionRate: number;\n dropOffByStep: Array<{\n step: string;\n dropOffRate: number;\n }>;\n }>;\n bestPerformingSegment: string;\n worstPerformingSegment: string;\n}\n\n/**\n * User journey configuration.\n */\nexport interface UserJourneyConfig {\n /** User ID */\n userId: string;\n /** Funnel ID */\n funnelId: string;\n /** Date range */\n filter?: DateRangeFilter;\n}\n\n/**\n * User journey result.\n */\nexport interface UserJourney {\n userId: string;\n funnelId: string;\n currentPath: string;\n stepsCompleted: Array<{\n step: string;\n timestamp: string;\n properties?: Record<string, unknown>;\n }>;\n microConversions: Array<{\n id: string;\n timestamp: string;\n }>;\n goalReached: boolean;\n goalReachedAt?: string;\n timeInFunnel: number;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Calculate funnel conversion rate.\n */\nexport function calculateConversionRate(entered: number, completed: number): number {\n if (entered === 0) return 0;\n return Math.round((completed / entered) * 10000) / 100;\n}\n\n/**\n * Calculate drop-off rate between steps.\n */\nexport function calculateDropOffRate(previousStep: number, currentStep: number): number {\n if (previousStep === 0) return 0;\n return Math.round(((previousStep - currentStep) / previousStep) * 10000) / 100;\n}\n\n/**\n * Find the best performing path.\n */\nexport function findBestPath(paths: PathAnalysis[]): PathAnalysis | null {\n if (paths.length === 0) return null;\n return paths.reduce((best, current) => \n current.completionRate > best.completionRate ? current : best\n );\n}\n\n/**\n * Calculate weighted micro-conversion score.\n */\nexport function calculateMicroConversionScore(\n completedConversions: MicroConversionAnalysis[],\n definitions: MicroConversionDefinition[]\n): number {\n let totalWeight = 0;\n let weightedScore = 0;\n\n for (const def of definitions) {\n const weight = def.weight ?? 1;\n totalWeight += weight;\n \n const completed = completedConversions.find(c => c.id === def.id);\n if (completed) {\n weightedScore += weight * completed.completionRate;\n }\n }\n\n return totalWeight > 0 ? Math.round((weightedScore / totalWeight) * 100) / 100 : 0;\n}\n\n/**\n * Generate path ID from steps.\n */\nexport function generatePathId(steps: string[]): string {\n return steps.join('_').toLowerCase().replace(/[^a-z0-9_]/g, '');\n}\n\n// ============================================================================\n// MAIN CLASS\n// ============================================================================\n\n/**\n * Multi-path funnels and micro-conversions class.\n */\nexport class MultiPathFunnels extends FlowGridTransport {\n /**\n * Define a multi-path funnel.\n */\n async defineFunnel(definition: MultiPathFunnelDefinition): Promise<{ funnelId: string }> {\n const funnelId = definition.funnelId ?? \n definition.name.toLowerCase().replace(/[^a-z0-9]+/g, '_');\n\n const pathsWithIds = definition.paths.map(path => ({\n ...path,\n pathId: path.pathId ?? generatePathId(path.steps)\n }));\n\n return await this.initFeature(\"multi_path_funnels.define\", {\n type: \"multi_path_funnels\",\n funnelId,\n name: definition.name,\n description: definition.description,\n paths: pathsWithIds,\n microConversions: definition.microConversions,\n goalEvent: definition.goalEvent,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Update funnel definition.\n */\n async updateFunnel(\n funnelId: string,\n updates: Partial<MultiPathFunnelDefinition>\n ): Promise<{ updated: boolean }> {\n return await this.initFeature(\"multi_path_funnels.update\", {\n type: \"multi_path_funnels\",\n funnelId,\n ...updates,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Delete funnel.\n */\n async deleteFunnel(funnelId: string): Promise<{ deleted: boolean }> {\n return await this.initFeature(\"multi_path_funnels.delete\", {\n type: \"multi_path_funnels\",\n funnelId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track funnel step.\n */\n async trackStep(config: MultiPathStepConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"multi_path_funnels.track_step\", {\n type: \"multi_path_funnels\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track micro-conversion.\n */\n async trackMicroConversion(config: MicroConversionConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"multi_path_funnels.track_micro_conversion\", {\n type: \"multi_path_funnels\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track goal completion.\n */\n async trackGoal(\n funnelId: string,\n userId: string,\n properties?: Record<string, unknown>\n ): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"multi_path_funnels.track_goal\", {\n type: \"multi_path_funnels\",\n funnelId,\n userId,\n ...properties,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Get funnel analysis.\n */\n async analyzeFunnel(config: FunnelAnalysisConfig): Promise<MultiPathFunnelAnalysis> {\n return await this.initFeature(\"multi_path_funnels.analyze\", {\n type: \"multi_path_funnels\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Get path comparison.\n */\n async comparePaths(\n funnelId: string,\n filter?: DateRangeFilter\n ): Promise<PathAnalysis[]> {\n return await this.initFeature(\"multi_path_funnels.compare_paths\", {\n type: \"multi_path_funnels\",\n funnelId,\n filter,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * List all funnels.\n */\n async listFunnels(): Promise<Array<{\n funnelId: string;\n name: string;\n pathCount: number;\n createdAt: string;\n }>> {\n return await this.initFeature(\"multi_path_funnels.list\", {\n type: \"multi_path_funnels\",\n timestamp: new Date().toISOString()\n });\n }\n}\n","/**\n * @fileoverview Enterprise - Customer Support & Experience Analytics\n * @module features/enterprise/support\n * \n * @description\n * Link support interactions to retention and conversion metrics.\n * Track ticket volume, response times, and satisfaction scores.\n * \n * @useCases\n * - Track support ticket volume\n * - Monitor response and resolution times\n * - Correlate CSAT/NPS with retention\n * - Track feature complaints\n * - Measure support impact on conversion\n * \n * @metrics\n * - Ticket volume\n * - Average response time\n * - Average resolution time\n * - CSAT score\n * - First contact resolution rate\n * \n * @chartData\n * - Line chart: Ticket volume over time\n * - Bar chart: Tickets by category\n * - Distribution: Resolution time\n * - Correlation: Support vs retention\n * \n * @example\n * ```typescript\n * const support = new SupportAnalytics(webId, endpoint, apiKey);\n * \n * // Track support ticket\n * await support.trackTicket({\n * ticketId: 'ticket_123',\n * userId: 'user_456',\n * category: 'billing',\n * priority: 'high'\n * });\n * ```\n */\n\nimport { FlowGridTransport } from \"../../client/transport\";\nimport { DateRangeFilter, TimeSeriesData, TimeGranularity } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Ticket priority levels.\n */\nexport type TicketPriority = 'low' | 'medium' | 'high' | 'urgent';\n\n/**\n * Ticket status.\n */\nexport type TicketStatus = 'open' | 'pending' | 'in_progress' | 'resolved' | 'closed';\n\n/**\n * Support channel.\n */\nexport type SupportChannel = 'email' | 'chat' | 'phone' | 'social' | 'self_service' | 'other';\n\n/**\n * Ticket creation configuration.\n */\nexport interface TicketConfig {\n /** Ticket ID */\n ticketId: string;\n /** User ID */\n userId: string;\n /** Account/company ID */\n accountId?: string;\n /** Ticket subject */\n subject: string;\n /** Ticket category */\n category: string;\n /** Sub-category */\n subCategory?: string;\n /** Priority level */\n priority: TicketPriority;\n /** Support channel */\n channel: SupportChannel;\n /** Related feature (if any) */\n featureId?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Ticket update configuration.\n */\nexport interface TicketUpdateConfig {\n /** Ticket ID */\n ticketId: string;\n /** New status */\n status: TicketStatus;\n /** Assigned agent ID */\n agentId?: string;\n /** Response time (ms) - first response */\n responseTimeMs?: number;\n /** Resolution time (ms) - time to resolve */\n resolutionTimeMs?: number;\n /** Number of interactions */\n interactionCount?: number;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * CSAT tracking configuration.\n */\nexport interface CSATConfig {\n /** Ticket ID */\n ticketId: string;\n /** User ID */\n userId: string;\n /** CSAT score (1-5) */\n score: number;\n /** Feedback comment */\n feedback?: string;\n /** Agent ID */\n agentId?: string;\n}\n\n/**\n * Feature complaint configuration.\n */\nexport interface FeatureComplaintConfig {\n /** User ID */\n userId: string;\n /** Feature ID */\n featureId: string;\n /** Complaint type */\n complaintType: 'bug' | 'usability' | 'missing_feature' | 'performance' | 'other';\n /** Description */\n description?: string;\n /** Severity */\n severity: 'minor' | 'moderate' | 'major' | 'critical';\n /** Associated ticket ID */\n ticketId?: string;\n}\n\n/**\n * Support analytics filter.\n */\nexport interface SupportAnalyticsFilter extends DateRangeFilter {\n /** Filter by category */\n category?: string;\n /** Filter by priority */\n priority?: TicketPriority;\n /** Filter by channel */\n channel?: SupportChannel;\n /** Filter by status */\n status?: TicketStatus;\n}\n\n/**\n * Ticket analytics result.\n */\nexport interface TicketAnalytics {\n /** Total tickets */\n totalTickets: number;\n /** Open tickets */\n openTickets: number;\n /** Resolved tickets */\n resolvedTickets: number;\n /** Average response time (ms) */\n avgResponseTimeMs: number;\n /** Average resolution time (ms) */\n avgResolutionTimeMs: number;\n /** First contact resolution rate */\n fcrRate: number;\n /** Average CSAT score */\n avgCSAT: number;\n /** Tickets by category */\n byCategory: Array<{ category: string; count: number; percentage: number }>;\n /** Tickets by priority */\n byPriority: Array<{ priority: TicketPriority; count: number; percentage: number }>;\n /** Tickets by channel */\n byChannel: Array<{ channel: SupportChannel; count: number; percentage: number }>;\n}\n\n/**\n * Support impact analysis.\n */\nexport interface SupportImpactAnalysis {\n /** Correlation with retention */\n retentionCorrelation: number;\n /** Correlation with churn */\n churnCorrelation: number;\n /** Users with support tickets */\n usersWithTickets: number;\n /** Churn rate for users with tickets */\n ticketUserChurnRate: number;\n /** Churn rate for users without tickets */\n noTicketUserChurnRate: number;\n /** Impact of quick resolution on retention */\n quickResolutionRetentionLift: number;\n}\n\n/**\n * Feature complaint summary.\n */\nexport interface FeatureComplaintSummary {\n /** Feature ID */\n featureId: string;\n /** Feature name */\n featureName?: string;\n /** Total complaints */\n totalComplaints: number;\n /** By complaint type */\n byType: Array<{ type: string; count: number }>;\n /** By severity */\n bySeverity: Array<{ severity: string; count: number }>;\n /** Trend direction */\n trend: 'increasing' | 'stable' | 'decreasing';\n}\n\n/**\n * Agent performance.\n */\nexport interface AgentPerformance {\n agentId: string;\n agentName?: string;\n ticketsHandled: number;\n avgResponseTimeMs: number;\n avgResolutionTimeMs: number;\n avgCSAT: number;\n fcrRate: number;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Calculate first contact resolution rate.\n */\nexport function calculateFCRRate(\n resolvedFirstContact: number,\n totalResolved: number\n): number {\n if (totalResolved === 0) return 0;\n return Math.round((resolvedFirstContact / totalResolved) * 10000) / 100;\n}\n\n/**\n * Calculate average response time.\n */\nexport function calculateAvgResponseTime(\n responseTimes: number[]\n): number {\n if (responseTimes.length === 0) return 0;\n const sum = responseTimes.reduce((a, b) => a + b, 0);\n return Math.round(sum / responseTimes.length);\n}\n\n/**\n * Classify CSAT score.\n */\nexport function classifyCSAT(score: number): 'poor' | 'fair' | 'good' | 'excellent' {\n if (score < 2) return 'poor';\n if (score < 3) return 'fair';\n if (score < 4) return 'good';\n return 'excellent';\n}\n\n/**\n * Format duration in human-readable format.\n */\nexport function formatDuration(ms: number): string {\n if (ms < 60000) return `${Math.round(ms / 1000)}s`;\n if (ms < 3600000) return `${Math.round(ms / 60000)}m`;\n if (ms < 86400000) return `${Math.round(ms / 3600000)}h`;\n return `${Math.round(ms / 86400000)}d`;\n}\n\n// ============================================================================\n// MAIN CLASS\n// ============================================================================\n\n/**\n * Customer support and experience analytics class.\n */\nexport class SupportAnalytics extends FlowGridTransport {\n /**\n * Track new support ticket.\n */\n async trackTicket(config: TicketConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"support.ticket_created\", {\n type: \"support\",\n ...config,\n status: 'open' as TicketStatus,\n createdAt: new Date().toISOString(),\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Update ticket status.\n */\n async updateTicket(config: TicketUpdateConfig): Promise<{ updated: boolean }> {\n return await this.initFeature(\"support.ticket_updated\", {\n type: \"support\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track ticket response.\n */\n async trackResponse(\n ticketId: string,\n agentId: string,\n responseTimeMs: number\n ): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"support.ticket_response\", {\n type: \"support\",\n ticketId,\n agentId,\n responseTimeMs,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track ticket resolution.\n */\n async trackResolution(\n ticketId: string,\n resolutionTimeMs: number,\n interactionCount: number\n ): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"support.ticket_resolved\", {\n type: \"support\",\n ticketId,\n resolutionTimeMs,\n interactionCount,\n firstContactResolution: interactionCount === 1,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track CSAT score.\n */\n async trackCSAT(config: CSATConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"support.csat\", {\n type: \"support\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track feature complaint.\n */\n async trackFeatureComplaint(config: FeatureComplaintConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"support.feature_complaint\", {\n type: \"support\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n}\n","/**\n * @fileoverview Enterprise - Marketing & Acquisition Analytics\n * @module features/enterprise/acquisition\n * \n * @description\n * Deep attribution and acquisition insights including CAC breakdown,\n * trial-to-paid funnel tracking, and campaign performance by cohort.\n * \n * @useCases\n * - Track customer acquisition cost by channel\n * - Monitor trial → paid → upgrade funnel\n * - Analyze campaign performance\n * - Multi-touch attribution\n * - Marketing ROI calculation\n * \n * @metrics\n * - Customer Acquisition Cost (CAC)\n * - Trial conversion rate\n * - Paid conversion rate\n * - Campaign ROI\n * - Channel effectiveness\n * \n * @chartData\n * - Bar chart: CAC by channel\n * - Funnel: Trial to paid conversion\n * - Line chart: Campaign performance\n * - Pie chart: Acquisition source mix\n * \n * @example\n * ```typescript\n * const acquisition = new AcquisitionAnalytics(webId, endpoint, apiKey);\n * \n * // Track acquisition\n * await acquisition.trackAcquisition({\n * userId: 'user_123',\n * source: 'google_ads',\n * campaign: 'summer_2026'\n * });\n * ```\n */\n\nimport { FlowGridTransport } from \"../../client/transport\";\nimport { DateRangeFilter, TimeSeriesData, MoneyValue, CurrencyCode } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Acquisition source types.\n */\nexport type AcquisitionSource = \n | 'organic'\n | 'paid_search'\n | 'paid_social'\n | 'organic_social'\n | 'email'\n | 'referral'\n | 'affiliate'\n | 'direct'\n | 'content'\n | 'other';\n\n/**\n * User lifecycle stage.\n */\nexport type LifecycleStage = \n | 'visitor'\n | 'lead'\n | 'trial'\n | 'paid'\n | 'churned'\n | 'resurrected';\n\n/**\n * Acquisition tracking configuration.\n */\nexport interface AcquisitionConfig {\n /** User ID */\n userId: string;\n /** Acquisition source */\n source: AcquisitionSource;\n /** Campaign name/ID */\n campaign?: string;\n /** Medium */\n medium?: string;\n /** Channel */\n channel?: string;\n /** Referring URL */\n referrer?: string;\n /** Landing page */\n landingPage?: string;\n /** UTM parameters */\n utmParams?: {\n source?: string;\n medium?: string;\n campaign?: string;\n term?: string;\n content?: string;\n };\n /** Acquisition cost (if known) */\n cost?: MoneyValue;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Campaign definition.\n */\nexport interface CampaignDefinition {\n /** Campaign ID */\n campaignId: string;\n /** Campaign name */\n name: string;\n /** Description */\n description?: string;\n /** Start date */\n startDate: string;\n /** End date */\n endDate?: string;\n /** Budget */\n budget: MoneyValue;\n /** Target acquisition count */\n targetAcquisitions?: number;\n /** Channel */\n channel: AcquisitionSource;\n /** Tags */\n tags?: string[];\n}\n\n/**\n * Campaign spend tracking.\n */\nexport interface CampaignSpendConfig {\n /** Campaign ID */\n campaignId: string;\n /** Spend amount */\n amount: MoneyValue;\n /** Spend date */\n date: string;\n /** Impressions */\n impressions?: number;\n /** Clicks */\n clicks?: number;\n}\n\n/**\n * Lifecycle transition configuration.\n */\nexport interface LifecycleTransitionConfig {\n /** User ID */\n userId: string;\n /** Previous stage */\n fromStage: LifecycleStage;\n /** New stage */\n toStage: LifecycleStage;\n /** Revenue associated (if applicable) */\n revenue?: MoneyValue;\n}\n\n/**\n * CAC configuration.\n */\nexport interface CACConfig {\n /** Date range */\n filter?: DateRangeFilter;\n /** Breakdown dimension */\n breakdown?: 'channel' | 'campaign' | 'source';\n /** Include only paid channels */\n paidOnly?: boolean;\n}\n\n/**\n * CAC result.\n */\nexport interface CACResult {\n /** Overall CAC */\n cac: MoneyValue;\n /** Total spend */\n totalSpend: MoneyValue;\n /** Total acquisitions */\n totalAcquisitions: number;\n /** Breakdown (if requested) */\n breakdown?: Array<{\n dimension: string;\n cac: MoneyValue;\n spend: MoneyValue;\n acquisitions: number;\n }>;\n}\n\n/**\n * Trial funnel configuration.\n */\nexport interface TrialFunnelConfig {\n /** Date range */\n filter?: DateRangeFilter;\n /** Segment by attribute */\n segmentBy?: string;\n}\n\n/**\n * Trial funnel result.\n */\nexport interface TrialFunnelResult {\n /** Visitors */\n visitors: number;\n /** Signups */\n signups: number;\n /** Trial starts */\n trialStarts: number;\n /** Trial to paid conversions */\n trialToPaid: number;\n /** Paid upgrades */\n upgrades: number;\n /** Conversion rates */\n rates: {\n visitorToSignup: number;\n signupToTrial: number;\n trialToPaid: number;\n paidToUpgrade: number;\n overallConversion: number;\n };\n /** Average time in trial */\n avgTrialDays: number;\n}\n\n/**\n * Campaign performance result.\n */\nexport interface CampaignPerformance {\n campaignId: string;\n name: string;\n spend: MoneyValue;\n impressions: number;\n clicks: number;\n acquisitions: number;\n revenue: MoneyValue;\n metrics: {\n ctr: number; // Click-through rate\n cpc: MoneyValue; // Cost per click\n cpa: MoneyValue; // Cost per acquisition\n roas: number; // Return on ad spend\n roi: number; // Return on investment\n };\n trend: 'improving' | 'stable' | 'declining';\n}\n\n/**\n * Attribution model types.\n */\nexport type AttributionModel = \n | 'first_touch'\n | 'last_touch'\n | 'linear'\n | 'time_decay'\n | 'position_based';\n\n/**\n * Attribution analysis configuration.\n */\nexport interface AttributionAnalysisConfig {\n /** Attribution model */\n model: AttributionModel;\n /** Date range */\n filter?: DateRangeFilter;\n /** Conversion event */\n conversionEvent?: string;\n}\n\n/**\n * Attribution result.\n */\nexport interface AttributionResult {\n model: AttributionModel;\n channels: Array<{\n channel: string;\n conversions: number;\n revenue: MoneyValue;\n contribution: number;\n }>;\n touchpointAnalysis: {\n avgTouchpoints: number;\n avgDaysToConvert: number;\n topPaths: Array<{\n path: string[];\n count: number;\n conversionRate: number;\n }>;\n };\n}\n\n/**\n * Acquisition analytics result.\n */\nexport interface AcquisitionAnalyticType {\n totalAcquisitions: number;\n cac: MoneyValue;\n ltv: MoneyValue;\n ltvCacRatio: number;\n topChannels: Array<{\n channel: AcquisitionSource;\n acquisitions: number;\n percentage: number;\n cac: MoneyValue;\n }>;\n trialConversionRate: number;\n paidConversionRate: number;\n trend: TimeSeriesData;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Calculate CAC.\n */\nexport function calculateCAC(\n totalSpend: number,\n totalAcquisitions: number,\n currency: CurrencyCode\n): MoneyValue {\n if (totalAcquisitions === 0) {\n return { amount: 0, currency };\n }\n return {\n amount: Math.round((totalSpend / totalAcquisitions) * 100) / 100,\n currency\n };\n}\n\n/**\n * Calculate ROAS (Return on Ad Spend).\n */\nexport function calculateROAS(revenue: number, spend: number): number {\n if (spend === 0) return 0;\n return Math.round((revenue / spend) * 100) / 100;\n}\n\n/**\n * Calculate LTV:CAC ratio.\n */\nexport function calculateLTVCACRatio(ltv: number, cac: number): number {\n if (cac === 0) return 0;\n return Math.round((ltv / cac) * 100) / 100;\n}\n\n/**\n * Parse UTM parameters from URL.\n */\nexport function parseUTMParams(url: string): Record<string, string> {\n const params: Record<string, string> = {};\n try {\n const urlObj = new URL(url);\n const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content'];\n for (const key of utmKeys) {\n const value = urlObj.searchParams.get(key);\n if (value) {\n params[key.replace('utm_', '')] = value;\n }\n }\n } catch {\n // Invalid URL, return empty object\n }\n return params;\n}\n\n/**\n * Classify acquisition source from UTM parameters.\n */\nexport function classifySource(utmSource?: string, utmMedium?: string): AcquisitionSource {\n if (!utmSource && !utmMedium) return 'direct';\n \n const source = utmSource?.toLowerCase() ?? '';\n const medium = utmMedium?.toLowerCase() ?? '';\n\n if (medium.includes('cpc') || medium.includes('paid')) {\n if (source.includes('facebook') || source.includes('instagram') || source.includes('linkedin')) {\n return 'paid_social';\n }\n return 'paid_search';\n }\n\n if (source.includes('facebook') || source.includes('twitter') || source.includes('linkedin')) {\n return 'organic_social';\n }\n\n if (medium === 'email') return 'email';\n if (medium === 'referral') return 'referral';\n if (medium === 'affiliate') return 'affiliate';\n\n return 'organic';\n}\n\n// ============================================================================\n// MAIN CLASS\n// ============================================================================\n\n/**\n * Marketing and acquisition analytics class.\n */\nexport class AcquisitionAnalytics extends FlowGridTransport {\n /**\n * Track user acquisition.\n */\n async trackAcquisition(config: AcquisitionConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"acquisition.acquired\", {\n type: \"acquisition\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track lifecycle transition.\n */\n async trackLifecycleTransition(\n config: LifecycleTransitionConfig\n ): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"acquisition.lifecycle_transition\", {\n type: \"acquisition\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Create campaign.\n */\n async createCampaign(definition: CampaignDefinition): Promise<{ created: boolean }> {\n return await this.initFeature(\"acquisition.create_campaign\", {\n type: \"acquisition\",\n ...definition,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track campaign spend.\n */\n async trackCampaignSpend(config: CampaignSpendConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"acquisition.campaign_spend\", {\n type: \"acquisition\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n}\n","/**\n * @fileoverview Enterprise - Behavioral Analytics & Path Analysis\n * @module features/enterprise/paths\n * \n * @description\n * Track full user navigation and feature usage sequences.\n * Identify common paths, dead-ends, and UX friction points.\n * \n * @useCases\n * - Sequence analysis of feature usage\n * - Dead-end screen detection\n * - Most common path identification\n * - User journey mapping\n * - UX friction detection\n * \n * @metrics\n * - Path frequency\n * - Path completion rate\n * - Dead-end rate\n * - Average path length\n * - Time per path\n * \n * @chartData\n * - Sankey diagram: User flow\n * - Tree map: Path distribution\n * - Heatmap: Screen transitions\n * - Timeline: User journeys\n * \n * @example\n * ```typescript\n * const paths = new PathAnalytics(webId, endpoint, apiKey);\n * \n * // Track screen/page transition\n * await paths.trackTransition({\n * userId: 'user_123',\n * fromScreen: 'dashboard',\n * toScreen: 'settings'\n * });\n * ```\n */\n\nimport { FlowGridTransport } from \"../../client/transport\";\nimport { DateRangeFilter } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Screen/page transition configuration.\n */\nexport interface TransitionConfig {\n /** User ID */\n userId: string;\n /** Session ID */\n sessionId?: string;\n /** Source screen/page */\n fromScreen: string;\n /** Destination screen/page */\n toScreen: string;\n /** Time spent on source screen (ms) */\n timeSpentMs?: number;\n /** Trigger action */\n trigger?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Feature sequence configuration.\n */\nexport interface FeatureSequenceConfig {\n /** User ID */\n userId: string;\n /** Session ID */\n sessionId?: string;\n /** Feature/action name */\n feature: string;\n /** Sequence order in session */\n order: number;\n /** Time spent (ms) */\n timeSpentMs?: number;\n /** Whether action was successful */\n successful?: boolean;\n}\n\n/**\n * Path definition.\n */\nexport interface PathDefinition {\n /** Path identifier */\n pathId?: string;\n /** Path name */\n name: string;\n /** Description */\n description?: string;\n /** Ordered list of screens/steps */\n screens: string[];\n /** Goal screen (optional) */\n goal?: string;\n /** Tags */\n tags?: string[];\n}\n\n/**\n * Path analysis configuration.\n */\nexport interface PathAnalysisConfig {\n /** Date range */\n filter?: DateRangeFilter;\n /** Starting screen */\n startScreen?: string;\n /** Ending screen */\n endScreen?: string;\n /** Minimum path occurrences */\n minOccurrences?: number;\n /** Maximum path length */\n maxLength?: number;\n}\n\n/**\n * Path analytics result.\n */\nexport interface PathResult {\n /** Path screens */\n path: string[];\n /** Number of users who took this path */\n userCount: number;\n /** Percentage of total users */\n percentage: number;\n /** Average time to complete path (ms) */\n avgTimeMs: number;\n /** Completion rate (if goal defined) */\n completionRate?: number;\n /** Drop-off at each step */\n dropOffByStep?: Array<{\n step: string;\n dropOffRate: number;\n }>;\n}\n\n/**\n * Dead-end screen.\n */\nexport interface DeadEndScreen {\n /** Screen name */\n screen: string;\n /** Exit rate (users who leave from this screen) */\n exitRate: number;\n /** User count */\n userCount: number;\n /** Average time before exit (ms) */\n avgTimeBeforeExitMs: number;\n /** Previous screens (where users came from) */\n previousScreens: Array<{ screen: string; count: number }>;\n /** Is this a dead-end (high exit, not intended end point) */\n isDeadEnd: boolean;\n}\n\n/**\n * Screen transition matrix.\n */\nexport interface TransitionMatrix {\n /** All screens */\n screens: string[];\n /** Transition probabilities (screens.length x screens.length) */\n matrix: number[][];\n /** Total transitions */\n totalTransitions: number;\n}\n\n/**\n * User journey configuration.\n */\nexport interface UserJourneyConfig {\n /** User ID */\n userId: string;\n /** Session ID (optional, get all sessions if not provided) */\n sessionId?: string;\n /** Date range */\n filter?: DateRangeFilter;\n}\n\n/**\n * User journey result.\n */\nexport interface UserJourney {\n userId: string;\n sessions: Array<{\n sessionId: string;\n startTime: string;\n endTime: string;\n path: Array<{\n screen: string;\n timestamp: string;\n timeSpentMs: number;\n actions?: string[];\n }>;\n totalDurationMs: number;\n screenCount: number;\n }>;\n}\n\n/**\n * Friction point.\n */\nexport interface FrictionPoint {\n /** Screen or step */\n location: string;\n /** Friction type */\n type: 'high_exit' | 'long_dwell' | 'rage_clicks' | 'back_navigation' | 'error';\n /** Severity score (0-100) */\n severity: number;\n /** Affected users */\n affectedUsers: number;\n /** Suggested improvement */\n suggestion?: string;\n}\n\n/**\n * Path comparison.\n */\nexport interface PathComparison {\n /** Paths being compared */\n paths: PathResult[];\n /** Statistical significance */\n significant: boolean;\n /** Winner (if significant) */\n winner?: string;\n /** Metrics comparison */\n comparison: {\n metric: string;\n values: Record<string, number>;\n difference: number;\n }[];\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Convert path array to string identifier.\n */\nexport function pathToString(path: string[]): string {\n return path.join(' → ');\n}\n\n/**\n * Convert string identifier to path array.\n */\nexport function stringToPath(pathString: string): string[] {\n return pathString.split(' → ').map(s => s.trim());\n}\n\n/**\n * Calculate exit rate.\n */\nexport function calculateExitRate(exits: number, entries: number): number {\n if (entries === 0) return 0;\n return Math.round((exits / entries) * 10000) / 100;\n}\n\n/**\n * Identify if a screen is a dead-end.\n */\nexport function isDeadEnd(\n exitRate: number,\n isIntendedEndPoint: boolean,\n threshold: number = 50\n): boolean {\n return exitRate > threshold && !isIntendedEndPoint;\n}\n\n/**\n * Calculate path similarity (Jaccard index).\n */\nexport function calculatePathSimilarity(path1: string[], path2: string[]): number {\n const set1 = new Set(path1);\n const set2 = new Set(path2);\n const intersection = new Set([...set1].filter(x => set2.has(x)));\n const union = new Set([...set1, ...set2]);\n return intersection.size / union.size;\n}\n\n/**\n * Find common sub-paths.\n */\nexport function findCommonSubPaths(\n paths: string[][],\n minLength: number = 2\n): Array<{ subPath: string[]; count: number }> {\n const subPathCounts = new Map<string, number>();\n\n for (const path of paths) {\n for (let i = 0; i <= path.length - minLength; i++) {\n for (let j = i + minLength; j <= path.length; j++) {\n const subPath = path.slice(i, j);\n const key = pathToString(subPath);\n subPathCounts.set(key, (subPathCounts.get(key) ?? 0) + 1);\n }\n }\n }\n\n return Array.from(subPathCounts.entries())\n .filter(([, count]) => count > 1)\n .map(([key, count]) => ({ subPath: stringToPath(key), count }))\n .sort((a, b) => b.count - a.count);\n}\n\n// ============================================================================\n// MAIN CLASS\n// ============================================================================\n\n/**\n * Behavioral analytics and path analysis class.\n */\nexport class PathAnalytics extends FlowGridTransport {\n /**\n * Track screen/page transition.\n */\n async trackTransition(config: TransitionConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"paths.transition\", {\n type: \"paths\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track feature sequence.\n */\n async trackFeatureSequence(config: FeatureSequenceConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"paths.feature_sequence\", {\n type: \"paths\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Define a path for tracking.\n */\n async definePath(definition: PathDefinition): Promise<{ pathId: string }> {\n return await this.initFeature(\"paths.define_path\", {\n type: \"paths\",\n ...definition,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Compare paths.\n */\n async comparePaths(\n paths: string[][],\n filter?: DateRangeFilter\n ): Promise<PathComparison> {\n return await this.initFeature(\"paths.compare_paths\", {\n type: \"paths\",\n paths,\n filter,\n timestamp: new Date().toISOString()\n });\n }\n\n}\n","/**\n * @fileoverview Enterprise - Alerts & Anomaly Detection\n * @module features/enterprise/alerts\n * \n * @description\n * Proactively monitor anomalies in key metrics and trigger alerts.\n * Detect activation drops, error spikes, and custom threshold breaches.\n * \n * @useCases\n * - Monitor for activation drops\n * - Detect error/churn spikes\n * - Set custom alert rules\n * - Threshold monitoring\n * - Real-time anomaly detection\n * \n * @metrics\n * - Alert frequency\n * - Time to detection\n * - False positive rate\n * - Alert resolution time\n * - Metric anomaly score\n * \n * @chartData\n * - Line chart: Metric with anomaly markers\n * - Timeline: Alert history\n * - Bar chart: Alerts by type\n * - Dashboard: Alert status\n * \n * @example\n * ```typescript\n * const alerts = new AlertsAnalytics(webId, endpoint, apiKey);\n * \n * // Create an alert rule\n * await alerts.createAlert({\n * name: 'Activation Drop',\n * metric: 'activation_rate',\n * condition: 'drops_below',\n * threshold: 50,\n * severity: 'high'\n * });\n * ```\n */\n\nimport { FlowGridTransport } from \"../../client/transport\";\nimport { DateRangeFilter, TimeSeriesData, TimeGranularity } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Alert condition types.\n */\nexport type AlertCondition = \n | 'exceeds'\n | 'drops_below'\n | 'changes_by'\n | 'anomaly_detected'\n | 'no_data';\n\n/**\n * Alert severity levels.\n */\nexport type AlertSeverity = 'info' | 'warning' | 'high' | 'critical';\n\n/**\n * Alert status.\n */\nexport type AlertStatus = 'active' | 'acknowledged' | 'resolved' | 'muted';\n\n/**\n * Notification channel.\n */\nexport type NotificationChannel = 'email' | 'slack' | 'webhook' | 'pagerduty' | 'sms';\n\n/**\n * Alert rule definition.\n */\nexport interface AlertRuleDefinition {\n /** Alert ID */\n alertId?: string;\n /** Alert name */\n name: string;\n /** Description */\n description?: string;\n /** Metric to monitor */\n metric: string;\n /** Condition type */\n condition: AlertCondition;\n /** Threshold value */\n threshold: number;\n /** Change percentage (for changes_by condition) */\n changePercent?: number;\n /** Comparison window */\n window?: {\n value: number;\n unit: 'minutes' | 'hours' | 'days';\n };\n /** Alert severity */\n severity: AlertSeverity;\n /** Notification channels */\n channels: NotificationChannel[];\n /** Notification recipients */\n recipients?: string[];\n /** Custom filters */\n filters?: Record<string, unknown>;\n /** Is alert enabled */\n enabled?: boolean;\n /** Cooldown period (minutes) */\n cooldownMinutes?: number;\n /** Tags */\n tags?: string[];\n}\n\n/**\n * Alert instance (triggered alert).\n */\nexport interface AlertInstance {\n /** Instance ID */\n instanceId: string;\n /** Alert rule ID */\n alertId: string;\n /** Alert name */\n alertName: string;\n /** Triggered at */\n triggeredAt: string;\n /** Current value that triggered alert */\n currentValue: number;\n /** Threshold value */\n thresholdValue: number;\n /** Severity */\n severity: AlertSeverity;\n /** Status */\n status: AlertStatus;\n /** Acknowledged by */\n acknowledgedBy?: string;\n /** Acknowledged at */\n acknowledgedAt?: string;\n /** Resolved at */\n resolvedAt?: string;\n /** Resolution notes */\n resolutionNotes?: string;\n}\n\n/**\n * Anomaly detection configuration.\n */\nexport interface AnomalyDetectionConfig {\n /** Metric to analyze */\n metric: string;\n /** Lookback period */\n lookbackDays: number;\n /** Sensitivity (0-1, higher = more sensitive) */\n sensitivity?: number;\n /** Detection method */\n method?: 'statistical' | 'ml' | 'hybrid';\n}\n\n/**\n * Detected anomaly.\n */\nexport interface Anomaly {\n /** Anomaly ID */\n anomalyId: string;\n /** Metric */\n metric: string;\n /** Detected at */\n detectedAt: string;\n /** Expected value */\n expectedValue: number;\n /** Actual value */\n actualValue: number;\n /** Deviation percentage */\n deviationPercent: number;\n /** Anomaly score (0-1) */\n anomalyScore: number;\n /** Direction */\n direction: 'up' | 'down';\n /** Severity */\n severity: AlertSeverity;\n /** Is confirmed anomaly */\n isConfirmed: boolean;\n}\n\n/**\n * Alert notification configuration.\n */\nexport interface NotificationConfig {\n /** Channel */\n channel: NotificationChannel;\n /** Channel-specific config */\n config: {\n /** Email addresses (for email channel) */\n emails?: string[];\n /** Slack webhook URL (for slack channel) */\n slackWebhook?: string;\n /** Webhook URL (for webhook channel) */\n webhookUrl?: string;\n /** PagerDuty routing key */\n pagerDutyKey?: string;\n /** Phone numbers (for SMS) */\n phoneNumbers?: string[];\n };\n}\n\n/**\n * Alert analytics filter.\n */\nexport interface AlertAnalyticsFilter extends DateRangeFilter {\n /** Filter by severity */\n severity?: AlertSeverity;\n /** Filter by status */\n status?: AlertStatus;\n /** Filter by metric */\n metric?: string;\n}\n\n/**\n * Alert analytics result.\n */\nexport interface AlertAnalytics {\n /** Total alerts triggered */\n totalAlerts: number;\n /** By severity */\n bySeverity: Record<AlertSeverity, number>;\n /** By status */\n byStatus: Record<AlertStatus, number>;\n /** Average time to acknowledge (ms) */\n avgTimeToAcknowledgeMs: number;\n /** Average time to resolve (ms) */\n avgTimeToResolveMs: number;\n /** Top triggered alerts */\n topAlerts: Array<{\n alertId: string;\n name: string;\n count: number;\n }>;\n /** Alert trend */\n trend: TimeSeriesData;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Calculate standard deviation.\n */\nexport function calculateStdDev(values: number[]): number {\n if (values.length === 0) return 0;\n const mean = values.reduce((a, b) => a + b, 0) / values.length;\n const squareDiffs = values.map(value => Math.pow(value - mean, 2));\n const avgSquareDiff = squareDiffs.reduce((a, b) => a + b, 0) / squareDiffs.length;\n return Math.sqrt(avgSquareDiff);\n}\n\n/**\n * Calculate Z-score for anomaly detection.\n */\nexport function calculateZScore(value: number, mean: number, stdDev: number): number {\n if (stdDev === 0) return 0;\n return (value - mean) / stdDev;\n}\n\n/**\n * Determine if value is anomalous based on Z-score.\n */\nexport function isAnomaly(\n zScore: number,\n sensitivity: number = 0.5\n): boolean {\n // Higher sensitivity = lower threshold for anomaly detection\n const threshold = 4 - (sensitivity * 2); // Ranges from 2 to 4\n return Math.abs(zScore) > threshold;\n}\n\n/**\n * Calculate anomaly score (0-1).\n */\nexport function calculateAnomalyScore(zScore: number): number {\n // Normalize Z-score to 0-1 range\n const absZ = Math.abs(zScore);\n if (absZ <= 2) return absZ / 10;\n if (absZ <= 3) return 0.2 + (absZ - 2) * 0.3;\n if (absZ <= 4) return 0.5 + (absZ - 3) * 0.3;\n return Math.min(0.8 + (absZ - 4) * 0.1, 1);\n}\n\n/**\n * Classify severity from anomaly score.\n */\nexport function classifySeverity(anomalyScore: number): AlertSeverity {\n if (anomalyScore < 0.25) return 'info';\n if (anomalyScore < 0.5) return 'warning';\n if (anomalyScore < 0.75) return 'high';\n return 'critical';\n}\n\n/**\n * Check if alert condition is met.\n */\nexport function checkAlertCondition(\n currentValue: number,\n condition: AlertCondition,\n threshold: number,\n previousValue?: number,\n changePercent?: number\n): boolean {\n switch (condition) {\n case 'exceeds':\n return currentValue > threshold;\n case 'drops_below':\n return currentValue < threshold;\n case 'changes_by':\n if (previousValue === undefined || changePercent === undefined) return false;\n const change = Math.abs((currentValue - previousValue) / previousValue) * 100;\n return change >= changePercent;\n case 'no_data':\n return currentValue === 0 || currentValue === null;\n default:\n return false;\n }\n}\n\n// ============================================================================\n// MAIN CLASS\n// ============================================================================\n\n/**\n * Alerts and anomaly detection class.\n */\nexport class AlertsAnalytics extends FlowGridTransport {\n /**\n * Create an alert rule.\n */\n async createAlert(definition: AlertRuleDefinition): Promise<{ alertId: string }> {\n return await this.initFeature(\"alerts.create\", {\n type: \"alerts\",\n ...definition,\n alertId: definition.alertId ?? \n definition.name.toLowerCase().replace(/[^a-z0-9]+/g, '_'),\n enabled: definition.enabled ?? true,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Update an alert rule.\n */\n async updateAlert(\n alertId: string,\n updates: Partial<AlertRuleDefinition>\n ): Promise<{ updated: boolean }> {\n return await this.initFeature(\"alerts.update\", {\n type: \"alerts\",\n alertId,\n ...updates,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Delete an alert rule.\n */\n async deleteAlert(alertId: string): Promise<{ deleted: boolean }> {\n return await this.initFeature(\"alerts.delete\", {\n type: \"alerts\",\n alertId,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Enable/disable an alert.\n */\n async toggleAlert(alertId: string, enabled: boolean): Promise<{ updated: boolean }> {\n return await this.initFeature(\"alerts.toggle\", {\n type: \"alerts\",\n alertId,\n enabled,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * List all alert rules.\n */\n async listAlerts(\n enabled?: boolean\n ): Promise<Array<AlertRuleDefinition & { alertId: string }>> {\n return await this.initFeature(\"alerts.list\", {\n type: \"alerts\",\n enabled,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Acknowledge an alert.\n */\n async acknowledgeAlert(\n instanceId: string,\n acknowledgedBy: string\n ): Promise<{ acknowledged: boolean }> {\n return await this.initFeature(\"alerts.acknowledge\", {\n type: \"alerts\",\n instanceId,\n acknowledgedBy,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Resolve an alert.\n */\n async resolveAlert(\n instanceId: string,\n notes?: string\n ): Promise<{ resolved: boolean }> {\n return await this.initFeature(\"alerts.resolve\", {\n type: \"alerts\",\n instanceId,\n notes,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Mute an alert temporarily.\n */\n async muteAlert(alertId: string, durationMinutes: number): Promise<{ muted: boolean }> {\n return await this.initFeature(\"alerts.mute\", {\n type: \"alerts\",\n alertId,\n durationMinutes,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Run anomaly detection.\n */\n async detectAnomalies(config: AnomalyDetectionConfig): Promise<Anomaly[]> {\n return await this.initFeature(\"alerts.detect_anomalies\", {\n type: \"alerts\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Configure notification channel.\n */\n async configureNotification(config: NotificationConfig): Promise<{ configured: boolean }> {\n return await this.initFeature(\"alerts.configure_notification\", {\n type: \"alerts\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Test notification channel.\n */\n async testNotification(channel: NotificationChannel): Promise<{ success: boolean }> {\n return await this.initFeature(\"alerts.test_notification\", {\n type: \"alerts\",\n channel,\n timestamp: new Date().toISOString()\n });\n }\n\n}\n","/**\n * @fileoverview Enterprise - Security & Compliance Analytics\n * @module features/enterprise/security\n * \n * @description\n * Track activity for security, privacy, and regulatory compliance.\n * Monitor login attempts, role changes, and compliance events.\n * \n * @useCases\n * - Track failed login attempts\n * - Monitor role/permission changes\n * - GDPR/CCPA compliance events\n * - Audit logging\n * - Security anomaly detection\n * \n * @metrics\n * - Failed login rate\n * - Suspicious activity count\n * - Role change frequency\n * - Data access patterns\n * - Compliance event count\n * \n * @chartData\n * - Line chart: Security events over time\n * - Bar chart: Events by type\n * - Table: Audit log\n * - Heatmap: Access patterns\n * \n * @example\n * ```typescript\n * const security = new SecurityAnalytics(webId, endpoint, apiKey);\n * \n * // Track login attempt\n * await security.trackLoginAttempt({\n * userId: 'user_123',\n * success: false,\n * reason: 'invalid_password'\n * });\n * ```\n */\n\nimport { FlowGridTransport } from \"../../client/transport\";\nimport { DateRangeFilter, TimeSeriesData } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Security event types.\n */\nexport type SecurityEventType = \n | 'login_attempt'\n | 'login_success'\n | 'login_failure'\n | 'logout'\n | 'password_change'\n | 'password_reset'\n | 'mfa_enabled'\n | 'mfa_disabled'\n | 'role_change'\n | 'permission_change'\n | 'data_access'\n | 'data_export'\n | 'data_deletion'\n | 'api_key_created'\n | 'api_key_revoked'\n | 'suspicious_activity';\n\n/**\n * Compliance event types.\n */\nexport type ComplianceEventType = \n | 'consent_given'\n | 'consent_withdrawn'\n | 'data_access_request'\n | 'data_deletion_request'\n | 'data_portability_request'\n | 'privacy_policy_update'\n | 'opt_out'\n | 'opt_in';\n\n/**\n * Login attempt configuration.\n */\nexport interface LoginAttemptConfig {\n /** User ID or email */\n userId: string;\n /** Whether login was successful */\n success: boolean;\n /** Failure reason (if failed) */\n reason?: string;\n /** IP address */\n ipAddress?: string;\n /** User agent */\n userAgent?: string;\n /** Device info */\n device?: string;\n /** Location */\n location?: {\n country?: string;\n city?: string;\n };\n /** MFA used */\n mfaUsed?: boolean;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Role change configuration.\n */\nexport interface RoleChangeConfig {\n /** User ID being changed */\n userId: string;\n /** Who made the change */\n changedBy: string;\n /** Previous role */\n previousRole: string;\n /** New role */\n newRole: string;\n /** Reason for change */\n reason?: string;\n}\n\n/**\n * Permission change configuration.\n */\nexport interface PermissionChangeConfig {\n /** User ID being changed */\n userId: string;\n /** Who made the change */\n changedBy: string;\n /** Permission being changed */\n permission: string;\n /** Action */\n action: 'granted' | 'revoked';\n /** Resource scope */\n resourceScope?: string;\n}\n\n/**\n * Data access configuration.\n */\nexport interface DataAccessConfig {\n /** User ID accessing data */\n userId: string;\n /** Resource type */\n resourceType: string;\n /** Resource ID */\n resourceId?: string;\n /** Access type */\n accessType: 'read' | 'write' | 'delete' | 'export';\n /** IP address */\n ipAddress?: string;\n /** Query/filter used */\n query?: Record<string, unknown>;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Compliance event configuration.\n */\nexport interface ComplianceEventConfig {\n /** User ID */\n userId: string;\n /** Event type */\n eventType: ComplianceEventType;\n /** Regulation */\n regulation?: 'GDPR' | 'CCPA' | 'HIPAA' | 'SOC2' | 'other';\n /** Details */\n details?: Record<string, unknown>;\n /** Consent scope (for consent events) */\n consentScope?: string[];\n /** Request ID (for data requests) */\n requestId?: string;\n /** Custom properties */\n properties?: Record<string, unknown>;\n}\n\n/**\n * Audit log entry.\n */\nexport interface AuditLogEntry {\n /** Entry ID */\n entryId: string;\n /** Timestamp */\n timestamp: string;\n /** Event type */\n eventType: SecurityEventType | ComplianceEventType;\n /** Actor (who performed the action) */\n actor: {\n userId: string;\n userEmail?: string;\n ipAddress?: string;\n };\n /** Target (what was affected) */\n target?: {\n type: string;\n id: string;\n name?: string;\n };\n /** Action details */\n details: Record<string, unknown>;\n /** Severity */\n severity: 'low' | 'medium' | 'high' | 'critical';\n /** Was action successful */\n success: boolean;\n}\n\n/**\n * Security analytics filter.\n */\nexport interface SecurityAnalyticsFilter extends DateRangeFilter {\n /** Event type filter */\n eventType?: SecurityEventType | SecurityEventType[];\n /** User ID filter */\n userId?: string;\n /** Severity filter */\n severity?: 'low' | 'medium' | 'high' | 'critical';\n /** Success filter */\n success?: boolean;\n}\n\n/**\n * Security risk assessment.\n */\nexport interface SecurityRiskAssessment {\n /** User ID */\n userId: string;\n /** Risk score (0-100) */\n riskScore: number;\n /** Risk level */\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n /** Risk factors */\n factors: Array<{\n factor: string;\n contribution: number;\n details: string;\n }>;\n /** Last assessment date */\n assessedAt: string;\n /** Recommended actions */\n recommendations: string[];\n}\n\n/**\n * Security analytics result.\n */\nexport interface SecurityAnalyticsResult {\n /** Total security events */\n totalEvents: number;\n /** Failed login count */\n failedLogins: number;\n /** Failed login rate */\n failedLoginRate: number;\n /** Suspicious activity count */\n suspiciousActivityCount: number;\n /** Role changes */\n roleChanges: number;\n /** Data access events */\n dataAccessEvents: number;\n /** By event type */\n byEventType: Array<{ type: string; count: number }>;\n /** High risk users */\n highRiskUsers: number;\n /** Trend */\n trend: TimeSeriesData;\n}\n\n/**\n * Compliance report.\n */\nexport interface ComplianceReport {\n /** Report period */\n period: DateRangeFilter;\n /** Regulation */\n regulation: string;\n /** Consent stats */\n consentStats: {\n totalConsents: number;\n activeConsents: number;\n withdrawals: number;\n };\n /** Data requests */\n dataRequests: {\n accessRequests: number;\n deletionRequests: number;\n portabilityRequests: number;\n avgResponseTimeHours: number;\n };\n /** Compliance score */\n complianceScore: number;\n /** Issues */\n issues: Array<{\n type: string;\n severity: string;\n description: string;\n }>;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Classify risk level from score.\n */\nexport function classifyRiskLevel(score: number): 'low' | 'medium' | 'high' | 'critical' {\n if (score < 25) return 'low';\n if (score < 50) return 'medium';\n if (score < 75) return 'high';\n return 'critical';\n}\n\n/**\n * Calculate failed login rate.\n */\nexport function calculateFailedLoginRate(failed: number, total: number): number {\n if (total === 0) return 0;\n return Math.round((failed / total) * 10000) / 100;\n}\n\n/**\n * Check if login pattern is suspicious.\n */\nexport function isSuspiciousLoginPattern(\n failedAttempts: number,\n timeWindowMinutes: number,\n threshold: number = 5\n): boolean {\n return failedAttempts >= threshold && timeWindowMinutes <= 15;\n}\n\n/**\n * Determine event severity.\n */\nexport function determineEventSeverity(\n eventType: SecurityEventType,\n success: boolean\n): 'low' | 'medium' | 'high' | 'critical' {\n const criticalEvents: SecurityEventType[] = ['suspicious_activity'];\n const highEvents: SecurityEventType[] = ['role_change', 'permission_change', 'data_deletion', 'api_key_revoked'];\n const mediumEvents: SecurityEventType[] = ['login_failure', 'password_reset', 'data_export'];\n\n if (criticalEvents.includes(eventType)) return 'critical';\n if (highEvents.includes(eventType)) return 'high';\n if (mediumEvents.includes(eventType)) return !success ? 'high' : 'medium';\n return 'low';\n}\n\n// ============================================================================\n// MAIN CLASS\n// ============================================================================\n\n/**\n * Security and compliance analytics class.\n */\nexport class SecurityAnalytics extends FlowGridTransport {\n /**\n * Track login attempt.\n */\n async trackLoginAttempt(config: LoginAttemptConfig): Promise<{ tracked: boolean }> {\n const eventType: SecurityEventType = config.success ? 'login_success' : 'login_failure';\n const severity = determineEventSeverity(eventType, config.success);\n\n return await this.initFeature(\"security.login_attempt\", {\n type: \"security\",\n ...config,\n eventType,\n severity,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track logout.\n */\n async trackLogout(userId: string, sessionId?: string): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"security.logout\", {\n type: \"security\",\n userId,\n sessionId,\n eventType: 'logout' as SecurityEventType,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track password change.\n */\n async trackPasswordChange(userId: string, forced: boolean = false): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"security.password_change\", {\n type: \"security\",\n userId,\n forced,\n eventType: 'password_change' as SecurityEventType,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track role change.\n */\n async trackRoleChange(config: RoleChangeConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"security.role_change\", {\n type: \"security\",\n ...config,\n eventType: 'role_change' as SecurityEventType,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track permission change.\n */\n async trackPermissionChange(config: PermissionChangeConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"security.permission_change\", {\n type: \"security\",\n ...config,\n eventType: 'permission_change' as SecurityEventType,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track data access.\n */\n async trackDataAccess(config: DataAccessConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"security.data_access\", {\n type: \"security\",\n ...config,\n eventType: 'data_access' as SecurityEventType,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track data export.\n */\n async trackDataExport(\n userId: string,\n resourceType: string,\n recordCount: number\n ): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"security.data_export\", {\n type: \"security\",\n userId,\n resourceType,\n recordCount,\n eventType: 'data_export' as SecurityEventType,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track suspicious activity.\n */\n async trackSuspiciousActivity(\n userId: string,\n activityType: string,\n details: Record<string, unknown>\n ): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"security.suspicious_activity\", {\n type: \"security\",\n userId,\n activityType,\n details,\n eventType: 'suspicious_activity' as SecurityEventType,\n severity: 'critical',\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Track compliance event.\n */\n async trackComplianceEvent(config: ComplianceEventConfig): Promise<{ tracked: boolean }> {\n return await this.initFeature(\"security.compliance_event\", {\n type: \"security\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n}\n","/**\n * @fileoverview Enterprise - Product Usage Forecasting\n * @module features/enterprise/forecasting\n * \n * @description\n * Predict usage, adoption, and revenue trends using historical data\n * and machine learning models.\n * \n * @useCases\n * - Project active user growth\n * - Forecast feature adoption\n * - Predict churn and revenue\n * - Capacity planning\n * - Trend analysis\n * \n * @metrics\n * - Predicted DAU/MAU\n * - Feature adoption forecast\n * - Revenue projection\n * - Churn prediction\n * - Forecast accuracy\n * \n * @chartData\n * - Line chart: Forecast with confidence\n * - Area chart: Prediction range\n * - Comparison: Predicted vs actual\n * - Table: Forecast metrics\n * \n * @example\n * ```typescript\n * const forecasting = new Forecasting(webId, endpoint, apiKey);\n * \n * // Get user growth forecast\n * const forecast = await forecasting.forecastActiveUsers({\n * metric: 'dau',\n * periods: 30,\n * granularity: 'day'\n * });\n * ```\n */\n\nimport { FlowGridTransport } from \"../../client/transport\";\nimport { DateRangeFilter, TimeSeriesData, TimeGranularity, MoneyValue, CurrencyCode } from \"../../types\";\n\n// ============================================================================\n// CONFIGURATION TYPES\n// ============================================================================\n\n/**\n * Forecast model types.\n */\nexport type ForecastModel = \n | 'linear'\n | 'exponential'\n | 'arima'\n | 'prophet'\n | 'ensemble';\n\n/**\n * Metric types for forecasting.\n */\nexport type ForecastMetric = \n | 'dau' // Daily Active Users\n | 'wau' // Weekly Active Users\n | 'mau' // Monthly Active Users\n | 'signups' // New signups\n | 'revenue' // Revenue\n | 'mrr' // Monthly Recurring Revenue\n | 'churn_rate' // Churn rate\n | 'feature_usage' // Feature usage\n | 'sessions' // Session count\n | 'events' // Event count\n | 'custom'; // Custom metric\n\n/**\n * Base forecast configuration.\n */\nexport interface ForecastConfig {\n /** Metric to forecast */\n metric: ForecastMetric;\n /** Number of periods to forecast */\n periods: number;\n /** Time granularity */\n granularity: TimeGranularity;\n /** Historical data range to use */\n historicalRange?: DateRangeFilter;\n /** Forecast model to use */\n model?: ForecastModel;\n /** Include confidence intervals */\n includeConfidence?: boolean;\n /** Confidence level (0-1, default 0.95) */\n confidenceLevel?: number;\n /** Custom metric name (if metric is 'custom') */\n customMetricName?: string;\n}\n\n/**\n * Forecast data point.\n */\nexport interface ForecastDataPoint {\n /** Period/date */\n period: string;\n /** Predicted value */\n predicted: number;\n /** Lower bound (if confidence included) */\n lower?: number;\n /** Upper bound (if confidence included) */\n upper?: number;\n /** Actual value (if historical/backtested) */\n actual?: number;\n}\n\n/**\n * Forecast result.\n */\nexport interface ForecastResult {\n /** Metric being forecasted */\n metric: ForecastMetric;\n /** Model used */\n model: ForecastModel;\n /** Granularity */\n granularity: TimeGranularity;\n /** Forecast data points */\n forecast: ForecastDataPoint[];\n /** Summary statistics */\n summary: {\n startValue: number;\n endValue: number;\n totalChange: number;\n changePercent: number;\n trend: 'growing' | 'stable' | 'declining';\n avgGrowthRate: number;\n };\n /** Model accuracy (based on backtesting) */\n accuracy: {\n mape: number; // Mean Absolute Percentage Error\n rmse: number; // Root Mean Square Error\n r2: number; // R-squared\n };\n /** Generated at */\n generatedAt: string;\n}\n\n/**\n * Revenue forecast configuration.\n */\nexport interface RevenueForecastConfig extends Omit<ForecastConfig, 'metric'> {\n /** Currency */\n currency?: CurrencyCode;\n /** Include MRR components */\n includeMRRComponents?: boolean;\n}\n\n/**\n * Revenue forecast result.\n */\nexport interface RevenueForecastResult extends ForecastResult {\n /** Currency */\n currency: CurrencyCode;\n /** MRR components (if included) */\n mrrComponents?: {\n newBusiness: ForecastDataPoint[];\n expansion: ForecastDataPoint[];\n contraction: ForecastDataPoint[];\n churn: ForecastDataPoint[];\n };\n}\n\n/**\n * Feature adoption forecast configuration.\n */\nexport interface FeatureAdoptionForecastConfig extends Omit<ForecastConfig, 'metric'> {\n /** Feature ID */\n featureId: string;\n /** Adoption metric */\n adoptionMetric?: 'users' | 'usage_count' | 'adoption_rate';\n}\n\n/**\n * Churn forecast configuration.\n */\nexport interface ChurnForecastConfig extends Omit<ForecastConfig, 'metric'> {\n /** User segment */\n segment?: string;\n /** Include user-level predictions */\n includeUserPredictions?: boolean;\n /** Top N at-risk users to include */\n topAtRiskUsers?: number;\n}\n\n/**\n * Churn forecast result.\n */\nexport interface ChurnForecastResult extends ForecastResult {\n /** Predicted churned user count */\n predictedChurnedUsers: number;\n /** Predicted revenue at risk */\n revenueAtRisk?: MoneyValue;\n /** Top at-risk users (if requested) */\n atRiskUsers?: Array<{\n userId: string;\n churnProbability: number;\n predictedChurnDate: string;\n estimatedValue: MoneyValue;\n }>;\n}\n\n/**\n * Capacity planning configuration.\n */\nexport interface CapacityPlanningConfig {\n /** Metrics to include */\n metrics: Array<'users' | 'sessions' | 'events' | 'api_calls' | 'storage'>;\n /** Periods to forecast */\n periods: number;\n /** Granularity */\n granularity: 'week' | 'month' | 'quarter';\n /** Current capacity limits */\n currentLimits?: Record<string, number>;\n}\n\n/**\n * Capacity planning result.\n */\nexport interface CapacityPlanningResult {\n /** Forecasts by metric */\n forecasts: Record<string, ForecastResult>;\n /** Capacity alerts */\n alerts: Array<{\n metric: string;\n currentUsage: number;\n limit: number;\n predictedExceedDate?: string;\n recommendation: string;\n }>;\n /** Overall growth rate */\n overallGrowthRate: number;\n}\n\n/**\n * Scenario configuration.\n */\nexport interface ScenarioConfig {\n /** Base forecast configuration */\n baseConfig: ForecastConfig;\n /** Scenario adjustments */\n scenarios: Array<{\n name: string;\n adjustments: {\n growthMultiplier?: number;\n seasonalAdjustment?: number;\n oneTimeImpact?: { period: string; value: number };\n };\n }>;\n}\n\n/**\n * Scenario comparison result.\n */\nexport interface ScenarioComparison {\n /** Base forecast */\n baseline: ForecastResult;\n /** Scenario forecasts */\n scenarios: Array<{\n name: string;\n forecast: ForecastResult;\n differenceFromBaseline: number;\n }>;\n}\n\n// ============================================================================\n// HELPER FUNCTIONS\n// ============================================================================\n\n/**\n * Calculate MAPE (Mean Absolute Percentage Error).\n */\nexport function calculateMAPE(actual: number[], predicted: number[]): number {\n if (actual.length !== predicted.length || actual.length === 0) return 0;\n \n let sum = 0;\n let count = 0;\n \n for (let i = 0; i < actual.length; i++) {\n if (actual[i] !== 0) {\n sum += Math.abs((actual[i] - predicted[i]) / actual[i]);\n count++;\n }\n }\n \n return count > 0 ? Math.round((sum / count) * 10000) / 100 : 0;\n}\n\n/**\n * Calculate RMSE (Root Mean Square Error).\n */\nexport function calculateRMSE(actual: number[], predicted: number[]): number {\n if (actual.length !== predicted.length || actual.length === 0) return 0;\n \n let sumSquaredError = 0;\n for (let i = 0; i < actual.length; i++) {\n sumSquaredError += Math.pow(actual[i] - predicted[i], 2);\n }\n \n return Math.round(Math.sqrt(sumSquaredError / actual.length) * 100) / 100;\n}\n\n/**\n * Calculate R-squared.\n */\nexport function calculateR2(actual: number[], predicted: number[]): number {\n if (actual.length !== predicted.length || actual.length === 0) return 0;\n \n const mean = actual.reduce((a, b) => a + b, 0) / actual.length;\n \n let ssRes = 0;\n let ssTot = 0;\n \n for (let i = 0; i < actual.length; i++) {\n ssRes += Math.pow(actual[i] - predicted[i], 2);\n ssTot += Math.pow(actual[i] - mean, 2);\n }\n \n return ssTot !== 0 ? Math.round((1 - ssRes / ssTot) * 10000) / 10000 : 0;\n}\n\n/**\n * Classify trend direction.\n */\nexport function classifyTrend(\n startValue: number,\n endValue: number,\n threshold: number = 5\n): 'growing' | 'stable' | 'declining' {\n if (startValue === 0) return endValue > 0 ? 'growing' : 'stable';\n \n const changePercent = ((endValue - startValue) / startValue) * 100;\n \n if (changePercent > threshold) return 'growing';\n if (changePercent < -threshold) return 'declining';\n return 'stable';\n}\n\n/**\n * Calculate average growth rate.\n */\nexport function calculateAvgGrowthRate(values: number[]): number {\n if (values.length < 2) return 0;\n \n let totalGrowth = 0;\n let count = 0;\n \n for (let i = 1; i < values.length; i++) {\n if (values[i - 1] !== 0) {\n totalGrowth += (values[i] - values[i - 1]) / values[i - 1];\n count++;\n }\n }\n \n return count > 0 ? Math.round((totalGrowth / count) * 10000) / 100 : 0;\n}\n\n/**\n * Apply confidence interval.\n */\nexport function applyConfidenceInterval(\n predicted: number,\n stdError: number,\n confidenceLevel: number = 0.95\n): { lower: number; upper: number } {\n // Z-score for common confidence levels\n const zScores: Record<number, number> = {\n 0.90: 1.645,\n 0.95: 1.96,\n 0.99: 2.576\n };\n \n const z = zScores[confidenceLevel] ?? 1.96;\n const margin = z * stdError;\n \n return {\n lower: Math.max(0, predicted - margin),\n upper: predicted + margin\n };\n}\n\n// ============================================================================\n// MAIN CLASS\n// ============================================================================\n\n/**\n * Product usage forecasting class.\n */\nexport class Forecasting extends FlowGridTransport {\n /**\n * Forecast active users.\n */\n async forecastActiveUsers(config: ForecastConfig): Promise<ForecastResult> {\n return await this.initFeature(\"forecasting.active_users\", {\n type: \"forecasting\",\n ...config,\n model: config.model ?? 'ensemble',\n includeConfidence: config.includeConfidence ?? true,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Forecast revenue.\n */\n async forecastRevenue(config: RevenueForecastConfig): Promise<RevenueForecastResult> {\n return await this.initFeature(\"forecasting.revenue\", {\n type: \"forecasting\",\n ...config,\n metric: 'revenue' as ForecastMetric,\n currency: config.currency ?? 'USD',\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Forecast MRR.\n */\n async forecastMRR(config: RevenueForecastConfig): Promise<RevenueForecastResult> {\n return await this.initFeature(\"forecasting.mrr\", {\n type: \"forecasting\",\n ...config,\n metric: 'mrr' as ForecastMetric,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Forecast feature adoption.\n */\n async forecastFeatureAdoption(\n config: FeatureAdoptionForecastConfig\n ): Promise<ForecastResult> {\n return await this.initFeature(\"forecasting.feature_adoption\", {\n type: \"forecasting\",\n ...config,\n metric: 'feature_usage' as ForecastMetric,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Forecast churn.\n */\n async forecastChurn(config: ChurnForecastConfig): Promise<ChurnForecastResult> {\n return await this.initFeature(\"forecasting.churn\", {\n type: \"forecasting\",\n ...config,\n metric: 'churn_rate' as ForecastMetric,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Forecast signups.\n */\n async forecastSignups(config: ForecastConfig): Promise<ForecastResult> {\n return await this.initFeature(\"forecasting.signups\", {\n type: \"forecasting\",\n ...config,\n metric: 'signups' as ForecastMetric,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Compare forecast scenarios.\n */\n async compareScenarios(config: ScenarioConfig): Promise<ScenarioComparison> {\n return await this.initFeature(\"forecasting.scenarios\", {\n type: \"forecasting\",\n ...config,\n timestamp: new Date().toISOString()\n });\n }\n\n /**\n * Forecast custom metric.\n */\n async forecastCustomMetric(\n metricName: string,\n config: Omit<ForecastConfig, 'metric' | 'customMetricName'>\n ): Promise<ForecastResult> {\n return await this.initFeature(\"forecasting.custom\", {\n type: \"forecasting\",\n ...config,\n metric: 'custom' as ForecastMetric,\n customMetricName: metricName,\n timestamp: new Date().toISOString()\n });\n }\n\n}\n","/**\n * Engagement shortcuts.\n */\nimport { Engagement, ContentConsumptionConfig, UserActivityConfig } from \"../../features/enterprise/engagement\";\n\nexport class EngagementTracker {\n constructor(public readonly client: Engagement) {}\n\n /** Time spent dwelling on a feature (ms). */\n dwell(featureId: string, dwellTimeMs: number, properties?: Record<string, unknown>) {\n return this.client.trackDwellTime({ featureId, dwellTimeMs, properties });\n }\n\n /** End-of-session depth metrics. */\n sessionDepth(\n sessionId: string,\n pagesVisited: number,\n featuresUsed: number,\n actionsTaken: number,\n durationMs: number\n ) {\n return this.client.trackSessionDepth({\n sessionId,\n pagesVisited,\n featuresUsed,\n actionsTaken,\n durationMs,\n });\n }\n\n /** How much of a content piece a user consumed. */\n contentConsumption(\n contentId: string,\n contentType: ContentConsumptionConfig[\"contentType\"],\n percentageConsumed: number,\n timeSpentMs: number\n ) {\n return this.client.trackContentConsumption({\n contentId,\n contentType,\n percentageConsumed,\n timeSpentMs,\n });\n }\n\n /** User activity ping. */\n activity(userId: string, activityType: UserActivityConfig[\"activityType\"], durationMs: number) {\n return this.client.trackUserActivity({ userId, activityType, durationMs });\n }\n\n /** Auto-track dwell time on a feature; returns a teardown that emits the event. */\n autoTrackDwell(featureId: string, options?: { userId?: string; sessionId?: string }) {\n return this.client.autoTrackDwell(featureId, options);\n }\n\n /**\n * Auto-track session-level engagement (session depth + activity transitions).\n * Returns a teardown function. Safe no-op outside the browser.\n */\n autoTrack(options?: { userId?: string; sessionId?: string; idleAfterMs?: number; pollMs?: number }) {\n return this.client.autoTrack(options);\n }\n}\n","/**\n * Cohort shortcuts.\n */\nimport { Cohorts } from \"../../features/enterprise/cohorts\";\n\nexport class CohortTracker {\n constructor(public readonly client: Cohorts) {}\n\n /** Define a new cohort (admin / setup). */\n create(definition: Parameters<Cohorts[\"createCohort\"]>[0]) {\n return this.client.createCohort(definition);\n }\n\n /** Define a new segment. */\n segment(definition: Parameters<Cohorts[\"createSegment\"]>[0]) {\n return this.client.createSegment(definition);\n }\n\n /** Check whether a user is in a cohort. */\n isMember(userId: string, cohortId: string) {\n return this.client.isUserInCohort(userId, cohortId);\n }\n}\n","/**\n * Churn shortcuts.\n */\nimport { ChurnAnalytics, UsageDecayConfig, PreventionActionConfig } from \"../../features/enterprise/churn\";\n\nexport class ChurnTracker {\n constructor(public readonly client: ChurnAnalytics) {}\n\n /** Track usage decay over time. */\n decay(userId: string, metric: UsageDecayConfig[\"metric\"], periods: UsageDecayConfig[\"periods\"]) {\n return this.client.trackUsageDecay({ userId, metric, periods });\n }\n\n /** Record an NPS / CSAT-style score. */\n nps(userId: string, score: number, feedback?: string) {\n return this.client.trackNPS({ userId, score, feedback });\n }\n\n /** Record an actual churn event. */\n churned(userId: string, churnType: \"voluntary\" | \"involuntary\", reason?: string) {\n return this.client.trackChurn({ userId, churnType, reason });\n }\n\n /** Record a retention/save action. */\n prevention(userId: string, actionType: PreventionActionConfig[\"actionType\"], details?: Record<string, unknown>) {\n return this.client.trackPreventionAction({ userId, actionType, details });\n }\n}\n","/**\n * Monetization shortcuts.\n */\nimport { Monetization, RevenueType } from \"../../features/enterprise/monetization\";\nimport type { CurrencyCode } from \"../../types\";\n\nexport class MonetizationTracker {\n constructor(public readonly client: Monetization) {}\n\n /** Track a revenue event. */\n revenue(\n userId: string,\n amount: number,\n currency: CurrencyCode,\n type: RevenueType,\n properties?: Record<string, unknown>\n ) {\n return this.client.trackRevenue({ userId, amount, currency, type, properties });\n }\n}\n","/**\n * Multi-path funnel shortcuts.\n */\nimport { MultiPathFunnels } from \"../../features/enterprise/multi-path-funnels\";\n\nexport class MultiPathFunnelTracker {\n constructor(public readonly client: MultiPathFunnels) {}\n\n /** Define a multi-path funnel. */\n define(definition: Parameters<MultiPathFunnels[\"defineFunnel\"]>[0]) {\n return this.client.defineFunnel(definition);\n }\n\n /** Record a step in a multi-path funnel. */\n step(funnelId: string, step: string, userId: string, properties?: Record<string, unknown>) {\n return this.client.trackStep({ funnelId, step, userId, properties });\n }\n\n /** Record a micro-conversion within a funnel. */\n microConversion(conversionId: string, userId: string, properties?: Record<string, unknown>) {\n return this.client.trackMicroConversion({ conversionId, userId, properties });\n }\n}\n","/**\n * Support shortcuts.\n */\nimport { SupportAnalytics, FeatureComplaintConfig } from \"../../features/enterprise/support\";\nimport type { SupportChannel, TicketStatus } from \"../../features/enterprise/support\";\n\nexport class SupportTracker {\n constructor(public readonly client: SupportAnalytics) {}\n\n /** New support ticket created. */\n ticket(\n ticketId: string,\n userId: string,\n subject: string,\n category: string,\n priority: \"low\" | \"medium\" | \"high\" | \"urgent\",\n channel: SupportChannel\n ) {\n return this.client.trackTicket({ ticketId, userId, subject, category, priority, channel });\n }\n\n /** Update an existing ticket. */\n update(ticketId: string, status: TicketStatus, properties?: Record<string, unknown>) {\n return this.client.updateTicket({ ticketId, status, properties });\n }\n\n /** Customer satisfaction (CSAT) response. */\n csat(ticketId: string, userId: string, score: number, feedback?: string) {\n return this.client.trackCSAT({ ticketId, userId, score, feedback });\n }\n\n /** Complaint about a specific feature. */\n featureComplaint(\n userId: string,\n featureId: string,\n complaintType: FeatureComplaintConfig[\"complaintType\"],\n severity: FeatureComplaintConfig[\"severity\"]\n ) {\n return this.client.trackFeatureComplaint({ userId, featureId, complaintType, severity });\n }\n}\n","/**\n * Acquisition shortcuts.\n */\nimport { AcquisitionAnalytics, AcquisitionSource, LifecycleStage } from \"../../features/enterprise/acquisition\";\nimport type { MoneyValue } from \"../../types\";\n\nexport class AcquisitionTracker {\n constructor(public readonly client: AcquisitionAnalytics) {}\n\n /** Track how a user was acquired. */\n acquired(userId: string, source: AcquisitionSource, properties?: Record<string, unknown>) {\n return this.client.trackAcquisition({ userId, source, properties });\n }\n\n /** Create a marketing campaign. */\n campaign(definition: Parameters<AcquisitionAnalytics[\"createCampaign\"]>[0]) {\n return this.client.createCampaign(definition);\n }\n\n /** Record campaign spend. */\n spend(campaignId: string, amount: MoneyValue, date: string) {\n return this.client.trackCampaignSpend({ campaignId, amount, date });\n }\n\n /** Track a lifecycle stage transition. */\n lifecycle(userId: string, fromStage: LifecycleStage, toStage: LifecycleStage) {\n return this.client.trackLifecycleTransition({ userId, fromStage, toStage });\n }\n}\n","/**\n * Path / journey shortcuts.\n */\nimport { PathAnalytics } from \"../../features/enterprise/paths\";\n\nexport class PathTracker {\n constructor(public readonly client: PathAnalytics) {}\n\n /** Record a screen-to-screen transition. */\n transition(userId: string, fromScreen: string, toScreen: string, properties?: Record<string, unknown>) {\n return this.client.trackTransition({ userId, fromScreen, toScreen, properties });\n }\n\n /** Record a feature usage in sequence. */\n sequence(userId: string, feature: string, order: number) {\n return this.client.trackFeatureSequence({ userId, feature, order });\n }\n\n /** Define an expected user path. */\n define(definition: Parameters<PathAnalytics[\"definePath\"]>[0]) {\n return this.client.definePath(definition);\n }\n}\n","/**\n * Alert shortcuts.\n */\nimport { AlertsAnalytics } from \"../../features/enterprise/alerts\";\n\nexport class AlertTracker {\n constructor(public readonly client: AlertsAnalytics) {}\n\n /** Create an alert rule. */\n create(definition: Parameters<AlertsAnalytics[\"createAlert\"]>[0]) {\n return this.client.createAlert(definition);\n }\n\n /** Update an alert rule. */\n update(alertId: string, updates: Record<string, unknown>) {\n return this.client.updateAlert(alertId, updates);\n }\n\n /** Delete an alert rule. */\n delete(alertId: string) {\n return this.client.deleteAlert(alertId);\n }\n\n /** Acknowledge a triggered alert instance. */\n acknowledge(instanceId: string, acknowledgedBy: string) {\n return this.client.acknowledgeAlert(instanceId, acknowledgedBy);\n }\n\n /** Resolve a triggered alert instance. */\n resolve(instanceId: string, notes?: string) {\n return this.client.resolveAlert(instanceId, notes);\n }\n\n /** Mute an alert rule for a number of minutes. */\n mute(alertId: string, durationMinutes: number) {\n return this.client.muteAlert(alertId, durationMinutes);\n }\n}\n","/**\n * Security shortcuts.\n */\nimport { SecurityAnalytics, DataAccessConfig, ComplianceEventConfig } from \"../../features/enterprise/security\";\n\nexport class SecurityTracker {\n constructor(public readonly client: SecurityAnalytics) {}\n\n /** Login attempt (success or failure). */\n login(userId: string, success: boolean, properties?: Record<string, unknown>) {\n return this.client.trackLoginAttempt({ userId, success, properties });\n }\n\n /** A user role changed. */\n roleChange(userId: string, changedBy: string, previousRole: string, newRole: string) {\n return this.client.trackRoleChange({ userId, changedBy, previousRole, newRole });\n }\n\n /** A permission was granted or revoked. */\n permissionChange(userId: string, changedBy: string, permission: string, action: \"granted\" | \"revoked\") {\n return this.client.trackPermissionChange({ userId, changedBy, permission, action });\n }\n\n /** A user accessed sensitive data. */\n dataAccess(userId: string, resourceType: string, accessType: DataAccessConfig[\"accessType\"], properties?: Record<string, unknown>) {\n return this.client.trackDataAccess({ userId, resourceType, accessType, properties });\n }\n\n /** A compliance-relevant event occurred (GDPR/SOC2 etc.). */\n compliance(userId: string, eventType: ComplianceEventConfig[\"eventType\"], properties?: Record<string, unknown>) {\n return this.client.trackComplianceEvent({ userId, eventType, properties });\n }\n}\n","/**\n * Forecasting shortcuts.\n */\nimport { Forecasting, ForecastMetric } from \"../../features/enterprise/forecasting\";\n\ntype Granularity = \"day\" | \"week\" | \"month\";\n\nexport class ForecastingTracker {\n constructor(public readonly client: Forecasting) {}\n\n /** Forecast active users. */\n activeUsers(metric: ForecastMetric, periods: number, granularity: Granularity) {\n return this.client.forecastActiveUsers({ metric, periods, granularity });\n }\n\n /** Forecast revenue. */\n revenue(periods: number, granularity: Granularity) {\n return this.client.forecastRevenue({ periods, granularity });\n }\n\n /** Forecast adoption of a specific feature. */\n featureAdoption(featureId: string, periods: number, granularity: Granularity) {\n return this.client.forecastFeatureAdoption({ featureId, periods, granularity });\n }\n\n /** Forecast churn. */\n churn(periods: number, granularity: Granularity) {\n return this.client.forecastChurn({ periods, granularity });\n }\n}\n"],"names":["calculateEngagementScore","dwellTime","sessionDepth","activityRatio","contentCompletion","Math","round","classifyEngagementLevel","score","calculateSessionDepthScore","pagesVisited","featuresUsed","actionsTaken","pageScore","min","featureScore","actionScore","Engagement","trackDwellTime","config","this","initFeature","type","featureId","userId","sessionId","dwellTimeMs","wasActive","properties","timestamp","Date","toISOString","trackSessionDepth","depthScore","durationMs","trackContentConsumption","contentId","contentType","percentageConsumed","timeSpentMs","completed","trackUserActivity","activityType","autoTrackDwell","options","doc","activeMs","lastTick","visibilityState","now","onVisibility","addEventListener","torndown","removeEventListener","autoTrack","win","idleAfterMs","pollMs","sessionStorage","getItem","undefined","toString","random","slice","startedAt","Set","lastInputAt","currentState","stateEnteredAt","origPush","history","pushState","origReplace","replaceState","onNav","args","r","apply","onInput","ev","target","featureAttr","closest","getAttribute","add","capture","passive","transition","next","prev","tick","ticker","setInterval","depthSent","sendDepth","size","clearInterval","evaluateCohortRules","userAttributes","rules","result","currentOperator","rule","ruleResult","evaluateRule","attribute","operator","value","logicalOperator","attributeValue","ruleValue","String","includes","Number","Array","isArray","length","num","generateCohortId","name","toLowerCase","replace","Cohorts","createCohort","definition","cohortId","description","cohortType","dynamic","timeWindow","updateCohort","updates","rest","deleteCohort","listCohorts","filter","isUserInCohort","createSegment","compareCohorts","calculateChurnRiskScore","factors","daysSinceLastActivity","max","usageTrend","sessionFrequencyChange","featureUsageChange","supportTickets","npsScore","paymentFailures","daysUntilRenewal","classifyRiskLevel","generateRecommendations","riskFactors","recommendations","factorActions","factor","push","ChurnAnalytics","trackUsageDecay","trackNPS","trackChurn","trackPreventionAction","updatePreventionOutcome","actionType","outcome","calculateARPU","totalRevenue","userCount","currency","arpu","amount","calculateNRR","startingMRR","expansion","contraction","churned","calculateGRR","monthlyToAnnual","mrr","calculateLTV","monthlyChurnRate","ltv","Monetization","trackRevenue","revenueType","restConfig","trackExpansion","fromPlan","toPlan","additionalRevenue","trackContraction","reducedRevenue","calculateConversionRate","entered","calculateDropOffRate","previousStep","currentStep","findBestPath","paths","reduce","best","current","completionRate","calculateMicroConversionScore","completedConversions","definitions","totalWeight","weightedScore","def","weight","find","c","id","generatePathId","steps","join","MultiPathFunnels","defineFunnel","funnelId","pathsWithIds","map","path","pathId","microConversions","goalEvent","updateFunnel","deleteFunnel","trackStep","trackMicroConversion","trackGoal","analyzeFunnel","comparePaths","listFunnels","calculateFCRRate","resolvedFirstContact","totalResolved","calculateAvgResponseTime","responseTimes","sum","a","b","classifyCSAT","formatDuration","ms","SupportAnalytics","trackTicket","status","createdAt","updateTicket","trackResponse","ticketId","agentId","responseTimeMs","trackResolution","resolutionTimeMs","interactionCount","firstContactResolution","trackCSAT","trackFeatureComplaint","calculateCAC","totalSpend","totalAcquisitions","calculateROAS","revenue","spend","calculateLTVCACRatio","cac","parseUTMParams","url","params","urlObj","URL","utmKeys","key","searchParams","get","classifySource","utmSource","utmMedium","source","medium","AcquisitionAnalytics","trackAcquisition","trackLifecycleTransition","createCampaign","trackCampaignSpend","pathToString","stringToPath","pathString","split","s","trim","calculateExitRate","exits","entries","isDeadEnd","exitRate","isIntendedEndPoint","threshold","calculatePathSimilarity","path1","path2","set1","set2","intersection","x","has","union","findCommonSubPaths","minLength","subPathCounts","Map","i","j","set","from","count","subPath","sort","PathAnalytics","trackTransition","trackFeatureSequence","definePath","calculateStdDev","values","mean","squareDiffs","pow","avgSquareDiff","sqrt","calculateZScore","stdDev","isAnomaly","zScore","sensitivity","abs","calculateAnomalyScore","absZ","classifySeverity","anomalyScore","checkAlertCondition","currentValue","condition","previousValue","changePercent","AlertsAnalytics","createAlert","alertId","enabled","updateAlert","deleteAlert","toggleAlert","listAlerts","acknowledgeAlert","instanceId","acknowledgedBy","resolveAlert","notes","muteAlert","durationMinutes","detectAnomalies","configureNotification","testNotification","channel","calculateFailedLoginRate","failed","total","isSuspiciousLoginPattern","failedAttempts","timeWindowMinutes","determineEventSeverity","eventType","success","SecurityAnalytics","trackLoginAttempt","severity","trackLogout","trackPasswordChange","forced","trackRoleChange","trackPermissionChange","trackDataAccess","trackDataExport","resourceType","recordCount","trackSuspiciousActivity","details","trackComplianceEvent","calculateMAPE","actual","predicted","calculateRMSE","sumSquaredError","calculateR2","ssRes","ssTot","classifyTrend","startValue","endValue","calculateAvgGrowthRate","totalGrowth","applyConfidenceInterval","stdError","confidenceLevel","margin","lower","upper","Forecasting","forecastActiveUsers","model","includeConfidence","forecastRevenue","metric","forecastMRR","forecastFeatureAdoption","forecastChurn","forecastSignups","compareScenarios","forecastCustomMetric","metricName","customMetricName","EngagementTracker","constructor","client","dwell","contentConsumption","activity","CohortTracker","create","segment","isMember","ChurnTracker","decay","periods","nps","feedback","churnType","reason","prevention","MonetizationTracker","MultiPathFunnelTracker","define","step","microConversion","conversionId","SupportTracker","ticket","subject","category","priority","update","csat","featureComplaint","complaintType","AcquisitionTracker","acquired","campaign","campaignId","date","lifecycle","fromStage","toStage","PathTracker","fromScreen","toScreen","sequence","feature","order","AlertTracker","acknowledge","resolve","mute","SecurityTracker","login","roleChange","changedBy","previousRole","newRole","permissionChange","permission","action","dataAccess","accessType","compliance","ForecastingTracker","activeUsers","granularity","featureAdoption","churn"],"sourceRoot":""}