ainamika-sdk 1.0.8 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ainamika-sdk.js +1 -1
- package/dist/ainamika-sdk.js.map +1 -1
- package/package.json +1 -1
package/dist/ainamika-sdk.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.AInamikaSDKPro=t():e.AInamikaSDKPro=t()}("undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this,function(){return function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return T}});var r=function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},r.apply(this,arguments)},n=function(e,t,r,n){return new(r||(r=Promise))(function(o,i){function s(e){try{c(n.next(e))}catch(e){i(e)}}function a(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(s,a)}c((n=n.apply(e,t||[])).next())})},o=function(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&a[0]?n.return:a[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,a[1])).done)return o;switch(n=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,n=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){i.label=a[1];break}if(6===a[0]&&i.label<o[1]){i.label=o[1],o=a;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(a);break}o[2]&&i.ops.pop(),i.trys.pop();continue}a=t.call(e,i)}catch(e){a=[6,e],n=0}finally{r=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}},i=function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))},s=function(){function e(e){this.breadcrumbs=[],this.errorCount=0,this.errorDebounceMap=new Map,this.config=r({captureScreenshots:!0,captureDomSnapshots:!0,maxStackTraceDepth:50,maxErrorsPerSession:100,debounceMs:1e3,enableNetworkTracking:!0,enableConsoleCapture:!0},e),this.authManager=e.authManager,this.sessionId=this.generateSessionId(),this.originalConsole=r({},console),this.initialize()}return e.prototype.initialize=function(){var e=this;window.addEventListener("error",function(t){e.handleError({type:"javascript",message:t.message,filename:t.filename,line:t.lineno,column:t.colno,error:t.error})}),window.addEventListener("unhandledrejection",function(t){var r;e.handleError({type:"unhandled",message:(null===(r=t.reason)||void 0===r?void 0:r.message)||"Unhandled Promise Rejection",error:t.reason,promise:!0})}),this.config.enableNetworkTracking&&this.setupNetworkTracking(),this.config.enableConsoleCapture&&this.setupConsoleCapture(),this.setupNavigationTracking(),this.setupClickTracking(),console.log("[AInamika Error Tracker] Initialized successfully")},e.prototype.generateSessionId=function(){return"session_".concat(Date.now(),"_").concat(Math.random().toString(36).substr(2,9))},e.prototype.addBreadcrumb=function(e){this.breadcrumbs.push(r(r({},e),{timestamp:Date.now()})),this.breadcrumbs.length>50&&(this.breadcrumbs=this.breadcrumbs.slice(-50))},e.prototype.handleError=function(e){if(this.errorCount>=this.config.maxErrorsPerSession)console.warn("[AInamika Error Tracker] Max errors per session reached");else{var t="".concat(e.message,"_").concat(e.filename,"_").concat(e.line),r=Date.now();if(this.errorDebounceMap.has(t)&&r-this.errorDebounceMap.get(t)<this.config.debounceMs)return;this.errorDebounceMap.set(t,r),this.errorCount++,this.captureError(e)}},e.prototype.captureError=function(e){return n(this,void 0,void 0,function(){var t,r,n;return o(this,function(o){switch(o.label){case 0:return o.trys.push([0,4,,5]),t={client_id:this.config.clientId,error_type:e.type||"javascript",message:e.message||"Unknown error",stack_trace:this.extractStackTrace(e.error),url:window.location.href,user_agent:navigator.userAgent,timestamp:Date.now(),error_metadata:{line:e.line,column:e.column,filename:e.filename,userId:this.userId,sessionId:this.sessionId,breadcrumbs:i([],this.breadcrumbs,!0),networkInfo:this.getNetworkInfo(),performance:this.getPerformanceInfo()},severity:this.assessSeverity(e),session_id:this.sessionId,user_id:this.userId},this.config.captureDomSnapshots&&(t.dom_snapshot=this.captureDomSnapshot()),this.config.captureScreenshots?(r=t,[4,this.captureScreenshot()]):[3,2];case 1:r.screen_snapshot=o.sent(),o.label=2;case 2:return[4,this.sendError(t)];case 3:return o.sent(),this.addBreadcrumb({type:"error",message:"".concat(t.error_type,": ").concat(t.message),data:{severity:t.severity}}),[3,5];case 4:return n=o.sent(),console.error("[AInamika Error Tracker] Failed to capture error:",n),[3,5];case 5:return[2]}})})},e.prototype.extractStackTrace=function(e){if(!e||!e.stack)return"";var t=e.stack.split("\n"),r=this.config.maxStackTraceDepth;return t.slice(0,r).join("\n")},e.prototype.assessSeverity=function(e){var t,r=(null===(t=e.message)||void 0===t?void 0:t.toLowerCase())||"";return r.includes("out of memory")||r.includes("security")||r.includes("permission denied")||"unhandled"===e.type?"critical":r.includes("network")||r.includes("timeout")||r.includes("failed to fetch")||r.includes("cors")?"high":r.includes("undefined")||r.includes("null")||r.includes("cannot read property")?"medium":"low"},e.prototype.captureDomSnapshot=function(){try{var e={url:window.location.href,title:document.title,viewport:{width:window.innerWidth,height:window.innerHeight},elements:this.extractDomElements()};return JSON.stringify(e)}catch(e){return console.error("[AInamika Error Tracker] Failed to capture DOM snapshot:",e),""}},e.prototype.extractDomElements=function(){var e=this,t=[];return["body > *","[id]",'[class*="error"]','[class*="modal"]',"form","button",'input[type="submit"]'].forEach(function(r){try{var n=document.querySelectorAll(r);Array.from(n).slice(0,100-t.length).forEach(function(r){var n;t.push({tagName:r.tagName,id:r.id,className:r.className,textContent:null===(n=r.textContent)||void 0===n?void 0:n.substring(0,100),attributes:e.getElementAttributes(r)})})}catch(e){}}),t},e.prototype.getElementAttributes=function(e){var t={};return["id","class","type","name","value","href","src"].forEach(function(r){var n=e.getAttribute(r);n&&(t[r]=n)}),t},e.prototype.captureScreenshot=function(){return n(this,void 0,void 0,function(){var e;return o(this,function(t){switch(t.label){case 0:return t.trys.push([0,3,,4]),"function"!=typeof window.html2canvas?[3,2]:[4,window.html2canvas(document.body,{height:Math.min(window.innerHeight,1e3),width:Math.min(window.innerWidth,1e3),useCORS:!0})];case 1:return[2,t.sent().toDataURL("image/jpeg",.7)];case 2:return[2,""];case 3:return e=t.sent(),console.error("[AInamika Error Tracker] Failed to capture screenshot:",e),[2,""];case 4:return[2]}})})},e.prototype.getNetworkInfo=function(){var e=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return e?{effectiveType:e.effectiveType,downlink:e.downlink,rtt:e.rtt,saveData:e.saveData}:{}},e.prototype.getPerformanceInfo=function(){var e={};if(performance.memory&&(e.memory={usedJSHeapSize:performance.memory.usedJSHeapSize,totalJSHeapSize:performance.memory.totalJSHeapSize,jsHeapSizeLimit:performance.memory.jsHeapSizeLimit}),performance.timing){var t=performance.timing;e.timing={domContentLoaded:t.domContentLoadedEventEnd-t.navigationStart,load:t.loadEventEnd-t.navigationStart},performance.getEntriesByType&&performance.getEntriesByType("paint").forEach(function(t){"first-paint"===t.name?e.timing.firstPaint=t.startTime:"first-contentful-paint"===t.name&&(e.timing.firstContentfulPaint=t.startTime)})}return e},e.prototype.setupNetworkTracking=function(){var e=this,t=window.fetch;window.fetch=function(){for(var r=[],i=0;i<arguments.length;i++)r[i]=arguments[i];return n(e,void 0,void 0,function(){var e,n,i,s;return o(this,function(o){switch(o.label){case 0:e=Date.now(),n=r[0]instanceof Request?r[0].url:String(r[0]),o.label=1;case 1:return o.trys.push([1,3,,4]),[4,t.apply(void 0,r)];case 2:return i=o.sent(),this.addBreadcrumb({type:"network",message:"Fetch ".concat(i.status," ").concat(n),data:{url:n,status:i.status,duration:Date.now()-e}}),i.ok||this.handleError({type:"network",message:"Network request failed: ".concat(i.status," ").concat(i.statusText),url:n,status:i.status}),[2,i];case 3:throw s=o.sent(),this.addBreadcrumb({type:"network",message:"Fetch failed ".concat(n),data:{url:n,error:(null==s?void 0:s.message)||"Unknown error"}}),this.handleError({type:"network",message:"Network request failed: ".concat((null==s?void 0:s.message)||"Unknown error"),url:n,error:s}),s;case 4:return[2]}})})};var r=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(e,t,n,o,i){return this._errorTracker={method:e,url:t,startTime:Date.now()},r.call(this,e,t,n||!0,o,i)},XMLHttpRequest.prototype.send=function(){for(var e=this,t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];var n=this._errorTracker;return this.addEventListener("loadend",function(){if(n){var t=Date.now()-n.startTime;e.status>=400&&e.dispatchEvent(new CustomEvent("networkerror",{detail:{type:"network",message:"XHR request failed: ".concat(e.status," ").concat(e.statusText),url:n.url,status:e.status}})),e.dispatchEvent(new CustomEvent("networkbreadcrumb",{detail:{type:"network",message:"XHR ".concat(e.status," ").concat(n.url),data:{method:n.method,url:n.url,status:e.status,duration:t}}}))}}),s.call.apply(s,i([this],t,!1))},document.addEventListener("networkerror",function(t){e.handleError(t.detail)}),document.addEventListener("networkbreadcrumb",function(t){e.addBreadcrumb(t.detail)})},e.prototype.setupConsoleCapture=function(){var e=this;["error","warn"].forEach(function(t){var r=e.originalConsole[t];console[t]=function(){for(var n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];"function"==typeof r&&r.call.apply(r,i([console],n,!1)),"error"===t&&e.handleError({type:"console",message:n.map(function(e){return String(e)}).join(" "),consoleMethod:t}),e.addBreadcrumb({type:"console",message:"Console ".concat(t,": ").concat(n.map(function(e){return String(e)}).join(" ")),data:{level:t}})}})},e.prototype.setupNavigationTracking=function(){var e=this,t=window.location.href,r=function(){var r=window.location.href;r!==t&&(e.addBreadcrumb({type:"navigation",message:"Navigation from ".concat(t," to ").concat(r),data:{from:t,to:r}}),t=r)};window.addEventListener("popstate",r),window.addEventListener("hashchange",r);var n=history.pushState,o=history.replaceState;history.pushState=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];n.apply(this,e),setTimeout(r,0)},history.replaceState=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];o.apply(this,e),setTimeout(r,0)}},e.prototype.setupClickTracking=function(){var e=this;document.addEventListener("click",function(t){var r,n=t.target;if(n){var o=e.getElementSelector(n),i=(null===(r=n.textContent)||void 0===r?void 0:r.trim().substring(0,50))||"";e.addBreadcrumb({type:"click",message:"Clicked ".concat(o).concat(i?": ".concat(i):""),data:{selector:o,text:i,tagName:n.tagName,id:n.id,className:n.className}})}})},e.prototype.getElementSelector=function(e){if(e.id)return"#".concat(e.id);if(e.className){var t=e.className.split(" ").filter(function(e){return e}).slice(0,2);if(t.length)return".".concat(t.join("."))}return e.tagName.toLowerCase()},e.prototype.sendError=function(e){return n(this,void 0,void 0,function(){var t,n,i,s;return o(this,function(o){switch(o.label){case 0:return o.trys.push([0,5,,6]),t={"Content-Type":"application/json"},this.authManager?[4,this.authManager.getAuthHeaders()]:[3,2];case 1:return n=o.sent(),t=r(r({},t),n),[3,3];case 2:this.config.apiKey&&(t.Authorization="Bearer ".concat(this.config.apiKey)),o.label=3;case 3:return[4,fetch("".concat(this.config.endpoint,"/api/v1/errors"),{method:"POST",headers:t,body:JSON.stringify(e)})];case 4:if(!(i=o.sent()).ok)throw new Error("Failed to send error: ".concat(i.status," ").concat(i.statusText));return console.log("[AInamika Error Tracker] Error sent successfully"),[3,6];case 5:return s=o.sent(),console.error("[AInamika Error Tracker] Failed to send error:",s),this.storeErrorLocally(e),[3,6];case 6:return[2]}})})},e.prototype.storeErrorLocally=function(e){try{var t=localStorage.getItem("ainamika_errors")||"[]",r=JSON.parse(t);r.push(e),r.length>50&&r.splice(0,r.length-50),localStorage.setItem("ainamika_errors",JSON.stringify(r))}catch(e){console.error("[AInamika Error Tracker] Failed to store error locally:",e)}},e.prototype.captureException=function(e,t){this.handleError({type:"custom",message:e.message,error:e,context:t})},e.prototype.setUser=function(e){this.userId=e},e.prototype.addTag=function(e,t){this.config.clientId||(this.config.clientId+="_".concat(e,":").concat(t))},e.prototype.flushStoredErrors=function(){return n(this,void 0,void 0,function(){var e,t,r,n,i,s;return o(this,function(o){switch(o.label){case 0:if(o.trys.push([0,5,,6]),!(e=localStorage.getItem("ainamika_errors")))return[2];if(0===(t=JSON.parse(e)).length)return[2];console.log("[AInamika Error Tracker] Flushing ".concat(t.length," stored errors")),r=0,n=t,o.label=1;case 1:return r<n.length?(i=n[r],[4,this.sendError(i)]):[3,4];case 2:o.sent(),o.label=3;case 3:return r++,[3,1];case 4:return localStorage.removeItem("ainamika_errors"),[3,6];case 5:return s=o.sent(),console.error("[AInamika Error Tracker] Failed to flush stored errors:",s),[3,6];case 6:return[2]}})})},e}(),a="undefined"!=typeof window&&window.__AINAMIKA_CONFIG__?window.__AINAMIKA_CONFIG__:{API_BASE_URL:"https://ainamika-webhook-proxy-366651516847.asia-south1.run.app",APP_ENV:"production",DEBUG:!1},c={EVENTS:"".concat(a.API_BASE_URL,"/api/v1/events"),ERRORS:"".concat(a.API_BASE_URL,"/api/errors/report"),CONFIG:"".concat(a.API_BASE_URL,"/api/v1/sdk/config"),DEBUG_EVENTS:"".concat(a.API_BASE_URL,"/api/v1/debug/events"),PROJECTS_LOOKUP:"".concat(a.API_BASE_URL,"/api/v1/projects/lookup"),SAMPLING_CHECK:"".concat(a.API_BASE_URL,"/api/v1/projects/sampling/check")},u=function(){return u=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},u.apply(this,arguments)},l=function(e,t,r,n){return new(r||(r=Promise))(function(o,i){function s(e){try{c(n.next(e))}catch(e){i(e)}}function a(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(s,a)}c((n=n.apply(e,t||[])).next())})},h=function(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&a[0]?n.return:a[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,a[1])).done)return o;switch(n=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,n=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){i.label=a[1];break}if(6===a[0]&&i.label<o[1]){i.label=o[1],o=a;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(a);break}o[2]&&i.ops.pop(),i.trys.pop();continue}a=t.call(e,i)}catch(e){a=[6,e],n=0}finally{r=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}},d=function(){function e(e){void 0===e&&(e={}),this.STORAGE_KEY="ainamika_error_queue",this.METADATA_KEY="ainamika_error_metadata",this.isProcessing=!1,this.config=u({maxStorageSize:5242880,maxRetries:5,retryInterval:3e4,compressionEnabled:!0,encryptionEnabled:!1},e),this.initialize()}return e.prototype.initialize=function(){var e=this;this.cleanupOldErrors(),this.startRetryTimer(),this.setupStorageListener(),setTimeout(function(){return e.processQueue()},1e3)},e.prototype.storeError=function(e){return l(this,void 0,void 0,function(){var t,r,n,o=this;return h(this,function(i){switch(i.label){case 0:return i.trys.push([0,2,,3]),t=this.generateErrorId(),r={id:t,errorData:this.config.compressionEnabled?this.compressData(e):e,timestamp:Date.now(),retryCount:0},[4,this.addToQueue(r)];case 1:return i.sent(),this.updateMetadata(),setTimeout(function(){return o.processQueue()},100),[2,t];case 2:throw n=i.sent(),console.error("[AInamika Error Storage] Failed to store error:",n),n;case 3:return[2]}})})},e.prototype.getStoredErrors=function(){var e=this;try{var t=localStorage.getItem(this.STORAGE_KEY);return t?JSON.parse(t).map(function(t){return u(u({},t),{errorData:e.config.compressionEnabled?e.decompressData(t.errorData):t.errorData})}):[]}catch(e){return console.error("[AInamika Error Storage] Failed to get stored errors:",e),[]}},e.prototype.removeError=function(e){try{var t=this.getQueueRaw(),r=t.filter(function(t){return t.id!==e});return r.length!==t.length&&(localStorage.setItem(this.STORAGE_KEY,JSON.stringify(r)),this.updateMetadata(),!0)}catch(e){return console.error("[AInamika Error Storage] Failed to remove error:",e),!1}},e.prototype.clearAll=function(){try{localStorage.removeItem(this.STORAGE_KEY),localStorage.removeItem(this.METADATA_KEY),console.log("[AInamika Error Storage] All errors cleared")}catch(e){console.error("[AInamika Error Storage] Failed to clear errors:",e)}},e.prototype.getStorageStats=function(){try{var e=this.getQueueRaw(),t=new Blob([localStorage.getItem(this.STORAGE_KEY)||""]).size,r=e.map(function(e){return e.timestamp}).sort();return{errorCount:e.length,totalSize:t,oldestError:r[0],newestError:r[r.length-1]}}catch(e){return console.error("[AInamika Error Storage] Failed to get storage stats:",e),{errorCount:0,totalSize:0}}},e.prototype.processQueue=function(){return l(this,void 0,void 0,function(){var e,t,r,n,o;return h(this,function(i){switch(i.label){case 0:if(this.isProcessing)return[2];this.isProcessing=!0,i.label=1;case 1:if(i.trys.push([1,,8,9]),0===(e=this.getQueueRaw()).length)return[2];console.log("[AInamika Error Storage] Processing ".concat(e.length," queued errors")),t=0,r=e,i.label=2;case 2:if(!(t<r.length))return[3,7];if((n=r[t]).retryCount>=this.config.maxRetries)return console.warn("[AInamika Error Storage] Max retries reached for error ".concat(n.id)),this.removeError(n.id),[3,6];if(n.lastRetry&&Date.now()-n.lastRetry<this.config.retryInterval)return[3,6];i.label=3;case 3:return i.trys.push([3,5,,6]),[4,this.sendError(n)];case 4:return i.sent()?(this.removeError(n.id),console.log("[AInamika Error Storage] Successfully sent error ".concat(n.id))):this.incrementRetryCount(n.id),[3,6];case 5:return o=i.sent(),console.error("[AInamika Error Storage] Failed to send error ".concat(n.id,":"),o),this.incrementRetryCount(n.id),[3,6];case 6:return t++,[3,2];case 7:return[3,9];case 8:return this.isProcessing=!1,[7];case 9:return[2]}})})},e.prototype.retryError=function(e){return l(this,void 0,void 0,function(){var t,r,n;return h(this,function(o){switch(o.label){case 0:if(t=this.getQueueRaw(),!(r=t.find(function(t){return t.id===e})))return[2,!1];o.label=1;case 1:return o.trys.push([1,3,,4]),[4,this.sendError(r)];case 2:return o.sent()?(this.removeError(e),[2,!0]):(this.incrementRetryCount(e),[2,!1]);case 3:return n=o.sent(),console.error("[AInamika Error Storage] Failed to retry error ".concat(e,":"),n),this.incrementRetryCount(e),[2,!1];case 4:return[2]}})})},e.prototype.addToQueue=function(e){return l(this,void 0,void 0,function(){var t,r;return h(this,function(n){if((t=this.getQueueRaw()).push(e),r=JSON.stringify(t),new Blob([r]).size>this.config.maxStorageSize)for(;t.length>0&&new Blob([JSON.stringify(t)]).size>this.config.maxStorageSize;)t.shift(),console.warn("[AInamika Error Storage] Removed old error due to size limit");return localStorage.setItem(this.STORAGE_KEY,JSON.stringify(t)),[2]})})},e.prototype.getQueueRaw=function(){try{var e=localStorage.getItem(this.STORAGE_KEY);return e?JSON.parse(e):[]}catch(e){return console.error("[AInamika Error Storage] Failed to parse stored errors:",e),[]}},e.prototype.incrementRetryCount=function(e){try{var t=this.getQueueRaw(),r=t.findIndex(function(t){return t.id===e});-1!==r&&(t[r].retryCount++,t[r].lastRetry=Date.now(),localStorage.setItem(this.STORAGE_KEY,JSON.stringify(t)))}catch(e){console.error("[AInamika Error Storage] Failed to increment retry count:",e)}},e.prototype.sendError=function(e){return l(this,void 0,void 0,function(){var t,r,n,o;return h(this,function(i){switch(i.label){case 0:return i.trys.push([0,2,,3]),t=this.config.compressionEnabled?this.decompressData(e.errorData):e.errorData,r=t.endpoint||c.ERRORS,n=t.apiKey||"",[4,fetch("".concat(r,"/api/v1/errors"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:n?"Bearer ".concat(n):""},body:JSON.stringify(t)})];case 1:return[2,i.sent().ok];case 2:return o=i.sent(),console.error("[AInamika Error Storage] Network error sending stored error:",o),[2,!1];case 3:return[2]}})})},e.prototype.compressData=function(e){try{var t=JSON.stringify(e);return btoa(t)}catch(t){return console.warn("[AInamika Error Storage] Compression failed, storing uncompressed:",t),e}},e.prototype.decompressData=function(e){try{if("string"==typeof e&&e.length>0){var t=atob(e);return JSON.parse(t)}return e}catch(t){return console.warn("[AInamika Error Storage] Decompression failed, returning raw data:",t),e}},e.prototype.generateErrorId=function(){return"error_".concat(Date.now(),"_").concat(Math.random().toString(36).substr(2,9))},e.prototype.cleanupOldErrors=function(){try{var e=this.getQueueRaw(),t=Date.now()-6048e5,r=e.filter(function(e){return e.timestamp>t});r.length!==e.length&&(localStorage.setItem(this.STORAGE_KEY,JSON.stringify(r)),console.log("[AInamika Error Storage] Cleaned up ".concat(e.length-r.length," old errors")))}catch(e){console.error("[AInamika Error Storage] Failed to cleanup old errors:",e)}},e.prototype.startRetryTimer=function(){var e=this;this.retryTimer=window.setInterval(function(){e.processQueue()},this.config.retryInterval)},e.prototype.setupStorageListener=function(){var e=this;window.addEventListener("storage",function(t){t.key===e.STORAGE_KEY&&(console.log("[AInamika Error Storage] Storage updated from another tab"),setTimeout(function(){return e.processQueue()},1e3))}),window.addEventListener("online",function(){console.log("[AInamika Error Storage] Network back online, processing queue"),setTimeout(function(){return e.processQueue()},1e3)}),window.addEventListener("offline",function(){console.log("[AInamika Error Storage] Network offline, errors will be queued")})},e.prototype.updateMetadata=function(){try{var e=this.getStorageStats(),t=u({lastUpdate:Date.now()},e);localStorage.setItem(this.METADATA_KEY,JSON.stringify(t))}catch(e){console.error("[AInamika Error Storage] Failed to update metadata:",e)}},e.prototype.exportErrors=function(){try{var e=this.getStoredErrors(),t={timestamp:Date.now(),version:"1.0",stats:this.getStorageStats(),errors:e};return JSON.stringify(t,null,2)}catch(e){return console.error("[AInamika Error Storage] Failed to export errors:",e),"{}"}},e.prototype.importErrors=function(e){try{var t=JSON.parse(e);if(!t.errors||!Array.isArray(t.errors))throw new Error("Invalid export format");this.clearAll();for(var r=0,n=t.errors;r<n.length;r++){var o=n[r];this.storeError(o.errorData)}return console.log("[AInamika Error Storage] Imported ".concat(t.errors.length," errors")),!0}catch(e){return console.error("[AInamika Error Storage] Failed to import errors:",e),!1}},e.prototype.destroy=function(){this.retryTimer&&(clearInterval(this.retryTimer),this.retryTimer=void 0),this.processQueue(),console.log("[AInamika Error Storage] Storage instance destroyed")},e}(),p=(function(){function e(){}e.getAinamikaStorageUsage=function(){var e=0,t=0,r=0;for(var n in localStorage)if(localStorage.hasOwnProperty(n)){var o=new Blob([localStorage.getItem(n)||""]).size;e+=o,n.startsWith("ainamika_error")?t+=o:n.startsWith("ainamika_")&&(r+=o)}return{totalSize:e,errorSize:t,otherSize:r}},e.checkStorageSpace=function(e){try{var t="ainamika_storage_test",r="x".repeat(Math.min(e,1048576));return localStorage.setItem(t,r),localStorage.removeItem(t),!0}catch(e){return!1}},e.cleanupAllAinamikaStorage=function(){var e=[];for(var t in localStorage)t.startsWith("ainamika_")&&e.push(t);e.forEach(function(e){return localStorage.removeItem(e)}),console.log("[AInamika Storage Utils] Cleaned up ".concat(e.length," storage keys"))},e.generateStorageReport=function(){var t=new d;return{usage:e.getAinamikaStorageUsage(),errors:t.getStoredErrors(),metadata:t.getStorageStats()}}}(),function(){return p=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},p.apply(this,arguments)}),f=function(){function e(){this.userId=null,this.userProperties={},this.initializeUser()}return e.prototype.initializeUser=function(){this.userId=this.getOrCreateUserId()},e.prototype.getOrCreateUserId=function(){try{var e=localStorage.getItem("ainamika_user_id");return e||(e=this.generateAnonymousId(),localStorage.setItem("ainamika_user_id",e)),e}catch(e){return console.warn("[UserManager] localStorage not available, using session ID"),this.generateAnonymousId()}},e.prototype.generateAnonymousId=function(){return"anon_"+Math.random().toString(36).substr(2,9)+"_"+Date.now()},e.prototype.getUserId=function(){return this.userId||(this.userId=this.getOrCreateUserId()),this.userId},e.prototype.getUserProperties=function(){return p({},this.userProperties)},e.prototype.identifyUser=function(e,t){var r=this.getUserId();try{localStorage.setItem("ainamika_user_id",e),this.userId=e,t&&(this.userProperties=p(p({},this.userProperties),t)),console.log("[UserManager] User identified: ".concat(r," → ").concat(e))}catch(e){console.error("[UserManager] Error identifying user:",e)}},e.prototype.updateUserProperties=function(e){this.userProperties=p(p({},this.userProperties),e)},e.prototype.clearUser=function(){try{localStorage.removeItem("ainamika_user_id"),this.userId=null,this.userProperties={},this.initializeUser()}catch(e){console.error("[UserManager] Error clearing user:",e)}},e.prototype.getUserIdentificationEvent=function(e){return{event:"user_identified",previous_id:this.getUserId(),user_id:e,timestamp:Date.now(),properties:this.userProperties}},e.prototype.isAnonymousUser=function(){return this.getUserId().startsWith("anon_")},e.prototype.getUserType=function(){return this.isAnonymousUser()?"anonymous":"authenticated"},e}(),g=function(){return g=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},g.apply(this,arguments)},m=function(){function e(){this.userJourney=[],this.lastEventTime=0,this.sequenceIndex=0,this.maxJourneyLength=50,this.journeyAnalysisThreshold=5,this.journeyStartTime=Date.now()}return e.prototype.trackEvent=function(e,t){var r=Date.now(),n=this.lastEventTime?r-this.lastEventTime:0,o={eventName:e,timestamp:r,properties:g(g({},t),{timeSinceLastEvent:n,journeyPosition:this.sequenceIndex}),sequenceIndex:this.sequenceIndex++};this.userJourney.push(o),this.lastEventTime=r,this.userJourney.length>this.maxJourneyLength&&(this.userJourney=this.userJourney.slice(-this.maxJourneyLength)),console.log("[JourneyTracker] Event tracked: ".concat(e," (position: ").concat(o.sequenceIndex,")"))},e.prototype.getContext=function(){var e=Date.now();return{journeySequence:this.getJourneySequence(),eventCount:this.userJourney.length,lastEventTime:this.lastEventTime,journeyStartTime:this.journeyStartTime,timeSinceLastEvent:this.lastEventTime?e-this.lastEventTime:0}},e.prototype.getJourneySequence=function(){return this.userJourney.map(function(e){return e.eventName})},e.prototype.getJourneyData=function(){return function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))}([],this.userJourney,!0)},e.prototype.shouldAnalyzeJourney=function(){return this.userJourney.length>=this.journeyAnalysisThreshold&&this.userJourney.length%this.journeyAnalysisThreshold===0},e.prototype.getJourneyForAnalysis=function(){var e=Date.now()-this.journeyStartTime,t=this.calculateAverageTimeBetweenEvents();return{journey:this.userJourney.map(function(e){return{name:e.eventName,timestamp:e.timestamp,properties:e.properties}}),metadata:{journeyLength:this.userJourney.length,journeyDuration:e,avgTimeBetweenEvents:t,startTime:this.journeyStartTime,endTime:this.lastEventTime}}},e.prototype.calculateAverageTimeBetweenEvents=function(){if(this.userJourney.length<2)return 0;for(var e=0,t=1;t<this.userJourney.length;t++)e+=this.userJourney[t].timestamp-this.userJourney[t-1].timestamp;return Math.round(e/(this.userJourney.length-1))},e.prototype.findPatterns=function(){var e={};if(this.userJourney.length<3)return e;for(var t=0;t<=this.userJourney.length-3;t++){var r=this.userJourney.slice(t,t+3).map(function(e){return e.eventName}).join(" → ");e[r]=(e[r]||0)+1}return Object.fromEntries(Object.entries(e).filter(function(e){return e[0],e[1]>1}))},e.prototype.clearJourney=function(){this.userJourney=[],this.sequenceIndex=0,this.lastEventTime=0,this.journeyStartTime=Date.now()},e.prototype.getJourneySegment=function(e){return this.userJourney.slice(-e)},e.prototype.detectPotentialFunnel=function(){for(var e=this.getJourneySequence().slice(-5),t=0,r=Object.entries({signup_flow:["view_pricing","click_signup","enter_email"],purchase_flow:["view_product","add_to_cart","view_cart"],onboarding_flow:["user_signup","profile_setup","tutorial_start"]});t<r.length;t++){var n=r[t],o=n[0];if(n[1].filter(function(t){return e.includes(t)}).length>=2)return o}return null},e}(),y=function(e,t,r,n){return new(r||(r=Promise))(function(o,i){function s(e){try{c(n.next(e))}catch(e){i(e)}}function a(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(s,a)}c((n=n.apply(e,t||[])).next())})},v=function(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&a[0]?n.return:a[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,a[1])).done)return o;switch(n=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,n=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){i.label=a[1];break}if(6===a[0]&&i.label<o[1]){i.label=o[1],o=a;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(a);break}o[2]&&i.ops.pop(),i.trys.pop();continue}a=t.call(e,i)}catch(e){a=[6,e],n=0}finally{r=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}},b=function(){function e(e,t,r){void 0===r&&(r=!1),this.accessToken=null,this.refreshToken=null,this.tokenExpiry=null,this.clientId=e,this.apiEndpoint=t,this.debug=r,this.loadTokens()}return e.prototype.initialize=function(){return y(this,void 0,void 0,function(){var e,t;return v(this,function(r){switch(r.label){case 0:return r.trys.push([0,4,,5]),this.isTokenValid()?(this.debugLog("Using existing valid token"),[2,!0]):this.refreshToken?[4,this.refreshAccessToken()]:[3,2];case 1:if(r.sent())return[2,!0];r.label=2;case 2:return[4,this.requestTokens()];case 3:return(e=r.sent())?(this.setTokens(e),[2,!0]):[2,!1];case 4:return t=r.sent(),this.debugLog("Authentication initialization failed:",t),[2,!1];case 5:return[2]}})})},e.prototype.requestTokens=function(){return y(this,void 0,void 0,function(){var e,t;return v(this,function(r){switch(r.label){case 0:return r.trys.push([0,3,,4]),[4,fetch("".concat(this.apiEndpoint,"/api/v1/auth/token"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_id:this.clientId})})];case 1:if(!(e=r.sent()).ok)throw new Error("Token request failed: ".concat(e.status));return[4,e.json()];case 2:return[2,r.sent()];case 3:return t=r.sent(),this.debugLog("Token request error:",t),[2,null];case 4:return[2]}})})},e.prototype.refreshAccessToken=function(){return y(this,void 0,void 0,function(){var e,t,r;return v(this,function(n){switch(n.label){case 0:if(!this.refreshToken)return[2,!1];n.label=1;case 1:return n.trys.push([1,4,,5]),[4,fetch("".concat(this.apiEndpoint,"/api/v1/auth/refresh"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refresh_token:this.refreshToken})})];case 2:return(e=n.sent()).ok?[4,e.json()]:(this.clearTokens(),[2,!1]);case 3:return t=n.sent(),this.setTokens(t),[2,!0];case 4:return r=n.sent(),this.debugLog("Token refresh error:",r),[2,!1];case 5:return[2]}})})},e.prototype.getAccessToken=function(){return y(this,void 0,void 0,function(){return v(this,function(e){switch(e.label){case 0:return this.shouldRefreshToken()?[4,this.refreshAccessToken()]:[3,2];case 1:e.sent(),e.label=2;case 2:return this.isTokenValid()?[3,4]:[4,this.initialize()];case 3:if(!e.sent())return[2,null];e.label=4;case 4:return[2,this.accessToken]}})})},e.prototype.getAuthHeaders=function(){return y(this,void 0,void 0,function(){var e;return v(this,function(t){switch(t.label){case 0:return[4,this.getAccessToken()];case 1:return(e=t.sent())?[2,{Authorization:"Bearer ".concat(e)}]:[2,{"X-Client-ID":this.clientId}]}})})},e.prototype.isTokenValid=function(){return!(!this.accessToken||!this.tokenExpiry)&&Date.now()<this.tokenExpiry},e.prototype.shouldRefreshToken=function(){return!(!this.tokenExpiry||!this.refreshToken)&&Date.now()>this.tokenExpiry-3e5},e.prototype.setTokens=function(e){this.accessToken=e.access_token,this.refreshToken=e.refresh_token||this.refreshToken,this.tokenExpiry=Date.now()+1e3*e.expires_in,this.saveTokens(),this.scheduleTokenRefresh(),this.debugLog("Tokens set successfully")},e.prototype.scheduleTokenRefresh=function(){var e=this;this.refreshTimer&&clearTimeout(this.refreshTimer);var t=Math.max(0,this.tokenExpiry-Date.now()-3e5);this.refreshTimer=setTimeout(function(){e.refreshAccessToken()},t)},e.prototype.saveTokens=function(){if("undefined"!=typeof window&&window.localStorage){var e={accessToken:this.accessToken,refreshToken:this.refreshToken,tokenExpiry:this.tokenExpiry};localStorage.setItem("ainamika_auth_".concat(this.clientId),JSON.stringify(e))}},e.prototype.loadTokens=function(){if("undefined"!=typeof window&&window.localStorage){var e=localStorage.getItem("ainamika_auth_".concat(this.clientId));if(e)try{var t=JSON.parse(e);this.accessToken=t.accessToken,this.refreshToken=t.refreshToken,this.tokenExpiry=t.tokenExpiry,this.isTokenValid()&&this.scheduleTokenRefresh()}catch(e){this.debugLog("Failed to load stored tokens:",e)}}},e.prototype.clearTokens=function(){this.accessToken=null,this.refreshToken=null,this.tokenExpiry=null,"undefined"!=typeof window&&window.localStorage&&localStorage.removeItem("ainamika_auth_".concat(this.clientId)),this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=void 0)},e.prototype.logout=function(){return y(this,void 0,void 0,function(){var e;return v(this,function(t){switch(t.label){case 0:return t.trys.push([0,3,4,5]),this.accessToken?[4,fetch("".concat(this.apiEndpoint,"/api/v1/auth/logout"),{method:"POST",headers:{Authorization:"Bearer ".concat(this.accessToken)}})]:[3,2];case 1:t.sent(),t.label=2;case 2:return[3,5];case 3:return e=t.sent(),this.debugLog("Logout error:",e),[3,5];case 4:return this.clearTokens(),[7];case 5:return[2]}})})},e.prototype.debugLog=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this.debug&&console.log.apply(console,function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))}(["[Ainamika Auth]"],e,!1))},e}(),k=function(){return k=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},k.apply(this,arguments)},w=function(e,t,r,n){return new(r||(r=Promise))(function(o,i){function s(e){try{c(n.next(e))}catch(e){i(e)}}function a(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(s,a)}c((n=n.apply(e,t||[])).next())})},S=function(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&a[0]?n.return:a[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,a[1])).done)return o;switch(n=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,n=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){i.label=a[1];break}if(6===a[0]&&i.label<o[1]){i.label=o[1],o=a;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(a);break}o[2]&&i.ops.pop(),i.trys.pop();continue}a=t.call(e,i)}catch(e){a=[6,e],n=0}finally{r=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}},E=function(){function e(e){if(this.eventQueue=[],this.isInitialized=!1,this.batchRetryCount=0,this.maxBatchRetries=5,this.domHashCache={},this.lastDomHash="",this.lastConfigHash="",this.mutationDebounceTimer=null,this.mutationDebounceMs=2e3,this.attachedListeners=new WeakMap,!e.projectKey&&!e.clientId&&!e.apiKey)throw new Error("[AInamika SDK] Either projectKey or clientId is required for initialization");this.config=k({endpoint:a.API_BASE_URL,batchInterval:5e3,useWebWorker:!0,debug:a.DEBUG,errorTracking:{enabled:!0,captureScreenshots:!0,captureDomSnapshots:!0,maxStackTraceDepth:50,maxErrorsPerSession:100,debounceMs:1e3,enableNetworkTracking:!0,enableConsoleCapture:!0}},e),this.sessionId=this.generateSessionId(),this.userIdentifier=this.getOrCreateUserIdentifier(),this.userManager=new f,this.journeyTracker=new m,this.authManager=new b(this.config.clientId||this.config.apiKey||"",this.config.endpoint,this.config.debug);var t=new Blob(["\n self.eventQueue = [];\n self.config = {\n apiUrl: '',\n batchSize: 10,\n batchInterval: 5000,\n headers: { 'Content-Type': 'application/json' }\n };\n let batchTimer = null;\n function flushQueue() {\n self.postMessage({ status: 'debug', message: '[AInamika Worker] flushQueue called', eventQueue: self.eventQueue, config: self.config });\n if (self.eventQueue.length === 0) return;\n const batch = self.eventQueue.splice(0, self.config.batchSize);\n fetch(self.config.apiUrl, {\n method: 'POST',\n headers: self.config.headers,\n body: JSON.stringify({ events: batch })\n }).then(r => {\n if (r.ok) {\n self.postMessage({ status: 'success' });\n } else {\n self.postMessage({ status: 'error', error: r.statusText, failedEvents: batch });\n }\n }).catch(e => {\n self.postMessage({ status: 'error', error: e.message, failedEvents: batch });\n });\n }\n self.onmessage = function(e) {\n self.postMessage({ status: 'debug', message: '[AInamika Worker] onmessage', data: e.data });\n if (e.data.type === 'config') {\n self.config = { ...self.config, ...e.data.payload };\n if (batchTimer) clearInterval(batchTimer);\n batchTimer = setInterval(flushQueue, self.config.batchInterval);\n self.postMessage({ status: 'debug', message: '[AInamika Worker] config set', config: self.config });\n } else if (e.data.type === 'track') {\n self.eventQueue.push(e.data.payload);\n // Only send when timer triggers, not when batch size is reached\n // This ensures true batching behavior\n } else if (e.data.type === 'batch') {\n // Handle batch flush from main thread\n self.postMessage({ status: 'debug', message: '[AInamika Worker] Received batch from main thread', events: e.data.events });\n self.eventQueue.push(...e.data.events);\n flushQueue();\n } else if (e.data.type === 'initConfig') {\n // No-op for now, can be used for advanced config\n }\n };\n "],{type:"application/javascript"}),r=URL.createObjectURL(t);this.worker=new Worker(r),this.initialize()}return e.prototype.initialize=function(){return w(this,void 0,void 0,function(){var e,t,r,n;return S(this,function(o){switch(o.label){case 0:if(this.isInitialized)return[2];if(this.isInitialized=!0,!this.config.projectKey)return[3,5];o.label=1;case 1:return o.trys.push([1,4,,5]),[4,this.initializeProjectSettings()];case 2:return o.sent(),[4,this.initializeSamplingDecision()];case 3:return o.sent(),this.log("Project-based initialization complete",{projectKey:this.config.projectKey,projectSettings:this.projectSettings,samplingDecision:this.samplingDecision}),[3,5];case 4:return e=o.sent(),this.log("Project initialization failed:",e),console.warn("[AInamika SDK] Failed to initialize project settings. Some features may be limited."),[3,5];case 5:if(!this.config.clientId&&!this.config.apiKey)return[3,9];o.label=6;case 6:return o.trys.push([6,8,,9]),[4,this.authManager.initialize()];case 7:return o.sent(),this.log("Authentication initialized"),[3,9];case 8:return t=o.sent(),this.log("Authentication initialization failed:",t),this.config.debug||console.warn("[Ainamika] Running without authentication. Some features may be limited."),[3,9];case 9:return(null===(r=this.config.errorTracking)||void 0===r?void 0:r.enabled)&&this.shouldSampleErrors()?this.initializeErrorTracking():(null===(n=this.config.errorTracking)||void 0===n?void 0:n.enabled)&&!this.shouldSampleErrors()&&this.log("Error tracking disabled due to sampling decision"),this.config.autoConfig?[4,this.setupAutoConfiguration()]:[3,11];case 10:o.sent(),o.label=11;case 11:return this.setupDynamicDomTracking(),this.config.useWebWorker&&"undefined"!=typeof Worker?[4,this.setupWebWorker()]:[3,13];case 12:return o.sent(),[3,14];case 13:this.startBatchTimer(),o.label=14;case 14:return this.log("AnalyticsPro SDK initialized",{config:this.config,projectKey:this.config.projectKey,sampling:this.samplingDecision}),[2]}})})},e.prototype.getOrCreateUserIdentifier=function(){var e="ainamika_user_identifier",t=localStorage.getItem(e);return t||(t="anon_"+Math.random().toString(36).substr(2,16)+Date.now().toString(36),localStorage.setItem(e,t),this.log("Created new user identifier:",t)),t},e.prototype.initializeProjectSettings=function(){return w(this,void 0,void 0,function(){var e,t,r;return S(this,function(n){switch(n.label){case 0:if(!this.config.projectKey)return[2];n.label=1;case 1:return n.trys.push([1,4,,5]),[4,fetch(c.PROJECTS_LOOKUP,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_key:this.config.projectKey})})];case 2:if(!(e=n.sent()).ok)throw new Error("Project lookup failed: ".concat(e.status));return t=this,[4,e.json()];case 3:return t.projectSettings=n.sent(),this.log("Project settings loaded:",this.projectSettings),[3,5];case 4:throw r=n.sent(),this.log("Failed to load project settings:",r),r;case 5:return[2]}})})},e.prototype.initializeSamplingDecision=function(){return w(this,void 0,void 0,function(){var e,t,r;return S(this,function(n){switch(n.label){case 0:if(!this.config.projectKey)return[2];n.label=1;case 1:return n.trys.push([1,4,,5]),[4,fetch(c.SAMPLING_CHECK,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_key:this.config.projectKey,user_identifier:this.userIdentifier})})];case 2:if(!(e=n.sent()).ok)throw new Error("Sampling check failed: ".concat(e.status));return t=this,[4,e.json()];case 3:return t.samplingDecision=n.sent(),this.log("Sampling decision received:",this.samplingDecision),this.cacheSamplingDecision(),[3,5];case 4:return r=n.sent(),this.log("Failed to get sampling decision, using cached or defaults:",r),this.loadCachedSamplingDecision(),[3,5];case 5:return[2]}})})},e.prototype.cacheSamplingDecision=function(){if(this.samplingDecision){var e="ainamika_sampling_".concat(this.config.projectKey);localStorage.setItem(e,JSON.stringify(this.samplingDecision))}},e.prototype.loadCachedSamplingDecision=function(){var e="ainamika_sampling_".concat(this.config.projectKey),t=localStorage.getItem(e);if(t)try{this.samplingDecision=JSON.parse(t),this.log("Loaded cached sampling decision:",this.samplingDecision)}catch(e){this.samplingDecision={should_sample:{events:!0,errors:!0,session_replay:!1},rates:{events:100,errors:100,session_replay:0},decision:"existing"}}else this.samplingDecision={should_sample:{events:!0,errors:!0,session_replay:!1},rates:{events:100,errors:100,session_replay:0},decision:"existing"}},e.prototype.shouldSampleEvents=function(){return!this.samplingDecision||this.samplingDecision.should_sample.events},e.prototype.shouldSampleErrors=function(){return!this.samplingDecision||this.samplingDecision.should_sample.errors},e.prototype.shouldSampleSessionReplay=function(){return!!this.samplingDecision&&this.samplingDecision.should_sample.session_replay},e.prototype.getSamplingStatus=function(){return this.samplingDecision||null},e.prototype.getProjectInfo=function(){return this.projectSettings||null},e.prototype.initializeErrorTracking=function(){var e,t,r,n,o,i,c,u,l,h,p,f,g,m;try{this.errorStorage=new d({maxStorageSize:5242880,maxRetries:5,retryInterval:3e4,compressionEnabled:!0,encryptionEnabled:!1});var y={endpoint:a.API_BASE_URL,clientId:this.config.clientId||"",apiKey:this.config.apiKey,authManager:this.authManager,captureScreenshots:null===(t=null===(e=this.config.errorTracking)||void 0===e?void 0:e.captureScreenshots)||void 0===t||t,captureDomSnapshots:null===(n=null===(r=this.config.errorTracking)||void 0===r?void 0:r.captureDomSnapshots)||void 0===n||n,maxStackTraceDepth:null!==(i=null===(o=this.config.errorTracking)||void 0===o?void 0:o.maxStackTraceDepth)&&void 0!==i?i:50,maxErrorsPerSession:null!==(u=null===(c=this.config.errorTracking)||void 0===c?void 0:c.maxErrorsPerSession)&&void 0!==u?u:100,debounceMs:null!==(h=null===(l=this.config.errorTracking)||void 0===l?void 0:l.debounceMs)&&void 0!==h?h:1e3,enableNetworkTracking:null===(f=null===(p=this.config.errorTracking)||void 0===p?void 0:p.enableNetworkTracking)||void 0===f||f,enableConsoleCapture:null===(m=null===(g=this.config.errorTracking)||void 0===g?void 0:g.enableConsoleCapture)||void 0===m||m};this.errorTracker=new s(y);var v=this.getUserId();v&&this.errorTracker&&this.errorTracker.setUser(v),this.log("Error tracking initialized successfully")}catch(e){console.error("[AInamika SDK] Failed to initialize error tracking:",e)}},e.prototype.captureException=function(e,t){this.errorTracker&&this.errorTracker.captureException(e,t)},e.prototype.setUser=function(e){console.warn("[AInamika SDK] setUser is deprecated. Please use identifyUser() instead."),this.identifyUser(e)},e.prototype.flushStoredErrors=function(){return w(this,void 0,void 0,function(){return S(this,function(e){switch(e.label){case 0:return this.errorStorage?[4,this.errorStorage.processQueue()]:[3,2];case 1:e.sent(),e.label=2;case 2:return this.errorTracker?[4,this.errorTracker.flushStoredErrors()]:[3,4];case 3:e.sent(),e.label=4;case 4:return[2]}})})},e.prototype.setupAutoConfiguration=function(){return w(this,void 0,void 0,function(){var e,t,r,n;return S(this,function(o){switch(o.label){case 0:return o.trys.push([0,7,,8]),this.log("Starting auto-configuration..."),[4,this.getDOMStructure()];case 1:return e=o.sent(),t=this.computeDomHash(e),this.lastDomHash=t,(r=this.getCachedConfigForDomHash(t))?(this.log("Loaded analytics config from localStorage cache for DOM hash:",t),[3,4]):[3,2];case 2:return[4,this.loadConfigFromFile()];case 3:(r=o.sent())&&this.log("Loaded analytics config from file"),o.label=4;case 4:return r?[3,6]:(this.log("No cached config found, fetching from backend for DOM hash:",t),[4,this.fetchGeneratedConfig(e,t)]);case 5:(r=o.sent())&&r.events_to_track&&(this.saveConfigToFile(r),this.setCachedConfigForDomHash(t,r),this.lastConfigHash=r.config_hash||""),o.label=6;case 6:return r&&r.events_to_track?(this.applyGeneratedConfig(r),this.config.useWebWorker&&"undefined"!=typeof Worker&&this.worker.postMessage({type:"initConfig",config:r}),this.log("Auto-configuration applied successfully",r)):this.log("Auto-configuration failed: Invalid config received from backend.",r),[3,8];case 7:return n=o.sent(),this.log("Auto-configuration failed with error",n),[3,8];case 8:return[2]}})})},e.prototype.getDOMStructure=function(){return w(this,void 0,void 0,function(){var e,t,r,n,o;return S(this,function(i){switch(i.label){case 0:return e=function(e){if(e.id)return"#".concat(e.id);if(e.className){var t=e.className.split(" ").filter(function(e){return e.trim()}).join(".");return t?".".concat(t):e.tagName.toLowerCase()}return e.tagName.toLowerCase()},[4,new Promise(function(e){return setTimeout(e,500)})];case 1:return i.sent(),t=Array.from(document.body.querySelectorAll('\n button, a, input, select, textarea, form, img, h1, h2, h3, h4, h5, h6,\n [role=button], [role=link], [onclick], [tabindex], [data-analytics], [data-track],\n .card, .btn, .btn-primary, .btn-secondary, .card-title, .card-description, .card-price, .card-actions,\n [id*="card"], [class*="card"], [class*="btn"], [class*="price"], [class*="title"],\n div, span, p\n ')),r=t.filter(function(e){var t=window.getComputedStyle(e),r="none"!==t.display&&"hidden"!==t.visibility&&"0"!==t.opacity,n="button"===e.tagName.toLowerCase()||"a"===e.tagName.toLowerCase()||e.hasAttribute("onclick")||"button"===e.getAttribute("role")||e.classList.contains("btn")||e.classList.contains("card"),o="cardsContainer"===e.id||e.classList.contains("cards-grid")||e.classList.contains("card")||"img"===e.tagName.toLowerCase()||-1!==["h1","h2","h3"].indexOf(e.tagName.toLowerCase());return r&&(n||o)||"cardsContainer"===e.id}),n=new Set,o=r.map(function(t){var r,n,o={};return Array.from(t.attributes).forEach(function(e){-1===["style","data-timestamp","data-rendered"].indexOf(e.name)&&(o[e.name]=e.value)}),{tagName:t.tagName.toLowerCase(),selector:e(t),id:t.id||"",className:t.className||"",textContent:(t.textContent||"").trim().substring(0,100),attributes:o,isInteractive:"button"===t.tagName.toLowerCase()||"a"===t.tagName.toLowerCase()||t.hasAttribute("onclick")||"button"===t.getAttribute("role")||t.classList.contains("btn"),hasChildren:t.children.length>0,childCount:t.children.length,parentTagName:(null===(r=t.parentElement)||void 0===r?void 0:r.tagName.toLowerCase())||"",index:Array.from((null===(n=t.parentElement)||void 0===n?void 0:n.children)||[]).indexOf(t)}}).filter(function(e){var t=e.tagName+"|"+e.selector+"|"+e.textContent.substring(0,20);return!n.has(t)&&(n.add(t),!0)}),this.log("DOM structure analyzed",{elementCount:o.length,elements:o}),[2,{elements:o}]}})})},e.prototype.fetchGeneratedConfig=function(e,t){return w(this,void 0,void 0,function(){var r,n,o,i,s;return S(this,function(a){switch(a.label){case 0:return a.trys.push([0,4,,5]),e&&e.elements&&0===e.elements.length?(this.log("No elements found in DOM structure, skipping config fetch."),[2,null]):(r={"Content-Type":"application/json"},[4,this.authManager.getAuthHeaders()]);case 1:return n=a.sent(),r=k(k({},r),n),o={structure:e},t&&(o.domHash=t,o.lastConfigHash=this.lastConfigHash),[4,fetch(c.CONFIG,{method:"POST",headers:r,body:JSON.stringify(o)})];case 2:if(!(i=a.sent()).ok)throw new Error("Backend returned ".concat(i.status));return[4,i.json()];case 3:return[2,a.sent()];case 4:return s=a.sent(),this.log("Error fetching generated config:",s),[2,null];case 5:return[2]}})})},e.prototype.applyGeneratedConfig=function(e){var t=this;e.events_to_track.forEach(function(e){try{var r=document.querySelectorAll(e.element_selector);r.length>0?r.forEach(function(r){var n=t.attachedListeners.get(r);n||(n=new Set,t.attachedListeners.set(r,n)),(Array.isArray(e.event_type)?e.event_type:[e.event_type]).forEach(function(o){n.has(o)||(n.add(o),"click"===o&&(r.addEventListener("click",function(r){var n=r.target,o=t.extractElementData(n);t.sendToWorker(e.event_name,{selector:e.element_selector,eventType:"click",element:o,timestamp:(new Date).toISOString()})}),t.log('Attached click listener for "'.concat(e.event_name,'" on "').concat(e.element_selector,'"'))),"view"===o&&"IntersectionObserver"in window&&(new IntersectionObserver(function(r){r.forEach(function(r){if(r.isIntersecting){var n=r.target,o=t.extractElementData(n);t.sendToWorker(e.event_name,{selector:e.element_selector,eventType:"view",element:o,intersectionRatio:r.intersectionRatio,timestamp:(new Date).toISOString()})}})},{threshold:[.1,.5,1]}).observe(r),t.log('Attached IntersectionObserver for "'.concat(e.event_name,'" on "').concat(e.element_selector,'"'))),"focus"!==o&&"blur"!==o||(r.addEventListener(o,function(){var n=r,i=t.extractElementData(n);t.sendToWorker(e.event_name,{selector:e.element_selector,eventType:o,element:i,timestamp:(new Date).toISOString()})}),t.log("Attached ".concat(o,' listener for "').concat(e.event_name,'" on "').concat(e.element_selector,'"'))))})}):t.log('No elements found for selector: "'.concat(e.element_selector,'"'))}catch(r){t.log('Error applying selector "'.concat(e.element_selector,'":'),r)}}),e.observe_mutations&&"MutationObserver"in window&&(new MutationObserver(function(e){e.forEach(function(e){t.sendToWorker("dom_mutation",{type:e.type,target:e.target.outerHTML,timestamp:(new Date).toISOString()})})}).observe(document.body,{childList:!0,subtree:!0}),this.log("MutationObserver attached for DOM changes"))},e.prototype.extractElementData=function(e){var t=e.getBoundingClientRect();return{tagName:e.tagName.toLowerCase(),id:e.id||"",className:e.className||"",textContent:(e.textContent||"").trim().substring(0,100),attributes:Array.from(e.attributes).reduce(function(e,t){return e[t.name]=t.value,e},{}),position:{x:Math.round(t.x),y:Math.round(t.y),width:Math.round(t.width),height:Math.round(t.height)},href:e.href||void 0,value:e.value||void 0}},e.prototype.sendToWorker=function(e,t){var r;if(this.shouldSampleEvents()){var n=new Date,o={event:e,properties:t,timestamp:n.getTime(),created_at:n.toISOString(),userId:this.getUserId(),sessionId:this.sessionId,project_key:this.config.projectKey||void 0,client_id:this.config.clientId||this.config.apiKey||void 0,project_id:(null===(r=this.projectSettings)||void 0===r?void 0:r.project_id)||void 0};this.config.useWebWorker&&"undefined"!=typeof Worker?this.worker.postMessage({type:"track",payload:o}):this.eventQueue.push(o),this.log("Event tracked:",o)}else this.log("Event skipped due to sampling:",e)},e.prototype.setupWebWorker=function(){return w(this,void 0,void 0,function(){var e,t,r,n,o,i=this;return S(this,function(s){switch(s.label){case 0:return[4,this.authManager.getAuthHeaders()];case 1:return e=s.sent(),this.worker.postMessage({type:"config",payload:{apiUrl:(null===(t=this.config.apiDetails)||void 0===t?void 0:t.apiEndPoint)||"".concat(this.config.endpoint,"/api/v1/events"),batchSize:(null===(r=this.config.workerConfig)||void 0===r?void 0:r.batchSize)||10,batchInterval:(null===(n=this.config.workerConfig)||void 0===n?void 0:n.batchInterval)||5e3,headers:k(k({"Content-Type":"application/json"},e),(null===(o=this.config.apiDetails)||void 0===o?void 0:o.headers)||{})}}),this.worker.onmessage=function(e){var t;"success"===e.data.status?i.log("Batch sent successfully by worker"):"debug"===e.data.status?i.log(e.data.message,e.data):"error"===e.data.status&&(i.log("Worker failed to send batch",e.data.error),e.data.failedEvents&&e.data.failedEvents.length>0&&(t=i.eventQueue).unshift.apply(t,e.data.failedEvents))},this.log("Web worker setup complete."),[2]}})})},e.prototype.track=function(e,t){var r;if(void 0===t&&(t={}),this.shouldSampleEvents()){this.journeyTracker.trackEvent(e,t);var n=this.journeyTracker.getContext(),o=new Date,i={event:e,properties:k(k({},t),{journeyContext:{sequenceIndex:n.eventCount-1,timeSinceLastEvent:n.timeSinceLastEvent,journeyDuration:Date.now()-n.journeyStartTime}}),timestamp:o.getTime(),created_at:o.toISOString(),userId:this.userManager.getUserId(),userType:this.userManager.getUserType(),sessionId:this.sessionId,project_key:this.config.projectKey||void 0,client_id:this.config.clientId||this.config.apiKey||void 0,project_id:(null===(r=this.projectSettings)||void 0===r?void 0:r.project_id)||void 0};this.journeyTracker.shouldAnalyzeJourney()&&this.sendJourneyForAnalysis(),this.config.useWebWorker&&"undefined"!=typeof Worker?this.worker.postMessage({type:"track",payload:i}):this.eventQueue.push(i),this.log("Event tracked public:",i)}else this.log("Event skipped due to sampling:",e)},e.prototype.startBatchTimer=function(){var e=this;this.batchTimer=window.setInterval(function(){e.flushQueue()},this.config.batchInterval)},e.prototype.flushQueue=function(){return w(this,void 0,void 0,function(){var e;return S(this,function(t){switch(t.label){case 0:return 0===this.eventQueue.length?[2]:(e=function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))}([],this.eventQueue,!0),this.eventQueue=[],this.config.useWebWorker&&"undefined"!=typeof Worker?(this.worker.postMessage({type:"batch",events:e,endpoint:"".concat(this.config.endpoint,"/api/v1/events")}),[3,3]):[3,1]);case 1:return[4,this.sendBatchWithRetry(e)];case 2:t.sent(),t.label=3;case 3:return[2]}})})},e.prototype.sendBatchWithRetry=function(e){return w(this,void 0,void 0,function(){var t,r;return S(this,function(n){switch(n.label){case 0:if(this.batchRetryCount>=this.maxBatchRetries)return this.batchTimer&&(clearInterval(this.batchTimer),this.batchTimer=void 0,this.log("Max batch retries reached. BatchTimer cancelled.")),[2];n.label=1;case 1:return n.trys.push([1,3,,4]),[4,this.sendBatch(e)];case 2:return n.sent(),this.batchRetryCount=0,[3,4];case 3:return t=n.sent(),this.batchRetryCount++,this.log("Batch send failed. Retry attempt ".concat(this.batchRetryCount," of ").concat(this.maxBatchRetries,"."),t),(r=this.eventQueue).unshift.apply(r,e),this.batchRetryCount>=this.maxBatchRetries&&this.batchTimer&&(clearInterval(this.batchTimer),this.batchTimer=void 0,this.log("Max batch retries reached. BatchTimer cancelled.")),[3,4];case 4:return[2]}})})},e.prototype.sendBatch=function(e){return w(this,void 0,void 0,function(){var t,r,n,o,i,s,a;return S(this,function(c){switch(c.label){case 0:return t="".concat(this.config.endpoint,"/api/v1/events"),r={"Content-Type":"application/json"},[4,this.authManager.getAuthHeaders()];case 1:n=c.sent(),r=k(k({},r),n),this.config.apiDetails&&this.config.apiDetails.apiEndPoint&&(t=this.config.apiDetails.apiEndPoint,this.config.apiDetails.headers&&(r=k(k({},r),this.config.apiDetails.headers))),o=this.config.clientId||"5288aa7d-1b7c-481e-958d-eb9b8e951f14",i=e.map(function(e){return k({event:e.event,userId:e.userId,client_id:o,timestamp:new Date(e.timestamp).toISOString()},e.properties||{})}),c.label=2;case 2:return c.trys.push([2,4,,5]),[4,fetch(t,{method:"POST",headers:r,body:JSON.stringify({events:i})})];case 3:if(!(s=c.sent()).ok)throw new Error("Failed to send batch: ".concat(s.status));return this.log("Batch sent successfully:",i),[3,5];case 4:throw a=c.sent(),this.log("Error sending batch:",a),a;case 5:return[2]}})})},e.prototype.generateSessionId=function(){return"sess_"+Math.random().toString(36).substr(2,9)},e.prototype.getUserId=function(){return this.userManager.getUserId()},e.prototype.identifyUser=function(e,t){var r=this.userManager.getUserIdentificationEvent(e);this.userManager.identifyUser(e,t),this.track("user_identified",r),this.errorTracker&&this.errorTracker.setUser(e),this.log("User identified:",{userId:e,properties:t})},e.prototype.isAuthenticated=function(){return w(this,void 0,void 0,function(){return S(this,function(e){switch(e.label){case 0:return[4,this.authManager.getAccessToken()];case 1:return[2,null!==e.sent()]}})})},e.prototype.authenticate=function(){return w(this,void 0,void 0,function(){return S(this,function(e){switch(e.label){case 0:return[4,this.authManager.initialize()];case 1:return[2,e.sent()]}})})},e.prototype.logout=function(){return w(this,void 0,void 0,function(){return S(this,function(e){switch(e.label){case 0:return[4,this.authManager.logout()];case 1:return e.sent(),[2]}})})},e.prototype.sendJourneyForAnalysis=function(){return w(this,void 0,void 0,function(){var e,t,r,n,o;return S(this,function(i){switch(i.label){case 0:return i.trys.push([0,3,,4]),e=this.journeyTracker.getJourneyForAnalysis(),t="".concat(this.config.endpoint,"/api/v1/journeys/analyze"),[4,this.authManager.getAuthHeaders()];case 1:return r=i.sent(),[4,fetch(t,{method:"POST",headers:k({"Content-Type":"application/json"},r),body:JSON.stringify({client_id:this.config.clientId,user_id:this.userManager.getUserId(),session_id:this.sessionId,journey:e})})];case 2:return(n=i.sent()).ok||console.error("[AInamika SDK] Failed to send journey for analysis:",n.statusText),[3,4];case 3:return o=i.sent(),console.error("[AInamika SDK] Error sending journey for analysis:",o),[3,4];case 4:return[2]}})})},e.prototype.log=function(e,t){this.config.debug&&console.log("[AnalyticsPro SDK] ".concat(e),t||"")},e.prototype.saveConfigToFile=function(e){this.config.debug},e.prototype.loadConfigFromFile=function(){return w(this,void 0,void 0,function(){var e;return S(this,function(t){switch(t.label){case 0:return t.trys.push([0,3,,4]),[4,fetch("/AInamika_config.json",{cache:"reload"})];case 1:return(e=t.sent()).ok?[4,e.json()]:[2,null];case 2:return[2,t.sent()];case 3:return t.sent(),[2,null];case 4:return[2]}})})},e.prototype.setupDynamicDomTracking=function(){return w(this,void 0,void 0,function(){var e=this;return S(this,function(t){return"MutationObserver"in window&&(new MutationObserver(function(){e.mutationDebounceTimer&&clearTimeout(e.mutationDebounceTimer),e.mutationDebounceTimer=window.setTimeout(function(){e.handleDomMutation()},e.mutationDebounceMs)}).observe(document.body,{childList:!0,subtree:!0,attributes:!0}),this.log("Dynamic DOM MutationObserver attached")),[2]})})},e.prototype.computeDomHash=function(e){for(var t=JSON.stringify(e),r=2166136261,n=0;n<t.length;n++)r^=t.charCodeAt(n),r+=(r<<1)+(r<<4)+(r<<7)+(r<<8)+(r<<24);return(r>>>0).toString(16)},e.prototype.getCachedConfigForDomHash=function(e){try{return JSON.parse(localStorage.getItem("ainamika_dom_config_cache")||"{}")[e]||null}catch(e){return null}},e.prototype.setCachedConfigForDomHash=function(e,t){try{var r=JSON.parse(localStorage.getItem("ainamika_dom_config_cache")||"{}");r[e]=t,localStorage.setItem("ainamika_dom_config_cache",JSON.stringify(r))}catch(e){}},e.prototype.handleDomMutation=function(){return w(this,void 0,void 0,function(){var e,t,r,n;return S(this,function(o){switch(o.label){case 0:return[4,this.getDOMStructure()];case 1:return e=o.sent(),(t=this.computeDomHash(e))===this.lastDomHash?(this.log("DOM hash unchanged after mutation, skipping config fetch."),[2]):(this.log("DOM hash changed, checking for cached config...",{oldHash:this.lastDomHash,newHash:t}),this.lastDomHash=t,(r=this.getCachedConfigForDomHash(t))?(this.log("Reusing cached config for DOM hash",t),this.applyGeneratedConfig(r),[2]):(this.log("Fetching new config from backend for DOM hash:",t),[4,this.fetchGeneratedConfig(e,t)]));case 2:return(n=o.sent())&&n.events_to_track?(this.applyGeneratedConfig(n),this.setCachedConfigForDomHash(t,n),this.lastConfigHash=n.config_hash||"",this.log("Fetched and applied new config for new DOM hash",t)):this.log("No valid config returned for new DOM hash",t),[2]}})})},e}();"undefined"!=typeof window&&(window.AInamikaSDKPro=E);var T=E;return t.default}()});
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.AInamikaSDKPro=t():e.AInamikaSDKPro=t()}("undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:this,function(){return function(){"use strict";var e={d:function(t,r){for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:function(e,t){return Object.prototype.hasOwnProperty.call(e,t)}},t={};e.d(t,{default:function(){return T}});var r=function(){return r=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},r.apply(this,arguments)},n=function(e,t,r,n){return new(r||(r=Promise))(function(o,i){function s(e){try{c(n.next(e))}catch(e){i(e)}}function a(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(s,a)}c((n=n.apply(e,t||[])).next())})},o=function(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&a[0]?n.return:a[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,a[1])).done)return o;switch(n=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,n=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){i.label=a[1];break}if(6===a[0]&&i.label<o[1]){i.label=o[1],o=a;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(a);break}o[2]&&i.ops.pop(),i.trys.pop();continue}a=t.call(e,i)}catch(e){a=[6,e],n=0}finally{r=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}},i=function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))},s=function(){function e(e){this.breadcrumbs=[],this.errorCount=0,this.errorDebounceMap=new Map,this.config=r({captureScreenshots:!0,captureDomSnapshots:!0,maxStackTraceDepth:50,maxErrorsPerSession:100,debounceMs:1e3,enableNetworkTracking:!0,enableConsoleCapture:!0},e),this.authManager=e.authManager,this.sessionId=this.generateSessionId(),this.originalConsole=r({},console),this.initialize()}return e.prototype.initialize=function(){var e=this;window.addEventListener("error",function(t){e.handleError({type:"javascript",message:t.message,filename:t.filename,line:t.lineno,column:t.colno,error:t.error})}),window.addEventListener("unhandledrejection",function(t){var r;e.handleError({type:"unhandled",message:(null===(r=t.reason)||void 0===r?void 0:r.message)||"Unhandled Promise Rejection",error:t.reason,promise:!0})}),this.config.enableNetworkTracking&&this.setupNetworkTracking(),this.config.enableConsoleCapture&&this.setupConsoleCapture(),this.setupNavigationTracking(),this.setupClickTracking(),console.log("[AInamika Error Tracker] Initialized successfully")},e.prototype.generateSessionId=function(){return"session_".concat(Date.now(),"_").concat(Math.random().toString(36).substr(2,9))},e.prototype.addBreadcrumb=function(e){this.breadcrumbs.push(r(r({},e),{timestamp:Date.now()})),this.breadcrumbs.length>50&&(this.breadcrumbs=this.breadcrumbs.slice(-50))},e.prototype.handleError=function(e){if(this.errorCount>=this.config.maxErrorsPerSession)console.warn("[AInamika Error Tracker] Max errors per session reached");else{var t="".concat(e.message,"_").concat(e.filename,"_").concat(e.line),r=Date.now();if(this.errorDebounceMap.has(t)&&r-this.errorDebounceMap.get(t)<this.config.debounceMs)return;this.errorDebounceMap.set(t,r),this.errorCount++,this.captureError(e)}},e.prototype.captureError=function(e){return n(this,void 0,void 0,function(){var t,r,n;return o(this,function(o){switch(o.label){case 0:return o.trys.push([0,4,,5]),t={client_id:this.config.clientId,error_type:e.type||"javascript",message:e.message||"Unknown error",stack_trace:this.extractStackTrace(e.error),url:window.location.href,user_agent:navigator.userAgent,timestamp:Date.now(),error_metadata:{line:e.line,column:e.column,filename:e.filename,userId:this.userId,sessionId:this.sessionId,breadcrumbs:i([],this.breadcrumbs,!0),networkInfo:this.getNetworkInfo(),performance:this.getPerformanceInfo()},severity:this.assessSeverity(e),session_id:this.sessionId,user_id:this.userId},this.config.captureDomSnapshots&&(t.dom_snapshot=this.captureDomSnapshot()),this.config.captureScreenshots?(r=t,[4,this.captureScreenshot()]):[3,2];case 1:r.screen_snapshot=o.sent(),o.label=2;case 2:return[4,this.sendError(t)];case 3:return o.sent(),this.addBreadcrumb({type:"error",message:"".concat(t.error_type,": ").concat(t.message),data:{severity:t.severity}}),[3,5];case 4:return n=o.sent(),console.error("[AInamika Error Tracker] Failed to capture error:",n),[3,5];case 5:return[2]}})})},e.prototype.extractStackTrace=function(e){if(!e||!e.stack)return"";var t=e.stack.split("\n"),r=this.config.maxStackTraceDepth;return t.slice(0,r).join("\n")},e.prototype.assessSeverity=function(e){var t,r=(null===(t=e.message)||void 0===t?void 0:t.toLowerCase())||"";return r.includes("out of memory")||r.includes("security")||r.includes("permission denied")||"unhandled"===e.type?"critical":r.includes("network")||r.includes("timeout")||r.includes("failed to fetch")||r.includes("cors")?"high":r.includes("undefined")||r.includes("null")||r.includes("cannot read property")?"medium":"low"},e.prototype.captureDomSnapshot=function(){try{var e={url:window.location.href,title:document.title,viewport:{width:window.innerWidth,height:window.innerHeight},elements:this.extractDomElements()};return JSON.stringify(e)}catch(e){return console.error("[AInamika Error Tracker] Failed to capture DOM snapshot:",e),""}},e.prototype.extractDomElements=function(){var e=this,t=[];return["body > *","[id]",'[class*="error"]','[class*="modal"]',"form","button",'input[type="submit"]'].forEach(function(r){try{var n=document.querySelectorAll(r);Array.from(n).slice(0,100-t.length).forEach(function(r){var n;t.push({tagName:r.tagName,id:r.id,className:r.className,textContent:null===(n=r.textContent)||void 0===n?void 0:n.substring(0,100),attributes:e.getElementAttributes(r)})})}catch(e){}}),t},e.prototype.getElementAttributes=function(e){var t={};return["id","class","type","name","value","href","src"].forEach(function(r){var n=e.getAttribute(r);n&&(t[r]=n)}),t},e.prototype.captureScreenshot=function(){return n(this,void 0,void 0,function(){var e;return o(this,function(t){switch(t.label){case 0:return t.trys.push([0,3,,4]),"function"!=typeof window.html2canvas?[3,2]:[4,window.html2canvas(document.body,{height:Math.min(window.innerHeight,1e3),width:Math.min(window.innerWidth,1e3),useCORS:!0})];case 1:return[2,t.sent().toDataURL("image/jpeg",.7)];case 2:return[2,""];case 3:return e=t.sent(),console.error("[AInamika Error Tracker] Failed to capture screenshot:",e),[2,""];case 4:return[2]}})})},e.prototype.getNetworkInfo=function(){var e=navigator.connection||navigator.mozConnection||navigator.webkitConnection;return e?{effectiveType:e.effectiveType,downlink:e.downlink,rtt:e.rtt,saveData:e.saveData}:{}},e.prototype.getPerformanceInfo=function(){var e={};if(performance.memory&&(e.memory={usedJSHeapSize:performance.memory.usedJSHeapSize,totalJSHeapSize:performance.memory.totalJSHeapSize,jsHeapSizeLimit:performance.memory.jsHeapSizeLimit}),performance.timing){var t=performance.timing;e.timing={domContentLoaded:t.domContentLoadedEventEnd-t.navigationStart,load:t.loadEventEnd-t.navigationStart},performance.getEntriesByType&&performance.getEntriesByType("paint").forEach(function(t){"first-paint"===t.name?e.timing.firstPaint=t.startTime:"first-contentful-paint"===t.name&&(e.timing.firstContentfulPaint=t.startTime)})}return e},e.prototype.setupNetworkTracking=function(){var e=this,t=window.fetch;window.fetch=function(){for(var r=[],i=0;i<arguments.length;i++)r[i]=arguments[i];return n(e,void 0,void 0,function(){var e,n,i,s;return o(this,function(o){switch(o.label){case 0:e=Date.now(),n=r[0]instanceof Request?r[0].url:String(r[0]),o.label=1;case 1:return o.trys.push([1,3,,4]),[4,t.apply(void 0,r)];case 2:return i=o.sent(),this.addBreadcrumb({type:"network",message:"Fetch ".concat(i.status," ").concat(n),data:{url:n,status:i.status,duration:Date.now()-e}}),i.ok||this.handleError({type:"network",message:"Network request failed: ".concat(i.status," ").concat(i.statusText),url:n,status:i.status}),[2,i];case 3:throw s=o.sent(),this.addBreadcrumb({type:"network",message:"Fetch failed ".concat(n),data:{url:n,error:(null==s?void 0:s.message)||"Unknown error"}}),this.handleError({type:"network",message:"Network request failed: ".concat((null==s?void 0:s.message)||"Unknown error"),url:n,error:s}),s;case 4:return[2]}})})};var r=XMLHttpRequest.prototype.open,s=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.open=function(e,t,n,o,i){return this._errorTracker={method:e,url:t,startTime:Date.now()},r.call(this,e,t,n||!0,o,i)},XMLHttpRequest.prototype.send=function(){for(var e=this,t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];var n=this._errorTracker;return this.addEventListener("loadend",function(){if(n){var t=Date.now()-n.startTime;e.status>=400&&e.dispatchEvent(new CustomEvent("networkerror",{detail:{type:"network",message:"XHR request failed: ".concat(e.status," ").concat(e.statusText),url:n.url,status:e.status}})),e.dispatchEvent(new CustomEvent("networkbreadcrumb",{detail:{type:"network",message:"XHR ".concat(e.status," ").concat(n.url),data:{method:n.method,url:n.url,status:e.status,duration:t}}}))}}),s.call.apply(s,i([this],t,!1))},document.addEventListener("networkerror",function(t){e.handleError(t.detail)}),document.addEventListener("networkbreadcrumb",function(t){e.addBreadcrumb(t.detail)})},e.prototype.setupConsoleCapture=function(){var e=this;["error","warn"].forEach(function(t){var r=e.originalConsole[t];console[t]=function(){for(var n=[],o=0;o<arguments.length;o++)n[o]=arguments[o];"function"==typeof r&&r.call.apply(r,i([console],n,!1)),"error"===t&&e.handleError({type:"console",message:n.map(function(e){return String(e)}).join(" "),consoleMethod:t}),e.addBreadcrumb({type:"console",message:"Console ".concat(t,": ").concat(n.map(function(e){return String(e)}).join(" ")),data:{level:t}})}})},e.prototype.setupNavigationTracking=function(){var e=this,t=window.location.href,r=function(){var r=window.location.href;r!==t&&(e.addBreadcrumb({type:"navigation",message:"Navigation from ".concat(t," to ").concat(r),data:{from:t,to:r}}),t=r)};window.addEventListener("popstate",r),window.addEventListener("hashchange",r);var n=history.pushState,o=history.replaceState;history.pushState=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];n.apply(this,e),setTimeout(r,0)},history.replaceState=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];o.apply(this,e),setTimeout(r,0)}},e.prototype.setupClickTracking=function(){var e=this;document.addEventListener("click",function(t){var r,n=t.target;if(n){var o=e.getElementSelector(n),i=(null===(r=n.textContent)||void 0===r?void 0:r.trim().substring(0,50))||"";e.addBreadcrumb({type:"click",message:"Clicked ".concat(o).concat(i?": ".concat(i):""),data:{selector:o,text:i,tagName:n.tagName,id:n.id,className:n.className}})}})},e.prototype.getElementSelector=function(e){if(e.id)return"#".concat(e.id);if(e.className){var t=e.className.split(" ").filter(function(e){return e}).slice(0,2);if(t.length)return".".concat(t.join("."))}return e.tagName.toLowerCase()},e.prototype.sendError=function(e){return n(this,void 0,void 0,function(){var t,n,i,s;return o(this,function(o){switch(o.label){case 0:return o.trys.push([0,5,,6]),t={"Content-Type":"application/json"},this.authManager?[4,this.authManager.getAuthHeaders()]:[3,2];case 1:return n=o.sent(),t=r(r({},t),n),[3,3];case 2:this.config.apiKey&&(t.Authorization="Bearer ".concat(this.config.apiKey)),o.label=3;case 3:return[4,fetch("".concat(this.config.endpoint,"/api/v1/errors"),{method:"POST",headers:t,body:JSON.stringify(e)})];case 4:if(!(i=o.sent()).ok)throw new Error("Failed to send error: ".concat(i.status," ").concat(i.statusText));return console.log("[AInamika Error Tracker] Error sent successfully"),[3,6];case 5:return s=o.sent(),console.error("[AInamika Error Tracker] Failed to send error:",s),this.storeErrorLocally(e),[3,6];case 6:return[2]}})})},e.prototype.storeErrorLocally=function(e){try{var t=localStorage.getItem("ainamika_errors")||"[]",r=JSON.parse(t);r.push(e),r.length>50&&r.splice(0,r.length-50),localStorage.setItem("ainamika_errors",JSON.stringify(r))}catch(e){console.error("[AInamika Error Tracker] Failed to store error locally:",e)}},e.prototype.captureException=function(e,t){this.handleError({type:"custom",message:e.message,error:e,context:t})},e.prototype.setUser=function(e){this.userId=e},e.prototype.addTag=function(e,t){this.config.clientId||(this.config.clientId+="_".concat(e,":").concat(t))},e.prototype.flushStoredErrors=function(){return n(this,void 0,void 0,function(){var e,t,r,n,i,s;return o(this,function(o){switch(o.label){case 0:if(o.trys.push([0,5,,6]),!(e=localStorage.getItem("ainamika_errors")))return[2];if(0===(t=JSON.parse(e)).length)return[2];console.log("[AInamika Error Tracker] Flushing ".concat(t.length," stored errors")),r=0,n=t,o.label=1;case 1:return r<n.length?(i=n[r],[4,this.sendError(i)]):[3,4];case 2:o.sent(),o.label=3;case 3:return r++,[3,1];case 4:return localStorage.removeItem("ainamika_errors"),[3,6];case 5:return s=o.sent(),console.error("[AInamika Error Tracker] Failed to flush stored errors:",s),[3,6];case 6:return[2]}})})},e}(),a="undefined"!=typeof window&&window.__AINAMIKA_CONFIG__?window.__AINAMIKA_CONFIG__:{API_BASE_URL:"https://ainamika-webhook-proxy-366651516847.asia-south1.run.app",APP_ENV:"production",DEBUG:!1},c={EVENTS:"".concat(a.API_BASE_URL,"/api/v1/events"),ERRORS:"".concat(a.API_BASE_URL,"/api/errors/report"),CONFIG:"".concat(a.API_BASE_URL,"/api/v1/sdk/config"),DEBUG_EVENTS:"".concat(a.API_BASE_URL,"/api/v1/debug/events"),PROJECTS_LOOKUP:"".concat(a.API_BASE_URL,"/api/v1/projects/lookup"),SAMPLING_CHECK:"".concat(a.API_BASE_URL,"/api/v1/projects/sampling/check")},u=function(){return u=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},u.apply(this,arguments)},l=function(e,t,r,n){return new(r||(r=Promise))(function(o,i){function s(e){try{c(n.next(e))}catch(e){i(e)}}function a(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(s,a)}c((n=n.apply(e,t||[])).next())})},h=function(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&a[0]?n.return:a[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,a[1])).done)return o;switch(n=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,n=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){i.label=a[1];break}if(6===a[0]&&i.label<o[1]){i.label=o[1],o=a;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(a);break}o[2]&&i.ops.pop(),i.trys.pop();continue}a=t.call(e,i)}catch(e){a=[6,e],n=0}finally{r=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}},d=function(){function e(e){void 0===e&&(e={}),this.STORAGE_KEY="ainamika_error_queue",this.METADATA_KEY="ainamika_error_metadata",this.isProcessing=!1,this.config=u({maxStorageSize:5242880,maxRetries:5,retryInterval:3e4,compressionEnabled:!0,encryptionEnabled:!1},e),this.initialize()}return e.prototype.initialize=function(){var e=this;this.cleanupOldErrors(),this.startRetryTimer(),this.setupStorageListener(),setTimeout(function(){return e.processQueue()},1e3)},e.prototype.storeError=function(e){return l(this,void 0,void 0,function(){var t,r,n,o=this;return h(this,function(i){switch(i.label){case 0:return i.trys.push([0,2,,3]),t=this.generateErrorId(),r={id:t,errorData:this.config.compressionEnabled?this.compressData(e):e,timestamp:Date.now(),retryCount:0},[4,this.addToQueue(r)];case 1:return i.sent(),this.updateMetadata(),setTimeout(function(){return o.processQueue()},100),[2,t];case 2:throw n=i.sent(),console.error("[AInamika Error Storage] Failed to store error:",n),n;case 3:return[2]}})})},e.prototype.getStoredErrors=function(){var e=this;try{var t=localStorage.getItem(this.STORAGE_KEY);return t?JSON.parse(t).map(function(t){return u(u({},t),{errorData:e.config.compressionEnabled?e.decompressData(t.errorData):t.errorData})}):[]}catch(e){return console.error("[AInamika Error Storage] Failed to get stored errors:",e),[]}},e.prototype.removeError=function(e){try{var t=this.getQueueRaw(),r=t.filter(function(t){return t.id!==e});return r.length!==t.length&&(localStorage.setItem(this.STORAGE_KEY,JSON.stringify(r)),this.updateMetadata(),!0)}catch(e){return console.error("[AInamika Error Storage] Failed to remove error:",e),!1}},e.prototype.clearAll=function(){try{localStorage.removeItem(this.STORAGE_KEY),localStorage.removeItem(this.METADATA_KEY),console.log("[AInamika Error Storage] All errors cleared")}catch(e){console.error("[AInamika Error Storage] Failed to clear errors:",e)}},e.prototype.getStorageStats=function(){try{var e=this.getQueueRaw(),t=new Blob([localStorage.getItem(this.STORAGE_KEY)||""]).size,r=e.map(function(e){return e.timestamp}).sort();return{errorCount:e.length,totalSize:t,oldestError:r[0],newestError:r[r.length-1]}}catch(e){return console.error("[AInamika Error Storage] Failed to get storage stats:",e),{errorCount:0,totalSize:0}}},e.prototype.processQueue=function(){return l(this,void 0,void 0,function(){var e,t,r,n,o;return h(this,function(i){switch(i.label){case 0:if(this.isProcessing)return[2];this.isProcessing=!0,i.label=1;case 1:if(i.trys.push([1,,8,9]),0===(e=this.getQueueRaw()).length)return[2];console.log("[AInamika Error Storage] Processing ".concat(e.length," queued errors")),t=0,r=e,i.label=2;case 2:if(!(t<r.length))return[3,7];if((n=r[t]).retryCount>=this.config.maxRetries)return console.warn("[AInamika Error Storage] Max retries reached for error ".concat(n.id)),this.removeError(n.id),[3,6];if(n.lastRetry&&Date.now()-n.lastRetry<this.config.retryInterval)return[3,6];i.label=3;case 3:return i.trys.push([3,5,,6]),[4,this.sendError(n)];case 4:return i.sent()?(this.removeError(n.id),console.log("[AInamika Error Storage] Successfully sent error ".concat(n.id))):this.incrementRetryCount(n.id),[3,6];case 5:return o=i.sent(),console.error("[AInamika Error Storage] Failed to send error ".concat(n.id,":"),o),this.incrementRetryCount(n.id),[3,6];case 6:return t++,[3,2];case 7:return[3,9];case 8:return this.isProcessing=!1,[7];case 9:return[2]}})})},e.prototype.retryError=function(e){return l(this,void 0,void 0,function(){var t,r,n;return h(this,function(o){switch(o.label){case 0:if(t=this.getQueueRaw(),!(r=t.find(function(t){return t.id===e})))return[2,!1];o.label=1;case 1:return o.trys.push([1,3,,4]),[4,this.sendError(r)];case 2:return o.sent()?(this.removeError(e),[2,!0]):(this.incrementRetryCount(e),[2,!1]);case 3:return n=o.sent(),console.error("[AInamika Error Storage] Failed to retry error ".concat(e,":"),n),this.incrementRetryCount(e),[2,!1];case 4:return[2]}})})},e.prototype.addToQueue=function(e){return l(this,void 0,void 0,function(){var t,r;return h(this,function(n){if((t=this.getQueueRaw()).push(e),r=JSON.stringify(t),new Blob([r]).size>this.config.maxStorageSize)for(;t.length>0&&new Blob([JSON.stringify(t)]).size>this.config.maxStorageSize;)t.shift(),console.warn("[AInamika Error Storage] Removed old error due to size limit");return localStorage.setItem(this.STORAGE_KEY,JSON.stringify(t)),[2]})})},e.prototype.getQueueRaw=function(){try{var e=localStorage.getItem(this.STORAGE_KEY);return e?JSON.parse(e):[]}catch(e){return console.error("[AInamika Error Storage] Failed to parse stored errors:",e),[]}},e.prototype.incrementRetryCount=function(e){try{var t=this.getQueueRaw(),r=t.findIndex(function(t){return t.id===e});-1!==r&&(t[r].retryCount++,t[r].lastRetry=Date.now(),localStorage.setItem(this.STORAGE_KEY,JSON.stringify(t)))}catch(e){console.error("[AInamika Error Storage] Failed to increment retry count:",e)}},e.prototype.sendError=function(e){return l(this,void 0,void 0,function(){var t,r,n,o;return h(this,function(i){switch(i.label){case 0:return i.trys.push([0,2,,3]),t=this.config.compressionEnabled?this.decompressData(e.errorData):e.errorData,r=t.endpoint||c.ERRORS,n=t.apiKey||"",[4,fetch("".concat(r,"/api/v1/errors"),{method:"POST",headers:{"Content-Type":"application/json",Authorization:n?"Bearer ".concat(n):""},body:JSON.stringify(t)})];case 1:return[2,i.sent().ok];case 2:return o=i.sent(),console.error("[AInamika Error Storage] Network error sending stored error:",o),[2,!1];case 3:return[2]}})})},e.prototype.compressData=function(e){try{var t=JSON.stringify(e);return btoa(t)}catch(t){return console.warn("[AInamika Error Storage] Compression failed, storing uncompressed:",t),e}},e.prototype.decompressData=function(e){try{if("string"==typeof e&&e.length>0){var t=atob(e);return JSON.parse(t)}return e}catch(t){return console.warn("[AInamika Error Storage] Decompression failed, returning raw data:",t),e}},e.prototype.generateErrorId=function(){return"error_".concat(Date.now(),"_").concat(Math.random().toString(36).substr(2,9))},e.prototype.cleanupOldErrors=function(){try{var e=this.getQueueRaw(),t=Date.now()-6048e5,r=e.filter(function(e){return e.timestamp>t});r.length!==e.length&&(localStorage.setItem(this.STORAGE_KEY,JSON.stringify(r)),console.log("[AInamika Error Storage] Cleaned up ".concat(e.length-r.length," old errors")))}catch(e){console.error("[AInamika Error Storage] Failed to cleanup old errors:",e)}},e.prototype.startRetryTimer=function(){var e=this;this.retryTimer=window.setInterval(function(){e.processQueue()},this.config.retryInterval)},e.prototype.setupStorageListener=function(){var e=this;window.addEventListener("storage",function(t){t.key===e.STORAGE_KEY&&(console.log("[AInamika Error Storage] Storage updated from another tab"),setTimeout(function(){return e.processQueue()},1e3))}),window.addEventListener("online",function(){console.log("[AInamika Error Storage] Network back online, processing queue"),setTimeout(function(){return e.processQueue()},1e3)}),window.addEventListener("offline",function(){console.log("[AInamika Error Storage] Network offline, errors will be queued")})},e.prototype.updateMetadata=function(){try{var e=this.getStorageStats(),t=u({lastUpdate:Date.now()},e);localStorage.setItem(this.METADATA_KEY,JSON.stringify(t))}catch(e){console.error("[AInamika Error Storage] Failed to update metadata:",e)}},e.prototype.exportErrors=function(){try{var e=this.getStoredErrors(),t={timestamp:Date.now(),version:"1.0",stats:this.getStorageStats(),errors:e};return JSON.stringify(t,null,2)}catch(e){return console.error("[AInamika Error Storage] Failed to export errors:",e),"{}"}},e.prototype.importErrors=function(e){try{var t=JSON.parse(e);if(!t.errors||!Array.isArray(t.errors))throw new Error("Invalid export format");this.clearAll();for(var r=0,n=t.errors;r<n.length;r++){var o=n[r];this.storeError(o.errorData)}return console.log("[AInamika Error Storage] Imported ".concat(t.errors.length," errors")),!0}catch(e){return console.error("[AInamika Error Storage] Failed to import errors:",e),!1}},e.prototype.destroy=function(){this.retryTimer&&(clearInterval(this.retryTimer),this.retryTimer=void 0),this.processQueue(),console.log("[AInamika Error Storage] Storage instance destroyed")},e}(),p=(function(){function e(){}e.getAinamikaStorageUsage=function(){var e=0,t=0,r=0;for(var n in localStorage)if(localStorage.hasOwnProperty(n)){var o=new Blob([localStorage.getItem(n)||""]).size;e+=o,n.startsWith("ainamika_error")?t+=o:n.startsWith("ainamika_")&&(r+=o)}return{totalSize:e,errorSize:t,otherSize:r}},e.checkStorageSpace=function(e){try{var t="ainamika_storage_test",r="x".repeat(Math.min(e,1048576));return localStorage.setItem(t,r),localStorage.removeItem(t),!0}catch(e){return!1}},e.cleanupAllAinamikaStorage=function(){var e=[];for(var t in localStorage)t.startsWith("ainamika_")&&e.push(t);e.forEach(function(e){return localStorage.removeItem(e)}),console.log("[AInamika Storage Utils] Cleaned up ".concat(e.length," storage keys"))},e.generateStorageReport=function(){var t=new d;return{usage:e.getAinamikaStorageUsage(),errors:t.getStoredErrors(),metadata:t.getStorageStats()}}}(),function(){return p=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},p.apply(this,arguments)}),f=function(){function e(){this.userId=null,this.userProperties={},this.initializeUser()}return e.prototype.initializeUser=function(){this.userId=this.getOrCreateUserId()},e.prototype.getOrCreateUserId=function(){try{var e=localStorage.getItem("ainamika_user_id");return e||(e=this.generateAnonymousId(),localStorage.setItem("ainamika_user_id",e)),e}catch(e){return console.warn("[UserManager] localStorage not available, using session ID"),this.generateAnonymousId()}},e.prototype.generateAnonymousId=function(){return"anon_"+Math.random().toString(36).substr(2,9)+"_"+Date.now()},e.prototype.getUserId=function(){return this.userId||(this.userId=this.getOrCreateUserId()),this.userId},e.prototype.getUserProperties=function(){return p({},this.userProperties)},e.prototype.identifyUser=function(e,t){var r=this.getUserId();try{localStorage.setItem("ainamika_user_id",e),this.userId=e,t&&(this.userProperties=p(p({},this.userProperties),t)),console.log("[UserManager] User identified: ".concat(r," → ").concat(e))}catch(e){console.error("[UserManager] Error identifying user:",e)}},e.prototype.updateUserProperties=function(e){this.userProperties=p(p({},this.userProperties),e)},e.prototype.clearUser=function(){try{localStorage.removeItem("ainamika_user_id"),this.userId=null,this.userProperties={},this.initializeUser()}catch(e){console.error("[UserManager] Error clearing user:",e)}},e.prototype.getUserIdentificationEvent=function(e){return{event:"user_identified",previous_id:this.getUserId(),user_id:e,timestamp:Date.now(),properties:this.userProperties}},e.prototype.isAnonymousUser=function(){return this.getUserId().startsWith("anon_")},e.prototype.getUserType=function(){return this.isAnonymousUser()?"anonymous":"authenticated"},e}(),g=function(){return g=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},g.apply(this,arguments)},m=function(){function e(){this.userJourney=[],this.lastEventTime=0,this.sequenceIndex=0,this.maxJourneyLength=50,this.journeyAnalysisThreshold=5,this.journeyStartTime=Date.now()}return e.prototype.trackEvent=function(e,t){var r=Date.now(),n=this.lastEventTime?r-this.lastEventTime:0,o={eventName:e,timestamp:r,properties:g(g({},t),{timeSinceLastEvent:n,journeyPosition:this.sequenceIndex}),sequenceIndex:this.sequenceIndex++};this.userJourney.push(o),this.lastEventTime=r,this.userJourney.length>this.maxJourneyLength&&(this.userJourney=this.userJourney.slice(-this.maxJourneyLength)),console.log("[JourneyTracker] Event tracked: ".concat(e," (position: ").concat(o.sequenceIndex,")"))},e.prototype.getContext=function(){var e=Date.now();return{journeySequence:this.getJourneySequence(),eventCount:this.userJourney.length,lastEventTime:this.lastEventTime,journeyStartTime:this.journeyStartTime,timeSinceLastEvent:this.lastEventTime?e-this.lastEventTime:0}},e.prototype.getJourneySequence=function(){return this.userJourney.map(function(e){return e.eventName})},e.prototype.getJourneyData=function(){return function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))}([],this.userJourney,!0)},e.prototype.shouldAnalyzeJourney=function(){return this.userJourney.length>=this.journeyAnalysisThreshold&&this.userJourney.length%this.journeyAnalysisThreshold===0},e.prototype.getJourneyForAnalysis=function(){var e=Date.now()-this.journeyStartTime,t=this.calculateAverageTimeBetweenEvents();return{journey:this.userJourney.map(function(e){return{name:e.eventName,timestamp:e.timestamp,properties:e.properties}}),metadata:{journeyLength:this.userJourney.length,journeyDuration:e,avgTimeBetweenEvents:t,startTime:this.journeyStartTime,endTime:this.lastEventTime}}},e.prototype.calculateAverageTimeBetweenEvents=function(){if(this.userJourney.length<2)return 0;for(var e=0,t=1;t<this.userJourney.length;t++)e+=this.userJourney[t].timestamp-this.userJourney[t-1].timestamp;return Math.round(e/(this.userJourney.length-1))},e.prototype.findPatterns=function(){var e={};if(this.userJourney.length<3)return e;for(var t=0;t<=this.userJourney.length-3;t++){var r=this.userJourney.slice(t,t+3).map(function(e){return e.eventName}).join(" → ");e[r]=(e[r]||0)+1}return Object.fromEntries(Object.entries(e).filter(function(e){return e[0],e[1]>1}))},e.prototype.clearJourney=function(){this.userJourney=[],this.sequenceIndex=0,this.lastEventTime=0,this.journeyStartTime=Date.now()},e.prototype.getJourneySegment=function(e){return this.userJourney.slice(-e)},e.prototype.detectPotentialFunnel=function(){for(var e=this.getJourneySequence().slice(-5),t=0,r=Object.entries({signup_flow:["view_pricing","click_signup","enter_email"],purchase_flow:["view_product","add_to_cart","view_cart"],onboarding_flow:["user_signup","profile_setup","tutorial_start"]});t<r.length;t++){var n=r[t],o=n[0];if(n[1].filter(function(t){return e.includes(t)}).length>=2)return o}return null},e}(),y=function(e,t,r,n){return new(r||(r=Promise))(function(o,i){function s(e){try{c(n.next(e))}catch(e){i(e)}}function a(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(s,a)}c((n=n.apply(e,t||[])).next())})},v=function(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&a[0]?n.return:a[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,a[1])).done)return o;switch(n=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,n=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){i.label=a[1];break}if(6===a[0]&&i.label<o[1]){i.label=o[1],o=a;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(a);break}o[2]&&i.ops.pop(),i.trys.pop();continue}a=t.call(e,i)}catch(e){a=[6,e],n=0}finally{r=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}},b=function(){function e(e,t,r){void 0===r&&(r=!1),this.accessToken=null,this.refreshToken=null,this.tokenExpiry=null,this.clientId=e,this.apiEndpoint=t,this.debug=r,this.loadTokens()}return e.prototype.initialize=function(){return y(this,void 0,void 0,function(){var e,t;return v(this,function(r){switch(r.label){case 0:return r.trys.push([0,4,,5]),this.isTokenValid()?(this.debugLog("Using existing valid token"),[2,!0]):this.refreshToken?[4,this.refreshAccessToken()]:[3,2];case 1:if(r.sent())return[2,!0];r.label=2;case 2:return[4,this.requestTokens()];case 3:return(e=r.sent())?(this.setTokens(e),[2,!0]):[2,!1];case 4:return t=r.sent(),this.debugLog("Authentication initialization failed:",t),[2,!1];case 5:return[2]}})})},e.prototype.requestTokens=function(){return y(this,void 0,void 0,function(){var e,t;return v(this,function(r){switch(r.label){case 0:return r.trys.push([0,3,,4]),[4,fetch("".concat(this.apiEndpoint,"/api/v1/auth/token"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({client_id:this.clientId})})];case 1:if(!(e=r.sent()).ok)throw new Error("Token request failed: ".concat(e.status));return[4,e.json()];case 2:return[2,r.sent()];case 3:return t=r.sent(),this.debugLog("Token request error:",t),[2,null];case 4:return[2]}})})},e.prototype.refreshAccessToken=function(){return y(this,void 0,void 0,function(){var e,t,r;return v(this,function(n){switch(n.label){case 0:if(!this.refreshToken)return[2,!1];n.label=1;case 1:return n.trys.push([1,4,,5]),[4,fetch("".concat(this.apiEndpoint,"/api/v1/auth/refresh"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({refresh_token:this.refreshToken})})];case 2:return(e=n.sent()).ok?[4,e.json()]:(this.clearTokens(),[2,!1]);case 3:return t=n.sent(),this.setTokens(t),[2,!0];case 4:return r=n.sent(),this.debugLog("Token refresh error:",r),[2,!1];case 5:return[2]}})})},e.prototype.getAccessToken=function(){return y(this,void 0,void 0,function(){return v(this,function(e){switch(e.label){case 0:return this.shouldRefreshToken()?[4,this.refreshAccessToken()]:[3,2];case 1:e.sent(),e.label=2;case 2:return this.isTokenValid()?[3,4]:[4,this.initialize()];case 3:if(!e.sent())return[2,null];e.label=4;case 4:return[2,this.accessToken]}})})},e.prototype.getAuthHeaders=function(){return y(this,void 0,void 0,function(){var e;return v(this,function(t){switch(t.label){case 0:return[4,this.getAccessToken()];case 1:return(e=t.sent())?[2,{Authorization:"Bearer ".concat(e)}]:[2,{"X-Client-ID":this.clientId}]}})})},e.prototype.isTokenValid=function(){return!(!this.accessToken||!this.tokenExpiry)&&Date.now()<this.tokenExpiry},e.prototype.shouldRefreshToken=function(){return!(!this.tokenExpiry||!this.refreshToken)&&Date.now()>this.tokenExpiry-3e5},e.prototype.setTokens=function(e){this.accessToken=e.access_token,this.refreshToken=e.refresh_token||this.refreshToken,this.tokenExpiry=Date.now()+1e3*e.expires_in,this.saveTokens(),this.scheduleTokenRefresh(),this.debugLog("Tokens set successfully")},e.prototype.scheduleTokenRefresh=function(){var e=this;this.refreshTimer&&clearTimeout(this.refreshTimer);var t=Math.max(0,this.tokenExpiry-Date.now()-3e5);this.refreshTimer=setTimeout(function(){e.refreshAccessToken()},t)},e.prototype.saveTokens=function(){if("undefined"!=typeof window&&window.localStorage){var e={accessToken:this.accessToken,refreshToken:this.refreshToken,tokenExpiry:this.tokenExpiry};localStorage.setItem("ainamika_auth_".concat(this.clientId),JSON.stringify(e))}},e.prototype.loadTokens=function(){if("undefined"!=typeof window&&window.localStorage){var e=localStorage.getItem("ainamika_auth_".concat(this.clientId));if(e)try{var t=JSON.parse(e);this.accessToken=t.accessToken,this.refreshToken=t.refreshToken,this.tokenExpiry=t.tokenExpiry,this.isTokenValid()&&this.scheduleTokenRefresh()}catch(e){this.debugLog("Failed to load stored tokens:",e)}}},e.prototype.clearTokens=function(){this.accessToken=null,this.refreshToken=null,this.tokenExpiry=null,"undefined"!=typeof window&&window.localStorage&&localStorage.removeItem("ainamika_auth_".concat(this.clientId)),this.refreshTimer&&(clearTimeout(this.refreshTimer),this.refreshTimer=void 0)},e.prototype.logout=function(){return y(this,void 0,void 0,function(){var e;return v(this,function(t){switch(t.label){case 0:return t.trys.push([0,3,4,5]),this.accessToken?[4,fetch("".concat(this.apiEndpoint,"/api/v1/auth/logout"),{method:"POST",headers:{Authorization:"Bearer ".concat(this.accessToken)}})]:[3,2];case 1:t.sent(),t.label=2;case 2:return[3,5];case 3:return e=t.sent(),this.debugLog("Logout error:",e),[3,5];case 4:return this.clearTokens(),[7];case 5:return[2]}})})},e.prototype.debugLog=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this.debug&&console.log.apply(console,function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))}(["[Ainamika Auth]"],e,!1))},e}(),k=function(){return k=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},k.apply(this,arguments)},w=function(e,t,r,n){return new(r||(r=Promise))(function(o,i){function s(e){try{c(n.next(e))}catch(e){i(e)}}function a(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(s,a)}c((n=n.apply(e,t||[])).next())})},S=function(e,t){var r,n,o,i={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=a(0),s.throw=a(1),s.return=a(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function a(a){return function(c){return function(a){if(r)throw new TypeError("Generator is already executing.");for(;s&&(s=0,a[0]&&(i=0)),i;)try{if(r=1,n&&(o=2&a[0]?n.return:a[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,a[1])).done)return o;switch(n=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return i.label++,{value:a[1],done:!1};case 5:i.label++,n=a[1],a=[0];continue;case 7:a=i.ops.pop(),i.trys.pop();continue;default:if(!((o=(o=i.trys).length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){i=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){i.label=a[1];break}if(6===a[0]&&i.label<o[1]){i.label=o[1],o=a;break}if(o&&i.label<o[2]){i.label=o[2],i.ops.push(a);break}o[2]&&i.ops.pop(),i.trys.pop();continue}a=t.call(e,i)}catch(e){a=[6,e],n=0}finally{r=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,c])}}},E=function(){function e(e){if(this.eventQueue=[],this.isInitialized=!1,this.batchRetryCount=0,this.maxBatchRetries=5,this.domHashCache={},this.lastDomHash="",this.lastConfigHash="",this.mutationDebounceTimer=null,this.mutationDebounceMs=2e3,this.attachedListeners=new WeakMap,!e.projectKey&&!e.clientId&&!e.apiKey)throw new Error("[AInamika SDK] Either projectKey or clientId is required for initialization");this.config=k({endpoint:a.API_BASE_URL,batchInterval:5e3,useWebWorker:!0,debug:a.DEBUG,errorTracking:{enabled:!0,captureScreenshots:!0,captureDomSnapshots:!0,maxStackTraceDepth:50,maxErrorsPerSession:100,debounceMs:1e3,enableNetworkTracking:!0,enableConsoleCapture:!0}},e),this.sessionId=this.generateSessionId(),this.userIdentifier=this.getOrCreateUserIdentifier(),this.userManager=new f,this.journeyTracker=new m,this.authManager=new b(this.config.clientId||this.config.apiKey||"",this.config.endpoint,this.config.debug);var t=new Blob(["\n self.eventQueue = [];\n self.config = {\n apiUrl: '',\n batchSize: 10,\n batchInterval: 5000,\n headers: { 'Content-Type': 'application/json' }\n };\n let batchTimer = null;\n function flushQueue() {\n self.postMessage({ status: 'debug', message: '[AInamika Worker] flushQueue called', eventQueue: self.eventQueue, config: self.config });\n if (self.eventQueue.length === 0) return;\n const batch = self.eventQueue.splice(0, self.config.batchSize);\n fetch(self.config.apiUrl, {\n method: 'POST',\n headers: self.config.headers,\n body: JSON.stringify({ events: batch })\n }).then(r => {\n if (r.ok) {\n self.postMessage({ status: 'success' });\n } else {\n self.postMessage({ status: 'error', error: r.statusText, failedEvents: batch });\n }\n }).catch(e => {\n self.postMessage({ status: 'error', error: e.message, failedEvents: batch });\n });\n }\n self.onmessage = function(e) {\n self.postMessage({ status: 'debug', message: '[AInamika Worker] onmessage', data: e.data });\n if (e.data.type === 'config') {\n self.config = { ...self.config, ...e.data.payload };\n if (batchTimer) clearInterval(batchTimer);\n batchTimer = setInterval(flushQueue, self.config.batchInterval);\n self.postMessage({ status: 'debug', message: '[AInamika Worker] config set', config: self.config });\n } else if (e.data.type === 'track') {\n self.eventQueue.push(e.data.payload);\n // Only send when timer triggers, not when batch size is reached\n // This ensures true batching behavior\n } else if (e.data.type === 'batch') {\n // Handle batch flush from main thread\n self.postMessage({ status: 'debug', message: '[AInamika Worker] Received batch from main thread', events: e.data.events });\n self.eventQueue.push(...e.data.events);\n flushQueue();\n } else if (e.data.type === 'initConfig') {\n // No-op for now, can be used for advanced config\n }\n };\n "],{type:"application/javascript"}),r=URL.createObjectURL(t);this.worker=new Worker(r),this.initialize()}return e.prototype.initialize=function(){return w(this,void 0,void 0,function(){var e,t,r,n;return S(this,function(o){switch(o.label){case 0:if(this.isInitialized)return[2];if(this.isInitialized=!0,!this.config.projectKey)return[3,5];o.label=1;case 1:return o.trys.push([1,4,,5]),[4,this.initializeProjectSettings()];case 2:return o.sent(),[4,this.initializeSamplingDecision()];case 3:return o.sent(),this.log("Project-based initialization complete",{projectKey:this.config.projectKey,projectSettings:this.projectSettings,samplingDecision:this.samplingDecision}),[3,5];case 4:return e=o.sent(),this.log("Project initialization failed:",e),console.warn("[AInamika SDK] Failed to initialize project settings. Some features may be limited."),[3,5];case 5:if(!this.config.clientId&&!this.config.apiKey)return[3,9];o.label=6;case 6:return o.trys.push([6,8,,9]),[4,this.authManager.initialize()];case 7:return o.sent(),this.log("Authentication initialized"),[3,9];case 8:return t=o.sent(),this.log("Authentication initialization failed:",t),this.config.debug||console.warn("[Ainamika] Running without authentication. Some features may be limited."),[3,9];case 9:return(null===(r=this.config.errorTracking)||void 0===r?void 0:r.enabled)&&this.shouldSampleErrors()?this.initializeErrorTracking():(null===(n=this.config.errorTracking)||void 0===n?void 0:n.enabled)&&!this.shouldSampleErrors()&&this.log("Error tracking disabled due to sampling decision"),this.config.autoConfig?[4,this.setupAutoConfiguration()]:[3,11];case 10:o.sent(),o.label=11;case 11:return this.setupDynamicDomTracking(),this.config.useWebWorker&&"undefined"!=typeof Worker?[4,this.setupWebWorker()]:[3,13];case 12:return o.sent(),[3,14];case 13:this.startBatchTimer(),o.label=14;case 14:return this.log("AnalyticsPro SDK initialized",{config:this.config,projectKey:this.config.projectKey,sampling:this.samplingDecision}),[2]}})})},e.prototype.getOrCreateUserIdentifier=function(){var e="ainamika_user_identifier",t=localStorage.getItem(e);return t||(t="anon_"+Math.random().toString(36).substr(2,16)+Date.now().toString(36),localStorage.setItem(e,t),this.log("Created new user identifier:",t)),t},e.prototype.initializeProjectSettings=function(){return w(this,void 0,void 0,function(){var e,t,r;return S(this,function(n){switch(n.label){case 0:if(!this.config.projectKey)return[2];n.label=1;case 1:return n.trys.push([1,4,,5]),[4,fetch(c.PROJECTS_LOOKUP,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_key:this.config.projectKey})})];case 2:if(!(e=n.sent()).ok)throw new Error("Project lookup failed: ".concat(e.status));return t=this,[4,e.json()];case 3:return t.projectSettings=n.sent(),this.log("Project settings loaded:",this.projectSettings),[3,5];case 4:throw r=n.sent(),this.log("Failed to load project settings:",r),r;case 5:return[2]}})})},e.prototype.initializeSamplingDecision=function(){return w(this,void 0,void 0,function(){var e,t,r;return S(this,function(n){switch(n.label){case 0:if(!this.config.projectKey)return[2];n.label=1;case 1:return n.trys.push([1,4,,5]),[4,fetch(c.SAMPLING_CHECK,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({project_key:this.config.projectKey,user_identifier:this.userIdentifier})})];case 2:if(!(e=n.sent()).ok)throw new Error("Sampling check failed: ".concat(e.status));return t=this,[4,e.json()];case 3:return t.samplingDecision=n.sent(),this.log("Sampling decision received:",this.samplingDecision),this.cacheSamplingDecision(),[3,5];case 4:return r=n.sent(),this.log("Failed to get sampling decision, using cached or defaults:",r),this.loadCachedSamplingDecision(),[3,5];case 5:return[2]}})})},e.prototype.cacheSamplingDecision=function(){if(this.samplingDecision){var e="ainamika_sampling_".concat(this.config.projectKey);localStorage.setItem(e,JSON.stringify(this.samplingDecision))}},e.prototype.loadCachedSamplingDecision=function(){var e="ainamika_sampling_".concat(this.config.projectKey),t=localStorage.getItem(e);if(t)try{this.samplingDecision=JSON.parse(t),this.log("Loaded cached sampling decision:",this.samplingDecision)}catch(e){this.samplingDecision={should_sample:{events:!0,errors:!0,session_replay:!1},rates:{events:100,errors:100,session_replay:0},decision:"existing"}}else this.samplingDecision={should_sample:{events:!0,errors:!0,session_replay:!1},rates:{events:100,errors:100,session_replay:0},decision:"existing"}},e.prototype.shouldSampleEvents=function(){return!this.samplingDecision||this.samplingDecision.should_sample.events},e.prototype.shouldSampleErrors=function(){return!this.samplingDecision||this.samplingDecision.should_sample.errors},e.prototype.shouldSampleSessionReplay=function(){return!!this.samplingDecision&&this.samplingDecision.should_sample.session_replay},e.prototype.getSamplingStatus=function(){return this.samplingDecision||null},e.prototype.getProjectInfo=function(){return this.projectSettings||null},e.prototype.initializeErrorTracking=function(){var e,t,r,n,o,i,c,u,l,h,p,f,g,m;try{this.errorStorage=new d({maxStorageSize:5242880,maxRetries:5,retryInterval:3e4,compressionEnabled:!0,encryptionEnabled:!1});var y={endpoint:a.API_BASE_URL,clientId:this.config.clientId||"",apiKey:this.config.apiKey,authManager:this.authManager,captureScreenshots:null===(t=null===(e=this.config.errorTracking)||void 0===e?void 0:e.captureScreenshots)||void 0===t||t,captureDomSnapshots:null===(n=null===(r=this.config.errorTracking)||void 0===r?void 0:r.captureDomSnapshots)||void 0===n||n,maxStackTraceDepth:null!==(i=null===(o=this.config.errorTracking)||void 0===o?void 0:o.maxStackTraceDepth)&&void 0!==i?i:50,maxErrorsPerSession:null!==(u=null===(c=this.config.errorTracking)||void 0===c?void 0:c.maxErrorsPerSession)&&void 0!==u?u:100,debounceMs:null!==(h=null===(l=this.config.errorTracking)||void 0===l?void 0:l.debounceMs)&&void 0!==h?h:1e3,enableNetworkTracking:null===(f=null===(p=this.config.errorTracking)||void 0===p?void 0:p.enableNetworkTracking)||void 0===f||f,enableConsoleCapture:null===(m=null===(g=this.config.errorTracking)||void 0===g?void 0:g.enableConsoleCapture)||void 0===m||m};this.errorTracker=new s(y);var v=this.getUserId();v&&this.errorTracker&&this.errorTracker.setUser(v),this.log("Error tracking initialized successfully")}catch(e){console.error("[AInamika SDK] Failed to initialize error tracking:",e)}},e.prototype.captureException=function(e,t){this.errorTracker&&this.errorTracker.captureException(e,t)},e.prototype.setUser=function(e){console.warn("[AInamika SDK] setUser is deprecated. Please use identifyUser() instead."),this.identifyUser(e)},e.prototype.flushStoredErrors=function(){return w(this,void 0,void 0,function(){return S(this,function(e){switch(e.label){case 0:return this.errorStorage?[4,this.errorStorage.processQueue()]:[3,2];case 1:e.sent(),e.label=2;case 2:return this.errorTracker?[4,this.errorTracker.flushStoredErrors()]:[3,4];case 3:e.sent(),e.label=4;case 4:return[2]}})})},e.prototype.setupAutoConfiguration=function(){return w(this,void 0,void 0,function(){var e,t,r,n;return S(this,function(o){switch(o.label){case 0:return o.trys.push([0,7,,8]),this.log("Starting auto-configuration..."),[4,this.getDOMStructure()];case 1:return e=o.sent(),t=this.computeDomHash(e),this.lastDomHash=t,(r=this.getCachedConfigForDomHash(t))?(this.log("Loaded analytics config from localStorage cache for DOM hash:",t),[3,4]):[3,2];case 2:return[4,this.loadConfigFromFile()];case 3:(r=o.sent())&&this.log("Loaded analytics config from file"),o.label=4;case 4:return r?[3,6]:(this.log("No cached config found, fetching from backend for DOM hash:",t),[4,this.fetchGeneratedConfig(e,t)]);case 5:(r=o.sent())&&r.events_to_track&&(this.saveConfigToFile(r),this.setCachedConfigForDomHash(t,r),this.lastConfigHash=r.config_hash||""),o.label=6;case 6:return r&&r.events_to_track?(this.applyGeneratedConfig(r),this.config.useWebWorker&&"undefined"!=typeof Worker&&this.worker.postMessage({type:"initConfig",config:r}),this.log("Auto-configuration applied successfully",r)):this.log("Auto-configuration failed: Invalid config received from backend.",r),[3,8];case 7:return n=o.sent(),this.log("Auto-configuration failed with error",n),[3,8];case 8:return[2]}})})},e.prototype.getDOMStructure=function(){return w(this,void 0,void 0,function(){var e,t,r,n,o;return S(this,function(i){switch(i.label){case 0:return e=function(e){if(e.id)return"#".concat(e.id);if(e.className){var t=e.className.split(" ").filter(function(e){return e.trim()}).join(".");return t?".".concat(t):e.tagName.toLowerCase()}return e.tagName.toLowerCase()},[4,new Promise(function(e){return setTimeout(e,500)})];case 1:return i.sent(),t=Array.from(document.body.querySelectorAll('\n button, a, input, select, textarea, form, img, h1, h2, h3, h4, h5, h6,\n [role=button], [role=link], [onclick], [tabindex], [data-analytics], [data-track],\n .card, .btn, .btn-primary, .btn-secondary, .card-title, .card-description, .card-price, .card-actions,\n [id*="card"], [class*="card"], [class*="btn"], [class*="price"], [class*="title"],\n div, span, p\n ')),r=t.filter(function(e){var t=window.getComputedStyle(e),r="none"!==t.display&&"hidden"!==t.visibility&&"0"!==t.opacity,n="button"===e.tagName.toLowerCase()||"a"===e.tagName.toLowerCase()||e.hasAttribute("onclick")||"button"===e.getAttribute("role")||e.classList.contains("btn")||e.classList.contains("card"),o="cardsContainer"===e.id||e.classList.contains("cards-grid")||e.classList.contains("card")||"img"===e.tagName.toLowerCase()||-1!==["h1","h2","h3"].indexOf(e.tagName.toLowerCase());return r&&(n||o)||"cardsContainer"===e.id}),n=new Set,o=r.map(function(t){var r,n,o={};return Array.from(t.attributes).forEach(function(e){-1===["style","data-timestamp","data-rendered"].indexOf(e.name)&&(o[e.name]=e.value.length>25?e.value.substring(0,25):e.value)}),{tagName:t.tagName.toLowerCase(),selector:e(t),id:t.id||"",className:t.className||"",textContent:(t.textContent||"").trim().substring(0,100),attributes:o,isInteractive:"button"===t.tagName.toLowerCase()||"a"===t.tagName.toLowerCase()||t.hasAttribute("onclick")||"button"===t.getAttribute("role")||t.classList.contains("btn"),hasChildren:t.children.length>0,childCount:t.children.length,parentTagName:(null===(r=t.parentElement)||void 0===r?void 0:r.tagName.toLowerCase())||"",index:Array.from((null===(n=t.parentElement)||void 0===n?void 0:n.children)||[]).indexOf(t)}}).filter(function(e){var t=e.tagName+"|"+e.selector+"|"+e.textContent.substring(0,20);return!n.has(t)&&(n.add(t),!0)}),this.log("DOM structure analyzed",{elementCount:o.length,elements:o}),[2,{elements:o}]}})})},e.prototype.fetchGeneratedConfig=function(e,t){return w(this,void 0,void 0,function(){var r,n,o,i,s;return S(this,function(a){switch(a.label){case 0:return a.trys.push([0,4,,5]),e&&e.elements&&0===e.elements.length?(this.log("No elements found in DOM structure, skipping config fetch."),[2,null]):(r={"Content-Type":"application/json"},[4,this.authManager.getAuthHeaders()]);case 1:return n=a.sent(),r=k(k({},r),n),o={structure:e},t&&(o.domHash=t,o.lastConfigHash=this.lastConfigHash),[4,fetch(c.CONFIG,{method:"POST",headers:r,body:JSON.stringify(o)})];case 2:if(!(i=a.sent()).ok)throw new Error("Backend returned ".concat(i.status));return[4,i.json()];case 3:return[2,a.sent()];case 4:return s=a.sent(),this.log("Error fetching generated config:",s),[2,null];case 5:return[2]}})})},e.prototype.applyGeneratedConfig=function(e){var t=this;e.events_to_track.forEach(function(e){try{var r=document.querySelectorAll(e.element_selector);r.length>0?r.forEach(function(r){var n=t.attachedListeners.get(r);n||(n=new Set,t.attachedListeners.set(r,n)),(Array.isArray(e.event_type)?e.event_type:[e.event_type]).forEach(function(o){n.has(o)||(n.add(o),"click"===o&&(r.addEventListener("click",function(r){var n=r.target,o=t.extractElementData(n);t.sendToWorker(e.event_name,{selector:e.element_selector,eventType:"click",element:o,timestamp:(new Date).toISOString()})}),t.log('Attached click listener for "'.concat(e.event_name,'" on "').concat(e.element_selector,'"'))),"view"===o&&"IntersectionObserver"in window&&(new IntersectionObserver(function(r){r.forEach(function(r){if(r.isIntersecting){var n=r.target,o=t.extractElementData(n);t.sendToWorker(e.event_name,{selector:e.element_selector,eventType:"view",element:o,intersectionRatio:r.intersectionRatio,timestamp:(new Date).toISOString()})}})},{threshold:[.1,.5,1]}).observe(r),t.log('Attached IntersectionObserver for "'.concat(e.event_name,'" on "').concat(e.element_selector,'"'))),"focus"!==o&&"blur"!==o||(r.addEventListener(o,function(){var n=r,i=t.extractElementData(n);t.sendToWorker(e.event_name,{selector:e.element_selector,eventType:o,element:i,timestamp:(new Date).toISOString()})}),t.log("Attached ".concat(o,' listener for "').concat(e.event_name,'" on "').concat(e.element_selector,'"'))))})}):t.log('No elements found for selector: "'.concat(e.element_selector,'"'))}catch(r){t.log('Error applying selector "'.concat(e.element_selector,'":'),r)}}),e.observe_mutations&&"MutationObserver"in window&&(new MutationObserver(function(e){e.forEach(function(e){t.sendToWorker("dom_mutation",{type:e.type,target:e.target.outerHTML,timestamp:(new Date).toISOString()})})}).observe(document.body,{childList:!0,subtree:!0}),this.log("MutationObserver attached for DOM changes"))},e.prototype.extractElementData=function(e){var t=e.getBoundingClientRect();return{tagName:e.tagName.toLowerCase(),id:e.id||"",className:e.className||"",textContent:(e.textContent||"").trim().substring(0,100),attributes:Array.from(e.attributes).reduce(function(e,t){return e[t.name]=t.value,e},{}),position:{x:Math.round(t.x),y:Math.round(t.y),width:Math.round(t.width),height:Math.round(t.height)},href:e.href||void 0,value:e.value||void 0}},e.prototype.sendToWorker=function(e,t){var r;if(this.shouldSampleEvents()){var n=new Date,o={event:e,properties:t,timestamp:n.getTime(),created_at:n.toISOString(),userId:this.getUserId(),sessionId:this.sessionId,project_key:this.config.projectKey||void 0,client_id:this.config.clientId||this.config.apiKey||void 0,project_id:(null===(r=this.projectSettings)||void 0===r?void 0:r.project_id)||void 0};this.config.useWebWorker&&"undefined"!=typeof Worker?this.worker.postMessage({type:"track",payload:o}):this.eventQueue.push(o),this.log("Event tracked:",o)}else this.log("Event skipped due to sampling:",e)},e.prototype.setupWebWorker=function(){return w(this,void 0,void 0,function(){var e,t,r,n,o,i=this;return S(this,function(s){switch(s.label){case 0:return[4,this.authManager.getAuthHeaders()];case 1:return e=s.sent(),this.worker.postMessage({type:"config",payload:{apiUrl:(null===(t=this.config.apiDetails)||void 0===t?void 0:t.apiEndPoint)||"".concat(this.config.endpoint,"/api/v1/events"),batchSize:(null===(r=this.config.workerConfig)||void 0===r?void 0:r.batchSize)||10,batchInterval:(null===(n=this.config.workerConfig)||void 0===n?void 0:n.batchInterval)||5e3,headers:k(k({"Content-Type":"application/json"},e),(null===(o=this.config.apiDetails)||void 0===o?void 0:o.headers)||{})}}),this.worker.onmessage=function(e){var t;"success"===e.data.status?i.log("Batch sent successfully by worker"):"debug"===e.data.status?i.log(e.data.message,e.data):"error"===e.data.status&&(i.log("Worker failed to send batch",e.data.error),e.data.failedEvents&&e.data.failedEvents.length>0&&(t=i.eventQueue).unshift.apply(t,e.data.failedEvents))},this.log("Web worker setup complete."),[2]}})})},e.prototype.track=function(e,t){var r;if(void 0===t&&(t={}),this.shouldSampleEvents()){this.journeyTracker.trackEvent(e,t);var n=this.journeyTracker.getContext(),o=new Date,i={event:e,properties:k(k({},t),{journeyContext:{sequenceIndex:n.eventCount-1,timeSinceLastEvent:n.timeSinceLastEvent,journeyDuration:Date.now()-n.journeyStartTime}}),timestamp:o.getTime(),created_at:o.toISOString(),userId:this.userManager.getUserId(),userType:this.userManager.getUserType(),sessionId:this.sessionId,project_key:this.config.projectKey||void 0,client_id:this.config.clientId||this.config.apiKey||void 0,project_id:(null===(r=this.projectSettings)||void 0===r?void 0:r.project_id)||void 0};this.journeyTracker.shouldAnalyzeJourney()&&this.sendJourneyForAnalysis(),this.config.useWebWorker&&"undefined"!=typeof Worker?this.worker.postMessage({type:"track",payload:i}):this.eventQueue.push(i),this.log("Event tracked public:",i)}else this.log("Event skipped due to sampling:",e)},e.prototype.startBatchTimer=function(){var e=this;this.batchTimer=window.setInterval(function(){e.flushQueue()},this.config.batchInterval)},e.prototype.flushQueue=function(){return w(this,void 0,void 0,function(){var e;return S(this,function(t){switch(t.label){case 0:return 0===this.eventQueue.length?[2]:(e=function(e,t,r){if(r||2===arguments.length)for(var n,o=0,i=t.length;o<i;o++)!n&&o in t||(n||(n=Array.prototype.slice.call(t,0,o)),n[o]=t[o]);return e.concat(n||Array.prototype.slice.call(t))}([],this.eventQueue,!0),this.eventQueue=[],this.config.useWebWorker&&"undefined"!=typeof Worker?(this.worker.postMessage({type:"batch",events:e,endpoint:"".concat(this.config.endpoint,"/api/v1/events")}),[3,3]):[3,1]);case 1:return[4,this.sendBatchWithRetry(e)];case 2:t.sent(),t.label=3;case 3:return[2]}})})},e.prototype.sendBatchWithRetry=function(e){return w(this,void 0,void 0,function(){var t,r;return S(this,function(n){switch(n.label){case 0:if(this.batchRetryCount>=this.maxBatchRetries)return this.batchTimer&&(clearInterval(this.batchTimer),this.batchTimer=void 0,this.log("Max batch retries reached. BatchTimer cancelled.")),[2];n.label=1;case 1:return n.trys.push([1,3,,4]),[4,this.sendBatch(e)];case 2:return n.sent(),this.batchRetryCount=0,[3,4];case 3:return t=n.sent(),this.batchRetryCount++,this.log("Batch send failed. Retry attempt ".concat(this.batchRetryCount," of ").concat(this.maxBatchRetries,"."),t),(r=this.eventQueue).unshift.apply(r,e),this.batchRetryCount>=this.maxBatchRetries&&this.batchTimer&&(clearInterval(this.batchTimer),this.batchTimer=void 0,this.log("Max batch retries reached. BatchTimer cancelled.")),[3,4];case 4:return[2]}})})},e.prototype.sendBatch=function(e){return w(this,void 0,void 0,function(){var t,r,n,o,i,s,a;return S(this,function(c){switch(c.label){case 0:return t="".concat(this.config.endpoint,"/api/v1/events"),r={"Content-Type":"application/json"},[4,this.authManager.getAuthHeaders()];case 1:n=c.sent(),r=k(k({},r),n),this.config.apiDetails&&this.config.apiDetails.apiEndPoint&&(t=this.config.apiDetails.apiEndPoint,this.config.apiDetails.headers&&(r=k(k({},r),this.config.apiDetails.headers))),o=this.config.clientId||"5288aa7d-1b7c-481e-958d-eb9b8e951f14",i=e.map(function(e){return k({event:e.event,userId:e.userId,client_id:o,timestamp:new Date(e.timestamp).toISOString()},e.properties||{})}),c.label=2;case 2:return c.trys.push([2,4,,5]),[4,fetch(t,{method:"POST",headers:r,body:JSON.stringify({events:i})})];case 3:if(!(s=c.sent()).ok)throw new Error("Failed to send batch: ".concat(s.status));return this.log("Batch sent successfully:",i),[3,5];case 4:throw a=c.sent(),this.log("Error sending batch:",a),a;case 5:return[2]}})})},e.prototype.generateSessionId=function(){return"sess_"+Math.random().toString(36).substr(2,9)},e.prototype.getUserId=function(){return this.userManager.getUserId()},e.prototype.identifyUser=function(e,t){var r=this.userManager.getUserIdentificationEvent(e);this.userManager.identifyUser(e,t),this.track("user_identified",r),this.errorTracker&&this.errorTracker.setUser(e),this.log("User identified:",{userId:e,properties:t})},e.prototype.isAuthenticated=function(){return w(this,void 0,void 0,function(){return S(this,function(e){switch(e.label){case 0:return[4,this.authManager.getAccessToken()];case 1:return[2,null!==e.sent()]}})})},e.prototype.authenticate=function(){return w(this,void 0,void 0,function(){return S(this,function(e){switch(e.label){case 0:return[4,this.authManager.initialize()];case 1:return[2,e.sent()]}})})},e.prototype.logout=function(){return w(this,void 0,void 0,function(){return S(this,function(e){switch(e.label){case 0:return[4,this.authManager.logout()];case 1:return e.sent(),[2]}})})},e.prototype.sendJourneyForAnalysis=function(){return w(this,void 0,void 0,function(){var e,t,r,n,o;return S(this,function(i){switch(i.label){case 0:return i.trys.push([0,3,,4]),e=this.journeyTracker.getJourneyForAnalysis(),t="".concat(this.config.endpoint,"/api/v1/journeys/analyze"),[4,this.authManager.getAuthHeaders()];case 1:return r=i.sent(),[4,fetch(t,{method:"POST",headers:k({"Content-Type":"application/json"},r),body:JSON.stringify({client_id:this.config.clientId,user_id:this.userManager.getUserId(),session_id:this.sessionId,journey:e})})];case 2:return(n=i.sent()).ok||console.error("[AInamika SDK] Failed to send journey for analysis:",n.statusText),[3,4];case 3:return o=i.sent(),console.error("[AInamika SDK] Error sending journey for analysis:",o),[3,4];case 4:return[2]}})})},e.prototype.log=function(e,t){this.config.debug&&console.log("[AnalyticsPro SDK] ".concat(e),t||"")},e.prototype.saveConfigToFile=function(e){this.config.debug},e.prototype.loadConfigFromFile=function(){return w(this,void 0,void 0,function(){var e;return S(this,function(t){switch(t.label){case 0:return t.trys.push([0,3,,4]),[4,fetch("/AInamika_config.json",{cache:"reload"})];case 1:return(e=t.sent()).ok?[4,e.json()]:[2,null];case 2:return[2,t.sent()];case 3:return t.sent(),[2,null];case 4:return[2]}})})},e.prototype.setupDynamicDomTracking=function(){return w(this,void 0,void 0,function(){var e=this;return S(this,function(t){return"MutationObserver"in window&&(new MutationObserver(function(){e.mutationDebounceTimer&&clearTimeout(e.mutationDebounceTimer),e.mutationDebounceTimer=window.setTimeout(function(){e.handleDomMutation()},e.mutationDebounceMs)}).observe(document.body,{childList:!0,subtree:!0,attributes:!0}),this.log("Dynamic DOM MutationObserver attached")),[2]})})},e.prototype.computeDomHash=function(e){for(var t=JSON.stringify(e),r=2166136261,n=0;n<t.length;n++)r^=t.charCodeAt(n),r+=(r<<1)+(r<<4)+(r<<7)+(r<<8)+(r<<24);return(r>>>0).toString(16)},e.prototype.getCachedConfigForDomHash=function(e){try{return JSON.parse(localStorage.getItem("ainamika_dom_config_cache")||"{}")[e]||null}catch(e){return null}},e.prototype.setCachedConfigForDomHash=function(e,t){try{var r=JSON.parse(localStorage.getItem("ainamika_dom_config_cache")||"{}");r[e]=t,localStorage.setItem("ainamika_dom_config_cache",JSON.stringify(r))}catch(e){}},e.prototype.handleDomMutation=function(){return w(this,void 0,void 0,function(){var e,t,r,n;return S(this,function(o){switch(o.label){case 0:return[4,this.getDOMStructure()];case 1:return e=o.sent(),(t=this.computeDomHash(e))===this.lastDomHash?(this.log("DOM hash unchanged after mutation, skipping config fetch."),[2]):(this.log("DOM hash changed, checking for cached config...",{oldHash:this.lastDomHash,newHash:t}),this.lastDomHash=t,(r=this.getCachedConfigForDomHash(t))?(this.log("Reusing cached config for DOM hash",t),this.applyGeneratedConfig(r),[2]):(this.log("Fetching new config from backend for DOM hash:",t),[4,this.fetchGeneratedConfig(e,t)]));case 2:return(n=o.sent())&&n.events_to_track?(this.applyGeneratedConfig(n),this.setCachedConfigForDomHash(t,n),this.lastConfigHash=n.config_hash||"",this.log("Fetched and applied new config for new DOM hash",t)):this.log("No valid config returned for new DOM hash",t),[2]}})})},e}();"undefined"!=typeof window&&(window.AInamikaSDKPro=E);var T=E;return t.default}()});
|
|
2
2
|
//# sourceMappingURL=ainamika-sdk.js.map
|
package/dist/ainamika-sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ainamika-sdk.js","mappings":"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","sources":["webpack://AInamikaSDKPro/webpack/universalModuleDefinition","webpack://AInamikaSDKPro/webpack/bootstrap","webpack://AInamikaSDKPro/webpack/runtime/define property getters","webpack://AInamikaSDKPro/webpack/runtime/hasOwnProperty shorthand","webpack://AInamikaSDKPro/./src/error-tracker.ts","webpack://AInamikaSDKPro/./src/config.ts","webpack://AInamikaSDKPro/./src/error-storage.ts","webpack://AInamikaSDKPro/./src/user-manager.ts","webpack://AInamikaSDKPro/./src/journey-tracker.ts","webpack://AInamikaSDKPro/./src/auth-manager.ts","webpack://AInamikaSDKPro/./src/sdk.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"AInamikaSDKPro\"] = factory();\n\telse\n\t\troot[\"AInamikaSDKPro\"] = factory();\n})((typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : this), function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// error-tracker.ts - Advanced Error Tracking System for AInamika SDK\n\nimport { AuthManager } from './auth-manager';\n\nexport interface ErrorConfig {\n endpoint: string;\n clientId: string;\n apiKey?: string; // Made optional for backward compatibility\n authManager?: AuthManager; // New: pass authManager for JWT auth\n captureScreenshots?: boolean;\n captureDomSnapshots?: boolean;\n maxStackTraceDepth?: number;\n maxErrorsPerSession?: number;\n debounceMs?: number;\n enableNetworkTracking?: boolean;\n enableConsoleCapture?: boolean;\n}\n\nexport interface ErrorData {\n id?: string;\n client_id: string;\n error_type: 'javascript' | 'network' | 'unhandled' | 'console' | 'custom';\n message: string;\n stack_trace?: string;\n url: string;\n user_agent: string;\n timestamp: number;\n error_metadata: {\n line?: number;\n column?: number;\n filename?: string;\n component?: string;\n props?: Record<string, any>;\n userId?: string;\n sessionId?: string;\n breadcrumbs?: ErrorBreadcrumb[];\n networkInfo?: NetworkInfo;\n performance?: PerformanceInfo;\n };\n dom_snapshot?: string;\n screen_snapshot?: string;\n severity: 'low' | 'medium' | 'high' | 'critical';\n session_id: string;\n user_id?: string;\n}\n\nexport interface ErrorBreadcrumb {\n timestamp: number;\n type: 'navigation' | 'click' | 'console' | 'network' | 'error';\n message: string;\n data?: Record<string, any>;\n}\n\nexport interface NetworkInfo {\n effectiveType?: string;\n downlink?: number;\n rtt?: number;\n saveData?: boolean;\n}\n\nexport interface PerformanceInfo {\n memory?: {\n usedJSHeapSize: number;\n totalJSHeapSize: number;\n jsHeapSizeLimit: number;\n };\n timing?: {\n domContentLoaded: number;\n load: number;\n firstPaint?: number;\n firstContentfulPaint?: number;\n };\n}\n\nexport class ErrorTracker {\n private config: ErrorConfig;\n private breadcrumbs: ErrorBreadcrumb[] = [];\n private errorCount = 0;\n private errorDebounceMap = new Map<string, number>();\n private originalConsole: Console;\n private sessionId: string;\n private userId?: string;\n private authManager?: AuthManager;\n\n constructor(config: ErrorConfig) {\n this.config = {\n captureScreenshots: true,\n captureDomSnapshots: true,\n maxStackTraceDepth: 50,\n maxErrorsPerSession: 100,\n debounceMs: 1000,\n enableNetworkTracking: true,\n enableConsoleCapture: true,\n ...config\n };\n\n this.authManager = config.authManager;\n this.sessionId = this.generateSessionId();\n this.originalConsole = { ...console };\n this.initialize();\n }\n\n private initialize() {\n // Global error handler\n window.addEventListener('error', (event) => {\n this.handleError({\n type: 'javascript',\n message: event.message,\n filename: event.filename,\n line: event.lineno,\n column: event.colno,\n error: event.error\n });\n });\n\n // Unhandled promise rejection handler\n window.addEventListener('unhandledrejection', (event) => {\n this.handleError({\n type: 'unhandled',\n message: event.reason?.message || 'Unhandled Promise Rejection',\n error: event.reason,\n promise: true\n });\n });\n\n // Network error tracking\n if (this.config.enableNetworkTracking) {\n this.setupNetworkTracking();\n }\n\n // Console capture\n if (this.config.enableConsoleCapture) {\n this.setupConsoleCapture();\n }\n\n // Navigation breadcrumbs\n this.setupNavigationTracking();\n\n // Click breadcrumbs\n this.setupClickTracking();\n\n console.log('[AInamika Error Tracker] Initialized successfully');\n }\n\n private generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private addBreadcrumb(breadcrumb: Omit<ErrorBreadcrumb, 'timestamp'>) {\n this.breadcrumbs.push({\n ...breadcrumb,\n timestamp: Date.now()\n });\n\n // Keep only last 50 breadcrumbs\n if (this.breadcrumbs.length > 50) {\n this.breadcrumbs = this.breadcrumbs.slice(-50);\n }\n }\n\n private handleError(errorInfo: any) {\n if (this.errorCount >= this.config.maxErrorsPerSession!) {\n console.warn('[AInamika Error Tracker] Max errors per session reached');\n return;\n }\n\n const errorKey = `${errorInfo.message}_${errorInfo.filename}_${errorInfo.line}`;\n const now = Date.now();\n \n // Debounce duplicate errors\n if (this.errorDebounceMap.has(errorKey)) {\n const lastTime = this.errorDebounceMap.get(errorKey)!;\n if (now - lastTime < this.config.debounceMs!) {\n return;\n }\n }\n this.errorDebounceMap.set(errorKey, now);\n\n this.errorCount++;\n this.captureError(errorInfo);\n }\n\n private async captureError(errorInfo: any) {\n try {\n const errorData: ErrorData = {\n client_id: this.config.clientId,\n error_type: errorInfo.type || 'javascript',\n message: errorInfo.message || 'Unknown error',\n stack_trace: this.extractStackTrace(errorInfo.error),\n url: window.location.href,\n user_agent: navigator.userAgent,\n timestamp: Date.now(),\n error_metadata: {\n line: errorInfo.line,\n column: errorInfo.column,\n filename: errorInfo.filename,\n userId: this.userId,\n sessionId: this.sessionId,\n breadcrumbs: [...this.breadcrumbs],\n networkInfo: this.getNetworkInfo(),\n performance: this.getPerformanceInfo()\n },\n severity: this.assessSeverity(errorInfo),\n session_id: this.sessionId,\n user_id: this.userId\n };\n\n // Capture DOM snapshot\n if (this.config.captureDomSnapshots) {\n errorData.dom_snapshot = this.captureDomSnapshot();\n }\n\n // Capture screenshot\n if (this.config.captureScreenshots) {\n errorData.screen_snapshot = await this.captureScreenshot();\n }\n\n // Send error to backend\n await this.sendError(errorData);\n\n // Add error breadcrumb\n this.addBreadcrumb({\n type: 'error',\n message: `${errorData.error_type}: ${errorData.message}`,\n data: { severity: errorData.severity }\n });\n\n } catch (captureError) {\n console.error('[AInamika Error Tracker] Failed to capture error:', captureError);\n }\n }\n\n private extractStackTrace(error: Error): string {\n if (!error || !error.stack) return '';\n \n const stack = error.stack.split('\\n');\n const maxDepth = this.config.maxStackTraceDepth!;\n \n return stack.slice(0, maxDepth).join('\\n');\n }\n\n private assessSeverity(errorInfo: any): 'low' | 'medium' | 'high' | 'critical' {\n const message = errorInfo.message?.toLowerCase() || '';\n \n // Critical errors\n if (message.includes('out of memory') || \n message.includes('security') ||\n message.includes('permission denied') ||\n errorInfo.type === 'unhandled') {\n return 'critical';\n }\n \n // High severity\n if (message.includes('network') || \n message.includes('timeout') ||\n message.includes('failed to fetch') ||\n message.includes('cors')) {\n return 'high';\n }\n \n // Medium severity\n if (message.includes('undefined') || \n message.includes('null') ||\n message.includes('cannot read property')) {\n return 'medium';\n }\n \n return 'low';\n }\n\n private captureDomSnapshot(): string {\n try {\n // Create a simplified DOM snapshot\n const snapshot = {\n url: window.location.href,\n title: document.title,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight\n },\n elements: this.extractDomElements()\n };\n \n return JSON.stringify(snapshot);\n } catch (error) {\n console.error('[AInamika Error Tracker] Failed to capture DOM snapshot:', error);\n return '';\n }\n }\n\n private extractDomElements(): any[] {\n const elements: any[] = [];\n const maxElements = 100;\n \n // Get key elements\n const selectors = [\n 'body > *',\n '[id]',\n '[class*=\"error\"]',\n '[class*=\"modal\"]',\n 'form',\n 'button',\n 'input[type=\"submit\"]'\n ];\n \n selectors.forEach(selector => {\n try {\n const els = document.querySelectorAll(selector);\n Array.from(els).slice(0, maxElements - elements.length).forEach(el => {\n elements.push({\n tagName: el.tagName,\n id: el.id,\n className: el.className,\n textContent: el.textContent?.substring(0, 100),\n attributes: this.getElementAttributes(el)\n });\n });\n } catch (e) {\n // Ignore selector errors\n }\n });\n \n return elements;\n }\n\n private getElementAttributes(element: Element): Record<string, string> {\n const attrs: Record<string, string> = {};\n const importantAttrs = ['id', 'class', 'type', 'name', 'value', 'href', 'src'];\n \n importantAttrs.forEach(attr => {\n const value = element.getAttribute(attr);\n if (value) attrs[attr] = value;\n });\n \n return attrs;\n }\n\n private async captureScreenshot(): Promise<string> {\n try {\n // Use html2canvas if available, otherwise return empty\n if (typeof (window as any).html2canvas === 'function') {\n const canvas = await (window as any).html2canvas(document.body, {\n height: Math.min(window.innerHeight, 1000),\n width: Math.min(window.innerWidth, 1000),\n useCORS: true\n });\n return canvas.toDataURL('image/jpeg', 0.7);\n }\n return '';\n } catch (error) {\n console.error('[AInamika Error Tracker] Failed to capture screenshot:', error);\n return '';\n }\n }\n\n private getNetworkInfo(): NetworkInfo {\n const connection = (navigator as any).connection || \n (navigator as any).mozConnection || \n (navigator as any).webkitConnection;\n \n if (!connection) return {};\n \n return {\n effectiveType: connection.effectiveType,\n downlink: connection.downlink,\n rtt: connection.rtt,\n saveData: connection.saveData\n };\n }\n\n private getPerformanceInfo(): PerformanceInfo {\n const info: PerformanceInfo = {};\n \n // Memory info\n if ((performance as any).memory) {\n info.memory = {\n usedJSHeapSize: (performance as any).memory.usedJSHeapSize,\n totalJSHeapSize: (performance as any).memory.totalJSHeapSize,\n jsHeapSizeLimit: (performance as any).memory.jsHeapSizeLimit\n };\n }\n \n // Timing info\n if (performance.timing) {\n const timing = performance.timing;\n info.timing = {\n domContentLoaded: timing.domContentLoadedEventEnd - timing.navigationStart,\n load: timing.loadEventEnd - timing.navigationStart\n };\n \n // Paint timings\n if (performance.getEntriesByType) {\n const paintEntries = performance.getEntriesByType('paint');\n paintEntries.forEach((entry: any) => {\n if (entry.name === 'first-paint') {\n info.timing!.firstPaint = entry.startTime;\n } else if (entry.name === 'first-contentful-paint') {\n info.timing!.firstContentfulPaint = entry.startTime;\n }\n });\n }\n }\n \n return info;\n }\n\n private setupNetworkTracking() {\n // Override fetch\n const originalFetch = window.fetch;\n window.fetch = async (...args) => {\n const startTime = Date.now();\n const url = args[0] instanceof Request ? args[0].url : String(args[0]);\n \n try {\n const response = await originalFetch(...args);\n \n this.addBreadcrumb({\n type: 'network',\n message: `Fetch ${response.status} ${url}`,\n data: {\n url,\n status: response.status,\n duration: Date.now() - startTime\n }\n });\n \n if (!response.ok) {\n this.handleError({\n type: 'network',\n message: `Network request failed: ${response.status} ${response.statusText}`,\n url,\n status: response.status\n });\n }\n \n return response;\n } catch (error: any) {\n this.addBreadcrumb({\n type: 'network',\n message: `Fetch failed ${url}`,\n data: { url, error: error?.message || 'Unknown error' }\n });\n \n this.handleError({\n type: 'network',\n message: `Network request failed: ${error?.message || 'Unknown error'}`,\n url,\n error\n });\n \n throw error;\n }\n };\n\n // Override XMLHttpRequest\n const originalXHROpen = XMLHttpRequest.prototype.open;\n const originalXHRSend = XMLHttpRequest.prototype.send;\n \n XMLHttpRequest.prototype.open = function(method: string, url: string | URL, async?: boolean, username?: string | null, password?: string | null) {\n (this as any)._errorTracker = { method, url, startTime: Date.now() };\n return originalXHROpen.call(this, method, url, async || true, username, password);\n };\n \n XMLHttpRequest.prototype.send = function(...args) {\n const tracker = (this as any)._errorTracker;\n \n this.addEventListener('loadend', () => {\n if (tracker) {\n const duration = Date.now() - tracker.startTime;\n \n if (this.status >= 400) {\n this.dispatchEvent(new CustomEvent('networkerror', {\n detail: {\n type: 'network',\n message: `XHR request failed: ${this.status} ${this.statusText}`,\n url: tracker.url,\n status: this.status\n }\n }));\n }\n \n this.dispatchEvent(new CustomEvent('networkbreadcrumb', {\n detail: {\n type: 'network',\n message: `XHR ${this.status} ${tracker.url}`,\n data: {\n method: tracker.method,\n url: tracker.url,\n status: this.status,\n duration\n }\n }\n }));\n }\n });\n \n return originalXHRSend.call(this, ...args);\n };\n \n // Listen for custom events\n document.addEventListener('networkerror', (event: any) => {\n this.handleError(event.detail);\n });\n \n document.addEventListener('networkbreadcrumb', (event: any) => {\n this.addBreadcrumb(event.detail);\n });\n }\n\n private setupConsoleCapture() {\n // Override console methods\n ['error', 'warn'].forEach(method => {\n const original = this.originalConsole[method as keyof Console] as Function;\n (console as any)[method] = (...args: any[]) => {\n if (typeof original === 'function') {\n original.call(console, ...args);\n }\n \n if (method === 'error') {\n this.handleError({\n type: 'console',\n message: args.map(arg => String(arg)).join(' '),\n consoleMethod: method\n });\n }\n \n this.addBreadcrumb({\n type: 'console',\n message: `Console ${method}: ${args.map(arg => String(arg)).join(' ')}`,\n data: { level: method }\n });\n };\n });\n }\n\n private setupNavigationTracking() {\n // Track page changes\n let currentUrl = window.location.href;\n \n const trackNavigation = () => {\n const newUrl = window.location.href;\n if (newUrl !== currentUrl) {\n this.addBreadcrumb({\n type: 'navigation',\n message: `Navigation from ${currentUrl} to ${newUrl}`,\n data: { from: currentUrl, to: newUrl }\n });\n currentUrl = newUrl;\n }\n };\n \n // Listen for various navigation events\n window.addEventListener('popstate', trackNavigation);\n window.addEventListener('hashchange', trackNavigation);\n \n // Override pushState and replaceState\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n \n history.pushState = function(...args) {\n originalPushState.apply(this, args);\n setTimeout(trackNavigation, 0);\n };\n \n history.replaceState = function(...args) {\n originalReplaceState.apply(this, args);\n setTimeout(trackNavigation, 0);\n };\n }\n\n private setupClickTracking() {\n document.addEventListener('click', (event) => {\n const target = event.target as Element;\n if (!target) return;\n \n const selector = this.getElementSelector(target);\n const text = target.textContent?.trim().substring(0, 50) || '';\n \n this.addBreadcrumb({\n type: 'click',\n message: `Clicked ${selector}${text ? `: ${text}` : ''}`,\n data: {\n selector,\n text,\n tagName: target.tagName,\n id: target.id,\n className: target.className\n }\n });\n });\n }\n\n private getElementSelector(element: Element): string {\n if (element.id) return `#${element.id}`;\n if (element.className) {\n const classes = element.className.split(' ').filter(c => c).slice(0, 2);\n if (classes.length) return `.${classes.join('.')}`;\n }\n return element.tagName.toLowerCase();\n }\n\n private async sendError(errorData: ErrorData) {\n try {\n let headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n // Use authManager if available, otherwise fall back to apiKey\n if (this.authManager) {\n const authHeaders = await this.authManager.getAuthHeaders();\n headers = { ...headers, ...authHeaders };\n } else if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n const response = await fetch(`${this.config.endpoint}/api/v1/errors`, {\n method: 'POST',\n headers,\n body: JSON.stringify(errorData)\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send error: ${response.status} ${response.statusText}`);\n }\n\n console.log('[AInamika Error Tracker] Error sent successfully');\n } catch (error) {\n console.error('[AInamika Error Tracker] Failed to send error:', error);\n // Store error locally for retry\n this.storeErrorLocally(errorData);\n }\n }\n\n private storeErrorLocally(errorData: ErrorData) {\n try {\n const stored = localStorage.getItem('ainamika_errors') || '[]';\n const errors = JSON.parse(stored);\n errors.push(errorData);\n \n // Keep only last 50 errors\n if (errors.length > 50) {\n errors.splice(0, errors.length - 50);\n }\n \n localStorage.setItem('ainamika_errors', JSON.stringify(errors));\n } catch (error) {\n console.error('[AInamika Error Tracker] Failed to store error locally:', error);\n }\n }\n\n // Public methods\n public captureException(error: Error, context?: Record<string, any>) {\n this.handleError({\n type: 'custom',\n message: error.message,\n error,\n context\n });\n }\n\n public setUser(userId: string) {\n this.userId = userId;\n }\n\n public addTag(key: string, value: string) {\n // Add custom tags to error metadata\n if (!this.config.clientId) {\n this.config.clientId += `_${key}:${value}`;\n }\n }\n\n public async flushStoredErrors() {\n try {\n const stored = localStorage.getItem('ainamika_errors');\n if (!stored) return;\n \n const errors = JSON.parse(stored);\n if (errors.length === 0) return;\n \n console.log(`[AInamika Error Tracker] Flushing ${errors.length} stored errors`);\n \n for (const error of errors) {\n await this.sendError(error);\n }\n \n localStorage.removeItem('ainamika_errors');\n } catch (error) {\n console.error('[AInamika Error Tracker] Failed to flush stored errors:', error);\n }\n }\n}\n","// config.ts - Environment-based configuration for Ainamika SDK\n\nexport interface EnvironmentConfig {\n API_BASE_URL: string;\n APP_ENV: 'development' | 'production';\n DEBUG: boolean;\n}\n\n// Environment configuration with fallbacks\ndeclare global {\n interface Window {\n __AINAMIKA_CONFIG__?: EnvironmentConfig;\n }\n}\n\n// Production API URL - using proxy that routes to Kubernetes backend\nconst PRODUCTION_API_URL = 'https://ainamika-webhook-proxy-366651516847.asia-south1.run.app';\n\n// Get environment configuration\nfunction getEnvironmentConfig(): EnvironmentConfig {\n // Check for explicitly set configuration (allows override via apiDetails)\n if (typeof window !== 'undefined' && window.__AINAMIKA_CONFIG__) {\n return window.__AINAMIKA_CONFIG__;\n }\n\n // Always use production URLs for npm package\n // Users can override via apiDetails config option if needed\n return {\n API_BASE_URL: PRODUCTION_API_URL,\n APP_ENV: 'production',\n DEBUG: false\n };\n}\n\nexport const ENV_CONFIG = getEnvironmentConfig();\n\n// API endpoint configuration\nexport const API_ENDPOINTS = {\n EVENTS: `${ENV_CONFIG.API_BASE_URL}/api/v1/events`,\n ERRORS: `${ENV_CONFIG.API_BASE_URL}/api/errors/report`,\n CONFIG: `${ENV_CONFIG.API_BASE_URL}/api/v1/sdk/config`,\n DEBUG_EVENTS: `${ENV_CONFIG.API_BASE_URL}/api/v1/debug/events`,\n // Project-based endpoints\n PROJECTS_LOOKUP: `${ENV_CONFIG.API_BASE_URL}/api/v1/projects/lookup`,\n SAMPLING_CHECK: `${ENV_CONFIG.API_BASE_URL}/api/v1/projects/sampling/check`\n};\n\n// Configuration helper function\nexport function configureSDK(config: Partial<EnvironmentConfig>) {\n if (typeof window !== 'undefined') {\n window.__AINAMIKA_CONFIG__ = { ...ENV_CONFIG, ...config };\n }\n}\n\n","// error-storage.ts - Offline Storage and Queue Management for Error Tracking\nimport { API_ENDPOINTS } from './config';\n\nexport interface StoredError {\n id: string;\n errorData: any;\n timestamp: number;\n retryCount: number;\n lastRetry?: number;\n}\n\nexport interface StorageConfig {\n maxStorageSize: number;\n maxRetries: number;\n retryInterval: number;\n compressionEnabled: boolean;\n encryptionEnabled: boolean;\n}\n\nexport class ErrorStorage {\n private config: StorageConfig;\n private readonly STORAGE_KEY = 'ainamika_error_queue';\n private readonly METADATA_KEY = 'ainamika_error_metadata';\n private retryTimer?: number;\n private isProcessing = false;\n\n constructor(config: Partial<StorageConfig> = {}) {\n this.config = {\n maxStorageSize: 5 * 1024 * 1024, // 5MB\n maxRetries: 5,\n retryInterval: 30000, // 30 seconds\n compressionEnabled: true,\n encryptionEnabled: false,\n ...config\n };\n\n this.initialize();\n }\n\n private initialize() {\n this.cleanupOldErrors();\n this.startRetryTimer();\n this.setupStorageListener();\n \n // Process any existing errors on initialization\n setTimeout(() => this.processQueue(), 1000);\n }\n\n /**\n * Store error data with automatic compression and queue management\n */\n public async storeError(errorData: any): Promise<string> {\n try {\n const errorId = this.generateErrorId();\n const storedError: StoredError = {\n id: errorId,\n errorData: this.config.compressionEnabled ? this.compressData(errorData) : errorData,\n timestamp: Date.now(),\n retryCount: 0\n };\n\n await this.addToQueue(storedError);\n this.updateMetadata();\n \n // Trigger immediate processing\n setTimeout(() => this.processQueue(), 100);\n \n return errorId;\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to store error:', error);\n throw error;\n }\n }\n\n /**\n * Get all stored errors\n */\n public getStoredErrors(): StoredError[] {\n try {\n const stored = localStorage.getItem(this.STORAGE_KEY);\n if (!stored) return [];\n \n const errors = JSON.parse(stored) as StoredError[];\n return errors.map(error => ({\n ...error,\n errorData: this.config.compressionEnabled ? this.decompressData(error.errorData) : error.errorData\n }));\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to get stored errors:', error);\n return [];\n }\n }\n\n /**\n * Remove error from storage\n */\n public removeError(errorId: string): boolean {\n try {\n const errors = this.getQueueRaw();\n const filteredErrors = errors.filter(error => error.id !== errorId);\n \n if (filteredErrors.length !== errors.length) {\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(filteredErrors));\n this.updateMetadata();\n return true;\n }\n return false;\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to remove error:', error);\n return false;\n }\n }\n\n /**\n * Clear all stored errors\n */\n public clearAll(): void {\n try {\n localStorage.removeItem(this.STORAGE_KEY);\n localStorage.removeItem(this.METADATA_KEY);\n console.log('[AInamika Error Storage] All errors cleared');\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to clear errors:', error);\n }\n }\n\n /**\n * Get storage statistics\n */\n public getStorageStats(): {\n errorCount: number;\n totalSize: number;\n oldestError?: number;\n newestError?: number;\n } {\n try {\n const errors = this.getQueueRaw();\n const totalSize = new Blob([localStorage.getItem(this.STORAGE_KEY) || '']).size;\n \n const timestamps = errors.map(e => e.timestamp).sort();\n \n return {\n errorCount: errors.length,\n totalSize,\n oldestError: timestamps[0],\n newestError: timestamps[timestamps.length - 1]\n };\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to get storage stats:', error);\n return { errorCount: 0, totalSize: 0 };\n }\n }\n\n /**\n * Process the error queue - attempt to send stored errors\n */\n public async processQueue(): Promise<void> {\n if (this.isProcessing) return;\n \n this.isProcessing = true;\n \n try {\n const errors = this.getQueueRaw();\n if (errors.length === 0) return;\n \n console.log(`[AInamika Error Storage] Processing ${errors.length} queued errors`);\n \n for (const storedError of errors) {\n if (storedError.retryCount >= this.config.maxRetries) {\n console.warn(`[AInamika Error Storage] Max retries reached for error ${storedError.id}`);\n this.removeError(storedError.id);\n continue;\n }\n\n // Check retry interval\n if (storedError.lastRetry && \n Date.now() - storedError.lastRetry < this.config.retryInterval) {\n continue;\n }\n\n try {\n const success = await this.sendError(storedError);\n if (success) {\n this.removeError(storedError.id);\n console.log(`[AInamika Error Storage] Successfully sent error ${storedError.id}`);\n } else {\n this.incrementRetryCount(storedError.id);\n }\n } catch (error) {\n console.error(`[AInamika Error Storage] Failed to send error ${storedError.id}:`, error);\n this.incrementRetryCount(storedError.id);\n }\n }\n } finally {\n this.isProcessing = false;\n }\n }\n\n /**\n * Force retry of a specific error\n */\n public async retryError(errorId: string): Promise<boolean> {\n const errors = this.getQueueRaw();\n const error = errors.find(e => e.id === errorId);\n \n if (!error) return false;\n \n try {\n const success = await this.sendError(error);\n if (success) {\n this.removeError(errorId);\n return true;\n } else {\n this.incrementRetryCount(errorId);\n return false;\n }\n } catch (err) {\n console.error(`[AInamika Error Storage] Failed to retry error ${errorId}:`, err);\n this.incrementRetryCount(errorId);\n return false;\n }\n }\n\n private async addToQueue(storedError: StoredError): Promise<void> {\n const errors = this.getQueueRaw();\n errors.push(storedError);\n \n // Check storage size limit\n const serialized = JSON.stringify(errors);\n if (new Blob([serialized]).size > this.config.maxStorageSize) {\n // Remove oldest errors until under limit\n while (errors.length > 0 && new Blob([JSON.stringify(errors)]).size > this.config.maxStorageSize) {\n errors.shift();\n console.warn('[AInamika Error Storage] Removed old error due to size limit');\n }\n }\n \n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(errors));\n }\n\n private getQueueRaw(): StoredError[] {\n try {\n const stored = localStorage.getItem(this.STORAGE_KEY);\n return stored ? JSON.parse(stored) : [];\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to parse stored errors:', error);\n return [];\n }\n }\n\n private incrementRetryCount(errorId: string): void {\n try {\n const errors = this.getQueueRaw();\n const errorIndex = errors.findIndex(e => e.id === errorId);\n \n if (errorIndex !== -1) {\n errors[errorIndex].retryCount++;\n errors[errorIndex].lastRetry = Date.now();\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(errors));\n }\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to increment retry count:', error);\n }\n }\n\n private async sendError(storedError: StoredError): Promise<boolean> {\n try {\n const errorData = this.config.compressionEnabled ? \n this.decompressData(storedError.errorData) : \n storedError.errorData;\n\n // This should match the ErrorTracker's endpoint configuration\n const endpoint = errorData.endpoint || API_ENDPOINTS.ERRORS;\n const apiKey = errorData.apiKey || '';\n \n const response = await fetch(`${endpoint}/api/v1/errors`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': apiKey ? `Bearer ${apiKey}` : ''\n },\n body: JSON.stringify(errorData)\n });\n\n return response.ok;\n } catch (error) {\n console.error('[AInamika Error Storage] Network error sending stored error:', error);\n return false;\n }\n }\n\n private compressData(data: any): string {\n try {\n // Simple compression using JSON + base64\n const jsonString = JSON.stringify(data);\n return btoa(jsonString);\n } catch (error) {\n console.warn('[AInamika Error Storage] Compression failed, storing uncompressed:', error);\n return data;\n }\n }\n\n private decompressData(compressedData: any): any {\n try {\n if (typeof compressedData === 'string' && compressedData.length > 0) {\n const jsonString = atob(compressedData);\n return JSON.parse(jsonString);\n }\n return compressedData;\n } catch (error) {\n console.warn('[AInamika Error Storage] Decompression failed, returning raw data:', error);\n return compressedData;\n }\n }\n\n private generateErrorId(): string {\n return `error_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private cleanupOldErrors(): void {\n try {\n const errors = this.getQueueRaw();\n const cutoffTime = Date.now() - (7 * 24 * 60 * 60 * 1000); // 7 days\n \n const cleanErrors = errors.filter(error => error.timestamp > cutoffTime);\n \n if (cleanErrors.length !== errors.length) {\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(cleanErrors));\n console.log(`[AInamika Error Storage] Cleaned up ${errors.length - cleanErrors.length} old errors`);\n }\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to cleanup old errors:', error);\n }\n }\n\n private startRetryTimer(): void {\n this.retryTimer = window.setInterval(() => {\n this.processQueue();\n }, this.config.retryInterval);\n }\n\n private setupStorageListener(): void {\n // Listen for storage changes from other tabs\n window.addEventListener('storage', (event) => {\n if (event.key === this.STORAGE_KEY) {\n console.log('[AInamika Error Storage] Storage updated from another tab');\n setTimeout(() => this.processQueue(), 1000);\n }\n });\n\n // Listen for online/offline events\n window.addEventListener('online', () => {\n console.log('[AInamika Error Storage] Network back online, processing queue');\n setTimeout(() => this.processQueue(), 1000);\n });\n\n window.addEventListener('offline', () => {\n console.log('[AInamika Error Storage] Network offline, errors will be queued');\n });\n }\n\n private updateMetadata(): void {\n try {\n const stats = this.getStorageStats();\n const metadata = {\n lastUpdate: Date.now(),\n ...stats\n };\n localStorage.setItem(this.METADATA_KEY, JSON.stringify(metadata));\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to update metadata:', error);\n }\n }\n\n /**\n * Export stored errors for debugging\n */\n public exportErrors(): string {\n try {\n const errors = this.getStoredErrors();\n const exportData = {\n timestamp: Date.now(),\n version: '1.0',\n stats: this.getStorageStats(),\n errors: errors\n };\n return JSON.stringify(exportData, null, 2);\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to export errors:', error);\n return '{}';\n }\n }\n\n /**\n * Import errors from export\n */\n public importErrors(exportData: string): boolean {\n try {\n const data = JSON.parse(exportData);\n if (!data.errors || !Array.isArray(data.errors)) {\n throw new Error('Invalid export format');\n }\n\n this.clearAll();\n \n for (const errorData of data.errors) {\n this.storeError(errorData.errorData);\n }\n \n console.log(`[AInamika Error Storage] Imported ${data.errors.length} errors`);\n return true;\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to import errors:', error);\n return false;\n }\n }\n\n /**\n * Cleanup and destroy the storage instance\n */\n public destroy(): void {\n if (this.retryTimer) {\n clearInterval(this.retryTimer);\n this.retryTimer = undefined;\n }\n \n // Final attempt to process queue\n this.processQueue();\n \n console.log('[AInamika Error Storage] Storage instance destroyed');\n }\n}\n\n/**\n * Utility functions for error storage management\n */\nexport class ErrorStorageUtils {\n /**\n * Get total localStorage usage for AInamika\n */\n static getAinamikaStorageUsage(): { \n totalSize: number; \n errorSize: number; \n otherSize: number; \n } {\n let totalSize = 0;\n let errorSize = 0;\n let otherSize = 0;\n\n for (let key in localStorage) {\n if (localStorage.hasOwnProperty(key)) {\n const size = new Blob([localStorage.getItem(key) || '']).size;\n totalSize += size;\n \n if (key.startsWith('ainamika_error')) {\n errorSize += size;\n } else if (key.startsWith('ainamika_')) {\n otherSize += size;\n }\n }\n }\n\n return { totalSize, errorSize, otherSize };\n }\n\n /**\n * Check if localStorage has enough space\n */\n static checkStorageSpace(requiredBytes: number): boolean {\n try {\n const testKey = 'ainamika_storage_test';\n const testData = 'x'.repeat(Math.min(requiredBytes, 1024 * 1024));\n \n localStorage.setItem(testKey, testData);\n localStorage.removeItem(testKey);\n \n return true;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Clean up all AInamika storage\n */\n static cleanupAllAinamikaStorage(): void {\n const keysToRemove: string[] = [];\n \n for (let key in localStorage) {\n if (key.startsWith('ainamika_')) {\n keysToRemove.push(key);\n }\n }\n \n keysToRemove.forEach(key => localStorage.removeItem(key));\n console.log(`[AInamika Storage Utils] Cleaned up ${keysToRemove.length} storage keys`);\n }\n\n /**\n * Generate storage report\n */\n static generateStorageReport(): {\n usage: ReturnType<typeof ErrorStorageUtils.getAinamikaStorageUsage>;\n errors: any[];\n metadata: any;\n } {\n const storage = new ErrorStorage();\n \n return {\n usage: ErrorStorageUtils.getAinamikaStorageUsage(),\n errors: storage.getStoredErrors(),\n metadata: storage.getStorageStats()\n };\n }\n}\n","/**\n * User Manager Module\n * Handles user identification for hybrid tracking (anonymous + authenticated)\n */\n\nexport class UserManager {\n private userId: string | null = null;\n private userProperties: Record<string, any> = {};\n\n constructor() {\n this.initializeUser();\n }\n\n /**\n * Initialize user on module load\n */\n private initializeUser(): void {\n this.userId = this.getOrCreateUserId();\n }\n\n /**\n * Generate or retrieve persistent anonymous user ID\n */\n private getOrCreateUserId(): string {\n try {\n let userId = localStorage.getItem('ainamika_user_id');\n\n if (!userId) {\n userId = this.generateAnonymousId();\n localStorage.setItem('ainamika_user_id', userId);\n }\n\n return userId;\n } catch (error) {\n // Fallback for environments without localStorage\n console.warn('[UserManager] localStorage not available, using session ID');\n return this.generateAnonymousId();\n }\n }\n\n /**\n * Generate a new anonymous user ID\n */\n private generateAnonymousId(): string {\n return 'anon_' + Math.random().toString(36).substr(2, 9) + '_' + Date.now();\n }\n\n /**\n * Get current user ID\n */\n public getUserId(): string {\n if (!this.userId) {\n this.userId = this.getOrCreateUserId();\n }\n return this.userId;\n }\n\n /**\n * Get user properties\n */\n public getUserProperties(): Record<string, any> {\n return { ...this.userProperties };\n }\n\n /**\n * Identify user with authenticated ID\n * Merges anonymous session with authenticated user\n */\n public identifyUser(authenticatedUserId: string, properties?: Record<string, any>): void {\n const previousId = this.getUserId();\n\n try {\n // Update stored user ID\n localStorage.setItem('ainamika_user_id', authenticatedUserId);\n this.userId = authenticatedUserId;\n\n // Merge properties\n if (properties) {\n this.userProperties = {\n ...this.userProperties,\n ...properties\n };\n }\n\n console.log(`[UserManager] User identified: ${previousId} → ${authenticatedUserId}`);\n } catch (error) {\n console.error('[UserManager] Error identifying user:', error);\n }\n }\n\n /**\n * Update user properties\n */\n public updateUserProperties(properties: Record<string, any>): void {\n this.userProperties = {\n ...this.userProperties,\n ...properties\n };\n }\n\n /**\n * Clear user data (logout)\n */\n public clearUser(): void {\n try {\n localStorage.removeItem('ainamika_user_id');\n this.userId = null;\n this.userProperties = {};\n\n // Generate new anonymous ID for next session\n this.initializeUser();\n } catch (error) {\n console.error('[UserManager] Error clearing user:', error);\n }\n }\n\n /**\n * Get user identification event data\n * Used when upgrading from anonymous to authenticated\n */\n public getUserIdentificationEvent(authenticatedUserId: string): Record<string, any> {\n return {\n event: 'user_identified',\n previous_id: this.getUserId(),\n user_id: authenticatedUserId,\n timestamp: Date.now(),\n properties: this.userProperties\n };\n }\n\n /**\n * Check if current user is anonymous\n */\n public isAnonymousUser(): boolean {\n const userId = this.getUserId();\n return userId.startsWith('anon_');\n }\n\n /**\n * Get user type (anonymous or authenticated)\n */\n public getUserType(): 'anonymous' | 'authenticated' {\n return this.isAnonymousUser() ? 'anonymous' : 'authenticated';\n }\n}","/**\n * Journey Tracker Module\n * Tracks user journeys for funnel analysis\n */\n\ninterface JourneyEvent {\n eventName: string;\n timestamp: number;\n properties: Record<string, any>;\n sequenceIndex: number;\n}\n\ninterface JourneyContext {\n journeySequence: string[];\n eventCount: number;\n lastEventTime: number;\n journeyStartTime: number;\n timeSinceLastEvent: number;\n}\n\nexport class JourneyTracker {\n private userJourney: JourneyEvent[] = [];\n private journeyStartTime: number;\n private lastEventTime: number = 0;\n private sequenceIndex: number = 0;\n private maxJourneyLength: number = 50; // Limit journey size for performance\n private journeyAnalysisThreshold: number = 5; // Send for analysis after 5 events\n\n constructor() {\n this.journeyStartTime = Date.now();\n }\n\n /**\n * Add event to user journey\n */\n public trackEvent(eventName: string, properties: Record<string, any>): void {\n const currentTime = Date.now();\n const timeSinceLastEvent = this.lastEventTime ? currentTime - this.lastEventTime : 0;\n\n const journeyEvent: JourneyEvent = {\n eventName,\n timestamp: currentTime,\n properties: {\n ...properties,\n timeSinceLastEvent,\n journeyPosition: this.sequenceIndex\n },\n sequenceIndex: this.sequenceIndex++\n };\n\n this.userJourney.push(journeyEvent);\n this.lastEventTime = currentTime;\n\n // Maintain journey size limit\n if (this.userJourney.length > this.maxJourneyLength) {\n this.userJourney = this.userJourney.slice(-this.maxJourneyLength);\n }\n\n // Log journey progress\n console.log(`[JourneyTracker] Event tracked: ${eventName} (position: ${journeyEvent.sequenceIndex})`);\n }\n\n /**\n * Get current journey context\n */\n public getContext(): JourneyContext {\n const currentTime = Date.now();\n\n return {\n journeySequence: this.getJourneySequence(),\n eventCount: this.userJourney.length,\n lastEventTime: this.lastEventTime,\n journeyStartTime: this.journeyStartTime,\n timeSinceLastEvent: this.lastEventTime ? currentTime - this.lastEventTime : 0\n };\n }\n\n /**\n * Get journey as sequence of event names\n */\n public getJourneySequence(): string[] {\n return this.userJourney.map(event => event.eventName);\n }\n\n /**\n * Get full journey data\n */\n public getJourneyData(): JourneyEvent[] {\n return [...this.userJourney];\n }\n\n /**\n * Check if journey should be sent for analysis\n */\n public shouldAnalyzeJourney(): boolean {\n return this.userJourney.length >= this.journeyAnalysisThreshold &&\n this.userJourney.length % this.journeyAnalysisThreshold === 0;\n }\n\n /**\n * Get journey data for analysis\n */\n public getJourneyForAnalysis(): Record<string, any> {\n const journeyDuration = Date.now() - this.journeyStartTime;\n const avgTimeBetweenEvents = this.calculateAverageTimeBetweenEvents();\n\n return {\n journey: this.userJourney.map(event => ({\n name: event.eventName,\n timestamp: event.timestamp,\n properties: event.properties\n })),\n metadata: {\n journeyLength: this.userJourney.length,\n journeyDuration,\n avgTimeBetweenEvents,\n startTime: this.journeyStartTime,\n endTime: this.lastEventTime\n }\n };\n }\n\n /**\n * Calculate average time between events\n */\n private calculateAverageTimeBetweenEvents(): number {\n if (this.userJourney.length < 2) return 0;\n\n let totalTime = 0;\n for (let i = 1; i < this.userJourney.length; i++) {\n totalTime += this.userJourney[i].timestamp - this.userJourney[i - 1].timestamp;\n }\n\n return Math.round(totalTime / (this.userJourney.length - 1));\n }\n\n /**\n * Find patterns in journey (e.g., repeated sequences)\n */\n public findPatterns(): Record<string, number> {\n const patterns: Record<string, number> = {};\n const sequenceLength = 3; // Look for patterns of 3 events\n\n if (this.userJourney.length < sequenceLength) return patterns;\n\n for (let i = 0; i <= this.userJourney.length - sequenceLength; i++) {\n const sequence = this.userJourney\n .slice(i, i + sequenceLength)\n .map(e => e.eventName)\n .join(' → ');\n\n patterns[sequence] = (patterns[sequence] || 0) + 1;\n }\n\n // Filter out single occurrences\n return Object.fromEntries(\n Object.entries(patterns).filter(([_, count]) => count > 1)\n );\n }\n\n /**\n * Clear journey (for new session)\n */\n public clearJourney(): void {\n this.userJourney = [];\n this.sequenceIndex = 0;\n this.lastEventTime = 0;\n this.journeyStartTime = Date.now();\n }\n\n /**\n * Get journey segment (last N events)\n */\n public getJourneySegment(count: number): JourneyEvent[] {\n return this.userJourney.slice(-count);\n }\n\n /**\n * Check if user is in a potential funnel\n * Based on common funnel patterns\n */\n public detectPotentialFunnel(): string | null {\n const recentEvents = this.getJourneySequence().slice(-5);\n\n // Common funnel patterns\n const funnelPatterns: Record<string, string[]> = {\n 'signup_flow': ['view_pricing', 'click_signup', 'enter_email'],\n 'purchase_flow': ['view_product', 'add_to_cart', 'view_cart'],\n 'onboarding_flow': ['user_signup', 'profile_setup', 'tutorial_start']\n };\n\n for (const [funnelName, pattern] of Object.entries(funnelPatterns)) {\n const matchCount = pattern.filter(event =>\n recentEvents.includes(event)\n ).length;\n\n if (matchCount >= 2) {\n return funnelName;\n }\n }\n\n return null;\n }\n}","/**\n * Authentication Manager for Ainamika SDK\n *\n * Handles token generation, storage, and refresh for API authentication\n */\n\nexport interface AuthTokens {\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n token_type: string;\n}\n\nexport class AuthManager {\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n private tokenExpiry: number | null = null;\n private clientId: string;\n private apiEndpoint: string;\n private refreshTimer?: NodeJS.Timeout;\n private debug: boolean;\n\n constructor(clientId: string, apiEndpoint: string, debug: boolean = false) {\n this.clientId = clientId;\n this.apiEndpoint = apiEndpoint;\n this.debug = debug;\n\n // Load tokens from storage\n this.loadTokens();\n }\n\n /**\n * Initialize authentication by requesting tokens\n */\n async initialize(): Promise<boolean> {\n try {\n // Check if we have valid tokens\n if (this.isTokenValid()) {\n this.debugLog('Using existing valid token');\n return true;\n }\n\n // Try to refresh if we have a refresh token\n if (this.refreshToken) {\n const refreshed = await this.refreshAccessToken();\n if (refreshed) {\n return true;\n }\n }\n\n // Request new tokens\n const tokens = await this.requestTokens();\n if (tokens) {\n this.setTokens(tokens);\n return true;\n }\n\n return false;\n } catch (error) {\n this.debugLog('Authentication initialization failed:', error);\n return false;\n }\n }\n\n /**\n * Request new tokens from the server\n */\n private async requestTokens(): Promise<AuthTokens | null> {\n try {\n const response = await fetch(`${this.apiEndpoint}/api/v1/auth/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ client_id: this.clientId }),\n });\n\n if (!response.ok) {\n throw new Error(`Token request failed: ${response.status}`);\n }\n\n const tokens: AuthTokens = await response.json();\n return tokens;\n } catch (error) {\n this.debugLog('Token request error:', error);\n return null;\n }\n }\n\n /**\n * Refresh the access token using refresh token\n */\n async refreshAccessToken(): Promise<boolean> {\n if (!this.refreshToken) {\n return false;\n }\n\n try {\n const response = await fetch(`${this.apiEndpoint}/api/v1/auth/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ refresh_token: this.refreshToken }),\n });\n\n if (!response.ok) {\n // Refresh token is invalid, clear tokens\n this.clearTokens();\n return false;\n }\n\n const tokens: AuthTokens = await response.json();\n this.setTokens(tokens);\n return true;\n } catch (error) {\n this.debugLog('Token refresh error:', error);\n return false;\n }\n }\n\n /**\n * Get the current access token, refreshing if needed\n */\n async getAccessToken(): Promise<string | null> {\n // If token is expiring soon (within 5 minutes), refresh it\n if (this.shouldRefreshToken()) {\n await this.refreshAccessToken();\n }\n\n // If still no valid token, try to initialize\n if (!this.isTokenValid()) {\n const initialized = await this.initialize();\n if (!initialized) {\n return null;\n }\n }\n\n return this.accessToken;\n }\n\n /**\n * Get authorization headers for API requests\n */\n async getAuthHeaders(): Promise<Record<string, string>> {\n const token = await this.getAccessToken();\n\n if (token) {\n return {\n 'Authorization': `Bearer ${token}`,\n };\n }\n\n // Fallback to X-Client-ID for backward compatibility\n return {\n 'X-Client-ID': this.clientId,\n };\n }\n\n /**\n * Check if the current token is valid\n */\n private isTokenValid(): boolean {\n if (!this.accessToken || !this.tokenExpiry) {\n return false;\n }\n\n // Check if token has expired\n return Date.now() < this.tokenExpiry;\n }\n\n /**\n * Check if token should be refreshed (5 minutes before expiry)\n */\n private shouldRefreshToken(): boolean {\n if (!this.tokenExpiry || !this.refreshToken) {\n return false;\n }\n\n const fiveMinutes = 5 * 60 * 1000;\n return Date.now() > (this.tokenExpiry - fiveMinutes);\n }\n\n /**\n * Set tokens and schedule refresh\n */\n private setTokens(tokens: AuthTokens): void {\n this.accessToken = tokens.access_token;\n this.refreshToken = tokens.refresh_token || this.refreshToken;\n this.tokenExpiry = Date.now() + (tokens.expires_in * 1000);\n\n // Save to storage\n this.saveTokens();\n\n // Schedule token refresh\n this.scheduleTokenRefresh();\n\n this.debugLog('Tokens set successfully');\n }\n\n /**\n * Schedule automatic token refresh\n */\n private scheduleTokenRefresh(): void {\n // Clear existing timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n\n // Schedule refresh 5 minutes before expiry\n const refreshIn = Math.max(0, this.tokenExpiry! - Date.now() - (5 * 60 * 1000));\n\n this.refreshTimer = setTimeout(() => {\n this.refreshAccessToken();\n }, refreshIn);\n }\n\n /**\n * Save tokens to localStorage\n */\n private saveTokens(): void {\n if (typeof window !== 'undefined' && window.localStorage) {\n const tokenData = {\n accessToken: this.accessToken,\n refreshToken: this.refreshToken,\n tokenExpiry: this.tokenExpiry,\n };\n\n localStorage.setItem(`ainamika_auth_${this.clientId}`, JSON.stringify(tokenData));\n }\n }\n\n /**\n * Load tokens from localStorage\n */\n private loadTokens(): void {\n if (typeof window !== 'undefined' && window.localStorage) {\n const stored = localStorage.getItem(`ainamika_auth_${this.clientId}`);\n\n if (stored) {\n try {\n const tokenData = JSON.parse(stored);\n this.accessToken = tokenData.accessToken;\n this.refreshToken = tokenData.refreshToken;\n this.tokenExpiry = tokenData.tokenExpiry;\n\n // Schedule refresh if token is valid\n if (this.isTokenValid()) {\n this.scheduleTokenRefresh();\n }\n } catch (error) {\n this.debugLog('Failed to load stored tokens:', error);\n }\n }\n }\n }\n\n /**\n * Clear tokens\n */\n clearTokens(): void {\n this.accessToken = null;\n this.refreshToken = null;\n this.tokenExpiry = null;\n\n // Clear from storage\n if (typeof window !== 'undefined' && window.localStorage) {\n localStorage.removeItem(`ainamika_auth_${this.clientId}`);\n }\n\n // Clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = undefined;\n }\n }\n\n /**\n * Logout and clear authentication\n */\n async logout(): Promise<void> {\n try {\n if (this.accessToken) {\n await fetch(`${this.apiEndpoint}/api/v1/auth/logout`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.accessToken}`,\n },\n });\n }\n } catch (error) {\n this.debugLog('Logout error:', error);\n } finally {\n this.clearTokens();\n }\n }\n\n /**\n * Debug logging\n */\n private debugLog(...args: any[]): void {\n if (this.debug) {\n console.log('[Ainamika Auth]', ...args);\n }\n }\n}","// src/index.ts - Main SDK entry point\nimport { ErrorTracker, ErrorConfig } from './error-tracker';\nimport { ErrorStorage } from './error-storage';\nimport { ENV_CONFIG, API_ENDPOINTS } from './config';\nimport { UserManager } from './user-manager';\nimport { JourneyTracker } from './journey-tracker';\nimport { AuthManager } from './auth-manager';\n\ninterface AnalyticsConfig {\n // NEW: Project-based authentication (preferred)\n projectKey?: string; // Public project key (e.g., 'proj_a1b2c3d4e5f6')\n\n // LEGACY: Client-based authentication (for backward compatibility)\n apiKey?: string;\n clientId?: string;\n\n endpoint?: string;\n autoConfig?: boolean;\n batchInterval?: number;\n useWebWorker?: boolean;\n workerPath?: string;\n debug?: boolean;\n apiDetails?: {\n apiEndPoint: string;\n headers?: Record<string, string>;\n };\n workerConfig?: {\n batchSize?: number;\n batchInterval?: number;\n };\n errorTracking?: {\n enabled?: boolean;\n captureScreenshots?: boolean;\n captureDomSnapshots?: boolean;\n maxStackTraceDepth?: number;\n maxErrorsPerSession?: number;\n debounceMs?: number;\n enableNetworkTracking?: boolean;\n enableConsoleCapture?: boolean;\n };\n}\n\n// Sampling decision from server\ninterface SamplingDecision {\n should_sample: {\n events: boolean;\n errors: boolean;\n session_replay: boolean;\n };\n rates: {\n events: number;\n errors: number;\n session_replay: number;\n };\n decision: 'new' | 'existing';\n}\n\n// Project settings from server\ninterface ProjectSettings {\n project_id: number;\n name: string;\n settings: Record<string, any>;\n features: Record<string, boolean>;\n sampling: {\n events: number;\n errors: number;\n session_replay: number;\n };\n}\n\ninterface EventData {\n event: string;\n properties?: Record<string, any>;\n timestamp?: number;\n userId?: string;\n sessionId?: string;\n}\n\ninterface AutoConfigResult {\n autoTrack: {\n clicks: string[];\n pageViews: boolean;\n formSubmissions: string[];\n customEvents: Record<string, any>;\n };\n metadata: {\n appType: string;\n framework: string;\n confidence: number;\n };\n}\n\nclass AInamikaSDKPro {\n private config: AnalyticsConfig;\n private worker: Worker;\n private sessionId: string;\n private autoConfig?: AutoConfigResult;\n private batchTimer?: number;\n private eventQueue: Map<string, any>[] = [];\n private isInitialized = false;\n private batchRetryCount: number = 0;\n private maxBatchRetries: number = 5;\n\n // --- Project-based Configuration ---\n private projectSettings?: ProjectSettings;\n private samplingDecision?: SamplingDecision;\n private userIdentifier: string; // Persistent user identifier for sampling\n\n // --- Error Tracking Components ---\n private errorTracker?: ErrorTracker;\n private errorStorage?: ErrorStorage;\n\n // --- User & Journey Tracking Components ---\n private userManager: UserManager;\n private journeyTracker: JourneyTracker;\n\n // --- Authentication Manager ---\n private authManager: AuthManager;\n\n // --- Dynamic DOM Fingerprinting and Smart Debouncing ---\n private domHashCache: Record<string, any> = {};\n private lastDomHash: string = '';\n private lastConfigHash: string = '';\n private mutationDebounceTimer: number | null = null;\n private mutationDebounceMs: number = 2000; // 2s debounce for dynamic DOM\n\n // Track attached event types per element to prevent duplicate listeners\n private attachedListeners: WeakMap<Element, Set<string>> = new WeakMap();\n\n constructor(config: AnalyticsConfig) {\n // Validate that either projectKey or clientId is provided\n if (!config.projectKey && !config.clientId && !config.apiKey) {\n throw new Error('[AInamika SDK] Either projectKey or clientId is required for initialization');\n }\n\n this.config = {\n endpoint: ENV_CONFIG.API_BASE_URL,\n batchInterval: 5000,\n useWebWorker: true,\n debug: ENV_CONFIG.DEBUG,\n errorTracking: {\n enabled: true,\n captureScreenshots: true,\n captureDomSnapshots: true,\n maxStackTraceDepth: 50,\n maxErrorsPerSession: 100,\n debounceMs: 1000,\n enableNetworkTracking: true,\n enableConsoleCapture: true\n },\n ...config\n };\n\n this.sessionId = this.generateSessionId();\n\n // Initialize or retrieve persistent user identifier for sampling\n this.userIdentifier = this.getOrCreateUserIdentifier();\n\n // Initialize user and journey tracking\n this.userManager = new UserManager();\n this.journeyTracker = new JourneyTracker();\n\n // Initialize authentication manager (use clientId for legacy, or we'll get it from project lookup)\n this.authManager = new AuthManager(\n this.config.clientId || this.config.apiKey || '',\n this.config.endpoint!,\n this.config.debug\n );\n // Inline the worker code as a Blob to avoid cross-origin issues\n const workerCode = `\n self.eventQueue = [];\n self.config = {\n apiUrl: '',\n batchSize: 10,\n batchInterval: 5000,\n headers: { 'Content-Type': 'application/json' }\n };\n let batchTimer = null;\n function flushQueue() {\n self.postMessage({ status: 'debug', message: '[AInamika Worker] flushQueue called', eventQueue: self.eventQueue, config: self.config });\n if (self.eventQueue.length === 0) return;\n const batch = self.eventQueue.splice(0, self.config.batchSize);\n fetch(self.config.apiUrl, {\n method: 'POST',\n headers: self.config.headers,\n body: JSON.stringify({ events: batch })\n }).then(r => {\n if (r.ok) {\n self.postMessage({ status: 'success' });\n } else {\n self.postMessage({ status: 'error', error: r.statusText, failedEvents: batch });\n }\n }).catch(e => {\n self.postMessage({ status: 'error', error: e.message, failedEvents: batch });\n });\n }\n self.onmessage = function(e) {\n self.postMessage({ status: 'debug', message: '[AInamika Worker] onmessage', data: e.data });\n if (e.data.type === 'config') {\n self.config = { ...self.config, ...e.data.payload };\n if (batchTimer) clearInterval(batchTimer);\n batchTimer = setInterval(flushQueue, self.config.batchInterval);\n self.postMessage({ status: 'debug', message: '[AInamika Worker] config set', config: self.config });\n } else if (e.data.type === 'track') {\n self.eventQueue.push(e.data.payload);\n // Only send when timer triggers, not when batch size is reached\n // This ensures true batching behavior\n } else if (e.data.type === 'batch') {\n // Handle batch flush from main thread\n self.postMessage({ status: 'debug', message: '[AInamika Worker] Received batch from main thread', events: e.data.events });\n self.eventQueue.push(...e.data.events);\n flushQueue();\n } else if (e.data.type === 'initConfig') {\n // No-op for now, can be used for advanced config\n }\n };\n `;\n const blob = new Blob([workerCode], { type: 'application/javascript' });\n const workerUrl = URL.createObjectURL(blob);\n this.worker = new Worker(workerUrl);\n this.initialize();\n }\n\n private async initialize() {\n if (this.isInitialized) return;\n this.isInitialized = true;\n\n // If using projectKey, fetch project settings and sampling decision first\n if (this.config.projectKey) {\n try {\n await this.initializeProjectSettings();\n await this.initializeSamplingDecision();\n this.log('Project-based initialization complete', {\n projectKey: this.config.projectKey,\n projectSettings: this.projectSettings,\n samplingDecision: this.samplingDecision\n });\n } catch (error) {\n this.log('Project initialization failed:', error);\n console.warn('[AInamika SDK] Failed to initialize project settings. Some features may be limited.');\n }\n }\n\n // Initialize authentication (only for legacy clientId-based auth)\n if (this.config.clientId || this.config.apiKey) {\n try {\n await this.authManager.initialize();\n this.log('Authentication initialized');\n } catch (error) {\n this.log('Authentication initialization failed:', error);\n // Continue without authentication in development mode\n if (!this.config.debug) {\n console.warn('[Ainamika] Running without authentication. Some features may be limited.');\n }\n }\n }\n\n // Initialize Error Tracking (respecting sampling decision)\n if (this.config.errorTracking?.enabled && this.shouldSampleErrors()) {\n this.initializeErrorTracking();\n } else if (this.config.errorTracking?.enabled && !this.shouldSampleErrors()) {\n this.log('Error tracking disabled due to sampling decision');\n }\n\n if (this.config.autoConfig) {\n await this.setupAutoConfiguration();\n }\n\n // Always enable dynamic DOM tracking for dynamic apps\n this.setupDynamicDomTracking();\n\n if (this.config.useWebWorker && typeof Worker !== 'undefined') {\n await this.setupWebWorker();\n } else {\n // Fallback for environments without web workers\n this.startBatchTimer();\n }\n this.log('AnalyticsPro SDK initialized', {\n config: this.config,\n projectKey: this.config.projectKey,\n sampling: this.samplingDecision\n });\n }\n\n // --- Project Initialization Methods ---\n\n private getOrCreateUserIdentifier(): string {\n const storageKey = 'ainamika_user_identifier';\n let identifier = localStorage.getItem(storageKey);\n\n if (!identifier) {\n // Generate anonymous user identifier\n identifier = 'anon_' + Math.random().toString(36).substr(2, 16) + Date.now().toString(36);\n localStorage.setItem(storageKey, identifier);\n this.log('Created new user identifier:', identifier);\n }\n\n return identifier;\n }\n\n private async initializeProjectSettings(): Promise<void> {\n if (!this.config.projectKey) return;\n\n try {\n const response = await fetch(API_ENDPOINTS.PROJECTS_LOOKUP, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ project_key: this.config.projectKey })\n });\n\n if (!response.ok) {\n throw new Error(`Project lookup failed: ${response.status}`);\n }\n\n this.projectSettings = await response.json();\n this.log('Project settings loaded:', this.projectSettings);\n } catch (error) {\n this.log('Failed to load project settings:', error);\n throw error;\n }\n }\n\n private async initializeSamplingDecision(): Promise<void> {\n if (!this.config.projectKey) return;\n\n try {\n const response = await fetch(API_ENDPOINTS.SAMPLING_CHECK, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n project_key: this.config.projectKey,\n user_identifier: this.userIdentifier\n })\n });\n\n if (!response.ok) {\n throw new Error(`Sampling check failed: ${response.status}`);\n }\n\n this.samplingDecision = await response.json();\n this.log('Sampling decision received:', this.samplingDecision);\n\n // Store sampling decision locally for offline access\n this.cacheSamplingDecision();\n } catch (error) {\n this.log('Failed to get sampling decision, using cached or defaults:', error);\n this.loadCachedSamplingDecision();\n }\n }\n\n private cacheSamplingDecision(): void {\n if (this.samplingDecision) {\n const storageKey = `ainamika_sampling_${this.config.projectKey}`;\n localStorage.setItem(storageKey, JSON.stringify(this.samplingDecision));\n }\n }\n\n private loadCachedSamplingDecision(): void {\n const storageKey = `ainamika_sampling_${this.config.projectKey}`;\n const cached = localStorage.getItem(storageKey);\n\n if (cached) {\n try {\n this.samplingDecision = JSON.parse(cached);\n this.log('Loaded cached sampling decision:', this.samplingDecision);\n } catch {\n // Use default (sample everything)\n this.samplingDecision = {\n should_sample: { events: true, errors: true, session_replay: false },\n rates: { events: 100, errors: 100, session_replay: 0 },\n decision: 'existing'\n };\n }\n } else {\n // Default to sampling everything when no cached decision\n this.samplingDecision = {\n should_sample: { events: true, errors: true, session_replay: false },\n rates: { events: 100, errors: 100, session_replay: 0 },\n decision: 'existing'\n };\n }\n }\n\n // --- Sampling Check Methods ---\n\n private shouldSampleEvents(): boolean {\n // If no sampling decision (legacy mode), sample everything\n if (!this.samplingDecision) return true;\n return this.samplingDecision.should_sample.events;\n }\n\n private shouldSampleErrors(): boolean {\n // If no sampling decision (legacy mode), sample everything\n if (!this.samplingDecision) return true;\n return this.samplingDecision.should_sample.errors;\n }\n\n private shouldSampleSessionReplay(): boolean {\n // If no sampling decision (legacy mode), don't sample replay\n if (!this.samplingDecision) return false;\n return this.samplingDecision.should_sample.session_replay;\n }\n\n // Public method to check sampling status\n public getSamplingStatus(): SamplingDecision | null {\n return this.samplingDecision || null;\n }\n\n // Public method to get project info\n public getProjectInfo(): ProjectSettings | null {\n return this.projectSettings || null;\n }\n\n // --- Error Tracking Initialization ---\n private initializeErrorTracking() {\n try {\n // Initialize error storage\n this.errorStorage = new ErrorStorage({\n maxStorageSize: 5 * 1024 * 1024, // 5MB\n maxRetries: 5,\n retryInterval: 30000, // 30 seconds\n compressionEnabled: true,\n encryptionEnabled: false\n });\n\n // Initialize error tracker\n const errorConfig: ErrorConfig = {\n endpoint: ENV_CONFIG.API_BASE_URL,\n clientId: this.config.clientId || \"\",\n apiKey: this.config.apiKey, // Keep for backward compatibility\n authManager: this.authManager, // Pass authManager for JWT auth\n captureScreenshots: this.config.errorTracking?.captureScreenshots ?? true,\n captureDomSnapshots: this.config.errorTracking?.captureDomSnapshots ?? true,\n maxStackTraceDepth: this.config.errorTracking?.maxStackTraceDepth ?? 50,\n maxErrorsPerSession: this.config.errorTracking?.maxErrorsPerSession ?? 100,\n debounceMs: this.config.errorTracking?.debounceMs ?? 1000,\n enableNetworkTracking: this.config.errorTracking?.enableNetworkTracking ?? true,\n enableConsoleCapture: this.config.errorTracking?.enableConsoleCapture ?? true\n };\n\n this.errorTracker = new ErrorTracker(errorConfig);\n \n // Set user for error tracking if available\n const userId = this.getUserId();\n if (userId && this.errorTracker) {\n this.errorTracker.setUser(userId);\n }\n\n this.log('Error tracking initialized successfully');\n } catch (error) {\n console.error('[AInamika SDK] Failed to initialize error tracking:', error);\n }\n }\n\n // Public method to capture custom exceptions\n public captureException(error: Error, context?: Record<string, any>) {\n if (this.errorTracker) {\n this.errorTracker.captureException(error, context);\n }\n }\n\n // Public method to set user for error tracking (deprecated - use identifyUser instead)\n public setUser(userId: string) {\n console.warn('[AInamika SDK] setUser is deprecated. Please use identifyUser() instead.');\n this.identifyUser(userId);\n }\n\n // Public method to flush stored errors\n public async flushStoredErrors() {\n if (this.errorStorage) {\n await this.errorStorage.processQueue();\n }\n if (this.errorTracker) {\n await this.errorTracker.flushStoredErrors();\n }\n }\n\n private async setupAutoConfiguration() {\n try {\n this.log('Starting auto-configuration...');\n // Compute current DOM structure and hash\n const domStructure = await this.getDOMStructure();\n const domHash = this.computeDomHash(domStructure);\n this.lastDomHash = domHash; // Store the initial DOM hash\n \n // Try to load config from localStorage cache first using DOM hash\n let generatedConfig = this.getCachedConfigForDomHash(domHash);\n \n if (generatedConfig) {\n this.log('Loaded analytics config from localStorage cache for DOM hash:', domHash);\n } else {\n // Try to load config from file as fallback\n generatedConfig = await this.loadConfigFromFile();\n if (generatedConfig) {\n this.log('Loaded analytics config from file');\n }\n }\n \n if (!generatedConfig) {\n // Only call API if not found in cache or file, and include DOM hash\n this.log('No cached config found, fetching from backend for DOM hash:', domHash);\n generatedConfig = await this.fetchGeneratedConfig(domStructure, domHash);\n if (generatedConfig && generatedConfig.events_to_track) {\n this.saveConfigToFile(generatedConfig);\n this.setCachedConfigForDomHash(domHash, generatedConfig);\n this.lastConfigHash = generatedConfig.config_hash || '';\n }\n }\n \n if (generatedConfig && generatedConfig.events_to_track) {\n this.applyGeneratedConfig(generatedConfig);\n // Send config to worker for advanced tracking (scroll, focus, etc.)\n if (this.config.useWebWorker && typeof Worker !== 'undefined') {\n this.worker.postMessage({ type: 'initConfig', config: generatedConfig });\n }\n this.log('Auto-configuration applied successfully', generatedConfig);\n } else {\n this.log('Auto-configuration failed: Invalid config received from backend.', generatedConfig);\n }\n } catch (error) {\n this.log('Auto-configuration failed with error', error);\n }\n }\n\n private async getDOMStructure(): Promise<any> {\n const getSelector = (el: Element): string => {\n if (el.id) return `#${el.id}`;\n if (el.className) {\n const classes = el.className.split(' ').filter(c => c.trim()).join('.');\n return classes ? `.${classes}` : el.tagName.toLowerCase();\n }\n return el.tagName.toLowerCase();\n };\n\n // Wait a bit for any dynamic content to load\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Comprehensive selector for all interactive and important elements\n const elements = Array.from(document.body.querySelectorAll(`\n button, a, input, select, textarea, form, img, h1, h2, h3, h4, h5, h6,\n [role=button], [role=link], [onclick], [tabindex], [data-analytics], [data-track],\n .card, .btn, .btn-primary, .btn-secondary, .card-title, .card-description, .card-price, .card-actions,\n [id*=\"card\"], [class*=\"card\"], [class*=\"btn\"], [class*=\"price\"], [class*=\"title\"],\n div, span, p\n `));\n\n // Filter and enhance elements with more comprehensive logic\n const filteredElements = elements.filter(el => {\n const style = window.getComputedStyle(el);\n const isVisible = style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0';\n const hasInteraction = el.tagName.toLowerCase() === 'button' || \n el.tagName.toLowerCase() === 'a' || \n el.hasAttribute('onclick') ||\n el.getAttribute('role') === 'button' ||\n el.classList.contains('btn') ||\n el.classList.contains('card');\n const isImportantElement = el.id === 'cardsContainer' || \n el.classList.contains('cards-grid') ||\n el.classList.contains('card') ||\n el.tagName.toLowerCase() === 'img' ||\n ['h1', 'h2', 'h3'].indexOf(el.tagName.toLowerCase()) !== -1;\n \n return (isVisible && (hasInteraction || isImportantElement)) || el.id === 'cardsContainer';\n });\n\n // Deduplicate and add stable metadata (exclude dynamic properties)\n const seen = new Set<string>();\n const structure = filteredElements.map(el => {\n // Only include stable attributes that don't change between page loads\n const stableAttributes: Record<string, string> = {};\n Array.from(el.attributes).forEach(attr => {\n // Exclude dynamic attributes that might change\n if (['style', 'data-timestamp', 'data-rendered'].indexOf(attr.name) === -1) {\n stableAttributes[attr.name] = attr.value;\n }\n });\n \n const obj = {\n tagName: el.tagName.toLowerCase(),\n selector: getSelector(el),\n id: el.id || '',\n className: el.className || '',\n textContent: (el.textContent || '').trim().substring(0, 100),\n attributes: stableAttributes,\n // Remove position and computed styles as they can vary\n isInteractive: el.tagName.toLowerCase() === 'button' || \n el.tagName.toLowerCase() === 'a' || \n el.hasAttribute('onclick') ||\n el.getAttribute('role') === 'button' ||\n el.classList.contains('btn'),\n hasChildren: el.children.length > 0,\n childCount: el.children.length,\n // Add stable structural information\n parentTagName: el.parentElement?.tagName.toLowerCase() || '',\n index: Array.from(el.parentElement?.children || []).indexOf(el)\n };\n return obj;\n }).filter(obj => {\n const key = obj.tagName + '|' + obj.selector + '|' + obj.textContent.substring(0, 20);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n\n this.log('DOM structure analyzed', { elementCount: structure.length, elements: structure });\n return { elements: structure };\n }\n\n private async fetchGeneratedConfig(structure: any, domHash?: string): Promise<any> {\n try {\n if(structure && structure.elements && structure.elements.length === 0) {\n this.log('No elements found in DOM structure, skipping config fetch.');\n return null;\n }\n\n // Get authentication headers\n let headers: Record<string, string> = { 'Content-Type': 'application/json' };\n const authHeaders = await this.authManager.getAuthHeaders();\n headers = { ...headers, ...authHeaders };\n\n const requestBody: any = { structure };\n if (domHash) {\n requestBody.domHash = domHash;\n requestBody.lastConfigHash = this.lastConfigHash;\n }\n\n const response = await fetch(API_ENDPOINTS.CONFIG, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n throw new Error(`Backend returned ${response.status}`);\n }\n return await response.json();\n } catch (error) {\n this.log('Error fetching generated config:', error);\n return null;\n }\n }\n\n private applyGeneratedConfig(config: { events_to_track: any[], observe_mutations?: boolean }) {\n config.events_to_track.forEach(eventToTrack => {\n try {\n const elements = document.querySelectorAll(eventToTrack.element_selector);\n if (elements.length > 0) {\n elements.forEach(element => {\n // Prevent multiple listeners for the same event type on the same element\n let eventSet = this.attachedListeners.get(element);\n if (!eventSet) {\n eventSet = new Set();\n this.attachedListeners.set(element, eventSet);\n }\n \n // Handle array of event types\n const eventTypes = Array.isArray(eventToTrack.event_type) ? eventToTrack.event_type : [eventToTrack.event_type];\n \n eventTypes.forEach((eventType: string) => {\n if (eventSet.has(eventType)) return;\n eventSet.add(eventType);\n \n // Click events\n if (eventType === 'click') {\n element.addEventListener('click', (event: Event) => {\n // Don't prevent default for this demo, let buttons work normally\n const target = event.target as HTMLElement;\n const elementData = this.extractElementData(target);\n \n this.sendToWorker(eventToTrack.event_name, {\n selector: eventToTrack.element_selector,\n eventType: 'click',\n element: elementData,\n timestamp: new Date().toISOString()\n });\n });\n this.log(`Attached click listener for \"${eventToTrack.event_name}\" on \"${eventToTrack.element_selector}\"`);\n }\n \n // View events using IntersectionObserver\n if (eventType === 'view') {\n if ('IntersectionObserver' in window) {\n const observer = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n const target = entry.target as HTMLElement;\n const elementData = this.extractElementData(target);\n \n this.sendToWorker(eventToTrack.event_name, {\n selector: eventToTrack.element_selector,\n eventType: 'view',\n element: elementData,\n intersectionRatio: entry.intersectionRatio,\n timestamp: new Date().toISOString()\n });\n }\n });\n }, { threshold: [0.1, 0.5, 1.0] });\n observer.observe(element);\n this.log(`Attached IntersectionObserver for \"${eventToTrack.event_name}\" on \"${eventToTrack.element_selector}\"`);\n }\n }\n \n // Focus/blur tracking\n if (eventType === 'focus' || eventType === 'blur') {\n element.addEventListener(eventType, () => {\n const target = element as HTMLElement;\n const elementData = this.extractElementData(target);\n \n this.sendToWorker(eventToTrack.event_name, {\n selector: eventToTrack.element_selector,\n eventType: eventType,\n element: elementData,\n timestamp: new Date().toISOString()\n });\n });\n this.log(`Attached ${eventType} listener for \"${eventToTrack.event_name}\" on \"${eventToTrack.element_selector}\"`);\n }\n });\n });\n } else {\n this.log(`No elements found for selector: \"${eventToTrack.element_selector}\"`);\n }\n } catch (e) {\n this.log(`Error applying selector \"${eventToTrack.element_selector}\":`, e);\n }\n });\n\n // MutationObserver for DOM changes (if requested by config)\n if (config.observe_mutations) {\n if ('MutationObserver' in window) {\n const observer = new MutationObserver((mutations) => {\n mutations.forEach(mutation => {\n this.sendToWorker('dom_mutation', {\n type: mutation.type,\n target: (mutation.target as HTMLElement).outerHTML,\n timestamp: new Date().toISOString()\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n this.log('MutationObserver attached for DOM changes');\n }\n }\n }\n\n private extractElementData(element: HTMLElement): any {\n const rect = element.getBoundingClientRect();\n return {\n tagName: element.tagName.toLowerCase(),\n id: element.id || '',\n className: element.className || '',\n textContent: (element.textContent || '').trim().substring(0, 100),\n attributes: Array.from(element.attributes).reduce((acc, attr) => {\n acc[attr.name] = attr.value;\n return acc;\n }, {} as Record<string, string>),\n position: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height)\n },\n href: (element as HTMLAnchorElement).href || undefined,\n value: (element as HTMLInputElement).value || undefined\n };\n }\n\n // Helper to send events to worker for batching\n private sendToWorker(eventName: string, properties: Record<string, any>) {\n // Check if we should sample this event\n if (!this.shouldSampleEvents()) {\n this.log('Event skipped due to sampling:', eventName);\n return;\n }\n\n const now = new Date();\n const eventData: any = {\n event: eventName,\n properties,\n timestamp: now.getTime(), // Milliseconds for backward compatibility\n created_at: now.toISOString(), // ISO timestamp for server-side time filtering\n userId: this.getUserId(),\n sessionId: this.sessionId,\n // Include both project_key (new) and client_id (legacy)\n project_key: this.config.projectKey || undefined,\n client_id: this.config.clientId || this.config.apiKey || undefined,\n project_id: this.projectSettings?.project_id || undefined\n };\n if (this.config.useWebWorker && typeof Worker !== 'undefined') {\n this.worker.postMessage({ type: 'track', payload: eventData });\n } else {\n this.eventQueue.push(eventData);\n }\n this.log('Event tracked:', eventData);\n }\n\n private async setupWebWorker() {\n // Get authentication headers\n const authHeaders = await this.authManager.getAuthHeaders();\n\n // Pass worker config to the worker\n this.worker.postMessage({\n type: 'config',\n payload: {\n apiUrl: this.config.apiDetails?.apiEndPoint || `${this.config.endpoint}/api/v1/events`,\n batchSize: this.config.workerConfig?.batchSize || 10,\n batchInterval: this.config.workerConfig?.batchInterval || 5000,\n headers: {\n 'Content-Type': 'application/json',\n ...authHeaders,\n ...(this.config.apiDetails?.headers || {})\n },\n }\n });\n this.worker.onmessage = (event) => {\n if (event.data.status === 'success') {\n this.log('Batch sent successfully by worker');\n // Don't re-queue failed events since we already cleared the queue\n } else if (event.data.status === 'debug') {\n this.log(event.data.message, event.data);\n } else if (event.data.status === 'error') {\n this.log('Worker failed to send batch', event.data.error);\n // Re-queue failed events only if we have them\n if (event.data.failedEvents && event.data.failedEvents.length > 0) {\n this.eventQueue.unshift(...event.data.failedEvents);\n }\n }\n };\n this.log('Web worker setup complete.');\n }\n\n public track(eventName: string, properties: Record<string, any> = {}) {\n // Check if we should sample this event\n if (!this.shouldSampleEvents()) {\n this.log('Event skipped due to sampling:', eventName);\n return;\n }\n\n // Track in journey tracker\n this.journeyTracker.trackEvent(eventName, properties);\n\n // Get journey context\n const journeyContext = this.journeyTracker.getContext();\n\n const now = new Date();\n const eventData: any = {\n event: eventName,\n properties: {\n ...properties,\n journeyContext: {\n sequenceIndex: journeyContext.eventCount - 1,\n timeSinceLastEvent: journeyContext.timeSinceLastEvent,\n journeyDuration: Date.now() - journeyContext.journeyStartTime\n }\n },\n timestamp: now.getTime(), // Milliseconds for backward compatibility\n created_at: now.toISOString(), // ISO timestamp for server-side time filtering\n userId: this.userManager.getUserId(),\n userType: this.userManager.getUserType(),\n sessionId: this.sessionId,\n // Include both project_key (new) and client_id (legacy)\n project_key: this.config.projectKey || undefined,\n client_id: this.config.clientId || this.config.apiKey || undefined,\n // Include project_id if available from project settings\n project_id: this.projectSettings?.project_id || undefined\n };\n\n // Check if we should send journey for analysis\n if (this.journeyTracker.shouldAnalyzeJourney()) {\n this.sendJourneyForAnalysis();\n }\n\n // Use the same batching logic as sendToWorker\n if (this.config.useWebWorker && typeof Worker !== 'undefined') {\n this.worker.postMessage({ type: 'track', payload: eventData });\n } else {\n this.eventQueue.push(eventData);\n }\n this.log('Event tracked public:', eventData);\n }\n\n private startBatchTimer() {\n this.batchTimer = window.setInterval(() => {\n this.flushQueue();\n }, this.config.batchInterval);\n }\n\n private async flushQueue() {\n if (this.eventQueue.length === 0) {\n return;\n }\n\n const batch = [...this.eventQueue];\n // Clear the queue immediately to prevent duplicates\n this.eventQueue = [];\n\n if (this.config.useWebWorker && typeof Worker !== 'undefined') {\n this.worker.postMessage({\n type: 'batch',\n events: batch,\n endpoint: `${this.config.endpoint}/api/v1/events`,\n });\n } else {\n // Fallback send mechanism with retry logic\n await this.sendBatchWithRetry(batch);\n }\n }\n\n private async sendBatchWithRetry(batch: Map<string, any>[]) {\n if (this.batchRetryCount >= this.maxBatchRetries) {\n if (this.batchTimer) {\n clearInterval(this.batchTimer);\n this.batchTimer = undefined;\n this.log('Max batch retries reached. BatchTimer cancelled.');\n }\n return;\n }\n try {\n await this.sendBatch(batch);\n // On success, reset retry count (queue already cleared in flushQueue)\n this.batchRetryCount = 0;\n } catch (error) {\n this.batchRetryCount++;\n this.log(`Batch send failed. Retry attempt ${this.batchRetryCount} of ${this.maxBatchRetries}.`, error);\n // Re-queue the failed batch for retry\n this.eventQueue.unshift(...batch);\n if (this.batchRetryCount >= this.maxBatchRetries) {\n if (this.batchTimer) {\n clearInterval(this.batchTimer);\n this.batchTimer = undefined;\n this.log('Max batch retries reached. BatchTimer cancelled.');\n }\n }\n }\n }\n\n // Update sendBatch to support client db endpoint and headers\n private async sendBatch(batch: Map<string, any>[]) {\n let endpoint = `${this.config.endpoint}/api/v1/events`;\n let headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n // Get authentication headers\n const authHeaders = await this.authManager.getAuthHeaders();\n headers = { ...headers, ...authHeaders };\n\n if (this.config.apiDetails && this.config.apiDetails.apiEndPoint) {\n endpoint = this.config.apiDetails.apiEndPoint;\n if (this.config.apiDetails.headers) {\n headers = { ...headers, ...this.config.apiDetails.headers };\n }\n }\n // Transform batch to required format\n const clientId = this.config.clientId || '5288aa7d-1b7c-481e-958d-eb9b8e951f14';\n const events = batch.map((e: any) => ({\n event: e.event, // keep 'event' key\n userId: e.userId,\n client_id: clientId,\n timestamp: new Date(e.timestamp).toISOString(),\n ...(e.properties || {})\n }));\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify({ events }),\n });\n if (!response.ok) {\n throw new Error(`Failed to send batch: ${response.status}`);\n }\n this.log('Batch sent successfully:', events);\n } catch (error) {\n this.log('Error sending batch:', error);\n throw error; // Let sendBatchWithRetry handle re-queuing\n }\n }\n\n private generateSessionId(): string {\n // Simple session ID generator (could be improved)\n return 'sess_' + Math.random().toString(36).substr(2, 9);\n }\n\n private getUserId(): string {\n // Use UserManager for consistent user identification\n return this.userManager.getUserId();\n }\n\n // Public method to identify authenticated user\n public identifyUser(authenticatedUserId: string, userProperties?: Record<string, any>) {\n // Get identification event before updating\n const identificationEvent = this.userManager.getUserIdentificationEvent(authenticatedUserId);\n\n // Update user in UserManager\n this.userManager.identifyUser(authenticatedUserId, userProperties);\n\n // Track the identification event\n this.track('user_identified', identificationEvent);\n\n // Update error tracker if enabled\n if (this.errorTracker) {\n this.errorTracker.setUser(authenticatedUserId);\n }\n\n this.log('User identified:', { userId: authenticatedUserId, properties: userProperties });\n }\n\n // Public authentication methods\n public async isAuthenticated(): Promise<boolean> {\n const token = await this.authManager.getAccessToken();\n return token !== null;\n }\n\n public async authenticate(): Promise<boolean> {\n return await this.authManager.initialize();\n }\n\n public async logout(): Promise<void> {\n await this.authManager.logout();\n }\n\n // Send journey data for AI analysis\n private async sendJourneyForAnalysis() {\n try {\n const journeyData = this.journeyTracker.getJourneyForAnalysis();\n const endpoint = `${this.config.endpoint}/api/v1/journeys/analyze`;\n\n // Get authentication headers\n const authHeaders = await this.authManager.getAuthHeaders();\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...authHeaders\n },\n body: JSON.stringify({\n client_id: this.config.clientId,\n user_id: this.userManager.getUserId(),\n session_id: this.sessionId,\n journey: journeyData\n })\n });\n\n if (!response.ok) {\n console.error('[AInamika SDK] Failed to send journey for analysis:', response.statusText);\n }\n } catch (error) {\n console.error('[AInamika SDK] Error sending journey for analysis:', error);\n }\n }\n\n private log(message: string, data?: any) {\n if (this.config.debug) {\n console.log(`[AnalyticsPro SDK] ${message}`, data || '');\n }\n }\n\n // Save config as a downloadable JSON file\nprivate saveConfigToFile(config: any) {\n if(!this.config.debug){\n return;\n }\n // const fileName = 'AInamika_config.json';\n // const json = JSON.stringify(config, null, 2);\n // const blob = new Blob([json], { type: 'application/json' });\n // const link = document.createElement('a');\n // link.href = URL.createObjectURL(blob);\n // link.download = fileName;\n // document.body.appendChild(link);\n // link.click();\n // document.body.removeChild(link);\n}\n\n// Load config from /AInamika_config.json in the project root\nprivate async loadConfigFromFile(): Promise<any | null> {\n try {\n const response = await fetch('/AInamika_config.json', { cache: 'reload' });\n if (!response.ok) {\n return null;\n }\n const config = await response.json();\n return config;\n } catch (err) {\n return null;\n }\n}\n\n// --- Dynamic DOM Fingerprinting and Smart Debouncing ---\nprivate async setupDynamicDomTracking() {\n // Use MutationObserver to watch for DOM changes\n if ('MutationObserver' in window) {\n const observer = new MutationObserver(() => {\n if (this.mutationDebounceTimer) {\n clearTimeout(this.mutationDebounceTimer);\n }\n this.mutationDebounceTimer = window.setTimeout(() => {\n this.handleDomMutation();\n }, this.mutationDebounceMs);\n });\n observer.observe(document.body, { childList: true, subtree: true, attributes: true });\n this.log('Dynamic DOM MutationObserver attached');\n }\n}\n\nprivate computeDomHash(structure: any): string {\n // Simple hash: JSON.stringify, then a basic hash (FNV-1a or similar)\n const str = JSON.stringify(structure);\n let hash = 2166136261;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);\n }\n return (hash >>> 0).toString(16);\n}\n\nprivate getCachedConfigForDomHash(domHash: string): any | null {\n try {\n const cache = JSON.parse(localStorage.getItem('ainamika_dom_config_cache') || '{}');\n return cache[domHash] || null;\n } catch {\n return null;\n }\n}\n\nprivate setCachedConfigForDomHash(domHash: string, config: any) {\n try {\n const cache = JSON.parse(localStorage.getItem('ainamika_dom_config_cache') || '{}');\n cache[domHash] = config;\n localStorage.setItem('ainamika_dom_config_cache', JSON.stringify(cache));\n } catch {}\n}\n\nprivate async handleDomMutation() {\n const domStructure = await this.getDOMStructure();\n const domHash = this.computeDomHash(domStructure);\n \n if (domHash === this.lastDomHash) {\n this.log('DOM hash unchanged after mutation, skipping config fetch.');\n return;\n }\n \n this.log('DOM hash changed, checking for cached config...', { oldHash: this.lastDomHash, newHash: domHash });\n this.lastDomHash = domHash;\n \n const cachedConfig = this.getCachedConfigForDomHash(domHash);\n if (cachedConfig) {\n this.log('Reusing cached config for DOM hash', domHash);\n this.applyGeneratedConfig(cachedConfig);\n return;\n }\n \n // Send to server: domStructure with domHash and lastConfigHash\n this.log('Fetching new config from backend for DOM hash:', domHash);\n const config = await this.fetchGeneratedConfig(domStructure, domHash);\n if (config && config.events_to_track) {\n this.applyGeneratedConfig(config);\n this.setCachedConfigForDomHash(domHash, config);\n this.lastConfigHash = config.config_hash || '';\n this.log('Fetched and applied new config for new DOM hash', domHash);\n } else {\n this.log('No valid config returned for new DOM hash', domHash);\n }\n}\n}\n\n// Make AnalyticsProSDK available globally for both classic and module scripts\nif (typeof window !== 'undefined') {\n (window as any).AInamikaSDKPro = AInamikaSDKPro;\n}\n\nexport default AInamikaSDKPro;\nexport { AInamikaSDKPro };"],"names":["root","factory","exports","module","define","amd","self","window","global","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","config","breadcrumbs","errorCount","errorDebounceMap","Map","captureScreenshots","captureDomSnapshots","maxStackTraceDepth","maxErrorsPerSession","debounceMs","enableNetworkTracking","enableConsoleCapture","authManager","sessionId","generateSessionId","originalConsole","console","initialize","addEventListener","event","handleError","type","message","filename","line","lineno","column","colno","error","reason","promise","setupNetworkTracking","setupConsoleCapture","setupNavigationTracking","setupClickTracking","log","Date","now","Math","random","toString","substr","addBreadcrumb","breadcrumb","push","timestamp","length","slice","errorInfo","warn","errorKey","has","set","captureError","errorData","client_id","clientId","error_type","stack_trace","extractStackTrace","url","location","href","user_agent","navigator","userAgent","error_metadata","userId","networkInfo","getNetworkInfo","performance","getPerformanceInfo","severity","assessSeverity","session_id","user_id","dom_snapshot","captureDomSnapshot","captureScreenshot","screen_snapshot","sendError","data","stack","split","maxDepth","join","toLowerCase","includes","snapshot","title","document","viewport","width","innerWidth","height","innerHeight","elements","extractDomElements","JSON","stringify","forEach","selector","els","querySelectorAll","Array","from","el","tagName","id","className","textContent","substring","attributes","getElementAttributes","e","element","attrs","attr","value","getAttribute","html2canvas","body","min","useCORS","toDataURL","connection","mozConnection","webkitConnection","effectiveType","downlink","rtt","saveData","info","memory","usedJSHeapSize","totalJSHeapSize","jsHeapSizeLimit","timing","domContentLoaded","domContentLoadedEventEnd","navigationStart","load","loadEventEnd","getEntriesByType","entry","name","firstPaint","startTime","firstContentfulPaint","originalFetch","fetch","args","Request","String","response","status","duration","ok","statusText","originalXHROpen","XMLHttpRequest","open","originalXHRSend","send","method","async","username","password","_errorTracker","tracker","dispatchEvent","CustomEvent","detail","original","map","arg","consoleMethod","level","currentUrl","trackNavigation","newUrl","to","originalPushState","history","pushState","originalReplaceState","replaceState","apply","setTimeout","target","getElementSelector","text","trim","classes","filter","c","headers","getAuthHeaders","authHeaders","apiKey","endpoint","Error","storeErrorLocally","stored","localStorage","getItem","errors","parse","splice","setItem","captureException","context","setUser","addTag","flushStoredErrors","removeItem","ENV_CONFIG","__AINAMIKA_CONFIG__","API_BASE_URL","APP_ENV","DEBUG","API_ENDPOINTS","EVENTS","ERRORS","CONFIG","DEBUG_EVENTS","PROJECTS_LOOKUP","SAMPLING_CHECK","STORAGE_KEY","METADATA_KEY","isProcessing","maxStorageSize","maxRetries","retryInterval","compressionEnabled","encryptionEnabled","cleanupOldErrors","startRetryTimer","setupStorageListener","processQueue","storeError","errorId","generateErrorId","storedError","compressData","retryCount","addToQueue","updateMetadata","getStoredErrors","decompressData","removeError","getQueueRaw","filteredErrors","clearAll","getStorageStats","totalSize","Blob","size","timestamps","sort","oldestError","newestError","lastRetry","incrementRetryCount","retryError","find","serialized","shift","errorIndex","findIndex","jsonString","btoa","compressedData","atob","cleanErrors","retryTimer","setInterval","stats","metadata","lastUpdate","exportErrors","exportData","version","importErrors","isArray","destroy","clearInterval","undefined","getAinamikaStorageUsage","errorSize","otherSize","startsWith","checkStorageSpace","requiredBytes","testKey","testData","repeat","cleanupAllAinamikaStorage","keysToRemove","generateStorageReport","storage","ErrorStorage","usage","ErrorStorageUtils","userProperties","initializeUser","getOrCreateUserId","generateAnonymousId","getUserId","getUserProperties","identifyUser","authenticatedUserId","properties","previousId","updateUserProperties","clearUser","getUserIdentificationEvent","previous_id","isAnonymousUser","getUserType","userJourney","lastEventTime","sequenceIndex","maxJourneyLength","journeyAnalysisThreshold","journeyStartTime","trackEvent","eventName","currentTime","timeSinceLastEvent","journeyEvent","journeyPosition","getContext","journeySequence","getJourneySequence","eventCount","getJourneyData","shouldAnalyzeJourney","getJourneyForAnalysis","journeyDuration","avgTimeBetweenEvents","calculateAverageTimeBetweenEvents","journey","journeyLength","endTime","totalTime","i","round","findPatterns","patterns","sequence","fromEntries","entries","clearJourney","getJourneySegment","count","detectPotentialFunnel","recentEvents","funnelName","apiEndpoint","debug","accessToken","refreshToken","tokenExpiry","loadTokens","isTokenValid","debugLog","refreshAccessToken","requestTokens","tokens","setTokens","json","refresh_token","clearTokens","getAccessToken","shouldRefreshToken","token","access_token","expires_in","saveTokens","scheduleTokenRefresh","refreshTimer","clearTimeout","refreshIn","max","tokenData","logout","eventQueue","isInitialized","batchRetryCount","maxBatchRetries","domHashCache","lastDomHash","lastConfigHash","mutationDebounceTimer","mutationDebounceMs","attachedListeners","WeakMap","projectKey","batchInterval","useWebWorker","errorTracking","enabled","userIdentifier","getOrCreateUserIdentifier","userManager","UserManager","journeyTracker","JourneyTracker","AuthManager","blob","workerUrl","URL","createObjectURL","worker","Worker","initializeProjectSettings","initializeSamplingDecision","projectSettings","samplingDecision","shouldSampleErrors","initializeErrorTracking","autoConfig","setupAutoConfiguration","setupDynamicDomTracking","setupWebWorker","startBatchTimer","sampling","storageKey","identifier","project_key","user_identifier","cacheSamplingDecision","loadCachedSamplingDecision","cached","should_sample","events","session_replay","rates","decision","shouldSampleEvents","shouldSampleSessionReplay","getSamplingStatus","getProjectInfo","errorStorage","errorConfig","errorTracker","ErrorTracker","getDOMStructure","domStructure","domHash","computeDomHash","generatedConfig","getCachedConfigForDomHash","loadConfigFromFile","fetchGeneratedConfig","events_to_track","saveConfigToFile","setCachedConfigForDomHash","config_hash","applyGeneratedConfig","postMessage","getSelector","Promise","resolve","filteredElements","style","getComputedStyle","isVisible","display","visibility","opacity","hasInteraction","hasAttribute","classList","contains","isImportantElement","indexOf","seen","Set","structure","stableAttributes","isInteractive","hasChildren","children","childCount","parentTagName","parentElement","index","add","elementCount","requestBody","eventToTrack","element_selector","eventSet","event_type","eventType","elementData","extractElementData","sendToWorker","event_name","toISOString","IntersectionObserver","isIntersecting","intersectionRatio","threshold","observe","observe_mutations","MutationObserver","mutations","mutation","outerHTML","childList","subtree","rect","getBoundingClientRect","reduce","acc","position","x","y","eventData","getTime","created_at","project_id","payload","apiUrl","apiDetails","apiEndPoint","batchSize","workerConfig","onmessage","failedEvents","unshift","track","journeyContext","userType","sendJourneyForAnalysis","batchTimer","flushQueue","batch","sendBatchWithRetry","sendBatch","identificationEvent","isAuthenticated","authenticate","journeyData","cache","handleDomMutation","str","hash","charCodeAt","oldHash","newHash","cachedConfig","AInamikaSDKPro"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"ainamika-sdk.js","mappings":"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","sources":["webpack://AInamikaSDKPro/webpack/universalModuleDefinition","webpack://AInamikaSDKPro/webpack/bootstrap","webpack://AInamikaSDKPro/webpack/runtime/define property getters","webpack://AInamikaSDKPro/webpack/runtime/hasOwnProperty shorthand","webpack://AInamikaSDKPro/./src/error-tracker.ts","webpack://AInamikaSDKPro/./src/config.ts","webpack://AInamikaSDKPro/./src/error-storage.ts","webpack://AInamikaSDKPro/./src/user-manager.ts","webpack://AInamikaSDKPro/./src/journey-tracker.ts","webpack://AInamikaSDKPro/./src/auth-manager.ts","webpack://AInamikaSDKPro/./src/sdk.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"AInamikaSDKPro\"] = factory();\n\telse\n\t\troot[\"AInamikaSDKPro\"] = factory();\n})((typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : this), function() {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = function(exports, definition) {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }","// error-tracker.ts - Advanced Error Tracking System for AInamika SDK\n\nimport { AuthManager } from './auth-manager';\n\nexport interface ErrorConfig {\n endpoint: string;\n clientId: string;\n apiKey?: string; // Made optional for backward compatibility\n authManager?: AuthManager; // New: pass authManager for JWT auth\n captureScreenshots?: boolean;\n captureDomSnapshots?: boolean;\n maxStackTraceDepth?: number;\n maxErrorsPerSession?: number;\n debounceMs?: number;\n enableNetworkTracking?: boolean;\n enableConsoleCapture?: boolean;\n}\n\nexport interface ErrorData {\n id?: string;\n client_id: string;\n error_type: 'javascript' | 'network' | 'unhandled' | 'console' | 'custom';\n message: string;\n stack_trace?: string;\n url: string;\n user_agent: string;\n timestamp: number;\n error_metadata: {\n line?: number;\n column?: number;\n filename?: string;\n component?: string;\n props?: Record<string, any>;\n userId?: string;\n sessionId?: string;\n breadcrumbs?: ErrorBreadcrumb[];\n networkInfo?: NetworkInfo;\n performance?: PerformanceInfo;\n };\n dom_snapshot?: string;\n screen_snapshot?: string;\n severity: 'low' | 'medium' | 'high' | 'critical';\n session_id: string;\n user_id?: string;\n}\n\nexport interface ErrorBreadcrumb {\n timestamp: number;\n type: 'navigation' | 'click' | 'console' | 'network' | 'error';\n message: string;\n data?: Record<string, any>;\n}\n\nexport interface NetworkInfo {\n effectiveType?: string;\n downlink?: number;\n rtt?: number;\n saveData?: boolean;\n}\n\nexport interface PerformanceInfo {\n memory?: {\n usedJSHeapSize: number;\n totalJSHeapSize: number;\n jsHeapSizeLimit: number;\n };\n timing?: {\n domContentLoaded: number;\n load: number;\n firstPaint?: number;\n firstContentfulPaint?: number;\n };\n}\n\nexport class ErrorTracker {\n private config: ErrorConfig;\n private breadcrumbs: ErrorBreadcrumb[] = [];\n private errorCount = 0;\n private errorDebounceMap = new Map<string, number>();\n private originalConsole: Console;\n private sessionId: string;\n private userId?: string;\n private authManager?: AuthManager;\n\n constructor(config: ErrorConfig) {\n this.config = {\n captureScreenshots: true,\n captureDomSnapshots: true,\n maxStackTraceDepth: 50,\n maxErrorsPerSession: 100,\n debounceMs: 1000,\n enableNetworkTracking: true,\n enableConsoleCapture: true,\n ...config\n };\n\n this.authManager = config.authManager;\n this.sessionId = this.generateSessionId();\n this.originalConsole = { ...console };\n this.initialize();\n }\n\n private initialize() {\n // Global error handler\n window.addEventListener('error', (event) => {\n this.handleError({\n type: 'javascript',\n message: event.message,\n filename: event.filename,\n line: event.lineno,\n column: event.colno,\n error: event.error\n });\n });\n\n // Unhandled promise rejection handler\n window.addEventListener('unhandledrejection', (event) => {\n this.handleError({\n type: 'unhandled',\n message: event.reason?.message || 'Unhandled Promise Rejection',\n error: event.reason,\n promise: true\n });\n });\n\n // Network error tracking\n if (this.config.enableNetworkTracking) {\n this.setupNetworkTracking();\n }\n\n // Console capture\n if (this.config.enableConsoleCapture) {\n this.setupConsoleCapture();\n }\n\n // Navigation breadcrumbs\n this.setupNavigationTracking();\n\n // Click breadcrumbs\n this.setupClickTracking();\n\n console.log('[AInamika Error Tracker] Initialized successfully');\n }\n\n private generateSessionId(): string {\n return `session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private addBreadcrumb(breadcrumb: Omit<ErrorBreadcrumb, 'timestamp'>) {\n this.breadcrumbs.push({\n ...breadcrumb,\n timestamp: Date.now()\n });\n\n // Keep only last 50 breadcrumbs\n if (this.breadcrumbs.length > 50) {\n this.breadcrumbs = this.breadcrumbs.slice(-50);\n }\n }\n\n private handleError(errorInfo: any) {\n if (this.errorCount >= this.config.maxErrorsPerSession!) {\n console.warn('[AInamika Error Tracker] Max errors per session reached');\n return;\n }\n\n const errorKey = `${errorInfo.message}_${errorInfo.filename}_${errorInfo.line}`;\n const now = Date.now();\n \n // Debounce duplicate errors\n if (this.errorDebounceMap.has(errorKey)) {\n const lastTime = this.errorDebounceMap.get(errorKey)!;\n if (now - lastTime < this.config.debounceMs!) {\n return;\n }\n }\n this.errorDebounceMap.set(errorKey, now);\n\n this.errorCount++;\n this.captureError(errorInfo);\n }\n\n private async captureError(errorInfo: any) {\n try {\n const errorData: ErrorData = {\n client_id: this.config.clientId,\n error_type: errorInfo.type || 'javascript',\n message: errorInfo.message || 'Unknown error',\n stack_trace: this.extractStackTrace(errorInfo.error),\n url: window.location.href,\n user_agent: navigator.userAgent,\n timestamp: Date.now(),\n error_metadata: {\n line: errorInfo.line,\n column: errorInfo.column,\n filename: errorInfo.filename,\n userId: this.userId,\n sessionId: this.sessionId,\n breadcrumbs: [...this.breadcrumbs],\n networkInfo: this.getNetworkInfo(),\n performance: this.getPerformanceInfo()\n },\n severity: this.assessSeverity(errorInfo),\n session_id: this.sessionId,\n user_id: this.userId\n };\n\n // Capture DOM snapshot\n if (this.config.captureDomSnapshots) {\n errorData.dom_snapshot = this.captureDomSnapshot();\n }\n\n // Capture screenshot\n if (this.config.captureScreenshots) {\n errorData.screen_snapshot = await this.captureScreenshot();\n }\n\n // Send error to backend\n await this.sendError(errorData);\n\n // Add error breadcrumb\n this.addBreadcrumb({\n type: 'error',\n message: `${errorData.error_type}: ${errorData.message}`,\n data: { severity: errorData.severity }\n });\n\n } catch (captureError) {\n console.error('[AInamika Error Tracker] Failed to capture error:', captureError);\n }\n }\n\n private extractStackTrace(error: Error): string {\n if (!error || !error.stack) return '';\n \n const stack = error.stack.split('\\n');\n const maxDepth = this.config.maxStackTraceDepth!;\n \n return stack.slice(0, maxDepth).join('\\n');\n }\n\n private assessSeverity(errorInfo: any): 'low' | 'medium' | 'high' | 'critical' {\n const message = errorInfo.message?.toLowerCase() || '';\n \n // Critical errors\n if (message.includes('out of memory') || \n message.includes('security') ||\n message.includes('permission denied') ||\n errorInfo.type === 'unhandled') {\n return 'critical';\n }\n \n // High severity\n if (message.includes('network') || \n message.includes('timeout') ||\n message.includes('failed to fetch') ||\n message.includes('cors')) {\n return 'high';\n }\n \n // Medium severity\n if (message.includes('undefined') || \n message.includes('null') ||\n message.includes('cannot read property')) {\n return 'medium';\n }\n \n return 'low';\n }\n\n private captureDomSnapshot(): string {\n try {\n // Create a simplified DOM snapshot\n const snapshot = {\n url: window.location.href,\n title: document.title,\n viewport: {\n width: window.innerWidth,\n height: window.innerHeight\n },\n elements: this.extractDomElements()\n };\n \n return JSON.stringify(snapshot);\n } catch (error) {\n console.error('[AInamika Error Tracker] Failed to capture DOM snapshot:', error);\n return '';\n }\n }\n\n private extractDomElements(): any[] {\n const elements: any[] = [];\n const maxElements = 100;\n \n // Get key elements\n const selectors = [\n 'body > *',\n '[id]',\n '[class*=\"error\"]',\n '[class*=\"modal\"]',\n 'form',\n 'button',\n 'input[type=\"submit\"]'\n ];\n \n selectors.forEach(selector => {\n try {\n const els = document.querySelectorAll(selector);\n Array.from(els).slice(0, maxElements - elements.length).forEach(el => {\n elements.push({\n tagName: el.tagName,\n id: el.id,\n className: el.className,\n textContent: el.textContent?.substring(0, 100),\n attributes: this.getElementAttributes(el)\n });\n });\n } catch (e) {\n // Ignore selector errors\n }\n });\n \n return elements;\n }\n\n private getElementAttributes(element: Element): Record<string, string> {\n const attrs: Record<string, string> = {};\n const importantAttrs = ['id', 'class', 'type', 'name', 'value', 'href', 'src'];\n \n importantAttrs.forEach(attr => {\n const value = element.getAttribute(attr);\n if (value) attrs[attr] = value;\n });\n \n return attrs;\n }\n\n private async captureScreenshot(): Promise<string> {\n try {\n // Use html2canvas if available, otherwise return empty\n if (typeof (window as any).html2canvas === 'function') {\n const canvas = await (window as any).html2canvas(document.body, {\n height: Math.min(window.innerHeight, 1000),\n width: Math.min(window.innerWidth, 1000),\n useCORS: true\n });\n return canvas.toDataURL('image/jpeg', 0.7);\n }\n return '';\n } catch (error) {\n console.error('[AInamika Error Tracker] Failed to capture screenshot:', error);\n return '';\n }\n }\n\n private getNetworkInfo(): NetworkInfo {\n const connection = (navigator as any).connection || \n (navigator as any).mozConnection || \n (navigator as any).webkitConnection;\n \n if (!connection) return {};\n \n return {\n effectiveType: connection.effectiveType,\n downlink: connection.downlink,\n rtt: connection.rtt,\n saveData: connection.saveData\n };\n }\n\n private getPerformanceInfo(): PerformanceInfo {\n const info: PerformanceInfo = {};\n \n // Memory info\n if ((performance as any).memory) {\n info.memory = {\n usedJSHeapSize: (performance as any).memory.usedJSHeapSize,\n totalJSHeapSize: (performance as any).memory.totalJSHeapSize,\n jsHeapSizeLimit: (performance as any).memory.jsHeapSizeLimit\n };\n }\n \n // Timing info\n if (performance.timing) {\n const timing = performance.timing;\n info.timing = {\n domContentLoaded: timing.domContentLoadedEventEnd - timing.navigationStart,\n load: timing.loadEventEnd - timing.navigationStart\n };\n \n // Paint timings\n if (performance.getEntriesByType) {\n const paintEntries = performance.getEntriesByType('paint');\n paintEntries.forEach((entry: any) => {\n if (entry.name === 'first-paint') {\n info.timing!.firstPaint = entry.startTime;\n } else if (entry.name === 'first-contentful-paint') {\n info.timing!.firstContentfulPaint = entry.startTime;\n }\n });\n }\n }\n \n return info;\n }\n\n private setupNetworkTracking() {\n // Override fetch\n const originalFetch = window.fetch;\n window.fetch = async (...args) => {\n const startTime = Date.now();\n const url = args[0] instanceof Request ? args[0].url : String(args[0]);\n \n try {\n const response = await originalFetch(...args);\n \n this.addBreadcrumb({\n type: 'network',\n message: `Fetch ${response.status} ${url}`,\n data: {\n url,\n status: response.status,\n duration: Date.now() - startTime\n }\n });\n \n if (!response.ok) {\n this.handleError({\n type: 'network',\n message: `Network request failed: ${response.status} ${response.statusText}`,\n url,\n status: response.status\n });\n }\n \n return response;\n } catch (error: any) {\n this.addBreadcrumb({\n type: 'network',\n message: `Fetch failed ${url}`,\n data: { url, error: error?.message || 'Unknown error' }\n });\n \n this.handleError({\n type: 'network',\n message: `Network request failed: ${error?.message || 'Unknown error'}`,\n url,\n error\n });\n \n throw error;\n }\n };\n\n // Override XMLHttpRequest\n const originalXHROpen = XMLHttpRequest.prototype.open;\n const originalXHRSend = XMLHttpRequest.prototype.send;\n \n XMLHttpRequest.prototype.open = function(method: string, url: string | URL, async?: boolean, username?: string | null, password?: string | null) {\n (this as any)._errorTracker = { method, url, startTime: Date.now() };\n return originalXHROpen.call(this, method, url, async || true, username, password);\n };\n \n XMLHttpRequest.prototype.send = function(...args) {\n const tracker = (this as any)._errorTracker;\n \n this.addEventListener('loadend', () => {\n if (tracker) {\n const duration = Date.now() - tracker.startTime;\n \n if (this.status >= 400) {\n this.dispatchEvent(new CustomEvent('networkerror', {\n detail: {\n type: 'network',\n message: `XHR request failed: ${this.status} ${this.statusText}`,\n url: tracker.url,\n status: this.status\n }\n }));\n }\n \n this.dispatchEvent(new CustomEvent('networkbreadcrumb', {\n detail: {\n type: 'network',\n message: `XHR ${this.status} ${tracker.url}`,\n data: {\n method: tracker.method,\n url: tracker.url,\n status: this.status,\n duration\n }\n }\n }));\n }\n });\n \n return originalXHRSend.call(this, ...args);\n };\n \n // Listen for custom events\n document.addEventListener('networkerror', (event: any) => {\n this.handleError(event.detail);\n });\n \n document.addEventListener('networkbreadcrumb', (event: any) => {\n this.addBreadcrumb(event.detail);\n });\n }\n\n private setupConsoleCapture() {\n // Override console methods\n ['error', 'warn'].forEach(method => {\n const original = this.originalConsole[method as keyof Console] as Function;\n (console as any)[method] = (...args: any[]) => {\n if (typeof original === 'function') {\n original.call(console, ...args);\n }\n \n if (method === 'error') {\n this.handleError({\n type: 'console',\n message: args.map(arg => String(arg)).join(' '),\n consoleMethod: method\n });\n }\n \n this.addBreadcrumb({\n type: 'console',\n message: `Console ${method}: ${args.map(arg => String(arg)).join(' ')}`,\n data: { level: method }\n });\n };\n });\n }\n\n private setupNavigationTracking() {\n // Track page changes\n let currentUrl = window.location.href;\n \n const trackNavigation = () => {\n const newUrl = window.location.href;\n if (newUrl !== currentUrl) {\n this.addBreadcrumb({\n type: 'navigation',\n message: `Navigation from ${currentUrl} to ${newUrl}`,\n data: { from: currentUrl, to: newUrl }\n });\n currentUrl = newUrl;\n }\n };\n \n // Listen for various navigation events\n window.addEventListener('popstate', trackNavigation);\n window.addEventListener('hashchange', trackNavigation);\n \n // Override pushState and replaceState\n const originalPushState = history.pushState;\n const originalReplaceState = history.replaceState;\n \n history.pushState = function(...args) {\n originalPushState.apply(this, args);\n setTimeout(trackNavigation, 0);\n };\n \n history.replaceState = function(...args) {\n originalReplaceState.apply(this, args);\n setTimeout(trackNavigation, 0);\n };\n }\n\n private setupClickTracking() {\n document.addEventListener('click', (event) => {\n const target = event.target as Element;\n if (!target) return;\n \n const selector = this.getElementSelector(target);\n const text = target.textContent?.trim().substring(0, 50) || '';\n \n this.addBreadcrumb({\n type: 'click',\n message: `Clicked ${selector}${text ? `: ${text}` : ''}`,\n data: {\n selector,\n text,\n tagName: target.tagName,\n id: target.id,\n className: target.className\n }\n });\n });\n }\n\n private getElementSelector(element: Element): string {\n if (element.id) return `#${element.id}`;\n if (element.className) {\n const classes = element.className.split(' ').filter(c => c).slice(0, 2);\n if (classes.length) return `.${classes.join('.')}`;\n }\n return element.tagName.toLowerCase();\n }\n\n private async sendError(errorData: ErrorData) {\n try {\n let headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n // Use authManager if available, otherwise fall back to apiKey\n if (this.authManager) {\n const authHeaders = await this.authManager.getAuthHeaders();\n headers = { ...headers, ...authHeaders };\n } else if (this.config.apiKey) {\n headers['Authorization'] = `Bearer ${this.config.apiKey}`;\n }\n\n const response = await fetch(`${this.config.endpoint}/api/v1/errors`, {\n method: 'POST',\n headers,\n body: JSON.stringify(errorData)\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send error: ${response.status} ${response.statusText}`);\n }\n\n console.log('[AInamika Error Tracker] Error sent successfully');\n } catch (error) {\n console.error('[AInamika Error Tracker] Failed to send error:', error);\n // Store error locally for retry\n this.storeErrorLocally(errorData);\n }\n }\n\n private storeErrorLocally(errorData: ErrorData) {\n try {\n const stored = localStorage.getItem('ainamika_errors') || '[]';\n const errors = JSON.parse(stored);\n errors.push(errorData);\n \n // Keep only last 50 errors\n if (errors.length > 50) {\n errors.splice(0, errors.length - 50);\n }\n \n localStorage.setItem('ainamika_errors', JSON.stringify(errors));\n } catch (error) {\n console.error('[AInamika Error Tracker] Failed to store error locally:', error);\n }\n }\n\n // Public methods\n public captureException(error: Error, context?: Record<string, any>) {\n this.handleError({\n type: 'custom',\n message: error.message,\n error,\n context\n });\n }\n\n public setUser(userId: string) {\n this.userId = userId;\n }\n\n public addTag(key: string, value: string) {\n // Add custom tags to error metadata\n if (!this.config.clientId) {\n this.config.clientId += `_${key}:${value}`;\n }\n }\n\n public async flushStoredErrors() {\n try {\n const stored = localStorage.getItem('ainamika_errors');\n if (!stored) return;\n \n const errors = JSON.parse(stored);\n if (errors.length === 0) return;\n \n console.log(`[AInamika Error Tracker] Flushing ${errors.length} stored errors`);\n \n for (const error of errors) {\n await this.sendError(error);\n }\n \n localStorage.removeItem('ainamika_errors');\n } catch (error) {\n console.error('[AInamika Error Tracker] Failed to flush stored errors:', error);\n }\n }\n}\n","// config.ts - Environment-based configuration for Ainamika SDK\n\nexport interface EnvironmentConfig {\n API_BASE_URL: string;\n APP_ENV: 'development' | 'production';\n DEBUG: boolean;\n}\n\n// Environment configuration with fallbacks\ndeclare global {\n interface Window {\n __AINAMIKA_CONFIG__?: EnvironmentConfig;\n }\n}\n\n// Production API URL - using proxy that routes to Kubernetes backend\nconst PRODUCTION_API_URL = 'https://ainamika-webhook-proxy-366651516847.asia-south1.run.app';\n\n// Get environment configuration\nfunction getEnvironmentConfig(): EnvironmentConfig {\n // Check for explicitly set configuration (allows override via apiDetails)\n if (typeof window !== 'undefined' && window.__AINAMIKA_CONFIG__) {\n return window.__AINAMIKA_CONFIG__;\n }\n\n // Always use production URLs for npm package\n // Users can override via apiDetails config option if needed\n return {\n API_BASE_URL: PRODUCTION_API_URL,\n APP_ENV: 'production',\n DEBUG: false\n };\n}\n\nexport const ENV_CONFIG = getEnvironmentConfig();\n\n// API endpoint configuration\nexport const API_ENDPOINTS = {\n EVENTS: `${ENV_CONFIG.API_BASE_URL}/api/v1/events`,\n ERRORS: `${ENV_CONFIG.API_BASE_URL}/api/errors/report`,\n CONFIG: `${ENV_CONFIG.API_BASE_URL}/api/v1/sdk/config`,\n DEBUG_EVENTS: `${ENV_CONFIG.API_BASE_URL}/api/v1/debug/events`,\n // Project-based endpoints\n PROJECTS_LOOKUP: `${ENV_CONFIG.API_BASE_URL}/api/v1/projects/lookup`,\n SAMPLING_CHECK: `${ENV_CONFIG.API_BASE_URL}/api/v1/projects/sampling/check`\n};\n\n// Configuration helper function\nexport function configureSDK(config: Partial<EnvironmentConfig>) {\n if (typeof window !== 'undefined') {\n window.__AINAMIKA_CONFIG__ = { ...ENV_CONFIG, ...config };\n }\n}\n\n","// error-storage.ts - Offline Storage and Queue Management for Error Tracking\nimport { API_ENDPOINTS } from './config';\n\nexport interface StoredError {\n id: string;\n errorData: any;\n timestamp: number;\n retryCount: number;\n lastRetry?: number;\n}\n\nexport interface StorageConfig {\n maxStorageSize: number;\n maxRetries: number;\n retryInterval: number;\n compressionEnabled: boolean;\n encryptionEnabled: boolean;\n}\n\nexport class ErrorStorage {\n private config: StorageConfig;\n private readonly STORAGE_KEY = 'ainamika_error_queue';\n private readonly METADATA_KEY = 'ainamika_error_metadata';\n private retryTimer?: number;\n private isProcessing = false;\n\n constructor(config: Partial<StorageConfig> = {}) {\n this.config = {\n maxStorageSize: 5 * 1024 * 1024, // 5MB\n maxRetries: 5,\n retryInterval: 30000, // 30 seconds\n compressionEnabled: true,\n encryptionEnabled: false,\n ...config\n };\n\n this.initialize();\n }\n\n private initialize() {\n this.cleanupOldErrors();\n this.startRetryTimer();\n this.setupStorageListener();\n \n // Process any existing errors on initialization\n setTimeout(() => this.processQueue(), 1000);\n }\n\n /**\n * Store error data with automatic compression and queue management\n */\n public async storeError(errorData: any): Promise<string> {\n try {\n const errorId = this.generateErrorId();\n const storedError: StoredError = {\n id: errorId,\n errorData: this.config.compressionEnabled ? this.compressData(errorData) : errorData,\n timestamp: Date.now(),\n retryCount: 0\n };\n\n await this.addToQueue(storedError);\n this.updateMetadata();\n \n // Trigger immediate processing\n setTimeout(() => this.processQueue(), 100);\n \n return errorId;\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to store error:', error);\n throw error;\n }\n }\n\n /**\n * Get all stored errors\n */\n public getStoredErrors(): StoredError[] {\n try {\n const stored = localStorage.getItem(this.STORAGE_KEY);\n if (!stored) return [];\n \n const errors = JSON.parse(stored) as StoredError[];\n return errors.map(error => ({\n ...error,\n errorData: this.config.compressionEnabled ? this.decompressData(error.errorData) : error.errorData\n }));\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to get stored errors:', error);\n return [];\n }\n }\n\n /**\n * Remove error from storage\n */\n public removeError(errorId: string): boolean {\n try {\n const errors = this.getQueueRaw();\n const filteredErrors = errors.filter(error => error.id !== errorId);\n \n if (filteredErrors.length !== errors.length) {\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(filteredErrors));\n this.updateMetadata();\n return true;\n }\n return false;\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to remove error:', error);\n return false;\n }\n }\n\n /**\n * Clear all stored errors\n */\n public clearAll(): void {\n try {\n localStorage.removeItem(this.STORAGE_KEY);\n localStorage.removeItem(this.METADATA_KEY);\n console.log('[AInamika Error Storage] All errors cleared');\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to clear errors:', error);\n }\n }\n\n /**\n * Get storage statistics\n */\n public getStorageStats(): {\n errorCount: number;\n totalSize: number;\n oldestError?: number;\n newestError?: number;\n } {\n try {\n const errors = this.getQueueRaw();\n const totalSize = new Blob([localStorage.getItem(this.STORAGE_KEY) || '']).size;\n \n const timestamps = errors.map(e => e.timestamp).sort();\n \n return {\n errorCount: errors.length,\n totalSize,\n oldestError: timestamps[0],\n newestError: timestamps[timestamps.length - 1]\n };\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to get storage stats:', error);\n return { errorCount: 0, totalSize: 0 };\n }\n }\n\n /**\n * Process the error queue - attempt to send stored errors\n */\n public async processQueue(): Promise<void> {\n if (this.isProcessing) return;\n \n this.isProcessing = true;\n \n try {\n const errors = this.getQueueRaw();\n if (errors.length === 0) return;\n \n console.log(`[AInamika Error Storage] Processing ${errors.length} queued errors`);\n \n for (const storedError of errors) {\n if (storedError.retryCount >= this.config.maxRetries) {\n console.warn(`[AInamika Error Storage] Max retries reached for error ${storedError.id}`);\n this.removeError(storedError.id);\n continue;\n }\n\n // Check retry interval\n if (storedError.lastRetry && \n Date.now() - storedError.lastRetry < this.config.retryInterval) {\n continue;\n }\n\n try {\n const success = await this.sendError(storedError);\n if (success) {\n this.removeError(storedError.id);\n console.log(`[AInamika Error Storage] Successfully sent error ${storedError.id}`);\n } else {\n this.incrementRetryCount(storedError.id);\n }\n } catch (error) {\n console.error(`[AInamika Error Storage] Failed to send error ${storedError.id}:`, error);\n this.incrementRetryCount(storedError.id);\n }\n }\n } finally {\n this.isProcessing = false;\n }\n }\n\n /**\n * Force retry of a specific error\n */\n public async retryError(errorId: string): Promise<boolean> {\n const errors = this.getQueueRaw();\n const error = errors.find(e => e.id === errorId);\n \n if (!error) return false;\n \n try {\n const success = await this.sendError(error);\n if (success) {\n this.removeError(errorId);\n return true;\n } else {\n this.incrementRetryCount(errorId);\n return false;\n }\n } catch (err) {\n console.error(`[AInamika Error Storage] Failed to retry error ${errorId}:`, err);\n this.incrementRetryCount(errorId);\n return false;\n }\n }\n\n private async addToQueue(storedError: StoredError): Promise<void> {\n const errors = this.getQueueRaw();\n errors.push(storedError);\n \n // Check storage size limit\n const serialized = JSON.stringify(errors);\n if (new Blob([serialized]).size > this.config.maxStorageSize) {\n // Remove oldest errors until under limit\n while (errors.length > 0 && new Blob([JSON.stringify(errors)]).size > this.config.maxStorageSize) {\n errors.shift();\n console.warn('[AInamika Error Storage] Removed old error due to size limit');\n }\n }\n \n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(errors));\n }\n\n private getQueueRaw(): StoredError[] {\n try {\n const stored = localStorage.getItem(this.STORAGE_KEY);\n return stored ? JSON.parse(stored) : [];\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to parse stored errors:', error);\n return [];\n }\n }\n\n private incrementRetryCount(errorId: string): void {\n try {\n const errors = this.getQueueRaw();\n const errorIndex = errors.findIndex(e => e.id === errorId);\n \n if (errorIndex !== -1) {\n errors[errorIndex].retryCount++;\n errors[errorIndex].lastRetry = Date.now();\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(errors));\n }\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to increment retry count:', error);\n }\n }\n\n private async sendError(storedError: StoredError): Promise<boolean> {\n try {\n const errorData = this.config.compressionEnabled ? \n this.decompressData(storedError.errorData) : \n storedError.errorData;\n\n // This should match the ErrorTracker's endpoint configuration\n const endpoint = errorData.endpoint || API_ENDPOINTS.ERRORS;\n const apiKey = errorData.apiKey || '';\n \n const response = await fetch(`${endpoint}/api/v1/errors`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Authorization': apiKey ? `Bearer ${apiKey}` : ''\n },\n body: JSON.stringify(errorData)\n });\n\n return response.ok;\n } catch (error) {\n console.error('[AInamika Error Storage] Network error sending stored error:', error);\n return false;\n }\n }\n\n private compressData(data: any): string {\n try {\n // Simple compression using JSON + base64\n const jsonString = JSON.stringify(data);\n return btoa(jsonString);\n } catch (error) {\n console.warn('[AInamika Error Storage] Compression failed, storing uncompressed:', error);\n return data;\n }\n }\n\n private decompressData(compressedData: any): any {\n try {\n if (typeof compressedData === 'string' && compressedData.length > 0) {\n const jsonString = atob(compressedData);\n return JSON.parse(jsonString);\n }\n return compressedData;\n } catch (error) {\n console.warn('[AInamika Error Storage] Decompression failed, returning raw data:', error);\n return compressedData;\n }\n }\n\n private generateErrorId(): string {\n return `error_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n }\n\n private cleanupOldErrors(): void {\n try {\n const errors = this.getQueueRaw();\n const cutoffTime = Date.now() - (7 * 24 * 60 * 60 * 1000); // 7 days\n \n const cleanErrors = errors.filter(error => error.timestamp > cutoffTime);\n \n if (cleanErrors.length !== errors.length) {\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(cleanErrors));\n console.log(`[AInamika Error Storage] Cleaned up ${errors.length - cleanErrors.length} old errors`);\n }\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to cleanup old errors:', error);\n }\n }\n\n private startRetryTimer(): void {\n this.retryTimer = window.setInterval(() => {\n this.processQueue();\n }, this.config.retryInterval);\n }\n\n private setupStorageListener(): void {\n // Listen for storage changes from other tabs\n window.addEventListener('storage', (event) => {\n if (event.key === this.STORAGE_KEY) {\n console.log('[AInamika Error Storage] Storage updated from another tab');\n setTimeout(() => this.processQueue(), 1000);\n }\n });\n\n // Listen for online/offline events\n window.addEventListener('online', () => {\n console.log('[AInamika Error Storage] Network back online, processing queue');\n setTimeout(() => this.processQueue(), 1000);\n });\n\n window.addEventListener('offline', () => {\n console.log('[AInamika Error Storage] Network offline, errors will be queued');\n });\n }\n\n private updateMetadata(): void {\n try {\n const stats = this.getStorageStats();\n const metadata = {\n lastUpdate: Date.now(),\n ...stats\n };\n localStorage.setItem(this.METADATA_KEY, JSON.stringify(metadata));\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to update metadata:', error);\n }\n }\n\n /**\n * Export stored errors for debugging\n */\n public exportErrors(): string {\n try {\n const errors = this.getStoredErrors();\n const exportData = {\n timestamp: Date.now(),\n version: '1.0',\n stats: this.getStorageStats(),\n errors: errors\n };\n return JSON.stringify(exportData, null, 2);\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to export errors:', error);\n return '{}';\n }\n }\n\n /**\n * Import errors from export\n */\n public importErrors(exportData: string): boolean {\n try {\n const data = JSON.parse(exportData);\n if (!data.errors || !Array.isArray(data.errors)) {\n throw new Error('Invalid export format');\n }\n\n this.clearAll();\n \n for (const errorData of data.errors) {\n this.storeError(errorData.errorData);\n }\n \n console.log(`[AInamika Error Storage] Imported ${data.errors.length} errors`);\n return true;\n } catch (error) {\n console.error('[AInamika Error Storage] Failed to import errors:', error);\n return false;\n }\n }\n\n /**\n * Cleanup and destroy the storage instance\n */\n public destroy(): void {\n if (this.retryTimer) {\n clearInterval(this.retryTimer);\n this.retryTimer = undefined;\n }\n \n // Final attempt to process queue\n this.processQueue();\n \n console.log('[AInamika Error Storage] Storage instance destroyed');\n }\n}\n\n/**\n * Utility functions for error storage management\n */\nexport class ErrorStorageUtils {\n /**\n * Get total localStorage usage for AInamika\n */\n static getAinamikaStorageUsage(): { \n totalSize: number; \n errorSize: number; \n otherSize: number; \n } {\n let totalSize = 0;\n let errorSize = 0;\n let otherSize = 0;\n\n for (let key in localStorage) {\n if (localStorage.hasOwnProperty(key)) {\n const size = new Blob([localStorage.getItem(key) || '']).size;\n totalSize += size;\n \n if (key.startsWith('ainamika_error')) {\n errorSize += size;\n } else if (key.startsWith('ainamika_')) {\n otherSize += size;\n }\n }\n }\n\n return { totalSize, errorSize, otherSize };\n }\n\n /**\n * Check if localStorage has enough space\n */\n static checkStorageSpace(requiredBytes: number): boolean {\n try {\n const testKey = 'ainamika_storage_test';\n const testData = 'x'.repeat(Math.min(requiredBytes, 1024 * 1024));\n \n localStorage.setItem(testKey, testData);\n localStorage.removeItem(testKey);\n \n return true;\n } catch (error) {\n return false;\n }\n }\n\n /**\n * Clean up all AInamika storage\n */\n static cleanupAllAinamikaStorage(): void {\n const keysToRemove: string[] = [];\n \n for (let key in localStorage) {\n if (key.startsWith('ainamika_')) {\n keysToRemove.push(key);\n }\n }\n \n keysToRemove.forEach(key => localStorage.removeItem(key));\n console.log(`[AInamika Storage Utils] Cleaned up ${keysToRemove.length} storage keys`);\n }\n\n /**\n * Generate storage report\n */\n static generateStorageReport(): {\n usage: ReturnType<typeof ErrorStorageUtils.getAinamikaStorageUsage>;\n errors: any[];\n metadata: any;\n } {\n const storage = new ErrorStorage();\n \n return {\n usage: ErrorStorageUtils.getAinamikaStorageUsage(),\n errors: storage.getStoredErrors(),\n metadata: storage.getStorageStats()\n };\n }\n}\n","/**\n * User Manager Module\n * Handles user identification for hybrid tracking (anonymous + authenticated)\n */\n\nexport class UserManager {\n private userId: string | null = null;\n private userProperties: Record<string, any> = {};\n\n constructor() {\n this.initializeUser();\n }\n\n /**\n * Initialize user on module load\n */\n private initializeUser(): void {\n this.userId = this.getOrCreateUserId();\n }\n\n /**\n * Generate or retrieve persistent anonymous user ID\n */\n private getOrCreateUserId(): string {\n try {\n let userId = localStorage.getItem('ainamika_user_id');\n\n if (!userId) {\n userId = this.generateAnonymousId();\n localStorage.setItem('ainamika_user_id', userId);\n }\n\n return userId;\n } catch (error) {\n // Fallback for environments without localStorage\n console.warn('[UserManager] localStorage not available, using session ID');\n return this.generateAnonymousId();\n }\n }\n\n /**\n * Generate a new anonymous user ID\n */\n private generateAnonymousId(): string {\n return 'anon_' + Math.random().toString(36).substr(2, 9) + '_' + Date.now();\n }\n\n /**\n * Get current user ID\n */\n public getUserId(): string {\n if (!this.userId) {\n this.userId = this.getOrCreateUserId();\n }\n return this.userId;\n }\n\n /**\n * Get user properties\n */\n public getUserProperties(): Record<string, any> {\n return { ...this.userProperties };\n }\n\n /**\n * Identify user with authenticated ID\n * Merges anonymous session with authenticated user\n */\n public identifyUser(authenticatedUserId: string, properties?: Record<string, any>): void {\n const previousId = this.getUserId();\n\n try {\n // Update stored user ID\n localStorage.setItem('ainamika_user_id', authenticatedUserId);\n this.userId = authenticatedUserId;\n\n // Merge properties\n if (properties) {\n this.userProperties = {\n ...this.userProperties,\n ...properties\n };\n }\n\n console.log(`[UserManager] User identified: ${previousId} → ${authenticatedUserId}`);\n } catch (error) {\n console.error('[UserManager] Error identifying user:', error);\n }\n }\n\n /**\n * Update user properties\n */\n public updateUserProperties(properties: Record<string, any>): void {\n this.userProperties = {\n ...this.userProperties,\n ...properties\n };\n }\n\n /**\n * Clear user data (logout)\n */\n public clearUser(): void {\n try {\n localStorage.removeItem('ainamika_user_id');\n this.userId = null;\n this.userProperties = {};\n\n // Generate new anonymous ID for next session\n this.initializeUser();\n } catch (error) {\n console.error('[UserManager] Error clearing user:', error);\n }\n }\n\n /**\n * Get user identification event data\n * Used when upgrading from anonymous to authenticated\n */\n public getUserIdentificationEvent(authenticatedUserId: string): Record<string, any> {\n return {\n event: 'user_identified',\n previous_id: this.getUserId(),\n user_id: authenticatedUserId,\n timestamp: Date.now(),\n properties: this.userProperties\n };\n }\n\n /**\n * Check if current user is anonymous\n */\n public isAnonymousUser(): boolean {\n const userId = this.getUserId();\n return userId.startsWith('anon_');\n }\n\n /**\n * Get user type (anonymous or authenticated)\n */\n public getUserType(): 'anonymous' | 'authenticated' {\n return this.isAnonymousUser() ? 'anonymous' : 'authenticated';\n }\n}","/**\n * Journey Tracker Module\n * Tracks user journeys for funnel analysis\n */\n\ninterface JourneyEvent {\n eventName: string;\n timestamp: number;\n properties: Record<string, any>;\n sequenceIndex: number;\n}\n\ninterface JourneyContext {\n journeySequence: string[];\n eventCount: number;\n lastEventTime: number;\n journeyStartTime: number;\n timeSinceLastEvent: number;\n}\n\nexport class JourneyTracker {\n private userJourney: JourneyEvent[] = [];\n private journeyStartTime: number;\n private lastEventTime: number = 0;\n private sequenceIndex: number = 0;\n private maxJourneyLength: number = 50; // Limit journey size for performance\n private journeyAnalysisThreshold: number = 5; // Send for analysis after 5 events\n\n constructor() {\n this.journeyStartTime = Date.now();\n }\n\n /**\n * Add event to user journey\n */\n public trackEvent(eventName: string, properties: Record<string, any>): void {\n const currentTime = Date.now();\n const timeSinceLastEvent = this.lastEventTime ? currentTime - this.lastEventTime : 0;\n\n const journeyEvent: JourneyEvent = {\n eventName,\n timestamp: currentTime,\n properties: {\n ...properties,\n timeSinceLastEvent,\n journeyPosition: this.sequenceIndex\n },\n sequenceIndex: this.sequenceIndex++\n };\n\n this.userJourney.push(journeyEvent);\n this.lastEventTime = currentTime;\n\n // Maintain journey size limit\n if (this.userJourney.length > this.maxJourneyLength) {\n this.userJourney = this.userJourney.slice(-this.maxJourneyLength);\n }\n\n // Log journey progress\n console.log(`[JourneyTracker] Event tracked: ${eventName} (position: ${journeyEvent.sequenceIndex})`);\n }\n\n /**\n * Get current journey context\n */\n public getContext(): JourneyContext {\n const currentTime = Date.now();\n\n return {\n journeySequence: this.getJourneySequence(),\n eventCount: this.userJourney.length,\n lastEventTime: this.lastEventTime,\n journeyStartTime: this.journeyStartTime,\n timeSinceLastEvent: this.lastEventTime ? currentTime - this.lastEventTime : 0\n };\n }\n\n /**\n * Get journey as sequence of event names\n */\n public getJourneySequence(): string[] {\n return this.userJourney.map(event => event.eventName);\n }\n\n /**\n * Get full journey data\n */\n public getJourneyData(): JourneyEvent[] {\n return [...this.userJourney];\n }\n\n /**\n * Check if journey should be sent for analysis\n */\n public shouldAnalyzeJourney(): boolean {\n return this.userJourney.length >= this.journeyAnalysisThreshold &&\n this.userJourney.length % this.journeyAnalysisThreshold === 0;\n }\n\n /**\n * Get journey data for analysis\n */\n public getJourneyForAnalysis(): Record<string, any> {\n const journeyDuration = Date.now() - this.journeyStartTime;\n const avgTimeBetweenEvents = this.calculateAverageTimeBetweenEvents();\n\n return {\n journey: this.userJourney.map(event => ({\n name: event.eventName,\n timestamp: event.timestamp,\n properties: event.properties\n })),\n metadata: {\n journeyLength: this.userJourney.length,\n journeyDuration,\n avgTimeBetweenEvents,\n startTime: this.journeyStartTime,\n endTime: this.lastEventTime\n }\n };\n }\n\n /**\n * Calculate average time between events\n */\n private calculateAverageTimeBetweenEvents(): number {\n if (this.userJourney.length < 2) return 0;\n\n let totalTime = 0;\n for (let i = 1; i < this.userJourney.length; i++) {\n totalTime += this.userJourney[i].timestamp - this.userJourney[i - 1].timestamp;\n }\n\n return Math.round(totalTime / (this.userJourney.length - 1));\n }\n\n /**\n * Find patterns in journey (e.g., repeated sequences)\n */\n public findPatterns(): Record<string, number> {\n const patterns: Record<string, number> = {};\n const sequenceLength = 3; // Look for patterns of 3 events\n\n if (this.userJourney.length < sequenceLength) return patterns;\n\n for (let i = 0; i <= this.userJourney.length - sequenceLength; i++) {\n const sequence = this.userJourney\n .slice(i, i + sequenceLength)\n .map(e => e.eventName)\n .join(' → ');\n\n patterns[sequence] = (patterns[sequence] || 0) + 1;\n }\n\n // Filter out single occurrences\n return Object.fromEntries(\n Object.entries(patterns).filter(([_, count]) => count > 1)\n );\n }\n\n /**\n * Clear journey (for new session)\n */\n public clearJourney(): void {\n this.userJourney = [];\n this.sequenceIndex = 0;\n this.lastEventTime = 0;\n this.journeyStartTime = Date.now();\n }\n\n /**\n * Get journey segment (last N events)\n */\n public getJourneySegment(count: number): JourneyEvent[] {\n return this.userJourney.slice(-count);\n }\n\n /**\n * Check if user is in a potential funnel\n * Based on common funnel patterns\n */\n public detectPotentialFunnel(): string | null {\n const recentEvents = this.getJourneySequence().slice(-5);\n\n // Common funnel patterns\n const funnelPatterns: Record<string, string[]> = {\n 'signup_flow': ['view_pricing', 'click_signup', 'enter_email'],\n 'purchase_flow': ['view_product', 'add_to_cart', 'view_cart'],\n 'onboarding_flow': ['user_signup', 'profile_setup', 'tutorial_start']\n };\n\n for (const [funnelName, pattern] of Object.entries(funnelPatterns)) {\n const matchCount = pattern.filter(event =>\n recentEvents.includes(event)\n ).length;\n\n if (matchCount >= 2) {\n return funnelName;\n }\n }\n\n return null;\n }\n}","/**\n * Authentication Manager for Ainamika SDK\n *\n * Handles token generation, storage, and refresh for API authentication\n */\n\nexport interface AuthTokens {\n access_token: string;\n refresh_token?: string;\n expires_in: number;\n token_type: string;\n}\n\nexport class AuthManager {\n private accessToken: string | null = null;\n private refreshToken: string | null = null;\n private tokenExpiry: number | null = null;\n private clientId: string;\n private apiEndpoint: string;\n private refreshTimer?: NodeJS.Timeout;\n private debug: boolean;\n\n constructor(clientId: string, apiEndpoint: string, debug: boolean = false) {\n this.clientId = clientId;\n this.apiEndpoint = apiEndpoint;\n this.debug = debug;\n\n // Load tokens from storage\n this.loadTokens();\n }\n\n /**\n * Initialize authentication by requesting tokens\n */\n async initialize(): Promise<boolean> {\n try {\n // Check if we have valid tokens\n if (this.isTokenValid()) {\n this.debugLog('Using existing valid token');\n return true;\n }\n\n // Try to refresh if we have a refresh token\n if (this.refreshToken) {\n const refreshed = await this.refreshAccessToken();\n if (refreshed) {\n return true;\n }\n }\n\n // Request new tokens\n const tokens = await this.requestTokens();\n if (tokens) {\n this.setTokens(tokens);\n return true;\n }\n\n return false;\n } catch (error) {\n this.debugLog('Authentication initialization failed:', error);\n return false;\n }\n }\n\n /**\n * Request new tokens from the server\n */\n private async requestTokens(): Promise<AuthTokens | null> {\n try {\n const response = await fetch(`${this.apiEndpoint}/api/v1/auth/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ client_id: this.clientId }),\n });\n\n if (!response.ok) {\n throw new Error(`Token request failed: ${response.status}`);\n }\n\n const tokens: AuthTokens = await response.json();\n return tokens;\n } catch (error) {\n this.debugLog('Token request error:', error);\n return null;\n }\n }\n\n /**\n * Refresh the access token using refresh token\n */\n async refreshAccessToken(): Promise<boolean> {\n if (!this.refreshToken) {\n return false;\n }\n\n try {\n const response = await fetch(`${this.apiEndpoint}/api/v1/auth/refresh`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ refresh_token: this.refreshToken }),\n });\n\n if (!response.ok) {\n // Refresh token is invalid, clear tokens\n this.clearTokens();\n return false;\n }\n\n const tokens: AuthTokens = await response.json();\n this.setTokens(tokens);\n return true;\n } catch (error) {\n this.debugLog('Token refresh error:', error);\n return false;\n }\n }\n\n /**\n * Get the current access token, refreshing if needed\n */\n async getAccessToken(): Promise<string | null> {\n // If token is expiring soon (within 5 minutes), refresh it\n if (this.shouldRefreshToken()) {\n await this.refreshAccessToken();\n }\n\n // If still no valid token, try to initialize\n if (!this.isTokenValid()) {\n const initialized = await this.initialize();\n if (!initialized) {\n return null;\n }\n }\n\n return this.accessToken;\n }\n\n /**\n * Get authorization headers for API requests\n */\n async getAuthHeaders(): Promise<Record<string, string>> {\n const token = await this.getAccessToken();\n\n if (token) {\n return {\n 'Authorization': `Bearer ${token}`,\n };\n }\n\n // Fallback to X-Client-ID for backward compatibility\n return {\n 'X-Client-ID': this.clientId,\n };\n }\n\n /**\n * Check if the current token is valid\n */\n private isTokenValid(): boolean {\n if (!this.accessToken || !this.tokenExpiry) {\n return false;\n }\n\n // Check if token has expired\n return Date.now() < this.tokenExpiry;\n }\n\n /**\n * Check if token should be refreshed (5 minutes before expiry)\n */\n private shouldRefreshToken(): boolean {\n if (!this.tokenExpiry || !this.refreshToken) {\n return false;\n }\n\n const fiveMinutes = 5 * 60 * 1000;\n return Date.now() > (this.tokenExpiry - fiveMinutes);\n }\n\n /**\n * Set tokens and schedule refresh\n */\n private setTokens(tokens: AuthTokens): void {\n this.accessToken = tokens.access_token;\n this.refreshToken = tokens.refresh_token || this.refreshToken;\n this.tokenExpiry = Date.now() + (tokens.expires_in * 1000);\n\n // Save to storage\n this.saveTokens();\n\n // Schedule token refresh\n this.scheduleTokenRefresh();\n\n this.debugLog('Tokens set successfully');\n }\n\n /**\n * Schedule automatic token refresh\n */\n private scheduleTokenRefresh(): void {\n // Clear existing timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n }\n\n // Schedule refresh 5 minutes before expiry\n const refreshIn = Math.max(0, this.tokenExpiry! - Date.now() - (5 * 60 * 1000));\n\n this.refreshTimer = setTimeout(() => {\n this.refreshAccessToken();\n }, refreshIn);\n }\n\n /**\n * Save tokens to localStorage\n */\n private saveTokens(): void {\n if (typeof window !== 'undefined' && window.localStorage) {\n const tokenData = {\n accessToken: this.accessToken,\n refreshToken: this.refreshToken,\n tokenExpiry: this.tokenExpiry,\n };\n\n localStorage.setItem(`ainamika_auth_${this.clientId}`, JSON.stringify(tokenData));\n }\n }\n\n /**\n * Load tokens from localStorage\n */\n private loadTokens(): void {\n if (typeof window !== 'undefined' && window.localStorage) {\n const stored = localStorage.getItem(`ainamika_auth_${this.clientId}`);\n\n if (stored) {\n try {\n const tokenData = JSON.parse(stored);\n this.accessToken = tokenData.accessToken;\n this.refreshToken = tokenData.refreshToken;\n this.tokenExpiry = tokenData.tokenExpiry;\n\n // Schedule refresh if token is valid\n if (this.isTokenValid()) {\n this.scheduleTokenRefresh();\n }\n } catch (error) {\n this.debugLog('Failed to load stored tokens:', error);\n }\n }\n }\n }\n\n /**\n * Clear tokens\n */\n clearTokens(): void {\n this.accessToken = null;\n this.refreshToken = null;\n this.tokenExpiry = null;\n\n // Clear from storage\n if (typeof window !== 'undefined' && window.localStorage) {\n localStorage.removeItem(`ainamika_auth_${this.clientId}`);\n }\n\n // Clear refresh timer\n if (this.refreshTimer) {\n clearTimeout(this.refreshTimer);\n this.refreshTimer = undefined;\n }\n }\n\n /**\n * Logout and clear authentication\n */\n async logout(): Promise<void> {\n try {\n if (this.accessToken) {\n await fetch(`${this.apiEndpoint}/api/v1/auth/logout`, {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${this.accessToken}`,\n },\n });\n }\n } catch (error) {\n this.debugLog('Logout error:', error);\n } finally {\n this.clearTokens();\n }\n }\n\n /**\n * Debug logging\n */\n private debugLog(...args: any[]): void {\n if (this.debug) {\n console.log('[Ainamika Auth]', ...args);\n }\n }\n}","// src/index.ts - Main SDK entry point\nimport { ErrorTracker, ErrorConfig } from './error-tracker';\nimport { ErrorStorage } from './error-storage';\nimport { ENV_CONFIG, API_ENDPOINTS } from './config';\nimport { UserManager } from './user-manager';\nimport { JourneyTracker } from './journey-tracker';\nimport { AuthManager } from './auth-manager';\n\ninterface AnalyticsConfig {\n // NEW: Project-based authentication (preferred)\n projectKey?: string; // Public project key (e.g., 'proj_a1b2c3d4e5f6')\n\n // LEGACY: Client-based authentication (for backward compatibility)\n apiKey?: string;\n clientId?: string;\n\n endpoint?: string;\n autoConfig?: boolean;\n batchInterval?: number;\n useWebWorker?: boolean;\n workerPath?: string;\n debug?: boolean;\n apiDetails?: {\n apiEndPoint: string;\n headers?: Record<string, string>;\n };\n workerConfig?: {\n batchSize?: number;\n batchInterval?: number;\n };\n errorTracking?: {\n enabled?: boolean;\n captureScreenshots?: boolean;\n captureDomSnapshots?: boolean;\n maxStackTraceDepth?: number;\n maxErrorsPerSession?: number;\n debounceMs?: number;\n enableNetworkTracking?: boolean;\n enableConsoleCapture?: boolean;\n };\n}\n\n// Sampling decision from server\ninterface SamplingDecision {\n should_sample: {\n events: boolean;\n errors: boolean;\n session_replay: boolean;\n };\n rates: {\n events: number;\n errors: number;\n session_replay: number;\n };\n decision: 'new' | 'existing';\n}\n\n// Project settings from server\ninterface ProjectSettings {\n project_id: number;\n name: string;\n settings: Record<string, any>;\n features: Record<string, boolean>;\n sampling: {\n events: number;\n errors: number;\n session_replay: number;\n };\n}\n\ninterface EventData {\n event: string;\n properties?: Record<string, any>;\n timestamp?: number;\n userId?: string;\n sessionId?: string;\n}\n\ninterface AutoConfigResult {\n autoTrack: {\n clicks: string[];\n pageViews: boolean;\n formSubmissions: string[];\n customEvents: Record<string, any>;\n };\n metadata: {\n appType: string;\n framework: string;\n confidence: number;\n };\n}\n\nclass AInamikaSDKPro {\n private config: AnalyticsConfig;\n private worker: Worker;\n private sessionId: string;\n private autoConfig?: AutoConfigResult;\n private batchTimer?: number;\n private eventQueue: Map<string, any>[] = [];\n private isInitialized = false;\n private batchRetryCount: number = 0;\n private maxBatchRetries: number = 5;\n\n // --- Project-based Configuration ---\n private projectSettings?: ProjectSettings;\n private samplingDecision?: SamplingDecision;\n private userIdentifier: string; // Persistent user identifier for sampling\n\n // --- Error Tracking Components ---\n private errorTracker?: ErrorTracker;\n private errorStorage?: ErrorStorage;\n\n // --- User & Journey Tracking Components ---\n private userManager: UserManager;\n private journeyTracker: JourneyTracker;\n\n // --- Authentication Manager ---\n private authManager: AuthManager;\n\n // --- Dynamic DOM Fingerprinting and Smart Debouncing ---\n private domHashCache: Record<string, any> = {};\n private lastDomHash: string = '';\n private lastConfigHash: string = '';\n private mutationDebounceTimer: number | null = null;\n private mutationDebounceMs: number = 2000; // 2s debounce for dynamic DOM\n\n // Track attached event types per element to prevent duplicate listeners\n private attachedListeners: WeakMap<Element, Set<string>> = new WeakMap();\n\n constructor(config: AnalyticsConfig) {\n // Validate that either projectKey or clientId is provided\n if (!config.projectKey && !config.clientId && !config.apiKey) {\n throw new Error('[AInamika SDK] Either projectKey or clientId is required for initialization');\n }\n\n this.config = {\n endpoint: ENV_CONFIG.API_BASE_URL,\n batchInterval: 5000,\n useWebWorker: true,\n debug: ENV_CONFIG.DEBUG,\n errorTracking: {\n enabled: true,\n captureScreenshots: true,\n captureDomSnapshots: true,\n maxStackTraceDepth: 50,\n maxErrorsPerSession: 100,\n debounceMs: 1000,\n enableNetworkTracking: true,\n enableConsoleCapture: true\n },\n ...config\n };\n\n this.sessionId = this.generateSessionId();\n\n // Initialize or retrieve persistent user identifier for sampling\n this.userIdentifier = this.getOrCreateUserIdentifier();\n\n // Initialize user and journey tracking\n this.userManager = new UserManager();\n this.journeyTracker = new JourneyTracker();\n\n // Initialize authentication manager (use clientId for legacy, or we'll get it from project lookup)\n this.authManager = new AuthManager(\n this.config.clientId || this.config.apiKey || '',\n this.config.endpoint!,\n this.config.debug\n );\n // Inline the worker code as a Blob to avoid cross-origin issues\n const workerCode = `\n self.eventQueue = [];\n self.config = {\n apiUrl: '',\n batchSize: 10,\n batchInterval: 5000,\n headers: { 'Content-Type': 'application/json' }\n };\n let batchTimer = null;\n function flushQueue() {\n self.postMessage({ status: 'debug', message: '[AInamika Worker] flushQueue called', eventQueue: self.eventQueue, config: self.config });\n if (self.eventQueue.length === 0) return;\n const batch = self.eventQueue.splice(0, self.config.batchSize);\n fetch(self.config.apiUrl, {\n method: 'POST',\n headers: self.config.headers,\n body: JSON.stringify({ events: batch })\n }).then(r => {\n if (r.ok) {\n self.postMessage({ status: 'success' });\n } else {\n self.postMessage({ status: 'error', error: r.statusText, failedEvents: batch });\n }\n }).catch(e => {\n self.postMessage({ status: 'error', error: e.message, failedEvents: batch });\n });\n }\n self.onmessage = function(e) {\n self.postMessage({ status: 'debug', message: '[AInamika Worker] onmessage', data: e.data });\n if (e.data.type === 'config') {\n self.config = { ...self.config, ...e.data.payload };\n if (batchTimer) clearInterval(batchTimer);\n batchTimer = setInterval(flushQueue, self.config.batchInterval);\n self.postMessage({ status: 'debug', message: '[AInamika Worker] config set', config: self.config });\n } else if (e.data.type === 'track') {\n self.eventQueue.push(e.data.payload);\n // Only send when timer triggers, not when batch size is reached\n // This ensures true batching behavior\n } else if (e.data.type === 'batch') {\n // Handle batch flush from main thread\n self.postMessage({ status: 'debug', message: '[AInamika Worker] Received batch from main thread', events: e.data.events });\n self.eventQueue.push(...e.data.events);\n flushQueue();\n } else if (e.data.type === 'initConfig') {\n // No-op for now, can be used for advanced config\n }\n };\n `;\n const blob = new Blob([workerCode], { type: 'application/javascript' });\n const workerUrl = URL.createObjectURL(blob);\n this.worker = new Worker(workerUrl);\n this.initialize();\n }\n\n private async initialize() {\n if (this.isInitialized) return;\n this.isInitialized = true;\n\n // If using projectKey, fetch project settings and sampling decision first\n if (this.config.projectKey) {\n try {\n await this.initializeProjectSettings();\n await this.initializeSamplingDecision();\n this.log('Project-based initialization complete', {\n projectKey: this.config.projectKey,\n projectSettings: this.projectSettings,\n samplingDecision: this.samplingDecision\n });\n } catch (error) {\n this.log('Project initialization failed:', error);\n console.warn('[AInamika SDK] Failed to initialize project settings. Some features may be limited.');\n }\n }\n\n // Initialize authentication (only for legacy clientId-based auth)\n if (this.config.clientId || this.config.apiKey) {\n try {\n await this.authManager.initialize();\n this.log('Authentication initialized');\n } catch (error) {\n this.log('Authentication initialization failed:', error);\n // Continue without authentication in development mode\n if (!this.config.debug) {\n console.warn('[Ainamika] Running without authentication. Some features may be limited.');\n }\n }\n }\n\n // Initialize Error Tracking (respecting sampling decision)\n if (this.config.errorTracking?.enabled && this.shouldSampleErrors()) {\n this.initializeErrorTracking();\n } else if (this.config.errorTracking?.enabled && !this.shouldSampleErrors()) {\n this.log('Error tracking disabled due to sampling decision');\n }\n\n if (this.config.autoConfig) {\n await this.setupAutoConfiguration();\n }\n\n // Always enable dynamic DOM tracking for dynamic apps\n this.setupDynamicDomTracking();\n\n if (this.config.useWebWorker && typeof Worker !== 'undefined') {\n await this.setupWebWorker();\n } else {\n // Fallback for environments without web workers\n this.startBatchTimer();\n }\n this.log('AnalyticsPro SDK initialized', {\n config: this.config,\n projectKey: this.config.projectKey,\n sampling: this.samplingDecision\n });\n }\n\n // --- Project Initialization Methods ---\n\n private getOrCreateUserIdentifier(): string {\n const storageKey = 'ainamika_user_identifier';\n let identifier = localStorage.getItem(storageKey);\n\n if (!identifier) {\n // Generate anonymous user identifier\n identifier = 'anon_' + Math.random().toString(36).substr(2, 16) + Date.now().toString(36);\n localStorage.setItem(storageKey, identifier);\n this.log('Created new user identifier:', identifier);\n }\n\n return identifier;\n }\n\n private async initializeProjectSettings(): Promise<void> {\n if (!this.config.projectKey) return;\n\n try {\n const response = await fetch(API_ENDPOINTS.PROJECTS_LOOKUP, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ project_key: this.config.projectKey })\n });\n\n if (!response.ok) {\n throw new Error(`Project lookup failed: ${response.status}`);\n }\n\n this.projectSettings = await response.json();\n this.log('Project settings loaded:', this.projectSettings);\n } catch (error) {\n this.log('Failed to load project settings:', error);\n throw error;\n }\n }\n\n private async initializeSamplingDecision(): Promise<void> {\n if (!this.config.projectKey) return;\n\n try {\n const response = await fetch(API_ENDPOINTS.SAMPLING_CHECK, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n project_key: this.config.projectKey,\n user_identifier: this.userIdentifier\n })\n });\n\n if (!response.ok) {\n throw new Error(`Sampling check failed: ${response.status}`);\n }\n\n this.samplingDecision = await response.json();\n this.log('Sampling decision received:', this.samplingDecision);\n\n // Store sampling decision locally for offline access\n this.cacheSamplingDecision();\n } catch (error) {\n this.log('Failed to get sampling decision, using cached or defaults:', error);\n this.loadCachedSamplingDecision();\n }\n }\n\n private cacheSamplingDecision(): void {\n if (this.samplingDecision) {\n const storageKey = `ainamika_sampling_${this.config.projectKey}`;\n localStorage.setItem(storageKey, JSON.stringify(this.samplingDecision));\n }\n }\n\n private loadCachedSamplingDecision(): void {\n const storageKey = `ainamika_sampling_${this.config.projectKey}`;\n const cached = localStorage.getItem(storageKey);\n\n if (cached) {\n try {\n this.samplingDecision = JSON.parse(cached);\n this.log('Loaded cached sampling decision:', this.samplingDecision);\n } catch {\n // Use default (sample everything)\n this.samplingDecision = {\n should_sample: { events: true, errors: true, session_replay: false },\n rates: { events: 100, errors: 100, session_replay: 0 },\n decision: 'existing'\n };\n }\n } else {\n // Default to sampling everything when no cached decision\n this.samplingDecision = {\n should_sample: { events: true, errors: true, session_replay: false },\n rates: { events: 100, errors: 100, session_replay: 0 },\n decision: 'existing'\n };\n }\n }\n\n // --- Sampling Check Methods ---\n\n private shouldSampleEvents(): boolean {\n // If no sampling decision (legacy mode), sample everything\n if (!this.samplingDecision) return true;\n return this.samplingDecision.should_sample.events;\n }\n\n private shouldSampleErrors(): boolean {\n // If no sampling decision (legacy mode), sample everything\n if (!this.samplingDecision) return true;\n return this.samplingDecision.should_sample.errors;\n }\n\n private shouldSampleSessionReplay(): boolean {\n // If no sampling decision (legacy mode), don't sample replay\n if (!this.samplingDecision) return false;\n return this.samplingDecision.should_sample.session_replay;\n }\n\n // Public method to check sampling status\n public getSamplingStatus(): SamplingDecision | null {\n return this.samplingDecision || null;\n }\n\n // Public method to get project info\n public getProjectInfo(): ProjectSettings | null {\n return this.projectSettings || null;\n }\n\n // --- Error Tracking Initialization ---\n private initializeErrorTracking() {\n try {\n // Initialize error storage\n this.errorStorage = new ErrorStorage({\n maxStorageSize: 5 * 1024 * 1024, // 5MB\n maxRetries: 5,\n retryInterval: 30000, // 30 seconds\n compressionEnabled: true,\n encryptionEnabled: false\n });\n\n // Initialize error tracker\n const errorConfig: ErrorConfig = {\n endpoint: ENV_CONFIG.API_BASE_URL,\n clientId: this.config.clientId || \"\",\n apiKey: this.config.apiKey, // Keep for backward compatibility\n authManager: this.authManager, // Pass authManager for JWT auth\n captureScreenshots: this.config.errorTracking?.captureScreenshots ?? true,\n captureDomSnapshots: this.config.errorTracking?.captureDomSnapshots ?? true,\n maxStackTraceDepth: this.config.errorTracking?.maxStackTraceDepth ?? 50,\n maxErrorsPerSession: this.config.errorTracking?.maxErrorsPerSession ?? 100,\n debounceMs: this.config.errorTracking?.debounceMs ?? 1000,\n enableNetworkTracking: this.config.errorTracking?.enableNetworkTracking ?? true,\n enableConsoleCapture: this.config.errorTracking?.enableConsoleCapture ?? true\n };\n\n this.errorTracker = new ErrorTracker(errorConfig);\n \n // Set user for error tracking if available\n const userId = this.getUserId();\n if (userId && this.errorTracker) {\n this.errorTracker.setUser(userId);\n }\n\n this.log('Error tracking initialized successfully');\n } catch (error) {\n console.error('[AInamika SDK] Failed to initialize error tracking:', error);\n }\n }\n\n // Public method to capture custom exceptions\n public captureException(error: Error, context?: Record<string, any>) {\n if (this.errorTracker) {\n this.errorTracker.captureException(error, context);\n }\n }\n\n // Public method to set user for error tracking (deprecated - use identifyUser instead)\n public setUser(userId: string) {\n console.warn('[AInamika SDK] setUser is deprecated. Please use identifyUser() instead.');\n this.identifyUser(userId);\n }\n\n // Public method to flush stored errors\n public async flushStoredErrors() {\n if (this.errorStorage) {\n await this.errorStorage.processQueue();\n }\n if (this.errorTracker) {\n await this.errorTracker.flushStoredErrors();\n }\n }\n\n private async setupAutoConfiguration() {\n try {\n this.log('Starting auto-configuration...');\n // Compute current DOM structure and hash\n const domStructure = await this.getDOMStructure();\n const domHash = this.computeDomHash(domStructure);\n this.lastDomHash = domHash; // Store the initial DOM hash\n \n // Try to load config from localStorage cache first using DOM hash\n let generatedConfig = this.getCachedConfigForDomHash(domHash);\n \n if (generatedConfig) {\n this.log('Loaded analytics config from localStorage cache for DOM hash:', domHash);\n } else {\n // Try to load config from file as fallback\n generatedConfig = await this.loadConfigFromFile();\n if (generatedConfig) {\n this.log('Loaded analytics config from file');\n }\n }\n \n if (!generatedConfig) {\n // Only call API if not found in cache or file, and include DOM hash\n this.log('No cached config found, fetching from backend for DOM hash:', domHash);\n generatedConfig = await this.fetchGeneratedConfig(domStructure, domHash);\n if (generatedConfig && generatedConfig.events_to_track) {\n this.saveConfigToFile(generatedConfig);\n this.setCachedConfigForDomHash(domHash, generatedConfig);\n this.lastConfigHash = generatedConfig.config_hash || '';\n }\n }\n \n if (generatedConfig && generatedConfig.events_to_track) {\n this.applyGeneratedConfig(generatedConfig);\n // Send config to worker for advanced tracking (scroll, focus, etc.)\n if (this.config.useWebWorker && typeof Worker !== 'undefined') {\n this.worker.postMessage({ type: 'initConfig', config: generatedConfig });\n }\n this.log('Auto-configuration applied successfully', generatedConfig);\n } else {\n this.log('Auto-configuration failed: Invalid config received from backend.', generatedConfig);\n }\n } catch (error) {\n this.log('Auto-configuration failed with error', error);\n }\n }\n\n private async getDOMStructure(): Promise<any> {\n const getSelector = (el: Element): string => {\n if (el.id) return `#${el.id}`;\n if (el.className) {\n const classes = el.className.split(' ').filter(c => c.trim()).join('.');\n return classes ? `.${classes}` : el.tagName.toLowerCase();\n }\n return el.tagName.toLowerCase();\n };\n\n // Wait a bit for any dynamic content to load\n await new Promise(resolve => setTimeout(resolve, 500));\n\n // Comprehensive selector for all interactive and important elements\n const elements = Array.from(document.body.querySelectorAll(`\n button, a, input, select, textarea, form, img, h1, h2, h3, h4, h5, h6,\n [role=button], [role=link], [onclick], [tabindex], [data-analytics], [data-track],\n .card, .btn, .btn-primary, .btn-secondary, .card-title, .card-description, .card-price, .card-actions,\n [id*=\"card\"], [class*=\"card\"], [class*=\"btn\"], [class*=\"price\"], [class*=\"title\"],\n div, span, p\n `));\n\n // Filter and enhance elements with more comprehensive logic\n const filteredElements = elements.filter(el => {\n const style = window.getComputedStyle(el);\n const isVisible = style.display !== 'none' && style.visibility !== 'hidden' && style.opacity !== '0';\n const hasInteraction = el.tagName.toLowerCase() === 'button' || \n el.tagName.toLowerCase() === 'a' || \n el.hasAttribute('onclick') ||\n el.getAttribute('role') === 'button' ||\n el.classList.contains('btn') ||\n el.classList.contains('card');\n const isImportantElement = el.id === 'cardsContainer' || \n el.classList.contains('cards-grid') ||\n el.classList.contains('card') ||\n el.tagName.toLowerCase() === 'img' ||\n ['h1', 'h2', 'h3'].indexOf(el.tagName.toLowerCase()) !== -1;\n \n return (isVisible && (hasInteraction || isImportantElement)) || el.id === 'cardsContainer';\n });\n\n // Deduplicate and add stable metadata (exclude dynamic properties)\n const seen = new Set<string>();\n const structure = filteredElements.map(el => {\n // Only include stable attributes that don't change between page loads\n const stableAttributes: Record<string, string> = {};\n Array.from(el.attributes).forEach(attr => {\n // Exclude dynamic attributes that might change\n if (['style', 'data-timestamp', 'data-rendered'].indexOf(attr.name) === -1) {\n // Truncate attribute values > 25 chars to reduce payload size\n stableAttributes[attr.name] = attr.value.length > 25 ? attr.value.substring(0, 25) : attr.value;\n }\n });\n \n const obj = {\n tagName: el.tagName.toLowerCase(),\n selector: getSelector(el),\n id: el.id || '',\n className: el.className || '',\n textContent: (el.textContent || '').trim().substring(0, 100),\n attributes: stableAttributes,\n // Remove position and computed styles as they can vary\n isInteractive: el.tagName.toLowerCase() === 'button' || \n el.tagName.toLowerCase() === 'a' || \n el.hasAttribute('onclick') ||\n el.getAttribute('role') === 'button' ||\n el.classList.contains('btn'),\n hasChildren: el.children.length > 0,\n childCount: el.children.length,\n // Add stable structural information\n parentTagName: el.parentElement?.tagName.toLowerCase() || '',\n index: Array.from(el.parentElement?.children || []).indexOf(el)\n };\n return obj;\n }).filter(obj => {\n const key = obj.tagName + '|' + obj.selector + '|' + obj.textContent.substring(0, 20);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n\n this.log('DOM structure analyzed', { elementCount: structure.length, elements: structure });\n return { elements: structure };\n }\n\n private async fetchGeneratedConfig(structure: any, domHash?: string): Promise<any> {\n try {\n if(structure && structure.elements && structure.elements.length === 0) {\n this.log('No elements found in DOM structure, skipping config fetch.');\n return null;\n }\n\n // Get authentication headers\n let headers: Record<string, string> = { 'Content-Type': 'application/json' };\n const authHeaders = await this.authManager.getAuthHeaders();\n headers = { ...headers, ...authHeaders };\n\n const requestBody: any = { structure };\n if (domHash) {\n requestBody.domHash = domHash;\n requestBody.lastConfigHash = this.lastConfigHash;\n }\n\n const response = await fetch(API_ENDPOINTS.CONFIG, {\n method: 'POST',\n headers,\n body: JSON.stringify(requestBody),\n });\n\n if (!response.ok) {\n throw new Error(`Backend returned ${response.status}`);\n }\n return await response.json();\n } catch (error) {\n this.log('Error fetching generated config:', error);\n return null;\n }\n }\n\n private applyGeneratedConfig(config: { events_to_track: any[], observe_mutations?: boolean }) {\n config.events_to_track.forEach(eventToTrack => {\n try {\n const elements = document.querySelectorAll(eventToTrack.element_selector);\n if (elements.length > 0) {\n elements.forEach(element => {\n // Prevent multiple listeners for the same event type on the same element\n let eventSet = this.attachedListeners.get(element);\n if (!eventSet) {\n eventSet = new Set();\n this.attachedListeners.set(element, eventSet);\n }\n \n // Handle array of event types\n const eventTypes = Array.isArray(eventToTrack.event_type) ? eventToTrack.event_type : [eventToTrack.event_type];\n \n eventTypes.forEach((eventType: string) => {\n if (eventSet.has(eventType)) return;\n eventSet.add(eventType);\n \n // Click events\n if (eventType === 'click') {\n element.addEventListener('click', (event: Event) => {\n // Don't prevent default for this demo, let buttons work normally\n const target = event.target as HTMLElement;\n const elementData = this.extractElementData(target);\n \n this.sendToWorker(eventToTrack.event_name, {\n selector: eventToTrack.element_selector,\n eventType: 'click',\n element: elementData,\n timestamp: new Date().toISOString()\n });\n });\n this.log(`Attached click listener for \"${eventToTrack.event_name}\" on \"${eventToTrack.element_selector}\"`);\n }\n \n // View events using IntersectionObserver\n if (eventType === 'view') {\n if ('IntersectionObserver' in window) {\n const observer = new IntersectionObserver((entries) => {\n entries.forEach(entry => {\n if (entry.isIntersecting) {\n const target = entry.target as HTMLElement;\n const elementData = this.extractElementData(target);\n \n this.sendToWorker(eventToTrack.event_name, {\n selector: eventToTrack.element_selector,\n eventType: 'view',\n element: elementData,\n intersectionRatio: entry.intersectionRatio,\n timestamp: new Date().toISOString()\n });\n }\n });\n }, { threshold: [0.1, 0.5, 1.0] });\n observer.observe(element);\n this.log(`Attached IntersectionObserver for \"${eventToTrack.event_name}\" on \"${eventToTrack.element_selector}\"`);\n }\n }\n \n // Focus/blur tracking\n if (eventType === 'focus' || eventType === 'blur') {\n element.addEventListener(eventType, () => {\n const target = element as HTMLElement;\n const elementData = this.extractElementData(target);\n \n this.sendToWorker(eventToTrack.event_name, {\n selector: eventToTrack.element_selector,\n eventType: eventType,\n element: elementData,\n timestamp: new Date().toISOString()\n });\n });\n this.log(`Attached ${eventType} listener for \"${eventToTrack.event_name}\" on \"${eventToTrack.element_selector}\"`);\n }\n });\n });\n } else {\n this.log(`No elements found for selector: \"${eventToTrack.element_selector}\"`);\n }\n } catch (e) {\n this.log(`Error applying selector \"${eventToTrack.element_selector}\":`, e);\n }\n });\n\n // MutationObserver for DOM changes (if requested by config)\n if (config.observe_mutations) {\n if ('MutationObserver' in window) {\n const observer = new MutationObserver((mutations) => {\n mutations.forEach(mutation => {\n this.sendToWorker('dom_mutation', {\n type: mutation.type,\n target: (mutation.target as HTMLElement).outerHTML,\n timestamp: new Date().toISOString()\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n this.log('MutationObserver attached for DOM changes');\n }\n }\n }\n\n private extractElementData(element: HTMLElement): any {\n const rect = element.getBoundingClientRect();\n return {\n tagName: element.tagName.toLowerCase(),\n id: element.id || '',\n className: element.className || '',\n textContent: (element.textContent || '').trim().substring(0, 100),\n attributes: Array.from(element.attributes).reduce((acc, attr) => {\n acc[attr.name] = attr.value;\n return acc;\n }, {} as Record<string, string>),\n position: {\n x: Math.round(rect.x),\n y: Math.round(rect.y),\n width: Math.round(rect.width),\n height: Math.round(rect.height)\n },\n href: (element as HTMLAnchorElement).href || undefined,\n value: (element as HTMLInputElement).value || undefined\n };\n }\n\n // Helper to send events to worker for batching\n private sendToWorker(eventName: string, properties: Record<string, any>) {\n // Check if we should sample this event\n if (!this.shouldSampleEvents()) {\n this.log('Event skipped due to sampling:', eventName);\n return;\n }\n\n const now = new Date();\n const eventData: any = {\n event: eventName,\n properties,\n timestamp: now.getTime(), // Milliseconds for backward compatibility\n created_at: now.toISOString(), // ISO timestamp for server-side time filtering\n userId: this.getUserId(),\n sessionId: this.sessionId,\n // Include both project_key (new) and client_id (legacy)\n project_key: this.config.projectKey || undefined,\n client_id: this.config.clientId || this.config.apiKey || undefined,\n project_id: this.projectSettings?.project_id || undefined\n };\n if (this.config.useWebWorker && typeof Worker !== 'undefined') {\n this.worker.postMessage({ type: 'track', payload: eventData });\n } else {\n this.eventQueue.push(eventData);\n }\n this.log('Event tracked:', eventData);\n }\n\n private async setupWebWorker() {\n // Get authentication headers\n const authHeaders = await this.authManager.getAuthHeaders();\n\n // Pass worker config to the worker\n this.worker.postMessage({\n type: 'config',\n payload: {\n apiUrl: this.config.apiDetails?.apiEndPoint || `${this.config.endpoint}/api/v1/events`,\n batchSize: this.config.workerConfig?.batchSize || 10,\n batchInterval: this.config.workerConfig?.batchInterval || 5000,\n headers: {\n 'Content-Type': 'application/json',\n ...authHeaders,\n ...(this.config.apiDetails?.headers || {})\n },\n }\n });\n this.worker.onmessage = (event) => {\n if (event.data.status === 'success') {\n this.log('Batch sent successfully by worker');\n // Don't re-queue failed events since we already cleared the queue\n } else if (event.data.status === 'debug') {\n this.log(event.data.message, event.data);\n } else if (event.data.status === 'error') {\n this.log('Worker failed to send batch', event.data.error);\n // Re-queue failed events only if we have them\n if (event.data.failedEvents && event.data.failedEvents.length > 0) {\n this.eventQueue.unshift(...event.data.failedEvents);\n }\n }\n };\n this.log('Web worker setup complete.');\n }\n\n public track(eventName: string, properties: Record<string, any> = {}) {\n // Check if we should sample this event\n if (!this.shouldSampleEvents()) {\n this.log('Event skipped due to sampling:', eventName);\n return;\n }\n\n // Track in journey tracker\n this.journeyTracker.trackEvent(eventName, properties);\n\n // Get journey context\n const journeyContext = this.journeyTracker.getContext();\n\n const now = new Date();\n const eventData: any = {\n event: eventName,\n properties: {\n ...properties,\n journeyContext: {\n sequenceIndex: journeyContext.eventCount - 1,\n timeSinceLastEvent: journeyContext.timeSinceLastEvent,\n journeyDuration: Date.now() - journeyContext.journeyStartTime\n }\n },\n timestamp: now.getTime(), // Milliseconds for backward compatibility\n created_at: now.toISOString(), // ISO timestamp for server-side time filtering\n userId: this.userManager.getUserId(),\n userType: this.userManager.getUserType(),\n sessionId: this.sessionId,\n // Include both project_key (new) and client_id (legacy)\n project_key: this.config.projectKey || undefined,\n client_id: this.config.clientId || this.config.apiKey || undefined,\n // Include project_id if available from project settings\n project_id: this.projectSettings?.project_id || undefined\n };\n\n // Check if we should send journey for analysis\n if (this.journeyTracker.shouldAnalyzeJourney()) {\n this.sendJourneyForAnalysis();\n }\n\n // Use the same batching logic as sendToWorker\n if (this.config.useWebWorker && typeof Worker !== 'undefined') {\n this.worker.postMessage({ type: 'track', payload: eventData });\n } else {\n this.eventQueue.push(eventData);\n }\n this.log('Event tracked public:', eventData);\n }\n\n private startBatchTimer() {\n this.batchTimer = window.setInterval(() => {\n this.flushQueue();\n }, this.config.batchInterval);\n }\n\n private async flushQueue() {\n if (this.eventQueue.length === 0) {\n return;\n }\n\n const batch = [...this.eventQueue];\n // Clear the queue immediately to prevent duplicates\n this.eventQueue = [];\n\n if (this.config.useWebWorker && typeof Worker !== 'undefined') {\n this.worker.postMessage({\n type: 'batch',\n events: batch,\n endpoint: `${this.config.endpoint}/api/v1/events`,\n });\n } else {\n // Fallback send mechanism with retry logic\n await this.sendBatchWithRetry(batch);\n }\n }\n\n private async sendBatchWithRetry(batch: Map<string, any>[]) {\n if (this.batchRetryCount >= this.maxBatchRetries) {\n if (this.batchTimer) {\n clearInterval(this.batchTimer);\n this.batchTimer = undefined;\n this.log('Max batch retries reached. BatchTimer cancelled.');\n }\n return;\n }\n try {\n await this.sendBatch(batch);\n // On success, reset retry count (queue already cleared in flushQueue)\n this.batchRetryCount = 0;\n } catch (error) {\n this.batchRetryCount++;\n this.log(`Batch send failed. Retry attempt ${this.batchRetryCount} of ${this.maxBatchRetries}.`, error);\n // Re-queue the failed batch for retry\n this.eventQueue.unshift(...batch);\n if (this.batchRetryCount >= this.maxBatchRetries) {\n if (this.batchTimer) {\n clearInterval(this.batchTimer);\n this.batchTimer = undefined;\n this.log('Max batch retries reached. BatchTimer cancelled.');\n }\n }\n }\n }\n\n // Update sendBatch to support client db endpoint and headers\n private async sendBatch(batch: Map<string, any>[]) {\n let endpoint = `${this.config.endpoint}/api/v1/events`;\n let headers: Record<string, string> = { 'Content-Type': 'application/json' };\n\n // Get authentication headers\n const authHeaders = await this.authManager.getAuthHeaders();\n headers = { ...headers, ...authHeaders };\n\n if (this.config.apiDetails && this.config.apiDetails.apiEndPoint) {\n endpoint = this.config.apiDetails.apiEndPoint;\n if (this.config.apiDetails.headers) {\n headers = { ...headers, ...this.config.apiDetails.headers };\n }\n }\n // Transform batch to required format\n const clientId = this.config.clientId || '5288aa7d-1b7c-481e-958d-eb9b8e951f14';\n const events = batch.map((e: any) => ({\n event: e.event, // keep 'event' key\n userId: e.userId,\n client_id: clientId,\n timestamp: new Date(e.timestamp).toISOString(),\n ...(e.properties || {})\n }));\n try {\n const response = await fetch(endpoint, {\n method: 'POST',\n headers,\n body: JSON.stringify({ events }),\n });\n if (!response.ok) {\n throw new Error(`Failed to send batch: ${response.status}`);\n }\n this.log('Batch sent successfully:', events);\n } catch (error) {\n this.log('Error sending batch:', error);\n throw error; // Let sendBatchWithRetry handle re-queuing\n }\n }\n\n private generateSessionId(): string {\n // Simple session ID generator (could be improved)\n return 'sess_' + Math.random().toString(36).substr(2, 9);\n }\n\n private getUserId(): string {\n // Use UserManager for consistent user identification\n return this.userManager.getUserId();\n }\n\n // Public method to identify authenticated user\n public identifyUser(authenticatedUserId: string, userProperties?: Record<string, any>) {\n // Get identification event before updating\n const identificationEvent = this.userManager.getUserIdentificationEvent(authenticatedUserId);\n\n // Update user in UserManager\n this.userManager.identifyUser(authenticatedUserId, userProperties);\n\n // Track the identification event\n this.track('user_identified', identificationEvent);\n\n // Update error tracker if enabled\n if (this.errorTracker) {\n this.errorTracker.setUser(authenticatedUserId);\n }\n\n this.log('User identified:', { userId: authenticatedUserId, properties: userProperties });\n }\n\n // Public authentication methods\n public async isAuthenticated(): Promise<boolean> {\n const token = await this.authManager.getAccessToken();\n return token !== null;\n }\n\n public async authenticate(): Promise<boolean> {\n return await this.authManager.initialize();\n }\n\n public async logout(): Promise<void> {\n await this.authManager.logout();\n }\n\n // Send journey data for AI analysis\n private async sendJourneyForAnalysis() {\n try {\n const journeyData = this.journeyTracker.getJourneyForAnalysis();\n const endpoint = `${this.config.endpoint}/api/v1/journeys/analyze`;\n\n // Get authentication headers\n const authHeaders = await this.authManager.getAuthHeaders();\n\n const response = await fetch(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...authHeaders\n },\n body: JSON.stringify({\n client_id: this.config.clientId,\n user_id: this.userManager.getUserId(),\n session_id: this.sessionId,\n journey: journeyData\n })\n });\n\n if (!response.ok) {\n console.error('[AInamika SDK] Failed to send journey for analysis:', response.statusText);\n }\n } catch (error) {\n console.error('[AInamika SDK] Error sending journey for analysis:', error);\n }\n }\n\n private log(message: string, data?: any) {\n if (this.config.debug) {\n console.log(`[AnalyticsPro SDK] ${message}`, data || '');\n }\n }\n\n // Save config as a downloadable JSON file\nprivate saveConfigToFile(config: any) {\n if(!this.config.debug){\n return;\n }\n // const fileName = 'AInamika_config.json';\n // const json = JSON.stringify(config, null, 2);\n // const blob = new Blob([json], { type: 'application/json' });\n // const link = document.createElement('a');\n // link.href = URL.createObjectURL(blob);\n // link.download = fileName;\n // document.body.appendChild(link);\n // link.click();\n // document.body.removeChild(link);\n}\n\n// Load config from /AInamika_config.json in the project root\nprivate async loadConfigFromFile(): Promise<any | null> {\n try {\n const response = await fetch('/AInamika_config.json', { cache: 'reload' });\n if (!response.ok) {\n return null;\n }\n const config = await response.json();\n return config;\n } catch (err) {\n return null;\n }\n}\n\n// --- Dynamic DOM Fingerprinting and Smart Debouncing ---\nprivate async setupDynamicDomTracking() {\n // Use MutationObserver to watch for DOM changes\n if ('MutationObserver' in window) {\n const observer = new MutationObserver(() => {\n if (this.mutationDebounceTimer) {\n clearTimeout(this.mutationDebounceTimer);\n }\n this.mutationDebounceTimer = window.setTimeout(() => {\n this.handleDomMutation();\n }, this.mutationDebounceMs);\n });\n observer.observe(document.body, { childList: true, subtree: true, attributes: true });\n this.log('Dynamic DOM MutationObserver attached');\n }\n}\n\nprivate computeDomHash(structure: any): string {\n // Simple hash: JSON.stringify, then a basic hash (FNV-1a or similar)\n const str = JSON.stringify(structure);\n let hash = 2166136261;\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);\n }\n return (hash >>> 0).toString(16);\n}\n\nprivate getCachedConfigForDomHash(domHash: string): any | null {\n try {\n const cache = JSON.parse(localStorage.getItem('ainamika_dom_config_cache') || '{}');\n return cache[domHash] || null;\n } catch {\n return null;\n }\n}\n\nprivate setCachedConfigForDomHash(domHash: string, config: any) {\n try {\n const cache = JSON.parse(localStorage.getItem('ainamika_dom_config_cache') || '{}');\n cache[domHash] = config;\n localStorage.setItem('ainamika_dom_config_cache', JSON.stringify(cache));\n } catch {}\n}\n\nprivate async handleDomMutation() {\n const domStructure = await this.getDOMStructure();\n const domHash = this.computeDomHash(domStructure);\n \n if (domHash === this.lastDomHash) {\n this.log('DOM hash unchanged after mutation, skipping config fetch.');\n return;\n }\n \n this.log('DOM hash changed, checking for cached config...', { oldHash: this.lastDomHash, newHash: domHash });\n this.lastDomHash = domHash;\n \n const cachedConfig = this.getCachedConfigForDomHash(domHash);\n if (cachedConfig) {\n this.log('Reusing cached config for DOM hash', domHash);\n this.applyGeneratedConfig(cachedConfig);\n return;\n }\n \n // Send to server: domStructure with domHash and lastConfigHash\n this.log('Fetching new config from backend for DOM hash:', domHash);\n const config = await this.fetchGeneratedConfig(domStructure, domHash);\n if (config && config.events_to_track) {\n this.applyGeneratedConfig(config);\n this.setCachedConfigForDomHash(domHash, config);\n this.lastConfigHash = config.config_hash || '';\n this.log('Fetched and applied new config for new DOM hash', domHash);\n } else {\n this.log('No valid config returned for new DOM hash', domHash);\n }\n}\n}\n\n// Make AnalyticsProSDK available globally for both classic and module scripts\nif (typeof window !== 'undefined') {\n (window as any).AInamikaSDKPro = AInamikaSDKPro;\n}\n\nexport default AInamikaSDKPro;\nexport { AInamikaSDKPro };"],"names":["root","factory","exports","module","define","amd","self","window","global","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","config","breadcrumbs","errorCount","errorDebounceMap","Map","captureScreenshots","captureDomSnapshots","maxStackTraceDepth","maxErrorsPerSession","debounceMs","enableNetworkTracking","enableConsoleCapture","authManager","sessionId","generateSessionId","originalConsole","console","initialize","addEventListener","event","handleError","type","message","filename","line","lineno","column","colno","error","reason","promise","setupNetworkTracking","setupConsoleCapture","setupNavigationTracking","setupClickTracking","log","Date","now","Math","random","toString","substr","addBreadcrumb","breadcrumb","push","timestamp","length","slice","errorInfo","warn","errorKey","has","set","captureError","errorData","client_id","clientId","error_type","stack_trace","extractStackTrace","url","location","href","user_agent","navigator","userAgent","error_metadata","userId","networkInfo","getNetworkInfo","performance","getPerformanceInfo","severity","assessSeverity","session_id","user_id","dom_snapshot","captureDomSnapshot","captureScreenshot","screen_snapshot","sendError","data","stack","split","maxDepth","join","toLowerCase","includes","snapshot","title","document","viewport","width","innerWidth","height","innerHeight","elements","extractDomElements","JSON","stringify","forEach","selector","els","querySelectorAll","Array","from","el","tagName","id","className","textContent","substring","attributes","getElementAttributes","e","element","attrs","attr","value","getAttribute","html2canvas","body","min","useCORS","toDataURL","connection","mozConnection","webkitConnection","effectiveType","downlink","rtt","saveData","info","memory","usedJSHeapSize","totalJSHeapSize","jsHeapSizeLimit","timing","domContentLoaded","domContentLoadedEventEnd","navigationStart","load","loadEventEnd","getEntriesByType","entry","name","firstPaint","startTime","firstContentfulPaint","originalFetch","fetch","args","Request","String","response","status","duration","ok","statusText","originalXHROpen","XMLHttpRequest","open","originalXHRSend","send","method","async","username","password","_errorTracker","tracker","dispatchEvent","CustomEvent","detail","original","map","arg","consoleMethod","level","currentUrl","trackNavigation","newUrl","to","originalPushState","history","pushState","originalReplaceState","replaceState","apply","setTimeout","target","getElementSelector","text","trim","classes","filter","c","headers","getAuthHeaders","authHeaders","apiKey","endpoint","Error","storeErrorLocally","stored","localStorage","getItem","errors","parse","splice","setItem","captureException","context","setUser","addTag","flushStoredErrors","removeItem","ENV_CONFIG","__AINAMIKA_CONFIG__","API_BASE_URL","APP_ENV","DEBUG","API_ENDPOINTS","EVENTS","ERRORS","CONFIG","DEBUG_EVENTS","PROJECTS_LOOKUP","SAMPLING_CHECK","STORAGE_KEY","METADATA_KEY","isProcessing","maxStorageSize","maxRetries","retryInterval","compressionEnabled","encryptionEnabled","cleanupOldErrors","startRetryTimer","setupStorageListener","processQueue","storeError","errorId","generateErrorId","storedError","compressData","retryCount","addToQueue","updateMetadata","getStoredErrors","decompressData","removeError","getQueueRaw","filteredErrors","clearAll","getStorageStats","totalSize","Blob","size","timestamps","sort","oldestError","newestError","lastRetry","incrementRetryCount","retryError","find","serialized","shift","errorIndex","findIndex","jsonString","btoa","compressedData","atob","cleanErrors","retryTimer","setInterval","stats","metadata","lastUpdate","exportErrors","exportData","version","importErrors","isArray","destroy","clearInterval","undefined","getAinamikaStorageUsage","errorSize","otherSize","startsWith","checkStorageSpace","requiredBytes","testKey","testData","repeat","cleanupAllAinamikaStorage","keysToRemove","generateStorageReport","storage","ErrorStorage","usage","ErrorStorageUtils","userProperties","initializeUser","getOrCreateUserId","generateAnonymousId","getUserId","getUserProperties","identifyUser","authenticatedUserId","properties","previousId","updateUserProperties","clearUser","getUserIdentificationEvent","previous_id","isAnonymousUser","getUserType","userJourney","lastEventTime","sequenceIndex","maxJourneyLength","journeyAnalysisThreshold","journeyStartTime","trackEvent","eventName","currentTime","timeSinceLastEvent","journeyEvent","journeyPosition","getContext","journeySequence","getJourneySequence","eventCount","getJourneyData","shouldAnalyzeJourney","getJourneyForAnalysis","journeyDuration","avgTimeBetweenEvents","calculateAverageTimeBetweenEvents","journey","journeyLength","endTime","totalTime","i","round","findPatterns","patterns","sequence","fromEntries","entries","clearJourney","getJourneySegment","count","detectPotentialFunnel","recentEvents","funnelName","apiEndpoint","debug","accessToken","refreshToken","tokenExpiry","loadTokens","isTokenValid","debugLog","refreshAccessToken","requestTokens","tokens","setTokens","json","refresh_token","clearTokens","getAccessToken","shouldRefreshToken","token","access_token","expires_in","saveTokens","scheduleTokenRefresh","refreshTimer","clearTimeout","refreshIn","max","tokenData","logout","eventQueue","isInitialized","batchRetryCount","maxBatchRetries","domHashCache","lastDomHash","lastConfigHash","mutationDebounceTimer","mutationDebounceMs","attachedListeners","WeakMap","projectKey","batchInterval","useWebWorker","errorTracking","enabled","userIdentifier","getOrCreateUserIdentifier","userManager","UserManager","journeyTracker","JourneyTracker","AuthManager","blob","workerUrl","URL","createObjectURL","worker","Worker","initializeProjectSettings","initializeSamplingDecision","projectSettings","samplingDecision","shouldSampleErrors","initializeErrorTracking","autoConfig","setupAutoConfiguration","setupDynamicDomTracking","setupWebWorker","startBatchTimer","sampling","storageKey","identifier","project_key","user_identifier","cacheSamplingDecision","loadCachedSamplingDecision","cached","should_sample","events","session_replay","rates","decision","shouldSampleEvents","shouldSampleSessionReplay","getSamplingStatus","getProjectInfo","errorStorage","errorConfig","errorTracker","ErrorTracker","getDOMStructure","domStructure","domHash","computeDomHash","generatedConfig","getCachedConfigForDomHash","loadConfigFromFile","fetchGeneratedConfig","events_to_track","saveConfigToFile","setCachedConfigForDomHash","config_hash","applyGeneratedConfig","postMessage","getSelector","Promise","resolve","filteredElements","style","getComputedStyle","isVisible","display","visibility","opacity","hasInteraction","hasAttribute","classList","contains","isImportantElement","indexOf","seen","Set","structure","stableAttributes","isInteractive","hasChildren","children","childCount","parentTagName","parentElement","index","add","elementCount","requestBody","eventToTrack","element_selector","eventSet","event_type","eventType","elementData","extractElementData","sendToWorker","event_name","toISOString","IntersectionObserver","isIntersecting","intersectionRatio","threshold","observe","observe_mutations","MutationObserver","mutations","mutation","outerHTML","childList","subtree","rect","getBoundingClientRect","reduce","acc","position","x","y","eventData","getTime","created_at","project_id","payload","apiUrl","apiDetails","apiEndPoint","batchSize","workerConfig","onmessage","failedEvents","unshift","track","journeyContext","userType","sendJourneyForAnalysis","batchTimer","flushQueue","batch","sendBatchWithRetry","sendBatch","identificationEvent","isAuthenticated","authenticate","journeyData","cache","handleDomMutation","str","hash","charCodeAt","oldHash","newHash","cachedConfig","AInamikaSDKPro"],"sourceRoot":""}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ainamika-sdk",
|
|
3
|
-
"version": "1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "Advanced AI-powered analytics SDK with error tracking, event management, and real-time insights for web applications",
|
|
5
5
|
"main": "dist/ainamika-sdk.js",
|
|
6
6
|
"types": "dist/sdk.d.ts",
|