@bluewhaleops/browser 1.1.0 → 1.2.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/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";var L=Object.defineProperty,ge=Object.defineProperties,ye=Object.getOwnPropertyDescriptor,we=Object.getOwnPropertyDescriptors,Ee=Object.getOwnPropertyNames,X=Object.getOwnPropertySymbols;var Q=Object.prototype.hasOwnProperty,be=Object.prototype.propertyIsEnumerable;var Y=(n,e,t)=>e in n?L(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,v=(n,e)=>{for(var t in e||(e={}))Q.call(e,t)&&Y(n,t,e[t]);if(X)for(var t of X(e))be.call(e,t)&&Y(n,t,e[t]);return n},C=(n,e)=>ge(n,we(e));var Te=(n,e)=>()=>(n&&(e=n(n=0)),e);var Z=(n,e)=>{for(var t in e)L(n,t,{get:e[t],enumerable:!0})},Se=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Ee(e))!Q.call(n,r)&&r!==t&&L(n,r,{get:()=>e[r],enumerable:!(i=ye(e,r))||i.enumerable});return n};var Le=n=>Se(L({},"__esModule",{value:!0}),n);var le={};Z(le,{CLSThresholds:()=>U,FCPThresholds:()=>O,FIDThresholds:()=>W,INPThresholds:()=>z,LCPThresholds:()=>H,TTFBThresholds:()=>j,getCLS:()=>Ie,getFCP:()=>se,getFID:()=>Pe,getINP:()=>Fe,getLCP:()=>De,getTTFB:()=>_e,onCLS:()=>Ie,onFCP:()=>se,onFID:()=>Pe,onINP:()=>Fe,onLCP:()=>De,onTTFB:()=>_e});var m,b,oe,B,q,ae,g,K,A,d,w,p,V,R,$,y,ee,P,te,ke,J,T,O,se,U,Ie,E,xe,ne,ue,Be,ce,W,Pe,de,M,x,Ae,pe,Re,z,fe,re,f,_,ie,Fe,H,N,De,j,Me,_e,he=Te(()=>{"use strict";ae=-1,g=function(n){addEventListener("pageshow",(function(e){e.persisted&&(ae=e.timeStamp,n(e))}),!0)},K=function(){return window.performance&&performance.getEntriesByType&&performance.getEntriesByType("navigation")[0]},A=function(){var n=K();return n&&n.activationStart||0},d=function(n,e){var t=K(),i="navigate";return ae>=0?i="back-forward-cache":t&&(document.prerendering||A()>0?i="prerender":document.wasDiscarded?i="restore":t.type&&(i=t.type.replace(/_/g,"-"))),{name:n,value:e===void 0?-1:e,rating:"good",delta:0,entries:[],id:"v3-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:i}},w=function(n,e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(n)){var i=new PerformanceObserver((function(r){Promise.resolve().then((function(){e(r.getEntries())}))}));return i.observe(Object.assign({type:n,buffered:!0},t||{})),i}}catch(r){}},p=function(n,e,t,i){var r,o;return function(u){e.value>=0&&(u||i)&&((o=e.value-(r||0))||r===void 0)&&(r=e.value,e.delta=o,e.rating=(function(a,s){return a>s[1]?"poor":a>s[0]?"needs-improvement":"good"})(e.value,t),n(e))}},V=function(n){requestAnimationFrame((function(){return requestAnimationFrame((function(){return n()}))}))},R=function(n){var e=function(t){t.type!=="pagehide"&&document.visibilityState!=="hidden"||n(t)};addEventListener("visibilitychange",e,!0),addEventListener("pagehide",e,!0)},$=function(n){var e=!1;return function(t){e||(n(t),e=!0)}},y=-1,ee=function(){return document.visibilityState!=="hidden"||document.prerendering?1/0:0},P=function(n){document.visibilityState==="hidden"&&y>-1&&(y=n.type==="visibilitychange"?n.timeStamp:0,ke())},te=function(){addEventListener("visibilitychange",P,!0),addEventListener("prerenderingchange",P,!0)},ke=function(){removeEventListener("visibilitychange",P,!0),removeEventListener("prerenderingchange",P,!0)},J=function(){return y<0&&(y=ee(),te(),g((function(){setTimeout((function(){y=ee(),te()}),0)}))),{get firstHiddenTime(){return y}}},T=function(n){document.prerendering?addEventListener("prerenderingchange",(function(){return n()}),!0):n()},O=[1800,3e3],se=function(n,e){e=e||{},T((function(){var t,i=J(),r=d("FCP"),o=w("paint",(function(u){u.forEach((function(a){a.name==="first-contentful-paint"&&(o.disconnect(),a.startTime<i.firstHiddenTime&&(r.value=Math.max(a.startTime-A(),0),r.entries.push(a),t(!0)))}))}));o&&(t=p(n,r,O,e.reportAllChanges),g((function(u){r=d("FCP"),t=p(n,r,O,e.reportAllChanges),V((function(){r.value=performance.now()-u.timeStamp,t(!0)}))})))}))},U=[.1,.25],Ie=function(n,e){e=e||{},se($((function(){var t,i=d("CLS",0),r=0,o=[],u=function(s){s.forEach((function(c){if(!c.hadRecentInput){var h=o[0],D=o[o.length-1];r&&c.startTime-D.startTime<1e3&&c.startTime-h.startTime<5e3?(r+=c.value,o.push(c)):(r=c.value,o=[c])}})),r>i.value&&(i.value=r,i.entries=o,t())},a=w("layout-shift",u);a&&(t=p(n,i,U,e.reportAllChanges),R((function(){u(a.takeRecords()),t(!0)})),g((function(){r=0,i=d("CLS",0),t=p(n,i,U,e.reportAllChanges),V((function(){return t()}))})),setTimeout(t,0))})))},E={passive:!0,capture:!0},xe=new Date,ne=function(n,e){m||(m=e,b=n,oe=new Date,ce(removeEventListener),ue())},ue=function(){if(b>=0&&b<oe-xe){var n={entryType:"first-input",name:m.type,target:m.target,cancelable:m.cancelable,startTime:m.timeStamp,processingStart:m.timeStamp+b};B.forEach((function(e){e(n)})),B=[]}},Be=function(n){if(n.cancelable){var e=(n.timeStamp>1e12?new Date:performance.now())-n.timeStamp;n.type=="pointerdown"?(function(t,i){var r=function(){ne(t,i),u()},o=function(){u()},u=function(){removeEventListener("pointerup",r,E),removeEventListener("pointercancel",o,E)};addEventListener("pointerup",r,E),addEventListener("pointercancel",o,E)})(e,n):ne(e,n)}},ce=function(n){["mousedown","keydown","touchstart","pointerdown"].forEach((function(e){return n(e,Be,E)}))},W=[100,300],Pe=function(n,e){e=e||{},T((function(){var t,i=J(),r=d("FID"),o=function(s){s.startTime<i.firstHiddenTime&&(r.value=s.processingStart-s.startTime,r.entries.push(s),t(!0))},u=function(s){s.forEach(o)},a=w("first-input",u);t=p(n,r,W,e.reportAllChanges),a&&R($((function(){u(a.takeRecords()),a.disconnect()}))),a&&g((function(){var s;r=d("FID"),t=p(n,r,W,e.reportAllChanges),B=[],b=-1,m=null,ce(addEventListener),s=o,B.push(s),ue()}))}))},de=0,M=1/0,x=0,Ae=function(n){n.forEach((function(e){e.interactionId&&(M=Math.min(M,e.interactionId),x=Math.max(x,e.interactionId),de=x?(x-M)/7+1:0)}))},pe=function(){return q?de:performance.interactionCount||0},Re=function(){"interactionCount"in performance||q||(q=w("event",Ae,{type:"event",buffered:!0,durationThreshold:0}))},z=[200,500],fe=0,re=function(){return pe()-fe},f=[],_={},ie=function(n){var e=f[f.length-1],t=_[n.interactionId];if(t||f.length<10||n.duration>e.latency){if(t)t.entries.push(n),t.latency=Math.max(t.latency,n.duration);else{var i={id:n.interactionId,latency:n.duration,entries:[n]};_[i.id]=i,f.push(i)}f.sort((function(r,o){return o.latency-r.latency})),f.splice(10).forEach((function(r){delete _[r.id]}))}},Fe=function(n,e){e=e||{},T((function(){var t;Re();var i,r=d("INP"),o=function(a){a.forEach((function(h){h.interactionId&&ie(h),h.entryType==="first-input"&&!f.some((function(D){return D.entries.some((function(G){return h.duration===G.duration&&h.startTime===G.startTime}))}))&&ie(h)}));var s,c=(s=Math.min(f.length-1,Math.floor(re()/50)),f[s]);c&&c.latency!==r.value&&(r.value=c.latency,r.entries=c.entries,i())},u=w("event",o,{durationThreshold:(t=e.durationThreshold)!==null&&t!==void 0?t:40});i=p(n,r,z,e.reportAllChanges),u&&("PerformanceEventTiming"in window&&"interactionId"in PerformanceEventTiming.prototype&&u.observe({type:"first-input",buffered:!0}),R((function(){o(u.takeRecords()),r.value<0&&re()>0&&(r.value=0,r.entries=[]),i(!0)})),g((function(){f=[],fe=pe(),r=d("INP"),i=p(n,r,z,e.reportAllChanges)})))}))},H=[2500,4e3],N={},De=function(n,e){e=e||{},T((function(){var t,i=J(),r=d("LCP"),o=function(s){var c=s[s.length-1];c&&c.startTime<i.firstHiddenTime&&(r.value=Math.max(c.startTime-A(),0),r.entries=[c],t())},u=w("largest-contentful-paint",o);if(u){t=p(n,r,H,e.reportAllChanges);var a=$((function(){N[r.id]||(o(u.takeRecords()),u.disconnect(),N[r.id]=!0,t(!0))}));["keydown","click"].forEach((function(s){addEventListener(s,(function(){return setTimeout(a,0)}),!0)})),R(a),g((function(s){r=d("LCP"),t=p(n,r,H,e.reportAllChanges),V((function(){r.value=performance.now()-s.timeStamp,N[r.id]=!0,t(!0)}))}))}}))},j=[800,1800],Me=function n(e){document.prerendering?T((function(){return n(e)})):document.readyState!=="complete"?addEventListener("load",(function(){return n(e)}),!0):setTimeout(e,0)},_e=function(n,e){e=e||{};var t=d("TTFB"),i=p(n,t,j,e.reportAllChanges);Me((function(){var r=K();if(r){var o=r.responseStart;if(o<=0||o>performance.now())return;t.value=Math.max(o-A(),0),t.entries=[r],i(!0),g((function(){t=d("TTFB",0),(i=p(n,t,j,e.reportAllChanges))(!0)}))}}))}});var ze={};Z(ze,{BlueWhaleClient:()=>S,SessionRecorder:()=>F,addBreadcrumb:()=>Ue,captureError:()=>Oe,init:()=>qe,setUser:()=>We,stopAndFlushReplay:()=>ve});module.exports=Le(ze);var k=class{constructor(e=50){this.buffer=[];this.max=e}add(e){this.buffer.push(e),this.buffer.length>this.max&&this.buffer.shift()}flush(){return[...this.buffer]}instrument(){if(typeof window=="undefined")return;let e=history.pushState.bind(history);history.pushState=(...i)=>{var r;return this.add({type:"navigation",message:`\u2192 ${(r=i[2])!=null?r:""}`,timestamp:Date.now()}),e(...i)},["log","warn","error","info"].forEach(i=>{let r=console[i].bind(console);console[i]=(...o)=>{let u=i==="log"?"info":i;this.add({type:"console",category:i,message:o.map(String).join(" ").slice(0,300),level:u,timestamp:Date.now()}),r(...o)}});let t=window.fetch.bind(window);window.fetch=async(i,r)=>{var s;let o=typeof i=="string"?i:i instanceof URL?i.href:i.url,u=(s=r==null?void 0:r.method)!=null?s:"GET",a=Date.now();try{let c=await t(i,r);return this.add({type:"fetch",category:"http",message:`${u} ${o}`,level:c.ok?"info":"warn",timestamp:a,data:{status:c.status,duration_ms:Date.now()-a}}),c}catch(c){throw this.add({type:"fetch",category:"http",message:`${u} ${o} failed`,level:"error",timestamp:a,data:{error:String(c)}}),c}},document.addEventListener("click",i=>{var u;let r=i.target;if(!r)return;let o=r.getAttribute("aria-label")||((u=r.innerText)==null?void 0:u.slice(0,60))||r.tagName;this.add({type:"click",message:o,timestamp:Date.now()})},{passive:!0,capture:!0})}};var Ce="1.0.0",I=class{constructor(e,t){this.queue=[];this.flushing=!1;this.endpoint=e,this.apiKey=t}enqueue(e){this.queue.length>=20&&this.queue.shift(),this.queue.push(C(v({},e),{sdk_version:Ce})),this.flush()}async flush(){if(this.flushing||this.queue.length===0)return;this.flushing=!0;let e=this.queue.shift();try{await fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(e),keepalive:!0})}catch(t){}finally{this.flushing=!1,this.queue.length>0&&this.flush()}}};function me(n){typeof window!="undefined"&&Promise.resolve().then(()=>(he(),le)).then(({onLCP:e,onCLS:t,onINP:i,onFCP:r,onTTFB:o})=>{[e,t,i,r,o].forEach(u=>{try{u(a=>n(a.name,a.value,a.rating))}catch(a){}})}).catch(()=>{})}var Ne="https://bluewhaleops.com/api/ingest/error",S=class{constructor(e){this.initialized=!1;this.config=v({endpoint:Ne,environment:"production",release:"",maxBreadcrumbs:50,silent:!1,ventureId:""},e),this.crumbs=new k(this.config.maxBreadcrumbs),this.transport=new I(this.config.endpoint,this.config.apiKey)}init(){this.initialized||typeof window=="undefined"||(this.initialized=!0,this.crumbs.instrument(),window.addEventListener("error",e=>{var t,i,r;this.capture({error_type:(i=(t=e.error)==null?void 0:t.name)!=null?i:"Error",message:e.message||"Unknown error",stack:(r=e.error)==null?void 0:r.stack,url:window.location.href,source:"browser"})}),window.addEventListener("unhandledrejection",e=>{var i,r;let t=e.reason;this.capture({error_type:(i=t==null?void 0:t.name)!=null?i:"UnhandledRejection",message:(r=t==null?void 0:t.message)!=null?r:String(t),stack:t==null?void 0:t.stack,url:window.location.href,source:"browser"})}),me((e,t,i)=>{this.capture({error_type:"WebVital",message:e+": "+t.toFixed(1),source:"browser",tags:{vital:e,rating:i,value:String(Math.round(t))}})}))}capture(e){let t=C(v({error_type:"Error"},e),{user_agent:typeof navigator!="undefined"?navigator.userAgent:void 0,environment:this.config.environment,release:this.config.release||void 0,venture_id:this.config.ventureId||void 0,breadcrumbs:this.crumbs.flush()});if(this.config.beforeSend){let i=this.config.beforeSend(t);if(i===!1)return;t=i}this.transport.enqueue(t)}setUser(e){this._userId=e}addBreadcrumb(e,t){this.crumbs.add({type:"custom",message:e,timestamp:Date.now(),data:t})}};var F=class{constructor(e=500){this.events=[];this.observer=null;this.cleanups=[];if(this.maxEvents=e,typeof crypto!="undefined"&&crypto.randomUUID)this.sessionId=crypto.randomUUID();else{let t=new Uint32Array(4);crypto.getRandomValues(t),this.sessionId=Array.from(t).map(i=>i.toString(16).padStart(8,"0")).join("")}}push(e){this.events.length>=this.maxEvents&&this.events.shift(),this.events.push(e)}start(){if(typeof window=="undefined")return;this.observer=new MutationObserver(a=>{var s;for(let c of a)this.push({type:"dom_mutation",timestamp:performance.now(),data:{kind:c.type,tag:(s=c.target.tagName)!=null?s:"unknown",added:c.addedNodes.length,removed:c.removedNodes.length}})}),this.observer.observe(document.body,{childList:!0,subtree:!0,attributes:!0});let e=a=>{let s=a.target;this.push({type:"click",timestamp:performance.now(),data:{tag:s.tagName,label:(s.getAttribute("aria-label")||s.id||"").slice(0,60)}})};document.addEventListener("click",e,{passive:!0,capture:!0}),this.cleanups.push(()=>document.removeEventListener("click",e,!0));let t=a=>{let s=a.target;this.push({type:"input",timestamp:performance.now(),data:{name:(s.name||s.id||s.type||"field").slice(0,60)}})};document.addEventListener("input",t,{passive:!0}),this.cleanups.push(()=>document.removeEventListener("input",t));let i=0,r=()=>{let a=performance.now();a-i<500||(i=a,this.push({type:"scroll",timestamp:a,data:{x:window.scrollX,y:window.scrollY}}))};document.addEventListener("scroll",r,{passive:!0}),this.cleanups.push(()=>document.removeEventListener("scroll",r));let o=0,u=()=>{let a=performance.now();a-o<1e3||(o=a,this.push({type:"resize",timestamp:a,data:{w:window.innerWidth,h:window.innerHeight}}))};window.addEventListener("resize",u,{passive:!0}),this.cleanups.push(()=>window.removeEventListener("resize",u))}stop(){var e;(e=this.observer)==null||e.disconnect(),this.observer=null,this.cleanups.forEach(t=>t()),this.cleanups=[]}getEvents(){return[...this.events]}getSessionId(){return this.sessionId}};async function ve(n,e){var r;n.stop();let t=n.getEvents();if(!t.length)return;let i=(r=e.endpoint)!=null?r:"https://bluewhaleops.com";try{await fetch(i+"/api/ingest/replay",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+e.apiKey},body:JSON.stringify({session_id:n.getSessionId(),venture_id:e.ventureId,events:t,event_count:t.length,page_url:typeof window!="undefined"?window.location.href:""}),keepalive:!0})}catch(o){}}var l=null;function qe(n){l=new S(n),l.init()}function Oe(n,e){if(!l)return;let t=n instanceof Error?n:new Error(String(n));l.capture(v({error_type:t.name,message:t.message,stack:t.stack,source:"browser"},e))}function Ue(n,e){l==null||l.addBreadcrumb(n,e)}function We(n){l==null||l.setUser(n)}0&&(module.exports={BlueWhaleClient,SessionRecorder,addBreadcrumb,captureError,init,setUser,stopAndFlushReplay});
1
+ "use strict";var C=Object.defineProperty,be=Object.defineProperties,Ee=Object.getOwnPropertyDescriptor,Te=Object.getOwnPropertyDescriptors,Se=Object.getOwnPropertyNames,Z=Object.getOwnPropertySymbols;var te=Object.prototype.hasOwnProperty,ke=Object.prototype.propertyIsEnumerable;var ee=(n,e,t)=>e in n?C(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,l=(n,e)=>{for(var t in e||(e={}))te.call(e,t)&&ee(n,t,e[t]);if(Z)for(var t of Z(e))ke.call(e,t)&&ee(n,t,e[t]);return n},P=(n,e)=>be(n,Te(e));var Ce=(n,e)=>()=>(n&&(e=n(n=0)),e);var ne=(n,e)=>{for(var t in e)C(n,t,{get:e[t],enumerable:!0})},Pe=(n,e,t,i)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Se(e))!te.call(n,r)&&r!==t&&C(n,r,{get:()=>e[r],enumerable:!(i=Ee(e,r))||i.enumerable});return n};var Ie=n=>Pe(C({},"__esModule",{value:!0}),n);var ge={};ne(ge,{CLSThresholds:()=>$,FCPThresholds:()=>V,FIDThresholds:()=>z,INPThresholds:()=>W,LCPThresholds:()=>j,TTFBThresholds:()=>K,getCLS:()=>Ae,getFCP:()=>de,getFID:()=>Be,getINP:()=>qe,getLCP:()=>Me,getTTFB:()=>Ue,onCLS:()=>Ae,onFCP:()=>de,onFID:()=>Be,onINP:()=>qe,onLCP:()=>Me,onTTFB:()=>Ue});var v,T,ue,A,O,ce,y,H,F,p,b,h,J,B,G,w,re,R,ie,xe,X,S,V,de,$,Ae,E,Re,oe,le,Fe,fe,z,Be,pe,M,x,_e,he,De,W,me,se,g,N,ae,qe,j,U,Me,K,Ne,Ue,ve=Ce(()=>{"use strict";ce=-1,y=function(n){addEventListener("pageshow",(function(e){e.persisted&&(ce=e.timeStamp,n(e))}),!0)},H=function(){return window.performance&&performance.getEntriesByType&&performance.getEntriesByType("navigation")[0]},F=function(){var n=H();return n&&n.activationStart||0},p=function(n,e){var t=H(),i="navigate";return ce>=0?i="back-forward-cache":t&&(document.prerendering||F()>0?i="prerender":document.wasDiscarded?i="restore":t.type&&(i=t.type.replace(/_/g,"-"))),{name:n,value:e===void 0?-1:e,rating:"good",delta:0,entries:[],id:"v3-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:i}},b=function(n,e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(n)){var i=new PerformanceObserver((function(r){Promise.resolve().then((function(){e(r.getEntries())}))}));return i.observe(Object.assign({type:n,buffered:!0},t||{})),i}}catch(r){}},h=function(n,e,t,i){var r,o;return function(u){e.value>=0&&(u||i)&&((o=e.value-(r||0))||r===void 0)&&(r=e.value,e.delta=o,e.rating=(function(s,a){return s>a[1]?"poor":s>a[0]?"needs-improvement":"good"})(e.value,t),n(e))}},J=function(n){requestAnimationFrame((function(){return requestAnimationFrame((function(){return n()}))}))},B=function(n){var e=function(t){t.type!=="pagehide"&&document.visibilityState!=="hidden"||n(t)};addEventListener("visibilitychange",e,!0),addEventListener("pagehide",e,!0)},G=function(n){var e=!1;return function(t){e||(n(t),e=!0)}},w=-1,re=function(){return document.visibilityState!=="hidden"||document.prerendering?1/0:0},R=function(n){document.visibilityState==="hidden"&&w>-1&&(w=n.type==="visibilitychange"?n.timeStamp:0,xe())},ie=function(){addEventListener("visibilitychange",R,!0),addEventListener("prerenderingchange",R,!0)},xe=function(){removeEventListener("visibilitychange",R,!0),removeEventListener("prerenderingchange",R,!0)},X=function(){return w<0&&(w=re(),ie(),y((function(){setTimeout((function(){w=re(),ie()}),0)}))),{get firstHiddenTime(){return w}}},S=function(n){document.prerendering?addEventListener("prerenderingchange",(function(){return n()}),!0):n()},V=[1800,3e3],de=function(n,e){e=e||{},S((function(){var t,i=X(),r=p("FCP"),o=b("paint",(function(u){u.forEach((function(s){s.name==="first-contentful-paint"&&(o.disconnect(),s.startTime<i.firstHiddenTime&&(r.value=Math.max(s.startTime-F(),0),r.entries.push(s),t(!0)))}))}));o&&(t=h(n,r,V,e.reportAllChanges),y((function(u){r=p("FCP"),t=h(n,r,V,e.reportAllChanges),J((function(){r.value=performance.now()-u.timeStamp,t(!0)}))})))}))},$=[.1,.25],Ae=function(n,e){e=e||{},de(G((function(){var t,i=p("CLS",0),r=0,o=[],u=function(a){a.forEach((function(c){if(!c.hadRecentInput){var m=o[0],q=o[o.length-1];r&&c.startTime-q.startTime<1e3&&c.startTime-m.startTime<5e3?(r+=c.value,o.push(c)):(r=c.value,o=[c])}})),r>i.value&&(i.value=r,i.entries=o,t())},s=b("layout-shift",u);s&&(t=h(n,i,$,e.reportAllChanges),B((function(){u(s.takeRecords()),t(!0)})),y((function(){r=0,i=p("CLS",0),t=h(n,i,$,e.reportAllChanges),J((function(){return t()}))})),setTimeout(t,0))})))},E={passive:!0,capture:!0},Re=new Date,oe=function(n,e){v||(v=e,T=n,ue=new Date,fe(removeEventListener),le())},le=function(){if(T>=0&&T<ue-Re){var n={entryType:"first-input",name:v.type,target:v.target,cancelable:v.cancelable,startTime:v.timeStamp,processingStart:v.timeStamp+T};A.forEach((function(e){e(n)})),A=[]}},Fe=function(n){if(n.cancelable){var e=(n.timeStamp>1e12?new Date:performance.now())-n.timeStamp;n.type=="pointerdown"?(function(t,i){var r=function(){oe(t,i),u()},o=function(){u()},u=function(){removeEventListener("pointerup",r,E),removeEventListener("pointercancel",o,E)};addEventListener("pointerup",r,E),addEventListener("pointercancel",o,E)})(e,n):oe(e,n)}},fe=function(n){["mousedown","keydown","touchstart","pointerdown"].forEach((function(e){return n(e,Fe,E)}))},z=[100,300],Be=function(n,e){e=e||{},S((function(){var t,i=X(),r=p("FID"),o=function(a){a.startTime<i.firstHiddenTime&&(r.value=a.processingStart-a.startTime,r.entries.push(a),t(!0))},u=function(a){a.forEach(o)},s=b("first-input",u);t=h(n,r,z,e.reportAllChanges),s&&B(G((function(){u(s.takeRecords()),s.disconnect()}))),s&&y((function(){var a;r=p("FID"),t=h(n,r,z,e.reportAllChanges),A=[],T=-1,v=null,fe(addEventListener),a=o,A.push(a),le()}))}))},pe=0,M=1/0,x=0,_e=function(n){n.forEach((function(e){e.interactionId&&(M=Math.min(M,e.interactionId),x=Math.max(x,e.interactionId),pe=x?(x-M)/7+1:0)}))},he=function(){return O?pe:performance.interactionCount||0},De=function(){"interactionCount"in performance||O||(O=b("event",_e,{type:"event",buffered:!0,durationThreshold:0}))},W=[200,500],me=0,se=function(){return he()-me},g=[],N={},ae=function(n){var e=g[g.length-1],t=N[n.interactionId];if(t||g.length<10||n.duration>e.latency){if(t)t.entries.push(n),t.latency=Math.max(t.latency,n.duration);else{var i={id:n.interactionId,latency:n.duration,entries:[n]};N[i.id]=i,g.push(i)}g.sort((function(r,o){return o.latency-r.latency})),g.splice(10).forEach((function(r){delete N[r.id]}))}},qe=function(n,e){e=e||{},S((function(){var t;De();var i,r=p("INP"),o=function(s){s.forEach((function(m){m.interactionId&&ae(m),m.entryType==="first-input"&&!g.some((function(q){return q.entries.some((function(Q){return m.duration===Q.duration&&m.startTime===Q.startTime}))}))&&ae(m)}));var a,c=(a=Math.min(g.length-1,Math.floor(se()/50)),g[a]);c&&c.latency!==r.value&&(r.value=c.latency,r.entries=c.entries,i())},u=b("event",o,{durationThreshold:(t=e.durationThreshold)!==null&&t!==void 0?t:40});i=h(n,r,W,e.reportAllChanges),u&&("PerformanceEventTiming"in window&&"interactionId"in PerformanceEventTiming.prototype&&u.observe({type:"first-input",buffered:!0}),B((function(){o(u.takeRecords()),r.value<0&&se()>0&&(r.value=0,r.entries=[]),i(!0)})),y((function(){g=[],me=he(),r=p("INP"),i=h(n,r,W,e.reportAllChanges)})))}))},j=[2500,4e3],U={},Me=function(n,e){e=e||{},S((function(){var t,i=X(),r=p("LCP"),o=function(a){var c=a[a.length-1];c&&c.startTime<i.firstHiddenTime&&(r.value=Math.max(c.startTime-F(),0),r.entries=[c],t())},u=b("largest-contentful-paint",o);if(u){t=h(n,r,j,e.reportAllChanges);var s=G((function(){U[r.id]||(o(u.takeRecords()),u.disconnect(),U[r.id]=!0,t(!0))}));["keydown","click"].forEach((function(a){addEventListener(a,(function(){return setTimeout(s,0)}),!0)})),B(s),y((function(a){r=p("LCP"),t=h(n,r,j,e.reportAllChanges),J((function(){r.value=performance.now()-a.timeStamp,U[r.id]=!0,t(!0)}))}))}}))},K=[800,1800],Ne=function n(e){document.prerendering?S((function(){return n(e)})):document.readyState!=="complete"?addEventListener("load",(function(){return n(e)}),!0):setTimeout(e,0)},Ue=function(n,e){e=e||{};var t=p("TTFB"),i=h(n,t,K,e.reportAllChanges);Ne((function(){var r=H();if(r){var o=r.responseStart;if(o<=0||o>performance.now())return;t.value=Math.max(o-F(),0),t.entries=[r],i(!0),y((function(){t=p("TTFB",0),(i=h(n,t,K,e.reportAllChanges))(!0)}))}}))}});var Qe={};ne(Qe,{BlueWhaleClient:()=>k,SessionRecorder:()=>D,addBreadcrumb:()=>Xe,captureError:()=>Ge,getFeatureVariant:()=>Je,identify:()=>je,init:()=>ze,isFeatureEnabled:()=>He,page:()=>Ke,setUser:()=>Ye,stopAndFlushReplay:()=>we,track:()=>We});module.exports=Ie(Qe);var I=class{constructor(e=50){this.buffer=[];this.max=e}add(e){this.buffer.push(e),this.buffer.length>this.max&&this.buffer.shift()}flush(){return[...this.buffer]}instrument(){if(typeof window=="undefined")return;let e=history.pushState.bind(history);history.pushState=(...i)=>{var r;return this.add({type:"navigation",message:`\u2192 ${(r=i[2])!=null?r:""}`,timestamp:Date.now()}),e(...i)},["log","warn","error","info"].forEach(i=>{let r=console[i].bind(console);console[i]=(...o)=>{let u=i==="log"?"info":i;this.add({type:"console",category:i,message:o.map(String).join(" ").slice(0,300),level:u,timestamp:Date.now()}),r(...o)}});let t=window.fetch.bind(window);window.fetch=async(i,r)=>{var a;let o=typeof i=="string"?i:i instanceof URL?i.href:i.url,u=(a=r==null?void 0:r.method)!=null?a:"GET",s=Date.now();try{let c=await t(i,r);return this.add({type:"fetch",category:"http",message:`${u} ${o}`,level:c.ok?"info":"warn",timestamp:s,data:{status:c.status,duration_ms:Date.now()-s}}),c}catch(c){throw this.add({type:"fetch",category:"http",message:`${u} ${o} failed`,level:"error",timestamp:s,data:{error:String(c)}}),c}},document.addEventListener("click",i=>{var u;let r=i.target;if(!r)return;let o=r.getAttribute("aria-label")||((u=r.innerText)==null?void 0:u.slice(0,60))||r.tagName;this.add({type:"click",message:o,timestamp:Date.now()})},{passive:!0,capture:!0})}};var Le="1.0.0",L=class{constructor(e,t){this.queue=[];this.flushing=!1;this.endpoint=e,this.apiKey=t}enqueue(e){this.queue.length>=20&&this.queue.shift(),this.queue.push(P(l({},e),{sdk_version:Le})),this.flush()}async flush(){if(this.flushing||this.queue.length===0)return;this.flushing=!0;let e=this.queue.shift();try{await fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(e),keepalive:!0})}catch(t){}finally{this.flushing=!1,this.queue.length>0&&this.flush()}}};function ye(n){typeof window!="undefined"&&Promise.resolve().then(()=>(ve(),ge)).then(({onLCP:e,onCLS:t,onINP:i,onFCP:r,onTTFB:o})=>{[e,t,i,r,o].forEach(u=>{try{u(s=>n(s.name,s.value,s.rating))}catch(s){}})}).catch(()=>{})}var Oe="https://bluewhaleops.com/api/ingest/error",k=class{constructor(e){this.initialized=!1;this.config=l({endpoint:Oe,environment:"production",release:"",maxBreadcrumbs:50,silent:!1,ventureId:""},e),this.crumbs=new I(this.config.maxBreadcrumbs),this.transport=new L(this.config.endpoint,this.config.apiKey)}init(){this.initialized||typeof window=="undefined"||(this.initialized=!0,this.crumbs.instrument(),window.addEventListener("error",e=>{var t,i,r;this.capture({error_type:(i=(t=e.error)==null?void 0:t.name)!=null?i:"Error",message:e.message||"Unknown error",stack:(r=e.error)==null?void 0:r.stack,url:window.location.href,source:"browser"})}),window.addEventListener("unhandledrejection",e=>{var i,r;let t=e.reason;this.capture({error_type:(i=t==null?void 0:t.name)!=null?i:"UnhandledRejection",message:(r=t==null?void 0:t.message)!=null?r:String(t),stack:t==null?void 0:t.stack,url:window.location.href,source:"browser"})}),ye((e,t,i)=>{this.capture({error_type:"WebVital",message:e+": "+t.toFixed(1),source:"browser",tags:{vital:e,rating:i,value:String(Math.round(t))}})}))}capture(e){let t=P(l({error_type:"Error"},e),{user_agent:typeof navigator!="undefined"?navigator.userAgent:void 0,environment:this.config.environment,release:this.config.release||void 0,venture_id:this.config.ventureId||void 0,breadcrumbs:this.crumbs.flush()});if(this.config.beforeSend){let i=this.config.beforeSend(t);if(i===!1)return;t=i}this.transport.enqueue(t)}setUser(e){this._userId=e}addBreadcrumb(e,t){this.crumbs.add({type:"custom",message:e,timestamp:Date.now(),data:t})}};var Ve="1.2.0";function Y(){if(typeof localStorage=="undefined")return"anon";let n=localStorage.getItem("_bw_anon");return n||(n=Array.from(crypto.getRandomValues(new Uint8Array(16))).map(e=>e.toString(16).padStart(2,"0")).join(""),localStorage.setItem("_bw_anon",n)),n}function $e(){if(typeof sessionStorage=="undefined")return"";let n=sessionStorage.getItem("_bw_session");return n||(n=Array.from(crypto.getRandomValues(new Uint8Array(8))).map(e=>e.toString(16).padStart(2,"0")).join(""),sessionStorage.setItem("_bw_session",n)),n}var _=class{constructor(e){this.userProps={};this.queue=[];this.flushTimer=null;this.flagCache=new Map;this.config=l({endpoint:"https://bluewhaleops.com",environment:"production",orgId:"",autoPageView:!0,ventureId:""},e)}init(){if(typeof window!="undefined"&&this.config.autoPageView){this.page();let e=history.pushState.bind(history);history.pushState=(...t)=>{e(...t),setTimeout(()=>this.page(),0)},window.addEventListener("popstate",()=>this.page())}}identify(e,t){this.userId=e,this.userProps=t!=null?t:{},this.track("$identify",l({},t))}page(e){this.track("$pageview",l({url:typeof window!="undefined"?window.location.href:void 0,referrer:typeof document!="undefined"?document.referrer:void 0,title:typeof document!="undefined"?document.title:void 0},e))}track(e,t){let i={event_name:e,user_id:this.userId,anonymous_id:Y(),session_id:$e(),url:typeof window!="undefined"?window.location.href:void 0,properties:l(l({},this.userProps),t),venture_id:this.config.ventureId||void 0,environment:this.config.environment,sdk_version:Ve,timestamp:typeof performance!="undefined"?Date.now():void 0};this.queue.push(i),this.scheduleFlush()}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>this.flush(),500))}async flush(){if(this.flushTimer=null,!this.queue.length)return;let e=this.queue.splice(0,50);try{await fetch(`${this.config.endpoint}/api/ingest/event`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:JSON.stringify({events:e}),keepalive:!0})}catch(t){}this.queue.length&&this.flush()}async isFeatureEnabled(e,t){return(await this.evaluateFlag(e,t)).enabled}async getFeatureVariant(e,t){return(await this.evaluateFlag(e,t)).variant}async evaluateFlag(e,t){var o;let i=`${e}:${(o=t!=null?t:this.userId)!=null?o:Y()}`,r=this.flagCache.get(i);if(r&&r.expires>Date.now())return r.result;if(!this.config.orgId)return{enabled:!1,variant:null};try{let u=t!=null?t:this.userId,s=Y(),a=new URLSearchParams(l({key:e,org_id:this.config.orgId},u?{user_id:u}:{anonymous_id:s})),m=await(await fetch(`${this.config.endpoint}/api/features?${a}`)).json();return this.flagCache.set(i,{result:m,expires:Date.now()+6e4}),m}catch(u){return{enabled:!1,variant:null}}}};var D=class{constructor(e=500){this.events=[];this.observer=null;this.cleanups=[];if(this.maxEvents=e,typeof crypto!="undefined"&&crypto.randomUUID)this.sessionId=crypto.randomUUID();else{let t=new Uint32Array(4);crypto.getRandomValues(t),this.sessionId=Array.from(t).map(i=>i.toString(16).padStart(8,"0")).join("")}}push(e){this.events.length>=this.maxEvents&&this.events.shift(),this.events.push(e)}start(){if(typeof window=="undefined")return;this.observer=new MutationObserver(s=>{var a;for(let c of s)this.push({type:"dom_mutation",timestamp:performance.now(),data:{kind:c.type,tag:(a=c.target.tagName)!=null?a:"unknown",added:c.addedNodes.length,removed:c.removedNodes.length}})}),this.observer.observe(document.body,{childList:!0,subtree:!0,attributes:!0});let e=s=>{let a=s.target;this.push({type:"click",timestamp:performance.now(),data:{tag:a.tagName,label:(a.getAttribute("aria-label")||a.id||"").slice(0,60)}})};document.addEventListener("click",e,{passive:!0,capture:!0}),this.cleanups.push(()=>document.removeEventListener("click",e,!0));let t=s=>{let a=s.target;this.push({type:"input",timestamp:performance.now(),data:{name:(a.name||a.id||a.type||"field").slice(0,60)}})};document.addEventListener("input",t,{passive:!0}),this.cleanups.push(()=>document.removeEventListener("input",t));let i=0,r=()=>{let s=performance.now();s-i<500||(i=s,this.push({type:"scroll",timestamp:s,data:{x:window.scrollX,y:window.scrollY}}))};document.addEventListener("scroll",r,{passive:!0}),this.cleanups.push(()=>document.removeEventListener("scroll",r));let o=0,u=()=>{let s=performance.now();s-o<1e3||(o=s,this.push({type:"resize",timestamp:s,data:{w:window.innerWidth,h:window.innerHeight}}))};window.addEventListener("resize",u,{passive:!0}),this.cleanups.push(()=>window.removeEventListener("resize",u))}stop(){var e;(e=this.observer)==null||e.disconnect(),this.observer=null,this.cleanups.forEach(t=>t()),this.cleanups=[]}getEvents(){return[...this.events]}getSessionId(){return this.sessionId}};async function we(n,e){var r;n.stop();let t=n.getEvents();if(!t.length)return;let i=(r=e.endpoint)!=null?r:"https://bluewhaleops.com";try{await fetch(i+"/api/ingest/replay",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+e.apiKey},body:JSON.stringify({session_id:n.getSessionId(),venture_id:e.ventureId,events:t,event_count:t.length,page_url:typeof window!="undefined"?window.location.href:""}),keepalive:!0})}catch(o){}}var f=null,d=null;function ze(n){f=new k(n),f.init(),d=new _(l({},n)),d.init()}function We(n,e){d==null||d.track(n,e)}function je(n,e){d==null||d.identify(n,e),f==null||f.setUser(n)}function Ke(n){d==null||d.page(n)}function He(n,e){var t;return(t=d==null?void 0:d.isFeatureEnabled(n,e))!=null?t:Promise.resolve(!1)}function Je(n,e){var t;return(t=d==null?void 0:d.getFeatureVariant(n,e))!=null?t:Promise.resolve(null)}function Ge(n,e){if(!f)return;let t=n instanceof Error?n:new Error(String(n));f.capture(l({error_type:t.name,message:t.message,stack:t.stack,source:"browser"},e))}function Xe(n,e){f==null||f.addBreadcrumb(n,e)}function Ye(n){f==null||f.setUser(n)}0&&(module.exports={BlueWhaleClient,SessionRecorder,addBreadcrumb,captureError,getFeatureVariant,identify,init,isFeatureEnabled,page,setUser,stopAndFlushReplay,track});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/web-vitals/dist/web-vitals.js","../src/index.ts","../src/breadcrumbs.ts","../src/transport.ts","../src/vitals.ts","../src/core.ts","../src/replay.ts"],"sourcesContent":["var e,n,t,i,r,a=-1,o=function(e){addEventListener(\"pageshow\",(function(n){n.persisted&&(a=n.timeStamp,e(n))}),!0)},c=function(){return window.performance&&performance.getEntriesByType&&performance.getEntriesByType(\"navigation\")[0]},u=function(){var e=c();return e&&e.activationStart||0},f=function(e,n){var t=c(),i=\"navigate\";a>=0?i=\"back-forward-cache\":t&&(document.prerendering||u()>0?i=\"prerender\":document.wasDiscarded?i=\"restore\":t.type&&(i=t.type.replace(/_/g,\"-\")));return{name:e,value:void 0===n?-1:n,rating:\"good\",delta:0,entries:[],id:\"v3-\".concat(Date.now(),\"-\").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:i}},s=function(e,n,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){var i=new PerformanceObserver((function(e){Promise.resolve().then((function(){n(e.getEntries())}))}));return i.observe(Object.assign({type:e,buffered:!0},t||{})),i}}catch(e){}},d=function(e,n,t,i){var r,a;return function(o){n.value>=0&&(o||i)&&((a=n.value-(r||0))||void 0===r)&&(r=n.value,n.delta=a,n.rating=function(e,n){return e>n[1]?\"poor\":e>n[0]?\"needs-improvement\":\"good\"}(n.value,t),e(n))}},l=function(e){requestAnimationFrame((function(){return requestAnimationFrame((function(){return e()}))}))},p=function(e){var n=function(n){\"pagehide\"!==n.type&&\"hidden\"!==document.visibilityState||e(n)};addEventListener(\"visibilitychange\",n,!0),addEventListener(\"pagehide\",n,!0)},v=function(e){var n=!1;return function(t){n||(e(t),n=!0)}},m=-1,h=function(){return\"hidden\"!==document.visibilityState||document.prerendering?1/0:0},g=function(e){\"hidden\"===document.visibilityState&&m>-1&&(m=\"visibilitychange\"===e.type?e.timeStamp:0,T())},y=function(){addEventListener(\"visibilitychange\",g,!0),addEventListener(\"prerenderingchange\",g,!0)},T=function(){removeEventListener(\"visibilitychange\",g,!0),removeEventListener(\"prerenderingchange\",g,!0)},E=function(){return m<0&&(m=h(),y(),o((function(){setTimeout((function(){m=h(),y()}),0)}))),{get firstHiddenTime(){return m}}},C=function(e){document.prerendering?addEventListener(\"prerenderingchange\",(function(){return e()}),!0):e()},L=[1800,3e3],w=function(e,n){n=n||{},C((function(){var t,i=E(),r=f(\"FCP\"),a=s(\"paint\",(function(e){e.forEach((function(e){\"first-contentful-paint\"===e.name&&(a.disconnect(),e.startTime<i.firstHiddenTime&&(r.value=Math.max(e.startTime-u(),0),r.entries.push(e),t(!0)))}))}));a&&(t=d(e,r,L,n.reportAllChanges),o((function(i){r=f(\"FCP\"),t=d(e,r,L,n.reportAllChanges),l((function(){r.value=performance.now()-i.timeStamp,t(!0)}))})))}))},b=[.1,.25],S=function(e,n){n=n||{},w(v((function(){var t,i=f(\"CLS\",0),r=0,a=[],c=function(e){e.forEach((function(e){if(!e.hadRecentInput){var n=a[0],t=a[a.length-1];r&&e.startTime-t.startTime<1e3&&e.startTime-n.startTime<5e3?(r+=e.value,a.push(e)):(r=e.value,a=[e])}})),r>i.value&&(i.value=r,i.entries=a,t())},u=s(\"layout-shift\",c);u&&(t=d(e,i,b,n.reportAllChanges),p((function(){c(u.takeRecords()),t(!0)})),o((function(){r=0,i=f(\"CLS\",0),t=d(e,i,b,n.reportAllChanges),l((function(){return t()}))})),setTimeout(t,0))})))},A={passive:!0,capture:!0},I=new Date,P=function(i,r){e||(e=r,n=i,t=new Date,k(removeEventListener),F())},F=function(){if(n>=0&&n<t-I){var r={entryType:\"first-input\",name:e.type,target:e.target,cancelable:e.cancelable,startTime:e.timeStamp,processingStart:e.timeStamp+n};i.forEach((function(e){e(r)})),i=[]}},M=function(e){if(e.cancelable){var n=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;\"pointerdown\"==e.type?function(e,n){var t=function(){P(e,n),r()},i=function(){r()},r=function(){removeEventListener(\"pointerup\",t,A),removeEventListener(\"pointercancel\",i,A)};addEventListener(\"pointerup\",t,A),addEventListener(\"pointercancel\",i,A)}(n,e):P(n,e)}},k=function(e){[\"mousedown\",\"keydown\",\"touchstart\",\"pointerdown\"].forEach((function(n){return e(n,M,A)}))},D=[100,300],x=function(t,r){r=r||{},C((function(){var a,c=E(),u=f(\"FID\"),l=function(e){e.startTime<c.firstHiddenTime&&(u.value=e.processingStart-e.startTime,u.entries.push(e),a(!0))},m=function(e){e.forEach(l)},h=s(\"first-input\",m);a=d(t,u,D,r.reportAllChanges),h&&p(v((function(){m(h.takeRecords()),h.disconnect()}))),h&&o((function(){var o;u=f(\"FID\"),a=d(t,u,D,r.reportAllChanges),i=[],n=-1,e=null,k(addEventListener),o=l,i.push(o),F()}))}))},B=0,R=1/0,H=0,N=function(e){e.forEach((function(e){e.interactionId&&(R=Math.min(R,e.interactionId),H=Math.max(H,e.interactionId),B=H?(H-R)/7+1:0)}))},O=function(){return r?B:performance.interactionCount||0},q=function(){\"interactionCount\"in performance||r||(r=s(\"event\",N,{type:\"event\",buffered:!0,durationThreshold:0}))},j=[200,500],_=0,z=function(){return O()-_},G=[],J={},K=function(e){var n=G[G.length-1],t=J[e.interactionId];if(t||G.length<10||e.duration>n.latency){if(t)t.entries.push(e),t.latency=Math.max(t.latency,e.duration);else{var i={id:e.interactionId,latency:e.duration,entries:[e]};J[i.id]=i,G.push(i)}G.sort((function(e,n){return n.latency-e.latency})),G.splice(10).forEach((function(e){delete J[e.id]}))}},Q=function(e,n){n=n||{},C((function(){var t;q();var i,r=f(\"INP\"),a=function(e){e.forEach((function(e){(e.interactionId&&K(e),\"first-input\"===e.entryType)&&(!G.some((function(n){return n.entries.some((function(n){return e.duration===n.duration&&e.startTime===n.startTime}))}))&&K(e))}));var n,t=(n=Math.min(G.length-1,Math.floor(z()/50)),G[n]);t&&t.latency!==r.value&&(r.value=t.latency,r.entries=t.entries,i())},c=s(\"event\",a,{durationThreshold:null!==(t=n.durationThreshold)&&void 0!==t?t:40});i=d(e,r,j,n.reportAllChanges),c&&(\"PerformanceEventTiming\"in window&&\"interactionId\"in PerformanceEventTiming.prototype&&c.observe({type:\"first-input\",buffered:!0}),p((function(){a(c.takeRecords()),r.value<0&&z()>0&&(r.value=0,r.entries=[]),i(!0)})),o((function(){G=[],_=O(),r=f(\"INP\"),i=d(e,r,j,n.reportAllChanges)})))}))},U=[2500,4e3],V={},W=function(e,n){n=n||{},C((function(){var t,i=E(),r=f(\"LCP\"),a=function(e){var n=e[e.length-1];n&&n.startTime<i.firstHiddenTime&&(r.value=Math.max(n.startTime-u(),0),r.entries=[n],t())},c=s(\"largest-contentful-paint\",a);if(c){t=d(e,r,U,n.reportAllChanges);var m=v((function(){V[r.id]||(a(c.takeRecords()),c.disconnect(),V[r.id]=!0,t(!0))}));[\"keydown\",\"click\"].forEach((function(e){addEventListener(e,(function(){return setTimeout(m,0)}),!0)})),p(m),o((function(i){r=f(\"LCP\"),t=d(e,r,U,n.reportAllChanges),l((function(){r.value=performance.now()-i.timeStamp,V[r.id]=!0,t(!0)}))}))}}))},X=[800,1800],Y=function e(n){document.prerendering?C((function(){return e(n)})):\"complete\"!==document.readyState?addEventListener(\"load\",(function(){return e(n)}),!0):setTimeout(n,0)},Z=function(e,n){n=n||{};var t=f(\"TTFB\"),i=d(e,t,X,n.reportAllChanges);Y((function(){var r=c();if(r){var a=r.responseStart;if(a<=0||a>performance.now())return;t.value=Math.max(a-u(),0),t.entries=[r],i(!0),o((function(){t=f(\"TTFB\",0),(i=d(e,t,X,n.reportAllChanges))(!0)}))}}))};export{b as CLSThresholds,L as FCPThresholds,D as FIDThresholds,j as INPThresholds,U as LCPThresholds,X as TTFBThresholds,S as getCLS,w as getFCP,x as getFID,Q as getINP,W as getLCP,Z as getTTFB,S as onCLS,w as onFCP,x as onFID,Q as onINP,W as onLCP,Z as onTTFB};\n","import { BlueWhaleClient } from './core';\nimport type { BlueWhaleConfig, ErrorEvent, Breadcrumb } from './types';\n\nexport type { BlueWhaleConfig, ErrorEvent, Breadcrumb };\n\nlet _client: BlueWhaleClient | null = null;\n\n/**\n * Initialize BLUEWHALE error capture.\n * Call once — typically in your app's entry point or _app.tsx.\n *\n * @example\n * import { init } from '@bluewhaleops/browser';\n * init({ apiKey: 'bw_agent_xxx', ventureId: 'your-venture-uuid' });\n */\nexport function init(config: BlueWhaleConfig): void {\n _client = new BlueWhaleClient(config);\n _client.init();\n}\n\n/**\n * Manually capture an error or exception.\n */\nexport function captureError(err: unknown, extra?: Partial<ErrorEvent>): void {\n if (!_client) return;\n const e = err instanceof Error ? err : new Error(String(err));\n _client.capture({\n error_type: e.name,\n message: e.message,\n stack: e.stack,\n source: 'browser',\n ...extra,\n });\n}\n\n/**\n * Add a manual breadcrumb.\n */\nexport function addBreadcrumb(message: string, data?: Record<string, unknown>): void {\n _client?.addBreadcrumb(message, data);\n}\n\n/**\n * Tag the current user for error reports.\n */\nexport function setUser(userId: string): void {\n _client?.setUser(userId);\n}\n\nexport { BlueWhaleClient };\n\n// Session replay\nexport { SessionRecorder, stopAndFlushReplay } from './replay';\nexport type { ReplayEvent } from './replay';\n","import type { Breadcrumb } from './types';\n\nexport class BreadcrumbBuffer {\n private buffer: Breadcrumb[] = [];\n private max: number;\n\n constructor(max = 50) {\n this.max = max;\n }\n\n add(crumb: Breadcrumb): void {\n this.buffer.push(crumb);\n if (this.buffer.length > this.max) this.buffer.shift();\n }\n\n flush(): Breadcrumb[] {\n return [...this.buffer];\n }\n\n instrument(): void {\n if (typeof window === 'undefined') return;\n\n // Navigation breadcrumbs\n const origPushState = history.pushState.bind(history);\n history.pushState = (...args) => {\n this.add({ type: 'navigation', message: `→ ${args[2] ?? ''}`, timestamp: Date.now() });\n return origPushState(...args);\n };\n\n // Console breadcrumbs\n (['log', 'warn', 'error', 'info'] as const).forEach((method) => {\n const orig = console[method].bind(console);\n console[method] = (...args: unknown[]) => {\n const level = method === 'log' ? 'info' : method as 'warn' | 'error' | 'info';\n this.add({\n type: 'console',\n category: method,\n message: args.map(String).join(' ').slice(0, 300),\n level,\n timestamp: Date.now(),\n });\n orig(...args);\n };\n });\n\n // Fetch breadcrumbs\n const origFetch = window.fetch.bind(window);\n window.fetch = async (input, init) => {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n const method = init?.method ?? 'GET';\n const start = Date.now();\n try {\n const res = await origFetch(input, init);\n this.add({\n type: 'fetch',\n category: 'http',\n message: `${method} ${url}`,\n level: res.ok ? 'info' : 'warn',\n timestamp: start,\n data: { status: res.status, duration_ms: Date.now() - start },\n });\n return res;\n } catch (err) {\n this.add({\n type: 'fetch',\n category: 'http',\n message: `${method} ${url} failed`,\n level: 'error',\n timestamp: start,\n data: { error: String(err) },\n });\n throw err;\n }\n };\n\n // Click breadcrumbs (top-level only, lightweight)\n document.addEventListener('click', (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n const label = target.getAttribute('aria-label') || target.innerText?.slice(0, 60) || target.tagName;\n this.add({ type: 'click', message: label, timestamp: Date.now() });\n }, { passive: true, capture: true });\n }\n}\n","import type { ErrorEvent } from './types';\n\nconst SDK_VERSION = '1.0.0';\n\nexport class Transport {\n private endpoint: string;\n private apiKey: string;\n private queue: ErrorEvent[] = [];\n private flushing = false;\n\n constructor(endpoint: string, apiKey: string) {\n this.endpoint = endpoint;\n this.apiKey = apiKey;\n }\n\n enqueue(event: ErrorEvent): void {\n // Cap queue at 20 to avoid memory bloat\n if (this.queue.length >= 20) this.queue.shift();\n this.queue.push({ ...event, sdk_version: SDK_VERSION });\n this.flush();\n }\n\n private async flush(): Promise<void> {\n if (this.flushing || this.queue.length === 0) return;\n this.flushing = true;\n const event = this.queue.shift()!;\n try {\n await fetch(this.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(event),\n keepalive: true, // survives page unload\n });\n } catch {\n // Silent fail — don't error-loop\n } finally {\n this.flushing = false;\n if (this.queue.length > 0) this.flush();\n }\n }\n}\n","export function captureWebVitals(\n send: (name: string, value: number, rating: string) => void\n): void {\n if (typeof window === 'undefined') return;\n import('web-vitals').then(({ onLCP, onCLS, onINP, onFCP, onTTFB }) => {\n [onLCP, onCLS, onINP, onFCP, onTTFB].forEach(fn => {\n try {\n fn((m: { name: string; value: number; rating: string }) =>\n send(m.name, m.value, m.rating)\n );\n } catch {}\n });\n }).catch(() => {});\n}\n","import type { BlueWhaleConfig, ErrorEvent, ErrorSource } from './types';\nimport { BreadcrumbBuffer } from './breadcrumbs';\nimport { Transport } from './transport';\nimport { captureWebVitals } from './vitals';\n\nconst DEFAULT_ENDPOINT = 'https://bluewhaleops.com/api/ingest/error';\n\nexport class BlueWhaleClient {\n private config: Required<Omit<BlueWhaleConfig, 'beforeSend'>> & Pick<BlueWhaleConfig, 'beforeSend'>;\n private crumbs: BreadcrumbBuffer;\n private transport: Transport;\n private initialized = false;\n\n constructor(config: BlueWhaleConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n environment: 'production',\n release: '',\n maxBreadcrumbs: 50,\n silent: false,\n ventureId: '',\n ...config,\n };\n this.crumbs = new BreadcrumbBuffer(this.config.maxBreadcrumbs);\n this.transport = new Transport(this.config.endpoint, this.config.apiKey);\n }\n\n init(): void {\n if (this.initialized || typeof window === 'undefined') return;\n this.initialized = true;\n\n this.crumbs.instrument();\n\n // Global JS errors\n window.addEventListener('error', (e) => {\n this.capture({\n error_type: e.error?.name ?? 'Error',\n message: e.message || 'Unknown error',\n stack: e.error?.stack,\n url: window.location.href,\n source: 'browser',\n });\n });\n\n // Unhandled promise rejections\n window.addEventListener('unhandledrejection', (e) => {\n const err = e.reason;\n this.capture({\n error_type: err?.name ?? 'UnhandledRejection',\n message: err?.message ?? String(err),\n stack: err?.stack,\n url: window.location.href,\n source: 'browser',\n });\n });\n\n // Web Vitals — LCP, CLS, INP, FCP, TTFB\n captureWebVitals((name, value, rating) => {\n this.capture({\n error_type: 'WebVital',\n message: name + ': ' + value.toFixed(1),\n source: 'browser',\n tags: { vital: name, rating, value: String(Math.round(value)) },\n });\n });\n }\n\n capture(partial: Partial<ErrorEvent> & { message: string; source: ErrorSource }): void {\n let event: ErrorEvent = {\n error_type: 'Error',\n ...partial,\n user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n environment: this.config.environment,\n release: this.config.release || undefined,\n venture_id: this.config.ventureId || undefined,\n breadcrumbs: this.crumbs.flush(),\n };\n\n if (this.config.beforeSend) {\n const result = this.config.beforeSend(event);\n if (result === false) return;\n event = result;\n }\n\n this.transport.enqueue(event);\n }\n\n setUser(userId: string): void {\n // Store for next capture — patch via a tag\n (this as unknown as Record<string, unknown>)._userId = userId;\n }\n\n addBreadcrumb(message: string, data?: Record<string, unknown>): void {\n this.crumbs.add({ type: 'custom', message, timestamp: Date.now(), data });\n }\n}\n","export interface ReplayEvent {\n type: 'dom_mutation' | 'click' | 'input' | 'scroll' | 'resize' | 'navigation';\n timestamp: number;\n data: Record<string, unknown>;\n}\n\nexport class SessionRecorder {\n private events: ReplayEvent[] = [];\n private maxEvents: number;\n private sessionId: string;\n private observer: MutationObserver | null = null;\n private cleanups: Array<() => void> = [];\n\n constructor(maxEvents = 500) {\n this.maxEvents = maxEvents;\n // Edge-compatible random ID — no Math.random, use crypto if available\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n this.sessionId = crypto.randomUUID();\n } else {\n const a = new Uint32Array(4);\n crypto.getRandomValues(a);\n this.sessionId = Array.from(a).map(n => n.toString(16).padStart(8, '0')).join('');\n }\n }\n\n private push(ev: ReplayEvent): void {\n if (this.events.length >= this.maxEvents) this.events.shift();\n this.events.push(ev);\n }\n\n start(): void {\n if (typeof window === 'undefined') return;\n\n // DOM mutations — structure only, never content\n this.observer = new MutationObserver((mutations) => {\n for (const m of mutations) {\n this.push({\n type: 'dom_mutation',\n timestamp: performance.now(),\n data: {\n kind: m.type,\n tag: (m.target as Element).tagName ?? 'unknown',\n added: m.addedNodes.length,\n removed: m.removedNodes.length,\n },\n });\n }\n });\n this.observer.observe(document.body, { childList: true, subtree: true, attributes: true });\n\n // Click — tag + label only\n const onClick = (e: Event) => {\n const t = e.target as HTMLElement;\n this.push({\n type: 'click',\n timestamp: performance.now(),\n data: { tag: t.tagName, label: (t.getAttribute('aria-label') || t.id || '').slice(0, 60) },\n });\n };\n document.addEventListener('click', onClick, { passive: true, capture: true });\n this.cleanups.push(() => document.removeEventListener('click', onClick, true));\n\n // Input — field name ONLY, never value (privacy)\n const onInput = (e: Event) => {\n const t = e.target as HTMLInputElement;\n this.push({\n type: 'input',\n timestamp: performance.now(),\n data: { name: (t.name || t.id || t.type || 'field').slice(0, 60) },\n });\n };\n document.addEventListener('input', onInput, { passive: true });\n this.cleanups.push(() => document.removeEventListener('input', onInput));\n\n // Scroll — throttled 500ms\n let lastScroll = 0;\n const onScroll = () => {\n const now = performance.now();\n if (now - lastScroll < 500) return;\n lastScroll = now;\n this.push({ type: 'scroll', timestamp: now, data: { x: window.scrollX, y: window.scrollY } });\n };\n document.addEventListener('scroll', onScroll, { passive: true });\n this.cleanups.push(() => document.removeEventListener('scroll', onScroll));\n\n // Resize — throttled 1000ms\n let lastResize = 0;\n const onResize = () => {\n const now = performance.now();\n if (now - lastResize < 1000) return;\n lastResize = now;\n this.push({ type: 'resize', timestamp: now, data: { w: window.innerWidth, h: window.innerHeight } });\n };\n window.addEventListener('resize', onResize, { passive: true });\n this.cleanups.push(() => window.removeEventListener('resize', onResize));\n }\n\n stop(): void {\n this.observer?.disconnect();\n this.observer = null;\n this.cleanups.forEach(fn => fn());\n this.cleanups = [];\n }\n\n getEvents(): ReplayEvent[] { return [...this.events]; }\n getSessionId(): string { return this.sessionId; }\n}\n\nexport async function stopAndFlushReplay(\n recorder: SessionRecorder,\n opts: { apiKey: string; endpoint?: string; ventureId?: string },\n): Promise<void> {\n recorder.stop();\n const events = recorder.getEvents();\n if (!events.length) return;\n const base = opts.endpoint ?? 'https://bluewhaleops.com';\n try {\n await fetch(base + '/api/ingest/replay', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: 'Bearer ' + opts.apiKey,\n },\n body: JSON.stringify({\n session_id: recorder.getSessionId(),\n venture_id: opts.ventureId,\n events,\n event_count: events.length,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n }),\n keepalive: true,\n });\n } catch {}\n}\n"],"mappings":"qzBAAA,IAAAA,GAAA,GAAAC,EAAAD,GAAA,mBAAAE,EAAA,kBAAAC,EAAA,kBAAAC,EAAA,kBAAAC,EAAA,kBAAAC,EAAA,mBAAAC,EAAA,WAAAC,GAAA,WAAAC,GAAA,WAAAC,GAAA,WAAAC,GAAA,WAAAC,GAAA,YAAAC,GAAA,UAAAL,GAAA,UAAAC,GAAA,UAAAC,GAAA,UAAAC,GAAA,UAAAC,GAAA,WAAAC,KAAA,IAAIC,EAAEC,EAAEC,GAAEC,EAAEC,EAAEC,GAAKC,EAAgGC,EAAqHC,EAAuDC,EAAuWC,EAA+PC,EAA4NC,EAA2GC,EAA6KC,EAA2DC,EAAKC,GAAqFC,EAA4GC,GAAoGC,GAA0GC,EAA+HC,EAA4GhC,EAAaM,GAAmaP,EAAWM,GAA+f4B,EAA0BC,GAAWC,GAAoEC,GAA2MC,GAAqWC,GAA0GrC,EAAYM,GAAibgC,GAAIC,EAAMC,EAAIC,GAAwIC,GAAyDC,GAAmH1C,EAAY2C,GAAIC,GAA2BC,EAAKC,EAAKC,GAA6VzC,GAAmzBL,EAAa+C,EAAKzC,GAA0kBL,EAAa+C,GAA2KzC,GAAx8M0C,GAAAC,GAAA,kBAAcrC,GAAE,GAAGC,EAAE,SAASN,EAAE,CAAC,iBAAiB,YAAY,SAASC,EAAE,CAACA,EAAE,YAAYI,GAAEJ,EAAE,UAAUD,EAAEC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAEM,EAAE,UAAU,CAAC,OAAO,OAAO,aAAa,YAAY,kBAAkB,YAAY,iBAAiB,YAAY,EAAE,CAAC,CAAC,EAAEC,EAAE,UAAU,CAAC,IAAIR,EAAEO,EAAE,EAAE,OAAOP,GAAGA,EAAE,iBAAiB,CAAC,EAAES,EAAE,SAAST,EAAEC,EAAE,CAAC,IAAI,EAAEM,EAAE,EAAE,EAAE,WAAW,OAAAF,IAAG,EAAE,EAAE,qBAAqB,IAAI,SAAS,cAAcG,EAAE,EAAE,EAAE,EAAE,YAAY,SAAS,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,KAAK,QAAQ,KAAK,GAAG,IAAU,CAAC,KAAKR,EAAE,MAAeC,IAAT,OAAW,GAAGA,EAAE,OAAO,OAAO,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,MAAM,OAAO,KAAK,IAAI,EAAE,GAAG,EAAE,OAAO,KAAK,MAAM,cAAc,KAAK,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,EAAES,EAAE,SAASV,EAAEC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,oBAAoB,oBAAoB,SAASD,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,qBAAqB,SAASA,EAAE,CAAC,QAAQ,QAAQ,EAAE,MAAM,UAAU,CAACC,EAAED,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,OAAO,OAAO,CAAC,KAAKA,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAOA,EAAE,CAAC,CAAC,EAAEW,EAAE,SAASX,EAAEC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAEI,EAAE,OAAO,SAASC,EAAE,CAACL,EAAE,OAAO,IAAIK,GAAG,MAAMD,EAAEJ,EAAE,OAAO,GAAG,KAAc,IAAT,UAAc,EAAEA,EAAE,MAAMA,EAAE,MAAMI,EAAEJ,EAAE,QAAO,SAASD,EAAEC,EAAE,CAAC,OAAOD,EAAEC,EAAE,CAAC,EAAE,OAAOD,EAAEC,EAAE,CAAC,EAAE,oBAAoB,MAAM,GAAEA,EAAE,MAAM,CAAC,EAAED,EAAEC,CAAC,EAAE,CAAC,EAAEW,EAAE,SAASZ,EAAE,CAAC,uBAAuB,UAAU,CAAC,OAAO,uBAAuB,UAAU,CAAC,OAAOA,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAEa,EAAE,SAASb,EAAE,CAAC,IAAIC,EAAE,SAASA,EAAE,CAAcA,EAAE,OAAf,YAAgC,SAAS,kBAApB,UAAqCD,EAAEC,CAAC,CAAC,EAAE,iBAAiB,mBAAmBA,EAAE,EAAE,EAAE,iBAAiB,WAAWA,EAAE,EAAE,CAAC,EAAEa,EAAE,SAASd,EAAE,CAAC,IAAIC,EAAE,GAAG,OAAO,SAAS,EAAE,CAACA,IAAID,EAAE,CAAC,EAAEC,EAAE,GAAG,CAAC,EAAEc,EAAE,GAAGC,GAAE,UAAU,CAAC,OAAiB,SAAS,kBAApB,UAAqC,SAAS,aAAa,IAAI,CAAC,EAAEC,EAAE,SAASjB,EAAE,CAAY,SAAS,kBAApB,UAAqCe,EAAE,KAAKA,EAAuBf,EAAE,OAAvB,mBAA4BA,EAAE,UAAU,EAAEmB,GAAE,EAAE,EAAED,GAAE,UAAU,CAAC,iBAAiB,mBAAmBD,EAAE,EAAE,EAAE,iBAAiB,qBAAqBA,EAAE,EAAE,CAAC,EAAEE,GAAE,UAAU,CAAC,oBAAoB,mBAAmBF,EAAE,EAAE,EAAE,oBAAoB,qBAAqBA,EAAE,EAAE,CAAC,EAAEG,EAAE,UAAU,CAAC,OAAOL,EAAE,IAAIA,EAAEC,GAAE,EAAEE,GAAE,EAAEZ,GAAG,UAAU,CAAC,YAAY,UAAU,CAACS,EAAEC,GAAE,EAAEE,GAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,iBAAiB,CAAC,OAAOH,CAAC,CAAC,CAAC,EAAEM,EAAE,SAASrB,EAAE,CAAC,SAAS,aAAa,iBAAiB,sBAAsB,UAAU,CAAC,OAAOA,EAAE,CAAC,GAAG,EAAE,EAAEA,EAAE,CAAC,EAAEX,EAAE,CAAC,KAAK,GAAG,EAAEM,GAAE,SAASK,EAAEC,EAAE,CAACA,EAAEA,GAAG,CAAC,EAAEoB,GAAG,UAAU,CAAC,IAAI,EAAE,EAAED,EAAE,EAAE,EAAEX,EAAE,KAAK,EAAEJ,EAAEK,EAAE,SAAS,SAASV,EAAE,CAACA,EAAE,SAAS,SAASA,EAAE,CAA4BA,EAAE,OAA7B,2BAAoCK,EAAE,WAAW,EAAEL,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,KAAK,IAAIA,EAAE,UAAUQ,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAKR,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAEK,IAAI,EAAEM,EAAEX,EAAE,EAAEX,EAAEY,EAAE,gBAAgB,EAAEK,GAAG,SAASH,EAAE,CAAC,EAAEM,EAAE,KAAK,EAAE,EAAEE,EAAEX,EAAE,EAAEX,EAAEY,EAAE,gBAAgB,EAAEW,GAAG,UAAU,CAAC,EAAE,MAAM,YAAY,IAAI,EAAET,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAEf,EAAE,CAAC,GAAG,GAAG,EAAEM,GAAE,SAASM,EAAEC,EAAE,CAACA,EAAEA,GAAG,CAAC,EAAEN,GAAEmB,GAAG,UAAU,CAAC,IAAI,EAAE,EAAEL,EAAE,MAAM,CAAC,EAAE,EAAE,EAAEJ,EAAE,CAAC,EAAEE,EAAE,SAASP,EAAE,CAACA,EAAE,SAAS,SAASA,EAAE,CAAC,GAAG,CAACA,EAAE,eAAe,CAAC,IAAIC,EAAEI,EAAE,CAAC,EAAEH,EAAEG,EAAEA,EAAE,OAAO,CAAC,EAAE,GAAGL,EAAE,UAAUE,EAAE,UAAU,KAAKF,EAAE,UAAUC,EAAE,UAAU,KAAK,GAAGD,EAAE,MAAMK,EAAE,KAAKL,CAAC,IAAI,EAAEA,EAAE,MAAMK,EAAE,CAACL,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQK,EAAE,EAAE,EAAE,EAAEG,EAAEE,EAAE,eAAeH,CAAC,EAAEC,IAAI,EAAEG,EAAEX,EAAE,EAAEZ,EAAEa,EAAE,gBAAgB,EAAEY,GAAG,UAAU,CAACN,EAAEC,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAEF,GAAG,UAAU,CAAC,EAAE,EAAE,EAAEG,EAAE,MAAM,CAAC,EAAE,EAAEE,EAAEX,EAAE,EAAEZ,EAAEa,EAAE,gBAAgB,EAAEW,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAEU,EAAE,CAAC,QAAQ,GAAG,QAAQ,EAAE,EAAEC,GAAE,IAAI,KAAKC,GAAE,SAASrB,EAAEC,EAAE,CAACJ,IAAIA,EAAEI,EAAEH,EAAEE,EAAED,GAAE,IAAI,KAAKyB,GAAE,mBAAmB,EAAEF,GAAE,EAAE,EAAEA,GAAE,UAAU,CAAC,GAAGxB,GAAG,GAAGA,EAAEC,GAAEqB,GAAE,CAAC,IAAInB,EAAE,CAAC,UAAU,cAAc,KAAKJ,EAAE,KAAK,OAAOA,EAAE,OAAO,WAAWA,EAAE,WAAW,UAAUA,EAAE,UAAU,gBAAgBA,EAAE,UAAUC,CAAC,EAAEE,EAAE,SAAS,SAAS,EAAE,CAAC,EAAEC,CAAC,CAAC,EAAE,EAAED,EAAE,CAAC,CAAC,CAAC,EAAEuB,GAAE,SAAS1B,EAAE,CAAC,GAAGA,EAAE,WAAW,CAAC,IAAIC,GAAGD,EAAE,UAAU,KAAK,IAAI,KAAK,YAAY,IAAI,GAAGA,EAAE,UAAyBA,EAAE,MAAjB,eAAsB,SAASA,EAAEC,EAAE,CAAC,IAAIC,EAAE,UAAU,CAACsB,GAAExB,EAAEC,CAAC,EAAEG,EAAE,CAAC,EAAED,EAAE,UAAU,CAACC,EAAE,CAAC,EAAEA,EAAE,UAAU,CAAC,oBAAoB,YAAYF,EAAEoB,CAAC,EAAE,oBAAoB,gBAAgBnB,EAAEmB,CAAC,CAAC,EAAE,iBAAiB,YAAYpB,EAAEoB,CAAC,EAAE,iBAAiB,gBAAgBnB,EAAEmB,CAAC,CAAC,GAAErB,EAAED,CAAC,EAAEwB,GAAEvB,EAAED,CAAC,CAAC,CAAC,EAAE2B,GAAE,SAAS3B,EAAE,CAAC,CAAC,YAAY,UAAU,aAAa,aAAa,EAAE,SAAS,SAASC,EAAE,CAAC,OAAOD,EAAEC,EAAEyB,GAAEJ,CAAC,CAAC,EAAE,CAAC,EAAEhC,EAAE,CAAC,IAAI,GAAG,EAAEM,GAAE,SAASM,EAAEE,EAAE,CAACA,EAAEA,GAAG,CAAC,EAAEiB,GAAG,UAAU,CAAC,IAAIhB,EAAEE,EAAEa,EAAE,EAAEZ,EAAEC,EAAE,KAAK,EAAEG,EAAE,SAASZ,EAAE,CAACA,EAAE,UAAUO,EAAE,kBAAkBC,EAAE,MAAMR,EAAE,gBAAgBA,EAAE,UAAUQ,EAAE,QAAQ,KAAKR,CAAC,EAAEK,EAAE,EAAE,EAAE,EAAEU,EAAE,SAASf,EAAE,CAACA,EAAE,QAAQY,CAAC,CAAC,EAAEI,EAAEN,EAAE,cAAcK,CAAC,EAAEV,EAAEM,EAAET,EAAEM,EAAElB,EAAEc,EAAE,gBAAgB,EAAEY,GAAGH,EAAEC,GAAG,UAAU,CAACC,EAAEC,EAAE,YAAY,CAAC,EAAEA,EAAE,WAAW,CAAC,EAAE,CAAC,EAAEA,GAAGV,GAAG,UAAU,CAAC,IAAIA,EAAEE,EAAEC,EAAE,KAAK,EAAEJ,EAAEM,EAAET,EAAEM,EAAElB,EAAEc,EAAE,gBAAgB,EAAED,EAAE,CAAC,EAAEF,EAAE,GAAGD,EAAE,KAAK2B,GAAE,gBAAgB,EAAErB,EAAEM,EAAET,EAAE,KAAKG,CAAC,EAAEmB,GAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAEG,GAAE,EAAEC,EAAE,IAAIC,EAAE,EAAEC,GAAE,SAAS/B,EAAE,CAACA,EAAE,SAAS,SAAS,EAAE,CAAC,EAAE,gBAAgB6B,EAAE,KAAK,IAAIA,EAAE,EAAE,aAAa,EAAEC,EAAE,KAAK,IAAIA,EAAE,EAAE,aAAa,EAAEF,GAAEE,GAAGA,EAAED,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAEG,GAAE,UAAU,CAAC,OAAO5B,EAAEwB,GAAE,YAAY,kBAAkB,CAAC,EAAEK,GAAE,UAAU,CAAC,qBAAqB,aAAa7B,IAAIA,EAAEM,EAAE,QAAQqB,GAAE,CAAC,KAAK,QAAQ,SAAS,GAAG,kBAAkB,CAAC,CAAC,EAAE,EAAExC,EAAE,CAAC,IAAI,GAAG,EAAE2C,GAAE,EAAEC,GAAE,UAAU,CAAC,OAAOH,GAAE,EAAEE,EAAC,EAAEE,EAAE,CAAC,EAAEC,EAAE,CAAC,EAAEC,GAAE,SAAStC,EAAE,CAAC,IAAIC,EAAEmC,EAAEA,EAAE,OAAO,CAAC,EAAE,EAAEC,EAAErC,EAAE,aAAa,EAAE,GAAG,GAAGoC,EAAE,OAAO,IAAIpC,EAAE,SAASC,EAAE,QAAQ,CAAC,GAAG,EAAE,EAAE,QAAQ,KAAKD,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,EAAE,QAAQA,EAAE,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,GAAGA,EAAE,cAAc,QAAQA,EAAE,SAAS,QAAQ,CAACA,CAAC,CAAC,EAAEqC,EAAE,EAAE,EAAE,EAAE,EAAED,EAAE,KAAK,CAAC,CAAC,CAACA,EAAE,MAAM,SAASpC,EAAEC,EAAE,CAAC,OAAOA,EAAE,QAAQD,EAAE,OAAO,EAAE,EAAEoC,EAAE,OAAO,EAAE,EAAE,SAAS,SAASpC,EAAE,CAAC,OAAOqC,EAAErC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAEH,GAAE,SAASG,EAAEC,EAAE,CAACA,EAAEA,GAAG,CAAC,EAAEoB,GAAG,UAAU,CAAC,IAAI,EAAEY,GAAE,EAAE,IAAI,EAAE,EAAExB,EAAE,KAAK,EAAEJ,EAAE,SAASL,EAAE,CAACA,EAAE,SAAS,SAASA,EAAE,CAAEA,EAAE,eAAesC,GAAEtC,CAAC,EAAkBA,EAAE,YAAlB,eAA+B,CAACoC,EAAE,MAAM,SAASnC,EAAE,CAAC,OAAOA,EAAE,QAAQ,MAAM,SAASA,EAAE,CAAC,OAAOD,EAAE,WAAWC,EAAE,UAAUD,EAAE,YAAYC,EAAE,SAAS,EAAE,CAAC,EAAE,GAAGqC,GAAEtC,CAAC,CAAE,EAAE,EAAE,IAAIC,EAAEC,GAAGD,EAAE,KAAK,IAAImC,EAAE,OAAO,EAAE,KAAK,MAAMD,GAAE,EAAE,EAAE,CAAC,EAAEC,EAAEnC,CAAC,GAAGC,GAAGA,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQA,EAAE,QAAQ,EAAE,EAAE,EAAEK,EAAEG,EAAE,QAAQL,EAAE,CAAC,mBAA0B,EAAEJ,EAAE,qBAAZ,MAAyC,IAAT,OAAW,EAAE,EAAE,CAAC,EAAE,EAAEU,EAAEX,EAAE,EAAET,EAAEU,EAAE,gBAAgB,EAAEM,IAAI,2BAA2B,QAAQ,kBAAkB,uBAAuB,WAAWA,EAAE,QAAQ,CAAC,KAAK,cAAc,SAAS,EAAE,CAAC,EAAEM,GAAG,UAAU,CAACR,EAAEE,EAAE,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG4B,GAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE7B,GAAG,UAAU,CAAC8B,EAAE,CAAC,EAAEF,GAAEF,GAAE,EAAE,EAAEvB,EAAE,KAAK,EAAE,EAAEE,EAAEX,EAAE,EAAET,EAAEU,EAAE,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAET,EAAE,CAAC,KAAK,GAAG,EAAE+C,EAAE,CAAC,EAAEzC,GAAE,SAASE,EAAEC,EAAE,CAACA,EAAEA,GAAG,CAAC,EAAEoB,GAAG,UAAU,CAAC,IAAI,EAAE,EAAED,EAAE,EAAE,EAAEX,EAAE,KAAK,EAAEJ,EAAE,SAASL,EAAE,CAAC,IAAIC,EAAED,EAAEA,EAAE,OAAO,CAAC,EAAEC,GAAGA,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,KAAK,IAAIA,EAAE,UAAUO,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,CAACP,CAAC,EAAE,EAAE,EAAE,EAAEM,EAAEG,EAAE,2BAA2BL,CAAC,EAAE,GAAGE,EAAE,CAAC,EAAEI,EAAEX,EAAE,EAAER,EAAES,EAAE,gBAAgB,EAAE,IAAIc,EAAED,GAAG,UAAU,CAACyB,EAAE,EAAE,EAAE,IAAIlC,EAAEE,EAAE,YAAY,CAAC,EAAEA,EAAE,WAAW,EAAEgC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,OAAO,EAAE,SAAS,SAASvC,EAAE,CAAC,iBAAiBA,GAAG,UAAU,CAAC,OAAO,WAAWe,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAEF,EAAEE,CAAC,EAAET,GAAG,SAASH,EAAE,CAAC,EAAEM,EAAE,KAAK,EAAE,EAAEE,EAAEX,EAAE,EAAER,EAAES,EAAE,gBAAgB,EAAEW,GAAG,UAAU,CAAC,EAAE,MAAM,YAAY,IAAI,EAAET,EAAE,UAAUoC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE9C,EAAE,CAAC,IAAI,IAAI,EAAE+C,GAAE,SAASxC,EAAEC,EAAE,CAAC,SAAS,aAAaoB,GAAG,UAAU,CAAC,OAAOrB,EAAEC,CAAC,CAAC,EAAE,EAAe,SAAS,aAAtB,WAAiC,iBAAiB,QAAQ,UAAU,CAAC,OAAOD,EAAEC,CAAC,CAAC,GAAG,EAAE,EAAE,WAAWA,EAAE,CAAC,CAAC,EAAEF,GAAE,SAASC,EAAEC,EAAE,CAACA,EAAEA,GAAG,CAAC,EAAE,IAAI,EAAEQ,EAAE,MAAM,EAAE,EAAEE,EAAEX,EAAE,EAAEP,EAAEQ,EAAE,gBAAgB,EAAEuC,IAAG,UAAU,CAAC,IAAI,EAAEjC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAIF,EAAE,EAAE,cAAc,GAAGA,GAAG,GAAGA,EAAE,YAAY,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,IAAIA,EAAEG,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,EAAEF,GAAG,UAAU,CAAC,EAAEG,EAAE,OAAO,CAAC,GAAG,EAAEE,EAAEX,EAAE,EAAEP,EAAEQ,EAAE,gBAAgB,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,ICA1tN,IAAA0C,GAAA,GAAAC,EAAAD,GAAA,qBAAAE,EAAA,oBAAAC,EAAA,kBAAAC,GAAA,iBAAAC,GAAA,SAAAC,GAAA,YAAAC,GAAA,uBAAAC,KAAA,eAAAC,GAAAT,ICEO,IAAMU,EAAN,KAAuB,CAI5B,YAAYC,EAAM,GAAI,CAHtB,KAAQ,OAAuB,CAAC,EAI9B,KAAK,IAAMA,CACb,CAEA,IAAIC,EAAyB,CAC3B,KAAK,OAAO,KAAKA,CAAK,EAClB,KAAK,OAAO,OAAS,KAAK,KAAK,KAAK,OAAO,MAAM,CACvD,CAEA,OAAsB,CACpB,MAAO,CAAC,GAAG,KAAK,MAAM,CACxB,CAEA,YAAmB,CACjB,GAAI,OAAO,QAAW,YAAa,OAGnC,IAAMC,EAAgB,QAAQ,UAAU,KAAK,OAAO,EACpD,QAAQ,UAAY,IAAIC,IAAS,CAxBrC,IAAAC,EAyBM,YAAK,IAAI,CAAE,KAAM,aAAc,QAAS,WAAKA,EAAAD,EAAK,CAAC,IAAN,KAAAC,EAAW,EAAE,GAAI,UAAW,KAAK,IAAI,CAAE,CAAC,EAC9EF,EAAc,GAAGC,CAAI,CAC9B,EAGC,CAAC,MAAO,OAAQ,QAAS,MAAM,EAAY,QAASE,GAAW,CAC9D,IAAMC,EAAO,QAAQD,CAAM,EAAE,KAAK,OAAO,EACzC,QAAQA,CAAM,EAAI,IAAIF,IAAoB,CACxC,IAAMI,EAAQF,IAAW,MAAQ,OAASA,EAC1C,KAAK,IAAI,CACP,KAAM,UACN,SAAUA,EACV,QAASF,EAAK,IAAI,MAAM,EAAE,KAAK,GAAG,EAAE,MAAM,EAAG,GAAG,EAChD,MAAAI,EACA,UAAW,KAAK,IAAI,CACtB,CAAC,EACDD,EAAK,GAAGH,CAAI,CACd,CACF,CAAC,EAGD,IAAMK,EAAY,OAAO,MAAM,KAAK,MAAM,EAC1C,OAAO,MAAQ,MAAOC,EAAOC,IAAS,CA/C1C,IAAAN,EAgDM,IAAMO,EAAM,OAAOF,GAAU,SAAWA,EAAQA,aAAiB,IAAMA,EAAM,KAAOA,EAAM,IACpFJ,GAASD,EAAAM,GAAA,YAAAA,EAAM,SAAN,KAAAN,EAAgB,MACzBQ,EAAQ,KAAK,IAAI,EACvB,GAAI,CACF,IAAMC,EAAM,MAAML,EAAUC,EAAOC,CAAI,EACvC,YAAK,IAAI,CACP,KAAM,QACN,SAAU,OACV,QAAS,GAAGL,CAAM,IAAIM,CAAG,GACzB,MAAOE,EAAI,GAAK,OAAS,OACzB,UAAWD,EACX,KAAM,CAAE,OAAQC,EAAI,OAAQ,YAAa,KAAK,IAAI,EAAID,CAAM,CAC9D,CAAC,EACMC,CACT,OAASC,EAAK,CACZ,WAAK,IAAI,CACP,KAAM,QACN,SAAU,OACV,QAAS,GAAGT,CAAM,IAAIM,CAAG,UACzB,MAAO,QACP,UAAWC,EACX,KAAM,CAAE,MAAO,OAAOE,CAAG,CAAE,CAC7B,CAAC,EACKA,CACR,CACF,EAGA,SAAS,iBAAiB,QAAUC,GAAM,CA5E9C,IAAAX,EA6EM,IAAMY,EAASD,EAAE,OACjB,GAAI,CAACC,EAAQ,OACb,IAAMC,EAAQD,EAAO,aAAa,YAAY,KAAKZ,EAAAY,EAAO,YAAP,YAAAZ,EAAkB,MAAM,EAAG,MAAOY,EAAO,QAC5F,KAAK,IAAI,CAAE,KAAM,QAAS,QAASC,EAAO,UAAW,KAAK,IAAI,CAAE,CAAC,CACnE,EAAG,CAAE,QAAS,GAAM,QAAS,EAAK,CAAC,CACrC,CACF,ECjFA,IAAMC,GAAc,QAEPC,EAAN,KAAgB,CAMrB,YAAYC,EAAkBC,EAAgB,CAH9C,KAAQ,MAAsB,CAAC,EAC/B,KAAQ,SAAW,GAGjB,KAAK,SAAWD,EAChB,KAAK,OAASC,CAChB,CAEA,QAAQC,EAAyB,CAE3B,KAAK,MAAM,QAAU,IAAI,KAAK,MAAM,MAAM,EAC9C,KAAK,MAAM,KAAKC,EAAAC,EAAA,GAAKF,GAAL,CAAY,YAAaJ,EAAY,EAAC,EACtD,KAAK,MAAM,CACb,CAEA,MAAc,OAAuB,CACnC,GAAI,KAAK,UAAY,KAAK,MAAM,SAAW,EAAG,OAC9C,KAAK,SAAW,GAChB,IAAMI,EAAQ,KAAK,MAAM,MAAM,EAC/B,GAAI,CACF,MAAM,MAAM,KAAK,SAAU,CACzB,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,cAAe,UAAU,KAAK,MAAM,EACtC,EACA,KAAM,KAAK,UAAUA,CAAK,EAC1B,UAAW,EACb,CAAC,CACH,OAAQG,EAAA,CAER,QAAE,CACA,KAAK,SAAW,GACZ,KAAK,MAAM,OAAS,GAAG,KAAK,MAAM,CACxC,CACF,CACF,EC3CO,SAASC,GACdC,EACM,CACF,OAAO,QAAW,aACtB,sCAAqB,KAAK,CAAC,CAAE,MAAAC,EAAO,MAAAC,EAAO,MAAAC,EAAO,MAAAC,EAAO,OAAAC,CAAO,IAAM,CACpE,CAACJ,EAAOC,EAAOC,EAAOC,EAAOC,CAAM,EAAE,QAAQC,GAAM,CACjD,GAAI,CACFA,EAAIC,GACFP,EAAKO,EAAE,KAAMA,EAAE,MAAOA,EAAE,MAAM,CAChC,CACF,OAAQC,EAAA,CAAC,CACX,CAAC,CACH,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,CACnB,CCRA,IAAMC,GAAmB,4CAEZC,EAAN,KAAsB,CAM3B,YAAYC,EAAyB,CAFrC,KAAQ,YAAc,GAGpB,KAAK,OAASC,EAAA,CACZ,SAAUH,GACV,YAAa,aACb,QAAS,GACT,eAAgB,GAChB,OAAQ,GACR,UAAW,IACRE,GAEL,KAAK,OAAS,IAAIE,EAAiB,KAAK,OAAO,cAAc,EAC7D,KAAK,UAAY,IAAIC,EAAU,KAAK,OAAO,SAAU,KAAK,OAAO,MAAM,CACzE,CAEA,MAAa,CACP,KAAK,aAAe,OAAO,QAAW,cAC1C,KAAK,YAAc,GAEnB,KAAK,OAAO,WAAW,EAGvB,OAAO,iBAAiB,QAAU,GAAM,CAlC5C,IAAAC,EAAAC,EAAAC,EAmCM,KAAK,QAAQ,CACX,YAAYD,GAAAD,EAAA,EAAE,QAAF,YAAAA,EAAS,OAAT,KAAAC,EAAiB,QAC7B,QAAS,EAAE,SAAW,gBACtB,OAAOC,EAAA,EAAE,QAAF,YAAAA,EAAS,MAChB,IAAK,OAAO,SAAS,KACrB,OAAQ,SACV,CAAC,CACH,CAAC,EAGD,OAAO,iBAAiB,qBAAuB,GAAM,CA7CzD,IAAAF,EAAAC,EA8CM,IAAME,EAAM,EAAE,OACd,KAAK,QAAQ,CACX,YAAYH,EAAAG,GAAA,YAAAA,EAAK,OAAL,KAAAH,EAAa,qBACzB,SAASC,EAAAE,GAAA,YAAAA,EAAK,UAAL,KAAAF,EAAgB,OAAOE,CAAG,EACnC,MAAOA,GAAA,YAAAA,EAAK,MACZ,IAAK,OAAO,SAAS,KACrB,OAAQ,SACV,CAAC,CACH,CAAC,EAGDC,GAAiB,CAACC,EAAMC,EAAOC,IAAW,CACxC,KAAK,QAAQ,CACX,WAAY,WACZ,QAASF,EAAO,KAAOC,EAAM,QAAQ,CAAC,EACtC,OAAQ,UACR,KAAM,CAAE,MAAOD,EAAM,OAAAE,EAAQ,MAAO,OAAO,KAAK,MAAMD,CAAK,CAAC,CAAE,CAChE,CAAC,CACH,CAAC,EACH,CAEA,QAAQE,EAA+E,CACrF,IAAIC,EAAoBC,EAAAb,EAAA,CACtB,WAAY,SACTW,GAFmB,CAGtB,WAAY,OAAO,WAAc,YAAc,UAAU,UAAY,OACrE,YAAa,KAAK,OAAO,YACzB,QAAS,KAAK,OAAO,SAAW,OAChC,WAAY,KAAK,OAAO,WAAa,OACrC,YAAa,KAAK,OAAO,MAAM,CACjC,GAEA,GAAI,KAAK,OAAO,WAAY,CAC1B,IAAMG,EAAS,KAAK,OAAO,WAAWF,CAAK,EAC3C,GAAIE,IAAW,GAAO,OACtBF,EAAQE,CACV,CAEA,KAAK,UAAU,QAAQF,CAAK,CAC9B,CAEA,QAAQG,EAAsB,CAE3B,KAA4C,QAAUA,CACzD,CAEA,cAAcC,EAAiBC,EAAsC,CACnE,KAAK,OAAO,IAAI,CAAE,KAAM,SAAU,QAAAD,EAAS,UAAW,KAAK,IAAI,EAAG,KAAAC,CAAK,CAAC,CAC1E,CACF,ECzFO,IAAMC,EAAN,KAAsB,CAO3B,YAAYC,EAAY,IAAK,CAN7B,KAAQ,OAAwB,CAAC,EAGjC,KAAQ,SAAoC,KAC5C,KAAQ,SAA8B,CAAC,EAKrC,GAFA,KAAK,UAAYA,EAEb,OAAO,QAAW,aAAe,OAAO,WAC1C,KAAK,UAAY,OAAO,WAAW,MAC9B,CACL,IAAMC,EAAI,IAAI,YAAY,CAAC,EAC3B,OAAO,gBAAgBA,CAAC,EACxB,KAAK,UAAY,MAAM,KAAKA,CAAC,EAAE,IAAIC,GAAKA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAClF,CACF,CAEQ,KAAKC,EAAuB,CAC9B,KAAK,OAAO,QAAU,KAAK,WAAW,KAAK,OAAO,MAAM,EAC5D,KAAK,OAAO,KAAKA,CAAE,CACrB,CAEA,OAAc,CACZ,GAAI,OAAO,QAAW,YAAa,OAGnC,KAAK,SAAW,IAAI,iBAAkBC,GAAc,CAlCxD,IAAAC,EAmCM,QAAWC,KAAKF,EACd,KAAK,KAAK,CACR,KAAM,eACN,UAAW,YAAY,IAAI,EAC3B,KAAM,CACJ,KAAME,EAAE,KACR,KAAMD,EAAAC,EAAE,OAAmB,UAArB,KAAAD,EAAgC,UACtC,MAAOC,EAAE,WAAW,OACpB,QAASA,EAAE,aAAa,MAC1B,CACF,CAAC,CAEL,CAAC,EACD,KAAK,SAAS,QAAQ,SAAS,KAAM,CAAE,UAAW,GAAM,QAAS,GAAM,WAAY,EAAK,CAAC,EAGzF,IAAMC,EAAWC,GAAa,CAC5B,IAAMC,EAAID,EAAE,OACZ,KAAK,KAAK,CACR,KAAM,QACN,UAAW,YAAY,IAAI,EAC3B,KAAM,CAAE,IAAKC,EAAE,QAAS,OAAQA,EAAE,aAAa,YAAY,GAAKA,EAAE,IAAM,IAAI,MAAM,EAAG,EAAE,CAAE,CAC3F,CAAC,CACH,EACA,SAAS,iBAAiB,QAASF,EAAS,CAAE,QAAS,GAAM,QAAS,EAAK,CAAC,EAC5E,KAAK,SAAS,KAAK,IAAM,SAAS,oBAAoB,QAASA,EAAS,EAAI,CAAC,EAG7E,IAAMG,EAAWF,GAAa,CAC5B,IAAMC,EAAID,EAAE,OACZ,KAAK,KAAK,CACR,KAAM,QACN,UAAW,YAAY,IAAI,EAC3B,KAAM,CAAE,MAAOC,EAAE,MAAQA,EAAE,IAAMA,EAAE,MAAQ,SAAS,MAAM,EAAG,EAAE,CAAE,CACnE,CAAC,CACH,EACA,SAAS,iBAAiB,QAASC,EAAS,CAAE,QAAS,EAAK,CAAC,EAC7D,KAAK,SAAS,KAAK,IAAM,SAAS,oBAAoB,QAASA,CAAO,CAAC,EAGvE,IAAIC,EAAa,EACXC,EAAW,IAAM,CACrB,IAAMC,EAAM,YAAY,IAAI,EACxBA,EAAMF,EAAa,MACvBA,EAAaE,EACb,KAAK,KAAK,CAAE,KAAM,SAAU,UAAWA,EAAK,KAAM,CAAE,EAAG,OAAO,QAAS,EAAG,OAAO,OAAQ,CAAE,CAAC,EAC9F,EACA,SAAS,iBAAiB,SAAUD,EAAU,CAAE,QAAS,EAAK,CAAC,EAC/D,KAAK,SAAS,KAAK,IAAM,SAAS,oBAAoB,SAAUA,CAAQ,CAAC,EAGzE,IAAIE,EAAa,EACXC,EAAW,IAAM,CACrB,IAAMF,EAAM,YAAY,IAAI,EACxBA,EAAMC,EAAa,MACvBA,EAAaD,EACb,KAAK,KAAK,CAAE,KAAM,SAAU,UAAWA,EAAK,KAAM,CAAE,EAAG,OAAO,WAAY,EAAG,OAAO,WAAY,CAAE,CAAC,EACrG,EACA,OAAO,iBAAiB,SAAUE,EAAU,CAAE,QAAS,EAAK,CAAC,EAC7D,KAAK,SAAS,KAAK,IAAM,OAAO,oBAAoB,SAAUA,CAAQ,CAAC,CACzE,CAEA,MAAa,CAjGf,IAAAV,GAkGIA,EAAA,KAAK,WAAL,MAAAA,EAAe,aACf,KAAK,SAAW,KAChB,KAAK,SAAS,QAAQW,GAAMA,EAAG,CAAC,EAChC,KAAK,SAAW,CAAC,CACnB,CAEA,WAA2B,CAAE,MAAO,CAAC,GAAG,KAAK,MAAM,CAAG,CACtD,cAAuB,CAAE,OAAO,KAAK,SAAW,CAClD,EAEA,eAAsBC,GACpBC,EACAC,EACe,CA/GjB,IAAAd,EAgHEa,EAAS,KAAK,EACd,IAAME,EAASF,EAAS,UAAU,EAClC,GAAI,CAACE,EAAO,OAAQ,OACpB,IAAMC,GAAOhB,EAAAc,EAAK,WAAL,KAAAd,EAAiB,2BAC9B,GAAI,CACF,MAAM,MAAMgB,EAAO,qBAAsB,CACvC,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,cAAe,UAAYF,EAAK,MAClC,EACA,KAAM,KAAK,UAAU,CACnB,WAAYD,EAAS,aAAa,EAClC,WAAYC,EAAK,UACjB,OAAAC,EACA,YAAaA,EAAO,OACpB,SAAU,OAAO,QAAW,YAAc,OAAO,SAAS,KAAO,EACnE,CAAC,EACD,UAAW,EACb,CAAC,CACH,OAAQZ,EAAA,CAAC,CACX,CLhIA,IAAIc,EAAkC,KAU/B,SAASC,GAAKC,EAA+B,CAClDF,EAAU,IAAIG,EAAgBD,CAAM,EACpCF,EAAQ,KAAK,CACf,CAKO,SAASI,GAAaC,EAAcC,EAAmC,CAC5E,GAAI,CAACN,EAAS,OACd,IAAMO,EAAIF,aAAe,MAAQA,EAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,EAC5DL,EAAQ,QAAQQ,EAAA,CACd,WAAYD,EAAE,KACd,QAASA,EAAE,QACX,MAAOA,EAAE,MACT,OAAQ,WACLD,EACJ,CACH,CAKO,SAASG,GAAcC,EAAiBC,EAAsC,CACnFX,GAAA,MAAAA,EAAS,cAAcU,EAASC,EAClC,CAKO,SAASC,GAAQC,EAAsB,CAC5Cb,GAAA,MAAAA,EAAS,QAAQa,EACnB","names":["web_vitals_exports","__export","b","L","D","j","U","X","S","w","x","Q","W","Z","e","n","t","i","r","a","o","c","u","f","s","d","l","p","v","m","h","g","y","T","E","C","A","I","P","F","M","k","B","R","H","N","O","q","_","z","G","J","K","V","Y","init_web_vitals","__esmMin","src_exports","__export","BlueWhaleClient","SessionRecorder","addBreadcrumb","captureError","init","setUser","stopAndFlushReplay","__toCommonJS","BreadcrumbBuffer","max","crumb","origPushState","args","_a","method","orig","level","origFetch","input","init","url","start","res","err","e","target","label","SDK_VERSION","Transport","endpoint","apiKey","event","__spreadProps","__spreadValues","e","captureWebVitals","send","onLCP","onCLS","onINP","onFCP","onTTFB","fn","m","e","DEFAULT_ENDPOINT","BlueWhaleClient","config","__spreadValues","BreadcrumbBuffer","Transport","_a","_b","_c","err","captureWebVitals","name","value","rating","partial","event","__spreadProps","result","userId","message","data","SessionRecorder","maxEvents","a","n","ev","mutations","_a","m","onClick","e","t","onInput","lastScroll","onScroll","now","lastResize","onResize","fn","stopAndFlushReplay","recorder","opts","events","base","_client","init","config","BlueWhaleClient","captureError","err","extra","e","__spreadValues","addBreadcrumb","message","data","setUser","userId"]}
1
+ {"version":3,"sources":["../../../node_modules/web-vitals/dist/web-vitals.js","../src/index.ts","../src/breadcrumbs.ts","../src/transport.ts","../src/vitals.ts","../src/core.ts","../src/analytics.ts","../src/replay.ts"],"sourcesContent":["var e,n,t,i,r,a=-1,o=function(e){addEventListener(\"pageshow\",(function(n){n.persisted&&(a=n.timeStamp,e(n))}),!0)},c=function(){return window.performance&&performance.getEntriesByType&&performance.getEntriesByType(\"navigation\")[0]},u=function(){var e=c();return e&&e.activationStart||0},f=function(e,n){var t=c(),i=\"navigate\";a>=0?i=\"back-forward-cache\":t&&(document.prerendering||u()>0?i=\"prerender\":document.wasDiscarded?i=\"restore\":t.type&&(i=t.type.replace(/_/g,\"-\")));return{name:e,value:void 0===n?-1:n,rating:\"good\",delta:0,entries:[],id:\"v3-\".concat(Date.now(),\"-\").concat(Math.floor(8999999999999*Math.random())+1e12),navigationType:i}},s=function(e,n,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){var i=new PerformanceObserver((function(e){Promise.resolve().then((function(){n(e.getEntries())}))}));return i.observe(Object.assign({type:e,buffered:!0},t||{})),i}}catch(e){}},d=function(e,n,t,i){var r,a;return function(o){n.value>=0&&(o||i)&&((a=n.value-(r||0))||void 0===r)&&(r=n.value,n.delta=a,n.rating=function(e,n){return e>n[1]?\"poor\":e>n[0]?\"needs-improvement\":\"good\"}(n.value,t),e(n))}},l=function(e){requestAnimationFrame((function(){return requestAnimationFrame((function(){return e()}))}))},p=function(e){var n=function(n){\"pagehide\"!==n.type&&\"hidden\"!==document.visibilityState||e(n)};addEventListener(\"visibilitychange\",n,!0),addEventListener(\"pagehide\",n,!0)},v=function(e){var n=!1;return function(t){n||(e(t),n=!0)}},m=-1,h=function(){return\"hidden\"!==document.visibilityState||document.prerendering?1/0:0},g=function(e){\"hidden\"===document.visibilityState&&m>-1&&(m=\"visibilitychange\"===e.type?e.timeStamp:0,T())},y=function(){addEventListener(\"visibilitychange\",g,!0),addEventListener(\"prerenderingchange\",g,!0)},T=function(){removeEventListener(\"visibilitychange\",g,!0),removeEventListener(\"prerenderingchange\",g,!0)},E=function(){return m<0&&(m=h(),y(),o((function(){setTimeout((function(){m=h(),y()}),0)}))),{get firstHiddenTime(){return m}}},C=function(e){document.prerendering?addEventListener(\"prerenderingchange\",(function(){return e()}),!0):e()},L=[1800,3e3],w=function(e,n){n=n||{},C((function(){var t,i=E(),r=f(\"FCP\"),a=s(\"paint\",(function(e){e.forEach((function(e){\"first-contentful-paint\"===e.name&&(a.disconnect(),e.startTime<i.firstHiddenTime&&(r.value=Math.max(e.startTime-u(),0),r.entries.push(e),t(!0)))}))}));a&&(t=d(e,r,L,n.reportAllChanges),o((function(i){r=f(\"FCP\"),t=d(e,r,L,n.reportAllChanges),l((function(){r.value=performance.now()-i.timeStamp,t(!0)}))})))}))},b=[.1,.25],S=function(e,n){n=n||{},w(v((function(){var t,i=f(\"CLS\",0),r=0,a=[],c=function(e){e.forEach((function(e){if(!e.hadRecentInput){var n=a[0],t=a[a.length-1];r&&e.startTime-t.startTime<1e3&&e.startTime-n.startTime<5e3?(r+=e.value,a.push(e)):(r=e.value,a=[e])}})),r>i.value&&(i.value=r,i.entries=a,t())},u=s(\"layout-shift\",c);u&&(t=d(e,i,b,n.reportAllChanges),p((function(){c(u.takeRecords()),t(!0)})),o((function(){r=0,i=f(\"CLS\",0),t=d(e,i,b,n.reportAllChanges),l((function(){return t()}))})),setTimeout(t,0))})))},A={passive:!0,capture:!0},I=new Date,P=function(i,r){e||(e=r,n=i,t=new Date,k(removeEventListener),F())},F=function(){if(n>=0&&n<t-I){var r={entryType:\"first-input\",name:e.type,target:e.target,cancelable:e.cancelable,startTime:e.timeStamp,processingStart:e.timeStamp+n};i.forEach((function(e){e(r)})),i=[]}},M=function(e){if(e.cancelable){var n=(e.timeStamp>1e12?new Date:performance.now())-e.timeStamp;\"pointerdown\"==e.type?function(e,n){var t=function(){P(e,n),r()},i=function(){r()},r=function(){removeEventListener(\"pointerup\",t,A),removeEventListener(\"pointercancel\",i,A)};addEventListener(\"pointerup\",t,A),addEventListener(\"pointercancel\",i,A)}(n,e):P(n,e)}},k=function(e){[\"mousedown\",\"keydown\",\"touchstart\",\"pointerdown\"].forEach((function(n){return e(n,M,A)}))},D=[100,300],x=function(t,r){r=r||{},C((function(){var a,c=E(),u=f(\"FID\"),l=function(e){e.startTime<c.firstHiddenTime&&(u.value=e.processingStart-e.startTime,u.entries.push(e),a(!0))},m=function(e){e.forEach(l)},h=s(\"first-input\",m);a=d(t,u,D,r.reportAllChanges),h&&p(v((function(){m(h.takeRecords()),h.disconnect()}))),h&&o((function(){var o;u=f(\"FID\"),a=d(t,u,D,r.reportAllChanges),i=[],n=-1,e=null,k(addEventListener),o=l,i.push(o),F()}))}))},B=0,R=1/0,H=0,N=function(e){e.forEach((function(e){e.interactionId&&(R=Math.min(R,e.interactionId),H=Math.max(H,e.interactionId),B=H?(H-R)/7+1:0)}))},O=function(){return r?B:performance.interactionCount||0},q=function(){\"interactionCount\"in performance||r||(r=s(\"event\",N,{type:\"event\",buffered:!0,durationThreshold:0}))},j=[200,500],_=0,z=function(){return O()-_},G=[],J={},K=function(e){var n=G[G.length-1],t=J[e.interactionId];if(t||G.length<10||e.duration>n.latency){if(t)t.entries.push(e),t.latency=Math.max(t.latency,e.duration);else{var i={id:e.interactionId,latency:e.duration,entries:[e]};J[i.id]=i,G.push(i)}G.sort((function(e,n){return n.latency-e.latency})),G.splice(10).forEach((function(e){delete J[e.id]}))}},Q=function(e,n){n=n||{},C((function(){var t;q();var i,r=f(\"INP\"),a=function(e){e.forEach((function(e){(e.interactionId&&K(e),\"first-input\"===e.entryType)&&(!G.some((function(n){return n.entries.some((function(n){return e.duration===n.duration&&e.startTime===n.startTime}))}))&&K(e))}));var n,t=(n=Math.min(G.length-1,Math.floor(z()/50)),G[n]);t&&t.latency!==r.value&&(r.value=t.latency,r.entries=t.entries,i())},c=s(\"event\",a,{durationThreshold:null!==(t=n.durationThreshold)&&void 0!==t?t:40});i=d(e,r,j,n.reportAllChanges),c&&(\"PerformanceEventTiming\"in window&&\"interactionId\"in PerformanceEventTiming.prototype&&c.observe({type:\"first-input\",buffered:!0}),p((function(){a(c.takeRecords()),r.value<0&&z()>0&&(r.value=0,r.entries=[]),i(!0)})),o((function(){G=[],_=O(),r=f(\"INP\"),i=d(e,r,j,n.reportAllChanges)})))}))},U=[2500,4e3],V={},W=function(e,n){n=n||{},C((function(){var t,i=E(),r=f(\"LCP\"),a=function(e){var n=e[e.length-1];n&&n.startTime<i.firstHiddenTime&&(r.value=Math.max(n.startTime-u(),0),r.entries=[n],t())},c=s(\"largest-contentful-paint\",a);if(c){t=d(e,r,U,n.reportAllChanges);var m=v((function(){V[r.id]||(a(c.takeRecords()),c.disconnect(),V[r.id]=!0,t(!0))}));[\"keydown\",\"click\"].forEach((function(e){addEventListener(e,(function(){return setTimeout(m,0)}),!0)})),p(m),o((function(i){r=f(\"LCP\"),t=d(e,r,U,n.reportAllChanges),l((function(){r.value=performance.now()-i.timeStamp,V[r.id]=!0,t(!0)}))}))}}))},X=[800,1800],Y=function e(n){document.prerendering?C((function(){return e(n)})):\"complete\"!==document.readyState?addEventListener(\"load\",(function(){return e(n)}),!0):setTimeout(n,0)},Z=function(e,n){n=n||{};var t=f(\"TTFB\"),i=d(e,t,X,n.reportAllChanges);Y((function(){var r=c();if(r){var a=r.responseStart;if(a<=0||a>performance.now())return;t.value=Math.max(a-u(),0),t.entries=[r],i(!0),o((function(){t=f(\"TTFB\",0),(i=d(e,t,X,n.reportAllChanges))(!0)}))}}))};export{b as CLSThresholds,L as FCPThresholds,D as FIDThresholds,j as INPThresholds,U as LCPThresholds,X as TTFBThresholds,S as getCLS,w as getFCP,x as getFID,Q as getINP,W as getLCP,Z as getTTFB,S as onCLS,w as onFCP,x as onFID,Q as onINP,W as onLCP,Z as onTTFB};\n","import { BlueWhaleClient } from './core';\nimport { Analytics } from './analytics';\nimport type { BlueWhaleConfig, ErrorEvent, Breadcrumb } from './types';\nimport type { AnalyticsConfig } from './analytics';\n\nexport type { BlueWhaleConfig, ErrorEvent, Breadcrumb, AnalyticsConfig };\n\nlet _client: BlueWhaleClient | null = null;\nlet _analytics: Analytics | null = null;\n\n/**\n * Initialize BLUEWHALE — error capture + product analytics + feature flags.\n * One call replaces Sentry + PostHog + Vercel Analytics + LaunchDarkly.\n *\n * @example\n * import { init } from '@bluewhaleops/browser';\n * init({ apiKey: 'bw_agent_xxx', ventureId: 'uuid', orgId: 'uuid' });\n */\nexport function init(config: BlueWhaleConfig & Partial<AnalyticsConfig>): void {\n _client = new BlueWhaleClient(config);\n _client.init();\n _analytics = new Analytics({ ...config });\n _analytics.init();\n}\n\n// ── Product analytics ─────────────────────────────────────────────────────────\n\n/** Track a custom event. Replaces posthog.capture() */\nexport function track(eventName: string, properties?: Record<string, unknown>): void {\n _analytics?.track(eventName, properties);\n}\n\n/** Identify a user. Replaces posthog.identify() */\nexport function identify(userId: string, properties?: Record<string, unknown>): void {\n _analytics?.identify(userId, properties);\n _client?.setUser(userId);\n}\n\n/** Track a page view. Auto-called on init unless autoPageView=false. */\nexport function page(properties?: Record<string, unknown>): void {\n _analytics?.page(properties);\n}\n\n// ── Feature flags ─────────────────────────────────────────────────────────────\n\n/** Check if a feature flag is enabled. Replaces posthog.isFeatureEnabled() */\nexport function isFeatureEnabled(flagKey: string, userId?: string): Promise<boolean> {\n return _analytics?.isFeatureEnabled(flagKey, userId) ?? Promise.resolve(false);\n}\n\n/** Get a feature flag variant. Replaces posthog.getFeatureFlag() */\nexport function getFeatureVariant(flagKey: string, userId?: string): Promise<string | null> {\n return _analytics?.getFeatureVariant(flagKey, userId) ?? Promise.resolve(null);\n}\n\n/**\n * Manually capture an error or exception.\n */\nexport function captureError(err: unknown, extra?: Partial<ErrorEvent>): void {\n if (!_client) return;\n const e = err instanceof Error ? err : new Error(String(err));\n _client.capture({\n error_type: e.name,\n message: e.message,\n stack: e.stack,\n source: 'browser',\n ...extra,\n });\n}\n\n/**\n * Add a manual breadcrumb.\n */\nexport function addBreadcrumb(message: string, data?: Record<string, unknown>): void {\n _client?.addBreadcrumb(message, data);\n}\n\n/**\n * Tag the current user for error reports.\n */\nexport function setUser(userId: string): void {\n _client?.setUser(userId);\n}\n\nexport { BlueWhaleClient };\n\n// Session replay\nexport { SessionRecorder, stopAndFlushReplay } from './replay';\nexport type { ReplayEvent } from './replay';\n","import type { Breadcrumb } from './types';\n\nexport class BreadcrumbBuffer {\n private buffer: Breadcrumb[] = [];\n private max: number;\n\n constructor(max = 50) {\n this.max = max;\n }\n\n add(crumb: Breadcrumb): void {\n this.buffer.push(crumb);\n if (this.buffer.length > this.max) this.buffer.shift();\n }\n\n flush(): Breadcrumb[] {\n return [...this.buffer];\n }\n\n instrument(): void {\n if (typeof window === 'undefined') return;\n\n // Navigation breadcrumbs\n const origPushState = history.pushState.bind(history);\n history.pushState = (...args) => {\n this.add({ type: 'navigation', message: `→ ${args[2] ?? ''}`, timestamp: Date.now() });\n return origPushState(...args);\n };\n\n // Console breadcrumbs\n (['log', 'warn', 'error', 'info'] as const).forEach((method) => {\n const orig = console[method].bind(console);\n console[method] = (...args: unknown[]) => {\n const level = method === 'log' ? 'info' : method as 'warn' | 'error' | 'info';\n this.add({\n type: 'console',\n category: method,\n message: args.map(String).join(' ').slice(0, 300),\n level,\n timestamp: Date.now(),\n });\n orig(...args);\n };\n });\n\n // Fetch breadcrumbs\n const origFetch = window.fetch.bind(window);\n window.fetch = async (input, init) => {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n const method = init?.method ?? 'GET';\n const start = Date.now();\n try {\n const res = await origFetch(input, init);\n this.add({\n type: 'fetch',\n category: 'http',\n message: `${method} ${url}`,\n level: res.ok ? 'info' : 'warn',\n timestamp: start,\n data: { status: res.status, duration_ms: Date.now() - start },\n });\n return res;\n } catch (err) {\n this.add({\n type: 'fetch',\n category: 'http',\n message: `${method} ${url} failed`,\n level: 'error',\n timestamp: start,\n data: { error: String(err) },\n });\n throw err;\n }\n };\n\n // Click breadcrumbs (top-level only, lightweight)\n document.addEventListener('click', (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n const label = target.getAttribute('aria-label') || target.innerText?.slice(0, 60) || target.tagName;\n this.add({ type: 'click', message: label, timestamp: Date.now() });\n }, { passive: true, capture: true });\n }\n}\n","import type { ErrorEvent } from './types';\n\nconst SDK_VERSION = '1.0.0';\n\nexport class Transport {\n private endpoint: string;\n private apiKey: string;\n private queue: ErrorEvent[] = [];\n private flushing = false;\n\n constructor(endpoint: string, apiKey: string) {\n this.endpoint = endpoint;\n this.apiKey = apiKey;\n }\n\n enqueue(event: ErrorEvent): void {\n // Cap queue at 20 to avoid memory bloat\n if (this.queue.length >= 20) this.queue.shift();\n this.queue.push({ ...event, sdk_version: SDK_VERSION });\n this.flush();\n }\n\n private async flush(): Promise<void> {\n if (this.flushing || this.queue.length === 0) return;\n this.flushing = true;\n const event = this.queue.shift()!;\n try {\n await fetch(this.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(event),\n keepalive: true, // survives page unload\n });\n } catch {\n // Silent fail — don't error-loop\n } finally {\n this.flushing = false;\n if (this.queue.length > 0) this.flush();\n }\n }\n}\n","export function captureWebVitals(\n send: (name: string, value: number, rating: string) => void\n): void {\n if (typeof window === 'undefined') return;\n import('web-vitals').then(({ onLCP, onCLS, onINP, onFCP, onTTFB }) => {\n [onLCP, onCLS, onINP, onFCP, onTTFB].forEach(fn => {\n try {\n fn((m: { name: string; value: number; rating: string }) =>\n send(m.name, m.value, m.rating)\n );\n } catch {}\n });\n }).catch(() => {});\n}\n","import type { BlueWhaleConfig, ErrorEvent, ErrorSource } from './types';\nimport { BreadcrumbBuffer } from './breadcrumbs';\nimport { Transport } from './transport';\nimport { captureWebVitals } from './vitals';\n\nconst DEFAULT_ENDPOINT = 'https://bluewhaleops.com/api/ingest/error';\n\nexport class BlueWhaleClient {\n private config: Required<Omit<BlueWhaleConfig, 'beforeSend'>> & Pick<BlueWhaleConfig, 'beforeSend'>;\n private crumbs: BreadcrumbBuffer;\n private transport: Transport;\n private initialized = false;\n\n constructor(config: BlueWhaleConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n environment: 'production',\n release: '',\n maxBreadcrumbs: 50,\n silent: false,\n ventureId: '',\n ...config,\n };\n this.crumbs = new BreadcrumbBuffer(this.config.maxBreadcrumbs);\n this.transport = new Transport(this.config.endpoint, this.config.apiKey);\n }\n\n init(): void {\n if (this.initialized || typeof window === 'undefined') return;\n this.initialized = true;\n\n this.crumbs.instrument();\n\n // Global JS errors\n window.addEventListener('error', (e) => {\n this.capture({\n error_type: e.error?.name ?? 'Error',\n message: e.message || 'Unknown error',\n stack: e.error?.stack,\n url: window.location.href,\n source: 'browser',\n });\n });\n\n // Unhandled promise rejections\n window.addEventListener('unhandledrejection', (e) => {\n const err = e.reason;\n this.capture({\n error_type: err?.name ?? 'UnhandledRejection',\n message: err?.message ?? String(err),\n stack: err?.stack,\n url: window.location.href,\n source: 'browser',\n });\n });\n\n // Web Vitals — LCP, CLS, INP, FCP, TTFB\n captureWebVitals((name, value, rating) => {\n this.capture({\n error_type: 'WebVital',\n message: name + ': ' + value.toFixed(1),\n source: 'browser',\n tags: { vital: name, rating, value: String(Math.round(value)) },\n });\n });\n }\n\n capture(partial: Partial<ErrorEvent> & { message: string; source: ErrorSource }): void {\n let event: ErrorEvent = {\n error_type: 'Error',\n ...partial,\n user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n environment: this.config.environment,\n release: this.config.release || undefined,\n venture_id: this.config.ventureId || undefined,\n breadcrumbs: this.crumbs.flush(),\n };\n\n if (this.config.beforeSend) {\n const result = this.config.beforeSend(event);\n if (result === false) return;\n event = result;\n }\n\n this.transport.enqueue(event);\n }\n\n setUser(userId: string): void {\n // Store for next capture — patch via a tag\n (this as unknown as Record<string, unknown>)._userId = userId;\n }\n\n addBreadcrumb(message: string, data?: Record<string, unknown>): void {\n this.crumbs.add({ type: 'custom', message, timestamp: Date.now(), data });\n }\n}\n","/**\n * Product analytics — replaces PostHog.\n * track(), identify(), page(), and feature flag evaluation.\n */\n\nconst SDK_VERSION = '1.2.0';\n\nexport interface AnalyticsConfig {\n apiKey: string;\n ventureId?: string;\n endpoint?: string;\n environment?: string;\n orgId?: string; // required for feature flag evaluation\n autoPageView?: boolean; // default: true\n}\n\ninterface EventPayload {\n event_name: string;\n user_id?: string;\n anonymous_id?: string;\n session_id?: string;\n url?: string;\n referrer?: string;\n properties?: Record<string, unknown>;\n venture_id?: string;\n environment?: string;\n sdk_version?: string;\n timestamp?: number;\n}\n\nfunction getAnonymousId(): string {\n if (typeof localStorage === 'undefined') return 'anon';\n let id = localStorage.getItem('_bw_anon');\n if (!id) {\n id = Array.from(crypto.getRandomValues(new Uint8Array(16)))\n .map(b => b.toString(16).padStart(2, '0')).join('');\n localStorage.setItem('_bw_anon', id);\n }\n return id;\n}\n\nfunction getSessionId(): string {\n if (typeof sessionStorage === 'undefined') return '';\n let id = sessionStorage.getItem('_bw_session');\n if (!id) {\n id = Array.from(crypto.getRandomValues(new Uint8Array(8)))\n .map(b => b.toString(16).padStart(2, '0')).join('');\n sessionStorage.setItem('_bw_session', id);\n }\n return id;\n}\n\nexport class Analytics {\n private config: Required<AnalyticsConfig>;\n private userId: string | undefined;\n private userProps: Record<string, unknown> = {};\n private queue: EventPayload[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private flagCache = new Map<string, { result: { enabled: boolean; variant: string | null }; expires: number }>();\n\n constructor(config: AnalyticsConfig) {\n this.config = {\n endpoint: 'https://bluewhaleops.com',\n environment: 'production',\n orgId: '',\n autoPageView: true,\n ventureId: '',\n ...config,\n };\n }\n\n init(): void {\n if (typeof window === 'undefined') return;\n\n if (this.config.autoPageView) {\n this.page();\n\n // SPA navigation\n const origPush = history.pushState.bind(history);\n history.pushState = (...args) => {\n origPush(...args);\n setTimeout(() => this.page(), 0);\n };\n window.addEventListener('popstate', () => this.page());\n }\n }\n\n identify(userId: string, properties?: Record<string, unknown>): void {\n this.userId = userId;\n this.userProps = properties ?? {};\n this.track('$identify', { ...properties });\n }\n\n page(properties?: Record<string, unknown>): void {\n this.track('$pageview', {\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n title: typeof document !== 'undefined' ? document.title : undefined,\n ...properties,\n });\n }\n\n track(eventName: string, properties?: Record<string, unknown>): void {\n const payload: EventPayload = {\n event_name: eventName,\n user_id: this.userId,\n anonymous_id: getAnonymousId(),\n session_id: getSessionId(),\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n properties: { ...this.userProps, ...properties },\n venture_id: this.config.ventureId || undefined,\n environment: this.config.environment,\n sdk_version: SDK_VERSION,\n timestamp: typeof performance !== 'undefined' ? Date.now() : undefined,\n };\n\n this.queue.push(payload);\n this.scheduleFlush();\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer) return;\n this.flushTimer = setTimeout(() => this.flush(), 500);\n }\n\n private async flush(): Promise<void> {\n this.flushTimer = null;\n if (!this.queue.length) return;\n const batch = this.queue.splice(0, 50);\n try {\n await fetch(`${this.config.endpoint}/api/ingest/event`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({ events: batch }),\n keepalive: true,\n });\n } catch {}\n if (this.queue.length) this.flush();\n }\n\n async isFeatureEnabled(flagKey: string, userId?: string): Promise<boolean> {\n const result = await this.evaluateFlag(flagKey, userId);\n return result.enabled;\n }\n\n async getFeatureVariant(flagKey: string, userId?: string): Promise<string | null> {\n const result = await this.evaluateFlag(flagKey, userId);\n return result.variant;\n }\n\n private async evaluateFlag(flagKey: string, userId?: string): Promise<{ enabled: boolean; variant: string | null }> {\n const cacheKey = `${flagKey}:${userId ?? this.userId ?? getAnonymousId()}`;\n const cached = this.flagCache.get(cacheKey);\n if (cached && cached.expires > Date.now()) return cached.result;\n\n if (!this.config.orgId) return { enabled: false, variant: null };\n\n try {\n const uid = userId ?? this.userId;\n const anonId = getAnonymousId();\n const params = new URLSearchParams({\n key: flagKey,\n org_id: this.config.orgId,\n ...(uid ? { user_id: uid } : { anonymous_id: anonId }),\n });\n const res = await fetch(`${this.config.endpoint}/api/features?${params}`);\n const data = await res.json() as { enabled: boolean; variant: string | null };\n // Cache for 60 seconds\n this.flagCache.set(cacheKey, { result: data, expires: Date.now() + 60_000 });\n return data;\n } catch {\n return { enabled: false, variant: null };\n }\n }\n}\n","export interface ReplayEvent {\n type: 'dom_mutation' | 'click' | 'input' | 'scroll' | 'resize' | 'navigation';\n timestamp: number;\n data: Record<string, unknown>;\n}\n\nexport class SessionRecorder {\n private events: ReplayEvent[] = [];\n private maxEvents: number;\n private sessionId: string;\n private observer: MutationObserver | null = null;\n private cleanups: Array<() => void> = [];\n\n constructor(maxEvents = 500) {\n this.maxEvents = maxEvents;\n // Edge-compatible random ID — no Math.random, use crypto if available\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n this.sessionId = crypto.randomUUID();\n } else {\n const a = new Uint32Array(4);\n crypto.getRandomValues(a);\n this.sessionId = Array.from(a).map(n => n.toString(16).padStart(8, '0')).join('');\n }\n }\n\n private push(ev: ReplayEvent): void {\n if (this.events.length >= this.maxEvents) this.events.shift();\n this.events.push(ev);\n }\n\n start(): void {\n if (typeof window === 'undefined') return;\n\n // DOM mutations — structure only, never content\n this.observer = new MutationObserver((mutations) => {\n for (const m of mutations) {\n this.push({\n type: 'dom_mutation',\n timestamp: performance.now(),\n data: {\n kind: m.type,\n tag: (m.target as Element).tagName ?? 'unknown',\n added: m.addedNodes.length,\n removed: m.removedNodes.length,\n },\n });\n }\n });\n this.observer.observe(document.body, { childList: true, subtree: true, attributes: true });\n\n // Click — tag + label only\n const onClick = (e: Event) => {\n const t = e.target as HTMLElement;\n this.push({\n type: 'click',\n timestamp: performance.now(),\n data: { tag: t.tagName, label: (t.getAttribute('aria-label') || t.id || '').slice(0, 60) },\n });\n };\n document.addEventListener('click', onClick, { passive: true, capture: true });\n this.cleanups.push(() => document.removeEventListener('click', onClick, true));\n\n // Input — field name ONLY, never value (privacy)\n const onInput = (e: Event) => {\n const t = e.target as HTMLInputElement;\n this.push({\n type: 'input',\n timestamp: performance.now(),\n data: { name: (t.name || t.id || t.type || 'field').slice(0, 60) },\n });\n };\n document.addEventListener('input', onInput, { passive: true });\n this.cleanups.push(() => document.removeEventListener('input', onInput));\n\n // Scroll — throttled 500ms\n let lastScroll = 0;\n const onScroll = () => {\n const now = performance.now();\n if (now - lastScroll < 500) return;\n lastScroll = now;\n this.push({ type: 'scroll', timestamp: now, data: { x: window.scrollX, y: window.scrollY } });\n };\n document.addEventListener('scroll', onScroll, { passive: true });\n this.cleanups.push(() => document.removeEventListener('scroll', onScroll));\n\n // Resize — throttled 1000ms\n let lastResize = 0;\n const onResize = () => {\n const now = performance.now();\n if (now - lastResize < 1000) return;\n lastResize = now;\n this.push({ type: 'resize', timestamp: now, data: { w: window.innerWidth, h: window.innerHeight } });\n };\n window.addEventListener('resize', onResize, { passive: true });\n this.cleanups.push(() => window.removeEventListener('resize', onResize));\n }\n\n stop(): void {\n this.observer?.disconnect();\n this.observer = null;\n this.cleanups.forEach(fn => fn());\n this.cleanups = [];\n }\n\n getEvents(): ReplayEvent[] { return [...this.events]; }\n getSessionId(): string { return this.sessionId; }\n}\n\nexport async function stopAndFlushReplay(\n recorder: SessionRecorder,\n opts: { apiKey: string; endpoint?: string; ventureId?: string },\n): Promise<void> {\n recorder.stop();\n const events = recorder.getEvents();\n if (!events.length) return;\n const base = opts.endpoint ?? 'https://bluewhaleops.com';\n try {\n await fetch(base + '/api/ingest/replay', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: 'Bearer ' + opts.apiKey,\n },\n body: JSON.stringify({\n session_id: recorder.getSessionId(),\n venture_id: opts.ventureId,\n events,\n event_count: events.length,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n }),\n keepalive: true,\n });\n } catch {}\n}\n"],"mappings":"4zBAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,mBAAAE,EAAA,kBAAAC,EAAA,kBAAAC,EAAA,kBAAAC,EAAA,kBAAAC,EAAA,mBAAAC,EAAA,WAAAC,GAAA,WAAAC,GAAA,WAAAC,GAAA,WAAAC,GAAA,WAAAC,GAAA,YAAAC,GAAA,UAAAL,GAAA,UAAAC,GAAA,UAAAC,GAAA,UAAAC,GAAA,UAAAC,GAAA,WAAAC,KAAA,IAAIC,EAAEC,EAAEC,GAAEC,EAAEC,EAAEC,GAAKC,EAAgGC,EAAqHC,EAAuDC,EAAuWC,EAA+PC,EAA4NC,EAA2GC,EAA6KC,EAA2DC,EAAKC,GAAqFC,EAA4GC,GAAoGC,GAA0GC,EAA+HC,EAA4GhC,EAAaM,GAAmaP,EAAWM,GAA+f4B,EAA0BC,GAAWC,GAAoEC,GAA2MC,GAAqWC,GAA0GrC,EAAYM,GAAibgC,GAAIC,EAAMC,EAAIC,GAAwIC,GAAyDC,GAAmH1C,EAAY2C,GAAIC,GAA2BC,EAAKC,EAAKC,GAA6VzC,GAAmzBL,EAAa+C,EAAKzC,GAA0kBL,EAAa+C,GAA2KzC,GAAx8M0C,GAAAC,GAAA,kBAAcrC,GAAE,GAAGC,EAAE,SAASN,EAAE,CAAC,iBAAiB,YAAY,SAASC,EAAE,CAACA,EAAE,YAAYI,GAAEJ,EAAE,UAAUD,EAAEC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAEM,EAAE,UAAU,CAAC,OAAO,OAAO,aAAa,YAAY,kBAAkB,YAAY,iBAAiB,YAAY,EAAE,CAAC,CAAC,EAAEC,EAAE,UAAU,CAAC,IAAIR,EAAEO,EAAE,EAAE,OAAOP,GAAGA,EAAE,iBAAiB,CAAC,EAAES,EAAE,SAAST,EAAEC,EAAE,CAAC,IAAI,EAAEM,EAAE,EAAE,EAAE,WAAW,OAAAF,IAAG,EAAE,EAAE,qBAAqB,IAAI,SAAS,cAAcG,EAAE,EAAE,EAAE,EAAE,YAAY,SAAS,aAAa,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,KAAK,QAAQ,KAAK,GAAG,IAAU,CAAC,KAAKR,EAAE,MAAeC,IAAT,OAAW,GAAGA,EAAE,OAAO,OAAO,MAAM,EAAE,QAAQ,CAAC,EAAE,GAAG,MAAM,OAAO,KAAK,IAAI,EAAE,GAAG,EAAE,OAAO,KAAK,MAAM,cAAc,KAAK,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC,EAAES,EAAE,SAASV,EAAEC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,oBAAoB,oBAAoB,SAASD,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,qBAAqB,SAASA,EAAE,CAAC,QAAQ,QAAQ,EAAE,MAAM,UAAU,CAACC,EAAED,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,OAAO,OAAO,CAAC,KAAKA,EAAE,SAAS,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAOA,EAAE,CAAC,CAAC,EAAEW,EAAE,SAASX,EAAEC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAEI,EAAE,OAAO,SAASC,EAAE,CAACL,EAAE,OAAO,IAAIK,GAAG,MAAMD,EAAEJ,EAAE,OAAO,GAAG,KAAc,IAAT,UAAc,EAAEA,EAAE,MAAMA,EAAE,MAAMI,EAAEJ,EAAE,QAAO,SAASD,EAAEC,EAAE,CAAC,OAAOD,EAAEC,EAAE,CAAC,EAAE,OAAOD,EAAEC,EAAE,CAAC,EAAE,oBAAoB,MAAM,GAAEA,EAAE,MAAM,CAAC,EAAED,EAAEC,CAAC,EAAE,CAAC,EAAEW,EAAE,SAASZ,EAAE,CAAC,uBAAuB,UAAU,CAAC,OAAO,uBAAuB,UAAU,CAAC,OAAOA,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAEa,EAAE,SAASb,EAAE,CAAC,IAAIC,EAAE,SAASA,EAAE,CAAcA,EAAE,OAAf,YAAgC,SAAS,kBAApB,UAAqCD,EAAEC,CAAC,CAAC,EAAE,iBAAiB,mBAAmBA,EAAE,EAAE,EAAE,iBAAiB,WAAWA,EAAE,EAAE,CAAC,EAAEa,EAAE,SAASd,EAAE,CAAC,IAAIC,EAAE,GAAG,OAAO,SAAS,EAAE,CAACA,IAAID,EAAE,CAAC,EAAEC,EAAE,GAAG,CAAC,EAAEc,EAAE,GAAGC,GAAE,UAAU,CAAC,OAAiB,SAAS,kBAApB,UAAqC,SAAS,aAAa,IAAI,CAAC,EAAEC,EAAE,SAASjB,EAAE,CAAY,SAAS,kBAApB,UAAqCe,EAAE,KAAKA,EAAuBf,EAAE,OAAvB,mBAA4BA,EAAE,UAAU,EAAEmB,GAAE,EAAE,EAAED,GAAE,UAAU,CAAC,iBAAiB,mBAAmBD,EAAE,EAAE,EAAE,iBAAiB,qBAAqBA,EAAE,EAAE,CAAC,EAAEE,GAAE,UAAU,CAAC,oBAAoB,mBAAmBF,EAAE,EAAE,EAAE,oBAAoB,qBAAqBA,EAAE,EAAE,CAAC,EAAEG,EAAE,UAAU,CAAC,OAAOL,EAAE,IAAIA,EAAEC,GAAE,EAAEE,GAAE,EAAEZ,GAAG,UAAU,CAAC,YAAY,UAAU,CAACS,EAAEC,GAAE,EAAEE,GAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,iBAAiB,CAAC,OAAOH,CAAC,CAAC,CAAC,EAAEM,EAAE,SAASrB,EAAE,CAAC,SAAS,aAAa,iBAAiB,sBAAsB,UAAU,CAAC,OAAOA,EAAE,CAAC,GAAG,EAAE,EAAEA,EAAE,CAAC,EAAEX,EAAE,CAAC,KAAK,GAAG,EAAEM,GAAE,SAASK,EAAEC,EAAE,CAACA,EAAEA,GAAG,CAAC,EAAEoB,GAAG,UAAU,CAAC,IAAI,EAAE,EAAED,EAAE,EAAE,EAAEX,EAAE,KAAK,EAAEJ,EAAEK,EAAE,SAAS,SAASV,EAAE,CAACA,EAAE,SAAS,SAASA,EAAE,CAA4BA,EAAE,OAA7B,2BAAoCK,EAAE,WAAW,EAAEL,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,KAAK,IAAIA,EAAE,UAAUQ,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAKR,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAEK,IAAI,EAAEM,EAAEX,EAAE,EAAEX,EAAEY,EAAE,gBAAgB,EAAEK,GAAG,SAASH,EAAE,CAAC,EAAEM,EAAE,KAAK,EAAE,EAAEE,EAAEX,EAAE,EAAEX,EAAEY,EAAE,gBAAgB,EAAEW,GAAG,UAAU,CAAC,EAAE,MAAM,YAAY,IAAI,EAAET,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAEf,EAAE,CAAC,GAAG,GAAG,EAAEM,GAAE,SAASM,EAAEC,EAAE,CAACA,EAAEA,GAAG,CAAC,EAAEN,GAAEmB,GAAG,UAAU,CAAC,IAAI,EAAE,EAAEL,EAAE,MAAM,CAAC,EAAE,EAAE,EAAEJ,EAAE,CAAC,EAAEE,EAAE,SAASP,EAAE,CAACA,EAAE,SAAS,SAASA,EAAE,CAAC,GAAG,CAACA,EAAE,eAAe,CAAC,IAAIC,EAAEI,EAAE,CAAC,EAAEH,EAAEG,EAAEA,EAAE,OAAO,CAAC,EAAE,GAAGL,EAAE,UAAUE,EAAE,UAAU,KAAKF,EAAE,UAAUC,EAAE,UAAU,KAAK,GAAGD,EAAE,MAAMK,EAAE,KAAKL,CAAC,IAAI,EAAEA,EAAE,MAAMK,EAAE,CAACL,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,QAAQK,EAAE,EAAE,EAAE,EAAEG,EAAEE,EAAE,eAAeH,CAAC,EAAEC,IAAI,EAAEG,EAAEX,EAAE,EAAEZ,EAAEa,EAAE,gBAAgB,EAAEY,GAAG,UAAU,CAACN,EAAEC,EAAE,YAAY,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAEF,GAAG,UAAU,CAAC,EAAE,EAAE,EAAEG,EAAE,MAAM,CAAC,EAAE,EAAEE,EAAEX,EAAE,EAAEZ,EAAEa,EAAE,gBAAgB,EAAEW,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAEU,EAAE,CAAC,QAAQ,GAAG,QAAQ,EAAE,EAAEC,GAAE,IAAI,KAAKC,GAAE,SAASrB,EAAEC,EAAE,CAACJ,IAAIA,EAAEI,EAAEH,EAAEE,EAAED,GAAE,IAAI,KAAKyB,GAAE,mBAAmB,EAAEF,GAAE,EAAE,EAAEA,GAAE,UAAU,CAAC,GAAGxB,GAAG,GAAGA,EAAEC,GAAEqB,GAAE,CAAC,IAAInB,EAAE,CAAC,UAAU,cAAc,KAAKJ,EAAE,KAAK,OAAOA,EAAE,OAAO,WAAWA,EAAE,WAAW,UAAUA,EAAE,UAAU,gBAAgBA,EAAE,UAAUC,CAAC,EAAEE,EAAE,SAAS,SAAS,EAAE,CAAC,EAAEC,CAAC,CAAC,EAAE,EAAED,EAAE,CAAC,CAAC,CAAC,EAAEuB,GAAE,SAAS1B,EAAE,CAAC,GAAGA,EAAE,WAAW,CAAC,IAAIC,GAAGD,EAAE,UAAU,KAAK,IAAI,KAAK,YAAY,IAAI,GAAGA,EAAE,UAAyBA,EAAE,MAAjB,eAAsB,SAASA,EAAEC,EAAE,CAAC,IAAIC,EAAE,UAAU,CAACsB,GAAExB,EAAEC,CAAC,EAAEG,EAAE,CAAC,EAAED,EAAE,UAAU,CAACC,EAAE,CAAC,EAAEA,EAAE,UAAU,CAAC,oBAAoB,YAAYF,EAAEoB,CAAC,EAAE,oBAAoB,gBAAgBnB,EAAEmB,CAAC,CAAC,EAAE,iBAAiB,YAAYpB,EAAEoB,CAAC,EAAE,iBAAiB,gBAAgBnB,EAAEmB,CAAC,CAAC,GAAErB,EAAED,CAAC,EAAEwB,GAAEvB,EAAED,CAAC,CAAC,CAAC,EAAE2B,GAAE,SAAS3B,EAAE,CAAC,CAAC,YAAY,UAAU,aAAa,aAAa,EAAE,SAAS,SAASC,EAAE,CAAC,OAAOD,EAAEC,EAAEyB,GAAEJ,CAAC,CAAC,EAAE,CAAC,EAAEhC,EAAE,CAAC,IAAI,GAAG,EAAEM,GAAE,SAASM,EAAEE,EAAE,CAACA,EAAEA,GAAG,CAAC,EAAEiB,GAAG,UAAU,CAAC,IAAIhB,EAAEE,EAAEa,EAAE,EAAEZ,EAAEC,EAAE,KAAK,EAAEG,EAAE,SAASZ,EAAE,CAACA,EAAE,UAAUO,EAAE,kBAAkBC,EAAE,MAAMR,EAAE,gBAAgBA,EAAE,UAAUQ,EAAE,QAAQ,KAAKR,CAAC,EAAEK,EAAE,EAAE,EAAE,EAAEU,EAAE,SAASf,EAAE,CAACA,EAAE,QAAQY,CAAC,CAAC,EAAEI,EAAEN,EAAE,cAAcK,CAAC,EAAEV,EAAEM,EAAET,EAAEM,EAAElB,EAAEc,EAAE,gBAAgB,EAAEY,GAAGH,EAAEC,GAAG,UAAU,CAACC,EAAEC,EAAE,YAAY,CAAC,EAAEA,EAAE,WAAW,CAAC,EAAE,CAAC,EAAEA,GAAGV,GAAG,UAAU,CAAC,IAAIA,EAAEE,EAAEC,EAAE,KAAK,EAAEJ,EAAEM,EAAET,EAAEM,EAAElB,EAAEc,EAAE,gBAAgB,EAAED,EAAE,CAAC,EAAEF,EAAE,GAAGD,EAAE,KAAK2B,GAAE,gBAAgB,EAAErB,EAAEM,EAAET,EAAE,KAAKG,CAAC,EAAEmB,GAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAEG,GAAE,EAAEC,EAAE,IAAIC,EAAE,EAAEC,GAAE,SAAS/B,EAAE,CAACA,EAAE,SAAS,SAAS,EAAE,CAAC,EAAE,gBAAgB6B,EAAE,KAAK,IAAIA,EAAE,EAAE,aAAa,EAAEC,EAAE,KAAK,IAAIA,EAAE,EAAE,aAAa,EAAEF,GAAEE,GAAGA,EAAED,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC,EAAEG,GAAE,UAAU,CAAC,OAAO5B,EAAEwB,GAAE,YAAY,kBAAkB,CAAC,EAAEK,GAAE,UAAU,CAAC,qBAAqB,aAAa7B,IAAIA,EAAEM,EAAE,QAAQqB,GAAE,CAAC,KAAK,QAAQ,SAAS,GAAG,kBAAkB,CAAC,CAAC,EAAE,EAAExC,EAAE,CAAC,IAAI,GAAG,EAAE2C,GAAE,EAAEC,GAAE,UAAU,CAAC,OAAOH,GAAE,EAAEE,EAAC,EAAEE,EAAE,CAAC,EAAEC,EAAE,CAAC,EAAEC,GAAE,SAAStC,EAAE,CAAC,IAAIC,EAAEmC,EAAEA,EAAE,OAAO,CAAC,EAAE,EAAEC,EAAErC,EAAE,aAAa,EAAE,GAAG,GAAGoC,EAAE,OAAO,IAAIpC,EAAE,SAASC,EAAE,QAAQ,CAAC,GAAG,EAAE,EAAE,QAAQ,KAAKD,CAAC,EAAE,EAAE,QAAQ,KAAK,IAAI,EAAE,QAAQA,EAAE,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC,GAAGA,EAAE,cAAc,QAAQA,EAAE,SAAS,QAAQ,CAACA,CAAC,CAAC,EAAEqC,EAAE,EAAE,EAAE,EAAE,EAAED,EAAE,KAAK,CAAC,CAAC,CAACA,EAAE,MAAM,SAASpC,EAAEC,EAAE,CAAC,OAAOA,EAAE,QAAQD,EAAE,OAAO,EAAE,EAAEoC,EAAE,OAAO,EAAE,EAAE,SAAS,SAASpC,EAAE,CAAC,OAAOqC,EAAErC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,EAAEH,GAAE,SAASG,EAAEC,EAAE,CAACA,EAAEA,GAAG,CAAC,EAAEoB,GAAG,UAAU,CAAC,IAAI,EAAEY,GAAE,EAAE,IAAI,EAAE,EAAExB,EAAE,KAAK,EAAEJ,EAAE,SAASL,EAAE,CAACA,EAAE,SAAS,SAASA,EAAE,CAAEA,EAAE,eAAesC,GAAEtC,CAAC,EAAkBA,EAAE,YAAlB,eAA+B,CAACoC,EAAE,MAAM,SAASnC,EAAE,CAAC,OAAOA,EAAE,QAAQ,MAAM,SAASA,EAAE,CAAC,OAAOD,EAAE,WAAWC,EAAE,UAAUD,EAAE,YAAYC,EAAE,SAAS,EAAE,CAAC,EAAE,GAAGqC,GAAEtC,CAAC,CAAE,EAAE,EAAE,IAAIC,EAAEC,GAAGD,EAAE,KAAK,IAAImC,EAAE,OAAO,EAAE,KAAK,MAAMD,GAAE,EAAE,EAAE,CAAC,EAAEC,EAAEnC,CAAC,GAAGC,GAAGA,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAMA,EAAE,QAAQ,EAAE,QAAQA,EAAE,QAAQ,EAAE,EAAE,EAAEK,EAAEG,EAAE,QAAQL,EAAE,CAAC,mBAA0B,EAAEJ,EAAE,qBAAZ,MAAyC,IAAT,OAAW,EAAE,EAAE,CAAC,EAAE,EAAEU,EAAEX,EAAE,EAAET,EAAEU,EAAE,gBAAgB,EAAEM,IAAI,2BAA2B,QAAQ,kBAAkB,uBAAuB,WAAWA,EAAE,QAAQ,CAAC,KAAK,cAAc,SAAS,EAAE,CAAC,EAAEM,GAAG,UAAU,CAACR,EAAEE,EAAE,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG4B,GAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE7B,GAAG,UAAU,CAAC8B,EAAE,CAAC,EAAEF,GAAEF,GAAE,EAAE,EAAEvB,EAAE,KAAK,EAAE,EAAEE,EAAEX,EAAE,EAAET,EAAEU,EAAE,gBAAgB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAET,EAAE,CAAC,KAAK,GAAG,EAAE+C,EAAE,CAAC,EAAEzC,GAAE,SAASE,EAAEC,EAAE,CAACA,EAAEA,GAAG,CAAC,EAAEoB,GAAG,UAAU,CAAC,IAAI,EAAE,EAAED,EAAE,EAAE,EAAEX,EAAE,KAAK,EAAEJ,EAAE,SAASL,EAAE,CAAC,IAAIC,EAAED,EAAEA,EAAE,OAAO,CAAC,EAAEC,GAAGA,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,KAAK,IAAIA,EAAE,UAAUO,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,CAACP,CAAC,EAAE,EAAE,EAAE,EAAEM,EAAEG,EAAE,2BAA2BL,CAAC,EAAE,GAAGE,EAAE,CAAC,EAAEI,EAAEX,EAAE,EAAER,EAAES,EAAE,gBAAgB,EAAE,IAAIc,EAAED,GAAG,UAAU,CAACyB,EAAE,EAAE,EAAE,IAAIlC,EAAEE,EAAE,YAAY,CAAC,EAAEA,EAAE,WAAW,EAAEgC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,UAAU,OAAO,EAAE,SAAS,SAASvC,EAAE,CAAC,iBAAiBA,GAAG,UAAU,CAAC,OAAO,WAAWe,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAEF,EAAEE,CAAC,EAAET,GAAG,SAASH,EAAE,CAAC,EAAEM,EAAE,KAAK,EAAE,EAAEE,EAAEX,EAAE,EAAER,EAAES,EAAE,gBAAgB,EAAEW,GAAG,UAAU,CAAC,EAAE,MAAM,YAAY,IAAI,EAAET,EAAE,UAAUoC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE9C,EAAE,CAAC,IAAI,IAAI,EAAE+C,GAAE,SAASxC,EAAEC,EAAE,CAAC,SAAS,aAAaoB,GAAG,UAAU,CAAC,OAAOrB,EAAEC,CAAC,CAAC,EAAE,EAAe,SAAS,aAAtB,WAAiC,iBAAiB,QAAQ,UAAU,CAAC,OAAOD,EAAEC,CAAC,CAAC,GAAG,EAAE,EAAE,WAAWA,EAAE,CAAC,CAAC,EAAEF,GAAE,SAASC,EAAEC,EAAE,CAACA,EAAEA,GAAG,CAAC,EAAE,IAAI,EAAEQ,EAAE,MAAM,EAAE,EAAEE,EAAEX,EAAE,EAAEP,EAAEQ,EAAE,gBAAgB,EAAEuC,IAAG,UAAU,CAAC,IAAI,EAAEjC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAIF,EAAE,EAAE,cAAc,GAAGA,GAAG,GAAGA,EAAE,YAAY,IAAI,EAAE,OAAO,EAAE,MAAM,KAAK,IAAIA,EAAEG,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,EAAE,EAAEF,GAAG,UAAU,CAAC,EAAEG,EAAE,OAAO,CAAC,GAAG,EAAEE,EAAEX,EAAE,EAAEP,EAAEQ,EAAE,gBAAgB,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,ICA1tN,IAAA0C,GAAA,GAAAC,GAAAD,GAAA,qBAAAE,EAAA,oBAAAC,EAAA,kBAAAC,GAAA,iBAAAC,GAAA,sBAAAC,GAAA,aAAAC,GAAA,SAAAC,GAAA,qBAAAC,GAAA,SAAAC,GAAA,YAAAC,GAAA,uBAAAC,GAAA,UAAAC,KAAA,eAAAC,GAAAd,ICEO,IAAMe,EAAN,KAAuB,CAI5B,YAAYC,EAAM,GAAI,CAHtB,KAAQ,OAAuB,CAAC,EAI9B,KAAK,IAAMA,CACb,CAEA,IAAIC,EAAyB,CAC3B,KAAK,OAAO,KAAKA,CAAK,EAClB,KAAK,OAAO,OAAS,KAAK,KAAK,KAAK,OAAO,MAAM,CACvD,CAEA,OAAsB,CACpB,MAAO,CAAC,GAAG,KAAK,MAAM,CACxB,CAEA,YAAmB,CACjB,GAAI,OAAO,QAAW,YAAa,OAGnC,IAAMC,EAAgB,QAAQ,UAAU,KAAK,OAAO,EACpD,QAAQ,UAAY,IAAIC,IAAS,CAxBrC,IAAAC,EAyBM,YAAK,IAAI,CAAE,KAAM,aAAc,QAAS,WAAKA,EAAAD,EAAK,CAAC,IAAN,KAAAC,EAAW,EAAE,GAAI,UAAW,KAAK,IAAI,CAAE,CAAC,EAC9EF,EAAc,GAAGC,CAAI,CAC9B,EAGC,CAAC,MAAO,OAAQ,QAAS,MAAM,EAAY,QAASE,GAAW,CAC9D,IAAMC,EAAO,QAAQD,CAAM,EAAE,KAAK,OAAO,EACzC,QAAQA,CAAM,EAAI,IAAIF,IAAoB,CACxC,IAAMI,EAAQF,IAAW,MAAQ,OAASA,EAC1C,KAAK,IAAI,CACP,KAAM,UACN,SAAUA,EACV,QAASF,EAAK,IAAI,MAAM,EAAE,KAAK,GAAG,EAAE,MAAM,EAAG,GAAG,EAChD,MAAAI,EACA,UAAW,KAAK,IAAI,CACtB,CAAC,EACDD,EAAK,GAAGH,CAAI,CACd,CACF,CAAC,EAGD,IAAMK,EAAY,OAAO,MAAM,KAAK,MAAM,EAC1C,OAAO,MAAQ,MAAOC,EAAOC,IAAS,CA/C1C,IAAAN,EAgDM,IAAMO,EAAM,OAAOF,GAAU,SAAWA,EAAQA,aAAiB,IAAMA,EAAM,KAAOA,EAAM,IACpFJ,GAASD,EAAAM,GAAA,YAAAA,EAAM,SAAN,KAAAN,EAAgB,MACzBQ,EAAQ,KAAK,IAAI,EACvB,GAAI,CACF,IAAMC,EAAM,MAAML,EAAUC,EAAOC,CAAI,EACvC,YAAK,IAAI,CACP,KAAM,QACN,SAAU,OACV,QAAS,GAAGL,CAAM,IAAIM,CAAG,GACzB,MAAOE,EAAI,GAAK,OAAS,OACzB,UAAWD,EACX,KAAM,CAAE,OAAQC,EAAI,OAAQ,YAAa,KAAK,IAAI,EAAID,CAAM,CAC9D,CAAC,EACMC,CACT,OAASC,EAAK,CACZ,WAAK,IAAI,CACP,KAAM,QACN,SAAU,OACV,QAAS,GAAGT,CAAM,IAAIM,CAAG,UACzB,MAAO,QACP,UAAWC,EACX,KAAM,CAAE,MAAO,OAAOE,CAAG,CAAE,CAC7B,CAAC,EACKA,CACR,CACF,EAGA,SAAS,iBAAiB,QAAUC,GAAM,CA5E9C,IAAAX,EA6EM,IAAMY,EAASD,EAAE,OACjB,GAAI,CAACC,EAAQ,OACb,IAAMC,EAAQD,EAAO,aAAa,YAAY,KAAKZ,EAAAY,EAAO,YAAP,YAAAZ,EAAkB,MAAM,EAAG,MAAOY,EAAO,QAC5F,KAAK,IAAI,CAAE,KAAM,QAAS,QAASC,EAAO,UAAW,KAAK,IAAI,CAAE,CAAC,CACnE,EAAG,CAAE,QAAS,GAAM,QAAS,EAAK,CAAC,CACrC,CACF,ECjFA,IAAMC,GAAc,QAEPC,EAAN,KAAgB,CAMrB,YAAYC,EAAkBC,EAAgB,CAH9C,KAAQ,MAAsB,CAAC,EAC/B,KAAQ,SAAW,GAGjB,KAAK,SAAWD,EAChB,KAAK,OAASC,CAChB,CAEA,QAAQC,EAAyB,CAE3B,KAAK,MAAM,QAAU,IAAI,KAAK,MAAM,MAAM,EAC9C,KAAK,MAAM,KAAKC,EAAAC,EAAA,GAAKF,GAAL,CAAY,YAAaJ,EAAY,EAAC,EACtD,KAAK,MAAM,CACb,CAEA,MAAc,OAAuB,CACnC,GAAI,KAAK,UAAY,KAAK,MAAM,SAAW,EAAG,OAC9C,KAAK,SAAW,GAChB,IAAMI,EAAQ,KAAK,MAAM,MAAM,EAC/B,GAAI,CACF,MAAM,MAAM,KAAK,SAAU,CACzB,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,cAAe,UAAU,KAAK,MAAM,EACtC,EACA,KAAM,KAAK,UAAUA,CAAK,EAC1B,UAAW,EACb,CAAC,CACH,OAAQG,EAAA,CAER,QAAE,CACA,KAAK,SAAW,GACZ,KAAK,MAAM,OAAS,GAAG,KAAK,MAAM,CACxC,CACF,CACF,EC3CO,SAASC,GACdC,EACM,CACF,OAAO,QAAW,aACtB,sCAAqB,KAAK,CAAC,CAAE,MAAAC,EAAO,MAAAC,EAAO,MAAAC,EAAO,MAAAC,EAAO,OAAAC,CAAO,IAAM,CACpE,CAACJ,EAAOC,EAAOC,EAAOC,EAAOC,CAAM,EAAE,QAAQC,GAAM,CACjD,GAAI,CACFA,EAAIC,GACFP,EAAKO,EAAE,KAAMA,EAAE,MAAOA,EAAE,MAAM,CAChC,CACF,OAAQC,EAAA,CAAC,CACX,CAAC,CACH,CAAC,EAAE,MAAM,IAAM,CAAC,CAAC,CACnB,CCRA,IAAMC,GAAmB,4CAEZC,EAAN,KAAsB,CAM3B,YAAYC,EAAyB,CAFrC,KAAQ,YAAc,GAGpB,KAAK,OAASC,EAAA,CACZ,SAAUH,GACV,YAAa,aACb,QAAS,GACT,eAAgB,GAChB,OAAQ,GACR,UAAW,IACRE,GAEL,KAAK,OAAS,IAAIE,EAAiB,KAAK,OAAO,cAAc,EAC7D,KAAK,UAAY,IAAIC,EAAU,KAAK,OAAO,SAAU,KAAK,OAAO,MAAM,CACzE,CAEA,MAAa,CACP,KAAK,aAAe,OAAO,QAAW,cAC1C,KAAK,YAAc,GAEnB,KAAK,OAAO,WAAW,EAGvB,OAAO,iBAAiB,QAAU,GAAM,CAlC5C,IAAAC,EAAAC,EAAAC,EAmCM,KAAK,QAAQ,CACX,YAAYD,GAAAD,EAAA,EAAE,QAAF,YAAAA,EAAS,OAAT,KAAAC,EAAiB,QAC7B,QAAS,EAAE,SAAW,gBACtB,OAAOC,EAAA,EAAE,QAAF,YAAAA,EAAS,MAChB,IAAK,OAAO,SAAS,KACrB,OAAQ,SACV,CAAC,CACH,CAAC,EAGD,OAAO,iBAAiB,qBAAuB,GAAM,CA7CzD,IAAAF,EAAAC,EA8CM,IAAME,EAAM,EAAE,OACd,KAAK,QAAQ,CACX,YAAYH,EAAAG,GAAA,YAAAA,EAAK,OAAL,KAAAH,EAAa,qBACzB,SAASC,EAAAE,GAAA,YAAAA,EAAK,UAAL,KAAAF,EAAgB,OAAOE,CAAG,EACnC,MAAOA,GAAA,YAAAA,EAAK,MACZ,IAAK,OAAO,SAAS,KACrB,OAAQ,SACV,CAAC,CACH,CAAC,EAGDC,GAAiB,CAACC,EAAMC,EAAOC,IAAW,CACxC,KAAK,QAAQ,CACX,WAAY,WACZ,QAASF,EAAO,KAAOC,EAAM,QAAQ,CAAC,EACtC,OAAQ,UACR,KAAM,CAAE,MAAOD,EAAM,OAAAE,EAAQ,MAAO,OAAO,KAAK,MAAMD,CAAK,CAAC,CAAE,CAChE,CAAC,CACH,CAAC,EACH,CAEA,QAAQE,EAA+E,CACrF,IAAIC,EAAoBC,EAAAb,EAAA,CACtB,WAAY,SACTW,GAFmB,CAGtB,WAAY,OAAO,WAAc,YAAc,UAAU,UAAY,OACrE,YAAa,KAAK,OAAO,YACzB,QAAS,KAAK,OAAO,SAAW,OAChC,WAAY,KAAK,OAAO,WAAa,OACrC,YAAa,KAAK,OAAO,MAAM,CACjC,GAEA,GAAI,KAAK,OAAO,WAAY,CAC1B,IAAMG,EAAS,KAAK,OAAO,WAAWF,CAAK,EAC3C,GAAIE,IAAW,GAAO,OACtBF,EAAQE,CACV,CAEA,KAAK,UAAU,QAAQF,CAAK,CAC9B,CAEA,QAAQG,EAAsB,CAE3B,KAA4C,QAAUA,CACzD,CAEA,cAAcC,EAAiBC,EAAsC,CACnE,KAAK,OAAO,IAAI,CAAE,KAAM,SAAU,QAAAD,EAAS,UAAW,KAAK,IAAI,EAAG,KAAAC,CAAK,CAAC,CAC1E,CACF,EC1FA,IAAMC,GAAc,QAyBpB,SAASC,GAAyB,CAChC,GAAI,OAAO,cAAiB,YAAa,MAAO,OAChD,IAAIC,EAAK,aAAa,QAAQ,UAAU,EACxC,OAAKA,IACHA,EAAK,MAAM,KAAK,OAAO,gBAAgB,IAAI,WAAW,EAAE,CAAC,CAAC,EACvD,IAAIC,GAAKA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,EACpD,aAAa,QAAQ,WAAYD,CAAE,GAE9BA,CACT,CAEA,SAASE,IAAuB,CAC9B,GAAI,OAAO,gBAAmB,YAAa,MAAO,GAClD,IAAIF,EAAK,eAAe,QAAQ,aAAa,EAC7C,OAAKA,IACHA,EAAK,MAAM,KAAK,OAAO,gBAAgB,IAAI,WAAW,CAAC,CAAC,CAAC,EACtD,IAAIC,GAAKA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,EACpD,eAAe,QAAQ,cAAeD,CAAE,GAEnCA,CACT,CAEO,IAAMG,EAAN,KAAgB,CAQrB,YAAYC,EAAyB,CALrC,KAAQ,UAAqC,CAAC,EAC9C,KAAQ,MAAwB,CAAC,EACjC,KAAQ,WAAmD,KAC3D,KAAQ,UAAY,IAAI,IAGtB,KAAK,OAASC,EAAA,CACZ,SAAU,2BACV,YAAa,aACb,MAAO,GACP,aAAc,GACd,UAAW,IACRD,EAEP,CAEA,MAAa,CACX,GAAI,OAAO,QAAW,aAElB,KAAK,OAAO,aAAc,CAC5B,KAAK,KAAK,EAGV,IAAME,EAAW,QAAQ,UAAU,KAAK,OAAO,EAC/C,QAAQ,UAAY,IAAIC,IAAS,CAC/BD,EAAS,GAAGC,CAAI,EAChB,WAAW,IAAM,KAAK,KAAK,EAAG,CAAC,CACjC,EACA,OAAO,iBAAiB,WAAY,IAAM,KAAK,KAAK,CAAC,CACvD,CACF,CAEA,SAASC,EAAgBC,EAA4C,CACnE,KAAK,OAASD,EACd,KAAK,UAAYC,GAAA,KAAAA,EAAc,CAAC,EAChC,KAAK,MAAM,YAAaJ,EAAA,GAAKI,EAAY,CAC3C,CAEA,KAAKA,EAA4C,CAC/C,KAAK,MAAM,YAAaJ,EAAA,CACtB,IAAK,OAAO,QAAW,YAAc,OAAO,SAAS,KAAO,OAC5D,SAAU,OAAO,UAAa,YAAc,SAAS,SAAW,OAChE,MAAO,OAAO,UAAa,YAAc,SAAS,MAAQ,QACvDI,EACJ,CACH,CAEA,MAAMC,EAAmBD,EAA4C,CACnE,IAAME,EAAwB,CAC5B,WAAcD,EACd,QAAc,KAAK,OACnB,aAAcX,EAAe,EAC7B,WAAcG,GAAa,EAC3B,IAAc,OAAO,QAAW,YAAc,OAAO,SAAS,KAAO,OACrE,WAAcG,IAAA,GAAK,KAAK,WAAcI,GACtC,WAAc,KAAK,OAAO,WAAa,OACvC,YAAc,KAAK,OAAO,YAC1B,YAAcX,GACd,UAAc,OAAO,aAAgB,YAAc,KAAK,IAAI,EAAI,MAClE,EAEA,KAAK,MAAM,KAAKa,CAAO,EACvB,KAAK,cAAc,CACrB,CAEQ,eAAsB,CACxB,KAAK,aACT,KAAK,WAAa,WAAW,IAAM,KAAK,MAAM,EAAG,GAAG,EACtD,CAEA,MAAc,OAAuB,CAEnC,GADA,KAAK,WAAa,KACd,CAAC,KAAK,MAAM,OAAQ,OACxB,IAAMC,EAAQ,KAAK,MAAM,OAAO,EAAG,EAAE,EACrC,GAAI,CACF,MAAM,MAAM,GAAG,KAAK,OAAO,QAAQ,oBAAqB,CACtD,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,cAAe,UAAU,KAAK,OAAO,MAAM,EAC7C,EACA,KAAM,KAAK,UAAU,CAAE,OAAQA,CAAM,CAAC,EACtC,UAAW,EACb,CAAC,CACH,OAAQC,EAAA,CAAC,CACL,KAAK,MAAM,QAAQ,KAAK,MAAM,CACpC,CAEA,MAAM,iBAAiBC,EAAiBN,EAAmC,CAEzE,OADe,MAAM,KAAK,aAAaM,EAASN,CAAM,GACxC,OAChB,CAEA,MAAM,kBAAkBM,EAAiBN,EAAyC,CAEhF,OADe,MAAM,KAAK,aAAaM,EAASN,CAAM,GACxC,OAChB,CAEA,MAAc,aAAaM,EAAiBN,EAAwE,CAzJtH,IAAAO,EA0JI,IAAMC,EAAW,GAAGF,CAAO,KAAIC,EAAAP,GAAA,KAAAA,EAAU,KAAK,SAAf,KAAAO,EAAyBhB,EAAe,CAAC,GAClEkB,EAAS,KAAK,UAAU,IAAID,CAAQ,EAC1C,GAAIC,GAAUA,EAAO,QAAU,KAAK,IAAI,EAAG,OAAOA,EAAO,OAEzD,GAAI,CAAC,KAAK,OAAO,MAAO,MAAO,CAAE,QAAS,GAAO,QAAS,IAAK,EAE/D,GAAI,CACF,IAAMC,EAAMV,GAAA,KAAAA,EAAU,KAAK,OACrBW,EAASpB,EAAe,EACxBqB,EAAS,IAAI,gBAAgBf,EAAA,CACjC,IAAKS,EACL,OAAQ,KAAK,OAAO,OAChBI,EAAM,CAAE,QAASA,CAAI,EAAI,CAAE,aAAcC,CAAO,EACrD,EAEKE,EAAO,MADD,MAAM,MAAM,GAAG,KAAK,OAAO,QAAQ,iBAAiBD,CAAM,EAAE,GACjD,KAAK,EAE5B,YAAK,UAAU,IAAIJ,EAAU,CAAE,OAAQK,EAAM,QAAS,KAAK,IAAI,EAAI,GAAO,CAAC,EACpEA,CACT,OAAQR,EAAA,CACN,MAAO,CAAE,QAAS,GAAO,QAAS,IAAK,CACzC,CACF,CACF,EC3KO,IAAMS,EAAN,KAAsB,CAO3B,YAAYC,EAAY,IAAK,CAN7B,KAAQ,OAAwB,CAAC,EAGjC,KAAQ,SAAoC,KAC5C,KAAQ,SAA8B,CAAC,EAKrC,GAFA,KAAK,UAAYA,EAEb,OAAO,QAAW,aAAe,OAAO,WAC1C,KAAK,UAAY,OAAO,WAAW,MAC9B,CACL,IAAMC,EAAI,IAAI,YAAY,CAAC,EAC3B,OAAO,gBAAgBA,CAAC,EACxB,KAAK,UAAY,MAAM,KAAKA,CAAC,EAAE,IAAIC,GAAKA,EAAE,SAAS,EAAE,EAAE,SAAS,EAAG,GAAG,CAAC,EAAE,KAAK,EAAE,CAClF,CACF,CAEQ,KAAKC,EAAuB,CAC9B,KAAK,OAAO,QAAU,KAAK,WAAW,KAAK,OAAO,MAAM,EAC5D,KAAK,OAAO,KAAKA,CAAE,CACrB,CAEA,OAAc,CACZ,GAAI,OAAO,QAAW,YAAa,OAGnC,KAAK,SAAW,IAAI,iBAAkBC,GAAc,CAlCxD,IAAAC,EAmCM,QAAWC,KAAKF,EACd,KAAK,KAAK,CACR,KAAM,eACN,UAAW,YAAY,IAAI,EAC3B,KAAM,CACJ,KAAME,EAAE,KACR,KAAMD,EAAAC,EAAE,OAAmB,UAArB,KAAAD,EAAgC,UACtC,MAAOC,EAAE,WAAW,OACpB,QAASA,EAAE,aAAa,MAC1B,CACF,CAAC,CAEL,CAAC,EACD,KAAK,SAAS,QAAQ,SAAS,KAAM,CAAE,UAAW,GAAM,QAAS,GAAM,WAAY,EAAK,CAAC,EAGzF,IAAMC,EAAWC,GAAa,CAC5B,IAAMC,EAAID,EAAE,OACZ,KAAK,KAAK,CACR,KAAM,QACN,UAAW,YAAY,IAAI,EAC3B,KAAM,CAAE,IAAKC,EAAE,QAAS,OAAQA,EAAE,aAAa,YAAY,GAAKA,EAAE,IAAM,IAAI,MAAM,EAAG,EAAE,CAAE,CAC3F,CAAC,CACH,EACA,SAAS,iBAAiB,QAASF,EAAS,CAAE,QAAS,GAAM,QAAS,EAAK,CAAC,EAC5E,KAAK,SAAS,KAAK,IAAM,SAAS,oBAAoB,QAASA,EAAS,EAAI,CAAC,EAG7E,IAAMG,EAAWF,GAAa,CAC5B,IAAMC,EAAID,EAAE,OACZ,KAAK,KAAK,CACR,KAAM,QACN,UAAW,YAAY,IAAI,EAC3B,KAAM,CAAE,MAAOC,EAAE,MAAQA,EAAE,IAAMA,EAAE,MAAQ,SAAS,MAAM,EAAG,EAAE,CAAE,CACnE,CAAC,CACH,EACA,SAAS,iBAAiB,QAASC,EAAS,CAAE,QAAS,EAAK,CAAC,EAC7D,KAAK,SAAS,KAAK,IAAM,SAAS,oBAAoB,QAASA,CAAO,CAAC,EAGvE,IAAIC,EAAa,EACXC,EAAW,IAAM,CACrB,IAAMC,EAAM,YAAY,IAAI,EACxBA,EAAMF,EAAa,MACvBA,EAAaE,EACb,KAAK,KAAK,CAAE,KAAM,SAAU,UAAWA,EAAK,KAAM,CAAE,EAAG,OAAO,QAAS,EAAG,OAAO,OAAQ,CAAE,CAAC,EAC9F,EACA,SAAS,iBAAiB,SAAUD,EAAU,CAAE,QAAS,EAAK,CAAC,EAC/D,KAAK,SAAS,KAAK,IAAM,SAAS,oBAAoB,SAAUA,CAAQ,CAAC,EAGzE,IAAIE,EAAa,EACXC,EAAW,IAAM,CACrB,IAAMF,EAAM,YAAY,IAAI,EACxBA,EAAMC,EAAa,MACvBA,EAAaD,EACb,KAAK,KAAK,CAAE,KAAM,SAAU,UAAWA,EAAK,KAAM,CAAE,EAAG,OAAO,WAAY,EAAG,OAAO,WAAY,CAAE,CAAC,EACrG,EACA,OAAO,iBAAiB,SAAUE,EAAU,CAAE,QAAS,EAAK,CAAC,EAC7D,KAAK,SAAS,KAAK,IAAM,OAAO,oBAAoB,SAAUA,CAAQ,CAAC,CACzE,CAEA,MAAa,CAjGf,IAAAV,GAkGIA,EAAA,KAAK,WAAL,MAAAA,EAAe,aACf,KAAK,SAAW,KAChB,KAAK,SAAS,QAAQW,GAAMA,EAAG,CAAC,EAChC,KAAK,SAAW,CAAC,CACnB,CAEA,WAA2B,CAAE,MAAO,CAAC,GAAG,KAAK,MAAM,CAAG,CACtD,cAAuB,CAAE,OAAO,KAAK,SAAW,CAClD,EAEA,eAAsBC,GACpBC,EACAC,EACe,CA/GjB,IAAAd,EAgHEa,EAAS,KAAK,EACd,IAAME,EAASF,EAAS,UAAU,EAClC,GAAI,CAACE,EAAO,OAAQ,OACpB,IAAMC,GAAOhB,EAAAc,EAAK,WAAL,KAAAd,EAAiB,2BAC9B,GAAI,CACF,MAAM,MAAMgB,EAAO,qBAAsB,CACvC,OAAQ,OACR,QAAS,CACP,eAAgB,mBAChB,cAAe,UAAYF,EAAK,MAClC,EACA,KAAM,KAAK,UAAU,CACnB,WAAYD,EAAS,aAAa,EAClC,WAAYC,EAAK,UACjB,OAAAC,EACA,YAAaA,EAAO,OACpB,SAAU,OAAO,QAAW,YAAc,OAAO,SAAS,KAAO,EACnE,CAAC,EACD,UAAW,EACb,CAAC,CACH,OAAQZ,EAAA,CAAC,CACX,CN9HA,IAAIc,EAAkC,KAClCC,EAA+B,KAU5B,SAASC,GAAKC,EAA0D,CAC7EH,EAAU,IAAII,EAAgBD,CAAM,EACpCH,EAAQ,KAAK,EACbC,EAAa,IAAII,EAAUC,EAAA,GAAKH,EAAQ,EACxCF,EAAW,KAAK,CAClB,CAKO,SAASM,GAAMC,EAAmBC,EAA4C,CACnFR,GAAA,MAAAA,EAAY,MAAMO,EAAWC,EAC/B,CAGO,SAASC,GAASC,EAAgBF,EAA4C,CACnFR,GAAA,MAAAA,EAAY,SAASU,EAAQF,GAC7BT,GAAA,MAAAA,EAAS,QAAQW,EACnB,CAGO,SAASC,GAAKH,EAA4C,CAC/DR,GAAA,MAAAA,EAAY,KAAKQ,EACnB,CAKO,SAASI,GAAiBC,EAAiBH,EAAmC,CA9CrF,IAAAI,EA+CE,OAAOA,EAAAd,GAAA,YAAAA,EAAY,iBAAiBa,EAASH,KAAtC,KAAAI,EAAiD,QAAQ,QAAQ,EAAK,CAC/E,CAGO,SAASC,GAAkBF,EAAiBH,EAAyC,CAnD5F,IAAAI,EAoDE,OAAOA,EAAAd,GAAA,YAAAA,EAAY,kBAAkBa,EAASH,KAAvC,KAAAI,EAAkD,QAAQ,QAAQ,IAAI,CAC/E,CAKO,SAASE,GAAaC,EAAcC,EAAmC,CAC5E,GAAI,CAACnB,EAAS,OACd,IAAMoB,EAAIF,aAAe,MAAQA,EAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,EAC5DlB,EAAQ,QAAQM,EAAA,CACd,WAAYc,EAAE,KACd,QAASA,EAAE,QACX,MAAOA,EAAE,MACT,OAAQ,WACLD,EACJ,CACH,CAKO,SAASE,GAAcC,EAAiBC,EAAsC,CACnFvB,GAAA,MAAAA,EAAS,cAAcsB,EAASC,EAClC,CAKO,SAASC,GAAQb,EAAsB,CAC5CX,GAAA,MAAAA,EAAS,QAAQW,EACnB","names":["web_vitals_exports","__export","b","L","D","j","U","X","S","w","x","Q","W","Z","e","n","t","i","r","a","o","c","u","f","s","d","l","p","v","m","h","g","y","T","E","C","A","I","P","F","M","k","B","R","H","N","O","q","_","z","G","J","K","V","Y","init_web_vitals","__esmMin","src_exports","__export","BlueWhaleClient","SessionRecorder","addBreadcrumb","captureError","getFeatureVariant","identify","init","isFeatureEnabled","page","setUser","stopAndFlushReplay","track","__toCommonJS","BreadcrumbBuffer","max","crumb","origPushState","args","_a","method","orig","level","origFetch","input","init","url","start","res","err","e","target","label","SDK_VERSION","Transport","endpoint","apiKey","event","__spreadProps","__spreadValues","e","captureWebVitals","send","onLCP","onCLS","onINP","onFCP","onTTFB","fn","m","e","DEFAULT_ENDPOINT","BlueWhaleClient","config","__spreadValues","BreadcrumbBuffer","Transport","_a","_b","_c","err","captureWebVitals","name","value","rating","partial","event","__spreadProps","result","userId","message","data","SDK_VERSION","getAnonymousId","id","b","getSessionId","Analytics","config","__spreadValues","origPush","args","userId","properties","eventName","payload","batch","e","flagKey","_a","cacheKey","cached","uid","anonId","params","data","SessionRecorder","maxEvents","a","n","ev","mutations","_a","m","onClick","e","t","onInput","lastScroll","onScroll","now","lastResize","onResize","fn","stopAndFlushReplay","recorder","opts","events","base","_client","_analytics","init","config","BlueWhaleClient","Analytics","__spreadValues","track","eventName","properties","identify","userId","page","isFeatureEnabled","flagKey","_a","getFeatureVariant","captureError","err","extra","e","addBreadcrumb","message","data","setUser"]}
package/dist/index.d.cts CHANGED
@@ -58,6 +58,19 @@ declare class BlueWhaleClient {
58
58
  addBreadcrumb(message: string, data?: Record<string, unknown>): void;
59
59
  }
60
60
 
61
+ /**
62
+ * Product analytics — replaces PostHog.
63
+ * track(), identify(), page(), and feature flag evaluation.
64
+ */
65
+ interface AnalyticsConfig {
66
+ apiKey: string;
67
+ ventureId?: string;
68
+ endpoint?: string;
69
+ environment?: string;
70
+ orgId?: string;
71
+ autoPageView?: boolean;
72
+ }
73
+
61
74
  interface ReplayEvent {
62
75
  type: 'dom_mutation' | 'click' | 'input' | 'scroll' | 'resize' | 'navigation';
63
76
  timestamp: number;
@@ -83,14 +96,24 @@ declare function stopAndFlushReplay(recorder: SessionRecorder, opts: {
83
96
  }): Promise<void>;
84
97
 
85
98
  /**
86
- * Initialize BLUEWHALE error capture.
87
- * Call once typically in your app's entry point or _app.tsx.
99
+ * Initialize BLUEWHALE error capture + product analytics + feature flags.
100
+ * One call replaces Sentry + PostHog + Vercel Analytics + LaunchDarkly.
88
101
  *
89
102
  * @example
90
103
  * import { init } from '@bluewhaleops/browser';
91
- * init({ apiKey: 'bw_agent_xxx', ventureId: 'your-venture-uuid' });
104
+ * init({ apiKey: 'bw_agent_xxx', ventureId: 'uuid', orgId: 'uuid' });
92
105
  */
93
- declare function init(config: BlueWhaleConfig): void;
106
+ declare function init(config: BlueWhaleConfig & Partial<AnalyticsConfig>): void;
107
+ /** Track a custom event. Replaces posthog.capture() */
108
+ declare function track(eventName: string, properties?: Record<string, unknown>): void;
109
+ /** Identify a user. Replaces posthog.identify() */
110
+ declare function identify(userId: string, properties?: Record<string, unknown>): void;
111
+ /** Track a page view. Auto-called on init unless autoPageView=false. */
112
+ declare function page(properties?: Record<string, unknown>): void;
113
+ /** Check if a feature flag is enabled. Replaces posthog.isFeatureEnabled() */
114
+ declare function isFeatureEnabled(flagKey: string, userId?: string): Promise<boolean>;
115
+ /** Get a feature flag variant. Replaces posthog.getFeatureFlag() */
116
+ declare function getFeatureVariant(flagKey: string, userId?: string): Promise<string | null>;
94
117
  /**
95
118
  * Manually capture an error or exception.
96
119
  */
@@ -104,4 +127,4 @@ declare function addBreadcrumb(message: string, data?: Record<string, unknown>):
104
127
  */
105
128
  declare function setUser(userId: string): void;
106
129
 
107
- export { BlueWhaleClient, type BlueWhaleConfig, type Breadcrumb, type ErrorEvent, type ReplayEvent, SessionRecorder, addBreadcrumb, captureError, init, setUser, stopAndFlushReplay };
130
+ export { type AnalyticsConfig, BlueWhaleClient, type BlueWhaleConfig, type Breadcrumb, type ErrorEvent, type ReplayEvent, SessionRecorder, addBreadcrumb, captureError, getFeatureVariant, identify, init, isFeatureEnabled, page, setUser, stopAndFlushReplay, track };
package/dist/index.d.ts CHANGED
@@ -58,6 +58,19 @@ declare class BlueWhaleClient {
58
58
  addBreadcrumb(message: string, data?: Record<string, unknown>): void;
59
59
  }
60
60
 
61
+ /**
62
+ * Product analytics — replaces PostHog.
63
+ * track(), identify(), page(), and feature flag evaluation.
64
+ */
65
+ interface AnalyticsConfig {
66
+ apiKey: string;
67
+ ventureId?: string;
68
+ endpoint?: string;
69
+ environment?: string;
70
+ orgId?: string;
71
+ autoPageView?: boolean;
72
+ }
73
+
61
74
  interface ReplayEvent {
62
75
  type: 'dom_mutation' | 'click' | 'input' | 'scroll' | 'resize' | 'navigation';
63
76
  timestamp: number;
@@ -83,14 +96,24 @@ declare function stopAndFlushReplay(recorder: SessionRecorder, opts: {
83
96
  }): Promise<void>;
84
97
 
85
98
  /**
86
- * Initialize BLUEWHALE error capture.
87
- * Call once typically in your app's entry point or _app.tsx.
99
+ * Initialize BLUEWHALE error capture + product analytics + feature flags.
100
+ * One call replaces Sentry + PostHog + Vercel Analytics + LaunchDarkly.
88
101
  *
89
102
  * @example
90
103
  * import { init } from '@bluewhaleops/browser';
91
- * init({ apiKey: 'bw_agent_xxx', ventureId: 'your-venture-uuid' });
104
+ * init({ apiKey: 'bw_agent_xxx', ventureId: 'uuid', orgId: 'uuid' });
92
105
  */
93
- declare function init(config: BlueWhaleConfig): void;
106
+ declare function init(config: BlueWhaleConfig & Partial<AnalyticsConfig>): void;
107
+ /** Track a custom event. Replaces posthog.capture() */
108
+ declare function track(eventName: string, properties?: Record<string, unknown>): void;
109
+ /** Identify a user. Replaces posthog.identify() */
110
+ declare function identify(userId: string, properties?: Record<string, unknown>): void;
111
+ /** Track a page view. Auto-called on init unless autoPageView=false. */
112
+ declare function page(properties?: Record<string, unknown>): void;
113
+ /** Check if a feature flag is enabled. Replaces posthog.isFeatureEnabled() */
114
+ declare function isFeatureEnabled(flagKey: string, userId?: string): Promise<boolean>;
115
+ /** Get a feature flag variant. Replaces posthog.getFeatureFlag() */
116
+ declare function getFeatureVariant(flagKey: string, userId?: string): Promise<string | null>;
94
117
  /**
95
118
  * Manually capture an error or exception.
96
119
  */
@@ -104,4 +127,4 @@ declare function addBreadcrumb(message: string, data?: Record<string, unknown>):
104
127
  */
105
128
  declare function setUser(userId: string): void;
106
129
 
107
- export { BlueWhaleClient, type BlueWhaleConfig, type Breadcrumb, type ErrorEvent, type ReplayEvent, SessionRecorder, addBreadcrumb, captureError, init, setUser, stopAndFlushReplay };
130
+ export { type AnalyticsConfig, BlueWhaleClient, type BlueWhaleConfig, type Breadcrumb, type ErrorEvent, type ReplayEvent, SessionRecorder, addBreadcrumb, captureError, getFeatureVariant, identify, init, isFeatureEnabled, page, setUser, stopAndFlushReplay, track };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{a as p,b as l}from"./chunk-SJIZN76S.js";var h=class{constructor(e=50){this.buffer=[];this.max=e}add(e){this.buffer.push(e),this.buffer.length>this.max&&this.buffer.shift()}flush(){return[...this.buffer]}instrument(){if(typeof window=="undefined")return;let e=history.pushState.bind(history);history.pushState=(...r)=>{var n;return this.add({type:"navigation",message:`\u2192 ${(n=r[2])!=null?n:""}`,timestamp:Date.now()}),e(...r)},["log","warn","error","info"].forEach(r=>{let n=console[r].bind(console);console[r]=(...o)=>{let u=r==="log"?"info":r;this.add({type:"console",category:r,message:o.map(String).join(" ").slice(0,300),level:u,timestamp:Date.now()}),n(...o)}});let t=window.fetch.bind(window);window.fetch=async(r,n)=>{var a;let o=typeof r=="string"?r:r instanceof URL?r.href:r.url,u=(a=n==null?void 0:n.method)!=null?a:"GET",s=Date.now();try{let c=await t(r,n);return this.add({type:"fetch",category:"http",message:`${u} ${o}`,level:c.ok?"info":"warn",timestamp:s,data:{status:c.status,duration_ms:Date.now()-s}}),c}catch(c){throw this.add({type:"fetch",category:"http",message:`${u} ${o} failed`,level:"error",timestamp:s,data:{error:String(c)}}),c}},document.addEventListener("click",r=>{var u;let n=r.target;if(!n)return;let o=n.getAttribute("aria-label")||((u=n.innerText)==null?void 0:u.slice(0,60))||n.tagName;this.add({type:"click",message:o,timestamp:Date.now()})},{passive:!0,capture:!0})}};var y="1.0.0",m=class{constructor(e,t){this.queue=[];this.flushing=!1;this.endpoint=e,this.apiKey=t}enqueue(e){this.queue.length>=20&&this.queue.shift(),this.queue.push(l(p({},e),{sdk_version:y})),this.flush()}async flush(){if(this.flushing||this.queue.length===0)return;this.flushing=!0;let e=this.queue.shift();try{await fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(e),keepalive:!0})}catch(t){}finally{this.flushing=!1,this.queue.length>0&&this.flush()}}};function g(i){typeof window!="undefined"&&import("./web-vitals-FH47FXFS.js").then(({onLCP:e,onCLS:t,onINP:r,onFCP:n,onTTFB:o})=>{[e,t,r,n,o].forEach(u=>{try{u(s=>i(s.name,s.value,s.rating))}catch(s){}})}).catch(()=>{})}var w="https://bluewhaleops.com/api/ingest/error",f=class{constructor(e){this.initialized=!1;this.config=p({endpoint:w,environment:"production",release:"",maxBreadcrumbs:50,silent:!1,ventureId:""},e),this.crumbs=new h(this.config.maxBreadcrumbs),this.transport=new m(this.config.endpoint,this.config.apiKey)}init(){this.initialized||typeof window=="undefined"||(this.initialized=!0,this.crumbs.instrument(),window.addEventListener("error",e=>{var t,r,n;this.capture({error_type:(r=(t=e.error)==null?void 0:t.name)!=null?r:"Error",message:e.message||"Unknown error",stack:(n=e.error)==null?void 0:n.stack,url:window.location.href,source:"browser"})}),window.addEventListener("unhandledrejection",e=>{var r,n;let t=e.reason;this.capture({error_type:(r=t==null?void 0:t.name)!=null?r:"UnhandledRejection",message:(n=t==null?void 0:t.message)!=null?n:String(t),stack:t==null?void 0:t.stack,url:window.location.href,source:"browser"})}),g((e,t,r)=>{this.capture({error_type:"WebVital",message:e+": "+t.toFixed(1),source:"browser",tags:{vital:e,rating:r,value:String(Math.round(t))}})}))}capture(e){let t=l(p({error_type:"Error"},e),{user_agent:typeof navigator!="undefined"?navigator.userAgent:void 0,environment:this.config.environment,release:this.config.release||void 0,venture_id:this.config.ventureId||void 0,breadcrumbs:this.crumbs.flush()});if(this.config.beforeSend){let r=this.config.beforeSend(t);if(r===!1)return;t=r}this.transport.enqueue(t)}setUser(e){this._userId=e}addBreadcrumb(e,t){this.crumbs.add({type:"custom",message:e,timestamp:Date.now(),data:t})}};var v=class{constructor(e=500){this.events=[];this.observer=null;this.cleanups=[];if(this.maxEvents=e,typeof crypto!="undefined"&&crypto.randomUUID)this.sessionId=crypto.randomUUID();else{let t=new Uint32Array(4);crypto.getRandomValues(t),this.sessionId=Array.from(t).map(r=>r.toString(16).padStart(8,"0")).join("")}}push(e){this.events.length>=this.maxEvents&&this.events.shift(),this.events.push(e)}start(){if(typeof window=="undefined")return;this.observer=new MutationObserver(s=>{var a;for(let c of s)this.push({type:"dom_mutation",timestamp:performance.now(),data:{kind:c.type,tag:(a=c.target.tagName)!=null?a:"unknown",added:c.addedNodes.length,removed:c.removedNodes.length}})}),this.observer.observe(document.body,{childList:!0,subtree:!0,attributes:!0});let e=s=>{let a=s.target;this.push({type:"click",timestamp:performance.now(),data:{tag:a.tagName,label:(a.getAttribute("aria-label")||a.id||"").slice(0,60)}})};document.addEventListener("click",e,{passive:!0,capture:!0}),this.cleanups.push(()=>document.removeEventListener("click",e,!0));let t=s=>{let a=s.target;this.push({type:"input",timestamp:performance.now(),data:{name:(a.name||a.id||a.type||"field").slice(0,60)}})};document.addEventListener("input",t,{passive:!0}),this.cleanups.push(()=>document.removeEventListener("input",t));let r=0,n=()=>{let s=performance.now();s-r<500||(r=s,this.push({type:"scroll",timestamp:s,data:{x:window.scrollX,y:window.scrollY}}))};document.addEventListener("scroll",n,{passive:!0}),this.cleanups.push(()=>document.removeEventListener("scroll",n));let o=0,u=()=>{let s=performance.now();s-o<1e3||(o=s,this.push({type:"resize",timestamp:s,data:{w:window.innerWidth,h:window.innerHeight}}))};window.addEventListener("resize",u,{passive:!0}),this.cleanups.push(()=>window.removeEventListener("resize",u))}stop(){var e;(e=this.observer)==null||e.disconnect(),this.observer=null,this.cleanups.forEach(t=>t()),this.cleanups=[]}getEvents(){return[...this.events]}getSessionId(){return this.sessionId}};async function b(i,e){var n;i.stop();let t=i.getEvents();if(!t.length)return;let r=(n=e.endpoint)!=null?n:"https://bluewhaleops.com";try{await fetch(r+"/api/ingest/replay",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+e.apiKey},body:JSON.stringify({session_id:i.getSessionId(),venture_id:e.ventureId,events:t,event_count:t.length,page_url:typeof window!="undefined"?window.location.href:""}),keepalive:!0})}catch(o){}}var d=null;function W(i){d=new f(i),d.init()}function z(i,e){if(!d)return;let t=i instanceof Error?i:new Error(String(i));d.capture(p({error_type:t.name,message:t.message,stack:t.stack,source:"browser"},e))}function A(i,e){d==null||d.addBreadcrumb(i,e)}function C(i){d==null||d.setUser(i)}export{f as BlueWhaleClient,v as SessionRecorder,A as addBreadcrumb,z as captureError,W as init,C as setUser,b as stopAndFlushReplay};
1
+ import{a as c,b as h}from"./chunk-SJIZN76S.js";var f=class{constructor(e=50){this.buffer=[];this.max=e}add(e){this.buffer.push(e),this.buffer.length>this.max&&this.buffer.shift()}flush(){return[...this.buffer]}instrument(){if(typeof window=="undefined")return;let e=history.pushState.bind(history);history.pushState=(...n)=>{var i;return this.add({type:"navigation",message:`\u2192 ${(i=n[2])!=null?i:""}`,timestamp:Date.now()}),e(...n)},["log","warn","error","info"].forEach(n=>{let i=console[n].bind(console);console[n]=(...a)=>{let u=n==="log"?"info":n;this.add({type:"console",category:n,message:a.map(String).join(" ").slice(0,300),level:u,timestamp:Date.now()}),i(...a)}});let t=window.fetch.bind(window);window.fetch=async(n,i)=>{var d;let a=typeof n=="string"?n:n instanceof URL?n.href:n.url,u=(d=i==null?void 0:i.method)!=null?d:"GET",s=Date.now();try{let p=await t(n,i);return this.add({type:"fetch",category:"http",message:`${u} ${a}`,level:p.ok?"info":"warn",timestamp:s,data:{status:p.status,duration_ms:Date.now()-s}}),p}catch(p){throw this.add({type:"fetch",category:"http",message:`${u} ${a} failed`,level:"error",timestamp:s,data:{error:String(p)}}),p}},document.addEventListener("click",n=>{var u;let i=n.target;if(!i)return;let a=i.getAttribute("aria-label")||((u=i.innerText)==null?void 0:u.slice(0,60))||i.tagName;this.add({type:"click",message:a,timestamp:Date.now()})},{passive:!0,capture:!0})}};var k="1.0.0",g=class{constructor(e,t){this.queue=[];this.flushing=!1;this.endpoint=e,this.apiKey=t}enqueue(e){this.queue.length>=20&&this.queue.shift(),this.queue.push(h(c({},e),{sdk_version:k})),this.flush()}async flush(){if(this.flushing||this.queue.length===0)return;this.flushing=!0;let e=this.queue.shift();try{await fetch(this.endpoint,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.apiKey}`},body:JSON.stringify(e),keepalive:!0})}catch(t){}finally{this.flushing=!1,this.queue.length>0&&this.flush()}}};function E(r){typeof window!="undefined"&&import("./web-vitals-FH47FXFS.js").then(({onLCP:e,onCLS:t,onINP:n,onFCP:i,onTTFB:a})=>{[e,t,n,i,a].forEach(u=>{try{u(s=>r(s.name,s.value,s.rating))}catch(s){}})}).catch(()=>{})}var S="https://bluewhaleops.com/api/ingest/error",m=class{constructor(e){this.initialized=!1;this.config=c({endpoint:S,environment:"production",release:"",maxBreadcrumbs:50,silent:!1,ventureId:""},e),this.crumbs=new f(this.config.maxBreadcrumbs),this.transport=new g(this.config.endpoint,this.config.apiKey)}init(){this.initialized||typeof window=="undefined"||(this.initialized=!0,this.crumbs.instrument(),window.addEventListener("error",e=>{var t,n,i;this.capture({error_type:(n=(t=e.error)==null?void 0:t.name)!=null?n:"Error",message:e.message||"Unknown error",stack:(i=e.error)==null?void 0:i.stack,url:window.location.href,source:"browser"})}),window.addEventListener("unhandledrejection",e=>{var n,i;let t=e.reason;this.capture({error_type:(n=t==null?void 0:t.name)!=null?n:"UnhandledRejection",message:(i=t==null?void 0:t.message)!=null?i:String(t),stack:t==null?void 0:t.stack,url:window.location.href,source:"browser"})}),E((e,t,n)=>{this.capture({error_type:"WebVital",message:e+": "+t.toFixed(1),source:"browser",tags:{vital:e,rating:n,value:String(Math.round(t))}})}))}capture(e){let t=h(c({error_type:"Error"},e),{user_agent:typeof navigator!="undefined"?navigator.userAgent:void 0,environment:this.config.environment,release:this.config.release||void 0,venture_id:this.config.ventureId||void 0,breadcrumbs:this.crumbs.flush()});if(this.config.beforeSend){let n=this.config.beforeSend(t);if(n===!1)return;t=n}this.transport.enqueue(t)}setUser(e){this._userId=e}addBreadcrumb(e,t){this.crumbs.add({type:"custom",message:e,timestamp:Date.now(),data:t})}};var x="1.2.0";function y(){if(typeof localStorage=="undefined")return"anon";let r=localStorage.getItem("_bw_anon");return r||(r=Array.from(crypto.getRandomValues(new Uint8Array(16))).map(e=>e.toString(16).padStart(2,"0")).join(""),localStorage.setItem("_bw_anon",r)),r}function R(){if(typeof sessionStorage=="undefined")return"";let r=sessionStorage.getItem("_bw_session");return r||(r=Array.from(crypto.getRandomValues(new Uint8Array(8))).map(e=>e.toString(16).padStart(2,"0")).join(""),sessionStorage.setItem("_bw_session",r)),r}var v=class{constructor(e){this.userProps={};this.queue=[];this.flushTimer=null;this.flagCache=new Map;this.config=c({endpoint:"https://bluewhaleops.com",environment:"production",orgId:"",autoPageView:!0,ventureId:""},e)}init(){if(typeof window!="undefined"&&this.config.autoPageView){this.page();let e=history.pushState.bind(history);history.pushState=(...t)=>{e(...t),setTimeout(()=>this.page(),0)},window.addEventListener("popstate",()=>this.page())}}identify(e,t){this.userId=e,this.userProps=t!=null?t:{},this.track("$identify",c({},t))}page(e){this.track("$pageview",c({url:typeof window!="undefined"?window.location.href:void 0,referrer:typeof document!="undefined"?document.referrer:void 0,title:typeof document!="undefined"?document.title:void 0},e))}track(e,t){let n={event_name:e,user_id:this.userId,anonymous_id:y(),session_id:R(),url:typeof window!="undefined"?window.location.href:void 0,properties:c(c({},this.userProps),t),venture_id:this.config.ventureId||void 0,environment:this.config.environment,sdk_version:x,timestamp:typeof performance!="undefined"?Date.now():void 0};this.queue.push(n),this.scheduleFlush()}scheduleFlush(){this.flushTimer||(this.flushTimer=setTimeout(()=>this.flush(),500))}async flush(){if(this.flushTimer=null,!this.queue.length)return;let e=this.queue.splice(0,50);try{await fetch(`${this.config.endpoint}/api/ingest/event`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`},body:JSON.stringify({events:e}),keepalive:!0})}catch(t){}this.queue.length&&this.flush()}async isFeatureEnabled(e,t){return(await this.evaluateFlag(e,t)).enabled}async getFeatureVariant(e,t){return(await this.evaluateFlag(e,t)).variant}async evaluateFlag(e,t){var a;let n=`${e}:${(a=t!=null?t:this.userId)!=null?a:y()}`,i=this.flagCache.get(n);if(i&&i.expires>Date.now())return i.result;if(!this.config.orgId)return{enabled:!1,variant:null};try{let u=t!=null?t:this.userId,s=y(),d=new URLSearchParams(c({key:e,org_id:this.config.orgId},u?{user_id:u}:{anonymous_id:s})),b=await(await fetch(`${this.config.endpoint}/api/features?${d}`)).json();return this.flagCache.set(n,{result:b,expires:Date.now()+6e4}),b}catch(u){return{enabled:!1,variant:null}}}};var w=class{constructor(e=500){this.events=[];this.observer=null;this.cleanups=[];if(this.maxEvents=e,typeof crypto!="undefined"&&crypto.randomUUID)this.sessionId=crypto.randomUUID();else{let t=new Uint32Array(4);crypto.getRandomValues(t),this.sessionId=Array.from(t).map(n=>n.toString(16).padStart(8,"0")).join("")}}push(e){this.events.length>=this.maxEvents&&this.events.shift(),this.events.push(e)}start(){if(typeof window=="undefined")return;this.observer=new MutationObserver(s=>{var d;for(let p of s)this.push({type:"dom_mutation",timestamp:performance.now(),data:{kind:p.type,tag:(d=p.target.tagName)!=null?d:"unknown",added:p.addedNodes.length,removed:p.removedNodes.length}})}),this.observer.observe(document.body,{childList:!0,subtree:!0,attributes:!0});let e=s=>{let d=s.target;this.push({type:"click",timestamp:performance.now(),data:{tag:d.tagName,label:(d.getAttribute("aria-label")||d.id||"").slice(0,60)}})};document.addEventListener("click",e,{passive:!0,capture:!0}),this.cleanups.push(()=>document.removeEventListener("click",e,!0));let t=s=>{let d=s.target;this.push({type:"input",timestamp:performance.now(),data:{name:(d.name||d.id||d.type||"field").slice(0,60)}})};document.addEventListener("input",t,{passive:!0}),this.cleanups.push(()=>document.removeEventListener("input",t));let n=0,i=()=>{let s=performance.now();s-n<500||(n=s,this.push({type:"scroll",timestamp:s,data:{x:window.scrollX,y:window.scrollY}}))};document.addEventListener("scroll",i,{passive:!0}),this.cleanups.push(()=>document.removeEventListener("scroll",i));let a=0,u=()=>{let s=performance.now();s-a<1e3||(a=s,this.push({type:"resize",timestamp:s,data:{w:window.innerWidth,h:window.innerHeight}}))};window.addEventListener("resize",u,{passive:!0}),this.cleanups.push(()=>window.removeEventListener("resize",u))}stop(){var e;(e=this.observer)==null||e.disconnect(),this.observer=null,this.cleanups.forEach(t=>t()),this.cleanups=[]}getEvents(){return[...this.events]}getSessionId(){return this.sessionId}};async function P(r,e){var i;r.stop();let t=r.getEvents();if(!t.length)return;let n=(i=e.endpoint)!=null?i:"https://bluewhaleops.com";try{await fetch(n+"/api/ingest/replay",{method:"POST",headers:{"Content-Type":"application/json",Authorization:"Bearer "+e.apiKey},body:JSON.stringify({session_id:r.getSessionId(),venture_id:e.ventureId,events:t,event_count:t.length,page_url:typeof window!="undefined"?window.location.href:""}),keepalive:!0})}catch(a){}}var l=null,o=null;function N(r){l=new m(r),l.init(),o=new v(c({},r)),o.init()}function O(r,e){o==null||o.track(r,e)}function W(r,e){o==null||o.identify(r,e),l==null||l.setUser(r)}function j(r){o==null||o.page(r)}function K(r,e){var t;return(t=o==null?void 0:o.isFeatureEnabled(r,e))!=null?t:Promise.resolve(!1)}function M(r,e){var t;return(t=o==null?void 0:o.getFeatureVariant(r,e))!=null?t:Promise.resolve(null)}function H(r,e){if(!l)return;let t=r instanceof Error?r:new Error(String(r));l.capture(c({error_type:t.name,message:t.message,stack:t.stack,source:"browser"},e))}function J(r,e){l==null||l.addBreadcrumb(r,e)}function G(r){l==null||l.setUser(r)}export{m as BlueWhaleClient,w as SessionRecorder,J as addBreadcrumb,H as captureError,M as getFeatureVariant,W as identify,N as init,K as isFeatureEnabled,j as page,G as setUser,P as stopAndFlushReplay,O as track};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/breadcrumbs.ts","../src/transport.ts","../src/vitals.ts","../src/core.ts","../src/replay.ts","../src/index.ts"],"sourcesContent":["import type { Breadcrumb } from './types';\n\nexport class BreadcrumbBuffer {\n private buffer: Breadcrumb[] = [];\n private max: number;\n\n constructor(max = 50) {\n this.max = max;\n }\n\n add(crumb: Breadcrumb): void {\n this.buffer.push(crumb);\n if (this.buffer.length > this.max) this.buffer.shift();\n }\n\n flush(): Breadcrumb[] {\n return [...this.buffer];\n }\n\n instrument(): void {\n if (typeof window === 'undefined') return;\n\n // Navigation breadcrumbs\n const origPushState = history.pushState.bind(history);\n history.pushState = (...args) => {\n this.add({ type: 'navigation', message: `→ ${args[2] ?? ''}`, timestamp: Date.now() });\n return origPushState(...args);\n };\n\n // Console breadcrumbs\n (['log', 'warn', 'error', 'info'] as const).forEach((method) => {\n const orig = console[method].bind(console);\n console[method] = (...args: unknown[]) => {\n const level = method === 'log' ? 'info' : method as 'warn' | 'error' | 'info';\n this.add({\n type: 'console',\n category: method,\n message: args.map(String).join(' ').slice(0, 300),\n level,\n timestamp: Date.now(),\n });\n orig(...args);\n };\n });\n\n // Fetch breadcrumbs\n const origFetch = window.fetch.bind(window);\n window.fetch = async (input, init) => {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n const method = init?.method ?? 'GET';\n const start = Date.now();\n try {\n const res = await origFetch(input, init);\n this.add({\n type: 'fetch',\n category: 'http',\n message: `${method} ${url}`,\n level: res.ok ? 'info' : 'warn',\n timestamp: start,\n data: { status: res.status, duration_ms: Date.now() - start },\n });\n return res;\n } catch (err) {\n this.add({\n type: 'fetch',\n category: 'http',\n message: `${method} ${url} failed`,\n level: 'error',\n timestamp: start,\n data: { error: String(err) },\n });\n throw err;\n }\n };\n\n // Click breadcrumbs (top-level only, lightweight)\n document.addEventListener('click', (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n const label = target.getAttribute('aria-label') || target.innerText?.slice(0, 60) || target.tagName;\n this.add({ type: 'click', message: label, timestamp: Date.now() });\n }, { passive: true, capture: true });\n }\n}\n","import type { ErrorEvent } from './types';\n\nconst SDK_VERSION = '1.0.0';\n\nexport class Transport {\n private endpoint: string;\n private apiKey: string;\n private queue: ErrorEvent[] = [];\n private flushing = false;\n\n constructor(endpoint: string, apiKey: string) {\n this.endpoint = endpoint;\n this.apiKey = apiKey;\n }\n\n enqueue(event: ErrorEvent): void {\n // Cap queue at 20 to avoid memory bloat\n if (this.queue.length >= 20) this.queue.shift();\n this.queue.push({ ...event, sdk_version: SDK_VERSION });\n this.flush();\n }\n\n private async flush(): Promise<void> {\n if (this.flushing || this.queue.length === 0) return;\n this.flushing = true;\n const event = this.queue.shift()!;\n try {\n await fetch(this.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(event),\n keepalive: true, // survives page unload\n });\n } catch {\n // Silent fail — don't error-loop\n } finally {\n this.flushing = false;\n if (this.queue.length > 0) this.flush();\n }\n }\n}\n","export function captureWebVitals(\n send: (name: string, value: number, rating: string) => void\n): void {\n if (typeof window === 'undefined') return;\n import('web-vitals').then(({ onLCP, onCLS, onINP, onFCP, onTTFB }) => {\n [onLCP, onCLS, onINP, onFCP, onTTFB].forEach(fn => {\n try {\n fn((m: { name: string; value: number; rating: string }) =>\n send(m.name, m.value, m.rating)\n );\n } catch {}\n });\n }).catch(() => {});\n}\n","import type { BlueWhaleConfig, ErrorEvent, ErrorSource } from './types';\nimport { BreadcrumbBuffer } from './breadcrumbs';\nimport { Transport } from './transport';\nimport { captureWebVitals } from './vitals';\n\nconst DEFAULT_ENDPOINT = 'https://bluewhaleops.com/api/ingest/error';\n\nexport class BlueWhaleClient {\n private config: Required<Omit<BlueWhaleConfig, 'beforeSend'>> & Pick<BlueWhaleConfig, 'beforeSend'>;\n private crumbs: BreadcrumbBuffer;\n private transport: Transport;\n private initialized = false;\n\n constructor(config: BlueWhaleConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n environment: 'production',\n release: '',\n maxBreadcrumbs: 50,\n silent: false,\n ventureId: '',\n ...config,\n };\n this.crumbs = new BreadcrumbBuffer(this.config.maxBreadcrumbs);\n this.transport = new Transport(this.config.endpoint, this.config.apiKey);\n }\n\n init(): void {\n if (this.initialized || typeof window === 'undefined') return;\n this.initialized = true;\n\n this.crumbs.instrument();\n\n // Global JS errors\n window.addEventListener('error', (e) => {\n this.capture({\n error_type: e.error?.name ?? 'Error',\n message: e.message || 'Unknown error',\n stack: e.error?.stack,\n url: window.location.href,\n source: 'browser',\n });\n });\n\n // Unhandled promise rejections\n window.addEventListener('unhandledrejection', (e) => {\n const err = e.reason;\n this.capture({\n error_type: err?.name ?? 'UnhandledRejection',\n message: err?.message ?? String(err),\n stack: err?.stack,\n url: window.location.href,\n source: 'browser',\n });\n });\n\n // Web Vitals — LCP, CLS, INP, FCP, TTFB\n captureWebVitals((name, value, rating) => {\n this.capture({\n error_type: 'WebVital',\n message: name + ': ' + value.toFixed(1),\n source: 'browser',\n tags: { vital: name, rating, value: String(Math.round(value)) },\n });\n });\n }\n\n capture(partial: Partial<ErrorEvent> & { message: string; source: ErrorSource }): void {\n let event: ErrorEvent = {\n error_type: 'Error',\n ...partial,\n user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n environment: this.config.environment,\n release: this.config.release || undefined,\n venture_id: this.config.ventureId || undefined,\n breadcrumbs: this.crumbs.flush(),\n };\n\n if (this.config.beforeSend) {\n const result = this.config.beforeSend(event);\n if (result === false) return;\n event = result;\n }\n\n this.transport.enqueue(event);\n }\n\n setUser(userId: string): void {\n // Store for next capture — patch via a tag\n (this as unknown as Record<string, unknown>)._userId = userId;\n }\n\n addBreadcrumb(message: string, data?: Record<string, unknown>): void {\n this.crumbs.add({ type: 'custom', message, timestamp: Date.now(), data });\n }\n}\n","export interface ReplayEvent {\n type: 'dom_mutation' | 'click' | 'input' | 'scroll' | 'resize' | 'navigation';\n timestamp: number;\n data: Record<string, unknown>;\n}\n\nexport class SessionRecorder {\n private events: ReplayEvent[] = [];\n private maxEvents: number;\n private sessionId: string;\n private observer: MutationObserver | null = null;\n private cleanups: Array<() => void> = [];\n\n constructor(maxEvents = 500) {\n this.maxEvents = maxEvents;\n // Edge-compatible random ID — no Math.random, use crypto if available\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n this.sessionId = crypto.randomUUID();\n } else {\n const a = new Uint32Array(4);\n crypto.getRandomValues(a);\n this.sessionId = Array.from(a).map(n => n.toString(16).padStart(8, '0')).join('');\n }\n }\n\n private push(ev: ReplayEvent): void {\n if (this.events.length >= this.maxEvents) this.events.shift();\n this.events.push(ev);\n }\n\n start(): void {\n if (typeof window === 'undefined') return;\n\n // DOM mutations — structure only, never content\n this.observer = new MutationObserver((mutations) => {\n for (const m of mutations) {\n this.push({\n type: 'dom_mutation',\n timestamp: performance.now(),\n data: {\n kind: m.type,\n tag: (m.target as Element).tagName ?? 'unknown',\n added: m.addedNodes.length,\n removed: m.removedNodes.length,\n },\n });\n }\n });\n this.observer.observe(document.body, { childList: true, subtree: true, attributes: true });\n\n // Click — tag + label only\n const onClick = (e: Event) => {\n const t = e.target as HTMLElement;\n this.push({\n type: 'click',\n timestamp: performance.now(),\n data: { tag: t.tagName, label: (t.getAttribute('aria-label') || t.id || '').slice(0, 60) },\n });\n };\n document.addEventListener('click', onClick, { passive: true, capture: true });\n this.cleanups.push(() => document.removeEventListener('click', onClick, true));\n\n // Input — field name ONLY, never value (privacy)\n const onInput = (e: Event) => {\n const t = e.target as HTMLInputElement;\n this.push({\n type: 'input',\n timestamp: performance.now(),\n data: { name: (t.name || t.id || t.type || 'field').slice(0, 60) },\n });\n };\n document.addEventListener('input', onInput, { passive: true });\n this.cleanups.push(() => document.removeEventListener('input', onInput));\n\n // Scroll — throttled 500ms\n let lastScroll = 0;\n const onScroll = () => {\n const now = performance.now();\n if (now - lastScroll < 500) return;\n lastScroll = now;\n this.push({ type: 'scroll', timestamp: now, data: { x: window.scrollX, y: window.scrollY } });\n };\n document.addEventListener('scroll', onScroll, { passive: true });\n this.cleanups.push(() => document.removeEventListener('scroll', onScroll));\n\n // Resize — throttled 1000ms\n let lastResize = 0;\n const onResize = () => {\n const now = performance.now();\n if (now - lastResize < 1000) return;\n lastResize = now;\n this.push({ type: 'resize', timestamp: now, data: { w: window.innerWidth, h: window.innerHeight } });\n };\n window.addEventListener('resize', onResize, { passive: true });\n this.cleanups.push(() => window.removeEventListener('resize', onResize));\n }\n\n stop(): void {\n this.observer?.disconnect();\n this.observer = null;\n this.cleanups.forEach(fn => fn());\n this.cleanups = [];\n }\n\n getEvents(): ReplayEvent[] { return [...this.events]; }\n getSessionId(): string { return this.sessionId; }\n}\n\nexport async function stopAndFlushReplay(\n recorder: SessionRecorder,\n opts: { apiKey: string; endpoint?: string; ventureId?: string },\n): Promise<void> {\n recorder.stop();\n const events = recorder.getEvents();\n if (!events.length) return;\n const base = opts.endpoint ?? 'https://bluewhaleops.com';\n try {\n await fetch(base + '/api/ingest/replay', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: 'Bearer ' + opts.apiKey,\n },\n body: JSON.stringify({\n session_id: recorder.getSessionId(),\n venture_id: opts.ventureId,\n events,\n event_count: events.length,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n }),\n keepalive: true,\n });\n } catch {}\n}\n","import { BlueWhaleClient } from './core';\nimport type { BlueWhaleConfig, ErrorEvent, Breadcrumb } from './types';\n\nexport type { BlueWhaleConfig, ErrorEvent, Breadcrumb };\n\nlet _client: BlueWhaleClient | null = null;\n\n/**\n * Initialize BLUEWHALE error capture.\n * Call once — typically in your app's entry point or _app.tsx.\n *\n * @example\n * import { init } from '@bluewhaleops/browser';\n * init({ apiKey: 'bw_agent_xxx', ventureId: 'your-venture-uuid' });\n */\nexport function init(config: BlueWhaleConfig): void {\n _client = new BlueWhaleClient(config);\n _client.init();\n}\n\n/**\n * Manually capture an error or exception.\n */\nexport function captureError(err: unknown, extra?: Partial<ErrorEvent>): void {\n if (!_client) return;\n const e = err instanceof Error ? err : new Error(String(err));\n _client.capture({\n error_type: e.name,\n message: e.message,\n stack: e.stack,\n source: 'browser',\n ...extra,\n });\n}\n\n/**\n * Add a manual breadcrumb.\n */\nexport function addBreadcrumb(message: string, data?: Record<string, unknown>): void {\n _client?.addBreadcrumb(message, data);\n}\n\n/**\n * Tag the current user for error reports.\n */\nexport function setUser(userId: string): void {\n _client?.setUser(userId);\n}\n\nexport { BlueWhaleClient };\n\n// Session replay\nexport { SessionRecorder, stopAndFlushReplay } from './replay';\nexport type { ReplayEvent } from './replay';\n"],"mappings":"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","names":["BreadcrumbBuffer","max","crumb","origPushState","args","_a","method","orig","level","origFetch","input","init","url","start","res","err","e","target","label","SDK_VERSION","Transport","endpoint","apiKey","event","__spreadProps","__spreadValues","e","captureWebVitals","send","onLCP","onCLS","onINP","onFCP","onTTFB","fn","m","e","DEFAULT_ENDPOINT","BlueWhaleClient","config","__spreadValues","BreadcrumbBuffer","Transport","_a","_b","_c","err","captureWebVitals","name","value","rating","partial","event","__spreadProps","result","userId","message","data","SessionRecorder","maxEvents","a","n","ev","mutations","_a","m","onClick","e","t","onInput","lastScroll","onScroll","now","lastResize","onResize","fn","stopAndFlushReplay","recorder","opts","events","base","_client","init","config","BlueWhaleClient","captureError","err","extra","e","__spreadValues","addBreadcrumb","message","data","setUser","userId"]}
1
+ {"version":3,"sources":["../src/breadcrumbs.ts","../src/transport.ts","../src/vitals.ts","../src/core.ts","../src/analytics.ts","../src/replay.ts","../src/index.ts"],"sourcesContent":["import type { Breadcrumb } from './types';\n\nexport class BreadcrumbBuffer {\n private buffer: Breadcrumb[] = [];\n private max: number;\n\n constructor(max = 50) {\n this.max = max;\n }\n\n add(crumb: Breadcrumb): void {\n this.buffer.push(crumb);\n if (this.buffer.length > this.max) this.buffer.shift();\n }\n\n flush(): Breadcrumb[] {\n return [...this.buffer];\n }\n\n instrument(): void {\n if (typeof window === 'undefined') return;\n\n // Navigation breadcrumbs\n const origPushState = history.pushState.bind(history);\n history.pushState = (...args) => {\n this.add({ type: 'navigation', message: `→ ${args[2] ?? ''}`, timestamp: Date.now() });\n return origPushState(...args);\n };\n\n // Console breadcrumbs\n (['log', 'warn', 'error', 'info'] as const).forEach((method) => {\n const orig = console[method].bind(console);\n console[method] = (...args: unknown[]) => {\n const level = method === 'log' ? 'info' : method as 'warn' | 'error' | 'info';\n this.add({\n type: 'console',\n category: method,\n message: args.map(String).join(' ').slice(0, 300),\n level,\n timestamp: Date.now(),\n });\n orig(...args);\n };\n });\n\n // Fetch breadcrumbs\n const origFetch = window.fetch.bind(window);\n window.fetch = async (input, init) => {\n const url = typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n const method = init?.method ?? 'GET';\n const start = Date.now();\n try {\n const res = await origFetch(input, init);\n this.add({\n type: 'fetch',\n category: 'http',\n message: `${method} ${url}`,\n level: res.ok ? 'info' : 'warn',\n timestamp: start,\n data: { status: res.status, duration_ms: Date.now() - start },\n });\n return res;\n } catch (err) {\n this.add({\n type: 'fetch',\n category: 'http',\n message: `${method} ${url} failed`,\n level: 'error',\n timestamp: start,\n data: { error: String(err) },\n });\n throw err;\n }\n };\n\n // Click breadcrumbs (top-level only, lightweight)\n document.addEventListener('click', (e) => {\n const target = e.target as HTMLElement | null;\n if (!target) return;\n const label = target.getAttribute('aria-label') || target.innerText?.slice(0, 60) || target.tagName;\n this.add({ type: 'click', message: label, timestamp: Date.now() });\n }, { passive: true, capture: true });\n }\n}\n","import type { ErrorEvent } from './types';\n\nconst SDK_VERSION = '1.0.0';\n\nexport class Transport {\n private endpoint: string;\n private apiKey: string;\n private queue: ErrorEvent[] = [];\n private flushing = false;\n\n constructor(endpoint: string, apiKey: string) {\n this.endpoint = endpoint;\n this.apiKey = apiKey;\n }\n\n enqueue(event: ErrorEvent): void {\n // Cap queue at 20 to avoid memory bloat\n if (this.queue.length >= 20) this.queue.shift();\n this.queue.push({ ...event, sdk_version: SDK_VERSION });\n this.flush();\n }\n\n private async flush(): Promise<void> {\n if (this.flushing || this.queue.length === 0) return;\n this.flushing = true;\n const event = this.queue.shift()!;\n try {\n await fetch(this.endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify(event),\n keepalive: true, // survives page unload\n });\n } catch {\n // Silent fail — don't error-loop\n } finally {\n this.flushing = false;\n if (this.queue.length > 0) this.flush();\n }\n }\n}\n","export function captureWebVitals(\n send: (name: string, value: number, rating: string) => void\n): void {\n if (typeof window === 'undefined') return;\n import('web-vitals').then(({ onLCP, onCLS, onINP, onFCP, onTTFB }) => {\n [onLCP, onCLS, onINP, onFCP, onTTFB].forEach(fn => {\n try {\n fn((m: { name: string; value: number; rating: string }) =>\n send(m.name, m.value, m.rating)\n );\n } catch {}\n });\n }).catch(() => {});\n}\n","import type { BlueWhaleConfig, ErrorEvent, ErrorSource } from './types';\nimport { BreadcrumbBuffer } from './breadcrumbs';\nimport { Transport } from './transport';\nimport { captureWebVitals } from './vitals';\n\nconst DEFAULT_ENDPOINT = 'https://bluewhaleops.com/api/ingest/error';\n\nexport class BlueWhaleClient {\n private config: Required<Omit<BlueWhaleConfig, 'beforeSend'>> & Pick<BlueWhaleConfig, 'beforeSend'>;\n private crumbs: BreadcrumbBuffer;\n private transport: Transport;\n private initialized = false;\n\n constructor(config: BlueWhaleConfig) {\n this.config = {\n endpoint: DEFAULT_ENDPOINT,\n environment: 'production',\n release: '',\n maxBreadcrumbs: 50,\n silent: false,\n ventureId: '',\n ...config,\n };\n this.crumbs = new BreadcrumbBuffer(this.config.maxBreadcrumbs);\n this.transport = new Transport(this.config.endpoint, this.config.apiKey);\n }\n\n init(): void {\n if (this.initialized || typeof window === 'undefined') return;\n this.initialized = true;\n\n this.crumbs.instrument();\n\n // Global JS errors\n window.addEventListener('error', (e) => {\n this.capture({\n error_type: e.error?.name ?? 'Error',\n message: e.message || 'Unknown error',\n stack: e.error?.stack,\n url: window.location.href,\n source: 'browser',\n });\n });\n\n // Unhandled promise rejections\n window.addEventListener('unhandledrejection', (e) => {\n const err = e.reason;\n this.capture({\n error_type: err?.name ?? 'UnhandledRejection',\n message: err?.message ?? String(err),\n stack: err?.stack,\n url: window.location.href,\n source: 'browser',\n });\n });\n\n // Web Vitals — LCP, CLS, INP, FCP, TTFB\n captureWebVitals((name, value, rating) => {\n this.capture({\n error_type: 'WebVital',\n message: name + ': ' + value.toFixed(1),\n source: 'browser',\n tags: { vital: name, rating, value: String(Math.round(value)) },\n });\n });\n }\n\n capture(partial: Partial<ErrorEvent> & { message: string; source: ErrorSource }): void {\n let event: ErrorEvent = {\n error_type: 'Error',\n ...partial,\n user_agent: typeof navigator !== 'undefined' ? navigator.userAgent : undefined,\n environment: this.config.environment,\n release: this.config.release || undefined,\n venture_id: this.config.ventureId || undefined,\n breadcrumbs: this.crumbs.flush(),\n };\n\n if (this.config.beforeSend) {\n const result = this.config.beforeSend(event);\n if (result === false) return;\n event = result;\n }\n\n this.transport.enqueue(event);\n }\n\n setUser(userId: string): void {\n // Store for next capture — patch via a tag\n (this as unknown as Record<string, unknown>)._userId = userId;\n }\n\n addBreadcrumb(message: string, data?: Record<string, unknown>): void {\n this.crumbs.add({ type: 'custom', message, timestamp: Date.now(), data });\n }\n}\n","/**\n * Product analytics — replaces PostHog.\n * track(), identify(), page(), and feature flag evaluation.\n */\n\nconst SDK_VERSION = '1.2.0';\n\nexport interface AnalyticsConfig {\n apiKey: string;\n ventureId?: string;\n endpoint?: string;\n environment?: string;\n orgId?: string; // required for feature flag evaluation\n autoPageView?: boolean; // default: true\n}\n\ninterface EventPayload {\n event_name: string;\n user_id?: string;\n anonymous_id?: string;\n session_id?: string;\n url?: string;\n referrer?: string;\n properties?: Record<string, unknown>;\n venture_id?: string;\n environment?: string;\n sdk_version?: string;\n timestamp?: number;\n}\n\nfunction getAnonymousId(): string {\n if (typeof localStorage === 'undefined') return 'anon';\n let id = localStorage.getItem('_bw_anon');\n if (!id) {\n id = Array.from(crypto.getRandomValues(new Uint8Array(16)))\n .map(b => b.toString(16).padStart(2, '0')).join('');\n localStorage.setItem('_bw_anon', id);\n }\n return id;\n}\n\nfunction getSessionId(): string {\n if (typeof sessionStorage === 'undefined') return '';\n let id = sessionStorage.getItem('_bw_session');\n if (!id) {\n id = Array.from(crypto.getRandomValues(new Uint8Array(8)))\n .map(b => b.toString(16).padStart(2, '0')).join('');\n sessionStorage.setItem('_bw_session', id);\n }\n return id;\n}\n\nexport class Analytics {\n private config: Required<AnalyticsConfig>;\n private userId: string | undefined;\n private userProps: Record<string, unknown> = {};\n private queue: EventPayload[] = [];\n private flushTimer: ReturnType<typeof setTimeout> | null = null;\n private flagCache = new Map<string, { result: { enabled: boolean; variant: string | null }; expires: number }>();\n\n constructor(config: AnalyticsConfig) {\n this.config = {\n endpoint: 'https://bluewhaleops.com',\n environment: 'production',\n orgId: '',\n autoPageView: true,\n ventureId: '',\n ...config,\n };\n }\n\n init(): void {\n if (typeof window === 'undefined') return;\n\n if (this.config.autoPageView) {\n this.page();\n\n // SPA navigation\n const origPush = history.pushState.bind(history);\n history.pushState = (...args) => {\n origPush(...args);\n setTimeout(() => this.page(), 0);\n };\n window.addEventListener('popstate', () => this.page());\n }\n }\n\n identify(userId: string, properties?: Record<string, unknown>): void {\n this.userId = userId;\n this.userProps = properties ?? {};\n this.track('$identify', { ...properties });\n }\n\n page(properties?: Record<string, unknown>): void {\n this.track('$pageview', {\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n referrer: typeof document !== 'undefined' ? document.referrer : undefined,\n title: typeof document !== 'undefined' ? document.title : undefined,\n ...properties,\n });\n }\n\n track(eventName: string, properties?: Record<string, unknown>): void {\n const payload: EventPayload = {\n event_name: eventName,\n user_id: this.userId,\n anonymous_id: getAnonymousId(),\n session_id: getSessionId(),\n url: typeof window !== 'undefined' ? window.location.href : undefined,\n properties: { ...this.userProps, ...properties },\n venture_id: this.config.ventureId || undefined,\n environment: this.config.environment,\n sdk_version: SDK_VERSION,\n timestamp: typeof performance !== 'undefined' ? Date.now() : undefined,\n };\n\n this.queue.push(payload);\n this.scheduleFlush();\n }\n\n private scheduleFlush(): void {\n if (this.flushTimer) return;\n this.flushTimer = setTimeout(() => this.flush(), 500);\n }\n\n private async flush(): Promise<void> {\n this.flushTimer = null;\n if (!this.queue.length) return;\n const batch = this.queue.splice(0, 50);\n try {\n await fetch(`${this.config.endpoint}/api/ingest/event`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.apiKey}`,\n },\n body: JSON.stringify({ events: batch }),\n keepalive: true,\n });\n } catch {}\n if (this.queue.length) this.flush();\n }\n\n async isFeatureEnabled(flagKey: string, userId?: string): Promise<boolean> {\n const result = await this.evaluateFlag(flagKey, userId);\n return result.enabled;\n }\n\n async getFeatureVariant(flagKey: string, userId?: string): Promise<string | null> {\n const result = await this.evaluateFlag(flagKey, userId);\n return result.variant;\n }\n\n private async evaluateFlag(flagKey: string, userId?: string): Promise<{ enabled: boolean; variant: string | null }> {\n const cacheKey = `${flagKey}:${userId ?? this.userId ?? getAnonymousId()}`;\n const cached = this.flagCache.get(cacheKey);\n if (cached && cached.expires > Date.now()) return cached.result;\n\n if (!this.config.orgId) return { enabled: false, variant: null };\n\n try {\n const uid = userId ?? this.userId;\n const anonId = getAnonymousId();\n const params = new URLSearchParams({\n key: flagKey,\n org_id: this.config.orgId,\n ...(uid ? { user_id: uid } : { anonymous_id: anonId }),\n });\n const res = await fetch(`${this.config.endpoint}/api/features?${params}`);\n const data = await res.json() as { enabled: boolean; variant: string | null };\n // Cache for 60 seconds\n this.flagCache.set(cacheKey, { result: data, expires: Date.now() + 60_000 });\n return data;\n } catch {\n return { enabled: false, variant: null };\n }\n }\n}\n","export interface ReplayEvent {\n type: 'dom_mutation' | 'click' | 'input' | 'scroll' | 'resize' | 'navigation';\n timestamp: number;\n data: Record<string, unknown>;\n}\n\nexport class SessionRecorder {\n private events: ReplayEvent[] = [];\n private maxEvents: number;\n private sessionId: string;\n private observer: MutationObserver | null = null;\n private cleanups: Array<() => void> = [];\n\n constructor(maxEvents = 500) {\n this.maxEvents = maxEvents;\n // Edge-compatible random ID — no Math.random, use crypto if available\n if (typeof crypto !== 'undefined' && crypto.randomUUID) {\n this.sessionId = crypto.randomUUID();\n } else {\n const a = new Uint32Array(4);\n crypto.getRandomValues(a);\n this.sessionId = Array.from(a).map(n => n.toString(16).padStart(8, '0')).join('');\n }\n }\n\n private push(ev: ReplayEvent): void {\n if (this.events.length >= this.maxEvents) this.events.shift();\n this.events.push(ev);\n }\n\n start(): void {\n if (typeof window === 'undefined') return;\n\n // DOM mutations — structure only, never content\n this.observer = new MutationObserver((mutations) => {\n for (const m of mutations) {\n this.push({\n type: 'dom_mutation',\n timestamp: performance.now(),\n data: {\n kind: m.type,\n tag: (m.target as Element).tagName ?? 'unknown',\n added: m.addedNodes.length,\n removed: m.removedNodes.length,\n },\n });\n }\n });\n this.observer.observe(document.body, { childList: true, subtree: true, attributes: true });\n\n // Click — tag + label only\n const onClick = (e: Event) => {\n const t = e.target as HTMLElement;\n this.push({\n type: 'click',\n timestamp: performance.now(),\n data: { tag: t.tagName, label: (t.getAttribute('aria-label') || t.id || '').slice(0, 60) },\n });\n };\n document.addEventListener('click', onClick, { passive: true, capture: true });\n this.cleanups.push(() => document.removeEventListener('click', onClick, true));\n\n // Input — field name ONLY, never value (privacy)\n const onInput = (e: Event) => {\n const t = e.target as HTMLInputElement;\n this.push({\n type: 'input',\n timestamp: performance.now(),\n data: { name: (t.name || t.id || t.type || 'field').slice(0, 60) },\n });\n };\n document.addEventListener('input', onInput, { passive: true });\n this.cleanups.push(() => document.removeEventListener('input', onInput));\n\n // Scroll — throttled 500ms\n let lastScroll = 0;\n const onScroll = () => {\n const now = performance.now();\n if (now - lastScroll < 500) return;\n lastScroll = now;\n this.push({ type: 'scroll', timestamp: now, data: { x: window.scrollX, y: window.scrollY } });\n };\n document.addEventListener('scroll', onScroll, { passive: true });\n this.cleanups.push(() => document.removeEventListener('scroll', onScroll));\n\n // Resize — throttled 1000ms\n let lastResize = 0;\n const onResize = () => {\n const now = performance.now();\n if (now - lastResize < 1000) return;\n lastResize = now;\n this.push({ type: 'resize', timestamp: now, data: { w: window.innerWidth, h: window.innerHeight } });\n };\n window.addEventListener('resize', onResize, { passive: true });\n this.cleanups.push(() => window.removeEventListener('resize', onResize));\n }\n\n stop(): void {\n this.observer?.disconnect();\n this.observer = null;\n this.cleanups.forEach(fn => fn());\n this.cleanups = [];\n }\n\n getEvents(): ReplayEvent[] { return [...this.events]; }\n getSessionId(): string { return this.sessionId; }\n}\n\nexport async function stopAndFlushReplay(\n recorder: SessionRecorder,\n opts: { apiKey: string; endpoint?: string; ventureId?: string },\n): Promise<void> {\n recorder.stop();\n const events = recorder.getEvents();\n if (!events.length) return;\n const base = opts.endpoint ?? 'https://bluewhaleops.com';\n try {\n await fetch(base + '/api/ingest/replay', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: 'Bearer ' + opts.apiKey,\n },\n body: JSON.stringify({\n session_id: recorder.getSessionId(),\n venture_id: opts.ventureId,\n events,\n event_count: events.length,\n page_url: typeof window !== 'undefined' ? window.location.href : '',\n }),\n keepalive: true,\n });\n } catch {}\n}\n","import { BlueWhaleClient } from './core';\nimport { Analytics } from './analytics';\nimport type { BlueWhaleConfig, ErrorEvent, Breadcrumb } from './types';\nimport type { AnalyticsConfig } from './analytics';\n\nexport type { BlueWhaleConfig, ErrorEvent, Breadcrumb, AnalyticsConfig };\n\nlet _client: BlueWhaleClient | null = null;\nlet _analytics: Analytics | null = null;\n\n/**\n * Initialize BLUEWHALE — error capture + product analytics + feature flags.\n * One call replaces Sentry + PostHog + Vercel Analytics + LaunchDarkly.\n *\n * @example\n * import { init } from '@bluewhaleops/browser';\n * init({ apiKey: 'bw_agent_xxx', ventureId: 'uuid', orgId: 'uuid' });\n */\nexport function init(config: BlueWhaleConfig & Partial<AnalyticsConfig>): void {\n _client = new BlueWhaleClient(config);\n _client.init();\n _analytics = new Analytics({ ...config });\n _analytics.init();\n}\n\n// ── Product analytics ─────────────────────────────────────────────────────────\n\n/** Track a custom event. Replaces posthog.capture() */\nexport function track(eventName: string, properties?: Record<string, unknown>): void {\n _analytics?.track(eventName, properties);\n}\n\n/** Identify a user. Replaces posthog.identify() */\nexport function identify(userId: string, properties?: Record<string, unknown>): void {\n _analytics?.identify(userId, properties);\n _client?.setUser(userId);\n}\n\n/** Track a page view. Auto-called on init unless autoPageView=false. */\nexport function page(properties?: Record<string, unknown>): void {\n _analytics?.page(properties);\n}\n\n// ── Feature flags ─────────────────────────────────────────────────────────────\n\n/** Check if a feature flag is enabled. Replaces posthog.isFeatureEnabled() */\nexport function isFeatureEnabled(flagKey: string, userId?: string): Promise<boolean> {\n return _analytics?.isFeatureEnabled(flagKey, userId) ?? Promise.resolve(false);\n}\n\n/** Get a feature flag variant. Replaces posthog.getFeatureFlag() */\nexport function getFeatureVariant(flagKey: string, userId?: string): Promise<string | null> {\n return _analytics?.getFeatureVariant(flagKey, userId) ?? Promise.resolve(null);\n}\n\n/**\n * Manually capture an error or exception.\n */\nexport function captureError(err: unknown, extra?: Partial<ErrorEvent>): void {\n if (!_client) return;\n const e = err instanceof Error ? err : new Error(String(err));\n _client.capture({\n error_type: e.name,\n message: e.message,\n stack: e.stack,\n source: 'browser',\n ...extra,\n });\n}\n\n/**\n * Add a manual breadcrumb.\n */\nexport function addBreadcrumb(message: string, data?: Record<string, unknown>): void {\n _client?.addBreadcrumb(message, data);\n}\n\n/**\n * Tag the current user for error reports.\n */\nexport function setUser(userId: string): void {\n _client?.setUser(userId);\n}\n\nexport { BlueWhaleClient };\n\n// Session replay\nexport { SessionRecorder, stopAndFlushReplay } from './replay';\nexport type { ReplayEvent } from './replay';\n"],"mappings":"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","names":["BreadcrumbBuffer","max","crumb","origPushState","args","_a","method","orig","level","origFetch","input","init","url","start","res","err","e","target","label","SDK_VERSION","Transport","endpoint","apiKey","event","__spreadProps","__spreadValues","e","captureWebVitals","send","onLCP","onCLS","onINP","onFCP","onTTFB","fn","m","e","DEFAULT_ENDPOINT","BlueWhaleClient","config","__spreadValues","BreadcrumbBuffer","Transport","_a","_b","_c","err","captureWebVitals","name","value","rating","partial","event","__spreadProps","result","userId","message","data","SDK_VERSION","getAnonymousId","id","b","getSessionId","Analytics","config","__spreadValues","origPush","args","userId","properties","eventName","payload","batch","e","flagKey","_a","cacheKey","cached","uid","anonId","params","data","SessionRecorder","maxEvents","a","ev","mutations","_a","m","onClick","e","t","onInput","lastScroll","onScroll","now","lastResize","onResize","fn","stopAndFlushReplay","recorder","opts","events","base","_client","_analytics","init","config","BlueWhaleClient","Analytics","__spreadValues","track","eventName","properties","identify","userId","page","isFeatureEnabled","flagKey","_a","getFeatureVariant","captureError","err","extra","e","addBreadcrumb","message","data","setUser"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@bluewhaleops/browser",
3
- "version": "1.1.0",
4
- "description": "BLUEWHALE browser error capture SDK — drop-in Sentry replacement for web apps",
3
+ "version": "1.2.0",
4
+ "description": "BLUEWHALE SDK — replaces Sentry + PostHog + Vercel Analytics + LaunchDarkly",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
7
7
  "types": "dist/index.d.ts",