@onlive.ai/common-121 0.2.163 → 0.2.184
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/audi-dark.theme-B8g9SRrd.d.cts +11 -0
- package/audi-dark.theme-B8g9SRrd.d.ts +11 -0
- package/audi.theme-CbqEkKLD.d.cts +11 -0
- package/audi.theme-CbqEkKLD.d.ts +11 -0
- package/australia.theme-Cs0cygOQ.d.cts +11 -0
- package/australia.theme-Cs0cygOQ.d.ts +11 -0
- package/chunk-UTOVVCSU.js +2 -0
- package/components/asset/asset-modal-portal.cjs +1 -1
- package/components/asset/asset-modal-portal.d.cts +1 -1
- package/components/asset/asset-modal-portal.d.ts +1 -1
- package/components/asset/asset-modal-portal.js +1 -1
- package/components/asset/asset.cjs +4 -4
- package/components/asset/asset.d.cts +1 -1
- package/components/asset/asset.d.ts +1 -1
- package/components/asset/asset.js +13 -13
- package/components/asset/asset.loaders.cjs +1 -1
- package/components/asset/asset.loaders.d.cts +1 -1
- package/components/asset/asset.loaders.d.ts +1 -1
- package/components/asset/asset.loaders.js +1 -1
- package/components/asset/asset.renderer.cjs +4 -4
- package/components/asset/asset.renderer.d.cts +1 -1
- package/components/asset/asset.renderer.d.ts +1 -1
- package/components/asset/asset.renderer.js +10 -10
- package/components/asset/asset.styles.cjs +1 -1
- package/components/asset/asset.styles.d.cts +1 -1
- package/components/asset/asset.styles.d.ts +1 -1
- package/components/asset/asset.styles.js +1 -1
- package/components/asset/asset.types.cjs +1 -1
- package/components/asset/asset.types.d.cts +1 -1
- package/components/asset/asset.types.d.ts +1 -1
- package/components/asset/asset.types.js +1 -1
- package/components/asset/index.cjs +4 -4
- package/components/asset/index.d.cts +1 -1
- package/components/asset/index.d.ts +1 -1
- package/components/asset/index.js +13 -13
- package/components/player/player.cjs +1 -1
- package/components/player/player.d.cts +1 -1
- package/components/player/player.d.ts +1 -1
- package/components/player/player.js +1 -1
- package/components/player/player.styles.cjs +1 -1
- package/components/player/player.styles.d.cts +1 -1
- package/components/player/player.styles.d.ts +1 -1
- package/components/player/player.styles.js +1 -1
- package/components/side-bar/index.cjs +1 -1
- package/components/side-bar/index.d.cts +1 -1
- package/components/side-bar/index.d.ts +1 -1
- package/components/side-bar/index.js +1 -1
- package/components/side-bar/side-bar.cjs +1 -1
- package/components/side-bar/side-bar.d.cts +1 -1
- package/components/side-bar/side-bar.d.ts +1 -1
- package/components/side-bar/side-bar.js +1 -1
- package/components/side-bar/side-bar.styles.cjs +1 -1
- package/components/side-bar/side-bar.styles.d.cts +1 -1
- package/components/side-bar/side-bar.styles.d.ts +1 -1
- package/components/side-bar/side-bar.styles.js +1 -1
- package/components/side-bar/side-bar.types.cjs +1 -1
- package/components/side-bar/side-bar.types.d.cts +1 -1
- package/components/side-bar/side-bar.types.d.ts +1 -1
- package/components/side-bar/side-bar.types.js +1 -1
- package/components/upload/index.cjs +1 -1
- package/components/upload/index.d.cts +1 -1
- package/components/upload/index.d.ts +1 -1
- package/components/upload/index.js +1 -1
- package/components/upload/upload.cjs +1 -1
- package/components/upload/upload.d.cts +1 -1
- package/components/upload/upload.d.ts +1 -1
- package/components/upload/upload.js +1 -1
- package/components/upload/upload.styles.cjs +1 -1
- package/components/upload/upload.styles.d.cts +1 -1
- package/components/upload/upload.styles.d.ts +1 -1
- package/components/upload/upload.styles.js +1 -1
- package/components/upload/upload.types.cjs +1 -1
- package/components/upload/upload.types.d.cts +1 -1
- package/components/upload/upload.types.d.ts +1 -1
- package/components/upload/upload.types.js +1 -1
- package/cuernavaca.theme-0UFX1MeG.d.cts +11 -0
- package/cuernavaca.theme-0UFX1MeG.d.ts +11 -0
- package/cupra-diagonal.theme-DVrQr2iv.d.cts +11 -0
- package/cupra-diagonal.theme-DVrQr2iv.d.ts +11 -0
- package/cupra-events.theme-D2xJeafa.d.cts +11 -0
- package/cupra-events.theme-D2xJeafa.d.ts +11 -0
- package/cupra.theme-CqgKWLYE.d.cts +11 -0
- package/cupra.theme-CqgKWLYE.d.ts +11 -0
- package/germany.theme-CnwD309P.d.cts +11 -0
- package/germany.theme-CnwD309P.d.ts +11 -0
- package/hyundai.theme-E2ZiyZmJ.d.cts +11 -0
- package/hyundai.theme-E2ZiyZmJ.d.ts +11 -0
- package/index.cjs +276 -276
- package/index.d.cts +4134 -3
- package/index.d.ts +4134 -3
- package/index.js +280 -280
- package/italy.theme-BjfPp7rU.d.cts +11 -0
- package/italy.theme-BjfPp7rU.d.ts +11 -0
- package/magimix.theme-7cd19P1X.d.cts +11 -0
- package/magimix.theme-7cd19P1X.d.ts +11 -0
- package/media-SB4RDT6E.js +2 -0
- package/onlive-ai.theme-CASPoRHr.d.cts +11 -0
- package/onlive-ai.theme-CASPoRHr.d.ts +11 -0
- package/onlive.theme-nKZQHG1I.d.cts +11 -0
- package/onlive.theme-nKZQHG1I.d.ts +11 -0
- package/package.json +13 -9
- package/react/components/asset/Asset.cjs +1 -1
- package/react/components/asset/Asset.jsx +1 -1
- package/react/components/side-bar/SideBar.cjs +1 -1
- package/react/components/side-bar/SideBar.jsx +1 -1
- package/react/components/upload/Upload.cjs +1 -1
- package/react/components/upload/Upload.jsx +1 -1
- package/seat-cupra.theme-B4ylEjOZ.d.cts +11 -0
- package/seat-cupra.theme-B4ylEjOZ.d.ts +11 -0
- package/services/audio.service.cjs +1 -1
- package/services/audio.service.d.cts +1 -1
- package/services/audio.service.d.ts +1 -1
- package/services/audio.service.js +1 -1
- package/services/conversation/conversation.service.cjs +2 -2
- package/services/conversation/conversation.service.d.cts +26 -3
- package/services/conversation/conversation.service.d.ts +26 -3
- package/services/conversation/conversation.service.js +2 -2
- package/services/conversation/conversation.types.cjs +2 -2
- package/services/conversation/conversation.types.d.cts +120 -4
- package/services/conversation/conversation.types.d.ts +120 -4
- package/services/conversation/conversation.types.js +2 -2
- package/services/conversation/index.cjs +2 -2
- package/services/conversation/index.d.cts +19 -2
- package/services/conversation/index.d.ts +19 -2
- package/services/conversation/index.js +2 -2
- 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 +305 -0
- package/services/conversation/mock/service.d.ts +305 -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 +1 -1
- package/services/faqs/faqs.service.d.cts +1 -1
- package/services/faqs/faqs.service.d.ts +1 -1
- package/services/faqs/faqs.service.js +1 -1
- package/services/faqs/faqs.types.cjs +1 -1
- package/services/faqs/faqs.types.d.cts +1 -1
- package/services/faqs/faqs.types.d.ts +1 -1
- package/services/faqs/faqs.types.js +1 -1
- package/services/faqs/index.cjs +1 -1
- package/services/faqs/index.d.cts +1 -1
- package/services/faqs/index.d.ts +1 -1
- package/services/faqs/index.js +1 -1
- package/services/file/file.service.cjs +1 -1
- package/services/file/file.service.d.cts +1 -1
- package/services/file/file.service.d.ts +1 -1
- package/services/file/file.service.js +1 -1
- package/services/file/file.types.cjs +1 -1
- package/services/file/file.types.d.cts +1 -1
- package/services/file/file.types.d.ts +1 -1
- package/services/file/file.types.js +1 -1
- package/services/file/index.cjs +1 -1
- package/services/file/index.d.cts +1 -1
- package/services/file/index.d.ts +1 -1
- package/services/file/index.js +1 -1
- package/services/firebase/firebase-api.cjs +1 -1
- package/services/firebase/firebase-api.d.cts +1 -1
- package/services/firebase/firebase-api.d.ts +1 -1
- package/services/firebase/firebase-api.js +1 -1
- package/services/multimedia/config.example.cjs +1 -1
- package/services/multimedia/config.example.d.cts +1 -1
- package/services/multimedia/config.example.d.ts +1 -1
- package/services/multimedia/config.example.js +1 -1
- package/services/multimedia/index.cjs +1 -1
- package/services/multimedia/index.d.cts +1 -1
- package/services/multimedia/index.d.ts +1 -1
- package/services/multimedia/index.js +1 -1
- package/services/multimedia/multimedia.service.cjs +1 -1
- package/services/multimedia/multimedia.service.d.cts +1 -1
- package/services/multimedia/multimedia.service.d.ts +1 -1
- package/services/multimedia/multimedia.service.js +1 -1
- package/services/multimedia/multimedia.types.cjs +1 -1
- package/services/multimedia/multimedia.types.d.cts +1 -1
- package/services/multimedia/multimedia.types.d.ts +1 -1
- package/services/multimedia/multimedia.types.js +1 -1
- package/services/product/index.cjs +1 -1
- package/services/product/index.d.cts +1 -1
- package/services/product/index.d.ts +1 -1
- package/services/product/index.js +1 -1
- package/services/product/product.service.cjs +1 -1
- package/services/product/product.service.d.cts +1 -1
- package/services/product/product.service.d.ts +1 -1
- package/services/product/product.service.js +1 -1
- package/services/product/product.types.cjs +1 -1
- package/services/product/product.types.d.cts +1 -1
- package/services/product/product.types.d.ts +1 -1
- package/services/product/product.types.js +1 -1
- package/services/request.provider.cjs +1 -1
- package/services/request.provider.d.cts +1 -1
- package/services/request.provider.d.ts +1 -1
- package/services/request.provider.js +1 -1
- package/services/session.service.cjs +2 -2
- package/services/session.service.d.cts +1 -1
- package/services/session.service.d.ts +1 -1
- package/services/session.service.js +2 -2
- package/services/upload/index.cjs +1 -1
- package/services/upload/index.d.cts +1 -1
- package/services/upload/index.d.ts +1 -1
- package/services/upload/index.js +1 -1
- package/services/upload/upload.service.cjs +1 -1
- package/services/upload/upload.service.d.cts +1 -1
- package/services/upload/upload.service.d.ts +1 -1
- package/services/upload/upload.service.js +1 -1
- package/themes/custom/audi-dark.theme.cjs +920 -0
- package/themes/custom/audi-dark.theme.d.cts +3 -0
- package/themes/custom/audi-dark.theme.d.ts +3 -0
- package/themes/custom/audi-dark.theme.js +920 -0
- package/themes/custom/audi.theme.cjs +777 -0
- package/themes/custom/audi.theme.d.cts +3 -0
- package/themes/custom/audi.theme.d.ts +3 -0
- package/themes/custom/audi.theme.js +777 -0
- package/themes/custom/australia.theme.cjs +386 -0
- package/themes/custom/australia.theme.d.cts +3 -0
- package/themes/custom/australia.theme.d.ts +3 -0
- package/themes/custom/australia.theme.js +386 -0
- package/themes/custom/cuernavaca.theme.cjs +196 -0
- package/themes/custom/cuernavaca.theme.d.cts +3 -0
- package/themes/custom/cuernavaca.theme.d.ts +3 -0
- package/themes/custom/cuernavaca.theme.js +196 -0
- package/themes/custom/cupra-diagonal.theme.cjs +1029 -0
- package/themes/custom/cupra-diagonal.theme.d.cts +3 -0
- package/themes/custom/cupra-diagonal.theme.d.ts +3 -0
- package/themes/custom/cupra-diagonal.theme.js +1029 -0
- package/themes/custom/cupra-events.theme.cjs +555 -0
- package/themes/custom/cupra-events.theme.d.cts +3 -0
- package/themes/custom/cupra-events.theme.d.ts +3 -0
- package/themes/custom/cupra-events.theme.js +555 -0
- package/themes/custom/cupra.theme.cjs +147 -0
- package/themes/custom/cupra.theme.d.cts +3 -0
- package/themes/custom/cupra.theme.d.ts +3 -0
- package/themes/custom/cupra.theme.js +147 -0
- package/themes/custom/germany.theme.cjs +716 -0
- package/themes/custom/germany.theme.d.cts +3 -0
- package/themes/custom/germany.theme.d.ts +3 -0
- package/themes/custom/germany.theme.js +716 -0
- package/themes/custom/hyundai.theme.cjs +294 -0
- package/themes/custom/hyundai.theme.d.cts +3 -0
- package/themes/custom/hyundai.theme.d.ts +3 -0
- package/themes/custom/hyundai.theme.js +294 -0
- package/themes/custom/italy.theme.cjs +850 -0
- package/themes/custom/italy.theme.d.cts +3 -0
- package/themes/custom/italy.theme.d.ts +3 -0
- package/themes/custom/italy.theme.js +850 -0
- package/themes/custom/magimix.theme.cjs +119 -0
- package/themes/custom/magimix.theme.d.cts +3 -0
- package/themes/custom/magimix.theme.d.ts +3 -0
- package/themes/custom/magimix.theme.js +119 -0
- package/themes/custom/onlive-ai.theme.cjs +74 -0
- package/themes/custom/onlive-ai.theme.d.cts +3 -0
- package/themes/custom/onlive-ai.theme.d.ts +3 -0
- package/themes/custom/onlive-ai.theme.js +74 -0
- package/themes/custom/onlive.theme.cjs +33 -0
- package/themes/custom/onlive.theme.d.cts +3 -0
- package/themes/custom/onlive.theme.d.ts +3 -0
- package/themes/custom/onlive.theme.js +33 -0
- package/themes/custom/seat-cupra.theme.cjs +478 -0
- package/themes/custom/seat-cupra.theme.d.cts +3 -0
- package/themes/custom/seat-cupra.theme.d.ts +3 -0
- package/themes/custom/seat-cupra.theme.js +478 -0
- package/themes/dark.cjs +13 -2
- package/themes/dark.d.cts +1 -1
- package/themes/dark.d.ts +1 -1
- package/themes/dark.js +12 -1
- package/themes/light.cjs +13 -2
- package/themes/light.d.cts +1 -1
- package/themes/light.d.ts +1 -1
- package/themes/light.js +12 -1
- package/types/globals.cjs +1 -1
- package/types/globals.d.cts +1 -1
- package/types/globals.d.ts +1 -1
- package/types/globals.js +1 -1
- package/types/tracking-options.cjs +1 -1
- package/types/tracking-options.d.cts +1 -1
- package/types/tracking-options.d.ts +1 -1
- package/types/tracking-options.js +1 -1
- package/utils/adopt-styles.cjs +1 -1
- package/utils/adopt-styles.d.cts +1 -1
- package/utils/adopt-styles.d.ts +1 -1
- package/utils/adopt-styles.js +1 -1
- package/utils/apply-optional-styles.cjs +6548 -0
- package/utils/apply-optional-styles.d.cts +47 -0
- package/utils/apply-optional-styles.d.ts +47 -0
- package/utils/apply-optional-styles.js +6548 -0
- package/utils/browser-preferences.cjs +1 -1
- package/utils/browser-preferences.d.cts +1 -1
- package/utils/browser-preferences.d.ts +1 -1
- package/utils/browser-preferences.js +1 -1
- package/utils/classify-media.cjs +1 -1
- package/utils/classify-media.d.cts +1 -1
- package/utils/classify-media.d.ts +1 -1
- package/utils/classify-media.js +1 -1
- package/utils/decorators.cjs +1 -1
- package/utils/decorators.d.cts +1 -1
- package/utils/decorators.d.ts +1 -1
- package/utils/decorators.js +1 -1
- package/utils/detected-lang.cjs +1 -1
- package/utils/detected-lang.d.cts +1 -1
- package/utils/detected-lang.d.ts +1 -1
- package/utils/detected-lang.js +1 -1
- package/utils/fullscreen.cjs +1 -1
- package/utils/fullscreen.d.cts +1 -1
- package/utils/fullscreen.d.ts +1 -1
- package/utils/fullscreen.js +1 -1
- package/utils/insert-script.cjs +1 -1
- package/utils/insert-script.d.cts +1 -1
- package/utils/insert-script.d.ts +1 -1
- package/utils/insert-script.js +1 -1
- package/utils/is-map-compatible.cjs +1 -1
- package/utils/is-map-compatible.d.cts +1 -1
- package/utils/is-map-compatible.d.ts +1 -1
- package/utils/is-map-compatible.js +1 -1
- package/utils/markdown.cjs +1 -1
- package/utils/markdown.d.cts +1 -1
- package/utils/markdown.d.ts +1 -1
- package/utils/markdown.js +1 -1
- package/utils/merge.cjs +1 -1
- package/utils/merge.d.cts +1 -1
- package/utils/merge.d.ts +1 -1
- package/utils/merge.js +1 -1
- package/utils/multiband-track-volume.cjs +1 -1
- package/utils/multiband-track-volume.d.cts +1 -1
- package/utils/multiband-track-volume.d.ts +1 -1
- package/utils/multiband-track-volume.js +1 -1
- package/utils/onlive-url-params.cjs +1 -1
- package/utils/onlive-url-params.d.cts +1 -1
- package/utils/onlive-url-params.d.ts +1 -1
- package/utils/onlive-url-params.js +1 -1
- package/utils/pretty-distance.cjs +1 -1
- package/utils/pretty-distance.d.cts +1 -1
- package/utils/pretty-distance.d.ts +1 -1
- package/utils/pretty-distance.js +1 -1
- package/utils/pretty-time.cjs +1 -1
- package/utils/pretty-time.d.cts +1 -1
- package/utils/pretty-time.d.ts +1 -1
- package/utils/pretty-time.js +1 -1
- package/utils/random-string.cjs +1 -1
- package/utils/random-string.d.cts +1 -1
- package/utils/random-string.d.ts +1 -1
- package/utils/random-string.js +1 -1
- package/utils/resource-type.cjs +1 -1
- package/utils/resource-type.d.cts +1 -1
- package/utils/resource-type.d.ts +1 -1
- package/utils/resource-type.js +1 -1
- package/utils/round-number.cjs +1 -1
- package/utils/round-number.d.cts +1 -1
- package/utils/round-number.d.ts +1 -1
- package/utils/round-number.js +1 -1
- package/utils/safe-html.cjs +2 -2
- package/utils/safe-html.d.cts +9 -2
- package/utils/safe-html.d.ts +9 -2
- package/utils/safe-html.js +2 -2
- package/utils/sanitize.cjs +1 -1
- package/utils/sanitize.d.cts +1 -1
- package/utils/sanitize.d.ts +1 -1
- package/utils/sanitize.js +1 -1
- package/utils/spread.cjs +1 -1
- package/utils/spread.d.cts +1 -1
- package/utils/spread.d.ts +1 -1
- package/utils/spread.js +1 -1
- package/utils/watch.cjs +1 -1
- package/utils/watch.d.cts +1 -1
- package/utils/watch.d.ts +1 -1
- package/utils/watch.js +1 -1
- package/react/components/asset/Asset.d.cts +0 -33
- package/react/components/asset/Asset.d.ts +0 -33
- package/react/components/side-bar/SideBar.d.cts +0 -37
- package/react/components/side-bar/SideBar.d.ts +0 -37
- package/react/components/upload/Upload.d.cts +0 -23
- package/react/components/upload/Upload.d.ts +0 -23
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.184 | © 2026 Onlive.ai */
|
|
2
|
+
var qt=Object.defineProperty;var Ht=(r,t)=>()=>(r&&(t=r(r=0)),t);var $t=(r,t)=>{for(var e in t)qt(r,e,{get:t[e],enumerable:!0})};var N={};$t(N,{SYNTHETIC_MEDIA_PRESETS:()=>ft,createSyntheticAudioTrack:()=>ht,createSyntheticMedia:()=>kt,createSyntheticMediaFromPreset:()=>_t,createSyntheticVideoTrack:()=>mt});function mt(r={}){let{width:t=640,height:e=480,fps:i=30,backgroundColor:n="#1a1a2e",foregroundColor:s="#4361ee",label:a="Mock Video",animation:o="wave"}=r,d=document.createElement("canvas");d.width=t,d.height=e;let c=d.getContext("2d"),p,L=Date.now(),K={wave:y=>{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 f=e/2+Math.sin(h/t*4*Math.PI+y*.002)*(e/4);h===0?c.moveTo(h,f):c.lineTo(h,f)}c.stroke()},pulse:y=>{c.fillStyle=n,c.fillRect(0,0,t,e);let h=Math.sin(y*.003)*.3+.7,f=Math.min(t,e)*.3*h;c.beginPath(),c.arc(t/2,e/2,f,0,Math.PI*2),c.fillStyle=s,c.fill()},bars:y=>{c.fillStyle=n,c.fillRect(0,0,t,e);let h=20,f=t/h,O=e*.7;c.fillStyle=s;for(let $=0;$<h;$++){let St=Math.abs(Math.sin($/h*Math.PI*2+y*.004))*O,Ut=$*f,Nt=e-St;c.fillRect(Ut+2,Nt,f-4,St)}},avatar:y=>{c.fillStyle=n,c.fillRect(0,0,t,e);let h=t/2,f=e/2-20,O=Math.min(t,e)*.15;c.beginPath(),c.arc(h,f,O,0,Math.PI*2),c.fillStyle=s,c.fill(),c.beginPath(),c.ellipse(h,f+O*2.2,O*1.5,O,0,Math.PI,0),c.fill(),Math.sin(y*.01)>0&&(c.beginPath(),c.arc(h,f+O*3,5+Math.sin(y*.02)*3,0,Math.PI*2),c.fillStyle="#22c55e",c.fill())},none:()=>{c.fillStyle=n,c.fillRect(0,0,t,e)}},V=()=>{c.fillStyle="rgba(255, 255, 255, 0.8)",c.font=`${Math.floor(e*.04)}px system-ui, sans-serif`,c.textAlign="center",c.fillText(a,t/2,e-20)},D=()=>{let y=Date.now()-L;K[o](y),V(),p=requestAnimationFrame(D)};D();let yt=d.captureStream(i),Mt=yt.getVideoTracks()[0];return{track:Mt,stream:yt,cleanup:()=>{cancelAnimationFrame(p),Mt.stop()}}}function ht(r={}){let{frequency:t=440,volume:e=.1,waveType:i="sine",addVariation:n=!0,enabled:s=!1}=r,a=new AudioContext,o=a.createMediaStreamDestination(),d=a.createOscillator();d.type=i,d.frequency.value=t;let c=a.createGain();c.gain.value=s?e:0;let p=null,L=null;n&&(p=a.createOscillator(),p.frequency.value=.5,L=a.createGain(),L.gain.value=10,p.connect(L),L.connect(d.frequency),p.start()),d.connect(c),c.connect(o),d.start();let K=o.stream,V=K.getAudioTracks()[0];return{track:V,stream:K,setVolume:D=>{c.gain.value=Math.max(0,Math.min(1,D))},setEnabled:D=>{c.gain.value=D?e:0},cleanup:()=>{d.stop(),p?.stop(),a.close(),V.stop()}}}function kt(r,t){let e=mt(r),i=ht(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 _t(r){let t=ft[r];return kt(t.video,t.audio)}var ft,_=Ht(()=>{"use strict";ft={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 ct=0;function dt(){ct=0}function g(r){return ct++,`mock_${r}_${ct}_${Date.now().toString(36)}`}function x(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 J(r){return`wss://mock-livekit.local/room/${r}`}var B={responseStrategy:"echo",responseDelayMs:100,cannedResponses:[],type:"text",nature:"ai",simulateTyping:!1,typingDelayPerChar:20};function G(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 U=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={...B,...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=G(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))}};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)}},R=class extends l{constructor(t){super("ROOM_NOT_FOUND",`Room not found: ${t}`,{roomId:t}),this.name="RoomNotFoundError"}},W=class extends l{constructor(t){super("ROOM_ENDED",`Room has ended: ${t}`,{roomId:t}),this.name="RoomEndedError"}},Q=class extends l{constructor(t,e){super("PARTICIPANT_ALREADY_JOINED",`Participant ${t} is already in room ${e}`,{identity:t,roomId:e}),this.name="ParticipantAlreadyJoinedError"}},X=class extends l{constructor(t){super("PARTICIPANT_NOT_FOUND",`Participant not found: ${t}`,{identity:t}),this.name="ParticipantNotFoundError"}},Y=class extends l{constructor(t){super("TRACK_NOT_FOUND",`Track not found: ${t}`,{trackId:t}),this.name="TrackNotFoundError"}},Z=class extends l{constructor(t){super("AGENT_NOT_FOUND",`Agent not found: ${t}`,{agentId:t}),this.name="AgentNotFoundError"}},tt=class extends l{constructor(t="Unauthorized"){super("UNAUTHORIZED",t),this.name="UnauthorizedError"}},et=class extends l{constructor(t="Network error occurred"){super("NETWORK_ERROR",t),this.name="NetworkError"}},it=class extends l{constructor(t,e){super("INVALID_OPERATION",t,e),this.name="InvalidOperationError"}},nt=class extends l{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 R(r.details?.roomId??"unknown");case"ROOM_ENDED":return new W(r.details?.roomId??"unknown");case"PARTICIPANT_ALREADY_JOINED":return new Q(r.details?.identity??"unknown",r.details?.roomId??"unknown");case"PARTICIPANT_NOT_FOUND":return new X(r.details?.identity??"unknown");case"TRACK_NOT_FOUND":return new Y(r.details?.trackId??"unknown");case"AGENT_NOT_FOUND":return new Z(r.details?.agentId??"unknown");case"UNAUTHORIZED":return new tt(r.message);case"NETWORK_ERROR":return new et(r.message);case"INVALID_OPERATION":return new it(r.message,r.details);case"TIMEOUT":return new nt(r.details?.operation??"unknown",r.details?.timeoutMs??0);default:return l.fromMockError(r)}}function P(r){return typeof r=="object"&&r!==null&&"code"in r&&"message"in r&&typeof r.code=="string"&&typeof r.message=="string"}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}};import{Session as lt}from"@onlive.ai/tracker/session";import{Room as re,RoomEvent as ut}from"livekit-client";import{initializeApp as jt}from"firebase/app";import{query as T,endAt as Ft,equalTo as Kt,get as bt,getDatabase as Vt,limitToFirst as Jt,limitToLast as Bt,onChildAdded as Rt,onChildChanged as Pt,onChildRemoved as Tt,onDisconnect as At,onValue as Ct,orderByChild as Gt,orderByKey as Wt,orderByValue as Qt,push as Xt,ref as Yt,remove as Zt,runTransaction as te,set as It,startAt as ee,update as ie}from"firebase/database";var rt=class{constructor(t){this.onChildChanged=(t,e)=>Pt(this.ref(t),i=>e(i.key||"",i.val(),i));this.onChildRemoved=(t,e)=>Tt(this.ref(t),i=>e(i.key||"",i.val(),i));this.onChildChangedQuery=(t,e)=>Pt(t,i=>e(i.key||"",i.val(),i));this.onChildRemovedQuery=(t,e)=>Tt(t,i=>e(i.key||"",i.val(),i));let e=jt(t.config);this.db=Vt(e)}ref(t){return Yt(this.db,t)}async getOnce(t){let e=await bt(this.ref(t));return e.exists()?e.val():null}async getOnceQuery(t){let e=await bt(t),i=[];return e.exists()&&e.forEach(n=>{i.push({key:n.key||"",value:n.val()})}),i}onValue(t,e){return Ct(this.ref(t),i=>e(i.key??"",i.val(),i),i=>console.error("onValue error",i))}onValueQuery(t,e){return Ct(t,i=>e(i.key??"",i.val(),i),i=>console.error("onValueQuery error",i))}onChildAdded(t,e){return Rt(this.ref(t),i=>e(i.key||"",i.val(),i),i=>console.error("onChildAdded error",i))}onChildAddedQuery(t,e){return Rt(t,i=>e(i.key||"",i.val(),i),i=>console.error("onChildAddedQuery error",i))}write(t,e){return It(this.ref(t),e)}update(t,e){return ie(this.ref(t),e)}remove(t){return Zt(this.ref(t))}async push(t,e){let i=Xt(this.ref(t));return await It(i,e),i.key}onDisconnectUpdate(t,e){return At(this.ref(t)).update(e)}cancelOnDisconnect(t){return At(this.ref(t)).cancel()}transaction(t,e){return te(this.ref(t),i=>e(i))}query(t,e={}){let i=this.ref(t);return e.orderBy==="child"&&e.childKey&&(i=T(i,Gt(e.childKey))),e.orderBy==="key"&&(i=T(i,Wt())),e.orderBy==="value"&&(i=T(i,Qt())),e.startAt!=null&&(i=T(i,ee(e.startAt))),e.endAt!=null&&(i=T(i,Ft(e.endAt))),e.equalTo!=null&&(i=T(i,Kt(e.equalTo))),e.limitFirst!=null&&(i=T(i,Jt(e.limitFirst))),e.limitLast!=null&&(i=T(i,Bt(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 wt=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 ne}from"@onlive.ai/tracker/generator";import{Session as k}from"@onlive.ai/tracker/session";var A="chatbot",st=class r{static hasSession(){return!!k.getCookie(A)}static getSession(t={role:"guest",regenerate:!1}){t.regenerate&&(k.id=ne.uuid(),k.deleteCookie(A));let e=k.getCookie(A);return e&&r.isValidSession(e,t.role)?e:r.createSession(t.role)}static createSession(t){let e={externalId:t==="agent"?String(r.getUserId()||k.id):k.id,secret:wt(16),createdAt:new Date().toISOString()};return k.setCookie(A,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 k.getCookie("user-id",{objectKey:"userId",storageKey:"user",storageType:"localStorage",ttl:3600*24*365,preserveData:!0})}static updateSessionWithRegistrationData(t){let e=k.getCookie(A);if(e||(e=r.createSession("guest")),e){let i={...e,registrationData:t};k.setCookie(A,i,3600*24*365)}}static hasRegistrationData(){return!!k.getCookie(A)?.registrationData}static async getAgentInfo(t){return fetch(`${t}/api/v1/auth/user-info`,{credentials:"include"}).then(e=>e.json())}static getRegistrationData(){return k.getCookie(A)?.registrationData}};var Et="lk.chat",Ot="lk.transcription",xt="lk.events",gt="typing-indicator";var pt=class extends re{},ot=class{constructor(t){this.listeners=new Set;this.typingListeners=new Set;this.transcriptionMap=new Map;this.abortControllers={register:new AbortController,createRoom:new AbortController,quickStart: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,a="";for await(let o of t)a+=o,this.emitMessage({id:i,timestamp:Date.now(),message:a,assets:JSON.parse(t.info?.attributes?.assets||"[]"),from:s});this.messagePersistence==="client"&&this.persistMessage({roomId:this.room.id,content:a,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===gt)try{let s=JSON.parse(new TextDecoder().decode(t));if(s.type==="typing"&&s.participantId!==this.room.localParticipant.identity){let a={type:"typing",isTyping:s.isTyping,timestamp:s.timestamp,participantId:s.participantId};this.emitTypingIndicator(a)}}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||Et,this.transcriptionTopic=t.transcriptionTopic||Ot,this.eventsTopic=t.eventsTopic||xt,this.messagePersistence=t.messagePersistence||"disabled",this.room=this.createRoomInstance(),t.firebaseConfig&&this.initializeFirebase(t.firebaseConfig)}createRoomInstance(){return new pt({adaptiveStream:!0,dynacast:!0})}ensureRoom(){return this.room||(this.room=this.createRoomInstance()),this.room}initializeFirebase(t){this.firebaseApi=new rt({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(ut.DataReceived,this.handleDataReceived),this.room.registerTextStreamHandler(this.channelTopic,this.handleIncomingMessage),this.room.registerTextStreamHandler(this.transcriptionTopic,this.handleIncomingMessage),this.room.on(ut.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=lt.getCookie("livekit-agent-token");if(i){if(this.decodeJwtPayload(i)?.username===e.name)return this.authToken=i,i;lt.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 lt.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 quickStart(t){this.room=this.ensureRoom();let e=await u(`${this.apiUrl}/rooms/quick-start`,{method:"POST",body:JSON.stringify(t),headers:{"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.quickStart.signal});if(!e.user?.token)throw new Error("Quick start failed: No user token received from server");this.authToken=e.user.token;let i={id:e.room.id,groupId:e.room.groupId||"",token:e.room.token,wsURL:e.room.wsURL,createdAt:e.room.createdAt||new Date().toISOString(),affinity:e.room.affinity};return this.setRoomMetadata(i),this.setupParticipantAttributesHandler(),this.room.connect(i.wsURL,i.token),this.initializeRoomHandlers(),this.room}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(ut.ParticipantAttributesChanged,t=>{t.identity===this.room.localParticipant.identity&&st.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:gt})}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"}),a=i.onChildAddedQuery(s,(o,d)=>{if(!o||this.seenRequestIds.has(o))return;let c={...d,id:o};this.seenRequestIds.add(o),t(o,c)});return this.firebaseUnsubscribers["pending-requests"]=a,()=>{a?.(),delete this.firebaseUnsubscribers["pending-requests"]}}subscribeRequestChanges(t){let{api:e,callsPath:i}=this.getFirebase();this.firebaseUnsubscribers["request-changes"]?.();let n=e.onChildChanged(i,(s,a)=>{if(!s)return;let o=JSON.stringify(a);this.lastSnapshotById.get(s)!==o&&(this.lastSnapshotById.set(s,o),t(s,{...a,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,a=>a&&(a.status==="pending"?{...a,status:"accepted"}:a)),(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,a)=>{e(a)})}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,a)=>{e(a)})}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 M=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)}},v=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 q=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(()=>(_(),N)),{track:s,cleanup:a}=n({animation:"avatar",label:this.name||"Local Camera"}),o=new M("video","camera",s,a),d=new v(o,e?.name);return this.trackPublications.set("camera",d),this.videoTrackPublications.set(o.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(()=>(_(),N)),{track:s,cleanup:a}=n({enabled:!1}),o=new M("audio","microphone",s,a),d=new v(o,e?.name);return this.trackPublications.set("microphone",d),this.audioTrackPublications.set(o.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(()=>(_(),N)),{track:s,cleanup:a}=n({animation:"bars",label:"Screen Share",width:1920,height:1080}),o=new M("video","screen_share",s,a),d=new v(o,e?.name||"screen");return this.trackPublications.set("screen_share",d),this.videoTrackPublications.set(o.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 v(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}};function se(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=g("PA"),this.name=e,this.attributes=i,this._kindString=n,this.kind=se(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 q(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 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,a;if(e==="video"){let{createSyntheticVideoTrack:c}=await Promise.resolve().then(()=>(_(),N)),p=c({animation:n.isAgent?"avatar":"pulse",label:n.name||t,foregroundColor:n.isAgent?"#22c55e":"#4361ee"});s=p.track,a=p.cleanup}else if(e==="audio"){let{createSyntheticAudioTrack:c}=await Promise.resolve().then(()=>(_(),N)),p=c({enabled:!1});s=p.track,a=p.cleanup}let o=new M(e,i,s,a),d=new v(o);return n.addTrackPublication(d),this.emit("trackSubscribed",o,d,n),this.emit("trackPublished",d,n),o}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 F=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(),a={id:n,name:t,groupId:e||g("group"),createdAt:s,metadata:i,isActive:!0,participantIds:[],connectionState:"disconnected",wsURL:J(n),token:x(n,"pending",s)};return this.rooms.set(n,a),this.messages.set(n,[]),a}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",a=!1){let o=this.rooms.get(t);if(!o)return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);if(!o.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:a};return this.participants.set(e,c),o.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 a=this.participants.get(s);a&&(!e||a.isConnected)&&n.push(a)}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 a=this.rooms.get(s.roomId);if(!a||!a.isActive)return this.createError("ROOM_ENDED","Room is not active");let o=g("track"),d={id:o,kind:e,source:i,participantIdentity:t,roomId:s.roomId,publishedAt:new Date().toISOString(),muted:!1,metadata:n};return this.tracks.set(o,d),s.trackIds.push(o),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"),a={id:s,roomId:t,name:e,status:"running",startedAt:new Date().toISOString(),config:{responseStrategy:"echo",...i},messageHistory:[]};return this.agents.set(s,a),this.addParticipant(t,`agent_${s}`,e,"agent","agent",!1),a}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 o={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(o),this.messages.set(t,d),o}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 F(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 l("UNAUTHORIZED","Registration failed");let s={id:g("user"),externalId:t,organizationId:this.config.organizationId,role:"user",token:x("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=x("agent",t,new Date().toISOString());return this._authToken=i,this.room.localParticipant.identity=t,this.room.localParticipant.name=e.name,i}async quickStart(t){return await this.registerUser(t.user.externalId,t.user.secret,{name:t.user.name,email:t.user.email,phone:t.user.phone,avatar:t.user.avatar,userGroupId:t.user.userGroupId},t.user.metadata),this.createRoom({language:t.room.language,timezone:t.room.timezone,affinity:t.room.affinity,metadata:t.room.metadata,disablePersistence:t.room.disablePersistence,contextualEvents:t.room.contextualEvents,userGroupId:t.room.userGroupId??void 0})}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 R(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 a=this.room.localParticipant.identity||"local_user",o=this.state.addParticipant(t,a,this.room.localParticipant.name,"user","standard",!0);if(P(o))throw z(o);if(n){let d={};for(let[c,p]of Object.entries(n))d[c]=String(p);this.state.updateParticipantAttributes(a,d)}return this.state.updateRoomConnectionState(t,"connected"),this.config.autoEmitEvents&&(this.events.emitParticipantJoined(t,o),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 R(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 R(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(o=>o.isActive):t.roomStatus==="closed"&&(e=e.filter(o=>!o.isActive)),t.ids?.length&&(e=e.filter(o=>t.ids.includes(o.id))),t.groupId&&(e=e.filter(o=>o.groupId===t.groupId));let i=t.offset??0,n=t.limit??20;return{items:e.slice(i,i+n).map(o=>({id:o.id,name:o.name,groupId:o.groupId,organizationId:this.config.organizationId,endedAt:o.endedAt??null,createdAt:o.createdAt,updatedAt:o.createdAt,status:o.isActive?"active":"ended",participants:this.state.listParticipants(o.id).map(d=>({id:d.identity,name:d.name||d.identity,role:d.role,isLocal:d.isLocal})),evaluations:[],_count:{messages:this.state.getMessages(o.id).length,participants:o.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(P(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(P(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(),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 U(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,a=Array.isArray(s)?s:[s].filter(Boolean),o=a.includes("video"),d=a.includes("voice");return(o||d)&&this.room.isConnected&&await this.room.simulateParticipantJoin(n.id,{name:i,kind:"agent",withCamera:o,withMicrophone:d||o,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(!P(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 a of this.messageListeners)a([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);!P(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(P(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),dt()}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 S={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 at(){let r=b(S.MODE);if(r==="mock"||r==="real")return r;let t=b(S.USE_MOCK);return t==="true"||t==="1"||ce()?"mock":"real"}function oe(){let r={},t=b(S.MOCK_LATENCY);t&&(r.latencyMs=parseInt(t,10));let e=b(S.MOCK_STRICT);(e==="true"||e==="1")&&(r.strictMode=!0);let i=b(S.MOCK_SCENARIO);i&&(r.scenario=i);let n=b(S.MOCK_SEED);return n&&(r.seed=parseInt(n,10)),r}function ae(){let r={},t=b(S.API_URL);t&&(r.apiUrl=t);let e=b(S.AUTH_URL);e&&(r.authUrl=e);let i=b(S.ORG_ID);return i&&(r.organizationId=i),r}function b(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 ce(){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 H=class r{static create(t){if((t.mode??at())==="mock"){let i={...oe(),...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 ot(t)}static createFromEnv(t){let e=t?.mode??at(),i=ae();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 at()}static isMockMode(){return at()==="mock"}static isMockService(t){return t instanceof w}};function vt(r){return H.createMock(r)}_();var E=null;function m(r){return E||(E=vt({organizationId:"storybook_org",apiUrl:"https://storybook.mock",latencyMs:50,autoEmitEvents:!0,...r})),E}function Lt(){E&&E.reset()}async function me(){E&&(await E.destroy(),E=null)}function he(r={}){return(t,e)=>{Lt();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 ke(r){return H.isMockService(r)}var fe={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 ve(r){return()=>m(r)}var Dt={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=Dt);export{Dt as MockServiceActions,fe as StorybookScenarios,ve as createMockServiceFactory,me as destroyStorybookMockService,m as getStorybookMockService,ke as isMockConversationService,Lt as resetStorybookMockService,he as withMockConversationService};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.184 | © 2026 Onlive.ai */
|
|
2
|
+
"use strict";var r=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var c=Object.getOwnPropertyNames;var s=Object.prototype.hasOwnProperty;var g=(t,e,a,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of c(e))!s.call(t,n)&&n!==a&&r(t,n,{get:()=>e[n],enumerable:!(o=i(e,n))||o.enumerable});return t};var d=t=>g(r({},"__esModule",{value:!0}),t);var p={};module.exports=d(p);
|
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.184 | © 2026 Onlive.ai */
|
|
2
|
+
/**
|
|
3
|
+
* @summary Type definitions for the mock LiveKit/Conversation service.
|
|
4
|
+
*
|
|
5
|
+
* @description Contains all type definitions needed for the mock implementation
|
|
6
|
+
* including room state, participant state, track state, agent state, and configuration options.
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Represents the state of a mock room.
|
|
10
|
+
*
|
|
11
|
+
* @property {string} id - Unique room identifier.
|
|
12
|
+
* @property {string} name - Display name of the room.
|
|
13
|
+
* @property {string} groupId - Group identifier for room categorization.
|
|
14
|
+
* @property {string} createdAt - ISO timestamp of room creation.
|
|
15
|
+
* @property {string} [endedAt] - ISO timestamp when room ended, undefined if active.
|
|
16
|
+
* @property {Record<string, unknown>} [metadata] - Additional room metadata.
|
|
17
|
+
* @property {boolean} isActive - Whether the room is currently active.
|
|
18
|
+
* @property {string[]} participantIds - Array of participant identities in the room.
|
|
19
|
+
* @property {MockConnectionState} connectionState - Current connection state of the room.
|
|
20
|
+
*/
|
|
21
|
+
interface MockRoomState {
|
|
22
|
+
id: string;
|
|
23
|
+
name: string;
|
|
24
|
+
groupId: string;
|
|
25
|
+
createdAt: string;
|
|
26
|
+
endedAt?: string;
|
|
27
|
+
metadata?: Record<string, unknown>;
|
|
28
|
+
isActive: boolean;
|
|
29
|
+
participantIds: string[];
|
|
30
|
+
connectionState: MockConnectionState;
|
|
31
|
+
wsURL: string;
|
|
32
|
+
token: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Connection states that mirror LiveKit's ConnectionState enum.
|
|
36
|
+
*/
|
|
37
|
+
type MockConnectionState = "disconnected" | "connecting" | "connected" | "reconnecting";
|
|
38
|
+
/**
|
|
39
|
+
* Represents the state of a mock participant.
|
|
40
|
+
*
|
|
41
|
+
* @property {string} identity - Unique participant identity.
|
|
42
|
+
* @property {string} [name] - Display name of the participant.
|
|
43
|
+
* @property {string} roomId - ID of the room the participant is in.
|
|
44
|
+
* @property {string} joinedAt - ISO timestamp when participant joined.
|
|
45
|
+
* @property {boolean} isConnected - Whether the participant is currently connected.
|
|
46
|
+
* @property {string[]} trackIds - Array of track IDs published by this participant.
|
|
47
|
+
* @property {MockParticipantRole} role - Role of the participant.
|
|
48
|
+
* @property {Record<string, string>} attributes - Participant attributes.
|
|
49
|
+
* @property {MockParticipantKind} kind - Kind of participant (standard, ingress, egress, sip, agent).
|
|
50
|
+
*/
|
|
51
|
+
interface MockParticipantState {
|
|
52
|
+
identity: string;
|
|
53
|
+
name?: string;
|
|
54
|
+
roomId: string;
|
|
55
|
+
joinedAt: string;
|
|
56
|
+
isConnected: boolean;
|
|
57
|
+
trackIds: string[];
|
|
58
|
+
role: MockParticipantRole;
|
|
59
|
+
attributes: Record<string, string>;
|
|
60
|
+
kind: MockParticipantKind;
|
|
61
|
+
isLocal: boolean;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Participant roles in the conversation.
|
|
65
|
+
*/
|
|
66
|
+
type MockParticipantRole = "user" | "agent" | "assistant";
|
|
67
|
+
/**
|
|
68
|
+
* Participant kinds matching LiveKit's participant types.
|
|
69
|
+
*/
|
|
70
|
+
type MockParticipantKind = "standard" | "ingress" | "egress" | "sip" | "agent";
|
|
71
|
+
/**
|
|
72
|
+
* Represents the state of a mock track.
|
|
73
|
+
*
|
|
74
|
+
* @property {string} id - Unique track identifier.
|
|
75
|
+
* @property {MockTrackKind} kind - Type of track (audio, video, data).
|
|
76
|
+
* @property {MockTrackSource} source - Source of the track.
|
|
77
|
+
* @property {string} participantIdentity - Identity of the participant who published this track.
|
|
78
|
+
* @property {string} roomId - ID of the room this track belongs to.
|
|
79
|
+
* @property {string} publishedAt - ISO timestamp when track was published.
|
|
80
|
+
* @property {boolean} muted - Whether the track is currently muted.
|
|
81
|
+
* @property {Record<string, unknown>} [metadata] - Additional track metadata.
|
|
82
|
+
*/
|
|
83
|
+
interface MockTrackState {
|
|
84
|
+
id: string;
|
|
85
|
+
kind: MockTrackKind;
|
|
86
|
+
source: MockTrackSource;
|
|
87
|
+
participantIdentity: string;
|
|
88
|
+
roomId: string;
|
|
89
|
+
publishedAt: string;
|
|
90
|
+
muted: boolean;
|
|
91
|
+
metadata?: Record<string, unknown>;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Types of tracks that can be published.
|
|
95
|
+
*/
|
|
96
|
+
type MockTrackKind = "audio" | "video" | "data";
|
|
97
|
+
/**
|
|
98
|
+
* Track source types matching LiveKit's track sources.
|
|
99
|
+
*/
|
|
100
|
+
type MockTrackSource = "camera" | "microphone" | "screen_share" | "screen_share_audio" | "unknown";
|
|
101
|
+
/**
|
|
102
|
+
* Represents the state of a mock agent.
|
|
103
|
+
*
|
|
104
|
+
* @property {string} id - Unique agent identifier.
|
|
105
|
+
* @property {string} roomId - ID of the room the agent is in.
|
|
106
|
+
* @property {string} name - Display name of the agent.
|
|
107
|
+
* @property {MockAgentStatus} status - Current status of the agent.
|
|
108
|
+
* @property {string} startedAt - ISO timestamp when agent started.
|
|
109
|
+
* @property {string} [stoppedAt] - ISO timestamp when agent stopped.
|
|
110
|
+
* @property {MockAgentConfig} config - Agent configuration.
|
|
111
|
+
* @property {MockAgentMessage[]} messageHistory - History of messages exchanged with agent.
|
|
112
|
+
*/
|
|
113
|
+
interface MockAgentState {
|
|
114
|
+
id: string;
|
|
115
|
+
roomId: string;
|
|
116
|
+
name: string;
|
|
117
|
+
status: MockAgentStatus;
|
|
118
|
+
startedAt: string;
|
|
119
|
+
stoppedAt?: string;
|
|
120
|
+
config: MockAgentConfig;
|
|
121
|
+
messageHistory: MockAgentMessage[];
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Agent status values.
|
|
125
|
+
*/
|
|
126
|
+
type MockAgentStatus = "idle" | "starting" | "running" | "stopping" | "stopped" | "error";
|
|
127
|
+
/**
|
|
128
|
+
* Configuration for a mock agent.
|
|
129
|
+
*
|
|
130
|
+
* @property {string} [type] - Type of agent (e.g., 'chat', 'voice').
|
|
131
|
+
* @property {string} [nature] - Nature of agent ('ai' or 'real').
|
|
132
|
+
* @property {MockAgentResponseStrategy} responseStrategy - How the agent should respond.
|
|
133
|
+
* @property {number} [responseDelayMs] - Delay before responding in milliseconds.
|
|
134
|
+
* @property {string[]} [cannedResponses] - Predefined responses for deterministic testing.
|
|
135
|
+
* @property {number} [maxMessages] - Maximum messages before stopping.
|
|
136
|
+
* @property {boolean} [simulateTyping] - Whether to simulate typing indicator.
|
|
137
|
+
* @property {number} [typingDelayPerChar] - Typing delay per character (ms).
|
|
138
|
+
* @property {string} [name] - Agent display name.
|
|
139
|
+
*/
|
|
140
|
+
interface MockAgentConfig {
|
|
141
|
+
type?: string | string[];
|
|
142
|
+
nature?: "ai" | "real";
|
|
143
|
+
name?: string;
|
|
144
|
+
responseStrategy: MockAgentResponseStrategy;
|
|
145
|
+
responseDelayMs?: number;
|
|
146
|
+
cannedResponses?: string[];
|
|
147
|
+
maxMessages?: number;
|
|
148
|
+
simulateTyping?: boolean;
|
|
149
|
+
typingDelayPerChar?: number;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Strategies for how mock agents should respond.
|
|
153
|
+
*/
|
|
154
|
+
type MockAgentResponseStrategy = "echo" | "canned" | "random" | "sequential" | "silent" | "error" | "custom";
|
|
155
|
+
/**
|
|
156
|
+
* Message exchanged with a mock agent.
|
|
157
|
+
*/
|
|
158
|
+
interface MockAgentMessage {
|
|
159
|
+
id: string;
|
|
160
|
+
content: string;
|
|
161
|
+
role: "user" | "agent";
|
|
162
|
+
/** Timestamp - ISO string or number */
|
|
163
|
+
timestamp: string | number;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Represents a mock message in a room.
|
|
167
|
+
*
|
|
168
|
+
* @property {string} id - Unique message identifier.
|
|
169
|
+
* @property {string} roomId - ID of the room this message belongs to.
|
|
170
|
+
* @property {string} content - Text content of the message.
|
|
171
|
+
* @property {string} participantIdentity - Identity of the sender.
|
|
172
|
+
* @property {string} createdAt - ISO timestamp of message creation.
|
|
173
|
+
* @property {"standard" | "system"} [type] - Message type classification.
|
|
174
|
+
* @property {Record<string, unknown>} [attributes] - Message attributes.
|
|
175
|
+
*/
|
|
176
|
+
interface MockMessageState {
|
|
177
|
+
id: string;
|
|
178
|
+
roomId: string;
|
|
179
|
+
content: string;
|
|
180
|
+
participantIdentity: string;
|
|
181
|
+
createdAt: string;
|
|
182
|
+
type?: "standard" | "system";
|
|
183
|
+
attributes?: Record<string, unknown>;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* All possible mock event types.
|
|
187
|
+
*/
|
|
188
|
+
type MockEventType = "roomCreated" | "roomEnded" | "roomConnectionStateChanged" | "participantJoined" | "participantLeft" | "participantAttributesChanged" | "trackPublished" | "trackUnpublished" | "trackMuted" | "trackUnmuted" | "messageReceived" | "messageSent" | "typingIndicator" | "agentStarted" | "agentStopped" | "agentMessage" | "dataReceived" | "error";
|
|
189
|
+
/**
|
|
190
|
+
* Base event structure for all mock events.
|
|
191
|
+
*/
|
|
192
|
+
interface MockEventBase {
|
|
193
|
+
type: MockEventType;
|
|
194
|
+
timestamp: string;
|
|
195
|
+
roomId?: string;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Room created event.
|
|
199
|
+
*/
|
|
200
|
+
interface MockRoomCreatedEvent extends MockEventBase {
|
|
201
|
+
type: "roomCreated";
|
|
202
|
+
roomId: string;
|
|
203
|
+
room: MockRoomState;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Room ended event.
|
|
207
|
+
*/
|
|
208
|
+
interface MockRoomEndedEvent extends MockEventBase {
|
|
209
|
+
type: "roomEnded";
|
|
210
|
+
roomId: string;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Room connection state changed event.
|
|
214
|
+
*/
|
|
215
|
+
interface MockRoomConnectionStateChangedEvent extends MockEventBase {
|
|
216
|
+
type: "roomConnectionStateChanged";
|
|
217
|
+
roomId: string;
|
|
218
|
+
state: MockConnectionState;
|
|
219
|
+
previousState: MockConnectionState;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Participant joined event.
|
|
223
|
+
*/
|
|
224
|
+
interface MockParticipantJoinedEvent extends MockEventBase {
|
|
225
|
+
type: "participantJoined";
|
|
226
|
+
roomId: string;
|
|
227
|
+
participant: MockParticipantState;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Participant left event.
|
|
231
|
+
*/
|
|
232
|
+
interface MockParticipantLeftEvent extends MockEventBase {
|
|
233
|
+
type: "participantLeft";
|
|
234
|
+
roomId: string;
|
|
235
|
+
participantIdentity: string;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Participant attributes changed event.
|
|
239
|
+
*/
|
|
240
|
+
interface MockParticipantAttributesChangedEvent extends MockEventBase {
|
|
241
|
+
type: "participantAttributesChanged";
|
|
242
|
+
roomId: string;
|
|
243
|
+
participantIdentity: string;
|
|
244
|
+
attributes: Record<string, string>;
|
|
245
|
+
previousAttributes: Record<string, string>;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Track published event.
|
|
249
|
+
*/
|
|
250
|
+
interface MockTrackPublishedEvent extends MockEventBase {
|
|
251
|
+
type: "trackPublished";
|
|
252
|
+
roomId: string;
|
|
253
|
+
participantIdentity: string;
|
|
254
|
+
track: MockTrackState;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Track unpublished event.
|
|
258
|
+
*/
|
|
259
|
+
interface MockTrackUnpublishedEvent extends MockEventBase {
|
|
260
|
+
type: "trackUnpublished";
|
|
261
|
+
roomId: string;
|
|
262
|
+
participantIdentity: string;
|
|
263
|
+
trackId: string;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Track muted event.
|
|
267
|
+
*/
|
|
268
|
+
interface MockTrackMutedEvent extends MockEventBase {
|
|
269
|
+
type: "trackMuted";
|
|
270
|
+
roomId: string;
|
|
271
|
+
trackId: string;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Track unmuted event.
|
|
275
|
+
*/
|
|
276
|
+
interface MockTrackUnmutedEvent extends MockEventBase {
|
|
277
|
+
type: "trackUnmuted";
|
|
278
|
+
roomId: string;
|
|
279
|
+
trackId: string;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Message received event.
|
|
283
|
+
*/
|
|
284
|
+
interface MockMessageReceivedEvent extends MockEventBase {
|
|
285
|
+
type: "messageReceived";
|
|
286
|
+
roomId: string;
|
|
287
|
+
message: MockMessageState;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Message sent event.
|
|
291
|
+
*/
|
|
292
|
+
interface MockMessageSentEvent extends MockEventBase {
|
|
293
|
+
type: "messageSent";
|
|
294
|
+
roomId: string;
|
|
295
|
+
message: MockMessageState;
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Typing indicator event.
|
|
299
|
+
*/
|
|
300
|
+
interface MockTypingIndicatorEvent extends MockEventBase {
|
|
301
|
+
type: "typingIndicator";
|
|
302
|
+
roomId: string;
|
|
303
|
+
participantIdentity: string;
|
|
304
|
+
isTyping: boolean;
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Agent started event.
|
|
308
|
+
*/
|
|
309
|
+
interface MockAgentStartedEvent extends MockEventBase {
|
|
310
|
+
type: "agentStarted";
|
|
311
|
+
roomId: string;
|
|
312
|
+
agent: MockAgentState;
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
315
|
+
* Agent stopped event.
|
|
316
|
+
*/
|
|
317
|
+
interface MockAgentStoppedEvent extends MockEventBase {
|
|
318
|
+
type: "agentStopped";
|
|
319
|
+
roomId: string;
|
|
320
|
+
agentId: string;
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Agent message event.
|
|
324
|
+
*/
|
|
325
|
+
interface MockAgentMessageEvent extends MockEventBase {
|
|
326
|
+
type: "agentMessage";
|
|
327
|
+
roomId: string;
|
|
328
|
+
agentId: string;
|
|
329
|
+
message: MockAgentMessage;
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Data received event.
|
|
333
|
+
*/
|
|
334
|
+
interface MockDataReceivedEvent extends MockEventBase {
|
|
335
|
+
type: "dataReceived";
|
|
336
|
+
roomId: string;
|
|
337
|
+
participantIdentity: string;
|
|
338
|
+
data: Uint8Array;
|
|
339
|
+
topic?: string;
|
|
340
|
+
}
|
|
341
|
+
/**
|
|
342
|
+
* Error event.
|
|
343
|
+
*/
|
|
344
|
+
interface MockErrorEvent extends MockEventBase {
|
|
345
|
+
type: "error";
|
|
346
|
+
error: MockError;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Union type for all mock events.
|
|
350
|
+
*/
|
|
351
|
+
type MockEvent = MockRoomCreatedEvent | MockRoomEndedEvent | MockRoomConnectionStateChangedEvent | MockParticipantJoinedEvent | MockParticipantLeftEvent | MockParticipantAttributesChangedEvent | MockTrackPublishedEvent | MockTrackUnpublishedEvent | MockTrackMutedEvent | MockTrackUnmutedEvent | MockMessageReceivedEvent | MockMessageSentEvent | MockTypingIndicatorEvent | MockAgentStartedEvent | MockAgentStoppedEvent | MockAgentMessageEvent | MockDataReceivedEvent | MockErrorEvent;
|
|
352
|
+
/**
|
|
353
|
+
* Configuration options for the mock service.
|
|
354
|
+
*
|
|
355
|
+
* @property {number} [latencyMs] - Artificial latency in milliseconds.
|
|
356
|
+
* @property {boolean} [strictMode] - Throw errors for invalid operations.
|
|
357
|
+
* @property {number} [seed] - Random seed for deterministic behavior.
|
|
358
|
+
* @property {MockScenario} [scenario] - Predefined scenario to simulate.
|
|
359
|
+
* @property {MockErrorConfig} [errorConfig] - Configuration for forced errors.
|
|
360
|
+
* @property {boolean} [autoEmitEvents] - Automatically emit events on state changes.
|
|
361
|
+
*/
|
|
362
|
+
interface MockServiceConfig {
|
|
363
|
+
latencyMs?: number;
|
|
364
|
+
strictMode?: boolean;
|
|
365
|
+
seed?: number;
|
|
366
|
+
scenario?: MockScenario;
|
|
367
|
+
errorConfig?: MockErrorConfig;
|
|
368
|
+
autoEmitEvents?: boolean;
|
|
369
|
+
organizationId?: string;
|
|
370
|
+
apiUrl?: string;
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Predefined test scenarios.
|
|
374
|
+
*/
|
|
375
|
+
type MockScenario = "happy_path" | "room_disconnect" | "agent_timeout" | "participant_leave" | "track_failure" | "network_unstable" | "slow_network" | "unreliable";
|
|
376
|
+
/**
|
|
377
|
+
* Configuration for forced errors.
|
|
378
|
+
*
|
|
379
|
+
* @property {boolean} [roomNotFound] - Force "room not found" errors.
|
|
380
|
+
* @property {boolean} [participantAlreadyJoined] - Force "already joined" errors.
|
|
381
|
+
* @property {boolean} [trackNotFound] - Force "track not found" errors.
|
|
382
|
+
* @property {boolean} [unauthorized] - Force authentication errors.
|
|
383
|
+
* @property {boolean} [networkError] - Force network errors.
|
|
384
|
+
* @property {number} [errorRate] - Percentage of operations that should fail (0-100).
|
|
385
|
+
*/
|
|
386
|
+
interface MockErrorConfig {
|
|
387
|
+
roomNotFound?: boolean;
|
|
388
|
+
participantAlreadyJoined?: boolean;
|
|
389
|
+
trackNotFound?: boolean;
|
|
390
|
+
unauthorized?: boolean;
|
|
391
|
+
networkError?: boolean;
|
|
392
|
+
errorRate?: number;
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Mock error codes.
|
|
396
|
+
*/
|
|
397
|
+
type MockErrorCode = "ROOM_NOT_FOUND" | "ROOM_ENDED" | "PARTICIPANT_ALREADY_JOINED" | "PARTICIPANT_NOT_FOUND" | "TRACK_NOT_FOUND" | "AGENT_NOT_FOUND" | "UNAUTHORIZED" | "NETWORK_ERROR" | "INVALID_OPERATION" | "TIMEOUT";
|
|
398
|
+
/**
|
|
399
|
+
* Mock error structure.
|
|
400
|
+
*/
|
|
401
|
+
interface MockError {
|
|
402
|
+
code: MockErrorCode;
|
|
403
|
+
message: string;
|
|
404
|
+
details?: Record<string, unknown>;
|
|
405
|
+
}
|
|
406
|
+
/**
|
|
407
|
+
* Event listener callback type.
|
|
408
|
+
*/
|
|
409
|
+
type MockEventListener<T extends MockEvent = MockEvent> = (event: T) => void;
|
|
410
|
+
/**
|
|
411
|
+
* Event listener for specific event types.
|
|
412
|
+
*/
|
|
413
|
+
type MockEventListenerMap = {
|
|
414
|
+
[K in MockEventType]?: Set<MockEventListener>;
|
|
415
|
+
};
|
|
416
|
+
/**
|
|
417
|
+
* Complete snapshot of the mock service state.
|
|
418
|
+
*/
|
|
419
|
+
interface MockStateSnapshot {
|
|
420
|
+
rooms: Map<string, MockRoomState>;
|
|
421
|
+
participants: Map<string, MockParticipantState>;
|
|
422
|
+
tracks: Map<string, MockTrackState>;
|
|
423
|
+
agents: Map<string, MockAgentState>;
|
|
424
|
+
messages: Map<string, MockMessageState[]>;
|
|
425
|
+
config: MockServiceConfig;
|
|
426
|
+
eventHistory: MockEvent[];
|
|
427
|
+
}
|
|
428
|
+
/**
|
|
429
|
+
* Serializable version of the snapshot for JSON export.
|
|
430
|
+
*/
|
|
431
|
+
interface MockStateSnapshotJSON {
|
|
432
|
+
rooms: Record<string, MockRoomState>;
|
|
433
|
+
participants: Record<string, MockParticipantState>;
|
|
434
|
+
tracks: Record<string, MockTrackState>;
|
|
435
|
+
agents: Record<string, MockAgentState>;
|
|
436
|
+
messages: Record<string, MockMessageState[]>;
|
|
437
|
+
config: MockServiceConfig;
|
|
438
|
+
eventHistory: MockEvent[];
|
|
439
|
+
exportedAt: string;
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
export type { 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 };
|