@onlive.ai/common-121 0.2.70 → 0.2.179
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/README.md +0 -1
- package/chunk-CHMR2I4G.js +2 -0
- package/components/asset/asset-modal-portal.cjs +550 -0
- package/components/asset/asset-modal-portal.d.cts +22 -0
- package/components/asset/asset-modal-portal.d.ts +22 -0
- package/components/asset/asset-modal-portal.js +550 -0
- package/components/asset/asset.cjs +3536 -0
- package/components/asset/asset.d.cts +37 -0
- package/components/asset/asset.d.ts +37 -0
- package/components/asset/asset.js +3536 -0
- package/components/asset/asset.loaders.cjs +2 -0
- package/components/asset/asset.loaders.d.cts +17 -0
- package/components/asset/asset.loaders.d.ts +17 -0
- package/components/asset/asset.loaders.js +2 -0
- package/components/asset/asset.renderer.cjs +2292 -0
- package/components/asset/asset.renderer.d.cts +29 -0
- package/components/asset/asset.renderer.d.ts +29 -0
- package/components/asset/asset.renderer.js +2292 -0
- package/components/asset/asset.styles.cjs +683 -0
- package/components/asset/asset.styles.d.cts +6 -0
- package/components/asset/asset.styles.d.ts +6 -0
- package/components/asset/asset.styles.js +683 -0
- package/components/asset/asset.types.cjs +2 -0
- package/components/asset/asset.types.d.cts +103 -0
- package/components/asset/asset.types.d.ts +103 -0
- package/components/asset/asset.types.js +1 -0
- package/components/asset/index.cjs +3536 -0
- package/components/asset/index.d.cts +8 -0
- package/components/asset/index.d.ts +8 -0
- package/components/asset/index.js +3536 -0
- package/components/player/player.cjs +2044 -0
- package/components/player/player.d.cts +25 -0
- package/components/player/player.d.ts +25 -0
- package/components/player/player.js +2044 -0
- package/components/player/player.styles.cjs +16 -0
- package/components/player/player.styles.d.cts +6 -0
- package/components/player/player.styles.d.ts +6 -0
- package/components/player/player.styles.js +16 -0
- package/components/side-bar/index.cjs +3185 -0
- package/components/side-bar/index.d.cts +11 -0
- package/components/side-bar/index.d.ts +11 -0
- package/components/side-bar/index.js +3185 -0
- package/components/side-bar/side-bar.cjs +3185 -0
- package/components/side-bar/side-bar.d.cts +83 -0
- package/components/side-bar/side-bar.d.ts +83 -0
- package/components/side-bar/side-bar.js +3185 -0
- package/components/side-bar/side-bar.styles.cjs +801 -0
- package/components/side-bar/side-bar.styles.d.cts +6 -0
- package/components/side-bar/side-bar.styles.d.ts +6 -0
- package/components/side-bar/side-bar.styles.js +801 -0
- package/components/side-bar/side-bar.types.cjs +2 -0
- package/components/side-bar/side-bar.types.d.cts +105 -0
- package/components/side-bar/side-bar.types.d.ts +105 -0
- package/components/side-bar/side-bar.types.js +2 -0
- package/components/upload/index.cjs +83 -0
- package/components/upload/index.d.cts +4 -0
- package/components/upload/index.d.ts +4 -0
- package/components/upload/index.js +83 -0
- package/components/upload/upload.cjs +83 -0
- package/components/upload/upload.d.cts +28 -0
- package/components/upload/upload.d.ts +28 -0
- package/components/upload/upload.js +83 -0
- package/components/upload/upload.styles.cjs +65 -0
- package/components/upload/upload.styles.d.cts +6 -0
- package/components/upload/upload.styles.d.ts +6 -0
- package/components/upload/upload.styles.js +65 -0
- package/components/upload/upload.types.cjs +2 -0
- package/components/upload/upload.types.d.cts +16 -0
- package/components/upload/upload.types.d.ts +16 -0
- package/components/upload/upload.types.js +1 -0
- package/index.cjs +4677 -0
- package/index.d.cts +4397 -0
- package/index.d.ts +4397 -0
- package/index.js +4677 -0
- package/media-TFGJGBU2.js +2 -0
- package/package.json +35 -11
- package/react/components/asset/Asset.cjs +2 -0
- package/react/components/asset/Asset.jsx +2 -0
- package/react/components/side-bar/SideBar.cjs +2 -0
- package/react/components/side-bar/SideBar.jsx +2 -0
- package/react/components/upload/Upload.cjs +2 -0
- package/react/components/upload/Upload.jsx +2 -0
- package/services/audio.service.cjs +2 -2
- package/services/audio.service.d.cts +1 -0
- package/services/audio.service.d.ts +1 -0
- package/services/audio.service.js +2 -2
- package/services/conversation/conversation.service.cjs +2 -0
- package/services/conversation/conversation.service.d.cts +543 -0
- package/services/conversation/conversation.service.d.ts +543 -0
- package/services/conversation/conversation.service.js +2 -0
- package/services/conversation/conversation.types.cjs +2 -0
- package/services/conversation/conversation.types.d.cts +525 -0
- package/services/conversation/conversation.types.d.ts +525 -0
- package/services/conversation/conversation.types.js +2 -0
- package/services/conversation/index.cjs +2 -0
- package/services/conversation/index.d.cts +24 -0
- package/services/conversation/index.d.ts +24 -0
- package/services/conversation/index.js +2 -0
- package/services/conversation/mock/actor/agent.cjs +2 -0
- package/services/conversation/mock/actor/agent.d.cts +202 -0
- package/services/conversation/mock/actor/agent.d.ts +202 -0
- package/services/conversation/mock/actor/agent.js +2 -0
- package/services/conversation/mock/actor/index.cjs +2 -0
- package/services/conversation/mock/actor/index.d.cts +4 -0
- package/services/conversation/mock/actor/index.d.ts +4 -0
- package/services/conversation/mock/actor/index.js +2 -0
- package/services/conversation/mock/actor/strategies.cjs +2 -0
- package/services/conversation/mock/actor/strategies.d.cts +31 -0
- package/services/conversation/mock/actor/strategies.d.ts +31 -0
- package/services/conversation/mock/actor/strategies.js +2 -0
- package/services/conversation/mock/errors.cjs +2 -0
- package/services/conversation/mock/errors.d.cts +125 -0
- package/services/conversation/mock/errors.d.ts +125 -0
- package/services/conversation/mock/errors.js +2 -0
- package/services/conversation/mock/events.cjs +2 -0
- package/services/conversation/mock/events.d.cts +253 -0
- package/services/conversation/mock/events.d.ts +253 -0
- package/services/conversation/mock/events.js +2 -0
- package/services/conversation/mock/factory.cjs +2 -0
- package/services/conversation/mock/factory.d.cts +134 -0
- package/services/conversation/mock/factory.d.ts +134 -0
- package/services/conversation/mock/factory.js +2 -0
- package/services/conversation/mock/fixtures.cjs +2 -0
- package/services/conversation/mock/fixtures.d.cts +191 -0
- package/services/conversation/mock/fixtures.d.ts +191 -0
- package/services/conversation/mock/fixtures.js +2 -0
- package/services/conversation/mock/generators.cjs +2 -0
- package/services/conversation/mock/generators.d.cts +123 -0
- package/services/conversation/mock/generators.d.ts +123 -0
- package/services/conversation/mock/generators.js +2 -0
- package/services/conversation/mock/index.cjs +2 -0
- package/services/conversation/mock/index.d.cts +24 -0
- package/services/conversation/mock/index.d.ts +24 -0
- package/services/conversation/mock/index.js +2 -0
- package/services/conversation/mock/livekit/index.cjs +2 -0
- package/services/conversation/mock/livekit/index.d.cts +7 -0
- package/services/conversation/mock/livekit/index.d.ts +7 -0
- package/services/conversation/mock/livekit/index.js +2 -0
- package/services/conversation/mock/livekit/local-participant.cjs +2 -0
- package/services/conversation/mock/livekit/local-participant.d.cts +204 -0
- package/services/conversation/mock/livekit/local-participant.d.ts +204 -0
- package/services/conversation/mock/livekit/local-participant.js +2 -0
- package/services/conversation/mock/livekit/participant.cjs +2 -0
- package/services/conversation/mock/livekit/participant.d.cts +171 -0
- package/services/conversation/mock/livekit/participant.d.ts +171 -0
- package/services/conversation/mock/livekit/participant.js +2 -0
- package/services/conversation/mock/livekit/room.cjs +2 -0
- package/services/conversation/mock/livekit/room.d.cts +292 -0
- package/services/conversation/mock/livekit/room.d.ts +292 -0
- package/services/conversation/mock/livekit/room.js +2 -0
- package/services/conversation/mock/livekit/streams.cjs +2 -0
- package/services/conversation/mock/livekit/streams.d.cts +190 -0
- package/services/conversation/mock/livekit/streams.d.ts +190 -0
- package/services/conversation/mock/livekit/streams.js +2 -0
- package/services/conversation/mock/livekit/tracks.cjs +2 -0
- package/services/conversation/mock/livekit/tracks.d.cts +149 -0
- package/services/conversation/mock/livekit/tracks.d.ts +149 -0
- package/services/conversation/mock/livekit/tracks.js +2 -0
- package/services/conversation/mock/media.cjs +2 -0
- package/services/conversation/mock/media.d.cts +174 -0
- package/services/conversation/mock/media.d.ts +174 -0
- package/services/conversation/mock/media.js +2 -0
- package/services/conversation/mock/service.cjs +2 -0
- package/services/conversation/mock/service.d.cts +300 -0
- package/services/conversation/mock/service.d.ts +300 -0
- package/services/conversation/mock/service.js +2 -0
- package/services/conversation/mock/service.test.cjs +2 -0
- package/services/conversation/mock/service.test.d.cts +1 -0
- package/services/conversation/mock/service.test.d.ts +1 -0
- package/services/conversation/mock/service.test.js +2 -0
- package/services/conversation/mock/state.cjs +2 -0
- package/services/conversation/mock/state.d.cts +296 -0
- package/services/conversation/mock/state.d.ts +296 -0
- package/services/conversation/mock/state.js +2 -0
- package/services/conversation/mock/storybook.cjs +2 -0
- package/services/conversation/mock/storybook.d.cts +197 -0
- package/services/conversation/mock/storybook.d.ts +197 -0
- package/services/conversation/mock/storybook.js +2 -0
- package/services/conversation/mock/types.cjs +2 -0
- package/services/conversation/mock/types.d.cts +442 -0
- package/services/conversation/mock/types.d.ts +442 -0
- package/services/conversation/mock/types.js +1 -0
- package/services/faqs/faqs.service.cjs +2 -0
- package/services/faqs/faqs.service.d.cts +16 -0
- package/services/faqs/faqs.service.d.ts +16 -0
- package/services/faqs/faqs.service.js +2 -0
- package/services/faqs/faqs.types.cjs +2 -0
- package/services/faqs/faqs.types.d.cts +60 -0
- package/services/faqs/faqs.types.d.ts +60 -0
- package/services/faqs/faqs.types.js +1 -0
- package/services/faqs/index.cjs +2 -0
- package/services/faqs/index.d.cts +3 -0
- package/services/faqs/index.d.ts +3 -0
- package/services/faqs/index.js +2 -0
- package/services/file/file.service.cjs +2 -0
- package/services/file/file.service.d.cts +66 -0
- package/services/file/file.service.d.ts +66 -0
- package/services/file/file.service.js +2 -0
- package/services/file/file.types.cjs +2 -0
- package/services/file/file.types.d.cts +72 -0
- package/services/file/file.types.d.ts +72 -0
- package/services/file/file.types.js +1 -0
- package/services/file/index.cjs +2 -0
- package/services/file/index.d.cts +3 -0
- package/services/file/index.d.ts +3 -0
- package/services/file/index.js +2 -0
- package/services/firebase/firebase-api.cjs +2 -2
- package/services/firebase/firebase-api.d.cts +25 -9
- package/services/firebase/firebase-api.d.ts +25 -9
- package/services/firebase/firebase-api.js +2 -2
- package/services/multimedia/config.example.cjs +2 -0
- package/services/multimedia/config.example.d.cts +13 -0
- package/services/multimedia/config.example.d.ts +13 -0
- package/services/multimedia/config.example.js +2 -0
- package/services/multimedia/index.cjs +2 -0
- package/services/multimedia/index.d.cts +3 -0
- package/services/multimedia/index.d.ts +3 -0
- package/services/multimedia/index.js +2 -0
- package/services/multimedia/multimedia.service.cjs +2 -0
- package/services/multimedia/multimedia.service.d.cts +28 -0
- package/services/multimedia/multimedia.service.d.ts +28 -0
- package/services/multimedia/multimedia.service.js +2 -0
- package/services/multimedia/multimedia.types.cjs +2 -0
- package/services/multimedia/multimedia.types.d.cts +65 -0
- package/services/multimedia/multimedia.types.d.ts +65 -0
- package/services/multimedia/multimedia.types.js +1 -0
- package/services/product/index.cjs +2 -0
- package/services/product/index.d.cts +3 -0
- package/services/product/index.d.ts +3 -0
- package/services/product/index.js +2 -0
- package/services/product/product.service.cjs +2 -0
- package/services/product/product.service.d.cts +19 -0
- package/services/product/product.service.d.ts +19 -0
- package/services/product/product.service.js +2 -0
- package/services/product/product.types.cjs +2 -0
- package/services/product/product.types.d.cts +78 -0
- package/services/product/product.types.d.ts +78 -0
- package/services/product/product.types.js +1 -0
- package/services/request.provider.cjs +1 -1
- package/services/request.provider.d.cts +1 -0
- package/services/request.provider.d.ts +1 -0
- package/services/request.provider.js +1 -1
- package/services/session.service.cjs +2 -0
- package/services/session.service.d.cts +70 -0
- package/services/session.service.d.ts +70 -0
- package/services/session.service.js +2 -0
- package/services/upload/index.cjs +2 -0
- package/services/upload/index.d.cts +2 -0
- package/services/upload/index.d.ts +2 -0
- package/services/upload/index.js +2 -0
- package/services/upload/upload.service.cjs +2 -0
- package/services/upload/upload.service.d.cts +81 -0
- package/services/upload/upload.service.d.ts +81 -0
- package/services/upload/upload.service.js +2 -0
- package/themes/dark.cjs +16 -2
- package/themes/dark.d.cts +1 -0
- package/themes/dark.d.ts +1 -0
- package/themes/dark.js +15 -1
- package/themes/light.cjs +13 -2
- package/themes/light.d.cts +1 -0
- package/themes/light.d.ts +1 -0
- package/themes/light.js +12 -1
- package/types/globals.cjs +2 -0
- package/types/globals.d.cts +39 -0
- package/types/globals.d.ts +39 -0
- package/types/globals.js +1 -0
- package/types/tracking-options.cjs +2 -2
- package/types/tracking-options.d.cts +8 -6
- package/types/tracking-options.d.ts +8 -6
- package/types/tracking-options.js +1 -1
- package/utils/adopt-styles.cjs +2 -2
- package/utils/adopt-styles.d.cts +1 -0
- package/utils/adopt-styles.d.ts +1 -0
- package/utils/adopt-styles.js +2 -2
- package/utils/browser-preferences.cjs +2 -2
- package/utils/browser-preferences.d.cts +1 -0
- package/utils/browser-preferences.d.ts +1 -0
- package/utils/browser-preferences.js +2 -2
- package/utils/classify-media.cjs +1 -1
- package/utils/classify-media.d.cts +1 -0
- package/utils/classify-media.d.ts +1 -0
- package/utils/classify-media.js +1 -1
- package/utils/decorators.cjs +1 -1
- package/utils/decorators.d.cts +1 -0
- package/utils/decorators.d.ts +1 -0
- package/utils/decorators.js +1 -1
- package/utils/detected-lang.cjs +2 -2
- package/utils/detected-lang.d.cts +1 -0
- package/utils/detected-lang.d.ts +1 -0
- package/utils/detected-lang.js +2 -2
- package/utils/fullscreen.cjs +2 -2
- package/utils/fullscreen.d.cts +6 -5
- package/utils/fullscreen.d.ts +6 -5
- package/utils/fullscreen.js +2 -2
- package/utils/insert-script.cjs +1 -1
- package/utils/insert-script.d.cts +1 -0
- package/utils/insert-script.d.ts +1 -0
- package/utils/insert-script.js +1 -1
- package/utils/is-map-compatible.cjs +1 -1
- package/utils/is-map-compatible.d.cts +1 -0
- package/utils/is-map-compatible.d.ts +1 -0
- package/utils/is-map-compatible.js +1 -1
- package/utils/markdown.cjs +2 -2
- package/utils/markdown.d.cts +1 -0
- package/utils/markdown.d.ts +1 -0
- package/utils/markdown.js +2 -2
- package/utils/merge.cjs +2 -2
- package/utils/merge.d.cts +2 -1
- package/utils/merge.d.ts +2 -1
- package/utils/merge.js +2 -2
- package/utils/multiband-track-volume.cjs +2 -2
- package/utils/multiband-track-volume.d.cts +1 -0
- package/utils/multiband-track-volume.d.ts +1 -0
- package/utils/multiband-track-volume.js +2 -2
- package/utils/onlive-url-params.cjs +1 -1
- package/utils/onlive-url-params.d.cts +1 -0
- package/utils/onlive-url-params.d.ts +1 -0
- package/utils/onlive-url-params.js +1 -1
- package/utils/pretty-distance.cjs +2 -2
- package/utils/pretty-distance.d.cts +2 -1
- package/utils/pretty-distance.d.ts +2 -1
- package/utils/pretty-distance.js +2 -2
- package/utils/pretty-time.cjs +2 -0
- package/utils/pretty-time.d.cts +16 -0
- package/utils/pretty-time.d.ts +16 -0
- package/utils/pretty-time.js +2 -0
- package/utils/random-string.cjs +1 -1
- package/utils/random-string.d.cts +1 -0
- package/utils/random-string.d.ts +1 -0
- package/utils/random-string.js +1 -1
- package/utils/resource-type.cjs +1 -1
- package/utils/resource-type.d.cts +1 -0
- package/utils/resource-type.d.ts +1 -0
- package/utils/resource-type.js +1 -1
- package/utils/round-number.cjs +2 -0
- package/utils/round-number.d.cts +30 -0
- package/utils/round-number.d.ts +30 -0
- package/utils/round-number.js +2 -0
- package/utils/safe-html.cjs +2 -2
- package/utils/safe-html.d.cts +12 -4
- package/utils/safe-html.d.ts +12 -4
- package/utils/safe-html.js +2 -2
- package/utils/sanitize.cjs +2 -2
- package/utils/sanitize.d.cts +1 -0
- package/utils/sanitize.d.ts +1 -0
- package/utils/sanitize.js +2 -2
- package/utils/spread.cjs +2 -2
- package/utils/spread.d.cts +1 -0
- package/utils/spread.d.ts +1 -0
- package/utils/spread.js +2 -2
- package/utils/watch.cjs +1 -1
- package/utils/watch.d.cts +1 -0
- package/utils/watch.d.ts +1 -0
- package/utils/watch.js +1 -1
- package/services/firebase/firebase.service.cjs +0 -2
- package/services/firebase/firebase.service.d.cts +0 -40
- package/services/firebase/firebase.service.d.ts +0 -40
- package/services/firebase/firebase.service.js +0 -2
- package/services/livekit.service.cjs +0 -2
- package/services/livekit.service.d.cts +0 -219
- package/services/livekit.service.d.ts +0 -219
- package/services/livekit.service.js +0 -2
- package/types/window-context.cjs +0 -2
- package/types/window-context.d.cts +0 -8
- package/types/window-context.d.ts +0 -8
- package/types/window-context.js +0 -1
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.179 | © 2026 Onlive.ai */
|
|
2
|
+
"use strict";var Ct=Object.defineProperty;var Re=Object.getOwnPropertyDescriptor;var Pe=Object.getOwnPropertyNames;var Te=Object.prototype.hasOwnProperty;var Ae=(r,t)=>()=>(r&&(t=r(r=0)),t);var zt=(r,t)=>{for(var e in t)Ct(r,e,{get:t[e],enumerable:!0})},Ce=(r,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Pe(t))!Te.call(r,n)&&n!==e&&Ct(r,n,{get:()=>t[n],enumerable:!(i=Re(t,n))||i.enumerable});return r};var Ie=r=>Ce(Ct({},"__esModule",{value:!0}),r);var K={};zt(K,{SYNTHETIC_MEDIA_PRESETS:()=>vt,createSyntheticAudioTrack:()=>kt,createSyntheticMedia:()=>ft,createSyntheticMediaFromPreset:()=>Ot,createSyntheticVideoTrack:()=>ht});function ht(r={}){let{width:t=640,height:e=480,fps:i=30,backgroundColor:n="#1a1a2e",foregroundColor:s="#4361ee",label:o="Mock Video",animation:a="wave"}=r,g=document.createElement("canvas");g.width=t,g.height=e;let d=g.getContext("2d"),h,q=Date.now(),ct={wave:R=>{d.fillStyle=n,d.fillRect(0,0,t,e),d.strokeStyle=s,d.lineWidth=3,d.beginPath();for(let k=0;k<t;k++){let S=e/2+Math.sin(k/t*4*Math.PI+R*.002)*(e/4);k===0?d.moveTo(k,S):d.lineTo(k,S)}d.stroke()},pulse:R=>{d.fillStyle=n,d.fillRect(0,0,t,e);let k=Math.sin(R*.003)*.3+.7,S=Math.min(t,e)*.3*k;d.beginPath(),d.arc(t/2,e/2,S,0,Math.PI*2),d.fillStyle=s,d.fill()},bars:R=>{d.fillStyle=n,d.fillRect(0,0,t,e);let k=20,S=t/k,D=e*.7;d.fillStyle=s;for(let B=0;B<k;B++){let $t=Math.abs(Math.sin(B/k*Math.PI*2+R*.004))*D,Se=B*S,be=e-$t;d.fillRect(Se+2,be,S-4,$t)}},avatar:R=>{d.fillStyle=n,d.fillRect(0,0,t,e);let k=t/2,S=e/2-20,D=Math.min(t,e)*.15;d.beginPath(),d.arc(k,S,D,0,Math.PI*2),d.fillStyle=s,d.fill(),d.beginPath(),d.ellipse(k,S+D*2.2,D*1.5,D,0,Math.PI,0),d.fill(),Math.sin(R*.01)>0&&(d.beginPath(),d.arc(k,S+D*3,5+Math.sin(R*.02)*3,0,Math.PI*2),d.fillStyle="#22c55e",d.fill())},none:()=>{d.fillStyle=n,d.fillRect(0,0,t,e)}},dt=()=>{d.fillStyle="rgba(255, 255, 255, 0.8)",d.font=`${Math.floor(e*.04)}px system-ui, sans-serif`,d.textAlign="center",d.fillText(o,t/2,e-20)},H=()=>{let R=Date.now()-q;ct[a](R),dt(),h=requestAnimationFrame(H)};H();let qt=g.captureStream(i),Ht=qt.getVideoTracks()[0];return{track:Ht,stream:qt,cleanup:()=>{cancelAnimationFrame(h),Ht.stop()}}}function kt(r={}){let{frequency:t=440,volume:e=.1,waveType:i="sine",addVariation:n=!0,enabled:s=!1}=r,o=new AudioContext,a=o.createMediaStreamDestination(),g=o.createOscillator();g.type=i,g.frequency.value=t;let d=o.createGain();d.gain.value=s?e:0;let h=null,q=null;n&&(h=o.createOscillator(),h.frequency.value=.5,q=o.createGain(),q.gain.value=10,h.connect(q),q.connect(g.frequency),h.start()),g.connect(d),d.connect(a),g.start();let ct=a.stream,dt=ct.getAudioTracks()[0];return{track:dt,stream:ct,setVolume:H=>{d.gain.value=Math.max(0,Math.min(1,H))},setEnabled:H=>{d.gain.value=H?e:0},cleanup:()=>{g.stop(),h?.stop(),o.close(),dt.stop()}}}function ft(r,t){let e=ht(r),i=kt(t),n=new MediaStream([e.track,i.track]);return{videoTrack:e.track,audioTrack:i.track,combinedStream:n,setAudioVolume:i.setVolume,setAudioEnabled:i.setEnabled,cleanup:()=>{e.cleanup(),i.cleanup()}}}function Ot(r){let t=vt[r];return ft(t.video,t.audio)}var vt,U=Ae(()=>{"use strict";vt={localCamera:{video:{width:640,height:480,animation:"avatar",label:"You",foregroundColor:"#4361ee"},audio:{enabled:!1}},agentCamera:{video:{width:640,height:480,animation:"avatar",label:"AI Agent",foregroundColor:"#22c55e",backgroundColor:"#0f172a"},audio:{enabled:!1,frequency:300}},screenShare:{video:{width:1920,height:1080,animation:"bars",label:"Screen Share",backgroundColor:"#0a0a0a",foregroundColor:"#f59e0b"},audio:{enabled:!1}},voiceOnly:{video:{width:320,height:240,animation:"wave",label:"Voice Call"},audio:{enabled:!1,volume:.05}}}});var _e={};zt(_e,{AgentNotFoundError:()=>tt,ConversationServiceFactory:()=>_,DEFAULT_AGENT_CONFIG:()=>G,InvalidOperationError:()=>nt,MockAgent:()=>y,MockAgentPresets:()=>It,MockByteStreamReader:()=>at,MockConversationService:()=>w,MockEventEmitter:()=>j,MockLiveKitError:()=>u,MockLocalParticipant:()=>N,MockParticipant:()=>C,MockRoom:()=>I,MockServiceActions:()=>Nt,MockState:()=>V,MockTextStreamReader:()=>J,MockTextStreamWriter:()=>ot,MockTrack:()=>b,MockTrackPublication:()=>M,NetworkError:()=>it,ParticipantAlreadyJoinedError:()=>X,ParticipantKindValue:()=>yt,ParticipantNotFoundError:()=>Y,RoomEndedError:()=>Q,RoomNotFoundError:()=>T,SYNTHETIC_MEDIA_PRESETS:()=>vt,StorybookScenarios:()=>ye,TimeoutError:()=>rt,TrackNotFoundError:()=>Z,UnauthorizedError:()=>et,createAgentFixture:()=>At,createAgentWithCannedResponses:()=>ce,createChatScenario:()=>me,createConversationFixture:()=>Lt,createConversationService:()=>re,createDefaultConfig:()=>st,createDefaultRoomFixture:()=>Rt,createDeterministicConfig:()=>pe,createErrorFromMockError:()=>z,createLatencyConfig:()=>ue,createMessageFixture:()=>ge,createMockConversationService:()=>bt,createMockServiceFactory:()=>Me,createParticipantBatch:()=>ae,createParticipantFixture:()=>_t,createRoomWithAgent:()=>Tt,createRoomWithAgentAndDataTrack:()=>se,createRoomWithLocalParticipant:()=>Pt,createRoomWithMediaTracks:()=>oe,createRoomWithTwoParticipants:()=>xt,createSequentialAgent:()=>de,createStrictConfig:()=>le,createSyntheticAudioTrack:()=>kt,createSyntheticMedia:()=>ft,createSyntheticMediaFromPreset:()=>Ot,createSyntheticVideoTrack:()=>ht,createTextStream:()=>Dt,createVideoCallScenario:()=>he,decodeMockToken:()=>Kt,destroyStorybookMockService:()=>ke,generateMockApiResponseId:()=>Wt,generateMockExternalId:()=>Qt,generateMockId:()=>l,generateMockIdBatch:()=>Xt,generateMockMessageId:()=>Gt,generateMockParticipantIdentity:()=>Vt,generateMockRoomName:()=>Jt,generateMockToken:()=>P,generateMockTrackSid:()=>Bt,generateMockWsUrl:()=>$,generateSeededMockId:()=>Ft,generateStrategyResponse:()=>W,getStorybookMockService:()=>m,isMockConversationService:()=>ve,isMockError:()=>A,isMockLiveKitError:()=>Yt,resetIdCounter:()=>gt,resetStorybookMockService:()=>Ut,setIdCounter:()=>jt,withMockConversationService:()=>fe});module.exports=Ie(_e);var v=0;function gt(){v=0}function jt(r){v=r}function l(r){return v++,`mock_${r}_${v}_${Date.now().toString(36)}`}function Ft(r,t){return`mock_${r}_${t.toString(36)}`}function P(r,t,e){let i=e||new Date().toISOString(),n=typeof btoa=="function"?btoa(i).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,""):i.replace(/[^a-zA-Z0-9]/g,"");return`mock_token_${r}_${t}_${n}`}function Kt(r){if(!r.startsWith("mock_token_"))return null;let t=r.replace("mock_token_","").split("_");if(t.length<3)return null;let e=t[t.length-1],i=t[t.length-2],n=t.slice(0,-2).join("_");try{let s=e.replace(/-/g,"+").replace(/_/g,"/"),o=typeof atob=="function"?atob(s):e;return{roomId:n,identity:i,timestamp:o}}catch{return null}}function $(r){return`wss://mock-livekit.local/room/${r}`}function Vt(r="participant",t){let e=t??v++;return`${r}_${e}_${Date.now().toString(36)}`}function Jt(r="room"){return v++,`${r}_${v}_${Date.now().toString(36)}`}function Bt(r,t){return v++,`TR_${r.toUpperCase()}_${t}_${v}`}function Gt(){return v++,`msg_${v}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}function Wt(r){return v++,`api_${r}_${v}_${Date.now().toString(36)}`}function Qt(){return[Math.random().toString(16).slice(2,10),Math.random().toString(16).slice(2,6),Math.random().toString(16).slice(2,6),Math.random().toString(16).slice(2,6),Math.random().toString(16).slice(2,14)].join("-")}function Xt(r,t){let e=[];for(let i=0;i<t;i++)e.push(l(r));return e}var G={responseStrategy:"echo",responseDelayMs:100,cannedResponses:[],type:"text",nature:"ai",simulateTyping:!1,typingDelayPerChar:20};function W(r,t,e=[],i=0,n=Math.random){switch(r){case"echo":return{response:`Echo: ${t}`,nextIndex:i};case"canned":return{response:e[0]||"Default response",nextIndex:i};case"sequential":return{response:e[i]||"No more responses",nextIndex:(i+1)%Math.max(1,e.length)};case"random":{if(e.length===0)return{response:"Random response",nextIndex:i};let s=Math.floor(n()*e.length);return{response:e[s],nextIndex:i}}case"silent":return{response:"",nextIndex:i};case"error":throw new Error("Agent error");case"custom":return{response:"",nextIndex:i};default:return{response:"Default agent response",nextIndex:i}}}var y=class{constructor(t,e,i={}){this._state="idle";this.conversationHistory=[];this.responseIndex=0;this.eventListeners=new Set;this.randomFn=Math.random;this.messageCount=0;this.id=t,this.name=e,this.config={...G,...i}}get state(){return this._state}get isRunning(){return this._state==="running"}get history(){return[...this.conversationHistory]}getConfig(){return{...this.config}}updateConfig(t){this.config={...this.config,...t}}setStrategy(t){this.config.responseStrategy=t}setCannedResponses(t){this.config.cannedResponses=t,this.responseIndex=0}setCustomHandler(t){this.customHandler=t,this.config.responseStrategy="custom"}setRandomFunction(t){this.randomFn=t}async start(t){this._state!=="running"&&(this._state="starting",this.roomId=t,this.conversationHistory=[],this.responseIndex=0,this.messageCount=0,await this.delay(50),this._state="running",this.emitEvent({type:"started",agentId:this.id}))}async stop(){this._state==="running"&&(this._state="stopping",await this.delay(50),this._state="stopped",this.roomId=void 0,this.emitEvent({type:"stopped",agentId:this.id}))}async processMessage(t){if(this._state!=="running")throw new Error("Agent is not running");if(this.config.maxMessages&&this.messageCount>=this.config.maxMessages)return await this.stop(),"";this.addMessage(t,"user"),this.emitEvent({type:"message_received",agentId:this.id,message:t});let e;try{if(this.config.responseStrategy==="custom"&&this.customHandler)e=await this.customHandler(this.id,t,this.conversationHistory);else{if(this.config.responseStrategy==="silent")return"";if(this.config.responseStrategy==="error"){let i=new Error("Agent error");throw this.emitEvent({type:"error",agentId:this.id,error:i}),i}else{let i=W(this.config.responseStrategy,t,this.config.cannedResponses,this.responseIndex,this.randomFn);e=i.response,this.responseIndex=i.nextIndex}}}catch(i){throw this._state="error",i}return this.config.simulateTyping&&this.config.typingDelayPerChar&&await this.delay(e.length*this.config.typingDelayPerChar),this.config.responseDelayMs&&await this.delay(this.config.responseDelayMs),this.addMessage(e,"agent"),this.messageCount++,this.emitEvent({type:"response_sent",agentId:this.id,response:e}),e}addEventListener(t){return this.eventListeners.add(t),()=>this.eventListeners.delete(t)}clearHistory(){this.conversationHistory=[],this.responseIndex=0}reset(){this._state="idle",this.roomId=void 0,this.conversationHistory=[],this.responseIndex=0,this.messageCount=0}toJSON(){return{id:this.id,name:this.name,state:this._state,roomId:this.roomId,config:this.config,historyLength:this.conversationHistory.length,messageCount:this.messageCount}}addMessage(t,e){let i={id:l("msg"),content:t,role:e,timestamp:Date.now()};return this.conversationHistory.push(i),i}emitEvent(t){for(let e of this.eventListeners)try{e(t)}catch(i){console.error("Error in agent event listener:",i)}}delay(t){return new Promise(e=>setTimeout(e,t))}},It={echo(r="Echo Agent"){return new y(l("agent"),r,{responseStrategy:"echo"})},silent(r="Silent Agent"){return new y(l("agent"),r,{responseStrategy:"silent"})},sequential(r,t){return new y(l("agent"),r,{responseStrategy:"sequential",cannedResponses:t})},aiAssistant(r="AI Assistant"){return new y(l("agent"),r,{responseStrategy:"sequential",responseDelayMs:150,simulateTyping:!0,typingDelayPerChar:10,cannedResponses:["Hello! How can I help you today?","I understand. Let me help you with that.","Is there anything else I can assist you with?","Thank you for your question. Here's what I found...","I'm happy to help! What would you like to know?"]})},customerSupport(r="Support Agent"){return new y(l("agent"),r,{responseStrategy:"sequential",responseDelayMs:200,cannedResponses:["Thank you for contacting support. How may I assist you?","I apologize for any inconvenience. Let me look into that for you.","I've found a solution. Here's what you need to do...","Is there anything else I can help you with today?","Thank you for contacting us. Have a great day!"]})}};var u=class r extends Error{constructor(t,e,i){super(e),this.name="MockLiveKitError",this.code=t,this.details=i,typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,r)}toMockError(){return{code:this.code,message:this.message,details:this.details}}static fromMockError(t){return new r(t.code,t.message,t.details)}},T=class extends u{constructor(t){super("ROOM_NOT_FOUND",`Room not found: ${t}`,{roomId:t}),this.name="RoomNotFoundError"}},Q=class extends u{constructor(t){super("ROOM_ENDED",`Room has ended: ${t}`,{roomId:t}),this.name="RoomEndedError"}},X=class extends u{constructor(t,e){super("PARTICIPANT_ALREADY_JOINED",`Participant ${t} is already in room ${e}`,{identity:t,roomId:e}),this.name="ParticipantAlreadyJoinedError"}},Y=class extends u{constructor(t){super("PARTICIPANT_NOT_FOUND",`Participant not found: ${t}`,{identity:t}),this.name="ParticipantNotFoundError"}},Z=class extends u{constructor(t){super("TRACK_NOT_FOUND",`Track not found: ${t}`,{trackId:t}),this.name="TrackNotFoundError"}},tt=class extends u{constructor(t){super("AGENT_NOT_FOUND",`Agent not found: ${t}`,{agentId:t}),this.name="AgentNotFoundError"}},et=class extends u{constructor(t="Unauthorized"){super("UNAUTHORIZED",t),this.name="UnauthorizedError"}},it=class extends u{constructor(t="Network error occurred"){super("NETWORK_ERROR",t),this.name="NetworkError"}},nt=class extends u{constructor(t,e){super("INVALID_OPERATION",t,e),this.name="InvalidOperationError"}},rt=class extends u{constructor(t,e){super("TIMEOUT",`Operation timed out: ${t}`,{operation:t,timeoutMs:e}),this.name="TimeoutError"}};function z(r){switch(r.code){case"ROOM_NOT_FOUND":return new T(r.details?.roomId??"unknown");case"ROOM_ENDED":return new Q(r.details?.roomId??"unknown");case"PARTICIPANT_ALREADY_JOINED":return new X(r.details?.identity??"unknown",r.details?.roomId??"unknown");case"PARTICIPANT_NOT_FOUND":return new Y(r.details?.identity??"unknown");case"TRACK_NOT_FOUND":return new Z(r.details?.trackId??"unknown");case"AGENT_NOT_FOUND":return new tt(r.details?.agentId??"unknown");case"UNAUTHORIZED":return new et(r.message);case"NETWORK_ERROR":return new it(r.message);case"INVALID_OPERATION":return new nt(r.message,r.details);case"TIMEOUT":return new rt(r.details?.operation??"unknown",r.details?.timeoutMs??0);default:return u.fromMockError(r)}}function A(r){return typeof r=="object"&&r!==null&&"code"in r&&"message"in r&&typeof r.code=="string"&&typeof r.message=="string"}function Yt(r){return r instanceof u}var j=class{constructor(){this.listeners={};this.wildcardListeners=new Set;this.eventHistory=[];this.maxHistorySize=1e3;this.recordHistory=!0}setMaxHistorySize(t){this.maxHistorySize=t,this.trimHistory()}setRecordHistory(t){this.recordHistory=t}on(t,e){return this.listeners[t]||(this.listeners[t]=new Set),this.listeners[t].add(e),()=>{this.off(t,e)}}once(t,e){let i=n=>{this.off(t,i),e(n)};return this.on(t,i)}off(t,e){this.listeners[t]?.delete(e)}onAny(t){return this.wildcardListeners.add(t),()=>{this.wildcardListeners.delete(t)}}offAny(t){this.wildcardListeners.delete(t)}removeAllListeners(t){t?delete this.listeners[t]:(this.listeners={},this.wildcardListeners.clear())}emit(t){this.recordHistory&&(this.eventHistory.push(t),this.trimHistory());let e=this.listeners[t.type];if(e)for(let i of e)try{i(t)}catch(n){console.error(`Error in mock event listener for ${t.type}:`,n)}for(let i of this.wildcardListeners)try{i(t)}catch(n){console.error("Error in mock wildcard event listener:",n)}}trimHistory(){this.eventHistory.length>this.maxHistorySize&&(this.eventHistory=this.eventHistory.slice(-this.maxHistorySize))}emitRoomCreated(t){let e={type:"roomCreated",timestamp:new Date().toISOString(),roomId:t.id,room:t};this.emit(e)}emitRoomEnded(t){let e={type:"roomEnded",timestamp:new Date().toISOString(),roomId:t};this.emit(e)}emitRoomConnectionStateChanged(t,e,i){let n={type:"roomConnectionStateChanged",timestamp:new Date().toISOString(),roomId:t,state:e,previousState:i};this.emit(n)}emitParticipantJoined(t,e){let i={type:"participantJoined",timestamp:new Date().toISOString(),roomId:t,participant:e};this.emit(i)}emitParticipantLeft(t,e){let i={type:"participantLeft",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e};this.emit(i)}emitParticipantAttributesChanged(t,e,i,n){let s={type:"participantAttributesChanged",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,attributes:i,previousAttributes:n};this.emit(s)}emitTrackPublished(t,e,i){let n={type:"trackPublished",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,track:i};this.emit(n)}emitTrackUnpublished(t,e,i){let n={type:"trackUnpublished",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,trackId:i};this.emit(n)}emitTrackMuted(t,e){let i={type:"trackMuted",timestamp:new Date().toISOString(),roomId:t,trackId:e};this.emit(i)}emitTrackUnmuted(t,e){let i={type:"trackUnmuted",timestamp:new Date().toISOString(),roomId:t,trackId:e};this.emit(i)}emitMessageReceived(t,e){let i={type:"messageReceived",timestamp:new Date().toISOString(),roomId:t,message:e};this.emit(i)}emitMessageSent(t,e){let i={type:"messageSent",timestamp:new Date().toISOString(),roomId:t,message:e};this.emit(i)}emitTypingIndicator(t,e,i){let n={type:"typingIndicator",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,isTyping:i};this.emit(n)}emitAgentStarted(t,e){let i={type:"agentStarted",timestamp:new Date().toISOString(),roomId:t,agent:e};this.emit(i)}emitAgentStopped(t,e){let i={type:"agentStopped",timestamp:new Date().toISOString(),roomId:t,agentId:e};this.emit(i)}emitAgentMessage(t,e,i){let n={type:"agentMessage",timestamp:new Date().toISOString(),roomId:t,agentId:e,message:i};this.emit(n)}emitDataReceived(t,e,i,n){let s={type:"dataReceived",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,data:i,topic:n};this.emit(s)}emitError(t,e){let i={type:"error",timestamp:new Date().toISOString(),roomId:e,error:t};this.emit(i)}getHistory(t){return t?this.eventHistory.filter(e=>e.type===t):[...this.eventHistory]}getLastEvents(t,e){return(e?this.eventHistory.filter(n=>n.type===e):this.eventHistory).slice(-t)}clearHistory(){this.eventHistory=[]}listenerCount(t){return(this.listeners[t]?.size??0)+this.wildcardListeners.size}};var pt=require("@onlive.ai/tracker"),F=require("livekit-client");var Zt=require("firebase/app"),c=require("firebase/database"),lt=class{constructor(t){this.onChildChanged=(t,e)=>(0,c.onChildChanged)(this.ref(t),i=>e(i.key||"",i.val(),i));this.onChildRemoved=(t,e)=>(0,c.onChildRemoved)(this.ref(t),i=>e(i.key||"",i.val(),i));this.onChildChangedQuery=(t,e)=>(0,c.onChildChanged)(t,i=>e(i.key||"",i.val(),i));this.onChildRemovedQuery=(t,e)=>(0,c.onChildRemoved)(t,i=>e(i.key||"",i.val(),i));let e=(0,Zt.initializeApp)(t.config);this.db=(0,c.getDatabase)(e)}ref(t){return(0,c.ref)(this.db,t)}async getOnce(t){let e=await(0,c.get)(this.ref(t));return e.exists()?e.val():null}async getOnceQuery(t){let e=await(0,c.get)(t),i=[];return e.exists()&&e.forEach(n=>{i.push({key:n.key||"",value:n.val()})}),i}onValue(t,e){return(0,c.onValue)(this.ref(t),i=>e(i.key??"",i.val(),i),i=>console.error("onValue error",i))}onValueQuery(t,e){return(0,c.onValue)(t,i=>e(i.key??"",i.val(),i),i=>console.error("onValueQuery error",i))}onChildAdded(t,e){return(0,c.onChildAdded)(this.ref(t),i=>e(i.key||"",i.val(),i),i=>console.error("onChildAdded error",i))}onChildAddedQuery(t,e){return(0,c.onChildAdded)(t,i=>e(i.key||"",i.val(),i),i=>console.error("onChildAddedQuery error",i))}write(t,e){return(0,c.set)(this.ref(t),e)}update(t,e){return(0,c.update)(this.ref(t),e)}remove(t){return(0,c.remove)(this.ref(t))}async push(t,e){let i=(0,c.push)(this.ref(t));return await(0,c.set)(i,e),i.key}onDisconnectUpdate(t,e){return(0,c.onDisconnect)(this.ref(t)).update(e)}cancelOnDisconnect(t){return(0,c.onDisconnect)(this.ref(t)).cancel()}transaction(t,e){return(0,c.runTransaction)(this.ref(t),i=>e(i))}query(t,e={}){let i=this.ref(t);return e.orderBy==="child"&&e.childKey&&(i=(0,c.query)(i,(0,c.orderByChild)(e.childKey))),e.orderBy==="key"&&(i=(0,c.query)(i,(0,c.orderByKey)())),e.orderBy==="value"&&(i=(0,c.query)(i,(0,c.orderByValue)())),e.startAt!=null&&(i=(0,c.query)(i,(0,c.startAt)(e.startAt))),e.endAt!=null&&(i=(0,c.query)(i,(0,c.endAt)(e.endAt))),e.equalTo!=null&&(i=(0,c.query)(i,(0,c.equalTo)(e.equalTo))),e.limitFirst!=null&&(i=(0,c.query)(i,(0,c.limitToFirst)(e.limitFirst))),e.limitLast!=null&&(i=(0,c.query)(i,(0,c.limitToLast)(e.limitLast))),i}};var p=async(r,t)=>{let e=await fetch(r,t);if(!e.ok){let i=await e.json().catch(()=>({}));throw new Error(JSON.stringify({status:e.status,statusText:e.statusText,...i}))}return e&&e.json()};var te=r=>{let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",e="";for(let i=0;i<r;i++)e+=t.charAt(Math.floor(Math.random()*t.length));return e};var f=require("@onlive.ai/tracker"),x="chatbot",ut=class r{static hasSession(){return!!f.Session.getCookie(x)}static getSession(t={role:"guest",regenerate:!1}){t.regenerate&&(f.Session.id=f.Generator.uuid(),f.Session.deleteCookie(x));let e=f.Session.getCookie(x);return e&&r.isValidSession(e,t.role)?e:r.createSession(t.role)}static createSession(t){let e={externalId:t==="agent"?String(r.getUserId()||f.Session.id):f.Session.id,secret:te(16),createdAt:new Date().toISOString()};return f.Session.setCookie(x,e,3600*24*365),e}static isValidSession(t,e){if(e==="guest")return!0;let i=r.getUserId();return!!(i&&String(i)===t.externalId)}static getUserId(){return f.Session.getCookie("user-id",{objectKey:"userId",storageKey:"user",storageType:"localStorage",ttl:3600*24*365,preserveData:!0})}static updateSessionWithRegistrationData(t){let e=f.Session.getCookie(x);if(e||(e=r.createSession("guest")),e){let i={...e,registrationData:t};f.Session.setCookie(x,i,3600*24*365)}}static hasRegistrationData(){return!!f.Session.getCookie(x)?.registrationData}static async getAgentInfo(t){return fetch(`${t}/api/v1/auth/user-info`,{credentials:"include"}).then(e=>e.json())}static getRegistrationData(){return f.Session.getCookie(x)?.registrationData}};var ee="lk.chat",ie="lk.transcription",ne="lk.events",wt="typing-indicator";var Et=class extends F.Room{},mt=class{constructor(t){this.listeners=new Set;this.typingListeners=new Set;this.transcriptionMap=new Map;this.abortControllers={register:new AbortController,createRoom:new AbortController,closeRoom:new AbortController,evaluateRoom:new AbortController,persistMessage:new AbortController,sendMessageReport:new AbortController,deleteMessageReport:new AbortController,updateMessageReactions:new AbortController,getRooms:new AbortController};this.authToken=null;this.firebaseUnsubscribers={};this.seenRequestIds=new Set;this.lastSnapshotById=new Map;this.handleIncomingMessage=async(t,e)=>{let i=t?.info?.id,n=t.info?.attributes?.["lk.segment_id"];n&&(this.transcriptionMap.has(n)?i=this.transcriptionMap.get(n)||"":this.transcriptionMap.set(n,i));let s=e?.identity?this.room.getParticipantByIdentity(e.identity):void 0,o="";for await(let a of t)o+=a,this.emitMessage({id:i,timestamp:Date.now(),message:o,assets:JSON.parse(t.info?.attributes?.assets||"[]"),from:s});this.messagePersistence==="client"&&this.persistMessage({roomId:this.room.id,content:o,externalId:i,identity:s?.identity,kind:s?.kind})};this.emitMessage=t=>{for(let e of this.listeners)e([t])};this.handleDataReceived=(t,e,i,n)=>{if(n===wt)try{let s=JSON.parse(new TextDecoder().decode(t));if(s.type==="typing"&&s.participantId!==this.room.localParticipant.identity){let o={type:"typing",isTyping:s.isTyping,timestamp:s.timestamp,participantId:s.participantId};this.emitTypingIndicator(o)}}catch(s){console.warn("Failed to parse typing indicator:",s)}};this.emitTypingIndicator=t=>{for(let e of this.typingListeners)e(t)};this.apiUrl=t.apiUrl,this.authUrl=t.authUrl,this.organizationId=t.organizationId,this.channelTopic=t.channelTopic||ee,this.transcriptionTopic=t.transcriptionTopic||ie,this.eventsTopic=t.eventsTopic||ne,this.messagePersistence=t.messagePersistence||"disabled",this.room=this.createRoomInstance(),t.firebaseConfig&&this.initializeFirebase(t.firebaseConfig)}createRoomInstance(){return new Et({adaptiveStream:!0,dynacast:!0})}ensureRoom(){return this.room||(this.room=this.createRoomInstance()),this.room}initializeFirebase(t){this.firebaseApi=new lt({config:t}),this.presencePath=`orgs/${this.organizationId}/presence`,this.callsPath=`orgs/${this.organizationId}/calls`}initializeRoomHandlers(){try{this.room.unregisterTextStreamHandler(this.channelTopic),this.room.unregisterTextStreamHandler(this.transcriptionTopic)}catch{}this.room.off(F.RoomEvent.DataReceived,this.handleDataReceived),this.room.registerTextStreamHandler(this.channelTopic,this.handleIncomingMessage),this.room.registerTextStreamHandler(this.transcriptionTopic,this.handleIncomingMessage),this.room.on(F.RoomEvent.DataReceived,this.handleDataReceived)}async registerUser(t,e,i,n){let s=await p(`${this.apiUrl}/users/register`,{method:"POST",body:JSON.stringify({externalId:t,secret:e,...i,metadata:n}),headers:{"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.register.signal});if(!s.token)throw new Error("Registration failed: No token received from server");return this.authToken=s.token,s}async registerAgent(t,e){let i=pt.Session.getCookie("livekit-agent-token");if(i){if(this.decodeJwtPayload(i)?.username===e.name)return this.authToken=i,i;pt.Session.deleteCookie("livekit-agent-token")}let n=await p(`${this.authUrl}/admins/register`,{method:"POST",body:JSON.stringify({externalId:t,name:e.name,email:e.email,avatar:e.avatar}),headers:{"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},credentials:"include",signal:this.abortControllers.register.signal});return pt.Session.setCookie("livekit-agent-token",n.token,1440*60),this.authToken=n.token,n.token}decodeJwtPayload(t){try{let e=t.split(".");if(e.length!==3)return null;let i=e[1],n=atob(i.replace(/-/g,"+").replace(/_/g,"/"));return JSON.parse(n)}catch{return null}}async createRoom(t){if(!this.authToken)throw new Error("Cannot create room: No authentication token. Call registerUser() first.");this.room=this.ensureRoom();let{initialMessage:e,...i}=t,n=await p(`${this.apiUrl}/rooms`,{method:"POST",body:JSON.stringify(i),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.createRoom.signal});return this.setRoomMetadata(n),this.setupParticipantAttributesHandler(),this.room.connect(n.wsURL,n.token).then(async()=>{if(e)try{await this.sendMessage(e)}catch(s){console.error("[ConversationService] Failed to send initial message:",s)}}),this.initializeRoomHandlers(),this.room}async joinRoom(t,e,i,n){let s=await p(`${this.apiUrl}/rooms/${t}/join`,{method:"POST",body:JSON.stringify({timezone:e,language:i,...n??{}}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.createRoom.signal});return this.setRoomMetadata(s),this.setupParticipantAttributesHandler(),await this.room.connect(s.wsURL,s.token),this.initializeRoomHandlers(),this.room}setRoomMetadata(t){this.room.id=t.id,this.room.groupId=t.groupId,this.room.createdAt=t.createdAt,this.room.connectedAt=new Date().toISOString(),this.room.affinity=t.affinity}setupParticipantAttributesHandler(){this.room.on(F.RoomEvent.ParticipantAttributesChanged,t=>{t.identity===this.room.localParticipant.identity&&ut.updateSessionWithRegistrationData(t.attributes)})}async evaluateRoom(t){let e=t.roomId||this.room?.id;if(!e)throw new Error("Room ID is required for evaluation");return p(`${this.apiUrl}/rooms/${e}/evaluate`,{method:"POST",body:JSON.stringify({rating:t.rating,comment:t.comment}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.evaluateRoom.signal})}async closeRoom(){this.room&&(await p(`${this.apiUrl}/rooms/${this.room.id}/close`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.closeRoom.signal}),await this.stopAndUnpublishLocalTracks())}async disconnect(){this.room&&(await this.stopAndUnpublishLocalTracks(),this.room.removeAllListeners(),await this.room.disconnect(),this.room=null)}async stopAndUnpublishLocalTracks(){let t=this.room?.localParticipant;if(!t)return;await Promise.allSettled([t.setMicrophoneEnabled(!1),t.setCameraEnabled(!1),t.setScreenShareEnabled(!1)]);let e=Array.from(t.trackPublications.values());await Promise.all(e.map(async i=>{let n=i.track;if(n)try{await t.unpublishTrack(n,!0)}catch{n.stop()}}))}async disconnectAndCloseRoom(){await this.closeRoom(),await this.disconnect()}async readRoom(t){return p(`${this.apiUrl}/rooms/${t}/read`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.persistMessage.signal})}async getRooms(t){let e=new URLSearchParams;return t.page&&e.append("page",t.page.toString()),t.limit&&e.append("limit",t.limit.toString()),t.offset&&e.append("offset",t.offset.toString()),t.orderBy&&e.append("orderBy",t.orderBy),t.orderDir&&e.append("orderDir",t.orderDir),t.ids?.length&&e.append("ids",t.ids.join(",")),t.with?.length&&e.append("with",t.with.join(",")),t.count?.length&&e.append("count",t.count.join(",")),t.latestOnly&&e.append("latestOnly",t.latestOnly.toString()),t.includeUnread&&e.append("includeUnread",t.includeUnread.toString()),t.roomStatus&&e.append("roomStatus",t.roomStatus),t.archived&&e.append("archived",t.archived.toString()),t.participantIds?.length&&e.append("participantIds",t.participantIds.join(",")),t.participantExternalIds?.length&&e.append("participantExternalIds",t.participantExternalIds.join(",")),t.groupId&&e.append("groupId",t.groupId),t.hasMessages!==void 0&&e.append("hasMessages",t.hasMessages.toString()),p(`${this.authUrl}/rooms?${e}`,{method:"GET",headers:{"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},credentials:"include",signal:this.abortControllers.getRooms.signal})}async sendMessage(t,e){let i=await this.room.localParticipant.sendText(t,{topic:this.channelTopic,attributes:e});this.emitMessage({id:i.id,timestamp:Date.now(),message:t,assets:JSON.parse(e?.assets||"[]"),from:this.room.localParticipant}),this.messagePersistence==="client"&&this.persistMessage({roomId:this.room.id,content:t,externalId:i.id,identity:this.room.localParticipant?.identity,kind:this.room.localParticipant?.kind})}async persistMessage(t){return p(`${this.apiUrl}/messages/create`,{method:"POST",body:JSON.stringify(t),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.persistMessage.signal})}async getMessages(t){let e=new URLSearchParams;return t.limit&&e.append("limit",t.limit.toString()),t.with&&e.append("with",t.with.join(",")),(await p(`${this.apiUrl}/messages/search${e.size?`?${e.toString()}`:""}`,{method:"POST",body:JSON.stringify(t),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.createRoom.signal})).items}async sendMessageReport(t){try{return p(`${this.apiUrl}/messages/${t.messageId}/report`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.sendMessageReport.signal})}catch(e){console.error("Error sending message report:",e)}}async deleteMessageReport(t){try{return p(`${this.apiUrl}/messages/${t.messageId}/report`,{method:"DELETE",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.deleteMessageReport.signal})}catch(e){console.error("Error deleting message report:",e)}}async updateMessageReactions(t){try{return p(`${this.apiUrl}/messages/${t.messageId}/reactions`,{method:"PATCH",body:JSON.stringify({add:t.add||[],remove:t.remove||[]}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.updateMessageReactions.signal})}catch(e){console.error("Error updating message reactions:",e)}}subscribeMessages(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}async sendTypingIndicator(t){if(!(!this.room||this.room.state!=="connected"))try{let e=new TextEncoder().encode(JSON.stringify({type:"typing",isTyping:t,timestamp:Date.now(),participantId:this.room.localParticipant.identity}));await this.room.localParticipant.publishData(e,{reliable:!1,topic:wt})}catch(e){console.warn("Failed to send typing indicator:",e)}}subscribeTypingIndicators(t){return this.typingListeners.add(t),()=>{this.typingListeners.delete(t)}}unsubscribeTypingIndicators(t){this.typingListeners.delete(t)}async sendContextualEvent(t){try{let e=JSON.stringify(t);await this.room.localParticipant.sendText(e,{topic:this.eventsTopic})}catch(e){console.warn("Failed to send event:",e)}}async requestNewRoom(t){return p(`${this.apiUrl}/rooms/request-new`,{method:"POST",body:JSON.stringify(t),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}async confirmRoomRequest(t){return p(`${this.apiUrl}/rooms/confirm-call`,{method:"POST",body:JSON.stringify({roomId:t}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}async cancelRoomRequest(t){return p(`${this.apiUrl}/rooms/cancel-call`,{method:"POST",body:JSON.stringify({roomId:t}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}async finishCall(){if(this.room?.id)return p(`${this.apiUrl}/rooms/finish-call`,{method:"POST",body:JSON.stringify({roomId:this.room.id}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}isFirebaseEnabled(){return!!(this.firebaseApi&&this.presencePath&&this.callsPath)}getFirebase(){if(!this.firebaseApi||!this.presencePath||!this.callsPath)throw new Error("Firebase is not initialized. Provide firebaseConfig in constructor.");return{api:this.firebaseApi,presencePath:this.presencePath,callsPath:this.callsPath}}buildAgentPresencePath(t){return`${this.presencePath}/${t}`}onPresenceChange(t){let{api:e,presencePath:i}=this.getFirebase();return e.onChildChanged(i,(n,s)=>t(n,s))}onPresenceAgentChange(t,e){let{api:i}=this.getFirebase();return i.onValue(this.buildAgentPresencePath(t),(n,s)=>e(n,s))}async createCallRequest(t){let{api:e,callsPath:i}=this.getFirebase(),s=(await p(`${this.apiUrl}/rooms/call-request`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},body:JSON.stringify(t)})).id;return e.onDisconnectUpdate(`${i}/${s}`,{status:"disconnected"}),s}onNewCallRequest(t){let{api:e,callsPath:i}=this.getFirebase();return e.onChildAdded(i,(n,s)=>t(n,{...s,id:n}))}onCallRequestChange(t){let{api:e,callsPath:i}=this.getFirebase();return e.onChildChanged(i,(n,s)=>t(n,{...s,id:n}))}onCallRequestRemoved(t){let{api:e,callsPath:i}=this.getFirebase();return e.onChildRemoved(i,n=>t(n))}async acceptCallRequest(t){let{api:e,callsPath:i}=this.getFirebase();return await e.cancelOnDisconnect(`${i}/${t}`),e.update(`${i}/${t}`,{status:"accepted"})}async cancelCallRequest(t){let{api:e,callsPath:i}=this.getFirebase();await e.cancelOnDisconnect(`${i}/${t}`),await p(`${this.apiUrl}/rooms/call-request/cancel`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},body:JSON.stringify({callId:t})})}async cancelOnDisconnect(t){let{api:e,callsPath:i}=this.getFirebase();await e.cancelOnDisconnect(`${i}/${t}`)}subscribePendingRequests(t,e={}){let{api:i,callsPath:n}=this.getFirebase();e.resetSeen&&this.seenRequestIds.clear(),this.firebaseUnsubscribers["pending-requests"]?.();let s=i.query(n,{orderBy:"child",childKey:"status",equalTo:"pending"}),o=i.onChildAddedQuery(s,(a,g)=>{if(!a||this.seenRequestIds.has(a))return;let d={...g,id:a};this.seenRequestIds.add(a),t(a,d)});return this.firebaseUnsubscribers["pending-requests"]=o,()=>{o?.(),delete this.firebaseUnsubscribers["pending-requests"]}}subscribeRequestChanges(t){let{api:e,callsPath:i}=this.getFirebase();this.firebaseUnsubscribers["request-changes"]?.();let n=e.onChildChanged(i,(s,o)=>{if(!s)return;let a=JSON.stringify(o);this.lastSnapshotById.get(s)!==a&&(this.lastSnapshotById.set(s,a),t(s,{...o,id:s}))});return this.firebaseUnsubscribers["request-changes"]=n,()=>{n?.(),delete this.firebaseUnsubscribers["request-changes"]}}async tryAcceptRequest(t){let{api:e,callsPath:i}=this.getFirebase(),n=`${i}/${t}`;return await e.transaction(n,o=>o&&(o.status==="pending"?{...o,status:"accepted"}:o)),(await e.getOnce(n))?.status==="accepted"}onRoomSync(t,e){let{api:i}=this.getFirebase(),n=`orgs/${this.organizationId}/rooms/${t}/sync`;return i.onValue(n,(s,o)=>{e(o)})}async clearRoomSync(t,e){let{api:i}=this.getFirebase(),n=`orgs/${this.organizationId}/rooms/${t}/sync`;await i.write(n,{needsSync:!1,reason:e||null,timestamp:Date.now()})}onNewRoomRequest(t,e){let{api:i}=this.getFirebase(),n=`orgs/${this.organizationId}/rooms/${t}/call`;return i.onValue(n,(s,o)=>{e(o)})}unsubscribeAllFirebase(){Object.values(this.firebaseUnsubscribers).forEach(t=>t?.()),this.firebaseUnsubscribers={}}async destroy(){this.unsubscribeAllFirebase(),this.listeners.clear(),this.typingListeners.clear(),this.transcriptionMap.clear(),this.seenRequestIds.clear(),this.lastSnapshotById.clear(),Object.values(this.abortControllers).forEach(t=>t.abort()),await this.disconnect()}};var b=class{constructor(t,e,i,n){this.muted=!1;this.enabled=!0;this.attachedElements=new Set;this.kind=t,this.source=e,this.sid=l("TR"),this.mediaStreamTrack=i,this.mediaCleanup=n}get mediaTrack(){return this.mediaStreamTrack}attach(t){let e=t||document.createElement(this.kind==="video"?"video":"audio");if(this.mediaStreamTrack){let i=new MediaStream([this.mediaStreamTrack]);e.srcObject=i,e.autoplay=!0,this.kind==="video"&&(e.playsInline=!0,e.muted=!0)}return this.attachedElements.add(e),e}detach(t){if(t)return t.srcObject=null,this.attachedElements.delete(t),[t];let e=Array.from(this.attachedElements);for(let i of e)i.srcObject=null;return this.attachedElements.clear(),e}stop(){this.detach(),this.mediaCleanup&&this.mediaCleanup(),this.mediaStreamTrack&&this.mediaStreamTrack.stop(),this.enabled=!1}setMuted(t){this.muted=t,this.mediaStreamTrack&&(this.mediaStreamTrack.enabled=!t)}setEnabled(t){this.enabled=t,this.mediaStreamTrack&&(this.mediaStreamTrack.enabled=t)}},M=class{constructor(t,e){this.subscribed=!0;this.isEnabled=!0;this.track=t,this.trackSid=t.sid,this.trackName=e||`${t.kind}_${t.source}`,this.source=t.source,this.kind=t.kind}get isMuted(){return this.track?.muted??!1}get isSubscribed(){return this.subscribed&&this.track!==null}setSubscribed(t){this.subscribed=t}setEnabled(t){this.isEnabled=t,this.track&&(this.track.enabled=t)}setMuted(t){this.track&&this.track.setMuted(t)}};var N=class{constructor(t){this.identity="";this.sid="";this.name="";this.attributes={};this.kind="standard";this.trackPublications=new Map;this.audioTrackPublications=new Map;this.videoTrackPublications=new Map;this._cameraEnabled=!1;this._microphoneEnabled=!1;this._screenShareEnabled=!1;this.room=t,this.sid=l("PA"),this.joinedAt=new Date}get isCameraEnabled(){return this._cameraEnabled}get isMicrophoneEnabled(){return this._microphoneEnabled}get isScreenShareEnabled(){return this._screenShareEnabled}getTrackPublications(){return Array.from(this.trackPublications.values())}getTrackPublication(t){let i={camera:"camera",Camera:"camera",microphone:"microphone",Microphone:"microphone",screen_share:"screen_share",ScreenShare:"screen_share",screen_share_audio:"screen_share_audio",ScreenShareAudio:"screen_share_audio"}[t]||t;return this.trackPublications.get(i)}getTrackPublicationBySid(t){for(let e of this.trackPublications.values())if(e.trackSid===t)return e}setAttributes(t){this.attributes={...this.attributes,...t}}async setCameraEnabled(t,e){if(this._cameraEnabled=t,t){let{createSyntheticVideoTrack:n}=await Promise.resolve().then(()=>(U(),K)),{track:s,cleanup:o}=n({animation:"avatar",label:this.name||"Local Camera"}),a=new b("video","camera",s,o),g=new M(a,e?.name);return this.trackPublications.set("camera",g),this.videoTrackPublications.set(a.sid,g),this.room.emit("localTrackPublished",g,this),g}let i=this.trackPublications.get("camera");i&&(i.track?.stop(),this.trackPublications.delete("camera"),this.videoTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async setMicrophoneEnabled(t,e){if(this._microphoneEnabled=t,t){let{createSyntheticAudioTrack:n}=await Promise.resolve().then(()=>(U(),K)),{track:s,cleanup:o}=n({enabled:!1}),a=new b("audio","microphone",s,o),g=new M(a,e?.name);return this.trackPublications.set("microphone",g),this.audioTrackPublications.set(a.sid,g),this.room.emit("localTrackPublished",g,this),g}let i=this.trackPublications.get("microphone");i&&(i.track?.stop(),this.trackPublications.delete("microphone"),this.audioTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async setScreenShareEnabled(t,e){if(this._screenShareEnabled=t,t){let{createSyntheticVideoTrack:n}=await Promise.resolve().then(()=>(U(),K)),{track:s,cleanup:o}=n({animation:"bars",label:"Screen Share",width:1920,height:1080}),a=new b("video","screen_share",s,o),g=new M(a,e?.name||"screen");return this.trackPublications.set("screen_share",g),this.videoTrackPublications.set(a.sid,g),this.room.emit("localTrackPublished",g,this),g}let i=this.trackPublications.get("screen_share");i&&(i.track?.stop(),this.trackPublications.delete("screen_share"),this.videoTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async publishTrack(t,e){let i=new M(t,e?.name),n=e?.source||t.source;return this.trackPublications.set(n,i),t.kind==="audio"?this.audioTrackPublications.set(t.sid,i):t.kind==="video"&&this.videoTrackPublications.set(t.sid,i),this.room.emit("localTrackPublished",i,this),i}async unpublishTrack(t){t.stop();for(let[e,i]of this.trackPublications)if(i.track===t){this.trackPublications.delete(e),t.kind==="audio"?this.audioTrackPublications.delete(t.sid):t.kind==="video"&&this.videoTrackPublications.delete(t.sid),this.room.emit("localTrackUnpublished",i,this);break}}async sendText(t,e){return{id:l("msg")}}async publishData(t,e){}async setMetadata(t){this.attributes.metadata=t}async setName(t){this.name=t}cleanup(){for(let t of this.trackPublications.values())t.track?.stop();this.trackPublications.clear(),this.audioTrackPublications.clear(),this.videoTrackPublications.clear(),this._cameraEnabled=!1,this._microphoneEnabled=!1,this._screenShareEnabled=!1}};var yt=(s=>(s[s.STANDARD=0]="STANDARD",s[s.INGRESS=1]="INGRESS",s[s.EGRESS=2]="EGRESS",s[s.SIP=3]="SIP",s[s.AGENT=4]="AGENT",s))(yt||{});function we(r){switch(r){case"standard":return 0;case"ingress":return 1;case"egress":return 2;case"sip":return 3;case"agent":return 4;default:return 0}}var C=class{constructor(t,e,i={},n="standard"){this.connectionQuality="excellent";this.isSpeaking=!1;this.audioLevel=0;this.trackPublications=new Map;this.identity=t,this.sid=l("PA"),this.name=e,this.attributes=i,this._kindString=n,this.kind=we(n),this.joinedAt=new Date}get isAgent(){return this.kind===4||this.attributes["lk.agent.name"]!==void 0}get kindString(){return this._kindString}get isCameraEnabled(){let t=this.getTrackPublication("camera");return!!(t?.track&&!t.isMuted)}get isMicrophoneEnabled(){let t=this.getTrackPublication("microphone");return!!(t?.track&&!t.isMuted)}getTrackPublication(t){for(let e of this.trackPublications.values())if(e.source===t)return e}getTrackPublicationBySid(t){return this.trackPublications.get(t)}getTrackPublications(){return Array.from(this.trackPublications.values())}getAudioTracks(){return this.getTrackPublications().filter(t=>t.kind==="audio")}getVideoTracks(){return this.getTrackPublications().filter(t=>t.kind==="video")}addTrackPublication(t){this.trackPublications.set(t.trackSid,t)}removeTrackPublication(t){let e=this.trackPublications.get(t);return e&&(this.trackPublications.delete(t),e.track?.stop()),e}setAttributes(t){this.attributes={...this.attributes,...t}}getAttribute(t){return this.attributes[t]}startSpeaking(t=.5){this.isSpeaking=!0,this.audioLevel=t}stopSpeaking(){this.isSpeaking=!1,this.audioLevel=0}setConnectionQuality(t){this.connectionQuality=t}cleanup(){for(let t of this.trackPublications.values())t.track?.stop();this.trackPublications.clear()}};var I=class{constructor(t){this.remoteParticipants=new Map;this._state="disconnected";this.eventHandlers=new Map;this.textStreamHandlers=new Map;this.rpcHandlers=new Map;this.mockService=t,this.localParticipant=new N(this),this.sid=l("RM")}get state(){return this._state}set state(t){let e=this._state;this._state=t,e!==t&&this.emit("connectionStateChanged",t,e)}get numParticipants(){return this.remoteParticipants.size+1}get isConnected(){return this._state==="connected"}async connect(t,e){this._state="connecting",this.emit("connectionStateChanged","connecting","disconnected"),await this.mockService.simulateLatency(),this._state="connected",this.connectedAt=new Date().toISOString(),this.emit("connectionStateChanged","connected","connecting"),this.emit("connected")}async disconnect(){for(let e of this.remoteParticipants.values())e.cleanup();this.remoteParticipants.clear(),this.localParticipant.cleanup();let t=this._state;this._state="disconnected",this.emit("connectionStateChanged","disconnected",t),this.emit("disconnected"),this.eventHandlers.clear()}async reconnect(){this._state="reconnecting",this.emit("connectionStateChanged","reconnecting","connected"),await this.mockService.simulateLatency(),this._state="connected",this.emit("connectionStateChanged","connected","reconnecting"),this.emit("reconnected")}on(t,e){return this.eventHandlers.has(t)||this.eventHandlers.set(t,new Set),this.eventHandlers.get(t).add(e),this}once(t,e){let i=(...n)=>{this.off(t,i),e(...n)};return this.on(t,i)}off(t,e){return this.eventHandlers.get(t)?.delete(e),this}removeAllListeners(){this.eventHandlers.clear()}emit(t,...e){let i=this.eventHandlers.get(t);if(i)for(let n of i)try{n(...e)}catch(s){console.error(`Error in mock room event handler for ${t}:`,s)}}registerRpcMethod(t,e){this.rpcHandlers.set(t,e)}unregisterRpcMethod(t){this.rpcHandlers.delete(t)}async callRpc(t,e,i,n=1e4){let s=this.rpcHandlers.get(t);if(!s)throw new Error(`RPC method not found: ${t}`);return s({callerIdentity:e,payload:i,responseTimeout:n})}registerTextStreamHandler(t,e){this.textStreamHandlers.set(t,e)}unregisterTextStreamHandler(t){this.textStreamHandlers.delete(t)}simulateTextStream(t,e){let i=this.textStreamHandlers.get(t);i&&i(e,{identity:e.participantIdentity})}getParticipantByIdentity(t){return t===this.localParticipant.identity?new C(this.localParticipant.identity,this.localParticipant.name,this.localParticipant.attributes):this.remoteParticipants.get(t)}getParticipantBySid(t){if(t===this.localParticipant.sid)return new C(this.localParticipant.identity,this.localParticipant.name,this.localParticipant.attributes);for(let e of this.remoteParticipants.values())if(e.sid===t)return e}async simulateParticipantJoin(t,e){let i=new C(t,e?.name,e?.attributes||{},e?.kind||"standard");return this.remoteParticipants.set(t,i),this.emit("participantConnected",i),e?.withCamera&&await this.simulateRemoteTrack(t,"video","camera"),e?.withMicrophone&&await this.simulateRemoteTrack(t,"audio","microphone"),i}simulateParticipantLeave(t){let e=this.remoteParticipants.get(t);if(e){for(let i of e.getTrackPublications())i.track?.stop(),this.emit("trackUnsubscribed",i.track,i,e);this.remoteParticipants.delete(t),this.emit("participantDisconnected",e)}}async simulateRemoteTrack(t,e,i){let n=this.remoteParticipants.get(t);if(!n)return;let s,o;if(e==="video"){let{createSyntheticVideoTrack:d}=await Promise.resolve().then(()=>(U(),K)),h=d({animation:n.isAgent?"avatar":"pulse",label:n.name||t,foregroundColor:n.isAgent?"#22c55e":"#4361ee"});s=h.track,o=h.cleanup}else if(e==="audio"){let{createSyntheticAudioTrack:d}=await Promise.resolve().then(()=>(U(),K)),h=d({enabled:!1});s=h.track,o=h.cleanup}let a=new b(e,i,s,o),g=new M(a);return n.addTrackPublication(g),this.emit("trackSubscribed",a,g,n),this.emit("trackPublished",g,n),a}simulateTrackUnpublished(t,e){let i=this.remoteParticipants.get(t);if(!i)return;let n=i.getTrackPublication(e);n&&(i.removeTrackPublication(n.trackSid),this.emit("trackUnpublished",n,i),this.emit("trackUnsubscribed",n.track,n,i))}async simulateAgentJoin(t,e="AI Agent"){return this.simulateParticipantJoin(t,{name:e,kind:"agent",withCamera:!0,withMicrophone:!0,attributes:{"lk.agent.name":e,"lk.agent.state":"active"}})}simulateAttributeChange(t,e){let i=this.remoteParticipants.get(t);if(i){let n={...i.attributes};i.setAttributes(e),this.emit("participantAttributesChanged",e,n,i)}}simulateTrackMuted(t,e,i){let n=this.remoteParticipants.get(t);if(!n)return;let s=n.getTrackPublication(e);s?.track&&(s.track.setMuted(i),this.emit(i?"trackMuted":"trackUnmuted",s,n))}simulateActiveSpeakersChanged(t){let e=[];for(let i of t){let n=this.remoteParticipants.get(i);n&&(n.startSpeaking(),e.push(n))}this.emit("activeSpeakersChanged",e)}simulateDataReceived(t,e,i,n){let s=this.remoteParticipants.get(e);this.emit("dataReceived",t,s,i,n)}};var V=class{constructor(t={}){this.rooms=new Map;this.participants=new Map;this.tracks=new Map;this.agents=new Map;this.messages=new Map;this.config=t,this.randomState=t.seed??Date.now()}updateConfig(t){this.config={...this.config,...t},t.seed!==void 0&&(this.randomState=t.seed)}getConfig(){return{...this.config}}random(){return this.randomState=(this.randomState*1103515245+12345)%2147483648,this.randomState/2147483648}createRoom(t,e,i){let n=l("room"),s=new Date().toISOString(),o={id:n,name:t,groupId:e||l("group"),createdAt:s,metadata:i,isActive:!0,participantIds:[],connectionState:"disconnected",wsURL:$(n),token:P(n,"pending",s)};return this.rooms.set(n,o),this.messages.set(n,[]),o}getRoom(t){return this.rooms.get(t)}getRoomByName(t){for(let e of this.rooms.values())if(e.name===t)return e}listRooms(t=!1){let e=Array.from(this.rooms.values());return t?e.filter(i=>i.isActive):e}updateRoomConnectionState(t,e){let i=this.rooms.get(t);if(!i)return;let n=i.connectionState;return i.connectionState=e,n}endRoom(t){let e=this.rooms.get(t);if(!e||!e.isActive)return!1;e.isActive=!1,e.endedAt=new Date().toISOString(),e.connectionState="disconnected";for(let i of e.participantIds){let n=this.participants.get(i);n&&(n.isConnected=!1)}for(let i of this.agents.values())i.roomId===t&&i.status==="running"&&(i.status="stopped",i.stoppedAt=new Date().toISOString());return!0}deleteRoom(t){let e=this.rooms.get(t);if(!e)return!1;for(let i of e.participantIds)this.participants.delete(i);for(let[i,n]of this.tracks)n.roomId===t&&this.tracks.delete(i);for(let[i,n]of this.agents)n.roomId===t&&this.agents.delete(i);return this.messages.delete(t),this.rooms.delete(t),!0}addParticipant(t,e,i,n="user",s="standard",o=!1){let a=this.rooms.get(t);if(!a)return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);if(!a.isActive)return this.createError("ROOM_ENDED",`Room ${t} has ended`);let g=this.participants.get(e);if(g&&g.roomId===t&&g.isConnected)return this.config.strictMode?this.createError("PARTICIPANT_ALREADY_JOINED",`Participant ${e} is already in room ${t}`):g;let d={identity:e,name:i||e,roomId:t,joinedAt:new Date().toISOString(),isConnected:!0,trackIds:[],role:n,attributes:{},kind:s,isLocal:o};return this.participants.set(e,d),a.participantIds.push(e),d}getParticipant(t){return this.participants.get(t)}listParticipants(t,e=!0){let i=this.rooms.get(t);if(!i)return[];let n=[];for(let s of i.participantIds){let o=this.participants.get(s);o&&(!e||o.isConnected)&&n.push(o)}return n}updateParticipantAttributes(t,e){let i=this.participants.get(t);if(!i)return;let n={...i.attributes};return i.attributes={...i.attributes,...e},n}removeParticipant(t){let e=this.participants.get(t);if(!e)return;e.isConnected=!1;for(let n of e.trackIds)this.tracks.delete(n);e.trackIds=[];let i=this.rooms.get(e.roomId);if(i){let n=i.participantIds.indexOf(t);n!==-1&&i.participantIds.splice(n,1)}return e}publishTrack(t,e,i="unknown",n){let s=this.participants.get(t);if(!s)return this.createError("PARTICIPANT_NOT_FOUND",`Participant ${t} not found`);if(!s.isConnected)return this.createError("INVALID_OPERATION",`Participant ${t} is not connected`);let o=this.rooms.get(s.roomId);if(!o||!o.isActive)return this.createError("ROOM_ENDED","Room is not active");let a=l("track"),g={id:a,kind:e,source:i,participantIdentity:t,roomId:s.roomId,publishedAt:new Date().toISOString(),muted:!1,metadata:n};return this.tracks.set(a,g),s.trackIds.push(a),g}getTrack(t){return this.tracks.get(t)}listTracks(t,e){let i=[];for(let n of this.tracks.values())t&&n.roomId!==t||e&&n.participantIdentity!==e||i.push(n);return i}unpublishTrack(t){let e=this.tracks.get(t);if(!e)return;let i=this.participants.get(e.participantIdentity);if(i){let n=i.trackIds.indexOf(t);n!==-1&&i.trackIds.splice(n,1)}return this.tracks.delete(t),e}setTrackMuted(t,e){let i=this.tracks.get(t);return i?(i.muted=e,!0):!1}startAgent(t,e,i={}){let n=this.rooms.get(t);if(!n)return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);if(!n.isActive)return this.createError("ROOM_ENDED",`Room ${t} has ended`);let s=l("agent"),o={id:s,roomId:t,name:e,status:"running",startedAt:new Date().toISOString(),config:{responseStrategy:"echo",...i},messageHistory:[]};return this.agents.set(s,o),this.addParticipant(t,`agent_${s}`,e,"agent","agent",!1),o}getAgent(t){return this.agents.get(t)}listAgents(t){let e=[];for(let i of this.agents.values())i.roomId===t&&e.push(i);return e}stopAgent(t){let e=this.agents.get(t);if(e)return e.status="stopped",e.stoppedAt=new Date().toISOString(),this.removeParticipant(`agent_${t}`),e}updateAgentStatus(t,e){let i=this.agents.get(t);return i?(i.status=e,e==="stopped"&&(i.stoppedAt=new Date().toISOString()),!0):!1}addAgentMessage(t,e,i){let n=this.agents.get(t);if(!n)return;let s={id:l("msg"),content:e,role:i,timestamp:new Date().toISOString()};return n.messageHistory.push(s),s}addMessage(t,e,i,n="standard",s){if(!this.rooms.get(t))return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);let a={id:l("msg"),roomId:t,content:i,participantIdentity:e,createdAt:new Date().toISOString(),type:n,attributes:s},g=this.messages.get(t)||[];return g.push(a),this.messages.set(t,g),a}getMessages(t,e){let i=this.messages.get(t)||[];return e?i.slice(-e):i}createError(t,e,i){return{code:t,message:e,details:i}}isError(t){return typeof t=="object"&&t!==null&&"code"in t&&"message"in t}reset(){this.rooms.clear(),this.participants.clear(),this.tracks.clear(),this.agents.clear(),this.messages.clear(),this.randomState=this.config.seed??Date.now()}getSnapshot(){return{rooms:new Map(this.rooms),participants:new Map(this.participants),tracks:new Map(this.tracks),agents:new Map(this.agents),messages:new Map(this.messages),config:{...this.config},eventHistory:[]}}toJSON(){return{rooms:Object.fromEntries(this.rooms),participants:Object.fromEntries(this.participants),tracks:Object.fromEntries(this.tracks),agents:Object.fromEntries(this.agents),messages:Object.fromEntries(this.messages),config:this.config,eventHistory:[],exportedAt:new Date().toISOString()}}fromJSON(t){this.rooms=new Map(Object.entries(t.rooms)),this.participants=new Map(Object.entries(t.participants)),this.tracks=new Map(Object.entries(t.tracks)),this.agents=new Map(Object.entries(t.agents)),this.messages=new Map(Object.entries(t.messages).map(([e,i])=>[e,i])),this.config=t.config}};var w=class{constructor(t={}){this.messageListeners=new Set;this.typingListeners=new Set;this.callRequestListeners=new Map;this._authToken=null;this._registeredUser=null;this.agents=new Map;this.config={latencyMs:t.latencyMs??0,strictMode:t.strictMode??!1,seed:t.seed,scenario:t.scenario,errorConfig:t.errorConfig,autoEmitEvents:t.autoEmitEvents??!0,organizationId:t.organizationId??"mock_org",apiUrl:t.apiUrl??"https://mock-livekit.local"},this.state=new V(this.config),this.events=new j,this.room=new I(this),this.config.scenario&&this.applyScenario(this.config.scenario)}get authToken(){return this._authToken}get registeredUser(){return this._registeredUser}getState(){return this.state}getEvents(){return this.events}updateConfig(t){this.config={...this.config,...t},this.state.updateConfig(t)}getConfig(){return{...this.config}}async simulateLatency(){this.config.latencyMs&&this.config.latencyMs>0&&await new Promise(t=>setTimeout(t,this.config.latencyMs))}applyScenario(t){switch(t){case"happy_path":this.config.errorConfig={},this.config.latencyMs=0;break;case"slow_network":this.config.latencyMs=500;break;case"network_unstable":this.config.errorConfig={errorRate:30};break;default:break}}shouldThrowError(){return this.config.errorConfig?.errorRate?this.state.random()*100<this.config.errorConfig.errorRate:!1}ensureRoom(){return this.room||(this.room=new I(this)),this.room}async registerUser(t,e,i,n){if(await this.simulateLatency(),this.config.errorConfig?.unauthorized)throw new u("UNAUTHORIZED","Registration failed");let s={id:l("user"),externalId:t,organizationId:this.config.organizationId,role:"user",token:P("pending",t,new Date().toISOString())};return this._authToken=s.token,this._registeredUser=s,this.room.localParticipant.identity=t,this.room.localParticipant.name=i?.name||t,s}async registerAgent(t,e){if(await this.simulateLatency(),this.config.errorConfig?.unauthorized)throw new u("UNAUTHORIZED","Agent registration failed");let i=P("agent",t,new Date().toISOString());return this._authToken=i,this.room.localParticipant.identity=t,this.room.localParticipant.name=e.name,i}async createRoom(t,e={}){if(await this.simulateLatency(),this.config.errorConfig?.networkError||this.shouldThrowError())throw new u("NETWORK_ERROR","Failed to create room");let i=this.state.createRoom(`room_${Date.now()}`,t.affinity?.agentId,t.metadata);this.room.id=i.id,this.room.groupId=i.groupId,this.room.createdAt=i.createdAt,this.room.connectedAt=new Date().toISOString();let n=this.room.localParticipant.identity||"local_user";return this.state.addParticipant(i.id,n,this.room.localParticipant.name,"user","standard",!0),Object.keys(e).length>0&&(this.state.updateParticipantAttributes(n,e),this.room.localParticipant.setAttributes(e)),this.state.updateRoomConnectionState(i.id,"connected"),this.config.autoEmitEvents&&(this.events.emitRoomCreated(i),this.events.emitRoomConnectionStateChanged(i.id,"connected","disconnected")),(t.affinity?.agentId||t.affinity?.agentType)&&await this.startMockAgent(i.id,{type:t.affinity?.agentType,nature:t.affinity?.nature??"ai"}),await this.room.connect(i.wsURL,i.token),this.room}async joinRoom(t,e,i,n){await this.simulateLatency();let s=this.state.getRoom(t);if(!s)throw new T(t);if(!s.isActive)throw new u("ROOM_ENDED",`Room ${t} has ended`);this.room.id=s.id,this.room.groupId=s.groupId,this.room.createdAt=s.createdAt,this.room.connectedAt=new Date().toISOString();let o=this.room.localParticipant.identity||"local_user",a=this.state.addParticipant(t,o,this.room.localParticipant.name,"user","standard",!0);if(A(a))throw z(a);if(n){let g={};for(let[d,h]of Object.entries(n))g[d]=String(h);this.state.updateParticipantAttributes(o,g)}return this.state.updateRoomConnectionState(t,"connected"),this.config.autoEmitEvents&&(this.events.emitParticipantJoined(t,a),this.events.emitRoomConnectionStateChanged(t,"connected","disconnected")),await this.room.connect(s.wsURL,s.token),this.room}async evaluateRoom(t){await this.simulateLatency();let e=t.roomId||this.room?.id;if(!e)throw new u("ROOM_NOT_FOUND","No room to evaluate");let i=this.state.getRoom(e);if(!i)throw new T(e);i.metadata||(i.metadata={}),i.metadata.evaluation={rating:t.rating,comment:t.comment,evaluatedAt:new Date().toISOString()}}async closeRoom(){await this.simulateLatency(),this.room?.id&&(this.state.endRoom(this.room.id),await this.stopLocalTracks(),this.config.autoEmitEvents&&this.events.emitRoomEnded(this.room.id))}async disconnect(){if(this.room){let t=this.room.id,e=this.room.localParticipant.identity;await this.stopLocalTracks(),this.state.removeParticipant(e),this.config.autoEmitEvents&&t&&this.events.emitParticipantLeft(t,e),this.room.removeAllListeners(),await this.room.disconnect()}}async stopLocalTracks(){let t=this.room?.localParticipant;t&&await Promise.all([t.setCameraEnabled(!1),t.setMicrophoneEnabled(!1),t.setScreenShareEnabled(!1)])}async disconnectAndCloseRoom(){await this.closeRoom(),await this.disconnect()}async readRoom(t){await this.simulateLatency();let e=this.state.getRoom(t);if(!e)throw new T(t);e.metadata||(e.metadata={}),e.metadata.lastReadAt=new Date().toISOString()}async getRooms(t){await this.simulateLatency();let e=this.state.listRooms();t.roomStatus==="active"?e=e.filter(a=>a.isActive):t.roomStatus==="closed"&&(e=e.filter(a=>!a.isActive)),t.ids?.length&&(e=e.filter(a=>t.ids.includes(a.id))),t.groupId&&(e=e.filter(a=>a.groupId===t.groupId));let i=t.offset??0,n=t.limit??20;return{items:e.slice(i,i+n).map(a=>({id:a.id,name:a.name,groupId:a.groupId,organizationId:this.config.organizationId,endedAt:a.endedAt??null,createdAt:a.createdAt,updatedAt:a.createdAt,status:a.isActive?"active":"ended",participants:this.state.listParticipants(a.id).map(g=>({id:g.identity,name:g.name||g.identity,role:g.role,isLocal:g.isLocal})),evaluations:[],_count:{messages:this.state.getMessages(a.id).length,participants:a.participantIds.length}})),count:e.length,limit:n,offset:i}}async sendMessage(t,e){if(await this.simulateLatency(),!this.room?.id)throw new u("INVALID_OPERATION","Not connected to a room");let i=this.state.addMessage(this.room.id,this.room.localParticipant.identity,t,"standard",e);if(A(i))throw z(i);let n={id:i.id,timestamp:Date.now(),message:t,content:t,createdAt:i.createdAt,from:{identity:this.room.localParticipant.identity,name:this.room.localParticipant.name,id:this.room.localParticipant.identity,role:"user"}};for(let s of this.messageListeners)s([n]);this.config.autoEmitEvents&&this.events.emitMessageSent(this.room.id,i);for(let s of this.agents.values())s.isRunning&&s.roomId===this.room.id&&this.triggerAgentResponse(s,t)}async persistMessage(t){await this.simulateLatency();let e=this.state.addMessage(t.roomId,t.identity||"system",t.content);if(A(e))throw z(e);return{items:[{id:e.id,timestamp:Date.now(),message:e.content,content:e.content,createdAt:e.createdAt}],count:1,limit:1,offset:0}}async getMessages(t){await this.simulateLatency();let e=t.roomId||this.room?.id;return e?this.state.getMessages(e,t.limit).map(n=>({id:n.id,timestamp:Date.parse(n.createdAt),message:n.content,content:n.content,createdAt:n.createdAt,from:{identity:n.participantIdentity,id:n.participantIdentity,role:"user"}})):[]}async sendMessageReport(t){await this.simulateLatency()}async deleteMessageReport(t){await this.simulateLatency()}async updateMessageReactions(t){await this.simulateLatency()}subscribeMessages(t){return this.messageListeners.add(t),()=>{this.messageListeners.delete(t)}}async sendTypingIndicator(t){if(!this.room?.id)return;let e={type:"typing",isTyping:t,timestamp:Date.now(),participantId:this.room.localParticipant.identity};for(let i of this.typingListeners)i(e);this.config.autoEmitEvents&&this.events.emitTypingIndicator(this.room.id,this.room.localParticipant.identity,t)}subscribeTypingIndicators(t){return this.typingListeners.add(t),()=>this.typingListeners.delete(t)}unsubscribeTypingIndicators(t){this.typingListeners.delete(t)}async sendContextualEvent(t){await this.simulateLatency()}async requestNewRoom(t){await this.simulateLatency();let e=this.state.createRoom(`transfer_${Date.now()}`,void 0,{originRoom:t.originRoom});return{id:e.id,groupId:e.groupId,token:e.token,wsURL:e.wsURL,createdAt:e.createdAt}}async confirmRoomRequest(t){return await this.simulateLatency(),{success:!0,message:"Request confirmed",roomId:t}}async cancelRoomRequest(t){return await this.simulateLatency(),{success:!0,message:"Request cancelled",roomId:t}}async finishCall(){await this.simulateLatency(),this.room?.id&&this.state.endRoom(this.room.id)}isFirebaseEnabled(){return!0}onPresenceChange(t){return()=>{}}onPresenceAgentChange(t,e){return()=>{}}async createCallRequest(t){return await this.simulateLatency(),l("call")}onNewCallRequest(t){return this.callRequestListeners.has("new")||this.callRequestListeners.set("new",new Set),this.callRequestListeners.get("new").add(t),()=>this.callRequestListeners.get("new")?.delete(t)}onCallRequestChange(t){return this.callRequestListeners.has("change")||this.callRequestListeners.set("change",new Set),this.callRequestListeners.get("change").add(t),()=>this.callRequestListeners.get("change")?.delete(t)}onCallRequestRemoved(t){return()=>{}}async acceptCallRequest(t){await this.simulateLatency()}async cancelCallRequest(t){await this.simulateLatency()}async cancelOnDisconnect(t){await this.simulateLatency()}subscribePendingRequests(t,e={}){return()=>{}}subscribeRequestChanges(t){return()=>{}}async tryAcceptRequest(t){return await this.simulateLatency(),!0}onRoomSync(t,e){return()=>{}}async clearRoomSync(t,e){await this.simulateLatency()}onNewRoomRequest(t,e){return()=>{}}unsubscribeAllFirebase(){this.callRequestListeners.clear()}async destroy(){this.unsubscribeAllFirebase(),this.messageListeners.clear(),this.typingListeners.clear(),await this.disconnect(),this.state.reset()}async startMockAgent(t,e){let i=e?.name||"AI Assistant",n=new y(l("agent"),i,{responseStrategy:e?.responseStrategy||"echo",responseDelayMs:e?.responseDelayMs||100,cannedResponses:e?.cannedResponses||[],type:e?.type,nature:e?.nature});await n.start(t),this.agents.set(n.id,n),this.customAgentHandler&&n.setCustomHandler((d,h)=>this.customAgentHandler(d,h));let s=e?.type,o=Array.isArray(s)?s:[s].filter(Boolean),a=o.includes("video"),g=o.includes("voice");return(a||g)&&this.room.isConnected&&await this.room.simulateParticipantJoin(n.id,{name:i,kind:"agent",withCamera:a,withMicrophone:g||a,attributes:{"lk.agent.name":i,"lk.agent.state":"active",role:"agent"}}),this.config.autoEmitEvents&&this.events.emitAgentStarted(t,{id:n.id,name:n.name,roomId:t,status:"running",config:n.getConfig(),startedAt:new Date().toISOString(),messageHistory:[]}),n.id}async stopMockAgent(t){let e=this.agents.get(t);if(e){let i=e.roomId;await e.stop(),this.agents.delete(t),this.config.autoEmitEvents&&i&&this.events.emitAgentStopped(i,t)}}setAgentResponseHandler(t){this.customAgentHandler=t;for(let e of this.agents.values())e.setCustomHandler((i,n)=>t(i,n))}async triggerAgentResponse(t,e){if(this.config.scenario!=="agent_timeout")try{let i=await t.processMessage(e);if(!i)return;let n=this.state.addMessage(t.roomId,`agent_${t.id}`,i);if(!A(n)){let s={id:n.id,timestamp:Date.now(),message:i,content:i,createdAt:n.createdAt,from:{identity:`agent_${t.id}`,name:t.name,id:t.id,role:"agent"}};for(let o of this.messageListeners)o([s]);this.config.autoEmitEvents&&this.events.emitMessageReceived(t.roomId,n)}}catch(i){console.error("Agent response error:",i)}}simulateCallRequest(t){let e={id:l("call"),guestId:t.guestId||"guest_user",name:t.name||"Guest User",createdAt:new Date().toISOString(),status:t.status||"pending",...t},i=this.callRequestListeners.get("new");if(i)for(let n of i)n(e.id,e)}simulateParticipantJoin(t,e,i="user"){if(!this.room?.id)return;let n=this.state.addParticipant(this.room.id,t,e,i,"standard",!1);!A(n)&&this.config.autoEmitEvents&&this.events.emitParticipantJoined(this.room.id,n)}simulateParticipantLeave(t){if(!this.room?.id)return;this.state.removeParticipant(t)&&this.config.autoEmitEvents&&this.events.emitParticipantLeft(this.room.id,t)}simulateIncomingMessage(t,e){if(!this.room?.id)return;let i=this.state.addMessage(this.room.id,t,e);if(A(i))return;let n={id:i.id,timestamp:Date.now(),message:e,content:e,createdAt:i.createdAt,from:{identity:t,id:t,role:"user"}};for(let s of this.messageListeners)s([n]);this.config.autoEmitEvents&&this.events.emitMessageReceived(this.room.id,i)}async simulateDisconnect(){if(!this.room?.id)return;let t=this.room.state;this.room.state="disconnected",this.config.autoEmitEvents&&this.events.emitRoomConnectionStateChanged(this.room.id,"disconnected",t),this.room.emit("connectionStateChanged","disconnected")}reset(){this.state.reset(),this.events.clearHistory(),this.messageListeners.clear(),this.typingListeners.clear(),this.callRequestListeners.clear(),this.agents.clear(),this._authToken=null,this._registeredUser=null,this.room=new I(this),gt()}seed(t){this.config.seed=t,this.state.updateConfig({seed:t})}setScenario(t){this.config.scenario=t,this.applyScenario(t)}exportState(){return{...this.state.toJSON(),eventHistory:this.events.getHistory()}}getEventHistory(t){return this.events.getHistory(t)}};var St={},E={MODE:"LIVEKIT_MODE",USE_MOCK:"USE_LIVEKIT_MOCK",MOCK_LATENCY:"MOCK_LIVEKIT_LATENCY_MS",MOCK_STRICT:"MOCK_LIVEKIT_STRICT",MOCK_SCENARIO:"MOCK_LIVEKIT_SCENARIO",MOCK_SEED:"MOCK_LIVEKIT_SEED",API_URL:"LIVEKIT_API_URL",AUTH_URL:"LIVEKIT_AUTH_URL",ORG_ID:"LIVEKIT_ORGANIZATION_ID"};function Mt(){let r=O(E.MODE);if(r==="mock"||r==="real")return r;let t=O(E.USE_MOCK);return t==="true"||t==="1"||xe()?"mock":"real"}function Ee(){let r={},t=O(E.MOCK_LATENCY);t&&(r.latencyMs=parseInt(t,10));let e=O(E.MOCK_STRICT);(e==="true"||e==="1")&&(r.strictMode=!0);let i=O(E.MOCK_SCENARIO);i&&(r.scenario=i);let n=O(E.MOCK_SEED);return n&&(r.seed=parseInt(n,10)),r}function Oe(){let r={},t=O(E.API_URL);t&&(r.apiUrl=t);let e=O(E.AUTH_URL);e&&(r.authUrl=e);let i=O(E.ORG_ID);return i&&(r.organizationId=i),r}function O(r){if(typeof process<"u"&&process.env)return process.env[r];if(typeof St<"u"&&St.env)return St.env[`VITE_${r}`]||St.env[r];if(typeof window<"u"&&window.__ENV__)return window.__ENV__[r]}function xe(){return!!(typeof process<"u"&&process.env&&(process.env.NODE_ENV==="test"||process.env.VITEST||process.env.JEST_WORKER_ID)||typeof globalThis.__vitest_index__<"u")}var _=class r{static create(t){if((t.mode??Mt())==="mock"){let i={...Ee(),...t.mockConfig,organizationId:t.organizationId,apiUrl:t.apiUrl};return new w(i)}if(!t.organizationId||!t.apiUrl)throw new Error("ConversationService requires organizationId and apiUrl. Provide them in options or set LIVEKIT_ORGANIZATION_ID and LIVEKIT_API_URL environment variables.");return new mt(t)}static createFromEnv(t){let e=t?.mode??Mt(),i=Oe();return r.create({...i,...t,mode:e})}static createMock(t){return new w({organizationId:"mock_org",apiUrl:"https://mock-livekit.local",...t})}static createDeterministicMock(t=12345){return new w({organizationId:"mock_org",apiUrl:"https://mock-livekit.local",seed:t,strictMode:!0})}static getCurrentMode(){return Mt()}static isMockMode(){return Mt()==="mock"}static isMockService(t){return t instanceof w}};function re(r){return _.createFromEnv(r)}function bt(r){return _.createMock(r)}function Rt(r){let t=r?.id??l("room"),e=new Date().toISOString();return{id:t,name:`Test Room ${t}`,groupId:l("group"),createdAt:e,isActive:!0,participantIds:[],connectionState:"connected",wsURL:$(t),token:P(t,"local_user",e),...r}}function Pt(r="local_user",t){let e=Rt(t);e.participantIds.push(r);let i={identity:r,name:"Local User",roomId:e.id,joinedAt:new Date().toISOString(),isConnected:!0,trackIds:[],role:"user",attributes:{},kind:"standard",isLocal:!0};return{room:e,localParticipant:i}}function xt(r){let t=Rt(r),e=new Date().toISOString(),i={identity:"user_1",name:"User One",roomId:t.id,joinedAt:e,isConnected:!0,trackIds:[],role:"user",attributes:{},kind:"standard",isLocal:!0},n={identity:"user_2",name:"User Two",roomId:t.id,joinedAt:e,isConnected:!0,trackIds:[],role:"user",attributes:{},kind:"standard",isLocal:!1};return t.participantIds.push(i.identity,n.identity),{room:t,participant1:i,participant2:n}}function Tt(r,t){let{room:e,localParticipant:i}=Pt("local_user",t),n=new Date().toISOString(),s=l("agent"),o={id:s,roomId:e.id,name:"AI Assistant",status:"running",startedAt:n,config:{responseStrategy:"echo",nature:"ai",...r},messageHistory:[]},a={identity:`agent_${s}`,name:"AI Assistant",roomId:e.id,joinedAt:n,isConnected:!0,trackIds:[],role:"agent",attributes:{},kind:"agent",isLocal:!1};return e.participantIds.push(a.identity),{room:e,localParticipant:i,agent:o,agentParticipant:a}}function se(r){let{room:t,localParticipant:e,agent:i,agentParticipant:n}=Tt(void 0,r),s={id:l("track"),kind:"data",source:"unknown",participantIdentity:n.identity,roomId:t.id,publishedAt:new Date().toISOString(),muted:!1};return n.trackIds.push(s.id),{room:t,localParticipant:e,agent:i,dataTrack:s}}function oe(r){let{room:t,localParticipant:e}=Pt("local_user",r),i=new Date().toISOString(),n={id:l("track"),kind:"audio",source:"microphone",participantIdentity:e.identity,roomId:t.id,publishedAt:i,muted:!1},s={id:l("track"),kind:"video",source:"camera",participantIdentity:e.identity,roomId:t.id,publishedAt:i,muted:!1};return e.trackIds.push(n.id,s.id),{room:t,participant:e,audioTrack:n,videoTrack:s}}function _t(r,t){let e=t?.identity??l("participant");return{identity:e,name:`Participant ${e}`,roomId:r,joinedAt:new Date().toISOString(),isConnected:!0,trackIds:[],role:"user",attributes:{},kind:"standard",isLocal:!1,...t}}function ae(r,t){let e=[];for(let i=0;i<t;i++)e.push(_t(r,{identity:`participant_${i+1}`,name:`Participant ${i+1}`,isLocal:i===0}));return e}function At(r,t){return{id:t?.id??l("agent"),roomId:r,name:"AI Assistant",status:"running",startedAt:new Date().toISOString(),config:{responseStrategy:"echo",nature:"ai",...t?.config},messageHistory:[],...t}}function ce(r,t){return At(r,{config:{responseStrategy:"canned",cannedResponses:t}})}function de(r,t){return At(r,{config:{responseStrategy:"sequential",cannedResponses:t}})}function ge(r,t,e){return{id:l("msg"),roomId:r,content:"Test message",participantIdentity:t,createdAt:new Date().toISOString(),type:"standard",...e}}function Lt(r,t){return t.map((e,i)=>({id:l("msg"),roomId:r,content:e.content,participantIdentity:e.identity,createdAt:new Date(Date.now()+i*1e3).toISOString(),type:"standard"}))}function st(r){return{latencyMs:0,strictMode:!1,autoEmitEvents:!0,organizationId:"test_org",apiUrl:"https://mock-api.local",...r}}function le(r){return st({strictMode:!0,...r})}function ue(r,t){return st({latencyMs:r,...t})}function pe(r,t){return st({seed:r,...t})}function me(){let{room:r,localParticipant:t,agent:e,agentParticipant:i}=Tt(),n=Lt(r.id,[{identity:t.identity,content:"Hello, I need help"},{identity:i.identity,content:"Hi! How can I assist you today?"},{identity:t.identity,content:"I have a question about my order"},{identity:i.identity,content:"Of course! Please provide your order number."}]);return{room:r,user:t,agent:e,agentParticipant:i,messages:n}}function he(){let{room:r,participant1:t,participant2:e}=xt(),i=new Date().toISOString(),n=[{id:l("track"),kind:"audio",source:"microphone",participantIdentity:t.identity,roomId:r.id,publishedAt:i,muted:!1},{id:l("track"),kind:"video",source:"camera",participantIdentity:t.identity,roomId:r.id,publishedAt:i,muted:!1},{id:l("track"),kind:"audio",source:"microphone",participantIdentity:e.identity,roomId:r.id,publishedAt:i,muted:!1},{id:l("track"),kind:"video",source:"camera",participantIdentity:e.identity,roomId:r.id,publishedAt:i,muted:!1}];return t.trackIds.push(n[0].id,n[1].id),e.trackIds.push(n[2].id,n[3].id),{room:r,participant1:t,participant2:e,tracks:n}}var J=class{constructor(t,e,i,n,s){this.index=0;this._complete=!1;this.info={id:t,attributes:n,topic:s,timestamp:Date.now()},this.participantIdentity=e,this.topic=s,this.chunks=Array.isArray(i)?i:[i],this.info.totalSize=this.chunks.reduce((o,a)=>o+a.length,0)}get isComplete(){return this._complete}async*[Symbol.asyncIterator](){for(let t of this.chunks)yield t;this._complete=!0}async read(){return this.index>=this.chunks.length?(this._complete=!0,null):this.chunks[this.index++]}async readAll(){let t=this.chunks.slice(this.index).join("");return this.index=this.chunks.length,this._complete=!0,t}cancel(){this._complete=!0}},ot=class{constructor(t,e){this.chunks=[];this._closed=!1;this.id=l("stream"),this._topic=t,this._destinationIdentities=e}get isClosed(){return this._closed}get topic(){return this._topic}get destinationIdentities(){return this._destinationIdentities}get content(){return this.chunks.join("")}onWrite(t){this.onWriteCallback=t}async write(t){if(this._closed)throw new Error("Stream is closed");this.chunks.push(t),this.onWriteCallback?.(t)}async close(){this._closed=!0}},at=class{constructor(t,e,i){this._index=0;this.info={id:t,timestamp:Date.now()},this.participantIdentity=e,this.chunks=Array.isArray(i)?i:[i]}get index(){return this._index}async*[Symbol.asyncIterator](){for(let t of this.chunks)yield t}async readAll(){let t=this.chunks.reduce((n,s)=>n+s.length,0),e=new Uint8Array(t),i=0;for(let n of this.chunks)e.set(n,i),i+=n.length;return e}};function Dt(r,t,e){return new J(e?.id||l("stream"),r,t,e?.attributes,e?.topic)}U();var L=null;function m(r){return L||(L=bt({organizationId:"storybook_org",apiUrl:"https://storybook.mock",latencyMs:50,autoEmitEvents:!0,...r})),L}function Ut(){L&&L.reset()}async function ke(){L&&(await L.destroy(),L=null)}function fe(r={}){return(t,e)=>{Ut();let i={default:void 0,slow_network:"slow_network",unreliable:"unreliable",agent_timeout:"agent_timeout"},n=m({organizationId:r.organizationId,latencyMs:r.latencyMs??50,scenario:r.scenario?i[r.scenario]:void 0});return(async()=>{try{if(r.autoRegisterUser&&await n.registerUser(r.autoRegisterUser.identity,r.autoRegisterUser.secret||"storybook_secret",{name:r.autoRegisterUser.name||"Storybook User"}),r.autoCreateRoom){if(await n.createRoom({language:r.autoCreateRoom.language||"en",timezone:r.autoCreateRoom.timezone||"UTC"}),r.seedMessages)for(let s of r.seedMessages)n.simulateIncomingMessage(s.from,s.content);r.autoStartAgent&&n.room?.id&&await n.startMockAgent(n.room.id,r.autoStartAgent)}}catch(s){console.error("[Storybook Mock] Setup error:",s)}})(),window.__mockConversationService=n,t()}}function ve(r){return _.isMockService(r)}var ye={basicChat:{autoRegisterUser:{identity:"sb_user",name:"User"},autoCreateRoom:{language:"en",timezone:"UTC"},autoStartAgent:{responseStrategy:"echo"}},aiAssistant:{autoRegisterUser:{identity:"sb_user",name:"User"},autoCreateRoom:{language:"en",timezone:"UTC"},autoStartAgent:{responseStrategy:"canned",cannedResponses:["Hello! How can I help you today?","I understand. Let me look into that for you.","Is there anything else you'd like to know?","Thank you for your patience!"]}},videoCall:{autoRegisterUser:{identity:"sb_user",name:"User"},autoCreateRoom:{language:"en",timezone:"UTC"},autoStartAgent:{responseStrategy:"canned",type:["text","video"],nature:"ai",name:"Video Agent",cannedResponses:["I can see you! The video quality looks great.","Let me share my screen to show you what I mean.","Is the audio coming through clearly?"]},simulateVideo:!0},multiParticipantCall:{autoRegisterUser:{identity:"sb_user",name:"User"},autoCreateRoom:{language:"en",timezone:"UTC"},autoStartAgent:{responseStrategy:"echo",type:["text","video"],name:"Video Agent"},simulateVideo:!0},multiTurnConversation:{autoRegisterUser:{identity:"sb_user",name:"User"},autoCreateRoom:{language:"en",timezone:"UTC"},autoStartAgent:{responseStrategy:"sequential",cannedResponses:["Welcome! I'm your virtual assistant.","I can help you with product information, orders, and support.","What would you like to know?"]},seedMessages:[{from:"agent",content:"Welcome! I'm your virtual assistant."}]},slowNetwork:{autoRegisterUser:{identity:"sb_user",name:"User"},autoCreateRoom:{language:"en",timezone:"UTC"},autoStartAgent:{responseStrategy:"echo",responseDelayMs:2e3},latencyMs:500,scenario:"slow_network"},unreliable:{autoRegisterUser:{identity:"sb_user",name:"User"},autoCreateRoom:{language:"en",timezone:"UTC"},scenario:"unreliable"}};function Me(r){return()=>m(r)}var Nt={async receiveMessage(r,t){m().simulateIncomingMessage(r,t)},simulateJoin(r,t){m().simulateParticipantJoin(r,t)},simulateLeave(r){m().simulateParticipantLeave(r)},async simulateVideoParticipant(r,t,e){let n=m().room;n&&await n.simulateParticipantJoin(r,{name:t||r,kind:"standard",withCamera:e?.withCamera??!0,withMicrophone:e?.withMicrophone??!0})},async simulateVideoAgent(r,t){let i=m().room;i&&await i.simulateAgentJoin(r,t||"AI Agent")},async enableLocalCamera(){let t=m().room;t&&await t.localParticipant.setCameraEnabled(!0)},async disableLocalCamera(){let t=m().room;t&&await t.localParticipant.setCameraEnabled(!1)},async enableLocalMicrophone(){let t=m().room;t&&await t.localParticipant.setMicrophoneEnabled(!0)},async simulateMultipleParticipants(r){let t=["Alice","Bob","Carol","David","Eve","Frank","Grace","Henry","Ivy","Jack"],i=m().room;if(i)for(let n=0;n<Math.min(r,t.length);n++)await i.simulateParticipantJoin(`participant_${n+1}`,{name:t[n],kind:"standard",withCamera:!0,withMicrophone:!0}),await new Promise(s=>setTimeout(s,100))},clearParticipants(){let t=m().room;if(t)for(let e of t.remoteParticipants.keys())t.simulateParticipantLeave(e)},simulateCallRequest(r,t){m().simulateCallRequest({name:r,guestId:t||`guest_${Date.now()}`})},async simulateDisconnect(){await m().simulateDisconnect()},getEventHistory(){return m().getEventHistory()},exportState(){return m().exportState()},getRoom(){return m().room}};typeof window<"u"&&(window.MockServiceActions=Nt);0&&(module.exports={AgentNotFoundError,ConversationServiceFactory,DEFAULT_AGENT_CONFIG,InvalidOperationError,MockAgent,MockAgentPresets,MockByteStreamReader,MockConversationService,MockEventEmitter,MockLiveKitError,MockLocalParticipant,MockParticipant,MockRoom,MockServiceActions,MockState,MockTextStreamReader,MockTextStreamWriter,MockTrack,MockTrackPublication,NetworkError,ParticipantAlreadyJoinedError,ParticipantKindValue,ParticipantNotFoundError,RoomEndedError,RoomNotFoundError,SYNTHETIC_MEDIA_PRESETS,StorybookScenarios,TimeoutError,TrackNotFoundError,UnauthorizedError,createAgentFixture,createAgentWithCannedResponses,createChatScenario,createConversationFixture,createConversationService,createDefaultConfig,createDefaultRoomFixture,createDeterministicConfig,createErrorFromMockError,createLatencyConfig,createMessageFixture,createMockConversationService,createMockServiceFactory,createParticipantBatch,createParticipantFixture,createRoomWithAgent,createRoomWithAgentAndDataTrack,createRoomWithLocalParticipant,createRoomWithMediaTracks,createRoomWithTwoParticipants,createSequentialAgent,createStrictConfig,createSyntheticAudioTrack,createSyntheticMedia,createSyntheticMediaFromPreset,createSyntheticVideoTrack,createTextStream,createVideoCallScenario,decodeMockToken,destroyStorybookMockService,generateMockApiResponseId,generateMockExternalId,generateMockId,generateMockIdBatch,generateMockMessageId,generateMockParticipantIdentity,generateMockRoomName,generateMockToken,generateMockTrackSid,generateMockWsUrl,generateSeededMockId,generateStrategyResponse,getStorybookMockService,isMockConversationService,isMockError,isMockLiveKitError,resetIdCounter,resetStorybookMockService,setIdCounter,withMockConversationService});
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.179 | © 2026 Onlive.ai */
|
|
2
|
+
export { MockAgent, MockAgentPresets } from './actor/agent.cjs';
|
|
3
|
+
export { DEFAULT_AGENT_CONFIG, generateStrategyResponse } from './actor/strategies.cjs';
|
|
4
|
+
export { AgentNotFoundError, InvalidOperationError, MockLiveKitError, NetworkError, ParticipantAlreadyJoinedError, ParticipantNotFoundError, RoomEndedError, RoomNotFoundError, TimeoutError, TrackNotFoundError, UnauthorizedError, createErrorFromMockError, isMockError, isMockLiveKitError } from './errors.cjs';
|
|
5
|
+
export { MockEventEmitter } from './events.cjs';
|
|
6
|
+
export { ConversationServiceFactory, ConversationServiceFactoryOptions, LiveKitMode, createConversationService, createMockConversationService } from './factory.cjs';
|
|
7
|
+
export { createAgentFixture, createAgentWithCannedResponses, createChatScenario, createConversationFixture, createDefaultConfig, createDefaultRoomFixture, createDeterministicConfig, createLatencyConfig, createMessageFixture, createParticipantBatch, createParticipantFixture, createRoomWithAgent, createRoomWithAgentAndDataTrack, createRoomWithLocalParticipant, createRoomWithMediaTracks, createRoomWithTwoParticipants, createSequentialAgent, createStrictConfig, createVideoCallScenario } from './fixtures.cjs';
|
|
8
|
+
export { decodeMockToken, generateMockApiResponseId, generateMockExternalId, generateMockId, generateMockIdBatch, generateMockMessageId, generateMockParticipantIdentity, generateMockRoomName, generateMockToken, generateMockTrackSid, generateMockWsUrl, generateSeededMockId, resetIdCounter, setIdCounter } from './generators.cjs';
|
|
9
|
+
export { MockLocalParticipant } from './livekit/local-participant.cjs';
|
|
10
|
+
export { MockParticipant, ParticipantKindValue } from './livekit/participant.cjs';
|
|
11
|
+
export { MockRoom } from './livekit/room.cjs';
|
|
12
|
+
export { MockByteStreamReader, MockTextStreamReader, MockTextStreamWriter, createTextStream } from './livekit/streams.cjs';
|
|
13
|
+
export { MockTrack, MockTrackPublication } from './livekit/tracks.cjs';
|
|
14
|
+
export { SYNTHETIC_MEDIA_PRESETS, SyntheticAudioConfig, SyntheticVideoConfig, createSyntheticAudioTrack, createSyntheticMedia, createSyntheticMediaFromPreset, createSyntheticVideoTrack } from './media.cjs';
|
|
15
|
+
export { MockConversationService } from './service.cjs';
|
|
16
|
+
export { MockState } from './state.cjs';
|
|
17
|
+
export { MockServiceActions, MockServiceDecoratorConfig, StorybookScenarios, createMockServiceFactory, destroyStorybookMockService, getStorybookMockService, isMockConversationService, resetStorybookMockService, withMockConversationService } from './storybook.cjs';
|
|
18
|
+
export { MockAgentConfig, MockAgentMessage, MockAgentMessageEvent, MockAgentResponseStrategy, MockAgentStartedEvent, MockAgentState, MockAgentStatus, MockAgentStoppedEvent, MockConnectionState, MockDataReceivedEvent, MockError, MockErrorCode, MockErrorConfig, MockErrorEvent, MockEvent, MockEventBase, MockEventListener, MockEventListenerMap, MockEventType, MockMessageReceivedEvent, MockMessageSentEvent, MockMessageState, MockParticipantAttributesChangedEvent, MockParticipantJoinedEvent, MockParticipantKind, MockParticipantLeftEvent, MockParticipantRole, MockParticipantState, MockRoomConnectionStateChangedEvent, MockRoomCreatedEvent, MockRoomEndedEvent, MockRoomState, MockScenario, MockServiceConfig, MockStateSnapshot, MockStateSnapshotJSON, MockTrackKind, MockTrackMutedEvent, MockTrackPublishedEvent, MockTrackSource, MockTrackState, MockTrackUnmutedEvent, MockTrackUnpublishedEvent, MockTypingIndicatorEvent } from './types.cjs';
|
|
19
|
+
import '../conversation.service.cjs';
|
|
20
|
+
import '../conversation.types.cjs';
|
|
21
|
+
import 'livekit-client';
|
|
22
|
+
import '@livekit/components-core';
|
|
23
|
+
import '../../firebase/firebase-api.cjs';
|
|
24
|
+
import 'firebase/database';
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.179 | © 2026 Onlive.ai */
|
|
2
|
+
export { MockAgent, MockAgentPresets } from './actor/agent.js';
|
|
3
|
+
export { DEFAULT_AGENT_CONFIG, generateStrategyResponse } from './actor/strategies.js';
|
|
4
|
+
export { AgentNotFoundError, InvalidOperationError, MockLiveKitError, NetworkError, ParticipantAlreadyJoinedError, ParticipantNotFoundError, RoomEndedError, RoomNotFoundError, TimeoutError, TrackNotFoundError, UnauthorizedError, createErrorFromMockError, isMockError, isMockLiveKitError } from './errors.js';
|
|
5
|
+
export { MockEventEmitter } from './events.js';
|
|
6
|
+
export { ConversationServiceFactory, ConversationServiceFactoryOptions, LiveKitMode, createConversationService, createMockConversationService } from './factory.js';
|
|
7
|
+
export { createAgentFixture, createAgentWithCannedResponses, createChatScenario, createConversationFixture, createDefaultConfig, createDefaultRoomFixture, createDeterministicConfig, createLatencyConfig, createMessageFixture, createParticipantBatch, createParticipantFixture, createRoomWithAgent, createRoomWithAgentAndDataTrack, createRoomWithLocalParticipant, createRoomWithMediaTracks, createRoomWithTwoParticipants, createSequentialAgent, createStrictConfig, createVideoCallScenario } from './fixtures.js';
|
|
8
|
+
export { decodeMockToken, generateMockApiResponseId, generateMockExternalId, generateMockId, generateMockIdBatch, generateMockMessageId, generateMockParticipantIdentity, generateMockRoomName, generateMockToken, generateMockTrackSid, generateMockWsUrl, generateSeededMockId, resetIdCounter, setIdCounter } from './generators.js';
|
|
9
|
+
export { MockLocalParticipant } from './livekit/local-participant.js';
|
|
10
|
+
export { MockParticipant, ParticipantKindValue } from './livekit/participant.js';
|
|
11
|
+
export { MockRoom } from './livekit/room.js';
|
|
12
|
+
export { MockByteStreamReader, MockTextStreamReader, MockTextStreamWriter, createTextStream } from './livekit/streams.js';
|
|
13
|
+
export { MockTrack, MockTrackPublication } from './livekit/tracks.js';
|
|
14
|
+
export { SYNTHETIC_MEDIA_PRESETS, SyntheticAudioConfig, SyntheticVideoConfig, createSyntheticAudioTrack, createSyntheticMedia, createSyntheticMediaFromPreset, createSyntheticVideoTrack } from './media.js';
|
|
15
|
+
export { MockConversationService } from './service.js';
|
|
16
|
+
export { MockState } from './state.js';
|
|
17
|
+
export { MockServiceActions, MockServiceDecoratorConfig, StorybookScenarios, createMockServiceFactory, destroyStorybookMockService, getStorybookMockService, isMockConversationService, resetStorybookMockService, withMockConversationService } from './storybook.js';
|
|
18
|
+
export { MockAgentConfig, MockAgentMessage, MockAgentMessageEvent, MockAgentResponseStrategy, MockAgentStartedEvent, MockAgentState, MockAgentStatus, MockAgentStoppedEvent, MockConnectionState, MockDataReceivedEvent, MockError, MockErrorCode, MockErrorConfig, MockErrorEvent, MockEvent, MockEventBase, MockEventListener, MockEventListenerMap, MockEventType, MockMessageReceivedEvent, MockMessageSentEvent, MockMessageState, MockParticipantAttributesChangedEvent, MockParticipantJoinedEvent, MockParticipantKind, MockParticipantLeftEvent, MockParticipantRole, MockParticipantState, MockRoomConnectionStateChangedEvent, MockRoomCreatedEvent, MockRoomEndedEvent, MockRoomState, MockScenario, MockServiceConfig, MockStateSnapshot, MockStateSnapshotJSON, MockTrackKind, MockTrackMutedEvent, MockTrackPublishedEvent, MockTrackSource, MockTrackState, MockTrackUnmutedEvent, MockTrackUnpublishedEvent, MockTypingIndicatorEvent } from './types.js';
|
|
19
|
+
import '../conversation.service.js';
|
|
20
|
+
import '../conversation.types.js';
|
|
21
|
+
import 'livekit-client';
|
|
22
|
+
import '@livekit/components-core';
|
|
23
|
+
import '../../firebase/firebase-api.js';
|
|
24
|
+
import 'firebase/database';
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.179 | © 2026 Onlive.ai */
|
|
2
|
+
var Yt=Object.defineProperty;var Zt=(r,t)=>()=>(r&&(t=r(r=0)),t);var te=(r,t)=>{for(var e in t)Yt(r,e,{get:t[e],enumerable:!0})};var H={};te(H,{SYNTHETIC_MEDIA_PRESETS:()=>St,createSyntheticAudioTrack:()=>yt,createSyntheticMedia:()=>Mt,createSyntheticMediaFromPreset:()=>Ft,createSyntheticVideoTrack:()=>vt});function vt(r={}){let{width:t=640,height:e=480,fps:i=30,backgroundColor:n="#1a1a2e",foregroundColor:s="#4361ee",label:o="Mock Video",animation:a="wave"}=r,d=document.createElement("canvas");d.width=t,d.height=e;let c=d.getContext("2d"),p,N=Date.now(),B={wave:S=>{c.fillStyle=n,c.fillRect(0,0,t,e),c.strokeStyle=s,c.lineWidth=3,c.beginPath();for(let h=0;h<t;h++){let v=e/2+Math.sin(h/t*4*Math.PI+S*.002)*(e/4);h===0?c.moveTo(h,v):c.lineTo(h,v)}c.stroke()},pulse:S=>{c.fillStyle=n,c.fillRect(0,0,t,e);let h=Math.sin(S*.003)*.3+.7,v=Math.min(t,e)*.3*h;c.beginPath(),c.arc(t/2,e/2,v,0,Math.PI*2),c.fillStyle=s,c.fill()},bars:S=>{c.fillStyle=n,c.fillRect(0,0,t,e);let h=20,v=t/h,L=e*.7;c.fillStyle=s;for(let z=0;z<h;z++){let Et=Math.abs(Math.sin(z/h*Math.PI*2+S*.004))*L,Qt=z*v,Xt=e-Et;c.fillRect(Qt+2,Xt,v-4,Et)}},avatar:S=>{c.fillStyle=n,c.fillRect(0,0,t,e);let h=t/2,v=e/2-20,L=Math.min(t,e)*.15;c.beginPath(),c.arc(h,v,L,0,Math.PI*2),c.fillStyle=s,c.fill(),c.beginPath(),c.ellipse(h,v+L*2.2,L*1.5,L,0,Math.PI,0),c.fill(),Math.sin(S*.01)>0&&(c.beginPath(),c.arc(h,v+L*3,5+Math.sin(S*.02)*3,0,Math.PI*2),c.fillStyle="#22c55e",c.fill())},none:()=>{c.fillStyle=n,c.fillRect(0,0,t,e)}},G=()=>{c.fillStyle="rgba(255, 255, 255, 0.8)",c.font=`${Math.floor(e*.04)}px system-ui, sans-serif`,c.textAlign="center",c.fillText(o,t/2,e-20)},q=()=>{let S=Date.now()-N;B[a](S),G(),p=requestAnimationFrame(q)};q();let It=d.captureStream(i),wt=It.getVideoTracks()[0];return{track:wt,stream:It,cleanup:()=>{cancelAnimationFrame(p),wt.stop()}}}function yt(r={}){let{frequency:t=440,volume:e=.1,waveType:i="sine",addVariation:n=!0,enabled:s=!1}=r,o=new AudioContext,a=o.createMediaStreamDestination(),d=o.createOscillator();d.type=i,d.frequency.value=t;let c=o.createGain();c.gain.value=s?e:0;let p=null,N=null;n&&(p=o.createOscillator(),p.frequency.value=.5,N=o.createGain(),N.gain.value=10,p.connect(N),N.connect(d.frequency),p.start()),d.connect(c),c.connect(a),d.start();let B=a.stream,G=B.getAudioTracks()[0];return{track:G,stream:B,setVolume:q=>{c.gain.value=Math.max(0,Math.min(1,q))},setEnabled:q=>{c.gain.value=q?e:0},cleanup:()=>{d.stop(),p?.stop(),o.close(),G.stop()}}}function Mt(r,t){let e=vt(r),i=yt(t),n=new MediaStream([e.track,i.track]);return{videoTrack:e.track,audioTrack:i.track,combinedStream:n,setAudioVolume:i.setVolume,setAudioEnabled:i.setEnabled,cleanup:()=>{e.cleanup(),i.cleanup()}}}function Ft(r){let t=St[r];return Mt(t.video,t.audio)}var St,D=Zt(()=>{"use strict";St={localCamera:{video:{width:640,height:480,animation:"avatar",label:"You",foregroundColor:"#4361ee"},audio:{enabled:!1}},agentCamera:{video:{width:640,height:480,animation:"avatar",label:"AI Agent",foregroundColor:"#22c55e",backgroundColor:"#0f172a"},audio:{enabled:!1,frequency:300}},screenShare:{video:{width:1920,height:1080,animation:"bars",label:"Screen Share",backgroundColor:"#0a0a0a",foregroundColor:"#f59e0b"},audio:{enabled:!1}},voiceOnly:{video:{width:320,height:240,animation:"wave",label:"Voice Call"},audio:{enabled:!1,volume:.05}}}});var k=0;function pt(){k=0}function ee(r){k=r}function g(r){return k++,`mock_${r}_${k}_${Date.now().toString(36)}`}function ie(r,t){return`mock_${r}_${t.toString(36)}`}function T(r,t,e){let i=e||new Date().toISOString(),n=typeof btoa=="function"?btoa(i).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,""):i.replace(/[^a-zA-Z0-9]/g,"");return`mock_token_${r}_${t}_${n}`}function ne(r){if(!r.startsWith("mock_token_"))return null;let t=r.replace("mock_token_","").split("_");if(t.length<3)return null;let e=t[t.length-1],i=t[t.length-2],n=t.slice(0,-2).join("_");try{let s=e.replace(/-/g,"+").replace(/_/g,"/"),o=typeof atob=="function"?atob(s):e;return{roomId:n,identity:i,timestamp:o}}catch{return null}}function j(r){return`wss://mock-livekit.local/room/${r}`}function re(r="participant",t){let e=t??k++;return`${r}_${e}_${Date.now().toString(36)}`}function se(r="room"){return k++,`${r}_${k}_${Date.now().toString(36)}`}function oe(r,t){return k++,`TR_${r.toUpperCase()}_${t}_${k}`}function ae(){return k++,`msg_${k}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2,8)}`}function ce(r){return k++,`api_${r}_${k}_${Date.now().toString(36)}`}function de(){return[Math.random().toString(16).slice(2,10),Math.random().toString(16).slice(2,6),Math.random().toString(16).slice(2,6),Math.random().toString(16).slice(2,6),Math.random().toString(16).slice(2,14)].join("-")}function ge(r,t){let e=[];for(let i=0;i<t;i++)e.push(g(r));return e}var W={responseStrategy:"echo",responseDelayMs:100,cannedResponses:[],type:"text",nature:"ai",simulateTyping:!1,typingDelayPerChar:20};function Q(r,t,e=[],i=0,n=Math.random){switch(r){case"echo":return{response:`Echo: ${t}`,nextIndex:i};case"canned":return{response:e[0]||"Default response",nextIndex:i};case"sequential":return{response:e[i]||"No more responses",nextIndex:(i+1)%Math.max(1,e.length)};case"random":{if(e.length===0)return{response:"Random response",nextIndex:i};let s=Math.floor(n()*e.length);return{response:e[s],nextIndex:i}}case"silent":return{response:"",nextIndex:i};case"error":throw new Error("Agent error");case"custom":return{response:"",nextIndex:i};default:return{response:"Default agent response",nextIndex:i}}}var y=class{constructor(t,e,i={}){this._state="idle";this.conversationHistory=[];this.responseIndex=0;this.eventListeners=new Set;this.randomFn=Math.random;this.messageCount=0;this.id=t,this.name=e,this.config={...W,...i}}get state(){return this._state}get isRunning(){return this._state==="running"}get history(){return[...this.conversationHistory]}getConfig(){return{...this.config}}updateConfig(t){this.config={...this.config,...t}}setStrategy(t){this.config.responseStrategy=t}setCannedResponses(t){this.config.cannedResponses=t,this.responseIndex=0}setCustomHandler(t){this.customHandler=t,this.config.responseStrategy="custom"}setRandomFunction(t){this.randomFn=t}async start(t){this._state!=="running"&&(this._state="starting",this.roomId=t,this.conversationHistory=[],this.responseIndex=0,this.messageCount=0,await this.delay(50),this._state="running",this.emitEvent({type:"started",agentId:this.id}))}async stop(){this._state==="running"&&(this._state="stopping",await this.delay(50),this._state="stopped",this.roomId=void 0,this.emitEvent({type:"stopped",agentId:this.id}))}async processMessage(t){if(this._state!=="running")throw new Error("Agent is not running");if(this.config.maxMessages&&this.messageCount>=this.config.maxMessages)return await this.stop(),"";this.addMessage(t,"user"),this.emitEvent({type:"message_received",agentId:this.id,message:t});let e;try{if(this.config.responseStrategy==="custom"&&this.customHandler)e=await this.customHandler(this.id,t,this.conversationHistory);else{if(this.config.responseStrategy==="silent")return"";if(this.config.responseStrategy==="error"){let i=new Error("Agent error");throw this.emitEvent({type:"error",agentId:this.id,error:i}),i}else{let i=Q(this.config.responseStrategy,t,this.config.cannedResponses,this.responseIndex,this.randomFn);e=i.response,this.responseIndex=i.nextIndex}}}catch(i){throw this._state="error",i}return this.config.simulateTyping&&this.config.typingDelayPerChar&&await this.delay(e.length*this.config.typingDelayPerChar),this.config.responseDelayMs&&await this.delay(this.config.responseDelayMs),this.addMessage(e,"agent"),this.messageCount++,this.emitEvent({type:"response_sent",agentId:this.id,response:e}),e}addEventListener(t){return this.eventListeners.add(t),()=>this.eventListeners.delete(t)}clearHistory(){this.conversationHistory=[],this.responseIndex=0}reset(){this._state="idle",this.roomId=void 0,this.conversationHistory=[],this.responseIndex=0,this.messageCount=0}toJSON(){return{id:this.id,name:this.name,state:this._state,roomId:this.roomId,config:this.config,historyLength:this.conversationHistory.length,messageCount:this.messageCount}}addMessage(t,e){let i={id:g("msg"),content:t,role:e,timestamp:Date.now()};return this.conversationHistory.push(i),i}emitEvent(t){for(let e of this.eventListeners)try{e(t)}catch(i){console.error("Error in agent event listener:",i)}}delay(t){return new Promise(e=>setTimeout(e,t))}},Ot={echo(r="Echo Agent"){return new y(g("agent"),r,{responseStrategy:"echo"})},silent(r="Silent Agent"){return new y(g("agent"),r,{responseStrategy:"silent"})},sequential(r,t){return new y(g("agent"),r,{responseStrategy:"sequential",cannedResponses:t})},aiAssistant(r="AI Assistant"){return new y(g("agent"),r,{responseStrategy:"sequential",responseDelayMs:150,simulateTyping:!0,typingDelayPerChar:10,cannedResponses:["Hello! How can I help you today?","I understand. Let me help you with that.","Is there anything else I can assist you with?","Thank you for your question. Here's what I found...","I'm happy to help! What would you like to know?"]})},customerSupport(r="Support Agent"){return new y(g("agent"),r,{responseStrategy:"sequential",responseDelayMs:200,cannedResponses:["Thank you for contacting support. How may I assist you?","I apologize for any inconvenience. Let me look into that for you.","I've found a solution. Here's what you need to do...","Is there anything else I can help you with today?","Thank you for contacting us. Have a great day!"]})}};var l=class r extends Error{constructor(t,e,i){super(e),this.name="MockLiveKitError",this.code=t,this.details=i,typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,r)}toMockError(){return{code:this.code,message:this.message,details:this.details}}static fromMockError(t){return new r(t.code,t.message,t.details)}},A=class extends l{constructor(t){super("ROOM_NOT_FOUND",`Room not found: ${t}`,{roomId:t}),this.name="RoomNotFoundError"}},X=class extends l{constructor(t){super("ROOM_ENDED",`Room has ended: ${t}`,{roomId:t}),this.name="RoomEndedError"}},Y=class extends l{constructor(t,e){super("PARTICIPANT_ALREADY_JOINED",`Participant ${t} is already in room ${e}`,{identity:t,roomId:e}),this.name="ParticipantAlreadyJoinedError"}},Z=class extends l{constructor(t){super("PARTICIPANT_NOT_FOUND",`Participant not found: ${t}`,{identity:t}),this.name="ParticipantNotFoundError"}},tt=class extends l{constructor(t){super("TRACK_NOT_FOUND",`Track not found: ${t}`,{trackId:t}),this.name="TrackNotFoundError"}},et=class extends l{constructor(t){super("AGENT_NOT_FOUND",`Agent not found: ${t}`,{agentId:t}),this.name="AgentNotFoundError"}},it=class extends l{constructor(t="Unauthorized"){super("UNAUTHORIZED",t),this.name="UnauthorizedError"}},nt=class extends l{constructor(t="Network error occurred"){super("NETWORK_ERROR",t),this.name="NetworkError"}},rt=class extends l{constructor(t,e){super("INVALID_OPERATION",t,e),this.name="InvalidOperationError"}},st=class extends l{constructor(t,e){super("TIMEOUT",`Operation timed out: ${t}`,{operation:t,timeoutMs:e}),this.name="TimeoutError"}};function F(r){switch(r.code){case"ROOM_NOT_FOUND":return new A(r.details?.roomId??"unknown");case"ROOM_ENDED":return new X(r.details?.roomId??"unknown");case"PARTICIPANT_ALREADY_JOINED":return new Y(r.details?.identity??"unknown",r.details?.roomId??"unknown");case"PARTICIPANT_NOT_FOUND":return new Z(r.details?.identity??"unknown");case"TRACK_NOT_FOUND":return new tt(r.details?.trackId??"unknown");case"AGENT_NOT_FOUND":return new et(r.details?.agentId??"unknown");case"UNAUTHORIZED":return new it(r.message);case"NETWORK_ERROR":return new nt(r.message);case"INVALID_OPERATION":return new rt(r.message,r.details);case"TIMEOUT":return new st(r.details?.operation??"unknown",r.details?.timeoutMs??0);default:return l.fromMockError(r)}}function C(r){return typeof r=="object"&&r!==null&&"code"in r&&"message"in r&&typeof r.code=="string"&&typeof r.message=="string"}function le(r){return r instanceof l}var K=class{constructor(){this.listeners={};this.wildcardListeners=new Set;this.eventHistory=[];this.maxHistorySize=1e3;this.recordHistory=!0}setMaxHistorySize(t){this.maxHistorySize=t,this.trimHistory()}setRecordHistory(t){this.recordHistory=t}on(t,e){return this.listeners[t]||(this.listeners[t]=new Set),this.listeners[t].add(e),()=>{this.off(t,e)}}once(t,e){let i=n=>{this.off(t,i),e(n)};return this.on(t,i)}off(t,e){this.listeners[t]?.delete(e)}onAny(t){return this.wildcardListeners.add(t),()=>{this.wildcardListeners.delete(t)}}offAny(t){this.wildcardListeners.delete(t)}removeAllListeners(t){t?delete this.listeners[t]:(this.listeners={},this.wildcardListeners.clear())}emit(t){this.recordHistory&&(this.eventHistory.push(t),this.trimHistory());let e=this.listeners[t.type];if(e)for(let i of e)try{i(t)}catch(n){console.error(`Error in mock event listener for ${t.type}:`,n)}for(let i of this.wildcardListeners)try{i(t)}catch(n){console.error("Error in mock wildcard event listener:",n)}}trimHistory(){this.eventHistory.length>this.maxHistorySize&&(this.eventHistory=this.eventHistory.slice(-this.maxHistorySize))}emitRoomCreated(t){let e={type:"roomCreated",timestamp:new Date().toISOString(),roomId:t.id,room:t};this.emit(e)}emitRoomEnded(t){let e={type:"roomEnded",timestamp:new Date().toISOString(),roomId:t};this.emit(e)}emitRoomConnectionStateChanged(t,e,i){let n={type:"roomConnectionStateChanged",timestamp:new Date().toISOString(),roomId:t,state:e,previousState:i};this.emit(n)}emitParticipantJoined(t,e){let i={type:"participantJoined",timestamp:new Date().toISOString(),roomId:t,participant:e};this.emit(i)}emitParticipantLeft(t,e){let i={type:"participantLeft",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e};this.emit(i)}emitParticipantAttributesChanged(t,e,i,n){let s={type:"participantAttributesChanged",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,attributes:i,previousAttributes:n};this.emit(s)}emitTrackPublished(t,e,i){let n={type:"trackPublished",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,track:i};this.emit(n)}emitTrackUnpublished(t,e,i){let n={type:"trackUnpublished",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,trackId:i};this.emit(n)}emitTrackMuted(t,e){let i={type:"trackMuted",timestamp:new Date().toISOString(),roomId:t,trackId:e};this.emit(i)}emitTrackUnmuted(t,e){let i={type:"trackUnmuted",timestamp:new Date().toISOString(),roomId:t,trackId:e};this.emit(i)}emitMessageReceived(t,e){let i={type:"messageReceived",timestamp:new Date().toISOString(),roomId:t,message:e};this.emit(i)}emitMessageSent(t,e){let i={type:"messageSent",timestamp:new Date().toISOString(),roomId:t,message:e};this.emit(i)}emitTypingIndicator(t,e,i){let n={type:"typingIndicator",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,isTyping:i};this.emit(n)}emitAgentStarted(t,e){let i={type:"agentStarted",timestamp:new Date().toISOString(),roomId:t,agent:e};this.emit(i)}emitAgentStopped(t,e){let i={type:"agentStopped",timestamp:new Date().toISOString(),roomId:t,agentId:e};this.emit(i)}emitAgentMessage(t,e,i){let n={type:"agentMessage",timestamp:new Date().toISOString(),roomId:t,agentId:e,message:i};this.emit(n)}emitDataReceived(t,e,i,n){let s={type:"dataReceived",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,data:i,topic:n};this.emit(s)}emitError(t,e){let i={type:"error",timestamp:new Date().toISOString(),roomId:e,error:t};this.emit(i)}getHistory(t){return t?this.eventHistory.filter(e=>e.type===t):[...this.eventHistory]}getLastEvents(t,e){return(e?this.eventHistory.filter(n=>n.type===e):this.eventHistory).slice(-t)}clearHistory(){this.eventHistory=[]}listenerCount(t){return(this.listeners[t]?.size??0)+this.wildcardListeners.size}};import{Session as ht}from"@onlive.ai/tracker";import{Room as Ie,RoomEvent as kt}from"livekit-client";import{initializeApp as ue}from"firebase/app";import{query as I,endAt as pe,equalTo as me,get as xt,getDatabase as he,limitToFirst as ke,limitToLast as fe,onChildAdded as _t,onChildChanged as Lt,onChildRemoved as Dt,onDisconnect as Ut,onValue as Nt,orderByChild as ve,orderByKey as ye,orderByValue as Me,push as Se,ref as be,remove as Re,runTransaction as Pe,set as qt,startAt as Te,update as Ae}from"firebase/database";var ot=class{constructor(t){this.onChildChanged=(t,e)=>Lt(this.ref(t),i=>e(i.key||"",i.val(),i));this.onChildRemoved=(t,e)=>Dt(this.ref(t),i=>e(i.key||"",i.val(),i));this.onChildChangedQuery=(t,e)=>Lt(t,i=>e(i.key||"",i.val(),i));this.onChildRemovedQuery=(t,e)=>Dt(t,i=>e(i.key||"",i.val(),i));let e=ue(t.config);this.db=he(e)}ref(t){return be(this.db,t)}async getOnce(t){let e=await xt(this.ref(t));return e.exists()?e.val():null}async getOnceQuery(t){let e=await xt(t),i=[];return e.exists()&&e.forEach(n=>{i.push({key:n.key||"",value:n.val()})}),i}onValue(t,e){return Nt(this.ref(t),i=>e(i.key??"",i.val(),i),i=>console.error("onValue error",i))}onValueQuery(t,e){return Nt(t,i=>e(i.key??"",i.val(),i),i=>console.error("onValueQuery error",i))}onChildAdded(t,e){return _t(this.ref(t),i=>e(i.key||"",i.val(),i),i=>console.error("onChildAdded error",i))}onChildAddedQuery(t,e){return _t(t,i=>e(i.key||"",i.val(),i),i=>console.error("onChildAddedQuery error",i))}write(t,e){return qt(this.ref(t),e)}update(t,e){return Ae(this.ref(t),e)}remove(t){return Re(this.ref(t))}async push(t,e){let i=Se(this.ref(t));return await qt(i,e),i.key}onDisconnectUpdate(t,e){return Ut(this.ref(t)).update(e)}cancelOnDisconnect(t){return Ut(this.ref(t)).cancel()}transaction(t,e){return Pe(this.ref(t),i=>e(i))}query(t,e={}){let i=this.ref(t);return e.orderBy==="child"&&e.childKey&&(i=I(i,ve(e.childKey))),e.orderBy==="key"&&(i=I(i,ye())),e.orderBy==="value"&&(i=I(i,Me())),e.startAt!=null&&(i=I(i,Te(e.startAt))),e.endAt!=null&&(i=I(i,pe(e.endAt))),e.equalTo!=null&&(i=I(i,me(e.equalTo))),e.limitFirst!=null&&(i=I(i,ke(e.limitFirst))),e.limitLast!=null&&(i=I(i,fe(e.limitLast))),i}};var u=async(r,t)=>{let e=await fetch(r,t);if(!e.ok){let i=await e.json().catch(()=>({}));throw new Error(JSON.stringify({status:e.status,statusText:e.statusText,...i}))}return e&&e.json()};var Ht=r=>{let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",e="";for(let i=0;i<r;i++)e+=t.charAt(Math.floor(Math.random()*t.length));return e};import{Generator as Ce,Session as f}from"@onlive.ai/tracker";var w="chatbot",at=class r{static hasSession(){return!!f.getCookie(w)}static getSession(t={role:"guest",regenerate:!1}){t.regenerate&&(f.id=Ce.uuid(),f.deleteCookie(w));let e=f.getCookie(w);return e&&r.isValidSession(e,t.role)?e:r.createSession(t.role)}static createSession(t){let e={externalId:t==="agent"?String(r.getUserId()||f.id):f.id,secret:Ht(16),createdAt:new Date().toISOString()};return f.setCookie(w,e,3600*24*365),e}static isValidSession(t,e){if(e==="guest")return!0;let i=r.getUserId();return!!(i&&String(i)===t.externalId)}static getUserId(){return f.getCookie("user-id",{objectKey:"userId",storageKey:"user",storageType:"localStorage",ttl:3600*24*365,preserveData:!0})}static updateSessionWithRegistrationData(t){let e=f.getCookie(w);if(e||(e=r.createSession("guest")),e){let i={...e,registrationData:t};f.setCookie(w,i,3600*24*365)}}static hasRegistrationData(){return!!f.getCookie(w)?.registrationData}static async getAgentInfo(t){return fetch(`${t}/api/v1/auth/user-info`,{credentials:"include"}).then(e=>e.json())}static getRegistrationData(){return f.getCookie(w)?.registrationData}};var $t="lk.chat",zt="lk.transcription",jt="lk.events",mt="typing-indicator";var ft=class extends Ie{},ct=class{constructor(t){this.listeners=new Set;this.typingListeners=new Set;this.transcriptionMap=new Map;this.abortControllers={register:new AbortController,createRoom:new AbortController,closeRoom:new AbortController,evaluateRoom:new AbortController,persistMessage:new AbortController,sendMessageReport:new AbortController,deleteMessageReport:new AbortController,updateMessageReactions:new AbortController,getRooms:new AbortController};this.authToken=null;this.firebaseUnsubscribers={};this.seenRequestIds=new Set;this.lastSnapshotById=new Map;this.handleIncomingMessage=async(t,e)=>{let i=t?.info?.id,n=t.info?.attributes?.["lk.segment_id"];n&&(this.transcriptionMap.has(n)?i=this.transcriptionMap.get(n)||"":this.transcriptionMap.set(n,i));let s=e?.identity?this.room.getParticipantByIdentity(e.identity):void 0,o="";for await(let a of t)o+=a,this.emitMessage({id:i,timestamp:Date.now(),message:o,assets:JSON.parse(t.info?.attributes?.assets||"[]"),from:s});this.messagePersistence==="client"&&this.persistMessage({roomId:this.room.id,content:o,externalId:i,identity:s?.identity,kind:s?.kind})};this.emitMessage=t=>{for(let e of this.listeners)e([t])};this.handleDataReceived=(t,e,i,n)=>{if(n===mt)try{let s=JSON.parse(new TextDecoder().decode(t));if(s.type==="typing"&&s.participantId!==this.room.localParticipant.identity){let o={type:"typing",isTyping:s.isTyping,timestamp:s.timestamp,participantId:s.participantId};this.emitTypingIndicator(o)}}catch(s){console.warn("Failed to parse typing indicator:",s)}};this.emitTypingIndicator=t=>{for(let e of this.typingListeners)e(t)};this.apiUrl=t.apiUrl,this.authUrl=t.authUrl,this.organizationId=t.organizationId,this.channelTopic=t.channelTopic||$t,this.transcriptionTopic=t.transcriptionTopic||zt,this.eventsTopic=t.eventsTopic||jt,this.messagePersistence=t.messagePersistence||"disabled",this.room=this.createRoomInstance(),t.firebaseConfig&&this.initializeFirebase(t.firebaseConfig)}createRoomInstance(){return new ft({adaptiveStream:!0,dynacast:!0})}ensureRoom(){return this.room||(this.room=this.createRoomInstance()),this.room}initializeFirebase(t){this.firebaseApi=new ot({config:t}),this.presencePath=`orgs/${this.organizationId}/presence`,this.callsPath=`orgs/${this.organizationId}/calls`}initializeRoomHandlers(){try{this.room.unregisterTextStreamHandler(this.channelTopic),this.room.unregisterTextStreamHandler(this.transcriptionTopic)}catch{}this.room.off(kt.DataReceived,this.handleDataReceived),this.room.registerTextStreamHandler(this.channelTopic,this.handleIncomingMessage),this.room.registerTextStreamHandler(this.transcriptionTopic,this.handleIncomingMessage),this.room.on(kt.DataReceived,this.handleDataReceived)}async registerUser(t,e,i,n){let s=await u(`${this.apiUrl}/users/register`,{method:"POST",body:JSON.stringify({externalId:t,secret:e,...i,metadata:n}),headers:{"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.register.signal});if(!s.token)throw new Error("Registration failed: No token received from server");return this.authToken=s.token,s}async registerAgent(t,e){let i=ht.getCookie("livekit-agent-token");if(i){if(this.decodeJwtPayload(i)?.username===e.name)return this.authToken=i,i;ht.deleteCookie("livekit-agent-token")}let n=await u(`${this.authUrl}/admins/register`,{method:"POST",body:JSON.stringify({externalId:t,name:e.name,email:e.email,avatar:e.avatar}),headers:{"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},credentials:"include",signal:this.abortControllers.register.signal});return ht.setCookie("livekit-agent-token",n.token,1440*60),this.authToken=n.token,n.token}decodeJwtPayload(t){try{let e=t.split(".");if(e.length!==3)return null;let i=e[1],n=atob(i.replace(/-/g,"+").replace(/_/g,"/"));return JSON.parse(n)}catch{return null}}async createRoom(t){if(!this.authToken)throw new Error("Cannot create room: No authentication token. Call registerUser() first.");this.room=this.ensureRoom();let{initialMessage:e,...i}=t,n=await u(`${this.apiUrl}/rooms`,{method:"POST",body:JSON.stringify(i),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.createRoom.signal});return this.setRoomMetadata(n),this.setupParticipantAttributesHandler(),this.room.connect(n.wsURL,n.token).then(async()=>{if(e)try{await this.sendMessage(e)}catch(s){console.error("[ConversationService] Failed to send initial message:",s)}}),this.initializeRoomHandlers(),this.room}async joinRoom(t,e,i,n){let s=await u(`${this.apiUrl}/rooms/${t}/join`,{method:"POST",body:JSON.stringify({timezone:e,language:i,...n??{}}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.createRoom.signal});return this.setRoomMetadata(s),this.setupParticipantAttributesHandler(),await this.room.connect(s.wsURL,s.token),this.initializeRoomHandlers(),this.room}setRoomMetadata(t){this.room.id=t.id,this.room.groupId=t.groupId,this.room.createdAt=t.createdAt,this.room.connectedAt=new Date().toISOString(),this.room.affinity=t.affinity}setupParticipantAttributesHandler(){this.room.on(kt.ParticipantAttributesChanged,t=>{t.identity===this.room.localParticipant.identity&&at.updateSessionWithRegistrationData(t.attributes)})}async evaluateRoom(t){let e=t.roomId||this.room?.id;if(!e)throw new Error("Room ID is required for evaluation");return u(`${this.apiUrl}/rooms/${e}/evaluate`,{method:"POST",body:JSON.stringify({rating:t.rating,comment:t.comment}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.evaluateRoom.signal})}async closeRoom(){this.room&&(await u(`${this.apiUrl}/rooms/${this.room.id}/close`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.closeRoom.signal}),await this.stopAndUnpublishLocalTracks())}async disconnect(){this.room&&(await this.stopAndUnpublishLocalTracks(),this.room.removeAllListeners(),await this.room.disconnect(),this.room=null)}async stopAndUnpublishLocalTracks(){let t=this.room?.localParticipant;if(!t)return;await Promise.allSettled([t.setMicrophoneEnabled(!1),t.setCameraEnabled(!1),t.setScreenShareEnabled(!1)]);let e=Array.from(t.trackPublications.values());await Promise.all(e.map(async i=>{let n=i.track;if(n)try{await t.unpublishTrack(n,!0)}catch{n.stop()}}))}async disconnectAndCloseRoom(){await this.closeRoom(),await this.disconnect()}async readRoom(t){return u(`${this.apiUrl}/rooms/${t}/read`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.persistMessage.signal})}async getRooms(t){let e=new URLSearchParams;return t.page&&e.append("page",t.page.toString()),t.limit&&e.append("limit",t.limit.toString()),t.offset&&e.append("offset",t.offset.toString()),t.orderBy&&e.append("orderBy",t.orderBy),t.orderDir&&e.append("orderDir",t.orderDir),t.ids?.length&&e.append("ids",t.ids.join(",")),t.with?.length&&e.append("with",t.with.join(",")),t.count?.length&&e.append("count",t.count.join(",")),t.latestOnly&&e.append("latestOnly",t.latestOnly.toString()),t.includeUnread&&e.append("includeUnread",t.includeUnread.toString()),t.roomStatus&&e.append("roomStatus",t.roomStatus),t.archived&&e.append("archived",t.archived.toString()),t.participantIds?.length&&e.append("participantIds",t.participantIds.join(",")),t.participantExternalIds?.length&&e.append("participantExternalIds",t.participantExternalIds.join(",")),t.groupId&&e.append("groupId",t.groupId),t.hasMessages!==void 0&&e.append("hasMessages",t.hasMessages.toString()),u(`${this.authUrl}/rooms?${e}`,{method:"GET",headers:{"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},credentials:"include",signal:this.abortControllers.getRooms.signal})}async sendMessage(t,e){let i=await this.room.localParticipant.sendText(t,{topic:this.channelTopic,attributes:e});this.emitMessage({id:i.id,timestamp:Date.now(),message:t,assets:JSON.parse(e?.assets||"[]"),from:this.room.localParticipant}),this.messagePersistence==="client"&&this.persistMessage({roomId:this.room.id,content:t,externalId:i.id,identity:this.room.localParticipant?.identity,kind:this.room.localParticipant?.kind})}async persistMessage(t){return u(`${this.apiUrl}/messages/create`,{method:"POST",body:JSON.stringify(t),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.persistMessage.signal})}async getMessages(t){let e=new URLSearchParams;return t.limit&&e.append("limit",t.limit.toString()),t.with&&e.append("with",t.with.join(",")),(await u(`${this.apiUrl}/messages/search${e.size?`?${e.toString()}`:""}`,{method:"POST",body:JSON.stringify(t),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.createRoom.signal})).items}async sendMessageReport(t){try{return u(`${this.apiUrl}/messages/${t.messageId}/report`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.sendMessageReport.signal})}catch(e){console.error("Error sending message report:",e)}}async deleteMessageReport(t){try{return u(`${this.apiUrl}/messages/${t.messageId}/report`,{method:"DELETE",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.deleteMessageReport.signal})}catch(e){console.error("Error deleting message report:",e)}}async updateMessageReactions(t){try{return u(`${this.apiUrl}/messages/${t.messageId}/reactions`,{method:"PATCH",body:JSON.stringify({add:t.add||[],remove:t.remove||[]}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.updateMessageReactions.signal})}catch(e){console.error("Error updating message reactions:",e)}}subscribeMessages(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}async sendTypingIndicator(t){if(!(!this.room||this.room.state!=="connected"))try{let e=new TextEncoder().encode(JSON.stringify({type:"typing",isTyping:t,timestamp:Date.now(),participantId:this.room.localParticipant.identity}));await this.room.localParticipant.publishData(e,{reliable:!1,topic:mt})}catch(e){console.warn("Failed to send typing indicator:",e)}}subscribeTypingIndicators(t){return this.typingListeners.add(t),()=>{this.typingListeners.delete(t)}}unsubscribeTypingIndicators(t){this.typingListeners.delete(t)}async sendContextualEvent(t){try{let e=JSON.stringify(t);await this.room.localParticipant.sendText(e,{topic:this.eventsTopic})}catch(e){console.warn("Failed to send event:",e)}}async requestNewRoom(t){return u(`${this.apiUrl}/rooms/request-new`,{method:"POST",body:JSON.stringify(t),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}async confirmRoomRequest(t){return u(`${this.apiUrl}/rooms/confirm-call`,{method:"POST",body:JSON.stringify({roomId:t}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}async cancelRoomRequest(t){return u(`${this.apiUrl}/rooms/cancel-call`,{method:"POST",body:JSON.stringify({roomId:t}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}async finishCall(){if(this.room?.id)return u(`${this.apiUrl}/rooms/finish-call`,{method:"POST",body:JSON.stringify({roomId:this.room.id}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}isFirebaseEnabled(){return!!(this.firebaseApi&&this.presencePath&&this.callsPath)}getFirebase(){if(!this.firebaseApi||!this.presencePath||!this.callsPath)throw new Error("Firebase is not initialized. Provide firebaseConfig in constructor.");return{api:this.firebaseApi,presencePath:this.presencePath,callsPath:this.callsPath}}buildAgentPresencePath(t){return`${this.presencePath}/${t}`}onPresenceChange(t){let{api:e,presencePath:i}=this.getFirebase();return e.onChildChanged(i,(n,s)=>t(n,s))}onPresenceAgentChange(t,e){let{api:i}=this.getFirebase();return i.onValue(this.buildAgentPresencePath(t),(n,s)=>e(n,s))}async createCallRequest(t){let{api:e,callsPath:i}=this.getFirebase(),s=(await u(`${this.apiUrl}/rooms/call-request`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},body:JSON.stringify(t)})).id;return e.onDisconnectUpdate(`${i}/${s}`,{status:"disconnected"}),s}onNewCallRequest(t){let{api:e,callsPath:i}=this.getFirebase();return e.onChildAdded(i,(n,s)=>t(n,{...s,id:n}))}onCallRequestChange(t){let{api:e,callsPath:i}=this.getFirebase();return e.onChildChanged(i,(n,s)=>t(n,{...s,id:n}))}onCallRequestRemoved(t){let{api:e,callsPath:i}=this.getFirebase();return e.onChildRemoved(i,n=>t(n))}async acceptCallRequest(t){let{api:e,callsPath:i}=this.getFirebase();return await e.cancelOnDisconnect(`${i}/${t}`),e.update(`${i}/${t}`,{status:"accepted"})}async cancelCallRequest(t){let{api:e,callsPath:i}=this.getFirebase();await e.cancelOnDisconnect(`${i}/${t}`),await u(`${this.apiUrl}/rooms/call-request/cancel`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},body:JSON.stringify({callId:t})})}async cancelOnDisconnect(t){let{api:e,callsPath:i}=this.getFirebase();await e.cancelOnDisconnect(`${i}/${t}`)}subscribePendingRequests(t,e={}){let{api:i,callsPath:n}=this.getFirebase();e.resetSeen&&this.seenRequestIds.clear(),this.firebaseUnsubscribers["pending-requests"]?.();let s=i.query(n,{orderBy:"child",childKey:"status",equalTo:"pending"}),o=i.onChildAddedQuery(s,(a,d)=>{if(!a||this.seenRequestIds.has(a))return;let c={...d,id:a};this.seenRequestIds.add(a),t(a,c)});return this.firebaseUnsubscribers["pending-requests"]=o,()=>{o?.(),delete this.firebaseUnsubscribers["pending-requests"]}}subscribeRequestChanges(t){let{api:e,callsPath:i}=this.getFirebase();this.firebaseUnsubscribers["request-changes"]?.();let n=e.onChildChanged(i,(s,o)=>{if(!s)return;let a=JSON.stringify(o);this.lastSnapshotById.get(s)!==a&&(this.lastSnapshotById.set(s,a),t(s,{...o,id:s}))});return this.firebaseUnsubscribers["request-changes"]=n,()=>{n?.(),delete this.firebaseUnsubscribers["request-changes"]}}async tryAcceptRequest(t){let{api:e,callsPath:i}=this.getFirebase(),n=`${i}/${t}`;return await e.transaction(n,o=>o&&(o.status==="pending"?{...o,status:"accepted"}:o)),(await e.getOnce(n))?.status==="accepted"}onRoomSync(t,e){let{api:i}=this.getFirebase(),n=`orgs/${this.organizationId}/rooms/${t}/sync`;return i.onValue(n,(s,o)=>{e(o)})}async clearRoomSync(t,e){let{api:i}=this.getFirebase(),n=`orgs/${this.organizationId}/rooms/${t}/sync`;await i.write(n,{needsSync:!1,reason:e||null,timestamp:Date.now()})}onNewRoomRequest(t,e){let{api:i}=this.getFirebase(),n=`orgs/${this.organizationId}/rooms/${t}/call`;return i.onValue(n,(s,o)=>{e(o)})}unsubscribeAllFirebase(){Object.values(this.firebaseUnsubscribers).forEach(t=>t?.()),this.firebaseUnsubscribers={}}async destroy(){this.unsubscribeAllFirebase(),this.listeners.clear(),this.typingListeners.clear(),this.transcriptionMap.clear(),this.seenRequestIds.clear(),this.lastSnapshotById.clear(),Object.values(this.abortControllers).forEach(t=>t.abort()),await this.disconnect()}};var b=class{constructor(t,e,i,n){this.muted=!1;this.enabled=!0;this.attachedElements=new Set;this.kind=t,this.source=e,this.sid=g("TR"),this.mediaStreamTrack=i,this.mediaCleanup=n}get mediaTrack(){return this.mediaStreamTrack}attach(t){let e=t||document.createElement(this.kind==="video"?"video":"audio");if(this.mediaStreamTrack){let i=new MediaStream([this.mediaStreamTrack]);e.srcObject=i,e.autoplay=!0,this.kind==="video"&&(e.playsInline=!0,e.muted=!0)}return this.attachedElements.add(e),e}detach(t){if(t)return t.srcObject=null,this.attachedElements.delete(t),[t];let e=Array.from(this.attachedElements);for(let i of e)i.srcObject=null;return this.attachedElements.clear(),e}stop(){this.detach(),this.mediaCleanup&&this.mediaCleanup(),this.mediaStreamTrack&&this.mediaStreamTrack.stop(),this.enabled=!1}setMuted(t){this.muted=t,this.mediaStreamTrack&&(this.mediaStreamTrack.enabled=!t)}setEnabled(t){this.enabled=t,this.mediaStreamTrack&&(this.mediaStreamTrack.enabled=t)}},M=class{constructor(t,e){this.subscribed=!0;this.isEnabled=!0;this.track=t,this.trackSid=t.sid,this.trackName=e||`${t.kind}_${t.source}`,this.source=t.source,this.kind=t.kind}get isMuted(){return this.track?.muted??!1}get isSubscribed(){return this.subscribed&&this.track!==null}setSubscribed(t){this.subscribed=t}setEnabled(t){this.isEnabled=t,this.track&&(this.track.enabled=t)}setMuted(t){this.track&&this.track.setMuted(t)}};var $=class{constructor(t){this.identity="";this.sid="";this.name="";this.attributes={};this.kind="standard";this.trackPublications=new Map;this.audioTrackPublications=new Map;this.videoTrackPublications=new Map;this._cameraEnabled=!1;this._microphoneEnabled=!1;this._screenShareEnabled=!1;this.room=t,this.sid=g("PA"),this.joinedAt=new Date}get isCameraEnabled(){return this._cameraEnabled}get isMicrophoneEnabled(){return this._microphoneEnabled}get isScreenShareEnabled(){return this._screenShareEnabled}getTrackPublications(){return Array.from(this.trackPublications.values())}getTrackPublication(t){let i={camera:"camera",Camera:"camera",microphone:"microphone",Microphone:"microphone",screen_share:"screen_share",ScreenShare:"screen_share",screen_share_audio:"screen_share_audio",ScreenShareAudio:"screen_share_audio"}[t]||t;return this.trackPublications.get(i)}getTrackPublicationBySid(t){for(let e of this.trackPublications.values())if(e.trackSid===t)return e}setAttributes(t){this.attributes={...this.attributes,...t}}async setCameraEnabled(t,e){if(this._cameraEnabled=t,t){let{createSyntheticVideoTrack:n}=await Promise.resolve().then(()=>(D(),H)),{track:s,cleanup:o}=n({animation:"avatar",label:this.name||"Local Camera"}),a=new b("video","camera",s,o),d=new M(a,e?.name);return this.trackPublications.set("camera",d),this.videoTrackPublications.set(a.sid,d),this.room.emit("localTrackPublished",d,this),d}let i=this.trackPublications.get("camera");i&&(i.track?.stop(),this.trackPublications.delete("camera"),this.videoTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async setMicrophoneEnabled(t,e){if(this._microphoneEnabled=t,t){let{createSyntheticAudioTrack:n}=await Promise.resolve().then(()=>(D(),H)),{track:s,cleanup:o}=n({enabled:!1}),a=new b("audio","microphone",s,o),d=new M(a,e?.name);return this.trackPublications.set("microphone",d),this.audioTrackPublications.set(a.sid,d),this.room.emit("localTrackPublished",d,this),d}let i=this.trackPublications.get("microphone");i&&(i.track?.stop(),this.trackPublications.delete("microphone"),this.audioTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async setScreenShareEnabled(t,e){if(this._screenShareEnabled=t,t){let{createSyntheticVideoTrack:n}=await Promise.resolve().then(()=>(D(),H)),{track:s,cleanup:o}=n({animation:"bars",label:"Screen Share",width:1920,height:1080}),a=new b("video","screen_share",s,o),d=new M(a,e?.name||"screen");return this.trackPublications.set("screen_share",d),this.videoTrackPublications.set(a.sid,d),this.room.emit("localTrackPublished",d,this),d}let i=this.trackPublications.get("screen_share");i&&(i.track?.stop(),this.trackPublications.delete("screen_share"),this.videoTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async publishTrack(t,e){let i=new M(t,e?.name),n=e?.source||t.source;return this.trackPublications.set(n,i),t.kind==="audio"?this.audioTrackPublications.set(t.sid,i):t.kind==="video"&&this.videoTrackPublications.set(t.sid,i),this.room.emit("localTrackPublished",i,this),i}async unpublishTrack(t){t.stop();for(let[e,i]of this.trackPublications)if(i.track===t){this.trackPublications.delete(e),t.kind==="audio"?this.audioTrackPublications.delete(t.sid):t.kind==="video"&&this.videoTrackPublications.delete(t.sid),this.room.emit("localTrackUnpublished",i,this);break}}async sendText(t,e){return{id:g("msg")}}async publishData(t,e){}async setMetadata(t){this.attributes.metadata=t}async setName(t){this.name=t}cleanup(){for(let t of this.trackPublications.values())t.track?.stop();this.trackPublications.clear(),this.audioTrackPublications.clear(),this.videoTrackPublications.clear(),this._cameraEnabled=!1,this._microphoneEnabled=!1,this._screenShareEnabled=!1}};var bt=(s=>(s[s.STANDARD=0]="STANDARD",s[s.INGRESS=1]="INGRESS",s[s.EGRESS=2]="EGRESS",s[s.SIP=3]="SIP",s[s.AGENT=4]="AGENT",s))(bt||{});function we(r){switch(r){case"standard":return 0;case"ingress":return 1;case"egress":return 2;case"sip":return 3;case"agent":return 4;default:return 0}}var E=class{constructor(t,e,i={},n="standard"){this.connectionQuality="excellent";this.isSpeaking=!1;this.audioLevel=0;this.trackPublications=new Map;this.identity=t,this.sid=g("PA"),this.name=e,this.attributes=i,this._kindString=n,this.kind=we(n),this.joinedAt=new Date}get isAgent(){return this.kind===4||this.attributes["lk.agent.name"]!==void 0}get kindString(){return this._kindString}get isCameraEnabled(){let t=this.getTrackPublication("camera");return!!(t?.track&&!t.isMuted)}get isMicrophoneEnabled(){let t=this.getTrackPublication("microphone");return!!(t?.track&&!t.isMuted)}getTrackPublication(t){for(let e of this.trackPublications.values())if(e.source===t)return e}getTrackPublicationBySid(t){return this.trackPublications.get(t)}getTrackPublications(){return Array.from(this.trackPublications.values())}getAudioTracks(){return this.getTrackPublications().filter(t=>t.kind==="audio")}getVideoTracks(){return this.getTrackPublications().filter(t=>t.kind==="video")}addTrackPublication(t){this.trackPublications.set(t.trackSid,t)}removeTrackPublication(t){let e=this.trackPublications.get(t);return e&&(this.trackPublications.delete(t),e.track?.stop()),e}setAttributes(t){this.attributes={...this.attributes,...t}}getAttribute(t){return this.attributes[t]}startSpeaking(t=.5){this.isSpeaking=!0,this.audioLevel=t}stopSpeaking(){this.isSpeaking=!1,this.audioLevel=0}setConnectionQuality(t){this.connectionQuality=t}cleanup(){for(let t of this.trackPublications.values())t.track?.stop();this.trackPublications.clear()}};var O=class{constructor(t){this.remoteParticipants=new Map;this._state="disconnected";this.eventHandlers=new Map;this.textStreamHandlers=new Map;this.rpcHandlers=new Map;this.mockService=t,this.localParticipant=new $(this),this.sid=g("RM")}get state(){return this._state}set state(t){let e=this._state;this._state=t,e!==t&&this.emit("connectionStateChanged",t,e)}get numParticipants(){return this.remoteParticipants.size+1}get isConnected(){return this._state==="connected"}async connect(t,e){this._state="connecting",this.emit("connectionStateChanged","connecting","disconnected"),await this.mockService.simulateLatency(),this._state="connected",this.connectedAt=new Date().toISOString(),this.emit("connectionStateChanged","connected","connecting"),this.emit("connected")}async disconnect(){for(let e of this.remoteParticipants.values())e.cleanup();this.remoteParticipants.clear(),this.localParticipant.cleanup();let t=this._state;this._state="disconnected",this.emit("connectionStateChanged","disconnected",t),this.emit("disconnected"),this.eventHandlers.clear()}async reconnect(){this._state="reconnecting",this.emit("connectionStateChanged","reconnecting","connected"),await this.mockService.simulateLatency(),this._state="connected",this.emit("connectionStateChanged","connected","reconnecting"),this.emit("reconnected")}on(t,e){return this.eventHandlers.has(t)||this.eventHandlers.set(t,new Set),this.eventHandlers.get(t).add(e),this}once(t,e){let i=(...n)=>{this.off(t,i),e(...n)};return this.on(t,i)}off(t,e){return this.eventHandlers.get(t)?.delete(e),this}removeAllListeners(){this.eventHandlers.clear()}emit(t,...e){let i=this.eventHandlers.get(t);if(i)for(let n of i)try{n(...e)}catch(s){console.error(`Error in mock room event handler for ${t}:`,s)}}registerRpcMethod(t,e){this.rpcHandlers.set(t,e)}unregisterRpcMethod(t){this.rpcHandlers.delete(t)}async callRpc(t,e,i,n=1e4){let s=this.rpcHandlers.get(t);if(!s)throw new Error(`RPC method not found: ${t}`);return s({callerIdentity:e,payload:i,responseTimeout:n})}registerTextStreamHandler(t,e){this.textStreamHandlers.set(t,e)}unregisterTextStreamHandler(t){this.textStreamHandlers.delete(t)}simulateTextStream(t,e){let i=this.textStreamHandlers.get(t);i&&i(e,{identity:e.participantIdentity})}getParticipantByIdentity(t){return t===this.localParticipant.identity?new E(this.localParticipant.identity,this.localParticipant.name,this.localParticipant.attributes):this.remoteParticipants.get(t)}getParticipantBySid(t){if(t===this.localParticipant.sid)return new E(this.localParticipant.identity,this.localParticipant.name,this.localParticipant.attributes);for(let e of this.remoteParticipants.values())if(e.sid===t)return e}async simulateParticipantJoin(t,e){let i=new E(t,e?.name,e?.attributes||{},e?.kind||"standard");return this.remoteParticipants.set(t,i),this.emit("participantConnected",i),e?.withCamera&&await this.simulateRemoteTrack(t,"video","camera"),e?.withMicrophone&&await this.simulateRemoteTrack(t,"audio","microphone"),i}simulateParticipantLeave(t){let e=this.remoteParticipants.get(t);if(e){for(let i of e.getTrackPublications())i.track?.stop(),this.emit("trackUnsubscribed",i.track,i,e);this.remoteParticipants.delete(t),this.emit("participantDisconnected",e)}}async simulateRemoteTrack(t,e,i){let n=this.remoteParticipants.get(t);if(!n)return;let s,o;if(e==="video"){let{createSyntheticVideoTrack:c}=await Promise.resolve().then(()=>(D(),H)),p=c({animation:n.isAgent?"avatar":"pulse",label:n.name||t,foregroundColor:n.isAgent?"#22c55e":"#4361ee"});s=p.track,o=p.cleanup}else if(e==="audio"){let{createSyntheticAudioTrack:c}=await Promise.resolve().then(()=>(D(),H)),p=c({enabled:!1});s=p.track,o=p.cleanup}let a=new b(e,i,s,o),d=new M(a);return n.addTrackPublication(d),this.emit("trackSubscribed",a,d,n),this.emit("trackPublished",d,n),a}simulateTrackUnpublished(t,e){let i=this.remoteParticipants.get(t);if(!i)return;let n=i.getTrackPublication(e);n&&(i.removeTrackPublication(n.trackSid),this.emit("trackUnpublished",n,i),this.emit("trackUnsubscribed",n.track,n,i))}async simulateAgentJoin(t,e="AI Agent"){return this.simulateParticipantJoin(t,{name:e,kind:"agent",withCamera:!0,withMicrophone:!0,attributes:{"lk.agent.name":e,"lk.agent.state":"active"}})}simulateAttributeChange(t,e){let i=this.remoteParticipants.get(t);if(i){let n={...i.attributes};i.setAttributes(e),this.emit("participantAttributesChanged",e,n,i)}}simulateTrackMuted(t,e,i){let n=this.remoteParticipants.get(t);if(!n)return;let s=n.getTrackPublication(e);s?.track&&(s.track.setMuted(i),this.emit(i?"trackMuted":"trackUnmuted",s,n))}simulateActiveSpeakersChanged(t){let e=[];for(let i of t){let n=this.remoteParticipants.get(i);n&&(n.startSpeaking(),e.push(n))}this.emit("activeSpeakersChanged",e)}simulateDataReceived(t,e,i,n){let s=this.remoteParticipants.get(e);this.emit("dataReceived",t,s,i,n)}};var V=class{constructor(t={}){this.rooms=new Map;this.participants=new Map;this.tracks=new Map;this.agents=new Map;this.messages=new Map;this.config=t,this.randomState=t.seed??Date.now()}updateConfig(t){this.config={...this.config,...t},t.seed!==void 0&&(this.randomState=t.seed)}getConfig(){return{...this.config}}random(){return this.randomState=(this.randomState*1103515245+12345)%2147483648,this.randomState/2147483648}createRoom(t,e,i){let n=g("room"),s=new Date().toISOString(),o={id:n,name:t,groupId:e||g("group"),createdAt:s,metadata:i,isActive:!0,participantIds:[],connectionState:"disconnected",wsURL:j(n),token:T(n,"pending",s)};return this.rooms.set(n,o),this.messages.set(n,[]),o}getRoom(t){return this.rooms.get(t)}getRoomByName(t){for(let e of this.rooms.values())if(e.name===t)return e}listRooms(t=!1){let e=Array.from(this.rooms.values());return t?e.filter(i=>i.isActive):e}updateRoomConnectionState(t,e){let i=this.rooms.get(t);if(!i)return;let n=i.connectionState;return i.connectionState=e,n}endRoom(t){let e=this.rooms.get(t);if(!e||!e.isActive)return!1;e.isActive=!1,e.endedAt=new Date().toISOString(),e.connectionState="disconnected";for(let i of e.participantIds){let n=this.participants.get(i);n&&(n.isConnected=!1)}for(let i of this.agents.values())i.roomId===t&&i.status==="running"&&(i.status="stopped",i.stoppedAt=new Date().toISOString());return!0}deleteRoom(t){let e=this.rooms.get(t);if(!e)return!1;for(let i of e.participantIds)this.participants.delete(i);for(let[i,n]of this.tracks)n.roomId===t&&this.tracks.delete(i);for(let[i,n]of this.agents)n.roomId===t&&this.agents.delete(i);return this.messages.delete(t),this.rooms.delete(t),!0}addParticipant(t,e,i,n="user",s="standard",o=!1){let a=this.rooms.get(t);if(!a)return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);if(!a.isActive)return this.createError("ROOM_ENDED",`Room ${t} has ended`);let d=this.participants.get(e);if(d&&d.roomId===t&&d.isConnected)return this.config.strictMode?this.createError("PARTICIPANT_ALREADY_JOINED",`Participant ${e} is already in room ${t}`):d;let c={identity:e,name:i||e,roomId:t,joinedAt:new Date().toISOString(),isConnected:!0,trackIds:[],role:n,attributes:{},kind:s,isLocal:o};return this.participants.set(e,c),a.participantIds.push(e),c}getParticipant(t){return this.participants.get(t)}listParticipants(t,e=!0){let i=this.rooms.get(t);if(!i)return[];let n=[];for(let s of i.participantIds){let o=this.participants.get(s);o&&(!e||o.isConnected)&&n.push(o)}return n}updateParticipantAttributes(t,e){let i=this.participants.get(t);if(!i)return;let n={...i.attributes};return i.attributes={...i.attributes,...e},n}removeParticipant(t){let e=this.participants.get(t);if(!e)return;e.isConnected=!1;for(let n of e.trackIds)this.tracks.delete(n);e.trackIds=[];let i=this.rooms.get(e.roomId);if(i){let n=i.participantIds.indexOf(t);n!==-1&&i.participantIds.splice(n,1)}return e}publishTrack(t,e,i="unknown",n){let s=this.participants.get(t);if(!s)return this.createError("PARTICIPANT_NOT_FOUND",`Participant ${t} not found`);if(!s.isConnected)return this.createError("INVALID_OPERATION",`Participant ${t} is not connected`);let o=this.rooms.get(s.roomId);if(!o||!o.isActive)return this.createError("ROOM_ENDED","Room is not active");let a=g("track"),d={id:a,kind:e,source:i,participantIdentity:t,roomId:s.roomId,publishedAt:new Date().toISOString(),muted:!1,metadata:n};return this.tracks.set(a,d),s.trackIds.push(a),d}getTrack(t){return this.tracks.get(t)}listTracks(t,e){let i=[];for(let n of this.tracks.values())t&&n.roomId!==t||e&&n.participantIdentity!==e||i.push(n);return i}unpublishTrack(t){let e=this.tracks.get(t);if(!e)return;let i=this.participants.get(e.participantIdentity);if(i){let n=i.trackIds.indexOf(t);n!==-1&&i.trackIds.splice(n,1)}return this.tracks.delete(t),e}setTrackMuted(t,e){let i=this.tracks.get(t);return i?(i.muted=e,!0):!1}startAgent(t,e,i={}){let n=this.rooms.get(t);if(!n)return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);if(!n.isActive)return this.createError("ROOM_ENDED",`Room ${t} has ended`);let s=g("agent"),o={id:s,roomId:t,name:e,status:"running",startedAt:new Date().toISOString(),config:{responseStrategy:"echo",...i},messageHistory:[]};return this.agents.set(s,o),this.addParticipant(t,`agent_${s}`,e,"agent","agent",!1),o}getAgent(t){return this.agents.get(t)}listAgents(t){let e=[];for(let i of this.agents.values())i.roomId===t&&e.push(i);return e}stopAgent(t){let e=this.agents.get(t);if(e)return e.status="stopped",e.stoppedAt=new Date().toISOString(),this.removeParticipant(`agent_${t}`),e}updateAgentStatus(t,e){let i=this.agents.get(t);return i?(i.status=e,e==="stopped"&&(i.stoppedAt=new Date().toISOString()),!0):!1}addAgentMessage(t,e,i){let n=this.agents.get(t);if(!n)return;let s={id:g("msg"),content:e,role:i,timestamp:new Date().toISOString()};return n.messageHistory.push(s),s}addMessage(t,e,i,n="standard",s){if(!this.rooms.get(t))return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);let a={id:g("msg"),roomId:t,content:i,participantIdentity:e,createdAt:new Date().toISOString(),type:n,attributes:s},d=this.messages.get(t)||[];return d.push(a),this.messages.set(t,d),a}getMessages(t,e){let i=this.messages.get(t)||[];return e?i.slice(-e):i}createError(t,e,i){return{code:t,message:e,details:i}}isError(t){return typeof t=="object"&&t!==null&&"code"in t&&"message"in t}reset(){this.rooms.clear(),this.participants.clear(),this.tracks.clear(),this.agents.clear(),this.messages.clear(),this.randomState=this.config.seed??Date.now()}getSnapshot(){return{rooms:new Map(this.rooms),participants:new Map(this.participants),tracks:new Map(this.tracks),agents:new Map(this.agents),messages:new Map(this.messages),config:{...this.config},eventHistory:[]}}toJSON(){return{rooms:Object.fromEntries(this.rooms),participants:Object.fromEntries(this.participants),tracks:Object.fromEntries(this.tracks),agents:Object.fromEntries(this.agents),messages:Object.fromEntries(this.messages),config:this.config,eventHistory:[],exportedAt:new Date().toISOString()}}fromJSON(t){this.rooms=new Map(Object.entries(t.rooms)),this.participants=new Map(Object.entries(t.participants)),this.tracks=new Map(Object.entries(t.tracks)),this.agents=new Map(Object.entries(t.agents)),this.messages=new Map(Object.entries(t.messages).map(([e,i])=>[e,i])),this.config=t.config}};var x=class{constructor(t={}){this.messageListeners=new Set;this.typingListeners=new Set;this.callRequestListeners=new Map;this._authToken=null;this._registeredUser=null;this.agents=new Map;this.config={latencyMs:t.latencyMs??0,strictMode:t.strictMode??!1,seed:t.seed,scenario:t.scenario,errorConfig:t.errorConfig,autoEmitEvents:t.autoEmitEvents??!0,organizationId:t.organizationId??"mock_org",apiUrl:t.apiUrl??"https://mock-livekit.local"},this.state=new V(this.config),this.events=new K,this.room=new O(this),this.config.scenario&&this.applyScenario(this.config.scenario)}get authToken(){return this._authToken}get registeredUser(){return this._registeredUser}getState(){return this.state}getEvents(){return this.events}updateConfig(t){this.config={...this.config,...t},this.state.updateConfig(t)}getConfig(){return{...this.config}}async simulateLatency(){this.config.latencyMs&&this.config.latencyMs>0&&await new Promise(t=>setTimeout(t,this.config.latencyMs))}applyScenario(t){switch(t){case"happy_path":this.config.errorConfig={},this.config.latencyMs=0;break;case"slow_network":this.config.latencyMs=500;break;case"network_unstable":this.config.errorConfig={errorRate:30};break;default:break}}shouldThrowError(){return this.config.errorConfig?.errorRate?this.state.random()*100<this.config.errorConfig.errorRate:!1}ensureRoom(){return this.room||(this.room=new O(this)),this.room}async registerUser(t,e,i,n){if(await this.simulateLatency(),this.config.errorConfig?.unauthorized)throw new l("UNAUTHORIZED","Registration failed");let s={id:g("user"),externalId:t,organizationId:this.config.organizationId,role:"user",token:T("pending",t,new Date().toISOString())};return this._authToken=s.token,this._registeredUser=s,this.room.localParticipant.identity=t,this.room.localParticipant.name=i?.name||t,s}async registerAgent(t,e){if(await this.simulateLatency(),this.config.errorConfig?.unauthorized)throw new l("UNAUTHORIZED","Agent registration failed");let i=T("agent",t,new Date().toISOString());return this._authToken=i,this.room.localParticipant.identity=t,this.room.localParticipant.name=e.name,i}async createRoom(t,e={}){if(await this.simulateLatency(),this.config.errorConfig?.networkError||this.shouldThrowError())throw new l("NETWORK_ERROR","Failed to create room");let i=this.state.createRoom(`room_${Date.now()}`,t.affinity?.agentId,t.metadata);this.room.id=i.id,this.room.groupId=i.groupId,this.room.createdAt=i.createdAt,this.room.connectedAt=new Date().toISOString();let n=this.room.localParticipant.identity||"local_user";return this.state.addParticipant(i.id,n,this.room.localParticipant.name,"user","standard",!0),Object.keys(e).length>0&&(this.state.updateParticipantAttributes(n,e),this.room.localParticipant.setAttributes(e)),this.state.updateRoomConnectionState(i.id,"connected"),this.config.autoEmitEvents&&(this.events.emitRoomCreated(i),this.events.emitRoomConnectionStateChanged(i.id,"connected","disconnected")),(t.affinity?.agentId||t.affinity?.agentType)&&await this.startMockAgent(i.id,{type:t.affinity?.agentType,nature:t.affinity?.nature??"ai"}),await this.room.connect(i.wsURL,i.token),this.room}async joinRoom(t,e,i,n){await this.simulateLatency();let s=this.state.getRoom(t);if(!s)throw new A(t);if(!s.isActive)throw new l("ROOM_ENDED",`Room ${t} has ended`);this.room.id=s.id,this.room.groupId=s.groupId,this.room.createdAt=s.createdAt,this.room.connectedAt=new Date().toISOString();let o=this.room.localParticipant.identity||"local_user",a=this.state.addParticipant(t,o,this.room.localParticipant.name,"user","standard",!0);if(C(a))throw F(a);if(n){let d={};for(let[c,p]of Object.entries(n))d[c]=String(p);this.state.updateParticipantAttributes(o,d)}return this.state.updateRoomConnectionState(t,"connected"),this.config.autoEmitEvents&&(this.events.emitParticipantJoined(t,a),this.events.emitRoomConnectionStateChanged(t,"connected","disconnected")),await this.room.connect(s.wsURL,s.token),this.room}async evaluateRoom(t){await this.simulateLatency();let e=t.roomId||this.room?.id;if(!e)throw new l("ROOM_NOT_FOUND","No room to evaluate");let i=this.state.getRoom(e);if(!i)throw new A(e);i.metadata||(i.metadata={}),i.metadata.evaluation={rating:t.rating,comment:t.comment,evaluatedAt:new Date().toISOString()}}async closeRoom(){await this.simulateLatency(),this.room?.id&&(this.state.endRoom(this.room.id),await this.stopLocalTracks(),this.config.autoEmitEvents&&this.events.emitRoomEnded(this.room.id))}async disconnect(){if(this.room){let t=this.room.id,e=this.room.localParticipant.identity;await this.stopLocalTracks(),this.state.removeParticipant(e),this.config.autoEmitEvents&&t&&this.events.emitParticipantLeft(t,e),this.room.removeAllListeners(),await this.room.disconnect()}}async stopLocalTracks(){let t=this.room?.localParticipant;t&&await Promise.all([t.setCameraEnabled(!1),t.setMicrophoneEnabled(!1),t.setScreenShareEnabled(!1)])}async disconnectAndCloseRoom(){await this.closeRoom(),await this.disconnect()}async readRoom(t){await this.simulateLatency();let e=this.state.getRoom(t);if(!e)throw new A(t);e.metadata||(e.metadata={}),e.metadata.lastReadAt=new Date().toISOString()}async getRooms(t){await this.simulateLatency();let e=this.state.listRooms();t.roomStatus==="active"?e=e.filter(a=>a.isActive):t.roomStatus==="closed"&&(e=e.filter(a=>!a.isActive)),t.ids?.length&&(e=e.filter(a=>t.ids.includes(a.id))),t.groupId&&(e=e.filter(a=>a.groupId===t.groupId));let i=t.offset??0,n=t.limit??20;return{items:e.slice(i,i+n).map(a=>({id:a.id,name:a.name,groupId:a.groupId,organizationId:this.config.organizationId,endedAt:a.endedAt??null,createdAt:a.createdAt,updatedAt:a.createdAt,status:a.isActive?"active":"ended",participants:this.state.listParticipants(a.id).map(d=>({id:d.identity,name:d.name||d.identity,role:d.role,isLocal:d.isLocal})),evaluations:[],_count:{messages:this.state.getMessages(a.id).length,participants:a.participantIds.length}})),count:e.length,limit:n,offset:i}}async sendMessage(t,e){if(await this.simulateLatency(),!this.room?.id)throw new l("INVALID_OPERATION","Not connected to a room");let i=this.state.addMessage(this.room.id,this.room.localParticipant.identity,t,"standard",e);if(C(i))throw F(i);let n={id:i.id,timestamp:Date.now(),message:t,content:t,createdAt:i.createdAt,from:{identity:this.room.localParticipant.identity,name:this.room.localParticipant.name,id:this.room.localParticipant.identity,role:"user"}};for(let s of this.messageListeners)s([n]);this.config.autoEmitEvents&&this.events.emitMessageSent(this.room.id,i);for(let s of this.agents.values())s.isRunning&&s.roomId===this.room.id&&this.triggerAgentResponse(s,t)}async persistMessage(t){await this.simulateLatency();let e=this.state.addMessage(t.roomId,t.identity||"system",t.content);if(C(e))throw F(e);return{items:[{id:e.id,timestamp:Date.now(),message:e.content,content:e.content,createdAt:e.createdAt}],count:1,limit:1,offset:0}}async getMessages(t){await this.simulateLatency();let e=t.roomId||this.room?.id;return e?this.state.getMessages(e,t.limit).map(n=>({id:n.id,timestamp:Date.parse(n.createdAt),message:n.content,content:n.content,createdAt:n.createdAt,from:{identity:n.participantIdentity,id:n.participantIdentity,role:"user"}})):[]}async sendMessageReport(t){await this.simulateLatency()}async deleteMessageReport(t){await this.simulateLatency()}async updateMessageReactions(t){await this.simulateLatency()}subscribeMessages(t){return this.messageListeners.add(t),()=>{this.messageListeners.delete(t)}}async sendTypingIndicator(t){if(!this.room?.id)return;let e={type:"typing",isTyping:t,timestamp:Date.now(),participantId:this.room.localParticipant.identity};for(let i of this.typingListeners)i(e);this.config.autoEmitEvents&&this.events.emitTypingIndicator(this.room.id,this.room.localParticipant.identity,t)}subscribeTypingIndicators(t){return this.typingListeners.add(t),()=>this.typingListeners.delete(t)}unsubscribeTypingIndicators(t){this.typingListeners.delete(t)}async sendContextualEvent(t){await this.simulateLatency()}async requestNewRoom(t){await this.simulateLatency();let e=this.state.createRoom(`transfer_${Date.now()}`,void 0,{originRoom:t.originRoom});return{id:e.id,groupId:e.groupId,token:e.token,wsURL:e.wsURL,createdAt:e.createdAt}}async confirmRoomRequest(t){return await this.simulateLatency(),{success:!0,message:"Request confirmed",roomId:t}}async cancelRoomRequest(t){return await this.simulateLatency(),{success:!0,message:"Request cancelled",roomId:t}}async finishCall(){await this.simulateLatency(),this.room?.id&&this.state.endRoom(this.room.id)}isFirebaseEnabled(){return!0}onPresenceChange(t){return()=>{}}onPresenceAgentChange(t,e){return()=>{}}async createCallRequest(t){return await this.simulateLatency(),g("call")}onNewCallRequest(t){return this.callRequestListeners.has("new")||this.callRequestListeners.set("new",new Set),this.callRequestListeners.get("new").add(t),()=>this.callRequestListeners.get("new")?.delete(t)}onCallRequestChange(t){return this.callRequestListeners.has("change")||this.callRequestListeners.set("change",new Set),this.callRequestListeners.get("change").add(t),()=>this.callRequestListeners.get("change")?.delete(t)}onCallRequestRemoved(t){return()=>{}}async acceptCallRequest(t){await this.simulateLatency()}async cancelCallRequest(t){await this.simulateLatency()}async cancelOnDisconnect(t){await this.simulateLatency()}subscribePendingRequests(t,e={}){return()=>{}}subscribeRequestChanges(t){return()=>{}}async tryAcceptRequest(t){return await this.simulateLatency(),!0}onRoomSync(t,e){return()=>{}}async clearRoomSync(t,e){await this.simulateLatency()}onNewRoomRequest(t,e){return()=>{}}unsubscribeAllFirebase(){this.callRequestListeners.clear()}async destroy(){this.unsubscribeAllFirebase(),this.messageListeners.clear(),this.typingListeners.clear(),await this.disconnect(),this.state.reset()}async startMockAgent(t,e){let i=e?.name||"AI Assistant",n=new y(g("agent"),i,{responseStrategy:e?.responseStrategy||"echo",responseDelayMs:e?.responseDelayMs||100,cannedResponses:e?.cannedResponses||[],type:e?.type,nature:e?.nature});await n.start(t),this.agents.set(n.id,n),this.customAgentHandler&&n.setCustomHandler((c,p)=>this.customAgentHandler(c,p));let s=e?.type,o=Array.isArray(s)?s:[s].filter(Boolean),a=o.includes("video"),d=o.includes("voice");return(a||d)&&this.room.isConnected&&await this.room.simulateParticipantJoin(n.id,{name:i,kind:"agent",withCamera:a,withMicrophone:d||a,attributes:{"lk.agent.name":i,"lk.agent.state":"active",role:"agent"}}),this.config.autoEmitEvents&&this.events.emitAgentStarted(t,{id:n.id,name:n.name,roomId:t,status:"running",config:n.getConfig(),startedAt:new Date().toISOString(),messageHistory:[]}),n.id}async stopMockAgent(t){let e=this.agents.get(t);if(e){let i=e.roomId;await e.stop(),this.agents.delete(t),this.config.autoEmitEvents&&i&&this.events.emitAgentStopped(i,t)}}setAgentResponseHandler(t){this.customAgentHandler=t;for(let e of this.agents.values())e.setCustomHandler((i,n)=>t(i,n))}async triggerAgentResponse(t,e){if(this.config.scenario!=="agent_timeout")try{let i=await t.processMessage(e);if(!i)return;let n=this.state.addMessage(t.roomId,`agent_${t.id}`,i);if(!C(n)){let s={id:n.id,timestamp:Date.now(),message:i,content:i,createdAt:n.createdAt,from:{identity:`agent_${t.id}`,name:t.name,id:t.id,role:"agent"}};for(let o of this.messageListeners)o([s]);this.config.autoEmitEvents&&this.events.emitMessageReceived(t.roomId,n)}}catch(i){console.error("Agent response error:",i)}}simulateCallRequest(t){let e={id:g("call"),guestId:t.guestId||"guest_user",name:t.name||"Guest User",createdAt:new Date().toISOString(),status:t.status||"pending",...t},i=this.callRequestListeners.get("new");if(i)for(let n of i)n(e.id,e)}simulateParticipantJoin(t,e,i="user"){if(!this.room?.id)return;let n=this.state.addParticipant(this.room.id,t,e,i,"standard",!1);!C(n)&&this.config.autoEmitEvents&&this.events.emitParticipantJoined(this.room.id,n)}simulateParticipantLeave(t){if(!this.room?.id)return;this.state.removeParticipant(t)&&this.config.autoEmitEvents&&this.events.emitParticipantLeft(this.room.id,t)}simulateIncomingMessage(t,e){if(!this.room?.id)return;let i=this.state.addMessage(this.room.id,t,e);if(C(i))return;let n={id:i.id,timestamp:Date.now(),message:e,content:e,createdAt:i.createdAt,from:{identity:t,id:t,role:"user"}};for(let s of this.messageListeners)s([n]);this.config.autoEmitEvents&&this.events.emitMessageReceived(this.room.id,i)}async simulateDisconnect(){if(!this.room?.id)return;let t=this.room.state;this.room.state="disconnected",this.config.autoEmitEvents&&this.events.emitRoomConnectionStateChanged(this.room.id,"disconnected",t),this.room.emit("connectionStateChanged","disconnected")}reset(){this.state.reset(),this.events.clearHistory(),this.messageListeners.clear(),this.typingListeners.clear(),this.callRequestListeners.clear(),this.agents.clear(),this._authToken=null,this._registeredUser=null,this.room=new O(this),pt()}seed(t){this.config.seed=t,this.state.updateConfig({seed:t})}setScenario(t){this.config.scenario=t,this.applyScenario(t)}exportState(){return{...this.state.toJSON(),eventHistory:this.events.getHistory()}}getEventHistory(t){return this.events.getHistory(t)}};var R={MODE:"LIVEKIT_MODE",USE_MOCK:"USE_LIVEKIT_MOCK",MOCK_LATENCY:"MOCK_LIVEKIT_LATENCY_MS",MOCK_STRICT:"MOCK_LIVEKIT_STRICT",MOCK_SCENARIO:"MOCK_LIVEKIT_SCENARIO",MOCK_SEED:"MOCK_LIVEKIT_SEED",API_URL:"LIVEKIT_API_URL",AUTH_URL:"LIVEKIT_AUTH_URL",ORG_ID:"LIVEKIT_ORGANIZATION_ID"};function dt(){let r=P(R.MODE);if(r==="mock"||r==="real")return r;let t=P(R.USE_MOCK);return t==="true"||t==="1"||xe()?"mock":"real"}function Ee(){let r={},t=P(R.MOCK_LATENCY);t&&(r.latencyMs=parseInt(t,10));let e=P(R.MOCK_STRICT);(e==="true"||e==="1")&&(r.strictMode=!0);let i=P(R.MOCK_SCENARIO);i&&(r.scenario=i);let n=P(R.MOCK_SEED);return n&&(r.seed=parseInt(n,10)),r}function Oe(){let r={},t=P(R.API_URL);t&&(r.apiUrl=t);let e=P(R.AUTH_URL);e&&(r.authUrl=e);let i=P(R.ORG_ID);return i&&(r.organizationId=i),r}function P(r){if(typeof process<"u"&&process.env)return process.env[r];if(typeof import.meta<"u"&&import.meta.env)return import.meta.env[`VITE_${r}`]||import.meta.env[r];if(typeof window<"u"&&window.__ENV__)return window.__ENV__[r]}function xe(){return!!(typeof process<"u"&&process.env&&(process.env.NODE_ENV==="test"||process.env.VITEST||process.env.JEST_WORKER_ID)||typeof globalThis.__vitest_index__<"u")}var U=class r{static create(t){if((t.mode??dt())==="mock"){let i={...Ee(),...t.mockConfig,organizationId:t.organizationId,apiUrl:t.apiUrl};return new x(i)}if(!t.organizationId||!t.apiUrl)throw new Error("ConversationService requires organizationId and apiUrl. Provide them in options or set LIVEKIT_ORGANIZATION_ID and LIVEKIT_API_URL environment variables.");return new ct(t)}static createFromEnv(t){let e=t?.mode??dt(),i=Oe();return r.create({...i,...t,mode:e})}static createMock(t){return new x({organizationId:"mock_org",apiUrl:"https://mock-livekit.local",...t})}static createDeterministicMock(t=12345){return new x({organizationId:"mock_org",apiUrl:"https://mock-livekit.local",seed:t,strictMode:!0})}static getCurrentMode(){return dt()}static isMockMode(){return dt()==="mock"}static isMockService(t){return t instanceof x}};function _e(r){return U.createFromEnv(r)}function Rt(r){return U.createMock(r)}function Pt(r){let t=r?.id??g("room"),e=new Date().toISOString();return{id:t,name:`Test Room ${t}`,groupId:g("group"),createdAt:e,isActive:!0,participantIds:[],connectionState:"connected",wsURL:j(t),token:T(t,"local_user",e),...r}}function Tt(r="local_user",t){let e=Pt(t);e.participantIds.push(r);let i={identity:r,name:"Local User",roomId:e.id,joinedAt:new Date().toISOString(),isConnected:!0,trackIds:[],role:"user",attributes:{},kind:"standard",isLocal:!0};return{room:e,localParticipant:i}}function Kt(r){let t=Pt(r),e=new Date().toISOString(),i={identity:"user_1",name:"User One",roomId:t.id,joinedAt:e,isConnected:!0,trackIds:[],role:"user",attributes:{},kind:"standard",isLocal:!0},n={identity:"user_2",name:"User Two",roomId:t.id,joinedAt:e,isConnected:!0,trackIds:[],role:"user",attributes:{},kind:"standard",isLocal:!1};return t.participantIds.push(i.identity,n.identity),{room:t,participant1:i,participant2:n}}function At(r,t){let{room:e,localParticipant:i}=Tt("local_user",t),n=new Date().toISOString(),s=g("agent"),o={id:s,roomId:e.id,name:"AI Assistant",status:"running",startedAt:n,config:{responseStrategy:"echo",nature:"ai",...r},messageHistory:[]},a={identity:`agent_${s}`,name:"AI Assistant",roomId:e.id,joinedAt:n,isConnected:!0,trackIds:[],role:"agent",attributes:{},kind:"agent",isLocal:!1};return e.participantIds.push(a.identity),{room:e,localParticipant:i,agent:o,agentParticipant:a}}function Le(r){let{room:t,localParticipant:e,agent:i,agentParticipant:n}=At(void 0,r),s={id:g("track"),kind:"data",source:"unknown",participantIdentity:n.identity,roomId:t.id,publishedAt:new Date().toISOString(),muted:!1};return n.trackIds.push(s.id),{room:t,localParticipant:e,agent:i,dataTrack:s}}function De(r){let{room:t,localParticipant:e}=Tt("local_user",r),i=new Date().toISOString(),n={id:g("track"),kind:"audio",source:"microphone",participantIdentity:e.identity,roomId:t.id,publishedAt:i,muted:!1},s={id:g("track"),kind:"video",source:"camera",participantIdentity:e.identity,roomId:t.id,publishedAt:i,muted:!1};return e.trackIds.push(n.id,s.id),{room:t,participant:e,audioTrack:n,videoTrack:s}}function Vt(r,t){let e=t?.identity??g("participant");return{identity:e,name:`Participant ${e}`,roomId:r,joinedAt:new Date().toISOString(),isConnected:!0,trackIds:[],role:"user",attributes:{},kind:"standard",isLocal:!1,...t}}function Ue(r,t){let e=[];for(let i=0;i<t;i++)e.push(Vt(r,{identity:`participant_${i+1}`,name:`Participant ${i+1}`,isLocal:i===0}));return e}function Ct(r,t){return{id:t?.id??g("agent"),roomId:r,name:"AI Assistant",status:"running",startedAt:new Date().toISOString(),config:{responseStrategy:"echo",nature:"ai",...t?.config},messageHistory:[],...t}}function Ne(r,t){return Ct(r,{config:{responseStrategy:"canned",cannedResponses:t}})}function qe(r,t){return Ct(r,{config:{responseStrategy:"sequential",cannedResponses:t}})}function He(r,t,e){return{id:g("msg"),roomId:r,content:"Test message",participantIdentity:t,createdAt:new Date().toISOString(),type:"standard",...e}}function Jt(r,t){return t.map((e,i)=>({id:g("msg"),roomId:r,content:e.content,participantIdentity:e.identity,createdAt:new Date(Date.now()+i*1e3).toISOString(),type:"standard"}))}function gt(r){return{latencyMs:0,strictMode:!1,autoEmitEvents:!0,organizationId:"test_org",apiUrl:"https://mock-api.local",...r}}function $e(r){return gt({strictMode:!0,...r})}function ze(r,t){return gt({latencyMs:r,...t})}function je(r,t){return gt({seed:r,...t})}function Fe(){let{room:r,localParticipant:t,agent:e,agentParticipant:i}=At(),n=Jt(r.id,[{identity:t.identity,content:"Hello, I need help"},{identity:i.identity,content:"Hi! How can I assist you today?"},{identity:t.identity,content:"I have a question about my order"},{identity:i.identity,content:"Of course! Please provide your order number."}]);return{room:r,user:t,agent:e,agentParticipant:i,messages:n}}function Ke(){let{room:r,participant1:t,participant2:e}=Kt(),i=new Date().toISOString(),n=[{id:g("track"),kind:"audio",source:"microphone",participantIdentity:t.identity,roomId:r.id,publishedAt:i,muted:!1},{id:g("track"),kind:"video",source:"camera",participantIdentity:t.identity,roomId:r.id,publishedAt:i,muted:!1},{id:g("track"),kind:"audio",source:"microphone",participantIdentity:e.identity,roomId:r.id,publishedAt:i,muted:!1},{id:g("track"),kind:"video",source:"camera",participantIdentity:e.identity,roomId:r.id,publishedAt:i,muted:!1}];return t.trackIds.push(n[0].id,n[1].id),e.trackIds.push(n[2].id,n[3].id),{room:r,participant1:t,participant2:e,tracks:n}}var J=class{constructor(t,e,i,n,s){this.index=0;this._complete=!1;this.info={id:t,attributes:n,topic:s,timestamp:Date.now()},this.participantIdentity=e,this.topic=s,this.chunks=Array.isArray(i)?i:[i],this.info.totalSize=this.chunks.reduce((o,a)=>o+a.length,0)}get isComplete(){return this._complete}async*[Symbol.asyncIterator](){for(let t of this.chunks)yield t;this._complete=!0}async read(){return this.index>=this.chunks.length?(this._complete=!0,null):this.chunks[this.index++]}async readAll(){let t=this.chunks.slice(this.index).join("");return this.index=this.chunks.length,this._complete=!0,t}cancel(){this._complete=!0}},lt=class{constructor(t,e){this.chunks=[];this._closed=!1;this.id=g("stream"),this._topic=t,this._destinationIdentities=e}get isClosed(){return this._closed}get topic(){return this._topic}get destinationIdentities(){return this._destinationIdentities}get content(){return this.chunks.join("")}onWrite(t){this.onWriteCallback=t}async write(t){if(this._closed)throw new Error("Stream is closed");this.chunks.push(t),this.onWriteCallback?.(t)}async close(){this._closed=!0}},ut=class{constructor(t,e,i){this._index=0;this.info={id:t,timestamp:Date.now()},this.participantIdentity=e,this.chunks=Array.isArray(i)?i:[i]}get index(){return this._index}async*[Symbol.asyncIterator](){for(let t of this.chunks)yield t}async readAll(){let t=this.chunks.reduce((n,s)=>n+s.length,0),e=new Uint8Array(t),i=0;for(let n of this.chunks)e.set(n,i),i+=n.length;return e}};function Bt(r,t,e){return new J(e?.id||g("stream"),r,t,e?.attributes,e?.topic)}D();var _=null;function m(r){return _||(_=Rt({organizationId:"storybook_org",apiUrl:"https://storybook.mock",latencyMs:50,autoEmitEvents:!0,...r})),_}function Gt(){_&&_.reset()}async function Ve(){_&&(await _.destroy(),_=null)}function Je(r={}){return(t,e)=>{Gt();let i={default:void 0,slow_network:"slow_network",unreliable:"unreliable",agent_timeout:"agent_timeout"},n=m({organizationId:r.organizationId,latencyMs:r.latencyMs??50,scenario:r.scenario?i[r.scenario]:void 0});return(async()=>{try{if(r.autoRegisterUser&&await n.registerUser(r.autoRegisterUser.identity,r.autoRegisterUser.secret||"storybook_secret",{name:r.autoRegisterUser.name||"Storybook User"}),r.autoCreateRoom){if(await n.createRoom({language:r.autoCreateRoom.language||"en",timezone:r.autoCreateRoom.timezone||"UTC"}),r.seedMessages)for(let s of r.seedMessages)n.simulateIncomingMessage(s.from,s.content);r.autoStartAgent&&n.room?.id&&await n.startMockAgent(n.room.id,r.autoStartAgent)}}catch(s){console.error("[Storybook Mock] Setup error:",s)}})(),window.__mockConversationService=n,t()}}function Be(r){return U.isMockService(r)}var Ge={basicChat:{autoRegisterUser:{identity:"sb_user",name:"User"},autoCreateRoom:{language:"en",timezone:"UTC"},autoStartAgent:{responseStrategy:"echo"}},aiAssistant:{autoRegisterUser:{identity:"sb_user",name:"User"},autoCreateRoom:{language:"en",timezone:"UTC"},autoStartAgent:{responseStrategy:"canned",cannedResponses:["Hello! How can I help you today?","I understand. Let me look into that for you.","Is there anything else you'd like to know?","Thank you for your patience!"]}},videoCall:{autoRegisterUser:{identity:"sb_user",name:"User"},autoCreateRoom:{language:"en",timezone:"UTC"},autoStartAgent:{responseStrategy:"canned",type:["text","video"],nature:"ai",name:"Video Agent",cannedResponses:["I can see you! The video quality looks great.","Let me share my screen to show you what I mean.","Is the audio coming through clearly?"]},simulateVideo:!0},multiParticipantCall:{autoRegisterUser:{identity:"sb_user",name:"User"},autoCreateRoom:{language:"en",timezone:"UTC"},autoStartAgent:{responseStrategy:"echo",type:["text","video"],name:"Video Agent"},simulateVideo:!0},multiTurnConversation:{autoRegisterUser:{identity:"sb_user",name:"User"},autoCreateRoom:{language:"en",timezone:"UTC"},autoStartAgent:{responseStrategy:"sequential",cannedResponses:["Welcome! I'm your virtual assistant.","I can help you with product information, orders, and support.","What would you like to know?"]},seedMessages:[{from:"agent",content:"Welcome! I'm your virtual assistant."}]},slowNetwork:{autoRegisterUser:{identity:"sb_user",name:"User"},autoCreateRoom:{language:"en",timezone:"UTC"},autoStartAgent:{responseStrategy:"echo",responseDelayMs:2e3},latencyMs:500,scenario:"slow_network"},unreliable:{autoRegisterUser:{identity:"sb_user",name:"User"},autoCreateRoom:{language:"en",timezone:"UTC"},scenario:"unreliable"}};function We(r){return()=>m(r)}var Wt={async receiveMessage(r,t){m().simulateIncomingMessage(r,t)},simulateJoin(r,t){m().simulateParticipantJoin(r,t)},simulateLeave(r){m().simulateParticipantLeave(r)},async simulateVideoParticipant(r,t,e){let n=m().room;n&&await n.simulateParticipantJoin(r,{name:t||r,kind:"standard",withCamera:e?.withCamera??!0,withMicrophone:e?.withMicrophone??!0})},async simulateVideoAgent(r,t){let i=m().room;i&&await i.simulateAgentJoin(r,t||"AI Agent")},async enableLocalCamera(){let t=m().room;t&&await t.localParticipant.setCameraEnabled(!0)},async disableLocalCamera(){let t=m().room;t&&await t.localParticipant.setCameraEnabled(!1)},async enableLocalMicrophone(){let t=m().room;t&&await t.localParticipant.setMicrophoneEnabled(!0)},async simulateMultipleParticipants(r){let t=["Alice","Bob","Carol","David","Eve","Frank","Grace","Henry","Ivy","Jack"],i=m().room;if(i)for(let n=0;n<Math.min(r,t.length);n++)await i.simulateParticipantJoin(`participant_${n+1}`,{name:t[n],kind:"standard",withCamera:!0,withMicrophone:!0}),await new Promise(s=>setTimeout(s,100))},clearParticipants(){let t=m().room;if(t)for(let e of t.remoteParticipants.keys())t.simulateParticipantLeave(e)},simulateCallRequest(r,t){m().simulateCallRequest({name:r,guestId:t||`guest_${Date.now()}`})},async simulateDisconnect(){await m().simulateDisconnect()},getEventHistory(){return m().getEventHistory()},exportState(){return m().exportState()},getRoom(){return m().room}};typeof window<"u"&&(window.MockServiceActions=Wt);export{et as AgentNotFoundError,U as ConversationServiceFactory,W as DEFAULT_AGENT_CONFIG,rt as InvalidOperationError,y as MockAgent,Ot as MockAgentPresets,ut as MockByteStreamReader,x as MockConversationService,K as MockEventEmitter,l as MockLiveKitError,$ as MockLocalParticipant,E as MockParticipant,O as MockRoom,Wt as MockServiceActions,V as MockState,J as MockTextStreamReader,lt as MockTextStreamWriter,b as MockTrack,M as MockTrackPublication,nt as NetworkError,Y as ParticipantAlreadyJoinedError,bt as ParticipantKindValue,Z as ParticipantNotFoundError,X as RoomEndedError,A as RoomNotFoundError,St as SYNTHETIC_MEDIA_PRESETS,Ge as StorybookScenarios,st as TimeoutError,tt as TrackNotFoundError,it as UnauthorizedError,Ct as createAgentFixture,Ne as createAgentWithCannedResponses,Fe as createChatScenario,Jt as createConversationFixture,_e as createConversationService,gt as createDefaultConfig,Pt as createDefaultRoomFixture,je as createDeterministicConfig,F as createErrorFromMockError,ze as createLatencyConfig,He as createMessageFixture,Rt as createMockConversationService,We as createMockServiceFactory,Ue as createParticipantBatch,Vt as createParticipantFixture,At as createRoomWithAgent,Le as createRoomWithAgentAndDataTrack,Tt as createRoomWithLocalParticipant,De as createRoomWithMediaTracks,Kt as createRoomWithTwoParticipants,qe as createSequentialAgent,$e as createStrictConfig,yt as createSyntheticAudioTrack,Mt as createSyntheticMedia,Ft as createSyntheticMediaFromPreset,vt as createSyntheticVideoTrack,Bt as createTextStream,Ke as createVideoCallScenario,ne as decodeMockToken,Ve as destroyStorybookMockService,ce as generateMockApiResponseId,de as generateMockExternalId,g as generateMockId,ge as generateMockIdBatch,ae as generateMockMessageId,re as generateMockParticipantIdentity,se as generateMockRoomName,T as generateMockToken,oe as generateMockTrackSid,j as generateMockWsUrl,ie as generateSeededMockId,Q as generateStrategyResponse,m as getStorybookMockService,Be as isMockConversationService,C as isMockError,le as isMockLiveKitError,pt as resetIdCounter,Gt as resetStorybookMockService,ee as setIdCounter,Je as withMockConversationService};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.179 | © 2026 Onlive.ai */
|
|
2
|
+
"use strict";var I=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var B=Object.getOwnPropertyNames;var Q=Object.prototype.hasOwnProperty;var F=(o,t)=>()=>(o&&(t=o(o=0)),t);var L=(o,t)=>{for(var e in t)I(o,e,{get:t[e],enumerable:!0})},z=(o,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of B(t))!Q.call(o,n)&&n!==e&&I(o,n,{get:()=>t[n],enumerable:!(i=q(t,n))||i.enumerable});return o};var Y=o=>z(I({},"__esModule",{value:!0}),o);var S={};L(S,{SYNTHETIC_MEDIA_PRESETS:()=>N,createSyntheticAudioTrack:()=>U,createSyntheticMedia:()=>O,createSyntheticMediaFromPreset:()=>J,createSyntheticVideoTrack:()=>j});function j(o={}){let{width:t=640,height:e=480,fps:i=30,backgroundColor:n="#1a1a2e",foregroundColor:a="#4361ee",label:c="Mock Video",animation:d="wave"}=o,s=document.createElement("canvas");s.width=t,s.height=e;let r=s.getContext("2d"),u,M=Date.now(),_={wave:k=>{r.fillStyle=n,r.fillRect(0,0,t,e),r.strokeStyle=a,r.lineWidth=3,r.beginPath();for(let l=0;l<t;l++){let m=e/2+Math.sin(l/t*4*Math.PI+k*.002)*(e/4);l===0?r.moveTo(l,m):r.lineTo(l,m)}r.stroke()},pulse:k=>{r.fillStyle=n,r.fillRect(0,0,t,e);let l=Math.sin(k*.003)*.3+.7,m=Math.min(t,e)*.3*l;r.beginPath(),r.arc(t/2,e/2,m,0,Math.PI*2),r.fillStyle=a,r.fill()},bars:k=>{r.fillStyle=n,r.fillRect(0,0,t,e);let l=20,m=t/l,f=e*.7;r.fillStyle=a;for(let y=0;y<l;y++){let D=Math.abs(Math.sin(y/l*Math.PI*2+k*.004))*f,G=y*m,W=e-D;r.fillRect(G+2,W,m-4,D)}},avatar:k=>{r.fillStyle=n,r.fillRect(0,0,t,e);let l=t/2,m=e/2-20,f=Math.min(t,e)*.15;r.beginPath(),r.arc(l,m,f,0,Math.PI*2),r.fillStyle=a,r.fill(),r.beginPath(),r.ellipse(l,m+f*2.2,f*1.5,f,0,Math.PI,0),r.fill(),Math.sin(k*.01)>0&&(r.beginPath(),r.arc(l,m+f*3,5+Math.sin(k*.02)*3,0,Math.PI*2),r.fillStyle="#22c55e",r.fill())},none:()=>{r.fillStyle=n,r.fillRect(0,0,t,e)}},w=()=>{r.fillStyle="rgba(255, 255, 255, 0.8)",r.font=`${Math.floor(e*.04)}px system-ui, sans-serif`,r.textAlign="center",r.fillText(c,t/2,e-20)},P=()=>{let k=Date.now()-M;_[d](k),w(),u=requestAnimationFrame(P)};P();let H=s.captureStream(i),$=H.getVideoTracks()[0];return{track:$,stream:H,cleanup:()=>{cancelAnimationFrame(u),$.stop()}}}function U(o={}){let{frequency:t=440,volume:e=.1,waveType:i="sine",addVariation:n=!0,enabled:a=!1}=o,c=new AudioContext,d=c.createMediaStreamDestination(),s=c.createOscillator();s.type=i,s.frequency.value=t;let r=c.createGain();r.gain.value=a?e:0;let u=null,M=null;n&&(u=c.createOscillator(),u.frequency.value=.5,M=c.createGain(),M.gain.value=10,u.connect(M),M.connect(s.frequency),u.start()),s.connect(r),r.connect(d),s.start();let _=d.stream,w=_.getAudioTracks()[0];return{track:w,stream:_,setVolume:P=>{r.gain.value=Math.max(0,Math.min(1,P))},setEnabled:P=>{r.gain.value=P?e:0},cleanup:()=>{s.stop(),u?.stop(),c.close(),w.stop()}}}function O(o,t){let e=j(o),i=U(t),n=new MediaStream([e.track,i.track]);return{videoTrack:e.track,audioTrack:i.track,combinedStream:n,setAudioVolume:i.setVolume,setAudioEnabled:i.setEnabled,cleanup:()=>{e.cleanup(),i.cleanup()}}}function J(o){let t=N[o];return O(t.video,t.audio)}var N,v=F(()=>{"use strict";N={localCamera:{video:{width:640,height:480,animation:"avatar",label:"You",foregroundColor:"#4361ee"},audio:{enabled:!1}},agentCamera:{video:{width:640,height:480,animation:"avatar",label:"AI Agent",foregroundColor:"#22c55e",backgroundColor:"#0f172a"},audio:{enabled:!1,frequency:300}},screenShare:{video:{width:1920,height:1080,animation:"bars",label:"Screen Share",backgroundColor:"#0a0a0a",foregroundColor:"#f59e0b"},audio:{enabled:!1}},voiceOnly:{video:{width:320,height:240,animation:"wave",label:"Voice Call"},audio:{enabled:!1,volume:.05}}}});var Z={};L(Z,{MockByteStreamReader:()=>C,MockLocalParticipant:()=>T,MockParticipant:()=>b,MockRoom:()=>A,MockTextStreamReader:()=>x,MockTextStreamWriter:()=>E,MockTrack:()=>g,MockTrackPublication:()=>p,ParticipantKindValue:()=>R,createTextStream:()=>K});module.exports=Y(Z);var V=0;function h(o){return V++,`mock_${o}_${V}_${Date.now().toString(36)}`}var g=class{constructor(t,e,i,n){this.muted=!1;this.enabled=!0;this.attachedElements=new Set;this.kind=t,this.source=e,this.sid=h("TR"),this.mediaStreamTrack=i,this.mediaCleanup=n}get mediaTrack(){return this.mediaStreamTrack}attach(t){let e=t||document.createElement(this.kind==="video"?"video":"audio");if(this.mediaStreamTrack){let i=new MediaStream([this.mediaStreamTrack]);e.srcObject=i,e.autoplay=!0,this.kind==="video"&&(e.playsInline=!0,e.muted=!0)}return this.attachedElements.add(e),e}detach(t){if(t)return t.srcObject=null,this.attachedElements.delete(t),[t];let e=Array.from(this.attachedElements);for(let i of e)i.srcObject=null;return this.attachedElements.clear(),e}stop(){this.detach(),this.mediaCleanup&&this.mediaCleanup(),this.mediaStreamTrack&&this.mediaStreamTrack.stop(),this.enabled=!1}setMuted(t){this.muted=t,this.mediaStreamTrack&&(this.mediaStreamTrack.enabled=!t)}setEnabled(t){this.enabled=t,this.mediaStreamTrack&&(this.mediaStreamTrack.enabled=t)}},p=class{constructor(t,e){this.subscribed=!0;this.isEnabled=!0;this.track=t,this.trackSid=t.sid,this.trackName=e||`${t.kind}_${t.source}`,this.source=t.source,this.kind=t.kind}get isMuted(){return this.track?.muted??!1}get isSubscribed(){return this.subscribed&&this.track!==null}setSubscribed(t){this.subscribed=t}setEnabled(t){this.isEnabled=t,this.track&&(this.track.enabled=t)}setMuted(t){this.track&&this.track.setMuted(t)}};var T=class{constructor(t){this.identity="";this.sid="";this.name="";this.attributes={};this.kind="standard";this.trackPublications=new Map;this.audioTrackPublications=new Map;this.videoTrackPublications=new Map;this._cameraEnabled=!1;this._microphoneEnabled=!1;this._screenShareEnabled=!1;this.room=t,this.sid=h("PA"),this.joinedAt=new Date}get isCameraEnabled(){return this._cameraEnabled}get isMicrophoneEnabled(){return this._microphoneEnabled}get isScreenShareEnabled(){return this._screenShareEnabled}getTrackPublications(){return Array.from(this.trackPublications.values())}getTrackPublication(t){let i={camera:"camera",Camera:"camera",microphone:"microphone",Microphone:"microphone",screen_share:"screen_share",ScreenShare:"screen_share",screen_share_audio:"screen_share_audio",ScreenShareAudio:"screen_share_audio"}[t]||t;return this.trackPublications.get(i)}getTrackPublicationBySid(t){for(let e of this.trackPublications.values())if(e.trackSid===t)return e}setAttributes(t){this.attributes={...this.attributes,...t}}async setCameraEnabled(t,e){if(this._cameraEnabled=t,t){let{createSyntheticVideoTrack:n}=await Promise.resolve().then(()=>(v(),S)),{track:a,cleanup:c}=n({animation:"avatar",label:this.name||"Local Camera"}),d=new g("video","camera",a,c),s=new p(d,e?.name);return this.trackPublications.set("camera",s),this.videoTrackPublications.set(d.sid,s),this.room.emit("localTrackPublished",s,this),s}let i=this.trackPublications.get("camera");i&&(i.track?.stop(),this.trackPublications.delete("camera"),this.videoTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async setMicrophoneEnabled(t,e){if(this._microphoneEnabled=t,t){let{createSyntheticAudioTrack:n}=await Promise.resolve().then(()=>(v(),S)),{track:a,cleanup:c}=n({enabled:!1}),d=new g("audio","microphone",a,c),s=new p(d,e?.name);return this.trackPublications.set("microphone",s),this.audioTrackPublications.set(d.sid,s),this.room.emit("localTrackPublished",s,this),s}let i=this.trackPublications.get("microphone");i&&(i.track?.stop(),this.trackPublications.delete("microphone"),this.audioTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async setScreenShareEnabled(t,e){if(this._screenShareEnabled=t,t){let{createSyntheticVideoTrack:n}=await Promise.resolve().then(()=>(v(),S)),{track:a,cleanup:c}=n({animation:"bars",label:"Screen Share",width:1920,height:1080}),d=new g("video","screen_share",a,c),s=new p(d,e?.name||"screen");return this.trackPublications.set("screen_share",s),this.videoTrackPublications.set(d.sid,s),this.room.emit("localTrackPublished",s,this),s}let i=this.trackPublications.get("screen_share");i&&(i.track?.stop(),this.trackPublications.delete("screen_share"),this.videoTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async publishTrack(t,e){let i=new p(t,e?.name),n=e?.source||t.source;return this.trackPublications.set(n,i),t.kind==="audio"?this.audioTrackPublications.set(t.sid,i):t.kind==="video"&&this.videoTrackPublications.set(t.sid,i),this.room.emit("localTrackPublished",i,this),i}async unpublishTrack(t){t.stop();for(let[e,i]of this.trackPublications)if(i.track===t){this.trackPublications.delete(e),t.kind==="audio"?this.audioTrackPublications.delete(t.sid):t.kind==="video"&&this.videoTrackPublications.delete(t.sid),this.room.emit("localTrackUnpublished",i,this);break}}async sendText(t,e){return{id:h("msg")}}async publishData(t,e){}async setMetadata(t){this.attributes.metadata=t}async setName(t){this.name=t}cleanup(){for(let t of this.trackPublications.values())t.track?.stop();this.trackPublications.clear(),this.audioTrackPublications.clear(),this.videoTrackPublications.clear(),this._cameraEnabled=!1,this._microphoneEnabled=!1,this._screenShareEnabled=!1}};var R=(a=>(a[a.STANDARD=0]="STANDARD",a[a.INGRESS=1]="INGRESS",a[a.EGRESS=2]="EGRESS",a[a.SIP=3]="SIP",a[a.AGENT=4]="AGENT",a))(R||{});function X(o){switch(o){case"standard":return 0;case"ingress":return 1;case"egress":return 2;case"sip":return 3;case"agent":return 4;default:return 0}}var b=class{constructor(t,e,i={},n="standard"){this.connectionQuality="excellent";this.isSpeaking=!1;this.audioLevel=0;this.trackPublications=new Map;this.identity=t,this.sid=h("PA"),this.name=e,this.attributes=i,this._kindString=n,this.kind=X(n),this.joinedAt=new Date}get isAgent(){return this.kind===4||this.attributes["lk.agent.name"]!==void 0}get kindString(){return this._kindString}get isCameraEnabled(){let t=this.getTrackPublication("camera");return!!(t?.track&&!t.isMuted)}get isMicrophoneEnabled(){let t=this.getTrackPublication("microphone");return!!(t?.track&&!t.isMuted)}getTrackPublication(t){for(let e of this.trackPublications.values())if(e.source===t)return e}getTrackPublicationBySid(t){return this.trackPublications.get(t)}getTrackPublications(){return Array.from(this.trackPublications.values())}getAudioTracks(){return this.getTrackPublications().filter(t=>t.kind==="audio")}getVideoTracks(){return this.getTrackPublications().filter(t=>t.kind==="video")}addTrackPublication(t){this.trackPublications.set(t.trackSid,t)}removeTrackPublication(t){let e=this.trackPublications.get(t);return e&&(this.trackPublications.delete(t),e.track?.stop()),e}setAttributes(t){this.attributes={...this.attributes,...t}}getAttribute(t){return this.attributes[t]}startSpeaking(t=.5){this.isSpeaking=!0,this.audioLevel=t}stopSpeaking(){this.isSpeaking=!1,this.audioLevel=0}setConnectionQuality(t){this.connectionQuality=t}cleanup(){for(let t of this.trackPublications.values())t.track?.stop();this.trackPublications.clear()}};var A=class{constructor(t){this.remoteParticipants=new Map;this._state="disconnected";this.eventHandlers=new Map;this.textStreamHandlers=new Map;this.rpcHandlers=new Map;this.mockService=t,this.localParticipant=new T(this),this.sid=h("RM")}get state(){return this._state}set state(t){let e=this._state;this._state=t,e!==t&&this.emit("connectionStateChanged",t,e)}get numParticipants(){return this.remoteParticipants.size+1}get isConnected(){return this._state==="connected"}async connect(t,e){this._state="connecting",this.emit("connectionStateChanged","connecting","disconnected"),await this.mockService.simulateLatency(),this._state="connected",this.connectedAt=new Date().toISOString(),this.emit("connectionStateChanged","connected","connecting"),this.emit("connected")}async disconnect(){for(let e of this.remoteParticipants.values())e.cleanup();this.remoteParticipants.clear(),this.localParticipant.cleanup();let t=this._state;this._state="disconnected",this.emit("connectionStateChanged","disconnected",t),this.emit("disconnected"),this.eventHandlers.clear()}async reconnect(){this._state="reconnecting",this.emit("connectionStateChanged","reconnecting","connected"),await this.mockService.simulateLatency(),this._state="connected",this.emit("connectionStateChanged","connected","reconnecting"),this.emit("reconnected")}on(t,e){return this.eventHandlers.has(t)||this.eventHandlers.set(t,new Set),this.eventHandlers.get(t).add(e),this}once(t,e){let i=(...n)=>{this.off(t,i),e(...n)};return this.on(t,i)}off(t,e){return this.eventHandlers.get(t)?.delete(e),this}removeAllListeners(){this.eventHandlers.clear()}emit(t,...e){let i=this.eventHandlers.get(t);if(i)for(let n of i)try{n(...e)}catch(a){console.error(`Error in mock room event handler for ${t}:`,a)}}registerRpcMethod(t,e){this.rpcHandlers.set(t,e)}unregisterRpcMethod(t){this.rpcHandlers.delete(t)}async callRpc(t,e,i,n=1e4){let a=this.rpcHandlers.get(t);if(!a)throw new Error(`RPC method not found: ${t}`);return a({callerIdentity:e,payload:i,responseTimeout:n})}registerTextStreamHandler(t,e){this.textStreamHandlers.set(t,e)}unregisterTextStreamHandler(t){this.textStreamHandlers.delete(t)}simulateTextStream(t,e){let i=this.textStreamHandlers.get(t);i&&i(e,{identity:e.participantIdentity})}getParticipantByIdentity(t){return t===this.localParticipant.identity?new b(this.localParticipant.identity,this.localParticipant.name,this.localParticipant.attributes):this.remoteParticipants.get(t)}getParticipantBySid(t){if(t===this.localParticipant.sid)return new b(this.localParticipant.identity,this.localParticipant.name,this.localParticipant.attributes);for(let e of this.remoteParticipants.values())if(e.sid===t)return e}async simulateParticipantJoin(t,e){let i=new b(t,e?.name,e?.attributes||{},e?.kind||"standard");return this.remoteParticipants.set(t,i),this.emit("participantConnected",i),e?.withCamera&&await this.simulateRemoteTrack(t,"video","camera"),e?.withMicrophone&&await this.simulateRemoteTrack(t,"audio","microphone"),i}simulateParticipantLeave(t){let e=this.remoteParticipants.get(t);if(e){for(let i of e.getTrackPublications())i.track?.stop(),this.emit("trackUnsubscribed",i.track,i,e);this.remoteParticipants.delete(t),this.emit("participantDisconnected",e)}}async simulateRemoteTrack(t,e,i){let n=this.remoteParticipants.get(t);if(!n)return;let a,c;if(e==="video"){let{createSyntheticVideoTrack:r}=await Promise.resolve().then(()=>(v(),S)),u=r({animation:n.isAgent?"avatar":"pulse",label:n.name||t,foregroundColor:n.isAgent?"#22c55e":"#4361ee"});a=u.track,c=u.cleanup}else if(e==="audio"){let{createSyntheticAudioTrack:r}=await Promise.resolve().then(()=>(v(),S)),u=r({enabled:!1});a=u.track,c=u.cleanup}let d=new g(e,i,a,c),s=new p(d);return n.addTrackPublication(s),this.emit("trackSubscribed",d,s,n),this.emit("trackPublished",s,n),d}simulateTrackUnpublished(t,e){let i=this.remoteParticipants.get(t);if(!i)return;let n=i.getTrackPublication(e);n&&(i.removeTrackPublication(n.trackSid),this.emit("trackUnpublished",n,i),this.emit("trackUnsubscribed",n.track,n,i))}async simulateAgentJoin(t,e="AI Agent"){return this.simulateParticipantJoin(t,{name:e,kind:"agent",withCamera:!0,withMicrophone:!0,attributes:{"lk.agent.name":e,"lk.agent.state":"active"}})}simulateAttributeChange(t,e){let i=this.remoteParticipants.get(t);if(i){let n={...i.attributes};i.setAttributes(e),this.emit("participantAttributesChanged",e,n,i)}}simulateTrackMuted(t,e,i){let n=this.remoteParticipants.get(t);if(!n)return;let a=n.getTrackPublication(e);a?.track&&(a.track.setMuted(i),this.emit(i?"trackMuted":"trackUnmuted",a,n))}simulateActiveSpeakersChanged(t){let e=[];for(let i of t){let n=this.remoteParticipants.get(i);n&&(n.startSpeaking(),e.push(n))}this.emit("activeSpeakersChanged",e)}simulateDataReceived(t,e,i,n){let a=this.remoteParticipants.get(e);this.emit("dataReceived",t,a,i,n)}};var x=class{constructor(t,e,i,n,a){this.index=0;this._complete=!1;this.info={id:t,attributes:n,topic:a,timestamp:Date.now()},this.participantIdentity=e,this.topic=a,this.chunks=Array.isArray(i)?i:[i],this.info.totalSize=this.chunks.reduce((c,d)=>c+d.length,0)}get isComplete(){return this._complete}async*[Symbol.asyncIterator](){for(let t of this.chunks)yield t;this._complete=!0}async read(){return this.index>=this.chunks.length?(this._complete=!0,null):this.chunks[this.index++]}async readAll(){let t=this.chunks.slice(this.index).join("");return this.index=this.chunks.length,this._complete=!0,t}cancel(){this._complete=!0}},E=class{constructor(t,e){this.chunks=[];this._closed=!1;this.id=h("stream"),this._topic=t,this._destinationIdentities=e}get isClosed(){return this._closed}get topic(){return this._topic}get destinationIdentities(){return this._destinationIdentities}get content(){return this.chunks.join("")}onWrite(t){this.onWriteCallback=t}async write(t){if(this._closed)throw new Error("Stream is closed");this.chunks.push(t),this.onWriteCallback?.(t)}async close(){this._closed=!0}},C=class{constructor(t,e,i){this._index=0;this.info={id:t,timestamp:Date.now()},this.participantIdentity=e,this.chunks=Array.isArray(i)?i:[i]}get index(){return this._index}async*[Symbol.asyncIterator](){for(let t of this.chunks)yield t}async readAll(){let t=this.chunks.reduce((n,a)=>n+a.length,0),e=new Uint8Array(t),i=0;for(let n of this.chunks)e.set(n,i),i+=n.length;return e}};function K(o,t,e){return new x(e?.id||h("stream"),o,t,e?.attributes,e?.topic)}0&&(module.exports={MockByteStreamReader,MockLocalParticipant,MockParticipant,MockRoom,MockTextStreamReader,MockTextStreamWriter,MockTrack,MockTrackPublication,ParticipantKindValue,createTextStream});
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.179 | © 2026 Onlive.ai */
|
|
2
|
+
export { MockLocalParticipant, MockPublishOptions } from './local-participant.cjs';
|
|
3
|
+
export { MockConnectionQuality, MockParticipant, MockParticipantKind, ParticipantKindValue } from './participant.cjs';
|
|
4
|
+
export { MockConnectionState, MockEventHandler, MockRoom, MockRpcHandler, MockTextStreamHandler, SimulateParticipantOptions } from './room.cjs';
|
|
5
|
+
export { MockByteStreamReader, MockTextStreamInfo, MockTextStreamReader, MockTextStreamWriter, createTextStream } from './streams.cjs';
|
|
6
|
+
export { MockTrack, MockTrackPublication } from './tracks.cjs';
|
|
7
|
+
export { MockTrackKind, MockTrackSource } from '../types.cjs';
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.179 | © 2026 Onlive.ai */
|
|
2
|
+
export { MockLocalParticipant, MockPublishOptions } from './local-participant.js';
|
|
3
|
+
export { MockConnectionQuality, MockParticipant, MockParticipantKind, ParticipantKindValue } from './participant.js';
|
|
4
|
+
export { MockConnectionState, MockEventHandler, MockRoom, MockRpcHandler, MockTextStreamHandler, SimulateParticipantOptions } from './room.js';
|
|
5
|
+
export { MockByteStreamReader, MockTextStreamInfo, MockTextStreamReader, MockTextStreamWriter, createTextStream } from './streams.js';
|
|
6
|
+
export { MockTrack, MockTrackPublication } from './tracks.js';
|
|
7
|
+
export { MockTrackKind, MockTrackSource } from '../types.js';
|