@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,345 @@
|
|
|
1
|
+
function _extends() {
|
|
2
|
+
_extends = Object.assign || function(target) {
|
|
3
|
+
for(var i = 1; i < arguments.length; i++){
|
|
4
|
+
var source = arguments[i];
|
|
5
|
+
for(var key in source){
|
|
6
|
+
if (Object.prototype.hasOwnProperty.call(source, key)) {
|
|
7
|
+
target[key] = source[key];
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return target;
|
|
12
|
+
};
|
|
13
|
+
return _extends.apply(this, arguments);
|
|
14
|
+
}
|
|
15
|
+
// No-drop per-turn state machine for the client-side "visitor-perceived voice" metric.
|
|
16
|
+
//
|
|
17
|
+
// Division of labor: the **server** owns "was a response generated?" (authoritative, via the
|
|
18
|
+
// `coffeeStateUpdate` per-turn outcome); the **client** owns "was the generated answer *heard*,
|
|
19
|
+
// and how fast?" (the unique perception layer the server is blind to).
|
|
20
|
+
//
|
|
21
|
+
// Lifecycle: a mic-quiet opens a *candidate* t0; resumed mic-active before confirmation
|
|
22
|
+
// re-anchors t0 (discards the stale candidate); an `is_user_speaking:false` observed within
|
|
23
|
+
// toleranceMs of the candidate confirms the turn and arms the response budget.
|
|
24
|
+
//
|
|
25
|
+
// The answer anchor: like the server, the turn's answer is its **last audible response** (a tool
|
|
26
|
+
// turn answers with the continuation that follows the tool round-trip, not with its preamble).
|
|
27
|
+
// Which onset that is cannot be heard from the audio alone — the detector reports a new onset for
|
|
28
|
+
// any bot-audio gap past its hangover, and an ordinary pause between two sentences looks exactly
|
|
29
|
+
// like a tool round-trip — so re-anchoring on every onset would walk the measurement to the last
|
|
30
|
+
// *sentence* of a long answer. Instead the server publishes the response boundary
|
|
31
|
+
// (`voice_answer_seq`, see `onAnswerBoundary`): a boundary that arrives once the anchored audio run
|
|
32
|
+
// has ended discards that anchor (it was a preamble) so the answer's own onset anchors, while one
|
|
33
|
+
// that arrives mid-run keeps it (the run *is* this response, delivered ahead of its marker). Absent
|
|
34
|
+
// the signal (old coffee, dropped event) the first onset heard anchors and stands, which
|
|
35
|
+
// under-reports a spoken preamble's tool turn but never drifts.
|
|
36
|
+
//
|
|
37
|
+
// Bot onsets do **not** resolve the turn. Resolution happens on:
|
|
38
|
+
// - the server outcome (preferred terminal marker): `success` -> if an onset was already heard,
|
|
39
|
+
// emit success+latency; else the answer is still in transit, so mark the turn *generated* and
|
|
40
|
+
// wait for the audible onset (or the budget) rather than falsely emitting `not_heard`;
|
|
41
|
+
// `failed`/`incomplete` -> `no_generation`/`not_heard`; `empty`/`interrupted` -> excluded
|
|
42
|
+
// (emit nothing); `timeout` -> deferred to the client budget.
|
|
43
|
+
// - the budget expiry (fallback when no server outcome arrives — old client / coffee down /
|
|
44
|
+
// dropped event): heard within budget -> success; else `timeout` (`not_heard` if the bot was
|
|
45
|
+
// seen, else `no_generation`). Preserves the no-drop guarantee.
|
|
46
|
+
// - the visitor speaking again over a still-open turn, mirroring the server's barge-in rule
|
|
47
|
+
// (`VoiceTurnTracker.on_user_started_speaking`): audio already delivered -> resolve like a
|
|
48
|
+
// delivered answer; nothing heard -> excluded, as the server excludes `interrupted`. Without
|
|
49
|
+
// this a turn awaiting a slow answer stays open across the next exchange, and the bot's reply
|
|
50
|
+
// to the *following* question lands inside this turn's measurement.
|
|
51
|
+
// - a visibilitychange -> hidden mid-turn -> `backgrounded` (a labeled bucket, excluded from
|
|
52
|
+
// the SLI ratio, not a silent drop).
|
|
53
|
+
// Every turn resolves exactly once.
|
|
54
|
+
class PerceivedVoiceTurnTracker {
|
|
55
|
+
onMicQuiet(ts) {
|
|
56
|
+
try {
|
|
57
|
+
if (this.confirmedT0 !== null) return; // already open; ignore intra-answer quiets
|
|
58
|
+
this.candidateT0 = ts; // latest quiet wins
|
|
59
|
+
// Ordering guard: the server's is_user_speaking:false can land *before* the detector's
|
|
60
|
+
// backdated mic-quiet (it fires only after the hangover confirms silence). In that order
|
|
61
|
+
// setUserSpeaking(false) ran while candidateT0 was still null and couldn't confirm, and
|
|
62
|
+
// nothing else would retry — so a slow/no-response turn (the timeouts we care about most)
|
|
63
|
+
// would never open. If an authoritative "not speaking" was already observed, confirm now.
|
|
64
|
+
if (this.sawServerSpeaking && !this.userSpeaking) this.tryConfirm();
|
|
65
|
+
} catch (unused) {
|
|
66
|
+
/* observation-only */ }
|
|
67
|
+
}
|
|
68
|
+
onMicActive(_ts) {
|
|
69
|
+
try {
|
|
70
|
+
// Speech resumed before confirmation => the previous quiet was an intra-utterance pause,
|
|
71
|
+
// not the end of the turn. Discard the stale candidate so it doesn't leak into the next
|
|
72
|
+
// confirmed turn's latency measurement.
|
|
73
|
+
if (this.confirmedT0 === null) this.candidateT0 = null;
|
|
74
|
+
} catch (unused) {
|
|
75
|
+
/* observation-only */ }
|
|
76
|
+
}
|
|
77
|
+
setUserSpeaking(v) {
|
|
78
|
+
try {
|
|
79
|
+
this.userSpeaking = v;
|
|
80
|
+
this.sawServerSpeaking = true;
|
|
81
|
+
// Any is_user_speaking:false observation (not just a true->false edge) can confirm a
|
|
82
|
+
// pending candidate: userSpeaking defaults to false before the first server update
|
|
83
|
+
// arrives, so gating on an edge would miss a legitimate confirmation racing the very
|
|
84
|
+
// first coffeeStateUpdate broadcast.
|
|
85
|
+
if (!v) {
|
|
86
|
+
this.tryConfirm();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
// The visitor is talking over a turn that never resolved. Close it the way the server
|
|
90
|
+
// closes its own on `speech_started`: a turn that delivered audio resolves like a delivered
|
|
91
|
+
// answer (the visitor chose to cut in), and one that delivered nothing is a barge-in into
|
|
92
|
+
// silence, which the server excludes as `interrupted`.
|
|
93
|
+
if (this.confirmedT0 !== null && !this.resolved) {
|
|
94
|
+
if (this.answerOnsetTs !== null) this.resolveGenerated();
|
|
95
|
+
else this.exclude();
|
|
96
|
+
}
|
|
97
|
+
} catch (unused) {
|
|
98
|
+
/* observation-only */ }
|
|
99
|
+
}
|
|
100
|
+
setBotSpeaking(v) {
|
|
101
|
+
try {
|
|
102
|
+
if (v && this.confirmedT0 !== null) this.botSpeakingSeen = true;
|
|
103
|
+
} catch (unused) {
|
|
104
|
+
/* observation-only */ }
|
|
105
|
+
}
|
|
106
|
+
onBotOnset(ts) {
|
|
107
|
+
try {
|
|
108
|
+
this.botRunActive = true;
|
|
109
|
+
if (this.confirmedT0 === null || this.resolved) return;
|
|
110
|
+
if (ts < this.confirmedT0) return;
|
|
111
|
+
// Anchor the first onset of the current answer and leave it there. Later onsets in the same
|
|
112
|
+
// response are the gaps between its sentences, not a new answer; only a server-published
|
|
113
|
+
// response boundary re-opens the anchor (see onAnswerBoundary).
|
|
114
|
+
if (this.answerOnsetTs === null) this.answerOnsetTs = ts;
|
|
115
|
+
// If the server already confirmed generation while nothing had been heard yet, this onset
|
|
116
|
+
// is the audible answer we were waiting for -> resolve now (see onServerOutcome `success`).
|
|
117
|
+
if (this.generated && !this.resolved) this.resolveGenerated();
|
|
118
|
+
} catch (unused) {
|
|
119
|
+
/* observation-only */ }
|
|
120
|
+
}
|
|
121
|
+
// The bot's current audio run ended (the detector saw silence persist past its hangover). Only
|
|
122
|
+
// once a run has ended can a further onset fire, which is what lets `onAnswerBoundary` tell a
|
|
123
|
+
// finished preamble from a response still being delivered.
|
|
124
|
+
onBotSilence(_ts) {
|
|
125
|
+
try {
|
|
126
|
+
this.botRunActive = false;
|
|
127
|
+
} catch (unused) {
|
|
128
|
+
/* observation-only */ }
|
|
129
|
+
}
|
|
130
|
+
// A new audible response has begun server-side (`voice_answer_seq` on `coffeeStateUpdate`,
|
|
131
|
+
// published by coffee's VoiceTurnTracker on each response's first audio byte). Anything anchored
|
|
132
|
+
// from an *earlier*, already-finished response is a preamble and is discarded so the next onset
|
|
133
|
+
// anchors the answer. Best-effort: when it never arrives the first onset simply stands.
|
|
134
|
+
onAnswerBoundary(seq) {
|
|
135
|
+
try {
|
|
136
|
+
if (typeof seq !== "number") return;
|
|
137
|
+
// Same monotonic dedupe as the outcome token: the value is sticky and re-broadcast on every
|
|
138
|
+
// unrelated state update, so only a strictly greater sequence is a new boundary.
|
|
139
|
+
if (this.lastAnswerSeq !== null && seq <= this.lastAnswerSeq) return;
|
|
140
|
+
this.lastAnswerSeq = seq;
|
|
141
|
+
if (this.confirmedT0 === null || this.resolved) {
|
|
142
|
+
// The marker can beat the detector's backdated mic-quiet, so the turn it belongs to may
|
|
143
|
+
// not be confirmed yet. Hold it: tryConfirm counts it as this turn's generation evidence
|
|
144
|
+
// only if it postdates that turn's t0, so it can't vouch for a later turn.
|
|
145
|
+
this.pendingAnswerBoundaryTs = this.deps.now();
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
this.answerStartedSeen = true;
|
|
149
|
+
// Whether the anchor belongs to the response being announced or to a preamble is decided by
|
|
150
|
+
// the detector's audio run, not by how promptly the marker was delivered. While the run that
|
|
151
|
+
// produced the anchor is still playing, no further onset can fire for it (an onset needs a
|
|
152
|
+
// silence gap past the hangover first), so clearing the anchor here would strand the turn
|
|
153
|
+
// with nothing to anchor and time out an answer the visitor did hear. Keep it: that run is
|
|
154
|
+
// this response, delivered over WebRTC ahead of its marker. Once the run has ended the
|
|
155
|
+
// anchor was a preamble, and the answer's own onset is still to come.
|
|
156
|
+
if (!this.botRunActive) this.answerOnsetTs = null;
|
|
157
|
+
} catch (unused) {
|
|
158
|
+
/* observation-only */ }
|
|
159
|
+
}
|
|
160
|
+
// The server's authoritative per-turn outcome + its monotonic turn_token, forwarded from
|
|
161
|
+
// `coffeeStateUpdate`. Best-effort: when it never arrives, the budget fallback still resolves.
|
|
162
|
+
onServerOutcome(outcome, token) {
|
|
163
|
+
try {
|
|
164
|
+
if (typeof token !== "number") return;
|
|
165
|
+
// Dedupe the sticky snapshot: apply each new token once. Also drops out-of-order replays.
|
|
166
|
+
if (this.lastOutcomeToken !== null && token <= this.lastOutcomeToken) return;
|
|
167
|
+
this.lastOutcomeToken = token;
|
|
168
|
+
if (this.confirmedT0 === null || this.resolved) return; // no open turn to attribute it to
|
|
169
|
+
switch(outcome){
|
|
170
|
+
case "empty":
|
|
171
|
+
case "interrupted":
|
|
172
|
+
// No answer was expected (backchannel / silent turn) or the visitor barged in: exclude
|
|
173
|
+
// the turn entirely, mirroring the server SLI's exclusions. Emit nothing.
|
|
174
|
+
this.exclude();
|
|
175
|
+
break;
|
|
176
|
+
case "failed":
|
|
177
|
+
case "incomplete":
|
|
178
|
+
// The backend produced no clean answer -> a generation-side failure. If we heard any
|
|
179
|
+
// audio (a preamble) or the bot was seen, it's "seen but not delivered"; else nothing.
|
|
180
|
+
this.resolve("timeout", this.botAudioSeen ? "not_heard" : "no_generation");
|
|
181
|
+
break;
|
|
182
|
+
case "success":
|
|
183
|
+
// The server delivered an answer. Now our unique job: was it heard, and how fast?
|
|
184
|
+
// Do NOT resolve `not_heard` synchronously: the outcome snapshot can arrive before the
|
|
185
|
+
// final audio finishes traversing WebRTC/jitter/decode/render, so if nothing has been
|
|
186
|
+
// heard yet we'd falsely call a heard answer `not_heard`. If we already have an onset,
|
|
187
|
+
// resolve now; otherwise mark the turn generated and defer to the audible onset (in
|
|
188
|
+
// onBotOnset) or, failing that, the budget fallback.
|
|
189
|
+
if (this.answerOnsetTs !== null) this.resolveGenerated();
|
|
190
|
+
else this.generated = true;
|
|
191
|
+
break;
|
|
192
|
+
// "timeout" (and anything unrecognized) is not a clean "answer is done" marker — the
|
|
193
|
+
// answer may still be streaming — so defer to the client budget rather than resolving here.
|
|
194
|
+
default:
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
} catch (unused) {
|
|
198
|
+
/* observation-only */ }
|
|
199
|
+
}
|
|
200
|
+
onHidden() {
|
|
201
|
+
try {
|
|
202
|
+
if (this.confirmedT0 !== null && !this.resolved) this.resolve("backgrounded", "none");
|
|
203
|
+
} catch (unused) {
|
|
204
|
+
/* observation-only */ }
|
|
205
|
+
}
|
|
206
|
+
dispose() {
|
|
207
|
+
try {
|
|
208
|
+
// Don't silently drop a confirmed in-flight turn on call end / reconnect / flag-off: that
|
|
209
|
+
// would omit it from the uptime denominator and bias availability upward. Resolve it as
|
|
210
|
+
// `backgrounded` (a labeled bucket already excluded from the SLI ratio) so it's accounted
|
|
211
|
+
// for, honoring the no-drop guarantee.
|
|
212
|
+
if (this.confirmedT0 !== null && !this.resolved) this.resolve("backgrounded", "none");
|
|
213
|
+
this.clearBudget();
|
|
214
|
+
this.resolved = true;
|
|
215
|
+
this.reset();
|
|
216
|
+
} catch (unused) {
|
|
217
|
+
/* observation-only */ }
|
|
218
|
+
}
|
|
219
|
+
tryConfirm() {
|
|
220
|
+
if (this.candidateT0 === null || this.confirmedT0 !== null) return;
|
|
221
|
+
const age = this.deps.now() - this.candidateT0;
|
|
222
|
+
if (age > this.deps.toleranceMs) {
|
|
223
|
+
this.candidateT0 = null; // stale mic-quiet; not this turn
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
this.confirmedT0 = this.candidateT0;
|
|
227
|
+
this.candidateT0 = null;
|
|
228
|
+
this.resolved = false;
|
|
229
|
+
this.botSpeakingSeen = false;
|
|
230
|
+
this.generated = false;
|
|
231
|
+
// A boundary held from before confirmation is this turn's answer starting when it postdates t0
|
|
232
|
+
// (the server was already speaking while we waited on the detector's backdated mic-quiet).
|
|
233
|
+
// An older one announced a previous turn's answer and must not vouch for this turn, which would
|
|
234
|
+
// invert the `no_generation` / `not_heard` split it feeds.
|
|
235
|
+
this.answerStartedSeen = this.pendingAnswerBoundaryTs !== null && this.pendingAnswerBoundaryTs >= this.confirmedT0;
|
|
236
|
+
this.pendingAnswerBoundaryTs = null;
|
|
237
|
+
this.answerOnsetTs = null;
|
|
238
|
+
// Count the budget from t0, not from this confirmation: the mic-quiet is backdated by the
|
|
239
|
+
// detector's hangover and confirmation waits on the server's `is_user_speaking:false`, so
|
|
240
|
+
// arming it here would let a turn run up to toleranceMs past the deadline the status is
|
|
241
|
+
// judged against — and report a latency above a budget it was supposed to bound.
|
|
242
|
+
const remainingMs = Math.max(0, this.deps.budgetMs - age);
|
|
243
|
+
this.budgetTimerId = this.deps.setTimer(()=>this.onBudgetExpired(), remainingMs);
|
|
244
|
+
}
|
|
245
|
+
onBudgetExpired() {
|
|
246
|
+
try {
|
|
247
|
+
if (this.resolved || this.confirmedT0 === null) return;
|
|
248
|
+
// Fallback path: no server terminal arrived within budget. Resolve from what we perceived.
|
|
249
|
+
if (this.answerOnsetTs !== null) {
|
|
250
|
+
// We heard the answer; any onset recorded before the budget fired is within budget.
|
|
251
|
+
this.resolveGenerated();
|
|
252
|
+
} else {
|
|
253
|
+
// Nothing heard. If the server had confirmed generation (or the bot was seen), the answer
|
|
254
|
+
// was produced but never reached the visitor -> the back-gap failure; else no generation.
|
|
255
|
+
this.resolve("timeout", this.generated || this.botAudioSeen ? "not_heard" : "no_generation");
|
|
256
|
+
}
|
|
257
|
+
} catch (unused) {
|
|
258
|
+
/* observation-only */ }
|
|
259
|
+
}
|
|
260
|
+
// Resolve a turn the server (or the budget fallback) confirms had a generated answer: emit the
|
|
261
|
+
// uncensored latency to the anchored answer onset if we heard one, and label success/timeout by
|
|
262
|
+
// whether that onset landed within budget; if generation happened but nothing was heard, it's
|
|
263
|
+
// the back-gap failure (`not_heard`).
|
|
264
|
+
resolveGenerated() {
|
|
265
|
+
const t0 = this.confirmedT0;
|
|
266
|
+
if (t0 === null) return;
|
|
267
|
+
if (this.answerOnsetTs !== null) {
|
|
268
|
+
const latency = this.answerOnsetTs - t0;
|
|
269
|
+
if (latency >= 0) this.deps.emitLatency(latency);
|
|
270
|
+
const withinBudget = latency <= this.deps.budgetMs;
|
|
271
|
+
this.resolve(withinBudget ? "success" : "timeout", withinBudget ? "none" : "not_heard");
|
|
272
|
+
} else {
|
|
273
|
+
this.resolve("timeout", "not_heard");
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
resolve(status, stage) {
|
|
277
|
+
if (this.resolved) return;
|
|
278
|
+
this.resolved = true;
|
|
279
|
+
this.clearBudget();
|
|
280
|
+
this.deps.emitTurn(status, stage);
|
|
281
|
+
this.reset();
|
|
282
|
+
}
|
|
283
|
+
// Resolve without emitting (excluded from the SLI, mirroring server `empty`/`interrupted`).
|
|
284
|
+
exclude() {
|
|
285
|
+
if (this.resolved) return;
|
|
286
|
+
this.resolved = true;
|
|
287
|
+
this.clearBudget();
|
|
288
|
+
this.reset();
|
|
289
|
+
}
|
|
290
|
+
// Whether the bot produced audio this turn by any signal we have: something anchored, a
|
|
291
|
+
// response boundary from the server, or `is_bot_speaking`. Separates "generated but never
|
|
292
|
+
// delivered" (`not_heard`) from "nothing was ever produced" (`no_generation`).
|
|
293
|
+
get botAudioSeen() {
|
|
294
|
+
return this.answerOnsetTs !== null || this.answerStartedSeen || this.botSpeakingSeen;
|
|
295
|
+
}
|
|
296
|
+
// Clear per-turn state for the next turn. `lastOutcomeToken` / `lastAnswerSeq` persist across
|
|
297
|
+
// turns (both monotonic for the whole call).
|
|
298
|
+
reset() {
|
|
299
|
+
this.confirmedT0 = null;
|
|
300
|
+
this.candidateT0 = null;
|
|
301
|
+
this.answerOnsetTs = null;
|
|
302
|
+
this.pendingAnswerBoundaryTs = null;
|
|
303
|
+
this.botSpeakingSeen = false;
|
|
304
|
+
this.generated = false;
|
|
305
|
+
this.answerStartedSeen = false;
|
|
306
|
+
}
|
|
307
|
+
clearBudget() {
|
|
308
|
+
if (this.budgetTimerId !== null) {
|
|
309
|
+
this.deps.clearTimer(this.budgetTimerId);
|
|
310
|
+
this.budgetTimerId = null;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
constructor(deps){
|
|
314
|
+
this.userSpeaking = false;
|
|
315
|
+
this.sawServerSpeaking = false; // at least one is_user_speaking update has been observed
|
|
316
|
+
this.botSpeakingSeen = false; // is_bot_speaking observed since the turn was confirmed
|
|
317
|
+
this.generated = false; // server confirmed a generated answer; awaiting the audible onset
|
|
318
|
+
this.answerStartedSeen = false; // a response boundary was observed since the turn was confirmed
|
|
319
|
+
// Whether bot audio is currently running per the detector's hysteresis. A property of the audio
|
|
320
|
+
// rather than of a turn, so it deliberately survives reset() across turns.
|
|
321
|
+
this.botRunActive = false;
|
|
322
|
+
// Candidate (pre-confirmation) and confirmed (post-confirmation, budget-armed) turn state.
|
|
323
|
+
this.candidateT0 = null;
|
|
324
|
+
this.confirmedT0 = null;
|
|
325
|
+
this.answerOnsetTs = null; // first onset of the current answer, null if none
|
|
326
|
+
// A boundary observed while no turn was confirmed, held for the turn it may belong to.
|
|
327
|
+
this.pendingAnswerBoundaryTs = null;
|
|
328
|
+
this.budgetTimerId = null;
|
|
329
|
+
this.resolved = false;
|
|
330
|
+
// Highest server turn_token consumed. The outcome rides a *sticky* state snapshot that is
|
|
331
|
+
// re-broadcast on every unrelated update, so we apply each token at most once (monotonic dedupe).
|
|
332
|
+
this.lastOutcomeToken = null;
|
|
333
|
+
// Highest server answer-boundary sequence consumed. Rides the same sticky snapshot, and is
|
|
334
|
+
// monotonic for the whole call, so the same dedupe applies.
|
|
335
|
+
this.lastAnswerSeq = null;
|
|
336
|
+
this.deps = _extends({
|
|
337
|
+
toleranceMs: 1500,
|
|
338
|
+
now: ()=>performance.now(),
|
|
339
|
+
setTimer: (cb, ms)=>window.setTimeout(cb, ms),
|
|
340
|
+
clearTimer: (id)=>window.clearTimeout(id)
|
|
341
|
+
}, deps);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
export { PerceivedVoiceTurnTracker };
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple HTML sanitization utility to prevent XSS attacks.
|
|
3
|
+
* Removes dangerous tags and attributes while preserving safe HTML structure.
|
|
4
|
+
*/ // Default dangerous tags that should always be removed
|
|
5
|
+
const DEFAULT_FORBIDDEN_TAGS = new Set([
|
|
6
|
+
"script",
|
|
7
|
+
"style",
|
|
8
|
+
"iframe",
|
|
9
|
+
"object",
|
|
10
|
+
"embed",
|
|
11
|
+
"form",
|
|
12
|
+
"input",
|
|
13
|
+
"textarea",
|
|
14
|
+
"button",
|
|
15
|
+
"select",
|
|
16
|
+
"meta",
|
|
17
|
+
"link",
|
|
18
|
+
"base",
|
|
19
|
+
// SVG elements that can contain embedded scripts
|
|
20
|
+
"svg",
|
|
21
|
+
"math",
|
|
22
|
+
"foreignObject"
|
|
23
|
+
]);
|
|
24
|
+
// Default dangerous attributes that should always be removed
|
|
25
|
+
const DEFAULT_FORBIDDEN_ATTRS = new Set([
|
|
26
|
+
// Event handlers
|
|
27
|
+
"onerror",
|
|
28
|
+
"onload",
|
|
29
|
+
"onclick",
|
|
30
|
+
"onmouseover",
|
|
31
|
+
"onmouseout",
|
|
32
|
+
"onmousedown",
|
|
33
|
+
"onmouseup",
|
|
34
|
+
"onfocus",
|
|
35
|
+
"onblur",
|
|
36
|
+
"onchange",
|
|
37
|
+
"onsubmit",
|
|
38
|
+
"onkeydown",
|
|
39
|
+
"onkeyup",
|
|
40
|
+
"onkeypress",
|
|
41
|
+
"ondrag",
|
|
42
|
+
"ondrop",
|
|
43
|
+
"srcdoc",
|
|
44
|
+
"formaction",
|
|
45
|
+
"poster",
|
|
46
|
+
"dynsrc",
|
|
47
|
+
"lowsrc",
|
|
48
|
+
"xlink:href"
|
|
49
|
+
]);
|
|
50
|
+
/**
|
|
51
|
+
* Checks if a URL value starts with a dangerous protocol.
|
|
52
|
+
*/ function hasDangerousProtocol(value) {
|
|
53
|
+
const normalizedValue = value.toLowerCase().trim();
|
|
54
|
+
// Check for dangerous protocols - split to avoid linter detection
|
|
55
|
+
const jsProto = "javascript:";
|
|
56
|
+
return normalizedValue.startsWith(jsProto) || normalizedValue.startsWith("data:") || normalizedValue.startsWith("vbscript:");
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Sanitizes HTML string to prevent XSS attacks.
|
|
60
|
+
* Uses the same interface as DOMPurify in case we need to migrate to it later.
|
|
61
|
+
*
|
|
62
|
+
* @param html - The HTML string to sanitize
|
|
63
|
+
* @param config - Optional configuration for sanitization
|
|
64
|
+
* @returns DocumentFragment by default, or string if RETURN_DOM is false
|
|
65
|
+
*/ function sanitizeHtml(html, config) {
|
|
66
|
+
const { ADD_ATTR = [], FORBID_TAGS = [], FORBID_ATTR = [], AFTER_SANITIZE_ATTRIBUTES } = config != null ? config : {};
|
|
67
|
+
// Build sets for efficient lookup
|
|
68
|
+
const forbiddenTags = new Set([
|
|
69
|
+
...DEFAULT_FORBIDDEN_TAGS,
|
|
70
|
+
...FORBID_TAGS.map((t)=>t.toLowerCase())
|
|
71
|
+
]);
|
|
72
|
+
const forbiddenAttrs = new Set([
|
|
73
|
+
...DEFAULT_FORBIDDEN_ATTRS,
|
|
74
|
+
...FORBID_ATTR.map((a)=>a.toLowerCase())
|
|
75
|
+
]);
|
|
76
|
+
const allowedAttrs = new Set(ADD_ATTR.map((a)=>a.toLowerCase()));
|
|
77
|
+
// Create a temporary container to parse HTML
|
|
78
|
+
const template = document.createElement("template");
|
|
79
|
+
template.innerHTML = html;
|
|
80
|
+
const { content } = template;
|
|
81
|
+
// Process all elements
|
|
82
|
+
sanitizeNode(content, forbiddenTags, forbiddenAttrs, allowedAttrs, AFTER_SANITIZE_ATTRIBUTES);
|
|
83
|
+
// Return DOM directly by default (avoids serialization)
|
|
84
|
+
return content;
|
|
85
|
+
}
|
|
86
|
+
function sanitizeNode(node, forbiddenTags, forbiddenAttrs, allowedAttrs, afterSanitize) {
|
|
87
|
+
// Collect nodes to remove (can't modify while iterating)
|
|
88
|
+
const nodesToRemove = [];
|
|
89
|
+
// Process child nodes
|
|
90
|
+
for (const child of Array.from(node.childNodes)){
|
|
91
|
+
if (child.nodeType === Node.ELEMENT_NODE) {
|
|
92
|
+
const element = child;
|
|
93
|
+
const tagName = element.tagName.toLowerCase();
|
|
94
|
+
// Remove forbidden tags entirely
|
|
95
|
+
if (forbiddenTags.has(tagName)) {
|
|
96
|
+
nodesToRemove.push(child);
|
|
97
|
+
} else {
|
|
98
|
+
// Sanitize attributes
|
|
99
|
+
sanitizeAttributes(element, forbiddenAttrs, allowedAttrs);
|
|
100
|
+
// Apply post-sanitization callback
|
|
101
|
+
if (afterSanitize) {
|
|
102
|
+
afterSanitize(element);
|
|
103
|
+
}
|
|
104
|
+
// Recursively sanitize children
|
|
105
|
+
sanitizeNode(child, forbiddenTags, forbiddenAttrs, allowedAttrs, afterSanitize);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Remove collected nodes
|
|
110
|
+
for (const nodeToRemove of nodesToRemove){
|
|
111
|
+
node.removeChild(nodeToRemove);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function sanitizeAttributes(element, forbiddenAttrs, allowedAttrs) {
|
|
115
|
+
const attrsToRemove = [];
|
|
116
|
+
for (const attr of Array.from(element.attributes)){
|
|
117
|
+
const { name, value } = attr;
|
|
118
|
+
const attrName = name.toLowerCase();
|
|
119
|
+
const shouldRemove = forbiddenAttrs.has(attrName) && !allowedAttrs.has(attrName) || // Remove any attribute starting with "on" (event handlers)
|
|
120
|
+
attrName.startsWith("on") || // Remove dangerous URL protocols
|
|
121
|
+
(attrName === "href" || attrName === "src" || attrName === "action") && hasDangerousProtocol(value);
|
|
122
|
+
if (shouldRemove) {
|
|
123
|
+
attrsToRemove.push(name);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Remove collected attributes
|
|
127
|
+
for (const attrName of attrsToRemove){
|
|
128
|
+
element.removeAttribute(attrName);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export { sanitizeHtml };
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { signals_core_module_d, signals_core_module_w } from "../../../js/multimodal_v2.js";
|
|
2
|
+
import { getCache } from "./multimodal_cache.js";
|
|
3
|
+
import { ObjectsMap } from "./objects_map.js";
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
const ANY_KEY = "utils.signals.any";
|
|
9
|
+
function $any() {
|
|
10
|
+
for(var _len = arguments.length, signals = new Array(_len), _key = 0; _key < _len; _key++){
|
|
11
|
+
signals[_key] = arguments[_key];
|
|
12
|
+
}
|
|
13
|
+
return deriveMany(signals, ANY_KEY, (signals)=>signals.some((signal)=>signal.value));
|
|
14
|
+
}
|
|
15
|
+
const ALL_KEY = "utils.signals.all";
|
|
16
|
+
function $all() {
|
|
17
|
+
for(var _len = arguments.length, signals = new Array(_len), _key = 0; _key < _len; _key++){
|
|
18
|
+
signals[_key] = arguments[_key];
|
|
19
|
+
}
|
|
20
|
+
return deriveMany(signals, ALL_KEY, (signals)=>signals.every((signal)=>signal.value));
|
|
21
|
+
}
|
|
22
|
+
const NOT_KEY = Symbol("utils.signals.not");
|
|
23
|
+
function $not(signal) {
|
|
24
|
+
return derive(signal, NOT_KEY, (signal)=>!signal.value);
|
|
25
|
+
}
|
|
26
|
+
const EMPTY_KEY = Symbol("utils.signals.empty");
|
|
27
|
+
function $empty(signal) {
|
|
28
|
+
return derive(signal, EMPTY_KEY, (signal)=>signal.value.length === 0);
|
|
29
|
+
}
|
|
30
|
+
function $present(signal) {
|
|
31
|
+
return $not($empty(signal));
|
|
32
|
+
}
|
|
33
|
+
const EXISTS_KEY = Symbol("utils.signals.exists");
|
|
34
|
+
function $exists(signal) {
|
|
35
|
+
return derive(signal, EXISTS_KEY, (signal)=>signal.value != null);
|
|
36
|
+
}
|
|
37
|
+
function $absent(signal) {
|
|
38
|
+
return $not($exists(signal));
|
|
39
|
+
}
|
|
40
|
+
const ATTR_KEY = "utils.signals.attr";
|
|
41
|
+
function $attr(signal, key) {
|
|
42
|
+
return derive(signal, ATTR_KEY + "." + key, (signal)=>{
|
|
43
|
+
var _ref;
|
|
44
|
+
var _signal_value;
|
|
45
|
+
return (_ref = (_signal_value = signal.value) == null ? void 0 : _signal_value[key]) != null ? _ref : null;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function $fromImport(importFn) {
|
|
49
|
+
for(var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++){
|
|
50
|
+
args[_key - 1] = arguments[_key];
|
|
51
|
+
}
|
|
52
|
+
const sig = signals_core_module_d(null);
|
|
53
|
+
let loadPromise = null;
|
|
54
|
+
const load = async ()=>{
|
|
55
|
+
// Already loaded
|
|
56
|
+
if (sig.value) {
|
|
57
|
+
return sig.value;
|
|
58
|
+
}
|
|
59
|
+
// Already loading
|
|
60
|
+
if (loadPromise) {
|
|
61
|
+
return loadPromise;
|
|
62
|
+
}
|
|
63
|
+
// Start loading
|
|
64
|
+
loadPromise = importFn().then((module)=>{
|
|
65
|
+
// Use default export
|
|
66
|
+
const Class = module.default;
|
|
67
|
+
sig.value = new Class(...args);
|
|
68
|
+
return sig.value;
|
|
69
|
+
});
|
|
70
|
+
return loadPromise;
|
|
71
|
+
};
|
|
72
|
+
return Object.assign(sig, {
|
|
73
|
+
load
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function isSignalike(value) {
|
|
77
|
+
return typeof value === "object" && value !== null && "value" in value && "subscribe" in value && "peek" in value;
|
|
78
|
+
}
|
|
79
|
+
function derive(signal, key, fn) {
|
|
80
|
+
if (key in signal) return signal[key];
|
|
81
|
+
const derived = signals_core_module_w(()=>fn(signal));
|
|
82
|
+
Object.assign(signal, {
|
|
83
|
+
[key]: derived
|
|
84
|
+
});
|
|
85
|
+
return derived;
|
|
86
|
+
}
|
|
87
|
+
function deriveMany(signals, key, fn) {
|
|
88
|
+
const map = getCache(key, ()=>new ObjectsMap());
|
|
89
|
+
return map.getOrSet(signals, (signals)=>signals_core_module_w(()=>fn(signals)));
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
var signals_$absent = /* unused export */ undefined;
|
|
93
|
+
var signals_$all = /* unused export */ undefined;
|
|
94
|
+
var signals_$attr = /* unused export */ undefined;
|
|
95
|
+
var signals_$empty = /* unused export */ undefined;
|
|
96
|
+
var signals_$present = /* unused export */ undefined;
|
|
97
|
+
export { $any, $exists, $fromImport, $not, isSignalike, signals_$absent as $absent, signals_$all as $all, signals_$attr as $attr, signals_$empty as $empty, signals_$present as $present };
|