@onlive.ai/common-121 0.2.179 → 0.2.187
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-aO_Pa27x.d.cts +11 -0
- package/audi-dark.theme-aO_Pa27x.d.ts +11 -0
- package/audi.theme-BP7nboRq.d.cts +11 -0
- package/audi.theme-BP7nboRq.d.ts +11 -0
- package/australia.theme-BkfhMf1z.d.cts +11 -0
- package/australia.theme-BkfhMf1z.d.ts +11 -0
- package/{chunk-CHMR2I4G.js → chunk-V7XHRWMT.js} +1 -1
- 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 +1 -1
- package/components/asset/asset.d.cts +1 -1
- package/components/asset/asset.d.ts +1 -1
- package/components/asset/asset.js +1 -1
- 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 +1 -1
- package/components/asset/asset.renderer.d.cts +1 -1
- package/components/asset/asset.renderer.d.ts +1 -1
- package/components/asset/asset.renderer.js +1 -1
- 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 +1 -1
- package/components/asset/index.d.cts +1 -1
- package/components/asset/index.d.ts +1 -1
- package/components/asset/index.js +1 -1
- 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-Bez8yPGT.d.cts +11 -0
- package/cuernavaca.theme-Bez8yPGT.d.ts +11 -0
- package/cupra-diagonal.theme-CvdXkM9K.d.cts +11 -0
- package/cupra-diagonal.theme-CvdXkM9K.d.ts +11 -0
- package/cupra-events.theme-ln2vh1C0.d.cts +11 -0
- package/cupra-events.theme-ln2vh1C0.d.ts +11 -0
- package/cupra.theme-xa6yZhYo.d.cts +11 -0
- package/cupra.theme-xa6yZhYo.d.ts +11 -0
- package/germany.theme-Dra_5Jz0.d.cts +11 -0
- package/germany.theme-Dra_5Jz0.d.ts +11 -0
- package/hyundai.theme-BATWnkTl.d.cts +11 -0
- package/hyundai.theme-BATWnkTl.d.ts +11 -0
- package/index.cjs +13 -13
- package/index.d.cts +178 -3
- package/index.d.ts +178 -3
- package/index.js +139 -139
- package/italy.theme-YukqsD2q.d.cts +11 -0
- package/italy.theme-YukqsD2q.d.ts +11 -0
- package/magimix.theme-C7eoXRAA.d.cts +11 -0
- package/magimix.theme-C7eoXRAA.d.ts +11 -0
- package/{media-TFGJGBU2.js → media-MWJPMNO2.js} +2 -2
- package/onlive-ai.theme-CMYahnHv.d.cts +11 -0
- package/onlive-ai.theme-CMYahnHv.d.ts +11 -0
- package/onlive.theme-B7tNdG9s.d.cts +11 -0
- package/onlive.theme-B7tNdG9s.d.ts +11 -0
- package/package.json +7 -6
- 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-CzvloqhA.d.cts +11 -0
- package/seat-cupra.theme-CzvloqhA.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 +15 -2
- package/services/conversation/conversation.service.d.ts +15 -2
- package/services/conversation/conversation.service.js +2 -2
- package/services/conversation/conversation.types.cjs +2 -2
- package/services/conversation/conversation.types.d.cts +112 -2
- package/services/conversation/conversation.types.d.ts +112 -2
- package/services/conversation/conversation.types.js +2 -2
- package/services/conversation/index.cjs +2 -2
- package/services/conversation/index.d.cts +2 -2
- package/services/conversation/index.d.ts +2 -2
- package/services/conversation/index.js +2 -2
- package/services/conversation/mock/actor/agent.cjs +1 -1
- package/services/conversation/mock/actor/agent.d.cts +1 -1
- package/services/conversation/mock/actor/agent.d.ts +1 -1
- package/services/conversation/mock/actor/agent.js +1 -1
- package/services/conversation/mock/actor/index.cjs +1 -1
- package/services/conversation/mock/actor/index.d.cts +1 -1
- package/services/conversation/mock/actor/index.d.ts +1 -1
- package/services/conversation/mock/actor/index.js +1 -1
- package/services/conversation/mock/actor/strategies.cjs +1 -1
- package/services/conversation/mock/actor/strategies.d.cts +1 -1
- package/services/conversation/mock/actor/strategies.d.ts +1 -1
- package/services/conversation/mock/actor/strategies.js +1 -1
- package/services/conversation/mock/errors.cjs +1 -1
- package/services/conversation/mock/errors.d.cts +1 -1
- package/services/conversation/mock/errors.d.ts +1 -1
- package/services/conversation/mock/errors.js +1 -1
- package/services/conversation/mock/events.cjs +1 -1
- package/services/conversation/mock/events.d.cts +1 -1
- package/services/conversation/mock/events.d.ts +1 -1
- package/services/conversation/mock/events.js +1 -1
- package/services/conversation/mock/factory.cjs +2 -2
- package/services/conversation/mock/factory.d.cts +1 -1
- package/services/conversation/mock/factory.d.ts +1 -1
- package/services/conversation/mock/factory.js +2 -2
- package/services/conversation/mock/fixtures.cjs +1 -1
- package/services/conversation/mock/fixtures.d.cts +1 -1
- package/services/conversation/mock/fixtures.d.ts +1 -1
- package/services/conversation/mock/fixtures.js +1 -1
- package/services/conversation/mock/generators.cjs +1 -1
- package/services/conversation/mock/generators.d.cts +1 -1
- package/services/conversation/mock/generators.d.ts +1 -1
- package/services/conversation/mock/generators.js +1 -1
- package/services/conversation/mock/index.cjs +2 -2
- package/services/conversation/mock/index.d.cts +1 -1
- package/services/conversation/mock/index.d.ts +1 -1
- package/services/conversation/mock/index.js +2 -2
- package/services/conversation/mock/livekit/index.cjs +1 -1
- package/services/conversation/mock/livekit/index.d.cts +1 -1
- package/services/conversation/mock/livekit/index.d.ts +1 -1
- package/services/conversation/mock/livekit/index.js +1 -1
- package/services/conversation/mock/livekit/local-participant.cjs +1 -1
- package/services/conversation/mock/livekit/local-participant.d.cts +1 -1
- package/services/conversation/mock/livekit/local-participant.d.ts +1 -1
- package/services/conversation/mock/livekit/local-participant.js +1 -1
- package/services/conversation/mock/livekit/participant.cjs +1 -1
- package/services/conversation/mock/livekit/participant.d.cts +1 -1
- package/services/conversation/mock/livekit/participant.d.ts +1 -1
- package/services/conversation/mock/livekit/participant.js +1 -1
- package/services/conversation/mock/livekit/room.cjs +1 -1
- package/services/conversation/mock/livekit/room.d.cts +1 -1
- package/services/conversation/mock/livekit/room.d.ts +1 -1
- package/services/conversation/mock/livekit/room.js +1 -1
- package/services/conversation/mock/livekit/streams.cjs +1 -1
- package/services/conversation/mock/livekit/streams.d.cts +1 -1
- package/services/conversation/mock/livekit/streams.d.ts +1 -1
- package/services/conversation/mock/livekit/streams.js +1 -1
- package/services/conversation/mock/livekit/tracks.cjs +1 -1
- package/services/conversation/mock/livekit/tracks.d.cts +1 -1
- package/services/conversation/mock/livekit/tracks.d.ts +1 -1
- package/services/conversation/mock/livekit/tracks.js +1 -1
- package/services/conversation/mock/media.cjs +1 -1
- package/services/conversation/mock/media.d.cts +1 -1
- package/services/conversation/mock/media.d.ts +1 -1
- package/services/conversation/mock/media.js +1 -1
- package/services/conversation/mock/service.cjs +2 -2
- package/services/conversation/mock/service.d.cts +7 -2
- package/services/conversation/mock/service.d.ts +7 -2
- package/services/conversation/mock/service.js +2 -2
- package/services/conversation/mock/service.test.cjs +2 -2
- package/services/conversation/mock/service.test.d.cts +1 -1
- package/services/conversation/mock/service.test.d.ts +1 -1
- package/services/conversation/mock/service.test.js +2 -2
- package/services/conversation/mock/state.cjs +1 -1
- package/services/conversation/mock/state.d.cts +1 -1
- package/services/conversation/mock/state.d.ts +1 -1
- package/services/conversation/mock/state.js +1 -1
- package/services/conversation/mock/storybook.cjs +2 -2
- package/services/conversation/mock/storybook.d.cts +1 -1
- package/services/conversation/mock/storybook.d.ts +1 -1
- package/services/conversation/mock/storybook.js +2 -2
- package/services/conversation/mock/types.cjs +1 -1
- package/services/conversation/mock/types.d.cts +1 -1
- package/services/conversation/mock/types.d.ts +1 -1
- package/services/conversation/mock/types.js +1 -1
- package/services/deep-link.service.cjs +2 -0
- package/services/deep-link.service.d.cts +77 -0
- package/services/deep-link.service.d.ts +77 -0
- package/services/deep-link.service.js +2 -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 +1031 -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 +1031 -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 +1 -1
- package/themes/dark.d.cts +1 -1
- package/themes/dark.d.ts +1 -1
- package/themes/dark.js +1 -1
- package/themes/light.cjs +1 -1
- package/themes/light.d.cts +1 -1
- package/themes/light.d.ts +1 -1
- package/themes/light.js +1 -1
- package/types/deep-link.types.cjs +2 -0
- package/types/deep-link.types.d.cts +32 -0
- package/types/deep-link.types.d.ts +32 -0
- package/types/deep-link.types.js +2 -0
- 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 +6550 -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 +6550 -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 +1 -1
- package/utils/safe-html.d.cts +1 -1
- package/utils/safe-html.d.ts +1 -1
- package/utils/safe-html.js +1 -1
- 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
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! @onlive.ai/common-121 v0.2.
|
|
2
|
-
var Gt=Object.defineProperty;var Wt=(n,t)=>()=>(n&&(t=n(n=0)),t);var Qt=(n,t)=>{for(var e in t)Gt(n,e,{get:t[e],enumerable:!0})};var j={};Qt(j,{SYNTHETIC_MEDIA_PRESETS:()=>Rt,createSyntheticAudioTrack:()=>St,createSyntheticMedia:()=>bt,createSyntheticMediaFromPreset:()=>$t,createSyntheticVideoTrack:()=>Mt});function Mt(n={}){let{width:t=640,height:e=480,fps:i=30,backgroundColor:s="#1a1a2e",foregroundColor:r="#4361ee",label:c="Mock Video",animation:a="wave"}=n,g=document.createElement("canvas");g.width=t,g.height=e;let d=g.getContext("2d"),h,z=Date.now(),X={wave:w=>{d.fillStyle=s,d.fillRect(0,0,t,e),d.strokeStyle=r,d.lineWidth=3,d.beginPath();for(let k=0;k<t;k++){let S=e/2+Math.sin(k/t*4*Math.PI+w*.002)*(e/4);k===0?d.moveTo(k,S):d.lineTo(k,S)}d.stroke()},pulse:w=>{d.fillStyle=s,d.fillRect(0,0,t,e);let k=Math.sin(w*.003)*.3+.7,S=Math.min(t,e)*.3*k;d.beginPath(),d.arc(t/2,e/2,S,0,Math.PI*2),d.fillStyle=r,d.fill()},bars:w=>{d.fillStyle=s,d.fillRect(0,0,t,e);let k=20,S=t/k,D=e*.7;d.fillStyle=r;for(let F=0;F<k;F++){let It=Math.abs(Math.sin(F/k*Math.PI*2+w*.004))*D,Vt=F*S,Jt=e-It;d.fillRect(Vt+2,Jt,S-4,It)}},avatar:w=>{d.fillStyle=s,d.fillRect(0,0,t,e);let k=t/2,S=e/2-20,D=Math.min(t,e)*.15;d.beginPath(),d.arc(k,S,D,0,Math.PI*2),d.fillStyle=r,d.fill(),d.beginPath(),d.ellipse(k,S+D*2.2,D*1.5,D,0,Math.PI,0),d.fill(),Math.sin(w*.01)>0&&(d.beginPath(),d.arc(k,S+D*3,5+Math.sin(w*.02)*3,0,Math.PI*2),d.fillStyle="#22c55e",d.fill())},none:()=>{d.fillStyle=s,d.fillRect(0,0,t,e)}},Y=()=>{d.fillStyle="rgba(255, 255, 255, 0.8)",d.font=`${Math.floor(e*.04)}px system-ui, sans-serif`,d.textAlign="center",d.fillText(c,t/2,e-20)},q=()=>{let w=Date.now()-z;X[a](w),Y(),h=requestAnimationFrame(q)};q();let Pt=g.captureStream(i),At=Pt.getVideoTracks()[0];return{track:At,stream:Pt,cleanup:()=>{cancelAnimationFrame(h),At.stop()}}}function St(n={}){let{frequency:t=440,volume:e=.1,waveType:i="sine",addVariation:s=!0,enabled:r=!1}=n,c=new AudioContext,a=c.createMediaStreamDestination(),g=c.createOscillator();g.type=i,g.frequency.value=t;let d=c.createGain();d.gain.value=r?e:0;let h=null,z=null;s&&(h=c.createOscillator(),h.frequency.value=.5,z=c.createGain(),z.gain.value=10,h.connect(z),z.connect(g.frequency),h.start()),g.connect(d),d.connect(a),g.start();let X=a.stream,Y=X.getAudioTracks()[0];return{track:Y,stream:X,setVolume:q=>{d.gain.value=Math.max(0,Math.min(1,q))},setEnabled:q=>{d.gain.value=q?e:0},cleanup:()=>{g.stop(),h?.stop(),c.close(),Y.stop()}}}function bt(n,t){let e=Mt(n),i=St(t),s=new MediaStream([e.track,i.track]);return{videoTrack:e.track,audioTrack:i.track,combinedStream:s,setAudioVolume:i.setVolume,setAudioEnabled:i.setEnabled,cleanup:()=>{e.cleanup(),i.cleanup()}}}function $t(n){let t=Rt[n];return bt(t.video,t.audio)}var Rt,H=Wt(()=>{"use strict";Rt={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}}}});import{afterEach as we,beforeEach as N,describe as y,expect as o,it as l}from"vitest";var ht=0;function K(){ht=0}function u(n){return ht++,`mock_${n}_${ht}_${Date.now().toString(36)}`}function I(n,t,e){let i=e||new Date().toISOString(),s=typeof btoa=="function"?btoa(i).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,""):i.replace(/[^a-zA-Z0-9]/g,"");return`mock_token_${n}_${t}_${s}`}function V(n){return`wss://mock-livekit.local/room/${n}`}var Z={responseStrategy:"echo",responseDelayMs:100,cannedResponses:[],type:"text",nature:"ai",simulateTyping:!1,typingDelayPerChar:20};function tt(n,t,e=[],i=0,s=Math.random){switch(n){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 r=Math.floor(s()*e.length);return{response:e[r],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 $=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={...Z,...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=tt(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:u("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 m=class n extends Error{constructor(t,e,i){super(e),this.name="MockLiveKitError",this.code=t,this.details=i,typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,n)}toMockError(){return{code:this.code,message:this.message,details:this.details}}static fromMockError(t){return new n(t.code,t.message,t.details)}},T=class extends m{constructor(t){super("ROOM_NOT_FOUND",`Room not found: ${t}`,{roomId:t}),this.name="RoomNotFoundError"}},et=class extends m{constructor(t){super("ROOM_ENDED",`Room has ended: ${t}`,{roomId:t}),this.name="RoomEndedError"}},it=class extends m{constructor(t,e){super("PARTICIPANT_ALREADY_JOINED",`Participant ${t} is already in room ${e}`,{identity:t,roomId:e}),this.name="ParticipantAlreadyJoinedError"}},nt=class extends m{constructor(t){super("PARTICIPANT_NOT_FOUND",`Participant not found: ${t}`,{identity:t}),this.name="ParticipantNotFoundError"}},st=class extends m{constructor(t){super("TRACK_NOT_FOUND",`Track not found: ${t}`,{trackId:t}),this.name="TrackNotFoundError"}},rt=class extends m{constructor(t){super("AGENT_NOT_FOUND",`Agent not found: ${t}`,{agentId:t}),this.name="AgentNotFoundError"}},ot=class extends m{constructor(t="Unauthorized"){super("UNAUTHORIZED",t),this.name="UnauthorizedError"}},at=class extends m{constructor(t="Network error occurred"){super("NETWORK_ERROR",t),this.name="NetworkError"}},ct=class extends m{constructor(t,e){super("INVALID_OPERATION",t,e),this.name="InvalidOperationError"}},dt=class extends m{constructor(t,e){super("TIMEOUT",`Operation timed out: ${t}`,{operation:t,timeoutMs:e}),this.name="TimeoutError"}};function J(n){switch(n.code){case"ROOM_NOT_FOUND":return new T(n.details?.roomId??"unknown");case"ROOM_ENDED":return new et(n.details?.roomId??"unknown");case"PARTICIPANT_ALREADY_JOINED":return new it(n.details?.identity??"unknown",n.details?.roomId??"unknown");case"PARTICIPANT_NOT_FOUND":return new nt(n.details?.identity??"unknown");case"TRACK_NOT_FOUND":return new st(n.details?.trackId??"unknown");case"AGENT_NOT_FOUND":return new rt(n.details?.agentId??"unknown");case"UNAUTHORIZED":return new ot(n.message);case"NETWORK_ERROR":return new at(n.message);case"INVALID_OPERATION":return new ct(n.message,n.details);case"TIMEOUT":return new dt(n.details?.operation??"unknown",n.details?.timeoutMs??0);default:return m.fromMockError(n)}}function E(n){return typeof n=="object"&&n!==null&&"code"in n&&"message"in n&&typeof n.code=="string"&&typeof n.message=="string"}var G=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=s=>{this.off(t,i),e(s)};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(s){console.error(`Error in mock event listener for ${t.type}:`,s)}for(let i of this.wildcardListeners)try{i(t)}catch(s){console.error("Error in mock wildcard event listener:",s)}}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 s={type:"roomConnectionStateChanged",timestamp:new Date().toISOString(),roomId:t,state:e,previousState:i};this.emit(s)}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,s){let r={type:"participantAttributesChanged",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,attributes:i,previousAttributes:s};this.emit(r)}emitTrackPublished(t,e,i){let s={type:"trackPublished",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,track:i};this.emit(s)}emitTrackUnpublished(t,e,i){let s={type:"trackUnpublished",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,trackId:i};this.emit(s)}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 s={type:"typingIndicator",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,isTyping:i};this.emit(s)}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 s={type:"agentMessage",timestamp:new Date().toISOString(),roomId:t,agentId:e,message:i};this.emit(s)}emitDataReceived(t,e,i,s){let r={type:"dataReceived",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,data:i,topic:s};this.emit(r)}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(s=>s.type===e):this.eventHistory).slice(-t)}clearHistory(){this.eventHistory=[]}listenerCount(t){return(this.listeners[t]?.size??0)+this.wildcardListeners.size}};import{Session as ft}from"@onlive.ai/tracker";import{Room as pe,RoomEvent as vt}from"livekit-client";import{initializeApp as Yt}from"firebase/app";import{query as O,endAt as Zt,equalTo as te,get as Et,getDatabase as ee,limitToFirst as ie,limitToLast as ne,onChildAdded as Ot,onChildChanged as xt,onChildRemoved as _t,onDisconnect as Lt,onValue as Ut,orderByChild as se,orderByKey as re,orderByValue as oe,push as ae,ref as ce,remove as de,runTransaction as ge,set as Dt,startAt as le,update as ue}from"firebase/database";var gt=class{constructor(t){this.onChildChanged=(t,e)=>xt(this.ref(t),i=>e(i.key||"",i.val(),i));this.onChildRemoved=(t,e)=>_t(this.ref(t),i=>e(i.key||"",i.val(),i));this.onChildChangedQuery=(t,e)=>xt(t,i=>e(i.key||"",i.val(),i));this.onChildRemovedQuery=(t,e)=>_t(t,i=>e(i.key||"",i.val(),i));let e=Yt(t.config);this.db=ee(e)}ref(t){return ce(this.db,t)}async getOnce(t){let e=await Et(this.ref(t));return e.exists()?e.val():null}async getOnceQuery(t){let e=await Et(t),i=[];return e.exists()&&e.forEach(s=>{i.push({key:s.key||"",value:s.val()})}),i}onValue(t,e){return Ut(this.ref(t),i=>e(i.key??"",i.val(),i),i=>console.error("onValue error",i))}onValueQuery(t,e){return Ut(t,i=>e(i.key??"",i.val(),i),i=>console.error("onValueQuery error",i))}onChildAdded(t,e){return Ot(this.ref(t),i=>e(i.key||"",i.val(),i),i=>console.error("onChildAdded error",i))}onChildAddedQuery(t,e){return Ot(t,i=>e(i.key||"",i.val(),i),i=>console.error("onChildAddedQuery error",i))}write(t,e){return Dt(this.ref(t),e)}update(t,e){return ue(this.ref(t),e)}remove(t){return de(this.ref(t))}async push(t,e){let i=ae(this.ref(t));return await Dt(i,e),i.key}onDisconnectUpdate(t,e){return Lt(this.ref(t)).update(e)}cancelOnDisconnect(t){return Lt(this.ref(t)).cancel()}transaction(t,e){return ge(this.ref(t),i=>e(i))}query(t,e={}){let i=this.ref(t);return e.orderBy==="child"&&e.childKey&&(i=O(i,se(e.childKey))),e.orderBy==="key"&&(i=O(i,re())),e.orderBy==="value"&&(i=O(i,oe())),e.startAt!=null&&(i=O(i,le(e.startAt))),e.endAt!=null&&(i=O(i,Zt(e.endAt))),e.equalTo!=null&&(i=O(i,te(e.equalTo))),e.limitFirst!=null&&(i=O(i,ie(e.limitFirst))),e.limitLast!=null&&(i=O(i,ne(e.limitLast))),i}};var p=async(n,t)=>{let e=await fetch(n,t);if(!e.ok){let i=await e.json().catch(()=>({}));throw new Error(JSON.stringify({status:e.status,statusText:e.statusText,...i}))}return e&&e.json()};var Ht=n=>{let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",e="";for(let i=0;i<n;i++)e+=t.charAt(Math.floor(Math.random()*t.length));return e};import{Generator as me,Session as M}from"@onlive.ai/tracker";var x="chatbot",lt=class n{static hasSession(){return!!M.getCookie(x)}static getSession(t={role:"guest",regenerate:!1}){t.regenerate&&(M.id=me.uuid(),M.deleteCookie(x));let e=M.getCookie(x);return e&&n.isValidSession(e,t.role)?e:n.createSession(t.role)}static createSession(t){let e={externalId:t==="agent"?String(n.getUserId()||M.id):M.id,secret:Ht(16),createdAt:new Date().toISOString()};return M.setCookie(x,e,3600*24*365),e}static isValidSession(t,e){if(e==="guest")return!0;let i=n.getUserId();return!!(i&&String(i)===t.externalId)}static getUserId(){return M.getCookie("user-id",{objectKey:"userId",storageKey:"user",storageType:"localStorage",ttl:3600*24*365,preserveData:!0})}static updateSessionWithRegistrationData(t){let e=M.getCookie(x);if(e||(e=n.createSession("guest")),e){let i={...e,registrationData:t};M.setCookie(x,i,3600*24*365)}}static hasRegistrationData(){return!!M.getCookie(x)?.registrationData}static async getAgentInfo(t){return fetch(`${t}/api/v1/auth/user-info`,{credentials:"include"}).then(e=>e.json())}static getRegistrationData(){return M.getCookie(x)?.registrationData}};var Nt="lk.chat",zt="lk.transcription",qt="lk.events",kt="typing-indicator";var yt=class extends pe{},ut=class{constructor(t){this.listeners=new Set;this.typingListeners=new Set;this.transcriptionMap=new Map;this.abortControllers={register:new AbortController,createRoom:new AbortController,closeRoom:new AbortController,evaluateRoom:new AbortController,persistMessage:new AbortController,sendMessageReport:new AbortController,deleteMessageReport:new AbortController,updateMessageReactions:new AbortController,getRooms:new AbortController};this.authToken=null;this.firebaseUnsubscribers={};this.seenRequestIds=new Set;this.lastSnapshotById=new Map;this.handleIncomingMessage=async(t,e)=>{let i=t?.info?.id,s=t.info?.attributes?.["lk.segment_id"];s&&(this.transcriptionMap.has(s)?i=this.transcriptionMap.get(s)||"":this.transcriptionMap.set(s,i));let r=e?.identity?this.room.getParticipantByIdentity(e.identity):void 0,c="";for await(let a of t)c+=a,this.emitMessage({id:i,timestamp:Date.now(),message:c,assets:JSON.parse(t.info?.attributes?.assets||"[]"),from:r});this.messagePersistence==="client"&&this.persistMessage({roomId:this.room.id,content:c,externalId:i,identity:r?.identity,kind:r?.kind})};this.emitMessage=t=>{for(let e of this.listeners)e([t])};this.handleDataReceived=(t,e,i,s)=>{if(s===kt)try{let r=JSON.parse(new TextDecoder().decode(t));if(r.type==="typing"&&r.participantId!==this.room.localParticipant.identity){let c={type:"typing",isTyping:r.isTyping,timestamp:r.timestamp,participantId:r.participantId};this.emitTypingIndicator(c)}}catch(r){console.warn("Failed to parse typing indicator:",r)}};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||Nt,this.transcriptionTopic=t.transcriptionTopic||zt,this.eventsTopic=t.eventsTopic||qt,this.messagePersistence=t.messagePersistence||"disabled",this.room=this.createRoomInstance(),t.firebaseConfig&&this.initializeFirebase(t.firebaseConfig)}createRoomInstance(){return new yt({adaptiveStream:!0,dynacast:!0})}ensureRoom(){return this.room||(this.room=this.createRoomInstance()),this.room}initializeFirebase(t){this.firebaseApi=new gt({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(vt.DataReceived,this.handleDataReceived),this.room.registerTextStreamHandler(this.channelTopic,this.handleIncomingMessage),this.room.registerTextStreamHandler(this.transcriptionTopic,this.handleIncomingMessage),this.room.on(vt.DataReceived,this.handleDataReceived)}async registerUser(t,e,i,s){let r=await p(`${this.apiUrl}/users/register`,{method:"POST",body:JSON.stringify({externalId:t,secret:e,...i,metadata:s}),headers:{"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.register.signal});if(!r.token)throw new Error("Registration failed: No token received from server");return this.authToken=r.token,r}async registerAgent(t,e){let i=ft.getCookie("livekit-agent-token");if(i){if(this.decodeJwtPayload(i)?.username===e.name)return this.authToken=i,i;ft.deleteCookie("livekit-agent-token")}let s=await p(`${this.authUrl}/admins/register`,{method:"POST",body:JSON.stringify({externalId:t,name:e.name,email:e.email,avatar:e.avatar}),headers:{"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},credentials:"include",signal:this.abortControllers.register.signal});return ft.setCookie("livekit-agent-token",s.token,1440*60),this.authToken=s.token,s.token}decodeJwtPayload(t){try{let e=t.split(".");if(e.length!==3)return null;let i=e[1],s=atob(i.replace(/-/g,"+").replace(/_/g,"/"));return JSON.parse(s)}catch{return null}}async createRoom(t){if(!this.authToken)throw new Error("Cannot create room: No authentication token. Call registerUser() first.");this.room=this.ensureRoom();let{initialMessage:e,...i}=t,s=await p(`${this.apiUrl}/rooms`,{method:"POST",body:JSON.stringify(i),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.createRoom.signal});return this.setRoomMetadata(s),this.setupParticipantAttributesHandler(),this.room.connect(s.wsURL,s.token).then(async()=>{if(e)try{await this.sendMessage(e)}catch(r){console.error("[ConversationService] Failed to send initial message:",r)}}),this.initializeRoomHandlers(),this.room}async joinRoom(t,e,i,s){let r=await p(`${this.apiUrl}/rooms/${t}/join`,{method:"POST",body:JSON.stringify({timezone:e,language:i,...s??{}}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.createRoom.signal});return this.setRoomMetadata(r),this.setupParticipantAttributesHandler(),await this.room.connect(r.wsURL,r.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(vt.ParticipantAttributesChanged,t=>{t.identity===this.room.localParticipant.identity&<.updateSessionWithRegistrationData(t.attributes)})}async evaluateRoom(t){let e=t.roomId||this.room?.id;if(!e)throw new Error("Room ID is required for evaluation");return p(`${this.apiUrl}/rooms/${e}/evaluate`,{method:"POST",body:JSON.stringify({rating:t.rating,comment:t.comment}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.evaluateRoom.signal})}async closeRoom(){this.room&&(await p(`${this.apiUrl}/rooms/${this.room.id}/close`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.closeRoom.signal}),await this.stopAndUnpublishLocalTracks())}async disconnect(){this.room&&(await this.stopAndUnpublishLocalTracks(),this.room.removeAllListeners(),await this.room.disconnect(),this.room=null)}async stopAndUnpublishLocalTracks(){let t=this.room?.localParticipant;if(!t)return;await Promise.allSettled([t.setMicrophoneEnabled(!1),t.setCameraEnabled(!1),t.setScreenShareEnabled(!1)]);let e=Array.from(t.trackPublications.values());await Promise.all(e.map(async i=>{let s=i.track;if(s)try{await t.unpublishTrack(s,!0)}catch{s.stop()}}))}async disconnectAndCloseRoom(){await this.closeRoom(),await this.disconnect()}async readRoom(t){return p(`${this.apiUrl}/rooms/${t}/read`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.persistMessage.signal})}async getRooms(t){let e=new URLSearchParams;return t.page&&e.append("page",t.page.toString()),t.limit&&e.append("limit",t.limit.toString()),t.offset&&e.append("offset",t.offset.toString()),t.orderBy&&e.append("orderBy",t.orderBy),t.orderDir&&e.append("orderDir",t.orderDir),t.ids?.length&&e.append("ids",t.ids.join(",")),t.with?.length&&e.append("with",t.with.join(",")),t.count?.length&&e.append("count",t.count.join(",")),t.latestOnly&&e.append("latestOnly",t.latestOnly.toString()),t.includeUnread&&e.append("includeUnread",t.includeUnread.toString()),t.roomStatus&&e.append("roomStatus",t.roomStatus),t.archived&&e.append("archived",t.archived.toString()),t.participantIds?.length&&e.append("participantIds",t.participantIds.join(",")),t.participantExternalIds?.length&&e.append("participantExternalIds",t.participantExternalIds.join(",")),t.groupId&&e.append("groupId",t.groupId),t.hasMessages!==void 0&&e.append("hasMessages",t.hasMessages.toString()),p(`${this.authUrl}/rooms?${e}`,{method:"GET",headers:{"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},credentials:"include",signal:this.abortControllers.getRooms.signal})}async sendMessage(t,e){let i=await this.room.localParticipant.sendText(t,{topic:this.channelTopic,attributes:e});this.emitMessage({id:i.id,timestamp:Date.now(),message:t,assets:JSON.parse(e?.assets||"[]"),from:this.room.localParticipant}),this.messagePersistence==="client"&&this.persistMessage({roomId:this.room.id,content:t,externalId:i.id,identity:this.room.localParticipant?.identity,kind:this.room.localParticipant?.kind})}async persistMessage(t){return p(`${this.apiUrl}/messages/create`,{method:"POST",body:JSON.stringify(t),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.persistMessage.signal})}async getMessages(t){let e=new URLSearchParams;return t.limit&&e.append("limit",t.limit.toString()),t.with&&e.append("with",t.with.join(",")),(await p(`${this.apiUrl}/messages/search${e.size?`?${e.toString()}`:""}`,{method:"POST",body:JSON.stringify(t),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.createRoom.signal})).items}async sendMessageReport(t){try{return p(`${this.apiUrl}/messages/${t.messageId}/report`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.sendMessageReport.signal})}catch(e){console.error("Error sending message report:",e)}}async deleteMessageReport(t){try{return p(`${this.apiUrl}/messages/${t.messageId}/report`,{method:"DELETE",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.deleteMessageReport.signal})}catch(e){console.error("Error deleting message report:",e)}}async updateMessageReactions(t){try{return p(`${this.apiUrl}/messages/${t.messageId}/reactions`,{method:"PATCH",body:JSON.stringify({add:t.add||[],remove:t.remove||[]}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.updateMessageReactions.signal})}catch(e){console.error("Error updating message reactions:",e)}}subscribeMessages(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}async sendTypingIndicator(t){if(!(!this.room||this.room.state!=="connected"))try{let e=new TextEncoder().encode(JSON.stringify({type:"typing",isTyping:t,timestamp:Date.now(),participantId:this.room.localParticipant.identity}));await this.room.localParticipant.publishData(e,{reliable:!1,topic:kt})}catch(e){console.warn("Failed to send typing indicator:",e)}}subscribeTypingIndicators(t){return this.typingListeners.add(t),()=>{this.typingListeners.delete(t)}}unsubscribeTypingIndicators(t){this.typingListeners.delete(t)}async sendContextualEvent(t){try{let e=JSON.stringify(t);await this.room.localParticipant.sendText(e,{topic:this.eventsTopic})}catch(e){console.warn("Failed to send event:",e)}}async requestNewRoom(t){return p(`${this.apiUrl}/rooms/request-new`,{method:"POST",body:JSON.stringify(t),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}async confirmRoomRequest(t){return p(`${this.apiUrl}/rooms/confirm-call`,{method:"POST",body:JSON.stringify({roomId:t}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}async cancelRoomRequest(t){return p(`${this.apiUrl}/rooms/cancel-call`,{method:"POST",body:JSON.stringify({roomId:t}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}async finishCall(){if(this.room?.id)return p(`${this.apiUrl}/rooms/finish-call`,{method:"POST",body:JSON.stringify({roomId:this.room.id}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}isFirebaseEnabled(){return!!(this.firebaseApi&&this.presencePath&&this.callsPath)}getFirebase(){if(!this.firebaseApi||!this.presencePath||!this.callsPath)throw new Error("Firebase is not initialized. Provide firebaseConfig in constructor.");return{api:this.firebaseApi,presencePath:this.presencePath,callsPath:this.callsPath}}buildAgentPresencePath(t){return`${this.presencePath}/${t}`}onPresenceChange(t){let{api:e,presencePath:i}=this.getFirebase();return e.onChildChanged(i,(s,r)=>t(s,r))}onPresenceAgentChange(t,e){let{api:i}=this.getFirebase();return i.onValue(this.buildAgentPresencePath(t),(s,r)=>e(s,r))}async createCallRequest(t){let{api:e,callsPath:i}=this.getFirebase(),r=(await p(`${this.apiUrl}/rooms/call-request`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},body:JSON.stringify(t)})).id;return e.onDisconnectUpdate(`${i}/${r}`,{status:"disconnected"}),r}onNewCallRequest(t){let{api:e,callsPath:i}=this.getFirebase();return e.onChildAdded(i,(s,r)=>t(s,{...r,id:s}))}onCallRequestChange(t){let{api:e,callsPath:i}=this.getFirebase();return e.onChildChanged(i,(s,r)=>t(s,{...r,id:s}))}onCallRequestRemoved(t){let{api:e,callsPath:i}=this.getFirebase();return e.onChildRemoved(i,s=>t(s))}async acceptCallRequest(t){let{api:e,callsPath:i}=this.getFirebase();return await e.cancelOnDisconnect(`${i}/${t}`),e.update(`${i}/${t}`,{status:"accepted"})}async cancelCallRequest(t){let{api:e,callsPath:i}=this.getFirebase();await e.cancelOnDisconnect(`${i}/${t}`),await p(`${this.apiUrl}/rooms/call-request/cancel`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},body:JSON.stringify({callId:t})})}async cancelOnDisconnect(t){let{api:e,callsPath:i}=this.getFirebase();await e.cancelOnDisconnect(`${i}/${t}`)}subscribePendingRequests(t,e={}){let{api:i,callsPath:s}=this.getFirebase();e.resetSeen&&this.seenRequestIds.clear(),this.firebaseUnsubscribers["pending-requests"]?.();let r=i.query(s,{orderBy:"child",childKey:"status",equalTo:"pending"}),c=i.onChildAddedQuery(r,(a,g)=>{if(!a||this.seenRequestIds.has(a))return;let d={...g,id:a};this.seenRequestIds.add(a),t(a,d)});return this.firebaseUnsubscribers["pending-requests"]=c,()=>{c?.(),delete this.firebaseUnsubscribers["pending-requests"]}}subscribeRequestChanges(t){let{api:e,callsPath:i}=this.getFirebase();this.firebaseUnsubscribers["request-changes"]?.();let s=e.onChildChanged(i,(r,c)=>{if(!r)return;let a=JSON.stringify(c);this.lastSnapshotById.get(r)!==a&&(this.lastSnapshotById.set(r,a),t(r,{...c,id:r}))});return this.firebaseUnsubscribers["request-changes"]=s,()=>{s?.(),delete this.firebaseUnsubscribers["request-changes"]}}async tryAcceptRequest(t){let{api:e,callsPath:i}=this.getFirebase(),s=`${i}/${t}`;return await e.transaction(s,c=>c&&(c.status==="pending"?{...c,status:"accepted"}:c)),(await e.getOnce(s))?.status==="accepted"}onRoomSync(t,e){let{api:i}=this.getFirebase(),s=`orgs/${this.organizationId}/rooms/${t}/sync`;return i.onValue(s,(r,c)=>{e(c)})}async clearRoomSync(t,e){let{api:i}=this.getFirebase(),s=`orgs/${this.organizationId}/rooms/${t}/sync`;await i.write(s,{needsSync:!1,reason:e||null,timestamp:Date.now()})}onNewRoomRequest(t,e){let{api:i}=this.getFirebase(),s=`orgs/${this.organizationId}/rooms/${t}/call`;return i.onValue(s,(r,c)=>{e(c)})}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 C=class{constructor(t,e,i,s){this.muted=!1;this.enabled=!0;this.attachedElements=new Set;this.kind=t,this.source=e,this.sid=u("TR"),this.mediaStreamTrack=i,this.mediaCleanup=s}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)}},b=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 B=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=u("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:s}=await Promise.resolve().then(()=>(H(),j)),{track:r,cleanup:c}=s({animation:"avatar",label:this.name||"Local Camera"}),a=new C("video","camera",r,c),g=new b(a,e?.name);return this.trackPublications.set("camera",g),this.videoTrackPublications.set(a.sid,g),this.room.emit("localTrackPublished",g,this),g}let i=this.trackPublications.get("camera");i&&(i.track?.stop(),this.trackPublications.delete("camera"),this.videoTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async setMicrophoneEnabled(t,e){if(this._microphoneEnabled=t,t){let{createSyntheticAudioTrack:s}=await Promise.resolve().then(()=>(H(),j)),{track:r,cleanup:c}=s({enabled:!1}),a=new C("audio","microphone",r,c),g=new b(a,e?.name);return this.trackPublications.set("microphone",g),this.audioTrackPublications.set(a.sid,g),this.room.emit("localTrackPublished",g,this),g}let i=this.trackPublications.get("microphone");i&&(i.track?.stop(),this.trackPublications.delete("microphone"),this.audioTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async setScreenShareEnabled(t,e){if(this._screenShareEnabled=t,t){let{createSyntheticVideoTrack:s}=await Promise.resolve().then(()=>(H(),j)),{track:r,cleanup:c}=s({animation:"bars",label:"Screen Share",width:1920,height:1080}),a=new C("video","screen_share",r,c),g=new b(a,e?.name||"screen");return this.trackPublications.set("screen_share",g),this.videoTrackPublications.set(a.sid,g),this.room.emit("localTrackPublished",g,this),g}let i=this.trackPublications.get("screen_share");i&&(i.track?.stop(),this.trackPublications.delete("screen_share"),this.videoTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async publishTrack(t,e){let i=new b(t,e?.name),s=e?.source||t.source;return this.trackPublications.set(s,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:u("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 he(n){switch(n){case"standard":return 0;case"ingress":return 1;case"egress":return 2;case"sip":return 3;case"agent":return 4;default:return 0}}var _=class{constructor(t,e,i={},s="standard"){this.connectionQuality="excellent";this.isSpeaking=!1;this.audioLevel=0;this.trackPublications=new Map;this.identity=t,this.sid=u("PA"),this.name=e,this.attributes=i,this._kindString=s,this.kind=he(s),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 L=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 B(this),this.sid=u("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=(...s)=>{this.off(t,i),e(...s)};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 s of i)try{s(...e)}catch(r){console.error(`Error in mock room event handler for ${t}:`,r)}}registerRpcMethod(t,e){this.rpcHandlers.set(t,e)}unregisterRpcMethod(t){this.rpcHandlers.delete(t)}async callRpc(t,e,i,s=1e4){let r=this.rpcHandlers.get(t);if(!r)throw new Error(`RPC method not found: ${t}`);return r({callerIdentity:e,payload:i,responseTimeout:s})}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 _(this.localParticipant.identity,this.localParticipant.name,this.localParticipant.attributes):this.remoteParticipants.get(t)}getParticipantBySid(t){if(t===this.localParticipant.sid)return new _(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 _(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 s=this.remoteParticipants.get(t);if(!s)return;let r,c;if(e==="video"){let{createSyntheticVideoTrack:d}=await Promise.resolve().then(()=>(H(),j)),h=d({animation:s.isAgent?"avatar":"pulse",label:s.name||t,foregroundColor:s.isAgent?"#22c55e":"#4361ee"});r=h.track,c=h.cleanup}else if(e==="audio"){let{createSyntheticAudioTrack:d}=await Promise.resolve().then(()=>(H(),j)),h=d({enabled:!1});r=h.track,c=h.cleanup}let a=new C(e,i,r,c),g=new b(a);return s.addTrackPublication(g),this.emit("trackSubscribed",a,g,s),this.emit("trackPublished",g,s),a}simulateTrackUnpublished(t,e){let i=this.remoteParticipants.get(t);if(!i)return;let s=i.getTrackPublication(e);s&&(i.removeTrackPublication(s.trackSid),this.emit("trackUnpublished",s,i),this.emit("trackUnsubscribed",s.track,s,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 s={...i.attributes};i.setAttributes(e),this.emit("participantAttributesChanged",e,s,i)}}simulateTrackMuted(t,e,i){let s=this.remoteParticipants.get(t);if(!s)return;let r=s.getTrackPublication(e);r?.track&&(r.track.setMuted(i),this.emit(i?"trackMuted":"trackUnmuted",r,s))}simulateActiveSpeakersChanged(t){let e=[];for(let i of t){let s=this.remoteParticipants.get(i);s&&(s.startSpeaking(),e.push(s))}this.emit("activeSpeakersChanged",e)}simulateDataReceived(t,e,i,s){let r=this.remoteParticipants.get(e);this.emit("dataReceived",t,r,i,s)}};var W=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 s=u("room"),r=new Date().toISOString(),c={id:s,name:t,groupId:e||u("group"),createdAt:r,metadata:i,isActive:!0,participantIds:[],connectionState:"disconnected",wsURL:V(s),token:I(s,"pending",r)};return this.rooms.set(s,c),this.messages.set(s,[]),c}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 s=i.connectionState;return i.connectionState=e,s}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 s=this.participants.get(i);s&&(s.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,s]of this.tracks)s.roomId===t&&this.tracks.delete(i);for(let[i,s]of this.agents)s.roomId===t&&this.agents.delete(i);return this.messages.delete(t),this.rooms.delete(t),!0}addParticipant(t,e,i,s="user",r="standard",c=!1){let a=this.rooms.get(t);if(!a)return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);if(!a.isActive)return this.createError("ROOM_ENDED",`Room ${t} has ended`);let g=this.participants.get(e);if(g&&g.roomId===t&&g.isConnected)return this.config.strictMode?this.createError("PARTICIPANT_ALREADY_JOINED",`Participant ${e} is already in room ${t}`):g;let d={identity:e,name:i||e,roomId:t,joinedAt:new Date().toISOString(),isConnected:!0,trackIds:[],role:s,attributes:{},kind:r,isLocal:c};return this.participants.set(e,d),a.participantIds.push(e),d}getParticipant(t){return this.participants.get(t)}listParticipants(t,e=!0){let i=this.rooms.get(t);if(!i)return[];let s=[];for(let r of i.participantIds){let c=this.participants.get(r);c&&(!e||c.isConnected)&&s.push(c)}return s}updateParticipantAttributes(t,e){let i=this.participants.get(t);if(!i)return;let s={...i.attributes};return i.attributes={...i.attributes,...e},s}removeParticipant(t){let e=this.participants.get(t);if(!e)return;e.isConnected=!1;for(let s of e.trackIds)this.tracks.delete(s);e.trackIds=[];let i=this.rooms.get(e.roomId);if(i){let s=i.participantIds.indexOf(t);s!==-1&&i.participantIds.splice(s,1)}return e}publishTrack(t,e,i="unknown",s){let r=this.participants.get(t);if(!r)return this.createError("PARTICIPANT_NOT_FOUND",`Participant ${t} not found`);if(!r.isConnected)return this.createError("INVALID_OPERATION",`Participant ${t} is not connected`);let c=this.rooms.get(r.roomId);if(!c||!c.isActive)return this.createError("ROOM_ENDED","Room is not active");let a=u("track"),g={id:a,kind:e,source:i,participantIdentity:t,roomId:r.roomId,publishedAt:new Date().toISOString(),muted:!1,metadata:s};return this.tracks.set(a,g),r.trackIds.push(a),g}getTrack(t){return this.tracks.get(t)}listTracks(t,e){let i=[];for(let s of this.tracks.values())t&&s.roomId!==t||e&&s.participantIdentity!==e||i.push(s);return i}unpublishTrack(t){let e=this.tracks.get(t);if(!e)return;let i=this.participants.get(e.participantIdentity);if(i){let s=i.trackIds.indexOf(t);s!==-1&&i.trackIds.splice(s,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 s=this.rooms.get(t);if(!s)return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);if(!s.isActive)return this.createError("ROOM_ENDED",`Room ${t} has ended`);let r=u("agent"),c={id:r,roomId:t,name:e,status:"running",startedAt:new Date().toISOString(),config:{responseStrategy:"echo",...i},messageHistory:[]};return this.agents.set(r,c),this.addParticipant(t,`agent_${r}`,e,"agent","agent",!1),c}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 s=this.agents.get(t);if(!s)return;let r={id:u("msg"),content:e,role:i,timestamp:new Date().toISOString()};return s.messageHistory.push(r),r}addMessage(t,e,i,s="standard",r){if(!this.rooms.get(t))return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);let a={id:u("msg"),roomId:t,content:i,participantIdentity:e,createdAt:new Date().toISOString(),type:s,attributes:r},g=this.messages.get(t)||[];return g.push(a),this.messages.set(t,g),a}getMessages(t,e){let i=this.messages.get(t)||[];return e?i.slice(-e):i}createError(t,e,i){return{code:t,message:e,details:i}}isError(t){return typeof t=="object"&&t!==null&&"code"in t&&"message"in t}reset(){this.rooms.clear(),this.participants.clear(),this.tracks.clear(),this.agents.clear(),this.messages.clear(),this.randomState=this.config.seed??Date.now()}getSnapshot(){return{rooms:new Map(this.rooms),participants:new Map(this.participants),tracks:new Map(this.tracks),agents:new Map(this.agents),messages:new Map(this.messages),config:{...this.config},eventHistory:[]}}toJSON(){return{rooms:Object.fromEntries(this.rooms),participants:Object.fromEntries(this.participants),tracks:Object.fromEntries(this.tracks),agents:Object.fromEntries(this.agents),messages:Object.fromEntries(this.messages),config:this.config,eventHistory:[],exportedAt:new Date().toISOString()}}fromJSON(t){this.rooms=new Map(Object.entries(t.rooms)),this.participants=new Map(Object.entries(t.participants)),this.tracks=new Map(Object.entries(t.tracks)),this.agents=new Map(Object.entries(t.agents)),this.messages=new Map(Object.entries(t.messages).map(([e,i])=>[e,i])),this.config=t.config}};var U=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 W(this.config),this.events=new G,this.room=new L(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 L(this)),this.room}async registerUser(t,e,i,s){if(await this.simulateLatency(),this.config.errorConfig?.unauthorized)throw new m("UNAUTHORIZED","Registration failed");let r={id:u("user"),externalId:t,organizationId:this.config.organizationId,role:"user",token:I("pending",t,new Date().toISOString())};return this._authToken=r.token,this._registeredUser=r,this.room.localParticipant.identity=t,this.room.localParticipant.name=i?.name||t,r}async registerAgent(t,e){if(await this.simulateLatency(),this.config.errorConfig?.unauthorized)throw new m("UNAUTHORIZED","Agent registration failed");let i=I("agent",t,new Date().toISOString());return this._authToken=i,this.room.localParticipant.identity=t,this.room.localParticipant.name=e.name,i}async createRoom(t,e={}){if(await this.simulateLatency(),this.config.errorConfig?.networkError||this.shouldThrowError())throw new m("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 s=this.room.localParticipant.identity||"local_user";return this.state.addParticipant(i.id,s,this.room.localParticipant.name,"user","standard",!0),Object.keys(e).length>0&&(this.state.updateParticipantAttributes(s,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,s){await this.simulateLatency();let r=this.state.getRoom(t);if(!r)throw new T(t);if(!r.isActive)throw new m("ROOM_ENDED",`Room ${t} has ended`);this.room.id=r.id,this.room.groupId=r.groupId,this.room.createdAt=r.createdAt,this.room.connectedAt=new Date().toISOString();let c=this.room.localParticipant.identity||"local_user",a=this.state.addParticipant(t,c,this.room.localParticipant.name,"user","standard",!0);if(E(a))throw J(a);if(s){let g={};for(let[d,h]of Object.entries(s))g[d]=String(h);this.state.updateParticipantAttributes(c,g)}return this.state.updateRoomConnectionState(t,"connected"),this.config.autoEmitEvents&&(this.events.emitParticipantJoined(t,a),this.events.emitRoomConnectionStateChanged(t,"connected","disconnected")),await this.room.connect(r.wsURL,r.token),this.room}async evaluateRoom(t){await this.simulateLatency();let e=t.roomId||this.room?.id;if(!e)throw new m("ROOM_NOT_FOUND","No room to evaluate");let i=this.state.getRoom(e);if(!i)throw new T(e);i.metadata||(i.metadata={}),i.metadata.evaluation={rating:t.rating,comment:t.comment,evaluatedAt:new Date().toISOString()}}async closeRoom(){await this.simulateLatency(),this.room?.id&&(this.state.endRoom(this.room.id),await this.stopLocalTracks(),this.config.autoEmitEvents&&this.events.emitRoomEnded(this.room.id))}async disconnect(){if(this.room){let t=this.room.id,e=this.room.localParticipant.identity;await this.stopLocalTracks(),this.state.removeParticipant(e),this.config.autoEmitEvents&&t&&this.events.emitParticipantLeft(t,e),this.room.removeAllListeners(),await this.room.disconnect()}}async stopLocalTracks(){let t=this.room?.localParticipant;t&&await Promise.all([t.setCameraEnabled(!1),t.setMicrophoneEnabled(!1),t.setScreenShareEnabled(!1)])}async disconnectAndCloseRoom(){await this.closeRoom(),await this.disconnect()}async readRoom(t){await this.simulateLatency();let e=this.state.getRoom(t);if(!e)throw new T(t);e.metadata||(e.metadata={}),e.metadata.lastReadAt=new Date().toISOString()}async getRooms(t){await this.simulateLatency();let e=this.state.listRooms();t.roomStatus==="active"?e=e.filter(a=>a.isActive):t.roomStatus==="closed"&&(e=e.filter(a=>!a.isActive)),t.ids?.length&&(e=e.filter(a=>t.ids.includes(a.id))),t.groupId&&(e=e.filter(a=>a.groupId===t.groupId));let i=t.offset??0,s=t.limit??20;return{items:e.slice(i,i+s).map(a=>({id:a.id,name:a.name,groupId:a.groupId,organizationId:this.config.organizationId,endedAt:a.endedAt??null,createdAt:a.createdAt,updatedAt:a.createdAt,status:a.isActive?"active":"ended",participants:this.state.listParticipants(a.id).map(g=>({id:g.identity,name:g.name||g.identity,role:g.role,isLocal:g.isLocal})),evaluations:[],_count:{messages:this.state.getMessages(a.id).length,participants:a.participantIds.length}})),count:e.length,limit:s,offset:i}}async sendMessage(t,e){if(await this.simulateLatency(),!this.room?.id)throw new m("INVALID_OPERATION","Not connected to a room");let i=this.state.addMessage(this.room.id,this.room.localParticipant.identity,t,"standard",e);if(E(i))throw J(i);let s={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 r of this.messageListeners)r([s]);this.config.autoEmitEvents&&this.events.emitMessageSent(this.room.id,i);for(let r of this.agents.values())r.isRunning&&r.roomId===this.room.id&&this.triggerAgentResponse(r,t)}async persistMessage(t){await this.simulateLatency();let e=this.state.addMessage(t.roomId,t.identity||"system",t.content);if(E(e))throw J(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(s=>({id:s.id,timestamp:Date.parse(s.createdAt),message:s.content,content:s.content,createdAt:s.createdAt,from:{identity:s.participantIdentity,id:s.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(),u("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",s=new $(u("agent"),i,{responseStrategy:e?.responseStrategy||"echo",responseDelayMs:e?.responseDelayMs||100,cannedResponses:e?.cannedResponses||[],type:e?.type,nature:e?.nature});await s.start(t),this.agents.set(s.id,s),this.customAgentHandler&&s.setCustomHandler((d,h)=>this.customAgentHandler(d,h));let r=e?.type,c=Array.isArray(r)?r:[r].filter(Boolean),a=c.includes("video"),g=c.includes("voice");return(a||g)&&this.room.isConnected&&await this.room.simulateParticipantJoin(s.id,{name:i,kind:"agent",withCamera:a,withMicrophone:g||a,attributes:{"lk.agent.name":i,"lk.agent.state":"active",role:"agent"}}),this.config.autoEmitEvents&&this.events.emitAgentStarted(t,{id:s.id,name:s.name,roomId:t,status:"running",config:s.getConfig(),startedAt:new Date().toISOString(),messageHistory:[]}),s.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,s)=>t(i,s))}async triggerAgentResponse(t,e){if(this.config.scenario!=="agent_timeout")try{let i=await t.processMessage(e);if(!i)return;let s=this.state.addMessage(t.roomId,`agent_${t.id}`,i);if(!E(s)){let r={id:s.id,timestamp:Date.now(),message:i,content:i,createdAt:s.createdAt,from:{identity:`agent_${t.id}`,name:t.name,id:t.id,role:"agent"}};for(let c of this.messageListeners)c([r]);this.config.autoEmitEvents&&this.events.emitMessageReceived(t.roomId,s)}}catch(i){console.error("Agent response error:",i)}}simulateCallRequest(t){let e={id:u("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 s of i)s(e.id,e)}simulateParticipantJoin(t,e,i="user"){if(!this.room?.id)return;let s=this.state.addParticipant(this.room.id,t,e,i,"standard",!1);!E(s)&&this.config.autoEmitEvents&&this.events.emitParticipantJoined(this.room.id,s)}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(E(i))return;let s={id:i.id,timestamp:Date.now(),message:e,content:e,createdAt:i.createdAt,from:{identity:t,id:t,role:"user"}};for(let r of this.messageListeners)r([s]);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 L(this),K()}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 P={MODE:"LIVEKIT_MODE",USE_MOCK:"USE_LIVEKIT_MOCK",MOCK_LATENCY:"MOCK_LIVEKIT_LATENCY_MS",MOCK_STRICT:"MOCK_LIVEKIT_STRICT",MOCK_SCENARIO:"MOCK_LIVEKIT_SCENARIO",MOCK_SEED:"MOCK_LIVEKIT_SEED",API_URL:"LIVEKIT_API_URL",AUTH_URL:"LIVEKIT_AUTH_URL",ORG_ID:"LIVEKIT_ORGANIZATION_ID"};function mt(){let n=A(P.MODE);if(n==="mock"||n==="real")return n;let t=A(P.USE_MOCK);return t==="true"||t==="1"||ve()?"mock":"real"}function ke(){let n={},t=A(P.MOCK_LATENCY);t&&(n.latencyMs=parseInt(t,10));let e=A(P.MOCK_STRICT);(e==="true"||e==="1")&&(n.strictMode=!0);let i=A(P.MOCK_SCENARIO);i&&(n.scenario=i);let s=A(P.MOCK_SEED);return s&&(n.seed=parseInt(s,10)),n}function fe(){let n={},t=A(P.API_URL);t&&(n.apiUrl=t);let e=A(P.AUTH_URL);e&&(n.authUrl=e);let i=A(P.ORG_ID);return i&&(n.organizationId=i),n}function A(n){if(typeof process<"u"&&process.env)return process.env[n];if(typeof import.meta<"u"&&import.meta.env)return import.meta.env[`VITE_${n}`]||import.meta.env[n];if(typeof window<"u"&&window.__ENV__)return window.__ENV__[n]}function ve(){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 R=class n{static create(t){if((t.mode??mt())==="mock"){let i={...ke(),...t.mockConfig,organizationId:t.organizationId,apiUrl:t.apiUrl};return new U(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 ut(t)}static createFromEnv(t){let e=t?.mode??mt(),i=fe();return n.create({...i,...t,mode:e})}static createMock(t){return new U({organizationId:"mock_org",apiUrl:"https://mock-livekit.local",...t})}static createDeterministicMock(t=12345){return new U({organizationId:"mock_org",apiUrl:"https://mock-livekit.local",seed:t,strictMode:!0})}static getCurrentMode(){return mt()}static isMockMode(){return mt()==="mock"}static isMockService(t){return t instanceof U}};function v(n){return R.createMock(n)}function Q(n){let t=n?.id??u("room"),e=new Date().toISOString();return{id:t,name:`Test Room ${t}`,groupId:u("group"),createdAt:e,isActive:!0,participantIds:[],connectionState:"connected",wsURL:V(t),token:I(t,"local_user",e),...n}}function jt(n="local_user",t){let e=Q(t);e.participantIds.push(n);let i={identity:n,name:"Local User",roomId:e.id,joinedAt:new Date().toISOString(),isConnected:!0,trackIds:[],role:"user",attributes:{},kind:"standard",isLocal:!0};return{room:e,localParticipant:i}}function Bt(n){let t=Q(n),e=new Date().toISOString(),i={identity:"user_1",name:"User One",roomId:t.id,joinedAt:e,isConnected:!0,trackIds:[],role:"user",attributes:{},kind:"standard",isLocal:!0},s={identity:"user_2",name:"User Two",roomId:t.id,joinedAt:e,isConnected:!0,trackIds:[],role:"user",attributes:{},kind:"standard",isLocal:!1};return t.participantIds.push(i.identity,s.identity),{room:t,participant1:i,participant2:s}}function pt(n,t){let{room:e,localParticipant:i}=jt("local_user",t),s=new Date().toISOString(),r=u("agent"),c={id:r,roomId:e.id,name:"AI Assistant",status:"running",startedAt:s,config:{responseStrategy:"echo",nature:"ai",...n},messageHistory:[]},a={identity:`agent_${r}`,name:"AI Assistant",roomId:e.id,joinedAt:s,isConnected:!0,trackIds:[],role:"agent",attributes:{},kind:"agent",isLocal:!1};return e.participantIds.push(a.identity),{room:e,localParticipant:i,agent:c,agentParticipant:a}}function Ft(n,t){return t.map((e,i)=>({id:u("msg"),roomId:n,content:e.content,participantIdentity:e.identity,createdAt:new Date(Date.now()+i*1e3).toISOString(),type:"standard"}))}function wt(){let{room:n,localParticipant:t,agent:e,agentParticipant:i}=pt(),s=Ft(n.id,[{identity:t.identity,content:"Hello, I need help"},{identity:i.identity,content:"Hi! How can I assist you today?"},{identity:t.identity,content:"I have a question about my order"},{identity:i.identity,content:"Of course! Please provide your order number."}]);return{room:n,user:t,agent:e,agentParticipant:i,messages:s}}function Tt(){let{room:n,participant1:t,participant2:e}=Bt(),i=new Date().toISOString(),s=[{id:u("track"),kind:"audio",source:"microphone",participantIdentity:t.identity,roomId:n.id,publishedAt:i,muted:!1},{id:u("track"),kind:"video",source:"camera",participantIdentity:t.identity,roomId:n.id,publishedAt:i,muted:!1},{id:u("track"),kind:"audio",source:"microphone",participantIdentity:e.identity,roomId:n.id,publishedAt:i,muted:!1},{id:u("track"),kind:"video",source:"camera",participantIdentity:e.identity,roomId:n.id,publishedAt:i,muted:!1}];return t.trackIds.push(s[0].id,s[1].id),e.trackIds.push(s[2].id,s[3].id),{room:n,participant1:t,participant2:e,tracks:s}}H();var Ct=null;function f(n){return Ct||(Ct=v({organizationId:"storybook_org",apiUrl:"https://storybook.mock",latencyMs:50,autoEmitEvents:!0,...n})),Ct}var Kt={async receiveMessage(n,t){f().simulateIncomingMessage(n,t)},simulateJoin(n,t){f().simulateParticipantJoin(n,t)},simulateLeave(n){f().simulateParticipantLeave(n)},async simulateVideoParticipant(n,t,e){let s=f().room;s&&await s.simulateParticipantJoin(n,{name:t||n,kind:"standard",withCamera:e?.withCamera??!0,withMicrophone:e?.withMicrophone??!0})},async simulateVideoAgent(n,t){let i=f().room;i&&await i.simulateAgentJoin(n,t||"AI Agent")},async enableLocalCamera(){let t=f().room;t&&await t.localParticipant.setCameraEnabled(!0)},async disableLocalCamera(){let t=f().room;t&&await t.localParticipant.setCameraEnabled(!1)},async enableLocalMicrophone(){let t=f().room;t&&await t.localParticipant.setMicrophoneEnabled(!0)},async simulateMultipleParticipants(n){let t=["Alice","Bob","Carol","David","Eve","Frank","Grace","Henry","Ivy","Jack"],i=f().room;if(i)for(let s=0;s<Math.min(n,t.length);s++)await i.simulateParticipantJoin(`participant_${s+1}`,{name:t[s],kind:"standard",withCamera:!0,withMicrophone:!0}),await new Promise(r=>setTimeout(r,100))},clearParticipants(){let t=f().room;if(t)for(let e of t.remoteParticipants.keys())t.simulateParticipantLeave(e)},simulateCallRequest(n,t){f().simulateCallRequest({name:n,guestId:t||`guest_${Date.now()}`})},async simulateDisconnect(){await f().simulateDisconnect()},getEventHistory(){return f().getEventHistory()},exportState(){return f().exportState()},getRoom(){return f().room}};typeof window<"u"&&(window.MockServiceActions=Kt);y("MockConversationService",()=>{let n;N(()=>{K(),n=v({organizationId:"test_org",apiUrl:"https://mock.local"})}),we(async()=>{await n.destroy()}),y("initialization",()=>{l("should create a service with default configuration",()=>{let t=n.getConfig();o(t.organizationId).toBe("test_org"),o(t.apiUrl).toBe("https://mock.local"),o(t.latencyMs).toBe(0),o(t.strictMode).toBe(!1)}),l("should create a service with custom configuration",()=>{let e=v({latencyMs:100,strictMode:!0,seed:12345}).getConfig();o(e.latencyMs).toBe(100),o(e.strictMode).toBe(!0),o(e.seed).toBe(12345)}),l("should have an empty room initially",()=>{o(n.room).toBeDefined(),o(n.room.id).toBeUndefined()})}),y("user registration",()=>{l("should register a user successfully",async()=>{let t=await n.registerUser("user_123","secret");o(t.externalId).toBe("user_123"),o(t.organizationId).toBe("test_org"),o(t.role).toBe("user"),o(t.token).toContain("mock_token_")}),l("should set local participant identity after registration",async()=>{await n.registerUser("user_123","secret",{name:"Test User"}),o(n.room.localParticipant.identity).toBe("user_123"),o(n.room.localParticipant.name).toBe("Test User")}),l("should register an agent successfully",async()=>{let t=await n.registerAgent("agent_1",{name:"AI Assistant",email:"agent@test.com"});o(t).toContain("mock_token_"),o(n.room.localParticipant.identity).toBe("agent_1"),o(n.room.localParticipant.name).toBe("AI Assistant")})}),y("room lifecycle",()=>{N(async()=>{await n.registerUser("test_user","secret")}),l("should create a room successfully",async()=>{let t=await n.createRoom({language:"en",timezone:"UTC"});o(t.id).toBeDefined(),o(t.id).toContain("mock_room_"),o(t.state).toBe("connected")}),l("should set room metadata on creation",async()=>{let t=await n.createRoom({language:"es",timezone:"America/New_York",metadata:{custom:"data"}});o(t.groupId).toBeDefined(),o(t.createdAt).toBeDefined(),o(t.connectedAt).toBeDefined()}),l("should add local participant to room on creation",async()=>{await n.createRoom({language:"en",timezone:"UTC"});let t=n.getState().listParticipants(n.room.id);o(t).toHaveLength(1),o(t[0].identity).toBe("test_user"),o(t[0].isLocal).toBe(!0)}),l("should join an existing room",async()=>{let t=await n.createRoom({language:"en",timezone:"UTC"}),e=v();await e.registerUser("user_2","secret"),e.getState().createRoom("shared_room",t.groupId);let s=e.getState().listRooms()[0].id,r=await e.joinRoom(s,"UTC","en");o(r.id).toBe(s),o(r.state).toBe("connected"),await e.destroy()}),l("should throw error when joining non-existent room",async()=>{await o(n.joinRoom("non_existent_room","UTC","en")).rejects.toThrow(T)}),l("should close a room",async()=>{await n.createRoom({language:"en",timezone:"UTC"});let t=n.room.id;await n.closeRoom();let e=n.getState().getRoom(t);o(e?.isActive).toBe(!1),o(e?.endedAt).toBeDefined()}),l("should disconnect from a room",async()=>{await n.createRoom({language:"en",timezone:"UTC"}),await n.disconnect(),o(n.room.state).toBe("disconnected")}),l("should list rooms",async()=>{await n.createRoom({language:"en",timezone:"UTC"}),await n.createRoom({language:"es",timezone:"UTC"});let t=await n.getRooms({});o(t.items).toHaveLength(2),o(t.count).toBe(2)}),l("should filter rooms by status",async()=>{await n.createRoom({language:"en",timezone:"UTC"});let t=n.room.id;await n.createRoom({language:"es",timezone:"UTC"}),n.getState().endRoom(t);let e=await n.getRooms({roomStatus:"active"});o(e.items).toHaveLength(1);let i=await n.getRooms({roomStatus:"closed"});o(i.items).toHaveLength(1)})}),y("messaging",()=>{N(async()=>{await n.registerUser("test_user","secret"),await n.createRoom({language:"en",timezone:"UTC"})}),l("should send a message",async()=>{let t=[];n.subscribeMessages(e=>t.push(...e)),await n.sendMessage("Hello, world!"),o(t).toHaveLength(1),o(t[0].message).toBe("Hello, world!")}),l("should store messages in room state",async()=>{await n.sendMessage("First message"),await n.sendMessage("Second message");let t=n.getState().getMessages(n.room.id);o(t).toHaveLength(2),o(t[0].content).toBe("First message"),o(t[1].content).toBe("Second message")}),l("should emit message events",async()=>{let t=n.getEvents(),e=[];t.on("messageSent",i=>e.push(i)),await n.sendMessage("Test message"),o(e).toHaveLength(1)}),l("should get messages",async()=>{await n.sendMessage("Message 1"),await n.sendMessage("Message 2"),await n.sendMessage("Message 3");let t=await n.getMessages({limit:2});o(t).toHaveLength(2)}),l("should handle message subscriptions",async()=>{let t=[],e=n.subscribeMessages(i=>t.push(...i));await n.sendMessage("Test"),o(t).toHaveLength(1),e(),await n.sendMessage("After unsubscribe"),o(t).toHaveLength(1)})}),y("typing indicators",()=>{N(async()=>{await n.registerUser("test_user","secret"),await n.createRoom({language:"en",timezone:"UTC"})}),l("should send typing indicator",async()=>{let t=[];n.subscribeTypingIndicators(e=>t.push(e)),await n.sendTypingIndicator(!0),await n.sendTypingIndicator(!1),o(t).toHaveLength(2),o(t[0].isTyping).toBe(!0),o(t[1].isTyping).toBe(!1)}),l("should unsubscribe from typing indicators",async()=>{let t=[],e=i=>t.push(i);n.subscribeTypingIndicators(e),await n.sendTypingIndicator(!0),o(t).toHaveLength(1),n.unsubscribeTypingIndicators(e),await n.sendTypingIndicator(!1),o(t).toHaveLength(1)})}),y("agents",()=>{N(async()=>{await n.registerUser("test_user","secret"),await n.createRoom({language:"en",timezone:"UTC"})}),l("should start an agent in a room",async()=>{let t=await n.startMockAgent(n.room.id,{responseStrategy:"echo"});o(t).toBeDefined();let e=n.getState().listAgents(n.room.id);o(e).toHaveLength(1),o(e[0].status).toBe("running")}),l("should stop an agent",async()=>{let t=await n.startMockAgent(n.room.id);await n.stopMockAgent(t);let e=n.getState().getAgent(t);o(e?.status).toBe("stopped")}),l("should trigger echo response from agent",async()=>{await n.startMockAgent(n.room.id,{responseStrategy:"echo"});let t=[];n.subscribeMessages(i=>t.push(...i)),await n.sendMessage("Hello agent!"),o(t.length).toBeGreaterThanOrEqual(2);let e=t.find(i=>i.message?.startsWith("Echo:")||i.content?.startsWith("Echo:"));o(e).toBeDefined()}),l("should use canned responses",async()=>{await n.startMockAgent(n.room.id,{responseStrategy:"canned",cannedResponses:["Hello!","How can I help?"]});let t=[];n.subscribeMessages(i=>t.push(...i)),await n.sendMessage("Hi");let e=t.find(i=>i.message==="Hello!"||i.content==="Hello!");o(e).toBeDefined()}),l("should use sequential responses",async()=>{await n.startMockAgent(n.room.id,{responseStrategy:"sequential",cannedResponses:["First","Second","Third"]});let t=[];n.subscribeMessages(i=>t.push(...i)),await n.sendMessage("Message 1"),await n.sendMessage("Message 2"),await n.sendMessage("Message 3");let e=t.filter(i=>!i.message?.startsWith("Message")&&!i.content?.startsWith("Message")).map(i=>i.message||i.content);o(e).toContain("First"),o(e).toContain("Second"),o(e).toContain("Third")}),l("should use custom response handler",async()=>{await n.startMockAgent(n.room.id),n.setAgentResponseHandler((i,s)=>`Custom: ${s.toUpperCase()}`);let t=[];n.subscribeMessages(i=>t.push(...i)),await n.sendMessage("test");let e=t.find(i=>i.message==="Custom: TEST"||i.content==="Custom: TEST");o(e).toBeDefined()}),l("should be silent when configured",async()=>{await n.startMockAgent(n.room.id,{responseStrategy:"silent"});let t=[];n.subscribeMessages(e=>t.push(...e)),await n.sendMessage("Hello?"),o(t).toHaveLength(1)})}),y("event system",()=>{N(async()=>{await n.registerUser("test_user","secret")}),l("should emit room created event",async()=>{let t=n.getEvents(),e=[];t.on("roomCreated",i=>e.push(i)),await n.createRoom({language:"en",timezone:"UTC"}),o(e).toHaveLength(1)}),l("should emit participant joined event",async()=>{await n.createRoom({language:"en",timezone:"UTC"});let t=n.getEvents(),e=[];t.on("participantJoined",i=>e.push(i)),n.simulateParticipantJoin("new_participant","New User"),o(e).toHaveLength(1),o(e[0].participant.identity).toBe("new_participant")}),l("should emit participant left event",async()=>{await n.createRoom({language:"en",timezone:"UTC"}),n.simulateParticipantJoin("participant_1");let t=n.getEvents(),e=[];t.on("participantLeft",i=>e.push(i)),n.simulateParticipantLeave("participant_1"),o(e).toHaveLength(1)}),l("should track event history",async()=>{await n.createRoom({language:"en",timezone:"UTC"}),await n.sendMessage("Test");let t=n.getEventHistory();o(t.length).toBeGreaterThan(0);let e=n.getEventHistory("messageSent");o(e).toHaveLength(1)}),l("should support wildcard event listeners",async()=>{let t=n.getEvents(),e=[];t.onAny(i=>e.push(i)),await n.createRoom({language:"en",timezone:"UTC"}),o(e.length).toBeGreaterThan(0)})}),y("simulations",()=>{N(async()=>{await n.registerUser("test_user","secret"),await n.createRoom({language:"en",timezone:"UTC"})}),l("should simulate incoming message",async()=>{let t=[];n.subscribeMessages(e=>t.push(...e)),n.simulateIncomingMessage("other_user","Hello from outside!"),o(t).toHaveLength(1),o(t[0].message).toBe("Hello from outside!")}),l("should simulate room disconnect",async()=>{let t=n.getEvents(),e=[];t.on("roomConnectionStateChanged",i=>e.push(i)),await n.simulateDisconnect(),o(n.room.state).toBe("disconnected"),o(e).toHaveLength(1)}),l("should simulate call request",async()=>{let t=[];n.onNewCallRequest((e,i)=>t.push(i)),n.simulateCallRequest({guestId:"guest_1",name:"Guest User"}),o(t).toHaveLength(1),o(t[0].name).toBe("Guest User")})}),y("configuration",()=>{l("should apply latency configuration",async()=>{let t=v({latencyMs:50});await t.registerUser("user","secret");let e=Date.now();await t.createRoom({language:"en",timezone:"UTC"});let i=Date.now()-e;o(i).toBeGreaterThanOrEqual(45),await t.destroy()}),l("should support deterministic behavior with seed",async()=>{let t=v({seed:12345}),e=v({seed:12345}),i=t.getState().random(),s=e.getState().random();o(i).toBe(s)}),l("should apply scenario configuration",()=>{let t=v({scenario:"slow_network"});o(t.getConfig().latencyMs).toBe(500)}),l("should reset state",async()=>{await n.registerUser("user","secret"),await n.createRoom({language:"en",timezone:"UTC"}),await n.sendMessage("Test"),n.reset(),o(n.getState().listRooms()).toHaveLength(0),o(n.getEventHistory()).toHaveLength(0)})}),y("error handling",()=>{l("should throw error for unauthorized registration",async()=>{let t=v({errorConfig:{unauthorized:!0}});await o(t.registerUser("user","secret")).rejects.toThrow(m)}),l("should throw error for network issues",async()=>{let t=v({errorConfig:{networkError:!0}});await t.registerUser("user","secret"),await o(t.createRoom({language:"en",timezone:"UTC"})).rejects.toThrow(m)}),l("should throw probabilistic errors based on error rate",async()=>{let t=v({errorConfig:{errorRate:100}});await t.registerUser("user","secret"),await o(t.createRoom({language:"en",timezone:"UTC"})).rejects.toThrow()})}),y("state persistence",()=>{l("should export state to JSON",async()=>{await n.registerUser("user","secret"),await n.createRoom({language:"en",timezone:"UTC"}),await n.sendMessage("Test message");let t=n.exportState();o(t).toHaveProperty("rooms"),o(t).toHaveProperty("participants"),o(t).toHaveProperty("messages"),o(t).toHaveProperty("eventHistory")}),l("should import state from JSON",async()=>{await n.registerUser("user","secret"),await n.createRoom({language:"en",timezone:"UTC"});let t=n.room.id,e=n.getState().toJSON();n.reset(),n.getState().fromJSON(e);let i=n.getState().listRooms();o(i).toHaveLength(1),o(i[0].id).toBe(t)})})});y("ConversationServiceFactory",()=>{l("should create mock service with createMock",()=>{let n=R.createMock();o(R.isMockService(n)).toBe(!0)}),l("should create deterministic mock",()=>{let n=R.createDeterministicMock(42);o(n.getConfig().seed).toBe(42),o(n.getConfig().strictMode).toBe(!0)}),l("should check if service is mock",()=>{let n=R.createMock();o(R.isMockService(n)).toBe(!0)})});y("fixtures",()=>{l("should create default room fixture",()=>{let n=Q();o(n.id).toBeDefined(),o(n.name).toBeDefined(),o(n.isActive).toBe(!0),o(n.connectionState).toBe("connected")}),l("should create room with agent fixture",()=>{let{room:n,localParticipant:t,agent:e,agentParticipant:i}=pt();o(n.participantIds).toContain(t.identity),o(n.participantIds).toContain(i.identity),o(e.status).toBe("running"),o(i.role).toBe("agent")}),l("should create chat scenario fixture",()=>{let{room:n,user:t,agent:e,messages:i}=wt();o(n).toBeDefined(),o(t).toBeDefined(),o(e).toBeDefined(),o(i.length).toBeGreaterThan(0)}),l("should create video call scenario fixture",()=>{let{room:n,participant1:t,participant2:e,tracks:i}=Tt();o(n).toBeDefined(),o(t).toBeDefined(),o(e).toBeDefined(),o(i).toHaveLength(4)})});
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.187 | © 2026 Onlive.ai */
|
|
2
|
+
var Gt=Object.defineProperty;var Wt=(n,t)=>()=>(n&&(t=n(n=0)),t);var Qt=(n,t)=>{for(var e in t)Gt(n,e,{get:t[e],enumerable:!0})};var j={};Qt(j,{SYNTHETIC_MEDIA_PRESETS:()=>Rt,createSyntheticAudioTrack:()=>St,createSyntheticMedia:()=>bt,createSyntheticMediaFromPreset:()=>$t,createSyntheticVideoTrack:()=>Mt});function Mt(n={}){let{width:t=640,height:e=480,fps:i=30,backgroundColor:s="#1a1a2e",foregroundColor:r="#4361ee",label:c="Mock Video",animation:a="wave"}=n,g=document.createElement("canvas");g.width=t,g.height=e;let d=g.getContext("2d"),h,z=Date.now(),X={wave:w=>{d.fillStyle=s,d.fillRect(0,0,t,e),d.strokeStyle=r,d.lineWidth=3,d.beginPath();for(let k=0;k<t;k++){let S=e/2+Math.sin(k/t*4*Math.PI+w*.002)*(e/4);k===0?d.moveTo(k,S):d.lineTo(k,S)}d.stroke()},pulse:w=>{d.fillStyle=s,d.fillRect(0,0,t,e);let k=Math.sin(w*.003)*.3+.7,S=Math.min(t,e)*.3*k;d.beginPath(),d.arc(t/2,e/2,S,0,Math.PI*2),d.fillStyle=r,d.fill()},bars:w=>{d.fillStyle=s,d.fillRect(0,0,t,e);let k=20,S=t/k,D=e*.7;d.fillStyle=r;for(let F=0;F<k;F++){let It=Math.abs(Math.sin(F/k*Math.PI*2+w*.004))*D,Vt=F*S,Jt=e-It;d.fillRect(Vt+2,Jt,S-4,It)}},avatar:w=>{d.fillStyle=s,d.fillRect(0,0,t,e);let k=t/2,S=e/2-20,D=Math.min(t,e)*.15;d.beginPath(),d.arc(k,S,D,0,Math.PI*2),d.fillStyle=r,d.fill(),d.beginPath(),d.ellipse(k,S+D*2.2,D*1.5,D,0,Math.PI,0),d.fill(),Math.sin(w*.01)>0&&(d.beginPath(),d.arc(k,S+D*3,5+Math.sin(w*.02)*3,0,Math.PI*2),d.fillStyle="#22c55e",d.fill())},none:()=>{d.fillStyle=s,d.fillRect(0,0,t,e)}},Y=()=>{d.fillStyle="rgba(255, 255, 255, 0.8)",d.font=`${Math.floor(e*.04)}px system-ui, sans-serif`,d.textAlign="center",d.fillText(c,t/2,e-20)},q=()=>{let w=Date.now()-z;X[a](w),Y(),h=requestAnimationFrame(q)};q();let Pt=g.captureStream(i),At=Pt.getVideoTracks()[0];return{track:At,stream:Pt,cleanup:()=>{cancelAnimationFrame(h),At.stop()}}}function St(n={}){let{frequency:t=440,volume:e=.1,waveType:i="sine",addVariation:s=!0,enabled:r=!1}=n,c=new AudioContext,a=c.createMediaStreamDestination(),g=c.createOscillator();g.type=i,g.frequency.value=t;let d=c.createGain();d.gain.value=r?e:0;let h=null,z=null;s&&(h=c.createOscillator(),h.frequency.value=.5,z=c.createGain(),z.gain.value=10,h.connect(z),z.connect(g.frequency),h.start()),g.connect(d),d.connect(a),g.start();let X=a.stream,Y=X.getAudioTracks()[0];return{track:Y,stream:X,setVolume:q=>{d.gain.value=Math.max(0,Math.min(1,q))},setEnabled:q=>{d.gain.value=q?e:0},cleanup:()=>{g.stop(),h?.stop(),c.close(),Y.stop()}}}function bt(n,t){let e=Mt(n),i=St(t),s=new MediaStream([e.track,i.track]);return{videoTrack:e.track,audioTrack:i.track,combinedStream:s,setAudioVolume:i.setVolume,setAudioEnabled:i.setEnabled,cleanup:()=>{e.cleanup(),i.cleanup()}}}function $t(n){let t=Rt[n];return bt(t.video,t.audio)}var Rt,H=Wt(()=>{"use strict";Rt={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}}}});import{afterEach as we,beforeEach as N,describe as y,expect as o,it as l}from"vitest";var ht=0;function K(){ht=0}function u(n){return ht++,`mock_${n}_${ht}_${Date.now().toString(36)}`}function I(n,t,e){let i=e||new Date().toISOString(),s=typeof btoa=="function"?btoa(i).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,""):i.replace(/[^a-zA-Z0-9]/g,"");return`mock_token_${n}_${t}_${s}`}function V(n){return`wss://mock-livekit.local/room/${n}`}var Z={responseStrategy:"echo",responseDelayMs:100,cannedResponses:[],type:"text",nature:"ai",simulateTyping:!1,typingDelayPerChar:20};function tt(n,t,e=[],i=0,s=Math.random){switch(n){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 r=Math.floor(s()*e.length);return{response:e[r],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 $=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={...Z,...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=tt(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:u("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 m=class n extends Error{constructor(t,e,i){super(e),this.name="MockLiveKitError",this.code=t,this.details=i,typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,n)}toMockError(){return{code:this.code,message:this.message,details:this.details}}static fromMockError(t){return new n(t.code,t.message,t.details)}},T=class extends m{constructor(t){super("ROOM_NOT_FOUND",`Room not found: ${t}`,{roomId:t}),this.name="RoomNotFoundError"}},et=class extends m{constructor(t){super("ROOM_ENDED",`Room has ended: ${t}`,{roomId:t}),this.name="RoomEndedError"}},it=class extends m{constructor(t,e){super("PARTICIPANT_ALREADY_JOINED",`Participant ${t} is already in room ${e}`,{identity:t,roomId:e}),this.name="ParticipantAlreadyJoinedError"}},nt=class extends m{constructor(t){super("PARTICIPANT_NOT_FOUND",`Participant not found: ${t}`,{identity:t}),this.name="ParticipantNotFoundError"}},st=class extends m{constructor(t){super("TRACK_NOT_FOUND",`Track not found: ${t}`,{trackId:t}),this.name="TrackNotFoundError"}},rt=class extends m{constructor(t){super("AGENT_NOT_FOUND",`Agent not found: ${t}`,{agentId:t}),this.name="AgentNotFoundError"}},ot=class extends m{constructor(t="Unauthorized"){super("UNAUTHORIZED",t),this.name="UnauthorizedError"}},at=class extends m{constructor(t="Network error occurred"){super("NETWORK_ERROR",t),this.name="NetworkError"}},ct=class extends m{constructor(t,e){super("INVALID_OPERATION",t,e),this.name="InvalidOperationError"}},dt=class extends m{constructor(t,e){super("TIMEOUT",`Operation timed out: ${t}`,{operation:t,timeoutMs:e}),this.name="TimeoutError"}};function J(n){switch(n.code){case"ROOM_NOT_FOUND":return new T(n.details?.roomId??"unknown");case"ROOM_ENDED":return new et(n.details?.roomId??"unknown");case"PARTICIPANT_ALREADY_JOINED":return new it(n.details?.identity??"unknown",n.details?.roomId??"unknown");case"PARTICIPANT_NOT_FOUND":return new nt(n.details?.identity??"unknown");case"TRACK_NOT_FOUND":return new st(n.details?.trackId??"unknown");case"AGENT_NOT_FOUND":return new rt(n.details?.agentId??"unknown");case"UNAUTHORIZED":return new ot(n.message);case"NETWORK_ERROR":return new at(n.message);case"INVALID_OPERATION":return new ct(n.message,n.details);case"TIMEOUT":return new dt(n.details?.operation??"unknown",n.details?.timeoutMs??0);default:return m.fromMockError(n)}}function E(n){return typeof n=="object"&&n!==null&&"code"in n&&"message"in n&&typeof n.code=="string"&&typeof n.message=="string"}var G=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=s=>{this.off(t,i),e(s)};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(s){console.error(`Error in mock event listener for ${t.type}:`,s)}for(let i of this.wildcardListeners)try{i(t)}catch(s){console.error("Error in mock wildcard event listener:",s)}}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 s={type:"roomConnectionStateChanged",timestamp:new Date().toISOString(),roomId:t,state:e,previousState:i};this.emit(s)}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,s){let r={type:"participantAttributesChanged",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,attributes:i,previousAttributes:s};this.emit(r)}emitTrackPublished(t,e,i){let s={type:"trackPublished",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,track:i};this.emit(s)}emitTrackUnpublished(t,e,i){let s={type:"trackUnpublished",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,trackId:i};this.emit(s)}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 s={type:"typingIndicator",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,isTyping:i};this.emit(s)}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 s={type:"agentMessage",timestamp:new Date().toISOString(),roomId:t,agentId:e,message:i};this.emit(s)}emitDataReceived(t,e,i,s){let r={type:"dataReceived",timestamp:new Date().toISOString(),roomId:t,participantIdentity:e,data:i,topic:s};this.emit(r)}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(s=>s.type===e):this.eventHistory).slice(-t)}clearHistory(){this.eventHistory=[]}listenerCount(t){return(this.listeners[t]?.size??0)+this.wildcardListeners.size}};import{Session as ft}from"@onlive.ai/tracker/session";import{Room as pe,RoomEvent as vt}from"livekit-client";import{initializeApp as Yt}from"firebase/app";import{query as O,endAt as Zt,equalTo as te,get as Et,getDatabase as ee,limitToFirst as ie,limitToLast as ne,onChildAdded as Ot,onChildChanged as xt,onChildRemoved as _t,onDisconnect as Lt,onValue as Ut,orderByChild as se,orderByKey as re,orderByValue as oe,push as ae,ref as ce,remove as de,runTransaction as ge,set as Dt,startAt as le,update as ue}from"firebase/database";var gt=class{constructor(t){this.onChildChanged=(t,e)=>xt(this.ref(t),i=>e(i.key||"",i.val(),i));this.onChildRemoved=(t,e)=>_t(this.ref(t),i=>e(i.key||"",i.val(),i));this.onChildChangedQuery=(t,e)=>xt(t,i=>e(i.key||"",i.val(),i));this.onChildRemovedQuery=(t,e)=>_t(t,i=>e(i.key||"",i.val(),i));let e=Yt(t.config);this.db=ee(e)}ref(t){return ce(this.db,t)}async getOnce(t){let e=await Et(this.ref(t));return e.exists()?e.val():null}async getOnceQuery(t){let e=await Et(t),i=[];return e.exists()&&e.forEach(s=>{i.push({key:s.key||"",value:s.val()})}),i}onValue(t,e){return Ut(this.ref(t),i=>e(i.key??"",i.val(),i),i=>console.error("onValue error",i))}onValueQuery(t,e){return Ut(t,i=>e(i.key??"",i.val(),i),i=>console.error("onValueQuery error",i))}onChildAdded(t,e){return Ot(this.ref(t),i=>e(i.key||"",i.val(),i),i=>console.error("onChildAdded error",i))}onChildAddedQuery(t,e){return Ot(t,i=>e(i.key||"",i.val(),i),i=>console.error("onChildAddedQuery error",i))}write(t,e){return Dt(this.ref(t),e)}update(t,e){return ue(this.ref(t),e)}remove(t){return de(this.ref(t))}async push(t,e){let i=ae(this.ref(t));return await Dt(i,e),i.key}onDisconnectUpdate(t,e){return Lt(this.ref(t)).update(e)}cancelOnDisconnect(t){return Lt(this.ref(t)).cancel()}transaction(t,e){return ge(this.ref(t),i=>e(i))}query(t,e={}){let i=this.ref(t);return e.orderBy==="child"&&e.childKey&&(i=O(i,se(e.childKey))),e.orderBy==="key"&&(i=O(i,re())),e.orderBy==="value"&&(i=O(i,oe())),e.startAt!=null&&(i=O(i,le(e.startAt))),e.endAt!=null&&(i=O(i,Zt(e.endAt))),e.equalTo!=null&&(i=O(i,te(e.equalTo))),e.limitFirst!=null&&(i=O(i,ie(e.limitFirst))),e.limitLast!=null&&(i=O(i,ne(e.limitLast))),i}};var p=async(n,t)=>{let e=await fetch(n,t);if(!e.ok){let i=await e.json().catch(()=>({}));throw new Error(JSON.stringify({status:e.status,statusText:e.statusText,...i}))}return e&&e.json()};var Ht=n=>{let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",e="";for(let i=0;i<n;i++)e+=t.charAt(Math.floor(Math.random()*t.length));return e};import{Generator as me}from"@onlive.ai/tracker/generator";import{Session as M}from"@onlive.ai/tracker/session";var x="chatbot",lt=class n{static hasSession(){return!!M.getCookie(x)}static getSession(t={role:"guest",regenerate:!1}){t.regenerate&&(M.id=me.uuid(),M.deleteCookie(x));let e=M.getCookie(x);return e&&n.isValidSession(e,t.role)?e:n.createSession(t.role)}static createSession(t){let e={externalId:t==="agent"?String(n.getUserId()||M.id):M.id,secret:Ht(16),createdAt:new Date().toISOString()};return M.setCookie(x,e,3600*24*365),e}static isValidSession(t,e){if(e==="guest")return!0;let i=n.getUserId();return!!(i&&String(i)===t.externalId)}static getUserId(){return M.getCookie("user-id",{objectKey:"userId",storageKey:"user",storageType:"localStorage",ttl:3600*24*365,preserveData:!0})}static updateSessionWithRegistrationData(t){let e=M.getCookie(x);if(e||(e=n.createSession("guest")),e){let i={...e,registrationData:t};M.setCookie(x,i,3600*24*365)}}static hasRegistrationData(){return!!M.getCookie(x)?.registrationData}static async getAgentInfo(t){return fetch(`${t}/api/v1/auth/user-info`,{credentials:"include"}).then(e=>e.json())}static getRegistrationData(){return M.getCookie(x)?.registrationData}};var Nt="lk.chat",zt="lk.transcription",qt="lk.events",kt="typing-indicator";var yt=class extends pe{},ut=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,s=t.info?.attributes?.["lk.segment_id"];s&&(this.transcriptionMap.has(s)?i=this.transcriptionMap.get(s)||"":this.transcriptionMap.set(s,i));let r=e?.identity?this.room.getParticipantByIdentity(e.identity):void 0,c="";for await(let a of t)c+=a,this.emitMessage({id:i,timestamp:Date.now(),message:c,assets:JSON.parse(t.info?.attributes?.assets||"[]"),from:r});this.messagePersistence==="client"&&this.persistMessage({roomId:this.room.id,content:c,externalId:i,identity:r?.identity,kind:r?.kind})};this.emitMessage=t=>{for(let e of this.listeners)e([t])};this.handleDataReceived=(t,e,i,s)=>{if(s===kt)try{let r=JSON.parse(new TextDecoder().decode(t));if(r.type==="typing"&&r.participantId!==this.room.localParticipant.identity){let c={type:"typing",isTyping:r.isTyping,timestamp:r.timestamp,participantId:r.participantId};this.emitTypingIndicator(c)}}catch(r){console.warn("Failed to parse typing indicator:",r)}};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||Nt,this.transcriptionTopic=t.transcriptionTopic||zt,this.eventsTopic=t.eventsTopic||qt,this.messagePersistence=t.messagePersistence||"disabled",this.room=this.createRoomInstance(),t.firebaseConfig&&this.initializeFirebase(t.firebaseConfig)}createRoomInstance(){return new yt({adaptiveStream:!0,dynacast:!0})}ensureRoom(){return this.room||(this.room=this.createRoomInstance()),this.room}initializeFirebase(t){this.firebaseApi=new gt({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(vt.DataReceived,this.handleDataReceived),this.room.registerTextStreamHandler(this.channelTopic,this.handleIncomingMessage),this.room.registerTextStreamHandler(this.transcriptionTopic,this.handleIncomingMessage),this.room.on(vt.DataReceived,this.handleDataReceived)}async registerUser(t,e,i,s){let r=await p(`${this.apiUrl}/users/register`,{method:"POST",body:JSON.stringify({externalId:t,secret:e,...i,metadata:s}),headers:{"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.register.signal});if(!r.token)throw new Error("Registration failed: No token received from server");return this.authToken=r.token,r}async registerAgent(t,e){let i=ft.getCookie("livekit-agent-token");if(i){if(this.decodeJwtPayload(i)?.username===e.name)return this.authToken=i,i;ft.deleteCookie("livekit-agent-token")}let s=await p(`${this.authUrl}/admins/register`,{method:"POST",body:JSON.stringify({externalId:t,name:e.name,email:e.email,avatar:e.avatar}),headers:{"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},credentials:"include",signal:this.abortControllers.register.signal});return ft.setCookie("livekit-agent-token",s.token,1440*60),this.authToken=s.token,s.token}decodeJwtPayload(t){try{let e=t.split(".");if(e.length!==3)return null;let i=e[1],s=atob(i.replace(/-/g,"+").replace(/_/g,"/"));return JSON.parse(s)}catch{return null}}async quickStart(t){console.log("[ConversationService] Starting quickStart with options:",t),this.room=this.ensureRoom();let e=await p(`${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,s=await p(`${this.apiUrl}/rooms`,{method:"POST",body:JSON.stringify(i),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.createRoom.signal});return this.setRoomMetadata(s),this.setupParticipantAttributesHandler(),this.room.connect(s.wsURL,s.token).then(async()=>{if(e)try{await this.sendMessage(e)}catch(r){console.error("[ConversationService] Failed to send initial message:",r)}}),this.initializeRoomHandlers(),this.room}async joinRoom(t,e,i,s){let r=await p(`${this.apiUrl}/rooms/${t}/join`,{method:"POST",body:JSON.stringify({timezone:e,language:i,...s??{}}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.createRoom.signal});return this.setRoomMetadata(r),this.setupParticipantAttributesHandler(),await this.room.connect(r.wsURL,r.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(vt.ParticipantAttributesChanged,t=>{t.identity===this.room.localParticipant.identity&<.updateSessionWithRegistrationData(t.attributes)})}async evaluateRoom(t){let e=t.roomId||this.room?.id;if(!e)throw new Error("Room ID is required for evaluation");return p(`${this.apiUrl}/rooms/${e}/evaluate`,{method:"POST",body:JSON.stringify({rating:t.rating,comment:t.comment}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.evaluateRoom.signal})}async closeRoom(){this.room&&(await p(`${this.apiUrl}/rooms/${this.room.id}/close`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.closeRoom.signal}),await this.stopAndUnpublishLocalTracks())}async disconnect(){this.room&&(await this.stopAndUnpublishLocalTracks(),this.room.removeAllListeners(),await this.room.disconnect(),this.room=null)}async stopAndUnpublishLocalTracks(){let t=this.room?.localParticipant;if(!t)return;await Promise.allSettled([t.setMicrophoneEnabled(!1),t.setCameraEnabled(!1),t.setScreenShareEnabled(!1)]);let e=Array.from(t.trackPublications.values());await Promise.all(e.map(async i=>{let s=i.track;if(s)try{await t.unpublishTrack(s,!0)}catch{s.stop()}}))}async disconnectAndCloseRoom(){await this.closeRoom(),await this.disconnect()}async readRoom(t){return p(`${this.apiUrl}/rooms/${t}/read`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.persistMessage.signal})}async getRooms(t){let e=new URLSearchParams;return t.page&&e.append("page",t.page.toString()),t.limit&&e.append("limit",t.limit.toString()),t.offset&&e.append("offset",t.offset.toString()),t.orderBy&&e.append("orderBy",t.orderBy),t.orderDir&&e.append("orderDir",t.orderDir),t.ids?.length&&e.append("ids",t.ids.join(",")),t.with?.length&&e.append("with",t.with.join(",")),t.count?.length&&e.append("count",t.count.join(",")),t.latestOnly&&e.append("latestOnly",t.latestOnly.toString()),t.includeUnread&&e.append("includeUnread",t.includeUnread.toString()),t.roomStatus&&e.append("roomStatus",t.roomStatus),t.archived&&e.append("archived",t.archived.toString()),t.participantIds?.length&&e.append("participantIds",t.participantIds.join(",")),t.participantExternalIds?.length&&e.append("participantExternalIds",t.participantExternalIds.join(",")),t.groupId&&e.append("groupId",t.groupId),t.hasMessages!==void 0&&e.append("hasMessages",t.hasMessages.toString()),p(`${this.authUrl}/rooms?${e}`,{method:"GET",headers:{"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},credentials:"include",signal:this.abortControllers.getRooms.signal})}async sendMessage(t,e){let i=await this.room.localParticipant.sendText(t,{topic:this.channelTopic,attributes:e});this.emitMessage({id:i.id,timestamp:Date.now(),message:t,assets:JSON.parse(e?.assets||"[]"),from:this.room.localParticipant}),this.messagePersistence==="client"&&this.persistMessage({roomId:this.room.id,content:t,externalId:i.id,identity:this.room.localParticipant?.identity,kind:this.room.localParticipant?.kind})}async persistMessage(t){return p(`${this.apiUrl}/messages/create`,{method:"POST",body:JSON.stringify(t),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.persistMessage.signal})}async getMessages(t){let e=new URLSearchParams;return t.limit&&e.append("limit",t.limit.toString()),t.with&&e.append("with",t.with.join(",")),(await p(`${this.apiUrl}/messages/search${e.size?`?${e.toString()}`:""}`,{method:"POST",body:JSON.stringify(t),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.createRoom.signal})).items}async sendMessageReport(t){try{return p(`${this.apiUrl}/messages/${t.messageId}/report`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.sendMessageReport.signal})}catch(e){console.error("Error sending message report:",e)}}async deleteMessageReport(t){try{return p(`${this.apiUrl}/messages/${t.messageId}/report`,{method:"DELETE",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.deleteMessageReport.signal})}catch(e){console.error("Error deleting message report:",e)}}async updateMessageReactions(t){try{return p(`${this.apiUrl}/messages/${t.messageId}/reactions`,{method:"PATCH",body:JSON.stringify({add:t.add||[],remove:t.remove||[]}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},signal:this.abortControllers.updateMessageReactions.signal})}catch(e){console.error("Error updating message reactions:",e)}}subscribeMessages(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}async sendTypingIndicator(t){if(!(!this.room||this.room.state!=="connected"))try{let e=new TextEncoder().encode(JSON.stringify({type:"typing",isTyping:t,timestamp:Date.now(),participantId:this.room.localParticipant.identity}));await this.room.localParticipant.publishData(e,{reliable:!1,topic:kt})}catch(e){console.warn("Failed to send typing indicator:",e)}}subscribeTypingIndicators(t){return this.typingListeners.add(t),()=>{this.typingListeners.delete(t)}}unsubscribeTypingIndicators(t){this.typingListeners.delete(t)}async sendContextualEvent(t){try{let e=JSON.stringify(t);await this.room.localParticipant.sendText(e,{topic:this.eventsTopic})}catch(e){console.warn("Failed to send event:",e)}}async requestNewRoom(t){return p(`${this.apiUrl}/rooms/request-new`,{method:"POST",body:JSON.stringify(t),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}async confirmRoomRequest(t){return p(`${this.apiUrl}/rooms/confirm-call`,{method:"POST",body:JSON.stringify({roomId:t}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}async cancelRoomRequest(t){return p(`${this.apiUrl}/rooms/cancel-call`,{method:"POST",body:JSON.stringify({roomId:t}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}async finishCall(){if(this.room?.id)return p(`${this.apiUrl}/rooms/finish-call`,{method:"POST",body:JSON.stringify({roomId:this.room.id}),headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"}})}isFirebaseEnabled(){return!!(this.firebaseApi&&this.presencePath&&this.callsPath)}getFirebase(){if(!this.firebaseApi||!this.presencePath||!this.callsPath)throw new Error("Firebase is not initialized. Provide firebaseConfig in constructor.");return{api:this.firebaseApi,presencePath:this.presencePath,callsPath:this.callsPath}}buildAgentPresencePath(t){return`${this.presencePath}/${t}`}onPresenceChange(t){let{api:e,presencePath:i}=this.getFirebase();return e.onChildChanged(i,(s,r)=>t(s,r))}onPresenceAgentChange(t,e){let{api:i}=this.getFirebase();return i.onValue(this.buildAgentPresencePath(t),(s,r)=>e(s,r))}async createCallRequest(t){let{api:e,callsPath:i}=this.getFirebase(),r=(await p(`${this.apiUrl}/rooms/call-request`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},body:JSON.stringify(t)})).id;return e.onDisconnectUpdate(`${i}/${r}`,{status:"disconnected"}),r}onNewCallRequest(t){let{api:e,callsPath:i}=this.getFirebase();return e.onChildAdded(i,(s,r)=>t(s,{...r,id:s}))}onCallRequestChange(t){let{api:e,callsPath:i}=this.getFirebase();return e.onChildChanged(i,(s,r)=>t(s,{...r,id:s}))}onCallRequestRemoved(t){let{api:e,callsPath:i}=this.getFirebase();return e.onChildRemoved(i,s=>t(s))}async acceptCallRequest(t){let{api:e,callsPath:i}=this.getFirebase();return await e.cancelOnDisconnect(`${i}/${t}`),e.update(`${i}/${t}`,{status:"accepted"})}async cancelCallRequest(t){let{api:e,callsPath:i}=this.getFirebase();await e.cancelOnDisconnect(`${i}/${t}`),await p(`${this.apiUrl}/rooms/call-request/cancel`,{method:"POST",headers:{Authorization:`Bearer ${this.authToken}`,"X-Onlive-Organization-Id":this.organizationId,"Content-Type":"application/json"},body:JSON.stringify({callId:t})})}async cancelOnDisconnect(t){let{api:e,callsPath:i}=this.getFirebase();await e.cancelOnDisconnect(`${i}/${t}`)}subscribePendingRequests(t,e={}){let{api:i,callsPath:s}=this.getFirebase();e.resetSeen&&this.seenRequestIds.clear(),this.firebaseUnsubscribers["pending-requests"]?.();let r=i.query(s,{orderBy:"child",childKey:"status",equalTo:"pending"}),c=i.onChildAddedQuery(r,(a,g)=>{if(!a||this.seenRequestIds.has(a))return;let d={...g,id:a};this.seenRequestIds.add(a),t(a,d)});return this.firebaseUnsubscribers["pending-requests"]=c,()=>{c?.(),delete this.firebaseUnsubscribers["pending-requests"]}}subscribeRequestChanges(t){let{api:e,callsPath:i}=this.getFirebase();this.firebaseUnsubscribers["request-changes"]?.();let s=e.onChildChanged(i,(r,c)=>{if(!r)return;let a=JSON.stringify(c);this.lastSnapshotById.get(r)!==a&&(this.lastSnapshotById.set(r,a),t(r,{...c,id:r}))});return this.firebaseUnsubscribers["request-changes"]=s,()=>{s?.(),delete this.firebaseUnsubscribers["request-changes"]}}async tryAcceptRequest(t){let{api:e,callsPath:i}=this.getFirebase(),s=`${i}/${t}`;return await e.transaction(s,c=>c&&(c.status==="pending"?{...c,status:"accepted"}:c)),(await e.getOnce(s))?.status==="accepted"}onRoomSync(t,e){let{api:i}=this.getFirebase(),s=`orgs/${this.organizationId}/rooms/${t}/sync`;return i.onValue(s,(r,c)=>{e(c)})}async clearRoomSync(t,e){let{api:i}=this.getFirebase(),s=`orgs/${this.organizationId}/rooms/${t}/sync`;await i.write(s,{needsSync:!1,reason:e||null,timestamp:Date.now()})}onNewRoomRequest(t,e){let{api:i}=this.getFirebase(),s=`orgs/${this.organizationId}/rooms/${t}/call`;return i.onValue(s,(r,c)=>{e(c)})}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 C=class{constructor(t,e,i,s){this.muted=!1;this.enabled=!0;this.attachedElements=new Set;this.kind=t,this.source=e,this.sid=u("TR"),this.mediaStreamTrack=i,this.mediaCleanup=s}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)}},b=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 B=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=u("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:s}=await Promise.resolve().then(()=>(H(),j)),{track:r,cleanup:c}=s({animation:"avatar",label:this.name||"Local Camera"}),a=new C("video","camera",r,c),g=new b(a,e?.name);return this.trackPublications.set("camera",g),this.videoTrackPublications.set(a.sid,g),this.room.emit("localTrackPublished",g,this),g}let i=this.trackPublications.get("camera");i&&(i.track?.stop(),this.trackPublications.delete("camera"),this.videoTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async setMicrophoneEnabled(t,e){if(this._microphoneEnabled=t,t){let{createSyntheticAudioTrack:s}=await Promise.resolve().then(()=>(H(),j)),{track:r,cleanup:c}=s({enabled:!1}),a=new C("audio","microphone",r,c),g=new b(a,e?.name);return this.trackPublications.set("microphone",g),this.audioTrackPublications.set(a.sid,g),this.room.emit("localTrackPublished",g,this),g}let i=this.trackPublications.get("microphone");i&&(i.track?.stop(),this.trackPublications.delete("microphone"),this.audioTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async setScreenShareEnabled(t,e){if(this._screenShareEnabled=t,t){let{createSyntheticVideoTrack:s}=await Promise.resolve().then(()=>(H(),j)),{track:r,cleanup:c}=s({animation:"bars",label:"Screen Share",width:1920,height:1080}),a=new C("video","screen_share",r,c),g=new b(a,e?.name||"screen");return this.trackPublications.set("screen_share",g),this.videoTrackPublications.set(a.sid,g),this.room.emit("localTrackPublished",g,this),g}let i=this.trackPublications.get("screen_share");i&&(i.track?.stop(),this.trackPublications.delete("screen_share"),this.videoTrackPublications.delete(i.trackSid),this.room.emit("localTrackUnpublished",i,this))}async publishTrack(t,e){let i=new b(t,e?.name),s=e?.source||t.source;return this.trackPublications.set(s,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:u("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 he(n){switch(n){case"standard":return 0;case"ingress":return 1;case"egress":return 2;case"sip":return 3;case"agent":return 4;default:return 0}}var _=class{constructor(t,e,i={},s="standard"){this.connectionQuality="excellent";this.isSpeaking=!1;this.audioLevel=0;this.trackPublications=new Map;this.identity=t,this.sid=u("PA"),this.name=e,this.attributes=i,this._kindString=s,this.kind=he(s),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 L=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 B(this),this.sid=u("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=(...s)=>{this.off(t,i),e(...s)};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 s of i)try{s(...e)}catch(r){console.error(`Error in mock room event handler for ${t}:`,r)}}registerRpcMethod(t,e){this.rpcHandlers.set(t,e)}unregisterRpcMethod(t){this.rpcHandlers.delete(t)}async callRpc(t,e,i,s=1e4){let r=this.rpcHandlers.get(t);if(!r)throw new Error(`RPC method not found: ${t}`);return r({callerIdentity:e,payload:i,responseTimeout:s})}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 _(this.localParticipant.identity,this.localParticipant.name,this.localParticipant.attributes):this.remoteParticipants.get(t)}getParticipantBySid(t){if(t===this.localParticipant.sid)return new _(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 _(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 s=this.remoteParticipants.get(t);if(!s)return;let r,c;if(e==="video"){let{createSyntheticVideoTrack:d}=await Promise.resolve().then(()=>(H(),j)),h=d({animation:s.isAgent?"avatar":"pulse",label:s.name||t,foregroundColor:s.isAgent?"#22c55e":"#4361ee"});r=h.track,c=h.cleanup}else if(e==="audio"){let{createSyntheticAudioTrack:d}=await Promise.resolve().then(()=>(H(),j)),h=d({enabled:!1});r=h.track,c=h.cleanup}let a=new C(e,i,r,c),g=new b(a);return s.addTrackPublication(g),this.emit("trackSubscribed",a,g,s),this.emit("trackPublished",g,s),a}simulateTrackUnpublished(t,e){let i=this.remoteParticipants.get(t);if(!i)return;let s=i.getTrackPublication(e);s&&(i.removeTrackPublication(s.trackSid),this.emit("trackUnpublished",s,i),this.emit("trackUnsubscribed",s.track,s,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 s={...i.attributes};i.setAttributes(e),this.emit("participantAttributesChanged",e,s,i)}}simulateTrackMuted(t,e,i){let s=this.remoteParticipants.get(t);if(!s)return;let r=s.getTrackPublication(e);r?.track&&(r.track.setMuted(i),this.emit(i?"trackMuted":"trackUnmuted",r,s))}simulateActiveSpeakersChanged(t){let e=[];for(let i of t){let s=this.remoteParticipants.get(i);s&&(s.startSpeaking(),e.push(s))}this.emit("activeSpeakersChanged",e)}simulateDataReceived(t,e,i,s){let r=this.remoteParticipants.get(e);this.emit("dataReceived",t,r,i,s)}};var W=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 s=u("room"),r=new Date().toISOString(),c={id:s,name:t,groupId:e||u("group"),createdAt:r,metadata:i,isActive:!0,participantIds:[],connectionState:"disconnected",wsURL:V(s),token:I(s,"pending",r)};return this.rooms.set(s,c),this.messages.set(s,[]),c}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 s=i.connectionState;return i.connectionState=e,s}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 s=this.participants.get(i);s&&(s.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,s]of this.tracks)s.roomId===t&&this.tracks.delete(i);for(let[i,s]of this.agents)s.roomId===t&&this.agents.delete(i);return this.messages.delete(t),this.rooms.delete(t),!0}addParticipant(t,e,i,s="user",r="standard",c=!1){let a=this.rooms.get(t);if(!a)return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);if(!a.isActive)return this.createError("ROOM_ENDED",`Room ${t} has ended`);let g=this.participants.get(e);if(g&&g.roomId===t&&g.isConnected)return this.config.strictMode?this.createError("PARTICIPANT_ALREADY_JOINED",`Participant ${e} is already in room ${t}`):g;let d={identity:e,name:i||e,roomId:t,joinedAt:new Date().toISOString(),isConnected:!0,trackIds:[],role:s,attributes:{},kind:r,isLocal:c};return this.participants.set(e,d),a.participantIds.push(e),d}getParticipant(t){return this.participants.get(t)}listParticipants(t,e=!0){let i=this.rooms.get(t);if(!i)return[];let s=[];for(let r of i.participantIds){let c=this.participants.get(r);c&&(!e||c.isConnected)&&s.push(c)}return s}updateParticipantAttributes(t,e){let i=this.participants.get(t);if(!i)return;let s={...i.attributes};return i.attributes={...i.attributes,...e},s}removeParticipant(t){let e=this.participants.get(t);if(!e)return;e.isConnected=!1;for(let s of e.trackIds)this.tracks.delete(s);e.trackIds=[];let i=this.rooms.get(e.roomId);if(i){let s=i.participantIds.indexOf(t);s!==-1&&i.participantIds.splice(s,1)}return e}publishTrack(t,e,i="unknown",s){let r=this.participants.get(t);if(!r)return this.createError("PARTICIPANT_NOT_FOUND",`Participant ${t} not found`);if(!r.isConnected)return this.createError("INVALID_OPERATION",`Participant ${t} is not connected`);let c=this.rooms.get(r.roomId);if(!c||!c.isActive)return this.createError("ROOM_ENDED","Room is not active");let a=u("track"),g={id:a,kind:e,source:i,participantIdentity:t,roomId:r.roomId,publishedAt:new Date().toISOString(),muted:!1,metadata:s};return this.tracks.set(a,g),r.trackIds.push(a),g}getTrack(t){return this.tracks.get(t)}listTracks(t,e){let i=[];for(let s of this.tracks.values())t&&s.roomId!==t||e&&s.participantIdentity!==e||i.push(s);return i}unpublishTrack(t){let e=this.tracks.get(t);if(!e)return;let i=this.participants.get(e.participantIdentity);if(i){let s=i.trackIds.indexOf(t);s!==-1&&i.trackIds.splice(s,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 s=this.rooms.get(t);if(!s)return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);if(!s.isActive)return this.createError("ROOM_ENDED",`Room ${t} has ended`);let r=u("agent"),c={id:r,roomId:t,name:e,status:"running",startedAt:new Date().toISOString(),config:{responseStrategy:"echo",...i},messageHistory:[]};return this.agents.set(r,c),this.addParticipant(t,`agent_${r}`,e,"agent","agent",!1),c}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 s=this.agents.get(t);if(!s)return;let r={id:u("msg"),content:e,role:i,timestamp:new Date().toISOString()};return s.messageHistory.push(r),r}addMessage(t,e,i,s="standard",r){if(!this.rooms.get(t))return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);let a={id:u("msg"),roomId:t,content:i,participantIdentity:e,createdAt:new Date().toISOString(),type:s,attributes:r},g=this.messages.get(t)||[];return g.push(a),this.messages.set(t,g),a}getMessages(t,e){let i=this.messages.get(t)||[];return e?i.slice(-e):i}createError(t,e,i){return{code:t,message:e,details:i}}isError(t){return typeof t=="object"&&t!==null&&"code"in t&&"message"in t}reset(){this.rooms.clear(),this.participants.clear(),this.tracks.clear(),this.agents.clear(),this.messages.clear(),this.randomState=this.config.seed??Date.now()}getSnapshot(){return{rooms:new Map(this.rooms),participants:new Map(this.participants),tracks:new Map(this.tracks),agents:new Map(this.agents),messages:new Map(this.messages),config:{...this.config},eventHistory:[]}}toJSON(){return{rooms:Object.fromEntries(this.rooms),participants:Object.fromEntries(this.participants),tracks:Object.fromEntries(this.tracks),agents:Object.fromEntries(this.agents),messages:Object.fromEntries(this.messages),config:this.config,eventHistory:[],exportedAt:new Date().toISOString()}}fromJSON(t){this.rooms=new Map(Object.entries(t.rooms)),this.participants=new Map(Object.entries(t.participants)),this.tracks=new Map(Object.entries(t.tracks)),this.agents=new Map(Object.entries(t.agents)),this.messages=new Map(Object.entries(t.messages).map(([e,i])=>[e,i])),this.config=t.config}};var U=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 W(this.config),this.events=new G,this.room=new L(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 L(this)),this.room}async registerUser(t,e,i,s){if(await this.simulateLatency(),this.config.errorConfig?.unauthorized)throw new m("UNAUTHORIZED","Registration failed");let r={id:u("user"),externalId:t,organizationId:this.config.organizationId,role:"user",token:I("pending",t,new Date().toISOString())};return this._authToken=r.token,this._registeredUser=r,this.room.localParticipant.identity=t,this.room.localParticipant.name=i?.name||t,r}async registerAgent(t,e){if(await this.simulateLatency(),this.config.errorConfig?.unauthorized)throw new m("UNAUTHORIZED","Agent registration failed");let i=I("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 m("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 s=this.room.localParticipant.identity||"local_user";return this.state.addParticipant(i.id,s,this.room.localParticipant.name,"user","standard",!0),Object.keys(e).length>0&&(this.state.updateParticipantAttributes(s,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,s){await this.simulateLatency();let r=this.state.getRoom(t);if(!r)throw new T(t);if(!r.isActive)throw new m("ROOM_ENDED",`Room ${t} has ended`);this.room.id=r.id,this.room.groupId=r.groupId,this.room.createdAt=r.createdAt,this.room.connectedAt=new Date().toISOString();let c=this.room.localParticipant.identity||"local_user",a=this.state.addParticipant(t,c,this.room.localParticipant.name,"user","standard",!0);if(E(a))throw J(a);if(s){let g={};for(let[d,h]of Object.entries(s))g[d]=String(h);this.state.updateParticipantAttributes(c,g)}return this.state.updateRoomConnectionState(t,"connected"),this.config.autoEmitEvents&&(this.events.emitParticipantJoined(t,a),this.events.emitRoomConnectionStateChanged(t,"connected","disconnected")),await this.room.connect(r.wsURL,r.token),this.room}async evaluateRoom(t){await this.simulateLatency();let e=t.roomId||this.room?.id;if(!e)throw new m("ROOM_NOT_FOUND","No room to evaluate");let i=this.state.getRoom(e);if(!i)throw new T(e);i.metadata||(i.metadata={}),i.metadata.evaluation={rating:t.rating,comment:t.comment,evaluatedAt:new Date().toISOString()}}async closeRoom(){await this.simulateLatency(),this.room?.id&&(this.state.endRoom(this.room.id),await this.stopLocalTracks(),this.config.autoEmitEvents&&this.events.emitRoomEnded(this.room.id))}async disconnect(){if(this.room){let t=this.room.id,e=this.room.localParticipant.identity;await this.stopLocalTracks(),this.state.removeParticipant(e),this.config.autoEmitEvents&&t&&this.events.emitParticipantLeft(t,e),this.room.removeAllListeners(),await this.room.disconnect()}}async stopLocalTracks(){let t=this.room?.localParticipant;t&&await Promise.all([t.setCameraEnabled(!1),t.setMicrophoneEnabled(!1),t.setScreenShareEnabled(!1)])}async disconnectAndCloseRoom(){await this.closeRoom(),await this.disconnect()}async readRoom(t){await this.simulateLatency();let e=this.state.getRoom(t);if(!e)throw new T(t);e.metadata||(e.metadata={}),e.metadata.lastReadAt=new Date().toISOString()}async getRooms(t){await this.simulateLatency();let e=this.state.listRooms();t.roomStatus==="active"?e=e.filter(a=>a.isActive):t.roomStatus==="closed"&&(e=e.filter(a=>!a.isActive)),t.ids?.length&&(e=e.filter(a=>t.ids.includes(a.id))),t.groupId&&(e=e.filter(a=>a.groupId===t.groupId));let i=t.offset??0,s=t.limit??20;return{items:e.slice(i,i+s).map(a=>({id:a.id,name:a.name,groupId:a.groupId,organizationId:this.config.organizationId,endedAt:a.endedAt??null,createdAt:a.createdAt,updatedAt:a.createdAt,status:a.isActive?"active":"ended",participants:this.state.listParticipants(a.id).map(g=>({id:g.identity,name:g.name||g.identity,role:g.role,isLocal:g.isLocal})),evaluations:[],_count:{messages:this.state.getMessages(a.id).length,participants:a.participantIds.length}})),count:e.length,limit:s,offset:i}}async sendMessage(t,e){if(await this.simulateLatency(),!this.room?.id)throw new m("INVALID_OPERATION","Not connected to a room");let i=this.state.addMessage(this.room.id,this.room.localParticipant.identity,t,"standard",e);if(E(i))throw J(i);let s={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 r of this.messageListeners)r([s]);this.config.autoEmitEvents&&this.events.emitMessageSent(this.room.id,i);for(let r of this.agents.values())r.isRunning&&r.roomId===this.room.id&&this.triggerAgentResponse(r,t)}async persistMessage(t){await this.simulateLatency();let e=this.state.addMessage(t.roomId,t.identity||"system",t.content);if(E(e))throw J(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(s=>({id:s.id,timestamp:Date.parse(s.createdAt),message:s.content,content:s.content,createdAt:s.createdAt,from:{identity:s.participantIdentity,id:s.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(),u("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",s=new $(u("agent"),i,{responseStrategy:e?.responseStrategy||"echo",responseDelayMs:e?.responseDelayMs||100,cannedResponses:e?.cannedResponses||[],type:e?.type,nature:e?.nature});await s.start(t),this.agents.set(s.id,s),this.customAgentHandler&&s.setCustomHandler((d,h)=>this.customAgentHandler(d,h));let r=e?.type,c=Array.isArray(r)?r:[r].filter(Boolean),a=c.includes("video"),g=c.includes("voice");return(a||g)&&this.room.isConnected&&await this.room.simulateParticipantJoin(s.id,{name:i,kind:"agent",withCamera:a,withMicrophone:g||a,attributes:{"lk.agent.name":i,"lk.agent.state":"active",role:"agent"}}),this.config.autoEmitEvents&&this.events.emitAgentStarted(t,{id:s.id,name:s.name,roomId:t,status:"running",config:s.getConfig(),startedAt:new Date().toISOString(),messageHistory:[]}),s.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,s)=>t(i,s))}async triggerAgentResponse(t,e){if(this.config.scenario!=="agent_timeout")try{let i=await t.processMessage(e);if(!i)return;let s=this.state.addMessage(t.roomId,`agent_${t.id}`,i);if(!E(s)){let r={id:s.id,timestamp:Date.now(),message:i,content:i,createdAt:s.createdAt,from:{identity:`agent_${t.id}`,name:t.name,id:t.id,role:"agent"}};for(let c of this.messageListeners)c([r]);this.config.autoEmitEvents&&this.events.emitMessageReceived(t.roomId,s)}}catch(i){console.error("Agent response error:",i)}}simulateCallRequest(t){let e={id:u("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 s of i)s(e.id,e)}simulateParticipantJoin(t,e,i="user"){if(!this.room?.id)return;let s=this.state.addParticipant(this.room.id,t,e,i,"standard",!1);!E(s)&&this.config.autoEmitEvents&&this.events.emitParticipantJoined(this.room.id,s)}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(E(i))return;let s={id:i.id,timestamp:Date.now(),message:e,content:e,createdAt:i.createdAt,from:{identity:t,id:t,role:"user"}};for(let r of this.messageListeners)r([s]);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 L(this),K()}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 P={MODE:"LIVEKIT_MODE",USE_MOCK:"USE_LIVEKIT_MOCK",MOCK_LATENCY:"MOCK_LIVEKIT_LATENCY_MS",MOCK_STRICT:"MOCK_LIVEKIT_STRICT",MOCK_SCENARIO:"MOCK_LIVEKIT_SCENARIO",MOCK_SEED:"MOCK_LIVEKIT_SEED",API_URL:"LIVEKIT_API_URL",AUTH_URL:"LIVEKIT_AUTH_URL",ORG_ID:"LIVEKIT_ORGANIZATION_ID"};function mt(){let n=A(P.MODE);if(n==="mock"||n==="real")return n;let t=A(P.USE_MOCK);return t==="true"||t==="1"||ve()?"mock":"real"}function ke(){let n={},t=A(P.MOCK_LATENCY);t&&(n.latencyMs=parseInt(t,10));let e=A(P.MOCK_STRICT);(e==="true"||e==="1")&&(n.strictMode=!0);let i=A(P.MOCK_SCENARIO);i&&(n.scenario=i);let s=A(P.MOCK_SEED);return s&&(n.seed=parseInt(s,10)),n}function fe(){let n={},t=A(P.API_URL);t&&(n.apiUrl=t);let e=A(P.AUTH_URL);e&&(n.authUrl=e);let i=A(P.ORG_ID);return i&&(n.organizationId=i),n}function A(n){if(typeof process<"u"&&process.env)return process.env[n];if(typeof import.meta<"u"&&import.meta.env)return import.meta.env[`VITE_${n}`]||import.meta.env[n];if(typeof window<"u"&&window.__ENV__)return window.__ENV__[n]}function ve(){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 R=class n{static create(t){if((t.mode??mt())==="mock"){let i={...ke(),...t.mockConfig,organizationId:t.organizationId,apiUrl:t.apiUrl};return new U(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 ut(t)}static createFromEnv(t){let e=t?.mode??mt(),i=fe();return n.create({...i,...t,mode:e})}static createMock(t){return new U({organizationId:"mock_org",apiUrl:"https://mock-livekit.local",...t})}static createDeterministicMock(t=12345){return new U({organizationId:"mock_org",apiUrl:"https://mock-livekit.local",seed:t,strictMode:!0})}static getCurrentMode(){return mt()}static isMockMode(){return mt()==="mock"}static isMockService(t){return t instanceof U}};function v(n){return R.createMock(n)}function Q(n){let t=n?.id??u("room"),e=new Date().toISOString();return{id:t,name:`Test Room ${t}`,groupId:u("group"),createdAt:e,isActive:!0,participantIds:[],connectionState:"connected",wsURL:V(t),token:I(t,"local_user",e),...n}}function jt(n="local_user",t){let e=Q(t);e.participantIds.push(n);let i={identity:n,name:"Local User",roomId:e.id,joinedAt:new Date().toISOString(),isConnected:!0,trackIds:[],role:"user",attributes:{},kind:"standard",isLocal:!0};return{room:e,localParticipant:i}}function Bt(n){let t=Q(n),e=new Date().toISOString(),i={identity:"user_1",name:"User One",roomId:t.id,joinedAt:e,isConnected:!0,trackIds:[],role:"user",attributes:{},kind:"standard",isLocal:!0},s={identity:"user_2",name:"User Two",roomId:t.id,joinedAt:e,isConnected:!0,trackIds:[],role:"user",attributes:{},kind:"standard",isLocal:!1};return t.participantIds.push(i.identity,s.identity),{room:t,participant1:i,participant2:s}}function pt(n,t){let{room:e,localParticipant:i}=jt("local_user",t),s=new Date().toISOString(),r=u("agent"),c={id:r,roomId:e.id,name:"AI Assistant",status:"running",startedAt:s,config:{responseStrategy:"echo",nature:"ai",...n},messageHistory:[]},a={identity:`agent_${r}`,name:"AI Assistant",roomId:e.id,joinedAt:s,isConnected:!0,trackIds:[],role:"agent",attributes:{},kind:"agent",isLocal:!1};return e.participantIds.push(a.identity),{room:e,localParticipant:i,agent:c,agentParticipant:a}}function Ft(n,t){return t.map((e,i)=>({id:u("msg"),roomId:n,content:e.content,participantIdentity:e.identity,createdAt:new Date(Date.now()+i*1e3).toISOString(),type:"standard"}))}function wt(){let{room:n,localParticipant:t,agent:e,agentParticipant:i}=pt(),s=Ft(n.id,[{identity:t.identity,content:"Hello, I need help"},{identity:i.identity,content:"Hi! How can I assist you today?"},{identity:t.identity,content:"I have a question about my order"},{identity:i.identity,content:"Of course! Please provide your order number."}]);return{room:n,user:t,agent:e,agentParticipant:i,messages:s}}function Tt(){let{room:n,participant1:t,participant2:e}=Bt(),i=new Date().toISOString(),s=[{id:u("track"),kind:"audio",source:"microphone",participantIdentity:t.identity,roomId:n.id,publishedAt:i,muted:!1},{id:u("track"),kind:"video",source:"camera",participantIdentity:t.identity,roomId:n.id,publishedAt:i,muted:!1},{id:u("track"),kind:"audio",source:"microphone",participantIdentity:e.identity,roomId:n.id,publishedAt:i,muted:!1},{id:u("track"),kind:"video",source:"camera",participantIdentity:e.identity,roomId:n.id,publishedAt:i,muted:!1}];return t.trackIds.push(s[0].id,s[1].id),e.trackIds.push(s[2].id,s[3].id),{room:n,participant1:t,participant2:e,tracks:s}}H();var Ct=null;function f(n){return Ct||(Ct=v({organizationId:"storybook_org",apiUrl:"https://storybook.mock",latencyMs:50,autoEmitEvents:!0,...n})),Ct}var Kt={async receiveMessage(n,t){f().simulateIncomingMessage(n,t)},simulateJoin(n,t){f().simulateParticipantJoin(n,t)},simulateLeave(n){f().simulateParticipantLeave(n)},async simulateVideoParticipant(n,t,e){let s=f().room;s&&await s.simulateParticipantJoin(n,{name:t||n,kind:"standard",withCamera:e?.withCamera??!0,withMicrophone:e?.withMicrophone??!0})},async simulateVideoAgent(n,t){let i=f().room;i&&await i.simulateAgentJoin(n,t||"AI Agent")},async enableLocalCamera(){let t=f().room;t&&await t.localParticipant.setCameraEnabled(!0)},async disableLocalCamera(){let t=f().room;t&&await t.localParticipant.setCameraEnabled(!1)},async enableLocalMicrophone(){let t=f().room;t&&await t.localParticipant.setMicrophoneEnabled(!0)},async simulateMultipleParticipants(n){let t=["Alice","Bob","Carol","David","Eve","Frank","Grace","Henry","Ivy","Jack"],i=f().room;if(i)for(let s=0;s<Math.min(n,t.length);s++)await i.simulateParticipantJoin(`participant_${s+1}`,{name:t[s],kind:"standard",withCamera:!0,withMicrophone:!0}),await new Promise(r=>setTimeout(r,100))},clearParticipants(){let t=f().room;if(t)for(let e of t.remoteParticipants.keys())t.simulateParticipantLeave(e)},simulateCallRequest(n,t){f().simulateCallRequest({name:n,guestId:t||`guest_${Date.now()}`})},async simulateDisconnect(){await f().simulateDisconnect()},getEventHistory(){return f().getEventHistory()},exportState(){return f().exportState()},getRoom(){return f().room}};typeof window<"u"&&(window.MockServiceActions=Kt);y("MockConversationService",()=>{let n;N(()=>{K(),n=v({organizationId:"test_org",apiUrl:"https://mock.local"})}),we(async()=>{await n.destroy()}),y("initialization",()=>{l("should create a service with default configuration",()=>{let t=n.getConfig();o(t.organizationId).toBe("test_org"),o(t.apiUrl).toBe("https://mock.local"),o(t.latencyMs).toBe(0),o(t.strictMode).toBe(!1)}),l("should create a service with custom configuration",()=>{let e=v({latencyMs:100,strictMode:!0,seed:12345}).getConfig();o(e.latencyMs).toBe(100),o(e.strictMode).toBe(!0),o(e.seed).toBe(12345)}),l("should have an empty room initially",()=>{o(n.room).toBeDefined(),o(n.room.id).toBeUndefined()})}),y("user registration",()=>{l("should register a user successfully",async()=>{let t=await n.registerUser("user_123","secret");o(t.externalId).toBe("user_123"),o(t.organizationId).toBe("test_org"),o(t.role).toBe("user"),o(t.token).toContain("mock_token_")}),l("should set local participant identity after registration",async()=>{await n.registerUser("user_123","secret",{name:"Test User"}),o(n.room.localParticipant.identity).toBe("user_123"),o(n.room.localParticipant.name).toBe("Test User")}),l("should register an agent successfully",async()=>{let t=await n.registerAgent("agent_1",{name:"AI Assistant",email:"agent@test.com"});o(t).toContain("mock_token_"),o(n.room.localParticipant.identity).toBe("agent_1"),o(n.room.localParticipant.name).toBe("AI Assistant")})}),y("room lifecycle",()=>{N(async()=>{await n.registerUser("test_user","secret")}),l("should create a room successfully",async()=>{let t=await n.createRoom({language:"en",timezone:"UTC"});o(t.id).toBeDefined(),o(t.id).toContain("mock_room_"),o(t.state).toBe("connected")}),l("should set room metadata on creation",async()=>{let t=await n.createRoom({language:"es",timezone:"America/New_York",metadata:{custom:"data"}});o(t.groupId).toBeDefined(),o(t.createdAt).toBeDefined(),o(t.connectedAt).toBeDefined()}),l("should add local participant to room on creation",async()=>{await n.createRoom({language:"en",timezone:"UTC"});let t=n.getState().listParticipants(n.room.id);o(t).toHaveLength(1),o(t[0].identity).toBe("test_user"),o(t[0].isLocal).toBe(!0)}),l("should join an existing room",async()=>{let t=await n.createRoom({language:"en",timezone:"UTC"}),e=v();await e.registerUser("user_2","secret"),e.getState().createRoom("shared_room",t.groupId);let s=e.getState().listRooms()[0].id,r=await e.joinRoom(s,"UTC","en");o(r.id).toBe(s),o(r.state).toBe("connected"),await e.destroy()}),l("should throw error when joining non-existent room",async()=>{await o(n.joinRoom("non_existent_room","UTC","en")).rejects.toThrow(T)}),l("should close a room",async()=>{await n.createRoom({language:"en",timezone:"UTC"});let t=n.room.id;await n.closeRoom();let e=n.getState().getRoom(t);o(e?.isActive).toBe(!1),o(e?.endedAt).toBeDefined()}),l("should disconnect from a room",async()=>{await n.createRoom({language:"en",timezone:"UTC"}),await n.disconnect(),o(n.room.state).toBe("disconnected")}),l("should list rooms",async()=>{await n.createRoom({language:"en",timezone:"UTC"}),await n.createRoom({language:"es",timezone:"UTC"});let t=await n.getRooms({});o(t.items).toHaveLength(2),o(t.count).toBe(2)}),l("should filter rooms by status",async()=>{await n.createRoom({language:"en",timezone:"UTC"});let t=n.room.id;await n.createRoom({language:"es",timezone:"UTC"}),n.getState().endRoom(t);let e=await n.getRooms({roomStatus:"active"});o(e.items).toHaveLength(1);let i=await n.getRooms({roomStatus:"closed"});o(i.items).toHaveLength(1)})}),y("messaging",()=>{N(async()=>{await n.registerUser("test_user","secret"),await n.createRoom({language:"en",timezone:"UTC"})}),l("should send a message",async()=>{let t=[];n.subscribeMessages(e=>t.push(...e)),await n.sendMessage("Hello, world!"),o(t).toHaveLength(1),o(t[0].message).toBe("Hello, world!")}),l("should store messages in room state",async()=>{await n.sendMessage("First message"),await n.sendMessage("Second message");let t=n.getState().getMessages(n.room.id);o(t).toHaveLength(2),o(t[0].content).toBe("First message"),o(t[1].content).toBe("Second message")}),l("should emit message events",async()=>{let t=n.getEvents(),e=[];t.on("messageSent",i=>e.push(i)),await n.sendMessage("Test message"),o(e).toHaveLength(1)}),l("should get messages",async()=>{await n.sendMessage("Message 1"),await n.sendMessage("Message 2"),await n.sendMessage("Message 3");let t=await n.getMessages({limit:2});o(t).toHaveLength(2)}),l("should handle message subscriptions",async()=>{let t=[],e=n.subscribeMessages(i=>t.push(...i));await n.sendMessage("Test"),o(t).toHaveLength(1),e(),await n.sendMessage("After unsubscribe"),o(t).toHaveLength(1)})}),y("typing indicators",()=>{N(async()=>{await n.registerUser("test_user","secret"),await n.createRoom({language:"en",timezone:"UTC"})}),l("should send typing indicator",async()=>{let t=[];n.subscribeTypingIndicators(e=>t.push(e)),await n.sendTypingIndicator(!0),await n.sendTypingIndicator(!1),o(t).toHaveLength(2),o(t[0].isTyping).toBe(!0),o(t[1].isTyping).toBe(!1)}),l("should unsubscribe from typing indicators",async()=>{let t=[],e=i=>t.push(i);n.subscribeTypingIndicators(e),await n.sendTypingIndicator(!0),o(t).toHaveLength(1),n.unsubscribeTypingIndicators(e),await n.sendTypingIndicator(!1),o(t).toHaveLength(1)})}),y("agents",()=>{N(async()=>{await n.registerUser("test_user","secret"),await n.createRoom({language:"en",timezone:"UTC"})}),l("should start an agent in a room",async()=>{let t=await n.startMockAgent(n.room.id,{responseStrategy:"echo"});o(t).toBeDefined();let e=n.getState().listAgents(n.room.id);o(e).toHaveLength(1),o(e[0].status).toBe("running")}),l("should stop an agent",async()=>{let t=await n.startMockAgent(n.room.id);await n.stopMockAgent(t);let e=n.getState().getAgent(t);o(e?.status).toBe("stopped")}),l("should trigger echo response from agent",async()=>{await n.startMockAgent(n.room.id,{responseStrategy:"echo"});let t=[];n.subscribeMessages(i=>t.push(...i)),await n.sendMessage("Hello agent!"),o(t.length).toBeGreaterThanOrEqual(2);let e=t.find(i=>i.message?.startsWith("Echo:")||i.content?.startsWith("Echo:"));o(e).toBeDefined()}),l("should use canned responses",async()=>{await n.startMockAgent(n.room.id,{responseStrategy:"canned",cannedResponses:["Hello!","How can I help?"]});let t=[];n.subscribeMessages(i=>t.push(...i)),await n.sendMessage("Hi");let e=t.find(i=>i.message==="Hello!"||i.content==="Hello!");o(e).toBeDefined()}),l("should use sequential responses",async()=>{await n.startMockAgent(n.room.id,{responseStrategy:"sequential",cannedResponses:["First","Second","Third"]});let t=[];n.subscribeMessages(i=>t.push(...i)),await n.sendMessage("Message 1"),await n.sendMessage("Message 2"),await n.sendMessage("Message 3");let e=t.filter(i=>!i.message?.startsWith("Message")&&!i.content?.startsWith("Message")).map(i=>i.message||i.content);o(e).toContain("First"),o(e).toContain("Second"),o(e).toContain("Third")}),l("should use custom response handler",async()=>{await n.startMockAgent(n.room.id),n.setAgentResponseHandler((i,s)=>`Custom: ${s.toUpperCase()}`);let t=[];n.subscribeMessages(i=>t.push(...i)),await n.sendMessage("test");let e=t.find(i=>i.message==="Custom: TEST"||i.content==="Custom: TEST");o(e).toBeDefined()}),l("should be silent when configured",async()=>{await n.startMockAgent(n.room.id,{responseStrategy:"silent"});let t=[];n.subscribeMessages(e=>t.push(...e)),await n.sendMessage("Hello?"),o(t).toHaveLength(1)})}),y("event system",()=>{N(async()=>{await n.registerUser("test_user","secret")}),l("should emit room created event",async()=>{let t=n.getEvents(),e=[];t.on("roomCreated",i=>e.push(i)),await n.createRoom({language:"en",timezone:"UTC"}),o(e).toHaveLength(1)}),l("should emit participant joined event",async()=>{await n.createRoom({language:"en",timezone:"UTC"});let t=n.getEvents(),e=[];t.on("participantJoined",i=>e.push(i)),n.simulateParticipantJoin("new_participant","New User"),o(e).toHaveLength(1),o(e[0].participant.identity).toBe("new_participant")}),l("should emit participant left event",async()=>{await n.createRoom({language:"en",timezone:"UTC"}),n.simulateParticipantJoin("participant_1");let t=n.getEvents(),e=[];t.on("participantLeft",i=>e.push(i)),n.simulateParticipantLeave("participant_1"),o(e).toHaveLength(1)}),l("should track event history",async()=>{await n.createRoom({language:"en",timezone:"UTC"}),await n.sendMessage("Test");let t=n.getEventHistory();o(t.length).toBeGreaterThan(0);let e=n.getEventHistory("messageSent");o(e).toHaveLength(1)}),l("should support wildcard event listeners",async()=>{let t=n.getEvents(),e=[];t.onAny(i=>e.push(i)),await n.createRoom({language:"en",timezone:"UTC"}),o(e.length).toBeGreaterThan(0)})}),y("simulations",()=>{N(async()=>{await n.registerUser("test_user","secret"),await n.createRoom({language:"en",timezone:"UTC"})}),l("should simulate incoming message",async()=>{let t=[];n.subscribeMessages(e=>t.push(...e)),n.simulateIncomingMessage("other_user","Hello from outside!"),o(t).toHaveLength(1),o(t[0].message).toBe("Hello from outside!")}),l("should simulate room disconnect",async()=>{let t=n.getEvents(),e=[];t.on("roomConnectionStateChanged",i=>e.push(i)),await n.simulateDisconnect(),o(n.room.state).toBe("disconnected"),o(e).toHaveLength(1)}),l("should simulate call request",async()=>{let t=[];n.onNewCallRequest((e,i)=>t.push(i)),n.simulateCallRequest({guestId:"guest_1",name:"Guest User"}),o(t).toHaveLength(1),o(t[0].name).toBe("Guest User")})}),y("configuration",()=>{l("should apply latency configuration",async()=>{let t=v({latencyMs:50});await t.registerUser("user","secret");let e=Date.now();await t.createRoom({language:"en",timezone:"UTC"});let i=Date.now()-e;o(i).toBeGreaterThanOrEqual(45),await t.destroy()}),l("should support deterministic behavior with seed",async()=>{let t=v({seed:12345}),e=v({seed:12345}),i=t.getState().random(),s=e.getState().random();o(i).toBe(s)}),l("should apply scenario configuration",()=>{let t=v({scenario:"slow_network"});o(t.getConfig().latencyMs).toBe(500)}),l("should reset state",async()=>{await n.registerUser("user","secret"),await n.createRoom({language:"en",timezone:"UTC"}),await n.sendMessage("Test"),n.reset(),o(n.getState().listRooms()).toHaveLength(0),o(n.getEventHistory()).toHaveLength(0)})}),y("error handling",()=>{l("should throw error for unauthorized registration",async()=>{let t=v({errorConfig:{unauthorized:!0}});await o(t.registerUser("user","secret")).rejects.toThrow(m)}),l("should throw error for network issues",async()=>{let t=v({errorConfig:{networkError:!0}});await t.registerUser("user","secret"),await o(t.createRoom({language:"en",timezone:"UTC"})).rejects.toThrow(m)}),l("should throw probabilistic errors based on error rate",async()=>{let t=v({errorConfig:{errorRate:100}});await t.registerUser("user","secret"),await o(t.createRoom({language:"en",timezone:"UTC"})).rejects.toThrow()})}),y("state persistence",()=>{l("should export state to JSON",async()=>{await n.registerUser("user","secret"),await n.createRoom({language:"en",timezone:"UTC"}),await n.sendMessage("Test message");let t=n.exportState();o(t).toHaveProperty("rooms"),o(t).toHaveProperty("participants"),o(t).toHaveProperty("messages"),o(t).toHaveProperty("eventHistory")}),l("should import state from JSON",async()=>{await n.registerUser("user","secret"),await n.createRoom({language:"en",timezone:"UTC"});let t=n.room.id,e=n.getState().toJSON();n.reset(),n.getState().fromJSON(e);let i=n.getState().listRooms();o(i).toHaveLength(1),o(i[0].id).toBe(t)})})});y("ConversationServiceFactory",()=>{l("should create mock service with createMock",()=>{let n=R.createMock();o(R.isMockService(n)).toBe(!0)}),l("should create deterministic mock",()=>{let n=R.createDeterministicMock(42);o(n.getConfig().seed).toBe(42),o(n.getConfig().strictMode).toBe(!0)}),l("should check if service is mock",()=>{let n=R.createMock();o(R.isMockService(n)).toBe(!0)})});y("fixtures",()=>{l("should create default room fixture",()=>{let n=Q();o(n.id).toBeDefined(),o(n.name).toBeDefined(),o(n.isActive).toBe(!0),o(n.connectionState).toBe("connected")}),l("should create room with agent fixture",()=>{let{room:n,localParticipant:t,agent:e,agentParticipant:i}=pt();o(n.participantIds).toContain(t.identity),o(n.participantIds).toContain(i.identity),o(e.status).toBe("running"),o(i.role).toBe("agent")}),l("should create chat scenario fixture",()=>{let{room:n,user:t,agent:e,messages:i}=wt();o(n).toBeDefined(),o(t).toBeDefined(),o(e).toBeDefined(),o(i.length).toBeGreaterThan(0)}),l("should create video call scenario fixture",()=>{let{room:n,participant1:t,participant2:e,tracks:i}=Tt();o(n).toBeDefined(),o(t).toBeDefined(),o(e).toBeDefined(),o(i).toHaveLength(4)})});
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! @onlive.ai/common-121 v0.2.
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.187 | © 2026 Onlive.ai */
|
|
2
2
|
"use strict";var p=Object.defineProperty;var M=Object.getOwnPropertyDescriptor;var h=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var l=(i,t)=>{for(var e in t)p(i,e,{get:t[e],enumerable:!0})},O=(i,t,e,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of h(t))!S.call(i,r)&&r!==e&&p(i,r,{get:()=>t[r],enumerable:!(n=M(t,r))||n.enumerable});return i};var A=i=>O(p({},"__esModule",{value:!0}),i);var _={};l(_,{MockState:()=>u});module.exports=A(_);var k=0;function g(i){return k++,`mock_${i}_${k}_${Date.now().toString(36)}`}function f(i,t,e){let n=e||new Date().toISOString(),r=typeof btoa=="function"?btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,""):n.replace(/[^a-zA-Z0-9]/g,"");return`mock_token_${i}_${t}_${r}`}function m(i){return`wss://mock-livekit.local/room/${i}`}var u=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,n){let r=g("room"),s=new Date().toISOString(),o={id:r,name:t,groupId:e||g("group"),createdAt:s,metadata:n,isActive:!0,participantIds:[],connectionState:"disconnected",wsURL:m(r),token:f(r,"pending",s)};return this.rooms.set(r,o),this.messages.set(r,[]),o}getRoom(t){return this.rooms.get(t)}getRoomByName(t){for(let e of this.rooms.values())if(e.name===t)return e}listRooms(t=!1){let e=Array.from(this.rooms.values());return t?e.filter(n=>n.isActive):e}updateRoomConnectionState(t,e){let n=this.rooms.get(t);if(!n)return;let r=n.connectionState;return n.connectionState=e,r}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 n of e.participantIds){let r=this.participants.get(n);r&&(r.isConnected=!1)}for(let n of this.agents.values())n.roomId===t&&n.status==="running"&&(n.status="stopped",n.stoppedAt=new Date().toISOString());return!0}deleteRoom(t){let e=this.rooms.get(t);if(!e)return!1;for(let n of e.participantIds)this.participants.delete(n);for(let[n,r]of this.tracks)r.roomId===t&&this.tracks.delete(n);for(let[n,r]of this.agents)r.roomId===t&&this.agents.delete(n);return this.messages.delete(t),this.rooms.delete(t),!0}addParticipant(t,e,n,r="user",s="standard",o=!1){let a=this.rooms.get(t);if(!a)return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);if(!a.isActive)return this.createError("ROOM_ENDED",`Room ${t} has ended`);let c=this.participants.get(e);if(c&&c.roomId===t&&c.isConnected)return this.config.strictMode?this.createError("PARTICIPANT_ALREADY_JOINED",`Participant ${e} is already in room ${t}`):c;let d={identity:e,name:n||e,roomId:t,joinedAt:new Date().toISOString(),isConnected:!0,trackIds:[],role:r,attributes:{},kind:s,isLocal:o};return this.participants.set(e,d),a.participantIds.push(e),d}getParticipant(t){return this.participants.get(t)}listParticipants(t,e=!0){let n=this.rooms.get(t);if(!n)return[];let r=[];for(let s of n.participantIds){let o=this.participants.get(s);o&&(!e||o.isConnected)&&r.push(o)}return r}updateParticipantAttributes(t,e){let n=this.participants.get(t);if(!n)return;let r={...n.attributes};return n.attributes={...n.attributes,...e},r}removeParticipant(t){let e=this.participants.get(t);if(!e)return;e.isConnected=!1;for(let r of e.trackIds)this.tracks.delete(r);e.trackIds=[];let n=this.rooms.get(e.roomId);if(n){let r=n.participantIds.indexOf(t);r!==-1&&n.participantIds.splice(r,1)}return e}publishTrack(t,e,n="unknown",r){let s=this.participants.get(t);if(!s)return this.createError("PARTICIPANT_NOT_FOUND",`Participant ${t} not found`);if(!s.isConnected)return this.createError("INVALID_OPERATION",`Participant ${t} is not connected`);let o=this.rooms.get(s.roomId);if(!o||!o.isActive)return this.createError("ROOM_ENDED","Room is not active");let a=g("track"),c={id:a,kind:e,source:n,participantIdentity:t,roomId:s.roomId,publishedAt:new Date().toISOString(),muted:!1,metadata:r};return this.tracks.set(a,c),s.trackIds.push(a),c}getTrack(t){return this.tracks.get(t)}listTracks(t,e){let n=[];for(let r of this.tracks.values())t&&r.roomId!==t||e&&r.participantIdentity!==e||n.push(r);return n}unpublishTrack(t){let e=this.tracks.get(t);if(!e)return;let n=this.participants.get(e.participantIdentity);if(n){let r=n.trackIds.indexOf(t);r!==-1&&n.trackIds.splice(r,1)}return this.tracks.delete(t),e}setTrackMuted(t,e){let n=this.tracks.get(t);return n?(n.muted=e,!0):!1}startAgent(t,e,n={}){let r=this.rooms.get(t);if(!r)return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);if(!r.isActive)return this.createError("ROOM_ENDED",`Room ${t} has ended`);let s=g("agent"),o={id:s,roomId:t,name:e,status:"running",startedAt:new Date().toISOString(),config:{responseStrategy:"echo",...n},messageHistory:[]};return this.agents.set(s,o),this.addParticipant(t,`agent_${s}`,e,"agent","agent",!1),o}getAgent(t){return this.agents.get(t)}listAgents(t){let e=[];for(let n of this.agents.values())n.roomId===t&&e.push(n);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 n=this.agents.get(t);return n?(n.status=e,e==="stopped"&&(n.stoppedAt=new Date().toISOString()),!0):!1}addAgentMessage(t,e,n){let r=this.agents.get(t);if(!r)return;let s={id:g("msg"),content:e,role:n,timestamp:new Date().toISOString()};return r.messageHistory.push(s),s}addMessage(t,e,n,r="standard",s){if(!this.rooms.get(t))return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);let a={id:g("msg"),roomId:t,content:n,participantIdentity:e,createdAt:new Date().toISOString(),type:r,attributes:s},c=this.messages.get(t)||[];return c.push(a),this.messages.set(t,c),a}getMessages(t,e){let n=this.messages.get(t)||[];return e?n.slice(-e):n}createError(t,e,n){return{code:t,message:e,details:n}}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,n])=>[e,n])),this.config=t.config}};0&&(module.exports={MockState});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @onlive.ai/common-121 v0.2.
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.187 | © 2026 Onlive.ai */
|
|
2
2
|
import { MockServiceConfig, MockRoomState, MockConnectionState, MockParticipantRole, MockParticipantKind, MockParticipantState, MockError, MockTrackKind, MockTrackSource, MockTrackState, MockAgentConfig, MockAgentState, MockAgentStatus, MockAgentMessage, MockMessageState, MockErrorCode, MockStateSnapshot, MockStateSnapshotJSON } from './types.cjs';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @onlive.ai/common-121 v0.2.
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.187 | © 2026 Onlive.ai */
|
|
2
2
|
import { MockServiceConfig, MockRoomState, MockConnectionState, MockParticipantRole, MockParticipantKind, MockParticipantState, MockError, MockTrackKind, MockTrackSource, MockTrackState, MockAgentConfig, MockAgentState, MockAgentStatus, MockAgentMessage, MockMessageState, MockErrorCode, MockStateSnapshot, MockStateSnapshotJSON } from './types.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! @onlive.ai/common-121 v0.2.
|
|
1
|
+
/*! @onlive.ai/common-121 v0.2.187 | © 2026 Onlive.ai */
|
|
2
2
|
var u=0;function c(g){return u++,`mock_${g}_${u}_${Date.now().toString(36)}`}function d(g,t,e){let n=e||new Date().toISOString(),r=typeof btoa=="function"?btoa(n).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,""):n.replace(/[^a-zA-Z0-9]/g,"");return`mock_token_${g}_${t}_${r}`}function k(g){return`wss://mock-livekit.local/room/${g}`}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,n){let r=c("room"),s=new Date().toISOString(),o={id:r,name:t,groupId:e||c("group"),createdAt:s,metadata:n,isActive:!0,participantIds:[],connectionState:"disconnected",wsURL:k(r),token:d(r,"pending",s)};return this.rooms.set(r,o),this.messages.set(r,[]),o}getRoom(t){return this.rooms.get(t)}getRoomByName(t){for(let e of this.rooms.values())if(e.name===t)return e}listRooms(t=!1){let e=Array.from(this.rooms.values());return t?e.filter(n=>n.isActive):e}updateRoomConnectionState(t,e){let n=this.rooms.get(t);if(!n)return;let r=n.connectionState;return n.connectionState=e,r}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 n of e.participantIds){let r=this.participants.get(n);r&&(r.isConnected=!1)}for(let n of this.agents.values())n.roomId===t&&n.status==="running"&&(n.status="stopped",n.stoppedAt=new Date().toISOString());return!0}deleteRoom(t){let e=this.rooms.get(t);if(!e)return!1;for(let n of e.participantIds)this.participants.delete(n);for(let[n,r]of this.tracks)r.roomId===t&&this.tracks.delete(n);for(let[n,r]of this.agents)r.roomId===t&&this.agents.delete(n);return this.messages.delete(t),this.rooms.delete(t),!0}addParticipant(t,e,n,r="user",s="standard",o=!1){let i=this.rooms.get(t);if(!i)return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);if(!i.isActive)return this.createError("ROOM_ENDED",`Room ${t} has ended`);let a=this.participants.get(e);if(a&&a.roomId===t&&a.isConnected)return this.config.strictMode?this.createError("PARTICIPANT_ALREADY_JOINED",`Participant ${e} is already in room ${t}`):a;let p={identity:e,name:n||e,roomId:t,joinedAt:new Date().toISOString(),isConnected:!0,trackIds:[],role:r,attributes:{},kind:s,isLocal:o};return this.participants.set(e,p),i.participantIds.push(e),p}getParticipant(t){return this.participants.get(t)}listParticipants(t,e=!0){let n=this.rooms.get(t);if(!n)return[];let r=[];for(let s of n.participantIds){let o=this.participants.get(s);o&&(!e||o.isConnected)&&r.push(o)}return r}updateParticipantAttributes(t,e){let n=this.participants.get(t);if(!n)return;let r={...n.attributes};return n.attributes={...n.attributes,...e},r}removeParticipant(t){let e=this.participants.get(t);if(!e)return;e.isConnected=!1;for(let r of e.trackIds)this.tracks.delete(r);e.trackIds=[];let n=this.rooms.get(e.roomId);if(n){let r=n.participantIds.indexOf(t);r!==-1&&n.participantIds.splice(r,1)}return e}publishTrack(t,e,n="unknown",r){let s=this.participants.get(t);if(!s)return this.createError("PARTICIPANT_NOT_FOUND",`Participant ${t} not found`);if(!s.isConnected)return this.createError("INVALID_OPERATION",`Participant ${t} is not connected`);let o=this.rooms.get(s.roomId);if(!o||!o.isActive)return this.createError("ROOM_ENDED","Room is not active");let i=c("track"),a={id:i,kind:e,source:n,participantIdentity:t,roomId:s.roomId,publishedAt:new Date().toISOString(),muted:!1,metadata:r};return this.tracks.set(i,a),s.trackIds.push(i),a}getTrack(t){return this.tracks.get(t)}listTracks(t,e){let n=[];for(let r of this.tracks.values())t&&r.roomId!==t||e&&r.participantIdentity!==e||n.push(r);return n}unpublishTrack(t){let e=this.tracks.get(t);if(!e)return;let n=this.participants.get(e.participantIdentity);if(n){let r=n.trackIds.indexOf(t);r!==-1&&n.trackIds.splice(r,1)}return this.tracks.delete(t),e}setTrackMuted(t,e){let n=this.tracks.get(t);return n?(n.muted=e,!0):!1}startAgent(t,e,n={}){let r=this.rooms.get(t);if(!r)return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);if(!r.isActive)return this.createError("ROOM_ENDED",`Room ${t} has ended`);let s=c("agent"),o={id:s,roomId:t,name:e,status:"running",startedAt:new Date().toISOString(),config:{responseStrategy:"echo",...n},messageHistory:[]};return this.agents.set(s,o),this.addParticipant(t,`agent_${s}`,e,"agent","agent",!1),o}getAgent(t){return this.agents.get(t)}listAgents(t){let e=[];for(let n of this.agents.values())n.roomId===t&&e.push(n);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 n=this.agents.get(t);return n?(n.status=e,e==="stopped"&&(n.stoppedAt=new Date().toISOString()),!0):!1}addAgentMessage(t,e,n){let r=this.agents.get(t);if(!r)return;let s={id:c("msg"),content:e,role:n,timestamp:new Date().toISOString()};return r.messageHistory.push(s),s}addMessage(t,e,n,r="standard",s){if(!this.rooms.get(t))return this.createError("ROOM_NOT_FOUND",`Room ${t} not found`);let i={id:c("msg"),roomId:t,content:n,participantIdentity:e,createdAt:new Date().toISOString(),type:r,attributes:s},a=this.messages.get(t)||[];return a.push(i),this.messages.set(t,a),i}getMessages(t,e){let n=this.messages.get(t)||[];return e?n.slice(-e):n}createError(t,e,n){return{code:t,message:e,details:n}}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,n])=>[e,n])),this.config=t.config}};export{f as MockState};
|