@qualified-salesforce/web 0.0.1-oidc-bootstrap
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/41842993ec71d6628e4949e9a22b146b.svg +3 -0
- package/7271f3433ed82fc7f56adcd9e30275f4.svg +17 -0
- package/LICENSE.txt +82 -0
- package/components/helpers/entriesStringValidations.js +69 -0
- package/components/helpers/languages.js +32 -0
- package/components/shared/assertUnreachable.js +5 -0
- package/components/shared/controls/imageCropperHelpers.js +43 -0
- package/components/shared/meetingLoadingProgressSpec.js +116 -0
- package/constants.generated.js +9883 -0
- package/css/widget/multimodal_v2/host.split-css.css +162 -0
- package/css/widget/multimodal_v2/index.split-css.panda.css +5240 -0
- package/css/widget/widget.split-css.css +100 -0
- package/fonts/inter/Inter-Black.woff +0 -0
- package/fonts/inter/Inter-Black.woff2 +0 -0
- package/fonts/inter/Inter-BlackItalic.woff +0 -0
- package/fonts/inter/Inter-BlackItalic.woff2 +0 -0
- package/fonts/inter/Inter-Bold.woff +0 -0
- package/fonts/inter/Inter-Bold.woff2 +0 -0
- package/fonts/inter/Inter-BoldItalic.woff +0 -0
- package/fonts/inter/Inter-BoldItalic.woff2 +0 -0
- package/fonts/inter/Inter-ExtraBold.woff +0 -0
- package/fonts/inter/Inter-ExtraBold.woff2 +0 -0
- package/fonts/inter/Inter-ExtraBoldItalic.woff +0 -0
- package/fonts/inter/Inter-ExtraBoldItalic.woff2 +0 -0
- package/fonts/inter/Inter-ExtraLight.woff +0 -0
- package/fonts/inter/Inter-ExtraLight.woff2 +0 -0
- package/fonts/inter/Inter-ExtraLightItalic.woff +0 -0
- package/fonts/inter/Inter-ExtraLightItalic.woff2 +0 -0
- package/fonts/inter/Inter-Italic.woff +0 -0
- package/fonts/inter/Inter-Italic.woff2 +0 -0
- package/fonts/inter/Inter-Light.woff +0 -0
- package/fonts/inter/Inter-Light.woff2 +0 -0
- package/fonts/inter/Inter-LightItalic.woff +0 -0
- package/fonts/inter/Inter-LightItalic.woff2 +0 -0
- package/fonts/inter/Inter-Medium.woff +0 -0
- package/fonts/inter/Inter-Medium.woff2 +0 -0
- package/fonts/inter/Inter-MediumItalic.woff +0 -0
- package/fonts/inter/Inter-MediumItalic.woff2 +0 -0
- package/fonts/inter/Inter-Regular.woff +0 -0
- package/fonts/inter/Inter-Regular.woff2 +0 -0
- package/fonts/inter/Inter-SemiBold.woff +0 -0
- package/fonts/inter/Inter-SemiBold.woff2 +0 -0
- package/fonts/inter/Inter-SemiBoldItalic.woff +0 -0
- package/fonts/inter/Inter-SemiBoldItalic.woff2 +0 -0
- package/fonts/inter/Inter-Thin.woff +0 -0
- package/fonts/inter/Inter-Thin.woff2 +0 -0
- package/fonts/inter/Inter-ThinItalic.woff +0 -0
- package/fonts/inter/Inter-ThinItalic.woff2 +0 -0
- package/fonts/inter/Inter-italic.var.woff2 +0 -0
- package/fonts/inter/Inter-roman.var.woff2 +0 -0
- package/images/close.js +63 -0
- package/images/logo.js +22 -0
- package/js/4101.js +19721 -0
- package/js/daily-esm.js +9948 -0
- package/js/date-fns.js +427 -0
- package/js/multimodal_v2.js +1653 -0
- package/js/runtime.js +109 -0
- package/media/Inter-Black.796be8d8bf.woff2 +0 -0
- package/media/Inter-Black.b254104c56.woff +0 -0
- package/media/Inter-BlackItalic.70306b0eae.woff +0 -0
- package/media/Inter-BlackItalic.752f1e0aaa.woff2 +0 -0
- package/media/Inter-Bold.579e0f95ca.woff2 +0 -0
- package/media/Inter-Bold.b1234477a5.woff +0 -0
- package/media/Inter-BoldItalic.3d0d804323.woff +0 -0
- package/media/Inter-BoldItalic.828a494e04.woff2 +0 -0
- package/media/Inter-ExtraBold.208a9e6c99.woff +0 -0
- package/media/Inter-ExtraBold.d65f028165.woff2 +0 -0
- package/media/Inter-ExtraBoldItalic.30429962ec.woff +0 -0
- package/media/Inter-ExtraBoldItalic.8c7eac5ce3.woff2 +0 -0
- package/media/Inter-ExtraLight.15c082a57d.woff +0 -0
- package/media/Inter-ExtraLight.6824177d1e.woff2 +0 -0
- package/media/Inter-ExtraLightItalic.05138dddf3.woff2 +0 -0
- package/media/Inter-ExtraLightItalic.3beee54f59.woff +0 -0
- package/media/Inter-Italic.9beab78452.woff +0 -0
- package/media/Inter-Italic.d593a8df79.woff2 +0 -0
- package/media/Inter-Light.27083fa637.woff2 +0 -0
- package/media/Inter-Light.91dfddd842.woff +0 -0
- package/media/Inter-LightItalic.0a783b89b3.woff2 +0 -0
- package/media/Inter-LightItalic.f8ccf2813f.woff +0 -0
- package/media/Inter-Medium.dc792b508e.woff2 +0 -0
- package/media/Inter-Medium.ec7dd2d9d8.woff +0 -0
- package/media/Inter-MediumItalic.17301e5b40.woff +0 -0
- package/media/Inter-MediumItalic.84d3493a9f.woff2 +0 -0
- package/media/Inter-Regular.f1f0c35b32.woff2 +0 -0
- package/media/Inter-Regular.f356e84aa0.woff +0 -0
- package/media/Inter-SemiBold.55027e4724.woff +0 -0
- package/media/Inter-SemiBold.fcb100c760.woff2 +0 -0
- package/media/Inter-SemiBoldItalic.ab9105ed3b.woff +0 -0
- package/media/Inter-SemiBoldItalic.d90f295d0c.woff2 +0 -0
- package/media/Inter-Thin.16325d9b0f.woff +0 -0
- package/media/Inter-Thin.dafaa44d99.woff2 +0 -0
- package/media/Inter-ThinItalic.4fc662b3cf.woff2 +0 -0
- package/media/Inter-ThinItalic.d3d8994788.woff +0 -0
- package/media/Inter-italic.var.958a0b9742.woff2 +0 -0
- package/media/Inter-roman.var.b2129c009c.woff2 +0 -0
- package/package.json +20 -0
- package/packs/widget/api/docking/docking_host.js +97 -0
- package/packs/widget/api/docking/index.js +294 -0
- package/packs/widget/api/docking/shared.js +164 -0
- package/packs/widget/api/docking/viewport_lock.js +488 -0
- package/packs/widget/api/docking/viewport_resize.js +1203 -0
- package/packs/widget/esm/fonts/Inter-Black.796be8d8bf.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Black.b254104c56.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BlackItalic.70306b0eae.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BlackItalic.752f1e0aaa.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Bold.579e0f95ca.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Bold.b1234477a5.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BoldItalic.3d0d804323.woff +0 -0
- package/packs/widget/esm/fonts/Inter-BoldItalic.828a494e04.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBold.208a9e6c99.woff +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBold.d65f028165.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBoldItalic.30429962ec.woff +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraBoldItalic.8c7eac5ce3.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLight.15c082a57d.woff +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLight.6824177d1e.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLightItalic.05138dddf3.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ExtraLightItalic.3beee54f59.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Italic.9beab78452.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Italic.d593a8df79.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Light.27083fa637.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Light.91dfddd842.woff +0 -0
- package/packs/widget/esm/fonts/Inter-LightItalic.0a783b89b3.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-LightItalic.f8ccf2813f.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Medium.dc792b508e.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Medium.ec7dd2d9d8.woff +0 -0
- package/packs/widget/esm/fonts/Inter-MediumItalic.17301e5b40.woff +0 -0
- package/packs/widget/esm/fonts/Inter-MediumItalic.84d3493a9f.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Regular.f1f0c35b32.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Regular.f356e84aa0.woff +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBold.55027e4724.woff +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBold.fcb100c760.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBoldItalic.ab9105ed3b.woff +0 -0
- package/packs/widget/esm/fonts/Inter-SemiBoldItalic.d90f295d0c.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-Thin.16325d9b0f.woff +0 -0
- package/packs/widget/esm/fonts/Inter-Thin.dafaa44d99.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ThinItalic.4fc662b3cf.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-ThinItalic.d3d8994788.woff +0 -0
- package/packs/widget/esm/fonts/Inter-italic.var.958a0b9742.woff2 +0 -0
- package/packs/widget/esm/fonts/Inter-roman.var.b2129c009c.woff2 +0 -0
- package/packs/widget/esm/index.js +183 -0
- package/packs/widget/esm/qualified.css +5502 -0
- package/routes/app/offers/scripts/OfferMainScript.js +154 -0
- package/routes/app/offers/scripts/constants.js +71 -0
- package/routes/app/offers/scripts/main/ButtonManager.js +65 -0
- package/routes/app/offers/scripts/main/FormManager.js +325 -0
- package/routes/app/offers/scripts/main/MainContext.js +19 -0
- package/routes/app/offers/scripts/main/OfferManager.js +91 -0
- package/routes/app/offers/scripts/main/TriggerManager.js +125 -0
- package/routes/app/offers/scripts/rendering/ContentManager.js +53 -0
- package/routes/app/offers/scripts/rendering/LocationManager.js +83 -0
- package/routes/app/offers/scripts/rendering/RenderedOffer.js +188 -0
- package/routes/app/offers/scripts/rendering/Renderer.js +69 -0
- package/routes/app/offers/scripts/rendering/RenderingInitializer.js +62 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManager.js +31 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerFooter.js +81 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerHeader.js +81 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerModal.js +117 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationManagerSidebar.js +75 -0
- package/routes/app/offers/scripts/rendering/animations/AnimationResult.js +43 -0
- package/routes/app/offers/scripts/rendering/animations/Animator.js +78 -0
- package/routes/app/offers/scripts/rendering/animations/BaseAnimationManager.js +25 -0
- package/routes/app/offers/scripts/rendering/lib/BaseComponent.js +106 -0
- package/routes/app/offers/scripts/rendering/lib/FormComponent.js +134 -0
- package/routes/app/offers/scripts/rendering/lib/OfferComponent.js +144 -0
- package/routes/app/offers/scripts/rendering/lib/ScrollbarWidth.js +27 -0
- package/routes/app/offers/scripts/rendering/lib/decorators.js +20 -0
- package/routes/app/offers/scripts/rendering/locations/CSSVarsManager.js +66 -0
- package/routes/app/offers/scripts/rendering/locations/ElementResizeObserver.js +49 -0
- package/routes/app/offers/scripts/rendering/locations/footer.js +53 -0
- package/routes/app/offers/scripts/rendering/locations/header/AsyncBatchProcessor.js +70 -0
- package/routes/app/offers/scripts/rendering/locations/header/CSSTransitionObserver.js +182 -0
- package/routes/app/offers/scripts/rendering/locations/header/ElementStyleChangeObserver.js +138 -0
- package/routes/app/offers/scripts/rendering/locations/header/ExternalStyleManager.js +110 -0
- package/routes/app/offers/scripts/rendering/locations/header/Header.js +353 -0
- package/routes/app/offers/scripts/rendering/locations/header/InlineStyleManager.js +105 -0
- package/routes/app/offers/scripts/rendering/locations/header/MatchingElementsObserver.js +107 -0
- package/routes/app/offers/scripts/rendering/locations/header/NewElementsObserver.js +129 -0
- package/routes/app/offers/scripts/rendering/locations/header/RuleWrapper.js +46 -0
- package/routes/app/offers/scripts/rendering/locations/header/SelectorObservable.js +23 -0
- package/routes/app/offers/scripts/rendering/locations/header/SelectorObserver.js +61 -0
- package/routes/app/offers/scripts/rendering/locations/header/ShiftedElementsManager.js +45 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleElementManager.js +37 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleElementWrapper.js +62 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/ObservedSelectorValue.js +45 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/ObservedSelectors.js +62 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/StyleSelectorObserver.js +294 -0
- package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/constants.js +21 -0
- package/routes/app/offers/scripts/rendering/locations/header/WindowResizeObserver.js +43 -0
- package/routes/app/offers/scripts/rendering/locations/header/utils.js +25 -0
- package/routes/app/offers/scripts/rendering/locations/popup.js +66 -0
- package/routes/app/offers/scripts/rendering/locations/sidebar.js +21 -0
- package/routes/app/offers/scripts/rendering/variations/ButtonBanner.js +105 -0
- package/routes/app/offers/scripts/rendering/variations/ButtonModal.js +114 -0
- package/routes/app/offers/scripts/rendering/variations/FormBanner.js +214 -0
- package/routes/app/offers/scripts/rendering/variations/FormModal.js +325 -0
- package/routes/app/offers/scripts/rendering/variations/LinkBanner.js +105 -0
- package/routes/app/offers/scripts/rendering/variations/components/Body.js +29 -0
- package/routes/app/offers/scripts/rendering/variations/components/Button.js +128 -0
- package/routes/app/offers/scripts/rendering/variations/components/DismissButton.js +39 -0
- package/routes/app/offers/scripts/rendering/variations/components/ForegroundImageBanner.js +110 -0
- package/routes/app/offers/scripts/rendering/variations/components/ForegroundImageModal.js +128 -0
- package/routes/app/offers/scripts/rendering/variations/components/Headline.js +94 -0
- package/routes/app/offers/scripts/rendering/variations/components/MultiFieldForm.js +302 -0
- package/routes/app/offers/scripts/rendering/variations/components/Tooltip.js +74 -0
- package/routes/app/offers/scripts/rendering/variations/icons.js +15 -0
- package/routes/app/offers/scripts/utils.js +115 -0
- package/routes/app/offers/utils/HTMLUtils.js +10 -0
- package/routes/app/offers/utils/createTypeGuard.js +32 -0
- package/routes/app/offers/utils/promise-utils.js +22 -0
- package/routes/app/websiteBuilder/stores/storeHelpers.js +18 -0
- package/sounds/message-initial.mp3 +0 -0
- package/sounds/message-received.mp3 +0 -0
- package/sounds/message-sent.mp3 +0 -0
- package/src/arrays.js +15 -0
- package/src/audio.js +106 -0
- package/src/bounded-set.js +16 -0
- package/src/bounding_box_observer.js +129 -0
- package/src/decorators.js +29 -0
- package/src/dom.js +128 -0
- package/src/dom_roots.js +26 -0
- package/src/embedded_forms/EmbeddedForm.js +638 -0
- package/src/embedded_forms/QualifiedEmbeddedForm.js +51 -0
- package/src/embedded_forms/QualifiedFormField.js +137 -0
- package/src/embedded_forms/utils.js +17 -0
- package/src/graphql-types.js +1686 -0
- package/src/iframes.js +86 -0
- package/src/localstorage.js +43 -0
- package/src/mirror/Shipper.js +133 -0
- package/src/mirror/constants.generated.js +13 -0
- package/src/mirror/constants.js +238 -0
- package/src/mirror/shipper/ChangeQueue.js +155 -0
- package/src/mirror/shipper/DOMSerializer.js +392 -0
- package/src/mirror/shipper/observers.js +441 -0
- package/src/mirror/shipper/utils.js +98 -0
- package/src/mixins/disposable.js +125 -0
- package/src/mixins/injectable.js +37 -0
- package/src/personalizations/personalization-manager.js +110 -0
- package/src/personalizations/strategies/node-freezing-strategy.js +174 -0
- package/src/personalizations/utils.js +187 -0
- package/src/promises.js +107 -0
- package/src/proxy.js +144 -0
- package/src/qualified_root.js +35 -0
- package/src/query_params.js +55 -0
- package/src/shadow-dom-helper.js +63 -0
- package/src/singleton_host.js +39 -0
- package/src/smart_website/trigger.js +49 -0
- package/src/smart_website/utils.js +149 -0
- package/src/string.js +53 -0
- package/src/timezone.js +57 -0
- package/src/timing.js +49 -0
- package/src/type-utils.js +76 -0
- package/src/url-utils.js +102 -0
- package/src/url.js +50 -0
- package/src/utils.js +72 -0
- package/src/validation.js.js +29 -0
- package/src/validation_ts.js +6 -0
- package/vendor/actioncable/adapters.js +6 -0
- package/vendor/actioncable/connection.js +204 -0
- package/vendor/actioncable/connection_monitor.js +129 -0
- package/vendor/actioncable/consumer.js +91 -0
- package/vendor/actioncable/index.js +34 -0
- package/vendor/actioncable/internal.js +22 -0
- package/vendor/actioncable/logger.js +28 -0
- package/vendor/actioncable/subscription.js +93 -0
- package/vendor/actioncable/subscriptions.js +89 -0
- package/vendor/open-telemetry-idgenerator.js +43 -0
- package/widget/analytics/facebook_tracker.js +8 -0
- package/widget/analytics/google_analytics_tracker.js +83 -0
- package/widget/analytics/google_tag_manager_tracker.js +22 -0
- package/widget/analytics.js +58 -0
- package/widget/api_handler/api_handler.js +730 -0
- package/widget/api_handler/base_api_handler.js +249 -0
- package/widget/booker_intent_tracker.js +391 -0
- package/widget/booker_outcome_tracker.js +329 -0
- package/widget/capture_widget_exceptions.js +150 -0
- package/widget/channel.js +282 -0
- package/widget/composite_experience_adapter.js +101 -0
- package/widget/constants.generated.js +350 -0
- package/widget/constants.js +21 -0
- package/widget/container.js +193 -0
- package/widget/content_activity_emitter.js +36 -0
- package/widget/data360_visitor.js +67 -0
- package/widget/date_provider.js +11 -0
- package/widget/debug_mode_state.js +175 -0
- package/widget/dummy_module.js +9 -0
- package/widget/eloqua_visitor.js +17 -0
- package/widget/form_cta_booker_intent.js +246 -0
- package/widget/hubspot_visitor.js +39 -0
- package/widget/inline_meeting_booker_page.js +90 -0
- package/widget/local_state/abstract_local_state.js +38 -0
- package/widget/local_state/debug_state/abstract_debug_flow.js +29 -0
- package/widget/local_state/debug_state/custom_form_flow.js +14 -0
- package/widget/local_state/debug_state/hubspot_form_flow.js +19 -0
- package/widget/local_state/debug_state/hubspot_v4_form_flow.js +19 -0
- package/widget/local_state/debug_state/marketo_form_flow.js +20 -0
- package/widget/local_state/debug_state/pardot_form_flow.js +18 -0
- package/widget/local_state/debug_state.js +362 -0
- package/widget/local_state/trace_state.js +20 -0
- package/widget/location_provider.js +9 -0
- package/widget/marketo_visitor.js +39 -0
- package/widget/meetings/tracing/buttons_forms_triggering_tracer.js +124 -0
- package/widget/meetings/tracing/spans/button_spans.js +18 -0
- package/widget/meetings/tracing/spans/form_spans.js +11 -0
- package/widget/multimodal_v2/assets_preloader.js +97 -0
- package/widget/multimodal_v2/components/AppLayout.js +93 -0
- package/widget/multimodal_v2/components/CursorOverlay.js +93 -0
- package/widget/multimodal_v2/components/PointerRectOverlay.js +74 -0
- package/widget/multimodal_v2/components/app/Artifact.js +109 -0
- package/widget/multimodal_v2/components/app/Background.js +27 -0
- package/widget/multimodal_v2/components/app/CalendarLoadingContent.js +255 -0
- package/widget/multimodal_v2/components/app/Chat.js +39 -0
- package/widget/multimodal_v2/components/app/CookieConsentModal.js +149 -0
- package/widget/multimodal_v2/components/app/Foreground.js +48 -0
- package/widget/multimodal_v2/components/app/HiddenInput.js +41 -0
- package/widget/multimodal_v2/components/app/Input.js +72 -0
- package/widget/multimodal_v2/components/app/LightboxExperience.js +769 -0
- package/widget/multimodal_v2/components/app/LoadingOverlay.js +97 -0
- package/widget/multimodal_v2/components/app/Main.js +985 -0
- package/widget/multimodal_v2/components/app/MessengerButton.js +160 -0
- package/widget/multimodal_v2/components/app/Multimodal.js +17 -0
- package/widget/multimodal_v2/components/app/OverlayControls.js +79 -0
- package/widget/multimodal_v2/components/app/Preview.js +32 -0
- package/widget/multimodal_v2/components/app/PrivacyDisclosure.js +57 -0
- package/widget/multimodal_v2/components/app/RotateDeviceOverlay.js +70 -0
- package/widget/multimodal_v2/components/app/Toolbar.js +156 -0
- package/widget/multimodal_v2/components/chat/ChatComposer.js +129 -0
- package/widget/multimodal_v2/components/chat/ChatInputForm.js +398 -0
- package/widget/multimodal_v2/components/chat/ColdStartQuestions.js +354 -0
- package/widget/multimodal_v2/components/chat/ComposerErrorBanner.js +62 -0
- package/widget/multimodal_v2/components/chat/PostCallSurvey.js +359 -0
- package/widget/multimodal_v2/components/chat/preview/FieldRequestRenderer.js +41 -0
- package/widget/multimodal_v2/components/chat/preview/PreviewMessageRenderer.js +60 -0
- package/widget/multimodal_v2/components/chat/preview/SharedOfferRenderer.js +143 -0
- package/widget/multimodal_v2/components/chat/preview/TextRenderer.js +27 -0
- package/widget/multimodal_v2/components/chat/preview/TimelinePreview.js +254 -0
- package/widget/multimodal_v2/components/chat/timeline/CalendarEventOfferRenderer.js +103 -0
- package/widget/multimodal_v2/components/chat/timeline/CalendarEventPickRenderer.js +148 -0
- package/widget/multimodal_v2/components/chat/timeline/FieldEntryRenderer.js +84 -0
- package/widget/multimodal_v2/components/chat/timeline/FieldRequestRenderer.js +56 -0
- package/widget/multimodal_v2/components/chat/timeline/InlinePrivacyDisclosure.js +66 -0
- package/widget/multimodal_v2/components/chat/timeline/LinkPreviewCard.js +70 -0
- package/widget/multimodal_v2/components/chat/timeline/MessageEntry.js +88 -0
- package/widget/multimodal_v2/components/chat/timeline/PresentContentRenderer.js +30 -0
- package/widget/multimodal_v2/components/chat/timeline/PresentDeckRenderer.js +279 -0
- package/widget/multimodal_v2/components/chat/timeline/PresentVideoRenderer.js +131 -0
- package/widget/multimodal_v2/components/chat/timeline/ShareContentRenderer.js +59 -0
- package/widget/multimodal_v2/components/chat/timeline/SharedOfferRenderer.js +131 -0
- package/widget/multimodal_v2/components/chat/timeline/SystemRenderer.js +82 -0
- package/widget/multimodal_v2/components/chat/timeline/TextRenderer.js +66 -0
- package/widget/multimodal_v2/components/chat/timeline/Timeline.js +158 -0
- package/widget/multimodal_v2/components/debug/DebugMultimodalPanel.js +327 -0
- package/widget/multimodal_v2/components/decks/index.js +160 -0
- package/widget/multimodal_v2/components/field_request/BooleanField.js +77 -0
- package/widget/multimodal_v2/components/field_request/FieldComponents.js +69 -0
- package/widget/multimodal_v2/components/field_request/Form.js +87 -0
- package/widget/multimodal_v2/components/field_request/MultiPicklistField.js +240 -0
- package/widget/multimodal_v2/components/field_request/PicklistField.js +166 -0
- package/widget/multimodal_v2/components/field_request/SingleLineInputField.js +69 -0
- package/widget/multimodal_v2/components/field_request/TextField.js +37 -0
- package/widget/multimodal_v2/components/field_request/index.js +170 -0
- package/widget/multimodal_v2/components/helpers/AutoScroll.js +37 -0
- package/widget/multimodal_v2/components/helpers/ErrorBoundary.js +53 -0
- package/widget/multimodal_v2/components/helpers/FocusTrapDialog.js +26 -0
- package/widget/multimodal_v2/components/helpers/ImpressionTracker.js +94 -0
- package/widget/multimodal_v2/components/helpers/ListRenderer.js +37 -0
- package/widget/multimodal_v2/components/helpers/Localization.js +76 -0
- package/widget/multimodal_v2/components/helpers/Persisted.js +166 -0
- package/widget/multimodal_v2/components/helpers/RichText.js +358 -0
- package/widget/multimodal_v2/components/helpers/ScreenReaderHeading.js +17 -0
- package/widget/multimodal_v2/components/helpers/Thumbnail.js +190 -0
- package/widget/multimodal_v2/components/helpers/VisuallyHidden.js +41 -0
- package/widget/multimodal_v2/components/helpers/content_click_payloads.js +58 -0
- package/widget/multimodal_v2/components/helpers/useDraggable.js +103 -0
- package/widget/multimodal_v2/components/helpers/useTextOverflow.js +44 -0
- package/widget/multimodal_v2/components/lightbox_gather/index.js +741 -0
- package/widget/multimodal_v2/components/meetings/ArtifactEntryPoint.js +252 -0
- package/widget/multimodal_v2/components/meetings/MeetingAdditionalAttendees.js +325 -0
- package/widget/multimodal_v2/components/meetings/MeetingBookerEntry.js +100 -0
- package/widget/multimodal_v2/components/meetings/MeetingDetailsCard.js +99 -0
- package/widget/multimodal_v2/components/meetings/MeetingErrorBanner.js +62 -0
- package/widget/multimodal_v2/components/meetings/MeetingOfferEmailStep.js +239 -0
- package/widget/multimodal_v2/components/meetings/MeetingOfferFooter.js +104 -0
- package/widget/multimodal_v2/components/meetings/MeetingOfferSelectionStep.js +60 -0
- package/widget/multimodal_v2/components/meetings/MeetingRepHeader.js +222 -0
- package/widget/multimodal_v2/components/meetings/MeetingStepShell.js +92 -0
- package/widget/multimodal_v2/components/meetings/MeetingSummaryRail.js +515 -0
- package/widget/multimodal_v2/components/meetings/MeetingTimeSelector.js +603 -0
- package/widget/multimodal_v2/components/meetings/MonthDatePicker.js +422 -0
- package/widget/multimodal_v2/components/meetings/NavigationButtons.js +76 -0
- package/widget/multimodal_v2/components/meetings/TimeSlotHeader.js +357 -0
- package/widget/multimodal_v2/components/meetings/WeekViewHeader.js +20 -0
- package/widget/multimodal_v2/components/meetings/constants.js +7 -0
- package/widget/multimodal_v2/components/meetings/index.js +47 -0
- package/widget/multimodal_v2/components/meetings/utils.js +328 -0
- package/widget/multimodal_v2/components/multimodal/Audio.js +28 -0
- package/widget/multimodal_v2/components/multimodal/Controls.js +188 -0
- package/widget/multimodal_v2/components/multimodal/LiveVideo.js +63 -0
- package/widget/multimodal_v2/components/multimodal/MultiModalComponent.js +424 -0
- package/widget/multimodal_v2/components/multimodal/MultimodalAvatar.js +36 -0
- package/widget/multimodal_v2/components/multimodal/OrbAvatar.js +326 -0
- package/widget/multimodal_v2/components/multimodal/Status.js +220 -0
- package/widget/multimodal_v2/components/multimodal/VideoAvatar.js +24 -0
- package/widget/multimodal_v2/components/multimodal/VideoPreview.js +114 -0
- package/widget/multimodal_v2/components/multimodal/useAudioLevelMonitoring.js +96 -0
- package/widget/multimodal_v2/components/multimodal/useMultimodal.js +434 -0
- package/widget/multimodal_v2/components/presentations/index.js +372 -0
- package/widget/multimodal_v2/components/shared/Avatar.js +92 -0
- package/widget/multimodal_v2/components/shared/AvatarGroup.js +135 -0
- package/widget/multimodal_v2/components/shared/Button.js +245 -0
- package/widget/multimodal_v2/components/shared/ButtonGroup.js +133 -0
- package/widget/multimodal_v2/components/shared/ComposerForm.js +98 -0
- package/widget/multimodal_v2/components/shared/SpeakingIndicator.js +239 -0
- package/widget/multimodal_v2/components/shared/ThinkingAnimation.js +165 -0
- package/widget/multimodal_v2/components/shared/Tooltip.js +266 -0
- package/widget/multimodal_v2/components/shared/controls/Dropdown.js +79 -0
- package/widget/multimodal_v2/components/shared/controls/PillToggle.js +142 -0
- package/widget/multimodal_v2/components/shared/controls/TextArea.js +114 -0
- package/widget/multimodal_v2/components/shared/toolCallLabels.js +12 -0
- package/widget/multimodal_v2/components/slides/SlidesThumbnail.js +47 -0
- package/widget/multimodal_v2/components/slides/index.js +61 -0
- package/widget/multimodal_v2/constants.js +88 -0
- package/widget/multimodal_v2/host.split-css.js +2 -0
- package/widget/multimodal_v2/host.string.js +96 -0
- package/widget/multimodal_v2/images/icons.js +582 -0
- package/widget/multimodal_v2/images/posters/piper_low_res.jpg +0 -0
- package/widget/multimodal_v2/index.js +23 -0
- package/widget/multimodal_v2/index.panda.js +28 -0
- package/widget/multimodal_v2/index.split-css.panda.js +2 -0
- package/widget/multimodal_v2/inline_meeting_booker.js +182 -0
- package/widget/multimodal_v2/locales/cs.js +196 -0
- package/widget/multimodal_v2/locales/da.js +196 -0
- package/widget/multimodal_v2/locales/de.js +196 -0
- package/widget/multimodal_v2/locales/en.js +196 -0
- package/widget/multimodal_v2/locales/en_AU.js +197 -0
- package/widget/multimodal_v2/locales/en_GB.js +197 -0
- package/widget/multimodal_v2/locales/es.js +197 -0
- package/widget/multimodal_v2/locales/es_LA.js +196 -0
- package/widget/multimodal_v2/locales/fi.js +196 -0
- package/widget/multimodal_v2/locales/fr.js +197 -0
- package/widget/multimodal_v2/locales/fr_CA.js +196 -0
- package/widget/multimodal_v2/locales/id.js +196 -0
- package/widget/multimodal_v2/locales/index.js +48 -0
- package/widget/multimodal_v2/locales/it.js +196 -0
- package/widget/multimodal_v2/locales/ja.js +196 -0
- package/widget/multimodal_v2/locales/ko.js +196 -0
- package/widget/multimodal_v2/locales/nb.js +196 -0
- package/widget/multimodal_v2/locales/nl.js +196 -0
- package/widget/multimodal_v2/locales/pl.js +196 -0
- package/widget/multimodal_v2/locales/pt_BR.js +196 -0
- package/widget/multimodal_v2/locales/ru.js +196 -0
- package/widget/multimodal_v2/locales/sv.js +196 -0
- package/widget/multimodal_v2/locales/th.js +196 -0
- package/widget/multimodal_v2/locales/tr.js +196 -0
- package/widget/multimodal_v2/locales/vi.js +196 -0
- package/widget/multimodal_v2/locales/zh_CN.js +196 -0
- package/widget/multimodal_v2/locales/zh_TW.js +196 -0
- package/widget/multimodal_v2/multimodal.js +633 -0
- package/widget/multimodal_v2/multimodal_channel.js +195 -0
- package/widget/multimodal_v2/signals/active_conversation_signal.js +33 -0
- package/widget/multimodal_v2/signals/allowed_conversation_mode_signal.js +38 -0
- package/widget/multimodal_v2/signals/artifact_signal.js +22 -0
- package/widget/multimodal_v2/signals/layout_signal.js +98 -0
- package/widget/multimodal_v2/signals/messages_signal.js +207 -0
- package/widget/multimodal_v2/signals/ui_state_signal.js +128 -0
- package/widget/multimodal_v2/stable_bundle_src.js +44 -0
- package/widget/multimodal_v2/stores/ai_conversation_store.js +221 -0
- package/widget/multimodal_v2/stores/artifact_store.js +205 -0
- package/widget/multimodal_v2/stores/base_store.js +16 -0
- package/widget/multimodal_v2/stores/call_store.js +770 -0
- package/widget/multimodal_v2/stores/call_ui_adapter.js +225 -0
- package/widget/multimodal_v2/stores/debug_multimodal_scenario_store.js +471 -0
- package/widget/multimodal_v2/stores/decks_store.js +285 -0
- package/widget/multimodal_v2/stores/device_store.js +63 -0
- package/widget/multimodal_v2/stores/docking_store.js +62 -0
- package/widget/multimodal_v2/stores/field_request_store.js +326 -0
- package/widget/multimodal_v2/stores/meeting_store.js +477 -0
- package/widget/multimodal_v2/stores/participant_store.js +73 -0
- package/widget/multimodal_v2/stores/post_call_survey_store.js +160 -0
- package/widget/multimodal_v2/stores/pounce_tracking_store.js +163 -0
- package/widget/multimodal_v2/stores/pounce_tracking_store_v2.js +511 -0
- package/widget/multimodal_v2/stores/presentations_store.js +111 -0
- package/widget/multimodal_v2/stores/root_store.js +1919 -0
- package/widget/multimodal_v2/stores/screen_share_store.js +217 -0
- package/widget/multimodal_v2/stores/slides_store.js +21 -0
- package/widget/multimodal_v2/stores/translation_store.js +185 -0
- package/widget/multimodal_v2/stores/ui_store.js +496 -0
- package/widget/multimodal_v2/stores/waiting_store.js +159 -0
- package/widget/multimodal_v2/stores/website_navigation_store.js +767 -0
- package/widget/multimodal_v2/styled-system/css/conditions.js +34 -0
- package/widget/multimodal_v2/styled-system/css/css.js +48 -0
- package/widget/multimodal_v2/styled-system/css/cva.js +96 -0
- package/widget/multimodal_v2/styled-system/css/cx.js +13 -0
- package/widget/multimodal_v2/styled-system/css/index.js +15 -0
- package/widget/multimodal_v2/styled-system/css/sva.js +69 -0
- package/widget/multimodal_v2/styled-system/helpers.js +384 -0
- package/widget/multimodal_v2/styled-system/jsx/create-style-context.js +96 -0
- package/widget/multimodal_v2/styled-system/jsx/factory-helper.js +19 -0
- package/widget/multimodal_v2/styled-system/jsx/factory.js +111 -0
- package/widget/multimodal_v2/styled-system/jsx/index.js +12 -0
- package/widget/multimodal_v2/styled-system/jsx/is-valid-prop.js +22 -0
- package/widget/multimodal_v2/types.js +105 -0
- package/widget/multimodal_v2/utils/auto_scroller.js +157 -0
- package/widget/multimodal_v2/utils/flip_animation.js +124 -0
- package/widget/multimodal_v2/utils/focus_gate.js +237 -0
- package/widget/multimodal_v2/utils/locale.js +16 -0
- package/widget/multimodal_v2/utils/media_queries.js +30 -0
- package/widget/multimodal_v2/utils/multimodal_cache.js +19 -0
- package/widget/multimodal_v2/utils/mutation_effect.js +14 -0
- package/widget/multimodal_v2/utils/navigation_interceptor.js +205 -0
- package/widget/multimodal_v2/utils/navigation_strategies/dom_swap.js +393 -0
- package/widget/multimodal_v2/utils/navigation_strategies/index.js +12 -0
- package/widget/multimodal_v2/utils/navigation_strategies/lwr.js +61 -0
- package/widget/multimodal_v2/utils/navigation_strategies/navigation_utils.js +46 -0
- package/widget/multimodal_v2/utils/navigation_strategies/next_js.js +24 -0
- package/widget/multimodal_v2/utils/navigation_strategies/wouter_v3.js +15 -0
- package/widget/multimodal_v2/utils/objects_map.js +38 -0
- package/widget/multimodal_v2/utils/perceived_voice_turn_tracker.js +345 -0
- package/widget/multimodal_v2/utils/sanitize_html.js +132 -0
- package/widget/multimodal_v2/utils/signals.js +97 -0
- package/widget/multimodal_v2/utils/slide_zoom.js +114 -0
- package/widget/multimodal_v2/utils/theme_styles.js +137 -0
- package/widget/multimodal_v2/utils/url_observer.js +52 -0
- package/widget/multimodal_v2/utils/voice_onset_detector.js +127 -0
- package/widget/page_mirror.js +89 -0
- package/widget/page_view_activity_emitter.js +71 -0
- package/widget/pardot_visitor.js +137 -0
- package/widget/personalization_observer.js +96 -0
- package/widget/personalizations_config.js +160 -0
- package/widget/qualified_form/constants.js +23 -0
- package/widget/qualified_form/phone_utils.js +38 -0
- package/widget/qualified_form/qualified_form_action.js +91 -0
- package/widget/qualified_form/qualified_form_action_orchestrator.js +21 -0
- package/widget/qualified_form/qualified_form_api.js +471 -0
- package/widget/scroll_disabler.js +109 -0
- package/widget/server-logger.js +156 -0
- package/widget/smart_website_config.js +112 -0
- package/widget/telemetry/context.js +75 -0
- package/widget/telemetry/index.js +16 -0
- package/widget/telemetry/messenger_uptime.js +80 -0
- package/widget/telemetry/metrics.js +120 -0
- package/widget/telemetry/span.js +82 -0
- package/widget/telemetry/telemetry.js +180 -0
- package/widget/telemetry/tracer.js +41 -0
- package/widget/telemetry/tracing_store.js +310 -0
- package/widget/tracker.js +916 -0
- package/widget/utils/native_globals.js +129 -0
- package/widget/v1_adapter.js +50 -0
- package/widget/v2_adapter.js +368 -0
- package/widget/visitor/base_visitor_state.js +11 -0
- package/widget/visitor/cookie_visitor_state.js +128 -0
- package/widget/visitor/in_memory_visitor_state.js +29 -0
- package/widget/visitor/visitor_state.js +384 -0
- package/widget/visitor.js +356 -0
- package/widget/widget/linked_widget_v2.js +227 -0
- package/widget/widget/page_mirror_factory.js +22 -0
- package/widget/widget/sentry.js +130 -0
- package/widget/widget/widget.js +1698 -0
- package/widget/widget.split-css.js +2 -0
- package/widget/widget_bootstrap.js +97 -0
- package/widget/widget_object.js +73 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { signals_core_module_d, signals_core_module_w } from "../../../js/multimodal_v2.js";
|
|
2
|
+
import { createArtifactSignal } from "./artifact_signal.js";
|
|
3
|
+
import { ConversationMode as types_ConversationMode, OpenedDisplayMode as types_OpenedDisplayMode, DisplayMode as types_DisplayMode, InputHiddenReason as types_InputHiddenReason, InputState as types_InputState } from "../types.js";
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
function createUIStateSignal(rootStore) {
|
|
9
|
+
const state = signals_core_module_d({
|
|
10
|
+
displayMode: types_DisplayMode.COLLAPSED_CENTER,
|
|
11
|
+
openedDisplayMode: types_OpenedDisplayMode.SIDEBAR,
|
|
12
|
+
conversationMode: types_ConversationMode.TEXT,
|
|
13
|
+
inputMessageId: null,
|
|
14
|
+
artifactMessageId: null,
|
|
15
|
+
userHasDismissed: false,
|
|
16
|
+
userHasIgnoredMultimodal: false
|
|
17
|
+
});
|
|
18
|
+
return Object.assign(state, {
|
|
19
|
+
displayMode: createDisplayModeSignal(state),
|
|
20
|
+
openedDisplayMode: signals_core_module_w(()=>{
|
|
21
|
+
var _state_value_openedDisplayMode;
|
|
22
|
+
return (_state_value_openedDisplayMode = state.value.openedDisplayMode) != null ? _state_value_openedDisplayMode : types_OpenedDisplayMode.SIDEBAR;
|
|
23
|
+
}),
|
|
24
|
+
conversationMode: createConversationModeSignal(state),
|
|
25
|
+
input: createInputSignal(rootStore, state),
|
|
26
|
+
artifact: createArtifactSignal(rootStore, state),
|
|
27
|
+
userHasDismissed: signals_core_module_w(()=>{
|
|
28
|
+
var _state_value_userHasDismissed;
|
|
29
|
+
return (_state_value_userHasDismissed = state.value.userHasDismissed) != null ? _state_value_userHasDismissed : false;
|
|
30
|
+
}),
|
|
31
|
+
userHasIgnoredMultimodal: signals_core_module_w(()=>{
|
|
32
|
+
var _state_value_userHasIgnoredMultimodal;
|
|
33
|
+
return (_state_value_userHasIgnoredMultimodal = state.value.userHasIgnoredMultimodal) != null ? _state_value_userHasIgnoredMultimodal : false;
|
|
34
|
+
}),
|
|
35
|
+
// Persisted UI state is used to save the UI state to DB
|
|
36
|
+
persisted: signals_core_module_w(()=>extractPersistedUIState(state.value))
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function createConversationModeSignal(state) {
|
|
40
|
+
const conversationMode = signals_core_module_w(()=>state.value.conversationMode);
|
|
41
|
+
return Object.assign(conversationMode, {
|
|
42
|
+
text: signals_core_module_w(()=>conversationMode.value === types_ConversationMode.TEXT),
|
|
43
|
+
voice: signals_core_module_w(()=>conversationMode.value === types_ConversationMode.VOICE),
|
|
44
|
+
video: signals_core_module_w(()=>conversationMode.value === types_ConversationMode.VIDEO),
|
|
45
|
+
multimodal: signals_core_module_w(()=>conversationMode.value !== types_ConversationMode.TEXT)
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function createDisplayModeSignal(state) {
|
|
49
|
+
const displayMode = signals_core_module_w(()=>state.value.displayMode);
|
|
50
|
+
const collapsedCenter = signals_core_module_w(()=>displayMode.value === types_DisplayMode.COLLAPSED_CENTER);
|
|
51
|
+
const collapsedRight = signals_core_module_w(()=>displayMode.value === types_DisplayMode.COLLAPSED_RIGHT);
|
|
52
|
+
const closed = signals_core_module_w(()=>displayMode.value === types_DisplayMode.CLOSED);
|
|
53
|
+
const sidebar = signals_core_module_w(()=>displayMode.value === types_DisplayMode.SIDEBAR);
|
|
54
|
+
const docked = signals_core_module_w(()=>displayMode.value === types_DisplayMode.DOCKED);
|
|
55
|
+
// Convenience computed signals
|
|
56
|
+
const collapsed = signals_core_module_w(()=>collapsedCenter.value || collapsedRight.value);
|
|
57
|
+
const minimized = signals_core_module_w(()=>collapsed.value || closed.value);
|
|
58
|
+
const opened = signals_core_module_w(()=>sidebar.value || docked.value);
|
|
59
|
+
return Object.assign(displayMode, {
|
|
60
|
+
collapsedCenter,
|
|
61
|
+
collapsedRight,
|
|
62
|
+
collapsed,
|
|
63
|
+
closed,
|
|
64
|
+
sidebar,
|
|
65
|
+
docked,
|
|
66
|
+
minimized,
|
|
67
|
+
opened
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
function createInputSignal(rootStore, uiState) {
|
|
71
|
+
const messageId = signals_core_module_w(()=>uiState.value.inputMessageId);
|
|
72
|
+
const message = signals_core_module_w(()=>{
|
|
73
|
+
var _rootStore_messages_visible_value_find;
|
|
74
|
+
if (!messageId.value) return null;
|
|
75
|
+
const message = (_rootStore_messages_visible_value_find = rootStore.messages.visible.value.find((m)=>m.id === messageId.value)) != null ? _rootStore_messages_visible_value_find : null;
|
|
76
|
+
if (!message) return null;
|
|
77
|
+
if (message.type === "field_request") {
|
|
78
|
+
return message;
|
|
79
|
+
}
|
|
80
|
+
return null;
|
|
81
|
+
});
|
|
82
|
+
const hiddenReason = signals_core_module_w(()=>{
|
|
83
|
+
if (rootStore.isVisitorBlocked.value) {
|
|
84
|
+
return types_InputHiddenReason.VISITOR_BLOCKED;
|
|
85
|
+
}
|
|
86
|
+
if (!rootStore.agentsAvailable.value && rootStore.userEngaged.value) {
|
|
87
|
+
return types_InputHiddenReason.REPS_OFFLINE;
|
|
88
|
+
}
|
|
89
|
+
if (!rootStore.messages.hasStartChatBotEvent.value && !rootStore.activeConversation.user.value) {
|
|
90
|
+
return types_InputHiddenReason.CONVERSATION_NOT_STARTED;
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
});
|
|
94
|
+
const state = signals_core_module_w(()=>{
|
|
95
|
+
var _message_value;
|
|
96
|
+
if (hiddenReason.value === types_InputHiddenReason.VISITOR_BLOCKED) return types_InputState.HIDDEN;
|
|
97
|
+
if (((_message_value = message.value) == null ? void 0 : _message_value.type) === "field_request") return types_InputState.FIELD_REQUEST;
|
|
98
|
+
if (hiddenReason.value) return types_InputState.HIDDEN;
|
|
99
|
+
return types_InputState.CHAT;
|
|
100
|
+
});
|
|
101
|
+
const isAnchored = signals_core_module_w(()=>{
|
|
102
|
+
const msg = message.value;
|
|
103
|
+
return (msg == null ? void 0 : msg.type) === "field_request" && (msg.fieldType === "picklist" || msg.fieldType === "multi_picklist") && !rootStore.displayMode.minimized.value;
|
|
104
|
+
});
|
|
105
|
+
return {
|
|
106
|
+
messageId,
|
|
107
|
+
message,
|
|
108
|
+
state,
|
|
109
|
+
hiddenReason,
|
|
110
|
+
isAnchored
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function extractPersistedUIState(uiState) {
|
|
114
|
+
const persisted = {
|
|
115
|
+
displayMode: uiState.displayMode,
|
|
116
|
+
openedDisplayMode: uiState.openedDisplayMode,
|
|
117
|
+
userHasDismissed: uiState.userHasDismissed,
|
|
118
|
+
userHasIgnoredMultimodal: uiState.userHasIgnoredMultimodal
|
|
119
|
+
};
|
|
120
|
+
// Drop null/undefined so restoring partial/older sessions (e.g. state that
|
|
121
|
+
// predates openedDisplayMode) doesn't clobber existing values with nullish.
|
|
122
|
+
return Object.fromEntries(Object.entries(persisted).filter((param)=>{
|
|
123
|
+
let [, value] = param;
|
|
124
|
+
return value != null;
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
export { createUIStateSignal, extractPersistedUIState };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
var _ref;
|
|
2
|
+
var _document_currentScript;
|
|
3
|
+
/**
|
|
4
|
+
* Resolves the base URL this bundle was loaded from, so sibling artifacts (e.g.
|
|
5
|
+
* call-machine-object-bundle.js) can be resolved relative to it.
|
|
6
|
+
*
|
|
7
|
+
* Two resolution sources, tried in this order:
|
|
8
|
+
*
|
|
9
|
+
* 1. `globalThis.__qualifiedBundleBaseUrl` — a runtime override, set by `setup()`
|
|
10
|
+
* before any call object is created. This is how the unbundled ESM package supplies
|
|
11
|
+
* its base: the entry resolves `import.meta.url` and assigns it here. It cannot be a
|
|
12
|
+
* build-time constant read at module-evaluation time — the widget graph is reached by
|
|
13
|
+
* static imports that run in full before the entry's first statement, so a value
|
|
14
|
+
* captured then would always be too late. Reading it on demand is what lets `setup()`
|
|
15
|
+
* set it in time.
|
|
16
|
+
* 2. `document.currentScript.src` — classic-script builds: the hosted snippet and
|
|
17
|
+
* today's self-hosted zip. Only readable during synchronous script execution,
|
|
18
|
+
* which is why it is captured at module-evaluation time below and why this module
|
|
19
|
+
* must be imported at the very top of a classic entry pack.
|
|
20
|
+
*
|
|
21
|
+
* Under ESM, source 2 is always null, because `document.currentScript` is only set
|
|
22
|
+
* while a classic script tag is executing. That is the defect this ordering exists to
|
|
23
|
+
* fix: a null base URL used to fall through to a remote call-machine bundle without
|
|
24
|
+
* erroring. See the TDD, "Verified blockers", blocker 1.
|
|
25
|
+
*
|
|
26
|
+
* Hosted snippets legitimately have no sibling artifact and keep using the
|
|
27
|
+
* backend-provided CDN URL; only self-hosted builds require this to resolve.
|
|
28
|
+
*/ /**
|
|
29
|
+
* Source 3, captured while the classic script tag is still executing.
|
|
30
|
+
*
|
|
31
|
+
* This one cannot be deferred: `document.currentScript` is non-null only during
|
|
32
|
+
* synchronous execution of the script that set it, and reads `null` from any later
|
|
33
|
+
* task. Null throughout an ES module's evaluation by design, which is the ESM shape
|
|
34
|
+
* blocker 1 describes.
|
|
35
|
+
*/ const CURRENT_SCRIPT_SRC = typeof document !== "undefined" ? (_ref = (_document_currentScript = document.currentScript) == null ? void 0 : _document_currentScript.src) != null ? _ref : null : null;
|
|
36
|
+
/** The base URL sibling assets resolve against, or null when nothing supplies one. */ function resolveBundleBaseUrl() {
|
|
37
|
+
const runtimeOverride = globalThis.__qualifiedBundleBaseUrl;
|
|
38
|
+
if (runtimeOverride) {
|
|
39
|
+
return runtimeOverride;
|
|
40
|
+
}
|
|
41
|
+
return CURRENT_SCRIPT_SRC;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export { resolveBundleBaseUrl };
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { __webpack_require__ } from "../../../js/runtime.js";
|
|
2
|
+
import { signals_core_module_r, signals_core_module_d } from "../../../js/multimodal_v2.js";
|
|
3
|
+
import { snakify } from "../../../src/utils.js";
|
|
4
|
+
import "../../telemetry/index.js";
|
|
5
|
+
import "../../utils/native_globals.js";
|
|
6
|
+
import { ConversationMode as types_ConversationMode } from "../types.js";
|
|
7
|
+
import { metrics } from "../../telemetry/metrics.js";
|
|
8
|
+
|
|
9
|
+
/* provided dependency */ var ai_conversation_store_clearTimeout = __webpack_require__(68034).Kj;
|
|
10
|
+
/* provided dependency */ var ai_conversation_store_setTimeout = __webpack_require__(68034).pS;
|
|
11
|
+
function _extends() {
|
|
12
|
+
_extends = Object.assign || function(target) {
|
|
13
|
+
for(var i = 1; i < arguments.length; i++){
|
|
14
|
+
var source = arguments[i];
|
|
15
|
+
for(var key in source){
|
|
16
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
17
|
+
target[key] = source[key];
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return target;
|
|
22
|
+
};
|
|
23
|
+
return _extends.apply(this, arguments);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class AiConversationStore {
|
|
30
|
+
emitAvailabilityFailed() {
|
|
31
|
+
if (this.availabilityTimeoutId === null) return;
|
|
32
|
+
ai_conversation_store_clearTimeout(this.availabilityTimeoutId);
|
|
33
|
+
this.availabilityTimeoutId = null;
|
|
34
|
+
metrics.emitIncrement("multimodal_session_failed");
|
|
35
|
+
}
|
|
36
|
+
dispose() {
|
|
37
|
+
if (this.startConversationTimeoutId !== null) {
|
|
38
|
+
ai_conversation_store_clearTimeout(this.startConversationTimeoutId);
|
|
39
|
+
this.startConversationTimeoutId = null;
|
|
40
|
+
}
|
|
41
|
+
if (this.availabilityTimeoutId !== null) {
|
|
42
|
+
ai_conversation_store_clearTimeout(this.availabilityTimeoutId);
|
|
43
|
+
this.availabilityTimeoutId = null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
constructor(callStore){
|
|
47
|
+
this.callStore = callStore;
|
|
48
|
+
this.conversation = signals_core_module_d(null);
|
|
49
|
+
this.isCoffeeReady = signals_core_module_d(false);
|
|
50
|
+
this.error = signals_core_module_d(false);
|
|
51
|
+
this.alreadyInCall = signals_core_module_d(false);
|
|
52
|
+
this.startConversationTimestamp = null;
|
|
53
|
+
this.startConversationTimeoutId = null;
|
|
54
|
+
this.availabilityTimeoutId = null;
|
|
55
|
+
this.startConversation = async (restart, startCallContext)=>{
|
|
56
|
+
if (restart === void 0) restart = false;
|
|
57
|
+
if (startCallContext === void 0) startCallContext = null;
|
|
58
|
+
this.rootStore.isVideoLoading.value = true;
|
|
59
|
+
this.isCoffeeReady.value = false;
|
|
60
|
+
this.alreadyInCall.value = false;
|
|
61
|
+
this.startConversationTimestamp = performance.now();
|
|
62
|
+
if (this.startConversationTimeoutId !== null) {
|
|
63
|
+
ai_conversation_store_clearTimeout(this.startConversationTimeoutId);
|
|
64
|
+
}
|
|
65
|
+
if (this.availabilityTimeoutId !== null) {
|
|
66
|
+
ai_conversation_store_clearTimeout(this.availabilityTimeoutId);
|
|
67
|
+
}
|
|
68
|
+
if (!restart) {
|
|
69
|
+
this.callStore.resetCallAvailabilityMetric();
|
|
70
|
+
}
|
|
71
|
+
// Set up 30s timeout to log metric if all_participants_joined doesn't fire
|
|
72
|
+
this.startConversationTimeoutId = ai_conversation_store_setTimeout(()=>{
|
|
73
|
+
if (this.startConversationTimestamp !== null) {
|
|
74
|
+
metrics.emitTiming("multimodal_time_to_all_participants_joined_ms", 30000);
|
|
75
|
+
this.startConversationTimestamp = null;
|
|
76
|
+
}
|
|
77
|
+
this.startConversationTimeoutId = null;
|
|
78
|
+
}, 30000);
|
|
79
|
+
this.availabilityTimeoutId = ai_conversation_store_setTimeout(()=>{
|
|
80
|
+
this.availabilityTimeoutId = null;
|
|
81
|
+
metrics.emitIncrement("multimodal_session_failed");
|
|
82
|
+
}, AiConversationStore.AVAILABILITY_BUDGET_MS);
|
|
83
|
+
this.callStore.preload();
|
|
84
|
+
// Forward the start-call context (set when the call was started with a specific
|
|
85
|
+
// trigger, e.g. from a "present_video" card). Skipped on restart/reconnect so
|
|
86
|
+
// re-joins don't re-trigger the opening intent.
|
|
87
|
+
const context = restart ? null : startCallContext;
|
|
88
|
+
const response = await this.rootStore.channel.perform("start_ai_sdr_conversation", _extends({
|
|
89
|
+
restart,
|
|
90
|
+
call_type: this.rootStore.allowVoiceVideoToggle.value ? types_ConversationMode.VIDEO : this.rootStore.conversationMode.value
|
|
91
|
+
}, this.rootStore.featureFlags.piperXAnam && {
|
|
92
|
+
avatar_provider: "anam"
|
|
93
|
+
}, context && {
|
|
94
|
+
start_call_context: snakify(context)
|
|
95
|
+
}));
|
|
96
|
+
if (response.error) {
|
|
97
|
+
if (this.startConversationTimeoutId !== null) {
|
|
98
|
+
ai_conversation_store_clearTimeout(this.startConversationTimeoutId);
|
|
99
|
+
this.startConversationTimeoutId = null;
|
|
100
|
+
}
|
|
101
|
+
this.startConversationTimestamp = null;
|
|
102
|
+
this.emitAvailabilityFailed();
|
|
103
|
+
// Degrade gracefully to text instead of surfacing a hard error, so the
|
|
104
|
+
// visitor can keep talking to us when room creation can't be recovered.
|
|
105
|
+
this.failoverToText();
|
|
106
|
+
} else if ("active_call_exists" in response.data) {
|
|
107
|
+
this.alreadyInCall.value = true;
|
|
108
|
+
this.rootStore.isVideoLoading.value = false;
|
|
109
|
+
} else {
|
|
110
|
+
this.handleStartResponse(response.data);
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
// Initialize navigation interception only when we know the conversation was created successfully
|
|
114
|
+
if (this.conversation.value) {
|
|
115
|
+
const store = await this.rootStore.websiteNavigationStore.load();
|
|
116
|
+
// Guard: conversation may have been cleared while we were waiting for the response
|
|
117
|
+
if (this.conversation.value) {
|
|
118
|
+
store.initNavigationInterceptor();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
} catch (error) {
|
|
122
|
+
// Suppress error - we'll handle it later
|
|
123
|
+
// TODO: report to sentry when sentry is available within stores
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* End the current conversation.
|
|
128
|
+
*/ this.endConversation = async ()=>{
|
|
129
|
+
if (!this.conversation.value) return;
|
|
130
|
+
// We don't need to await this we can assume the backend will end it correctly
|
|
131
|
+
this.rootStore.channel.perform("end_ai_sdr_conversation", {
|
|
132
|
+
conversation_id: this.conversation.value.conversation_id
|
|
133
|
+
});
|
|
134
|
+
await this.handleEndResponse();
|
|
135
|
+
};
|
|
136
|
+
this.handleEndResponse = async ()=>{
|
|
137
|
+
var _ref;
|
|
138
|
+
var _this_conversation_value;
|
|
139
|
+
const conversationId = (_ref = (_this_conversation_value = this.conversation.value) == null ? void 0 : _this_conversation_value.conversation_id) != null ? _ref : null;
|
|
140
|
+
if (this.availabilityTimeoutId !== null) {
|
|
141
|
+
ai_conversation_store_clearTimeout(this.availabilityTimeoutId);
|
|
142
|
+
this.availabilityTimeoutId = null;
|
|
143
|
+
}
|
|
144
|
+
await this.callStore.leaveCall();
|
|
145
|
+
signals_core_module_r(()=>{
|
|
146
|
+
this.conversation.value = null;
|
|
147
|
+
this.rootStore.isVideoLoading.value = false;
|
|
148
|
+
this.rootStore.isBlurredVideoActive.value = false;
|
|
149
|
+
this.rootStore.setTypingIndicator(false);
|
|
150
|
+
try {
|
|
151
|
+
var _this_rootStore_websiteNavigationStore_value;
|
|
152
|
+
(_this_rootStore_websiteNavigationStore_value = this.rootStore.websiteNavigationStore.value) == null ? void 0 : _this_rootStore_websiteNavigationStore_value.disposeNavigationInterceptor();
|
|
153
|
+
} catch (error) {
|
|
154
|
+
// Suppress error - we'll handle it later
|
|
155
|
+
// TODO: report to sentry when sentry is available within stores
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
if (conversationId && this.rootStore.featureFlags.piperXPostCallSurvey) {
|
|
159
|
+
const surveyStore = await this.rootStore.postCallSurveyStore.load();
|
|
160
|
+
surveyStore.show(conversationId);
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* End a conversation by ID without requiring conversation.value to be set.
|
|
165
|
+
* Used to clean up conversations created on the backend when the user cancels
|
|
166
|
+
* before the start response is processed.
|
|
167
|
+
*/ this.endConversationById = async (conversationId)=>{
|
|
168
|
+
// Fire and forget - we don't need to handle the response since we're just cleaning up
|
|
169
|
+
this.rootStore.channel.perform("end_ai_sdr_conversation", {
|
|
170
|
+
conversation_id: conversationId
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
this.failoverToText = ()=>{
|
|
174
|
+
this.rootStore.isVideoLoading.value = false;
|
|
175
|
+
this.rootStore.setConversationMode(types_ConversationMode.TEXT);
|
|
176
|
+
// There is no call to sit behind a picture-in-picture widget any more, so a
|
|
177
|
+
// widget parked for one would hide the fallback notice below with nothing in
|
|
178
|
+
// its place.
|
|
179
|
+
if (this.rootStore.displayMode.minimized.peek()) {
|
|
180
|
+
this.rootStore.setOpenedDisplayMode();
|
|
181
|
+
}
|
|
182
|
+
this.rootStore.displayLocalNotice("Voice and video are temporarily unavailable. Let's keep chatting here.");
|
|
183
|
+
this.callStore.resolveCallAvailabilityMetric("success");
|
|
184
|
+
};
|
|
185
|
+
// Handlers
|
|
186
|
+
this.handleStartResponse = (payload)=>{
|
|
187
|
+
// If isVideoLoading was set to false while we were waiting for the response,
|
|
188
|
+
// it means the user canceled the connection - don't proceed
|
|
189
|
+
if (!this.rootStore.isVideoLoading.value) {
|
|
190
|
+
// The conversation was created on the backend, so we need to send an end message
|
|
191
|
+
// to clean it up. This handles the race condition where user clicks X before
|
|
192
|
+
// the start response comes back.
|
|
193
|
+
if (payload.conversation_id) {
|
|
194
|
+
this.endConversationById(payload.conversation_id);
|
|
195
|
+
}
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (payload.forced_voice_only) {
|
|
199
|
+
this.rootStore.setConversationMode(types_ConversationMode.VOICE);
|
|
200
|
+
}
|
|
201
|
+
const { conversation_id, conversation_url, visitor_token } = payload;
|
|
202
|
+
if (!conversation_id || !conversation_url) {
|
|
203
|
+
// eslint-disable-next-line no-console
|
|
204
|
+
console.error("Conversation Id or URL is missing");
|
|
205
|
+
this.error.value = true;
|
|
206
|
+
this.rootStore.isVideoLoading.value = false;
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
this.conversation.value = {
|
|
210
|
+
conversation_id,
|
|
211
|
+
conversation_url,
|
|
212
|
+
visitor_token
|
|
213
|
+
};
|
|
214
|
+
};
|
|
215
|
+
this.rootStore = callStore.rootStore;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
AiConversationStore.AVAILABILITY_BUDGET_MS = 15000;
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
export default AiConversationStore;
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { __webpack_require__ } from "../../../js/runtime.js";
|
|
2
|
+
import { signals_core_module_r, signals_core_module_d } from "../../../js/multimodal_v2.js";
|
|
3
|
+
import { BaseStore } from "./base_store.js";
|
|
4
|
+
import "../../utils/native_globals.js";
|
|
5
|
+
import { MaximizedState as types_MaximizedState } from "../types.js";
|
|
6
|
+
|
|
7
|
+
/* provided dependency */ var artifact_store_setTimeout = __webpack_require__(68034).pS;
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Owns artifact orchestration: presenting slides / presentation videos / the
|
|
13
|
+
* meeting booker in the maximized ARTIFACT overlay, navigating the host page
|
|
14
|
+
* (co-browsing), and tearing down the overlay. The underlying signal lives in the
|
|
15
|
+
* UI state (see `createArtifactSignal`); this store exposes it via `current`
|
|
16
|
+
* and drives the side effects that show/hide it.
|
|
17
|
+
*/ class ArtifactStore extends BaseStore {
|
|
18
|
+
/** The currently presented artifact (slide, presentation video, deck or meeting), if any. */ get current() {
|
|
19
|
+
return this.rootStore.uiStore.artifact;
|
|
20
|
+
}
|
|
21
|
+
constructor(rootStore){
|
|
22
|
+
super(rootStore), this.rootStore = rootStore, /** Deck/video message ids already hidden, including ones still loading. */ this.hiddenArtifactIds = new Set(), /**
|
|
23
|
+
* Messages whose artifact is on its way into the overlay: queued, and still
|
|
24
|
+
* waiting on the chunk it needs (or on a deliberate delay) before it can be
|
|
25
|
+
* shown. The timeline reads this to withhold the entry point it would otherwise
|
|
26
|
+
* draw for a message that is about to fill the overlay anyway — see
|
|
27
|
+
* CalendarEventOfferRenderer, where the "continue booking" card would flash in
|
|
28
|
+
* front of a booker already coming up.
|
|
29
|
+
*
|
|
30
|
+
* A set rather than one id because the waits overlap: two messages arriving
|
|
31
|
+
* within a delay of each other are both on their way, and only the overlay
|
|
32
|
+
* itself is exclusive. Held as one id, the second to be queued would take the
|
|
33
|
+
* first's slot back out of hiding, and the first to open would then release the
|
|
34
|
+
* second's.
|
|
35
|
+
*/ this.pending = signals_core_module_d(new Set()), /**
|
|
36
|
+
* Queues an incoming message for the overlay, optionally after a delay.
|
|
37
|
+
*
|
|
38
|
+
* The id is marked pending synchronously, before any of the waiting starts, so
|
|
39
|
+
* the timeline can withhold this message's own entry point for the whole of it.
|
|
40
|
+
* Getting to the overlay is asynchronous — it waits on the artifact's lazy chunk,
|
|
41
|
+
* and on this delay — and until it lands the timeline would otherwise draw a card
|
|
42
|
+
* in front of an artifact that is on its way up anyway.
|
|
43
|
+
*
|
|
44
|
+
* Awaitable, but callers reacting to an incoming message have nothing to wait
|
|
45
|
+
* for: hand it over and let it come up on its own.
|
|
46
|
+
*/ this.queueArtifactMessage = async (message, param)=>{
|
|
47
|
+
let { delayMs = 0 } = param === void 0 ? {} : param;
|
|
48
|
+
this.markPending(message.id);
|
|
49
|
+
try {
|
|
50
|
+
if (delayMs > 0) await new Promise((resolve)=>artifact_store_setTimeout(resolve, delayMs));
|
|
51
|
+
await this.presentArtifactMessage(message);
|
|
52
|
+
} finally{
|
|
53
|
+
// Safe to release the slot now: on the way through here the artifact id has
|
|
54
|
+
// been set, so the renderer is already withholding it for that reason
|
|
55
|
+
// instead. On the way out of a failure nothing is coming, and the card is
|
|
56
|
+
// the only entry point left. Either way it says nothing about any other
|
|
57
|
+
// message still on its way.
|
|
58
|
+
this.clearPending(message.id);
|
|
59
|
+
}
|
|
60
|
+
}, /**
|
|
61
|
+
* Shows a message's artifact now, loading whatever its body needs first so the
|
|
62
|
+
* overlay never flashes empty.
|
|
63
|
+
*
|
|
64
|
+
* Unlike {@link queueArtifactMessage} this leaves the timeline alone, for the
|
|
65
|
+
* visitor asking to (re)open an artifact from a card that is already on screen:
|
|
66
|
+
* hiding it mid-load would blank the spot they just clicked.
|
|
67
|
+
*/ this.presentArtifactMessage = async (message)=>{
|
|
68
|
+
switch(message.type){
|
|
69
|
+
case "present_content":
|
|
70
|
+
await this.rootStore.slidesStore.load();
|
|
71
|
+
// Mirror the on-screen slide into the voice agent's perception loop
|
|
72
|
+
// (ScreenShareStore ships it via the update_perception channel action).
|
|
73
|
+
this.loadSlidePerception();
|
|
74
|
+
this.showArtifact(message);
|
|
75
|
+
break;
|
|
76
|
+
case "present_video":
|
|
77
|
+
if (this.rootStore.callInProgress.value) {
|
|
78
|
+
await this.rootStore.presentationsStore.load();
|
|
79
|
+
if (!this.hiddenArtifactIds.has(message.id)) this.showArtifact(message);
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
case "present_deck":
|
|
83
|
+
// Like present_video, a deck only opens in the overlay during a call.
|
|
84
|
+
// Off-call the visitor gets a "join call" prompt (see PresentDeckRenderer).
|
|
85
|
+
if (this.rootStore.callInProgress.value) {
|
|
86
|
+
var _message_slides;
|
|
87
|
+
await this.rootStore.decksStore.load();
|
|
88
|
+
// Only open the overlay for a LIVE presentation. Once narration finishes
|
|
89
|
+
// the deck re-broadcasts (PyperxController#absorb_deck_narration!) with
|
|
90
|
+
// per-slide talk tracks populated — that update is for the timeline
|
|
91
|
+
// record, not a fresh present, so it must not (re)open the overlay, least
|
|
92
|
+
// of all one the visitor has already dismissed. A live present arrives
|
|
93
|
+
// with talk tracks withheld (awaiting_narration), so this distinguishes
|
|
94
|
+
// the two without needing to track dismissal separately.
|
|
95
|
+
const narrationAbsorbed = ((_message_slides = message.slides) != null ? _message_slides : []).some((slide)=>!!slide.talkTrack);
|
|
96
|
+
if (!narrationAbsorbed && !this.hiddenArtifactIds.has(message.id)) {
|
|
97
|
+
// Mirror the slide to the voice agent's perception loop
|
|
98
|
+
// (ScreenShareStore ships it via the update_perception channel action).
|
|
99
|
+
// Gated with the present so we only mirror a live, on-screen slide.
|
|
100
|
+
this.loadSlidePerception();
|
|
101
|
+
this.showArtifact(message);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
break;
|
|
105
|
+
case "calendar_event_offer":
|
|
106
|
+
// The overlay is the booker's only surface in the messenger. (The
|
|
107
|
+
// element-conversation lightbox is a separate flow; see
|
|
108
|
+
// RootStore#elementConversationOffer.)
|
|
109
|
+
await this.rootStore.meetingStore.load();
|
|
110
|
+
this.showArtifact(message);
|
|
111
|
+
break;
|
|
112
|
+
case "navigate_content":
|
|
113
|
+
// The one kind that never reaches the overlay: it drives the host page
|
|
114
|
+
// instead, so no timeline card stands in for it and nothing is withheld.
|
|
115
|
+
await this.rootStore.websiteNavigationStore.load().then((store)=>store.navigateToContent(message));
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
}, // fresh presentation this is a static single-slide view (no auto-advance) and
|
|
119
|
+
// is allowed regardless of call state — it's a review of an already-shown
|
|
120
|
+
// slide, not the agent presenting.
|
|
121
|
+
this.revisitDeckSlide = async (message, slideIndex, pageTitle)=>{
|
|
122
|
+
const store = await this.rootStore.decksStore.load();
|
|
123
|
+
// Pass the clicked slide's own title: on a consolidated resume record `message`
|
|
124
|
+
// is the last share, whose `slides` may not include this slide, so the store
|
|
125
|
+
// can't look the title up from it.
|
|
126
|
+
store.prepareRevisit(message.id, slideIndex, pageTitle);
|
|
127
|
+
this.showArtifact(message);
|
|
128
|
+
}, /**
|
|
129
|
+
* Tears down the overlay for whatever artifact is in it. Deliberately says
|
|
130
|
+
* nothing about the meeting booker: clearing the artifact message is the whole
|
|
131
|
+
* of what dismissing the booker means, since the overlay is the only surface it
|
|
132
|
+
* has. Meeting-aware teardown — which also has the element conversation to let
|
|
133
|
+
* go of — belongs to `closeMeetingBooker` and `clearMeetingArtifact`.
|
|
134
|
+
*/ this.clearArtifact = ()=>{
|
|
135
|
+
const artifactMessage = this.current.message.value;
|
|
136
|
+
const closedArtifact = this.rootStore.maximizedState.value === types_MaximizedState.ARTIFACT && ((artifactMessage == null ? void 0 : artifactMessage.type) === "present_video" || (artifactMessage == null ? void 0 : artifactMessage.type) === "present_deck") ? artifactMessage : null;
|
|
137
|
+
if (closedArtifact) {
|
|
138
|
+
this.hiddenArtifactIds.add(closedArtifact.id);
|
|
139
|
+
}
|
|
140
|
+
this.rootStore.clearMaximizedState({
|
|
141
|
+
when: types_MaximizedState.ARTIFACT
|
|
142
|
+
});
|
|
143
|
+
// Closing the presentation overlay mid-call: let the agent know so it stops
|
|
144
|
+
// narrating and acknowledges that the visitor dismissed the presentation.
|
|
145
|
+
if (closedArtifact && this.rootStore.callInProgress.value) {
|
|
146
|
+
this.channel.perform("notify_artifact_closed", {
|
|
147
|
+
artifact_type: closedArtifact.type === "present_video" ? "presentation" : "deck",
|
|
148
|
+
artifact_message_id: closedArtifact.id
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}, /** Silently hides the live deck/demo targeted by Piper's hide event. */ this.hideArtifact = (artifactMessageId)=>{
|
|
152
|
+
var _this_rootStore_decksStore_value;
|
|
153
|
+
// Record the hide before checking the current overlay. The matching artifact
|
|
154
|
+
// may still be waiting on a lazy store; when that wait resolves,
|
|
155
|
+
// presentArtifactMessage checks this set and does not open stale content.
|
|
156
|
+
this.hiddenArtifactIds.add(artifactMessageId);
|
|
157
|
+
const artifactMessage = this.current.message.value;
|
|
158
|
+
if (this.rootStore.maximizedState.value !== types_MaximizedState.ARTIFACT) return;
|
|
159
|
+
if ((artifactMessage == null ? void 0 : artifactMessage.id) !== artifactMessageId) return;
|
|
160
|
+
if (artifactMessage.type !== "present_video" && artifactMessage.type !== "present_deck") return;
|
|
161
|
+
// A visitor may reopen an old deck slide from the timeline after Piper has
|
|
162
|
+
// finished. A late/replayed completion event must not close that review.
|
|
163
|
+
if (artifactMessage.type === "present_deck" && ((_this_rootStore_decksStore_value = this.rootStore.decksStore.value) == null ? void 0 : _this_rootStore_decksStore_value.isRevisiting(artifactMessageId))) {
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
// Do not call clearArtifact: that path represents a visitor dismissal and
|
|
167
|
+
// notifies Piper when a video is closed mid-presentation.
|
|
168
|
+
this.rootStore.clearMaximizedState({
|
|
169
|
+
when: types_MaximizedState.ARTIFACT
|
|
170
|
+
});
|
|
171
|
+
}, /**
|
|
172
|
+
* Instantiate ScreenShareStore so it mirrors the on-screen slide to the agent's
|
|
173
|
+
* perception loop. Gated on `piper_perception_slides`: without the flag the server
|
|
174
|
+
* drops perception frames, so skip the store entirely rather than canvas-encoding
|
|
175
|
+
* and shipping ~100-500KB base64 frames over ActionCable for nothing.
|
|
176
|
+
*/ this.loadSlidePerception = ()=>{
|
|
177
|
+
if (!this.rootStore.featureFlags.piperPerceptionSlides) return;
|
|
178
|
+
void this.rootStore.screenShareStore.load();
|
|
179
|
+
}, this.markPending = (messageId)=>{
|
|
180
|
+
const pending = new Set(this.pending.peek());
|
|
181
|
+
pending.add(messageId);
|
|
182
|
+
this.pending.value = pending;
|
|
183
|
+
}, this.clearPending = (messageId)=>{
|
|
184
|
+
const pending = new Set(this.pending.peek());
|
|
185
|
+
if (!pending.delete(messageId)) return;
|
|
186
|
+
this.pending.value = pending;
|
|
187
|
+
}, this.showArtifact = (message)=>{
|
|
188
|
+
if (this.current.messageId.value === message.id) {
|
|
189
|
+
this.rootStore.setMaximizedState(types_MaximizedState.ARTIFACT);
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
signals_core_module_r(()=>{
|
|
193
|
+
this.rootStore.setUIState({
|
|
194
|
+
artifactMessageId: message.id
|
|
195
|
+
});
|
|
196
|
+
this.rootStore.setMaximizedState(types_MaximizedState.ARTIFACT);
|
|
197
|
+
if (this.rootStore.displayMode.minimized.value && !this.rootStore.conversationMode.video.value) {
|
|
198
|
+
this.rootStore.setOpenedDisplayMode();
|
|
199
|
+
}
|
|
200
|
+
});
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export { ArtifactStore };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
class BaseStore {
|
|
2
|
+
get experienceAdapter() {
|
|
3
|
+
return this.context.experienceAdapter;
|
|
4
|
+
}
|
|
5
|
+
get channel() {
|
|
6
|
+
return this.context.channel;
|
|
7
|
+
}
|
|
8
|
+
get visitor() {
|
|
9
|
+
return this.context.visitor;
|
|
10
|
+
}
|
|
11
|
+
constructor(contextOrInstance){
|
|
12
|
+
this.context = contextOrInstance instanceof BaseStore ? contextOrInstance.context : contextOrInstance;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { BaseStore };
|