@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.
Files changed (560) hide show
  1. package/41842993ec71d6628e4949e9a22b146b.svg +3 -0
  2. package/7271f3433ed82fc7f56adcd9e30275f4.svg +17 -0
  3. package/LICENSE.txt +82 -0
  4. package/components/helpers/entriesStringValidations.js +69 -0
  5. package/components/helpers/languages.js +32 -0
  6. package/components/shared/assertUnreachable.js +5 -0
  7. package/components/shared/controls/imageCropperHelpers.js +43 -0
  8. package/components/shared/meetingLoadingProgressSpec.js +116 -0
  9. package/constants.generated.js +9883 -0
  10. package/css/widget/multimodal_v2/host.split-css.css +162 -0
  11. package/css/widget/multimodal_v2/index.split-css.panda.css +5240 -0
  12. package/css/widget/widget.split-css.css +100 -0
  13. package/fonts/inter/Inter-Black.woff +0 -0
  14. package/fonts/inter/Inter-Black.woff2 +0 -0
  15. package/fonts/inter/Inter-BlackItalic.woff +0 -0
  16. package/fonts/inter/Inter-BlackItalic.woff2 +0 -0
  17. package/fonts/inter/Inter-Bold.woff +0 -0
  18. package/fonts/inter/Inter-Bold.woff2 +0 -0
  19. package/fonts/inter/Inter-BoldItalic.woff +0 -0
  20. package/fonts/inter/Inter-BoldItalic.woff2 +0 -0
  21. package/fonts/inter/Inter-ExtraBold.woff +0 -0
  22. package/fonts/inter/Inter-ExtraBold.woff2 +0 -0
  23. package/fonts/inter/Inter-ExtraBoldItalic.woff +0 -0
  24. package/fonts/inter/Inter-ExtraBoldItalic.woff2 +0 -0
  25. package/fonts/inter/Inter-ExtraLight.woff +0 -0
  26. package/fonts/inter/Inter-ExtraLight.woff2 +0 -0
  27. package/fonts/inter/Inter-ExtraLightItalic.woff +0 -0
  28. package/fonts/inter/Inter-ExtraLightItalic.woff2 +0 -0
  29. package/fonts/inter/Inter-Italic.woff +0 -0
  30. package/fonts/inter/Inter-Italic.woff2 +0 -0
  31. package/fonts/inter/Inter-Light.woff +0 -0
  32. package/fonts/inter/Inter-Light.woff2 +0 -0
  33. package/fonts/inter/Inter-LightItalic.woff +0 -0
  34. package/fonts/inter/Inter-LightItalic.woff2 +0 -0
  35. package/fonts/inter/Inter-Medium.woff +0 -0
  36. package/fonts/inter/Inter-Medium.woff2 +0 -0
  37. package/fonts/inter/Inter-MediumItalic.woff +0 -0
  38. package/fonts/inter/Inter-MediumItalic.woff2 +0 -0
  39. package/fonts/inter/Inter-Regular.woff +0 -0
  40. package/fonts/inter/Inter-Regular.woff2 +0 -0
  41. package/fonts/inter/Inter-SemiBold.woff +0 -0
  42. package/fonts/inter/Inter-SemiBold.woff2 +0 -0
  43. package/fonts/inter/Inter-SemiBoldItalic.woff +0 -0
  44. package/fonts/inter/Inter-SemiBoldItalic.woff2 +0 -0
  45. package/fonts/inter/Inter-Thin.woff +0 -0
  46. package/fonts/inter/Inter-Thin.woff2 +0 -0
  47. package/fonts/inter/Inter-ThinItalic.woff +0 -0
  48. package/fonts/inter/Inter-ThinItalic.woff2 +0 -0
  49. package/fonts/inter/Inter-italic.var.woff2 +0 -0
  50. package/fonts/inter/Inter-roman.var.woff2 +0 -0
  51. package/images/close.js +63 -0
  52. package/images/logo.js +22 -0
  53. package/js/4101.js +19721 -0
  54. package/js/daily-esm.js +9948 -0
  55. package/js/date-fns.js +427 -0
  56. package/js/multimodal_v2.js +1653 -0
  57. package/js/runtime.js +109 -0
  58. package/media/Inter-Black.796be8d8bf.woff2 +0 -0
  59. package/media/Inter-Black.b254104c56.woff +0 -0
  60. package/media/Inter-BlackItalic.70306b0eae.woff +0 -0
  61. package/media/Inter-BlackItalic.752f1e0aaa.woff2 +0 -0
  62. package/media/Inter-Bold.579e0f95ca.woff2 +0 -0
  63. package/media/Inter-Bold.b1234477a5.woff +0 -0
  64. package/media/Inter-BoldItalic.3d0d804323.woff +0 -0
  65. package/media/Inter-BoldItalic.828a494e04.woff2 +0 -0
  66. package/media/Inter-ExtraBold.208a9e6c99.woff +0 -0
  67. package/media/Inter-ExtraBold.d65f028165.woff2 +0 -0
  68. package/media/Inter-ExtraBoldItalic.30429962ec.woff +0 -0
  69. package/media/Inter-ExtraBoldItalic.8c7eac5ce3.woff2 +0 -0
  70. package/media/Inter-ExtraLight.15c082a57d.woff +0 -0
  71. package/media/Inter-ExtraLight.6824177d1e.woff2 +0 -0
  72. package/media/Inter-ExtraLightItalic.05138dddf3.woff2 +0 -0
  73. package/media/Inter-ExtraLightItalic.3beee54f59.woff +0 -0
  74. package/media/Inter-Italic.9beab78452.woff +0 -0
  75. package/media/Inter-Italic.d593a8df79.woff2 +0 -0
  76. package/media/Inter-Light.27083fa637.woff2 +0 -0
  77. package/media/Inter-Light.91dfddd842.woff +0 -0
  78. package/media/Inter-LightItalic.0a783b89b3.woff2 +0 -0
  79. package/media/Inter-LightItalic.f8ccf2813f.woff +0 -0
  80. package/media/Inter-Medium.dc792b508e.woff2 +0 -0
  81. package/media/Inter-Medium.ec7dd2d9d8.woff +0 -0
  82. package/media/Inter-MediumItalic.17301e5b40.woff +0 -0
  83. package/media/Inter-MediumItalic.84d3493a9f.woff2 +0 -0
  84. package/media/Inter-Regular.f1f0c35b32.woff2 +0 -0
  85. package/media/Inter-Regular.f356e84aa0.woff +0 -0
  86. package/media/Inter-SemiBold.55027e4724.woff +0 -0
  87. package/media/Inter-SemiBold.fcb100c760.woff2 +0 -0
  88. package/media/Inter-SemiBoldItalic.ab9105ed3b.woff +0 -0
  89. package/media/Inter-SemiBoldItalic.d90f295d0c.woff2 +0 -0
  90. package/media/Inter-Thin.16325d9b0f.woff +0 -0
  91. package/media/Inter-Thin.dafaa44d99.woff2 +0 -0
  92. package/media/Inter-ThinItalic.4fc662b3cf.woff2 +0 -0
  93. package/media/Inter-ThinItalic.d3d8994788.woff +0 -0
  94. package/media/Inter-italic.var.958a0b9742.woff2 +0 -0
  95. package/media/Inter-roman.var.b2129c009c.woff2 +0 -0
  96. package/package.json +20 -0
  97. package/packs/widget/api/docking/docking_host.js +97 -0
  98. package/packs/widget/api/docking/index.js +294 -0
  99. package/packs/widget/api/docking/shared.js +164 -0
  100. package/packs/widget/api/docking/viewport_lock.js +488 -0
  101. package/packs/widget/api/docking/viewport_resize.js +1203 -0
  102. package/packs/widget/esm/fonts/Inter-Black.796be8d8bf.woff2 +0 -0
  103. package/packs/widget/esm/fonts/Inter-Black.b254104c56.woff +0 -0
  104. package/packs/widget/esm/fonts/Inter-BlackItalic.70306b0eae.woff +0 -0
  105. package/packs/widget/esm/fonts/Inter-BlackItalic.752f1e0aaa.woff2 +0 -0
  106. package/packs/widget/esm/fonts/Inter-Bold.579e0f95ca.woff2 +0 -0
  107. package/packs/widget/esm/fonts/Inter-Bold.b1234477a5.woff +0 -0
  108. package/packs/widget/esm/fonts/Inter-BoldItalic.3d0d804323.woff +0 -0
  109. package/packs/widget/esm/fonts/Inter-BoldItalic.828a494e04.woff2 +0 -0
  110. package/packs/widget/esm/fonts/Inter-ExtraBold.208a9e6c99.woff +0 -0
  111. package/packs/widget/esm/fonts/Inter-ExtraBold.d65f028165.woff2 +0 -0
  112. package/packs/widget/esm/fonts/Inter-ExtraBoldItalic.30429962ec.woff +0 -0
  113. package/packs/widget/esm/fonts/Inter-ExtraBoldItalic.8c7eac5ce3.woff2 +0 -0
  114. package/packs/widget/esm/fonts/Inter-ExtraLight.15c082a57d.woff +0 -0
  115. package/packs/widget/esm/fonts/Inter-ExtraLight.6824177d1e.woff2 +0 -0
  116. package/packs/widget/esm/fonts/Inter-ExtraLightItalic.05138dddf3.woff2 +0 -0
  117. package/packs/widget/esm/fonts/Inter-ExtraLightItalic.3beee54f59.woff +0 -0
  118. package/packs/widget/esm/fonts/Inter-Italic.9beab78452.woff +0 -0
  119. package/packs/widget/esm/fonts/Inter-Italic.d593a8df79.woff2 +0 -0
  120. package/packs/widget/esm/fonts/Inter-Light.27083fa637.woff2 +0 -0
  121. package/packs/widget/esm/fonts/Inter-Light.91dfddd842.woff +0 -0
  122. package/packs/widget/esm/fonts/Inter-LightItalic.0a783b89b3.woff2 +0 -0
  123. package/packs/widget/esm/fonts/Inter-LightItalic.f8ccf2813f.woff +0 -0
  124. package/packs/widget/esm/fonts/Inter-Medium.dc792b508e.woff2 +0 -0
  125. package/packs/widget/esm/fonts/Inter-Medium.ec7dd2d9d8.woff +0 -0
  126. package/packs/widget/esm/fonts/Inter-MediumItalic.17301e5b40.woff +0 -0
  127. package/packs/widget/esm/fonts/Inter-MediumItalic.84d3493a9f.woff2 +0 -0
  128. package/packs/widget/esm/fonts/Inter-Regular.f1f0c35b32.woff2 +0 -0
  129. package/packs/widget/esm/fonts/Inter-Regular.f356e84aa0.woff +0 -0
  130. package/packs/widget/esm/fonts/Inter-SemiBold.55027e4724.woff +0 -0
  131. package/packs/widget/esm/fonts/Inter-SemiBold.fcb100c760.woff2 +0 -0
  132. package/packs/widget/esm/fonts/Inter-SemiBoldItalic.ab9105ed3b.woff +0 -0
  133. package/packs/widget/esm/fonts/Inter-SemiBoldItalic.d90f295d0c.woff2 +0 -0
  134. package/packs/widget/esm/fonts/Inter-Thin.16325d9b0f.woff +0 -0
  135. package/packs/widget/esm/fonts/Inter-Thin.dafaa44d99.woff2 +0 -0
  136. package/packs/widget/esm/fonts/Inter-ThinItalic.4fc662b3cf.woff2 +0 -0
  137. package/packs/widget/esm/fonts/Inter-ThinItalic.d3d8994788.woff +0 -0
  138. package/packs/widget/esm/fonts/Inter-italic.var.958a0b9742.woff2 +0 -0
  139. package/packs/widget/esm/fonts/Inter-roman.var.b2129c009c.woff2 +0 -0
  140. package/packs/widget/esm/index.js +183 -0
  141. package/packs/widget/esm/qualified.css +5502 -0
  142. package/routes/app/offers/scripts/OfferMainScript.js +154 -0
  143. package/routes/app/offers/scripts/constants.js +71 -0
  144. package/routes/app/offers/scripts/main/ButtonManager.js +65 -0
  145. package/routes/app/offers/scripts/main/FormManager.js +325 -0
  146. package/routes/app/offers/scripts/main/MainContext.js +19 -0
  147. package/routes/app/offers/scripts/main/OfferManager.js +91 -0
  148. package/routes/app/offers/scripts/main/TriggerManager.js +125 -0
  149. package/routes/app/offers/scripts/rendering/ContentManager.js +53 -0
  150. package/routes/app/offers/scripts/rendering/LocationManager.js +83 -0
  151. package/routes/app/offers/scripts/rendering/RenderedOffer.js +188 -0
  152. package/routes/app/offers/scripts/rendering/Renderer.js +69 -0
  153. package/routes/app/offers/scripts/rendering/RenderingInitializer.js +62 -0
  154. package/routes/app/offers/scripts/rendering/animations/AnimationManager.js +31 -0
  155. package/routes/app/offers/scripts/rendering/animations/AnimationManagerFooter.js +81 -0
  156. package/routes/app/offers/scripts/rendering/animations/AnimationManagerHeader.js +81 -0
  157. package/routes/app/offers/scripts/rendering/animations/AnimationManagerModal.js +117 -0
  158. package/routes/app/offers/scripts/rendering/animations/AnimationManagerSidebar.js +75 -0
  159. package/routes/app/offers/scripts/rendering/animations/AnimationResult.js +43 -0
  160. package/routes/app/offers/scripts/rendering/animations/Animator.js +78 -0
  161. package/routes/app/offers/scripts/rendering/animations/BaseAnimationManager.js +25 -0
  162. package/routes/app/offers/scripts/rendering/lib/BaseComponent.js +106 -0
  163. package/routes/app/offers/scripts/rendering/lib/FormComponent.js +134 -0
  164. package/routes/app/offers/scripts/rendering/lib/OfferComponent.js +144 -0
  165. package/routes/app/offers/scripts/rendering/lib/ScrollbarWidth.js +27 -0
  166. package/routes/app/offers/scripts/rendering/lib/decorators.js +20 -0
  167. package/routes/app/offers/scripts/rendering/locations/CSSVarsManager.js +66 -0
  168. package/routes/app/offers/scripts/rendering/locations/ElementResizeObserver.js +49 -0
  169. package/routes/app/offers/scripts/rendering/locations/footer.js +53 -0
  170. package/routes/app/offers/scripts/rendering/locations/header/AsyncBatchProcessor.js +70 -0
  171. package/routes/app/offers/scripts/rendering/locations/header/CSSTransitionObserver.js +182 -0
  172. package/routes/app/offers/scripts/rendering/locations/header/ElementStyleChangeObserver.js +138 -0
  173. package/routes/app/offers/scripts/rendering/locations/header/ExternalStyleManager.js +110 -0
  174. package/routes/app/offers/scripts/rendering/locations/header/Header.js +353 -0
  175. package/routes/app/offers/scripts/rendering/locations/header/InlineStyleManager.js +105 -0
  176. package/routes/app/offers/scripts/rendering/locations/header/MatchingElementsObserver.js +107 -0
  177. package/routes/app/offers/scripts/rendering/locations/header/NewElementsObserver.js +129 -0
  178. package/routes/app/offers/scripts/rendering/locations/header/RuleWrapper.js +46 -0
  179. package/routes/app/offers/scripts/rendering/locations/header/SelectorObservable.js +23 -0
  180. package/routes/app/offers/scripts/rendering/locations/header/SelectorObserver.js +61 -0
  181. package/routes/app/offers/scripts/rendering/locations/header/ShiftedElementsManager.js +45 -0
  182. package/routes/app/offers/scripts/rendering/locations/header/StyleElementManager.js +37 -0
  183. package/routes/app/offers/scripts/rendering/locations/header/StyleElementWrapper.js +62 -0
  184. package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/ObservedSelectorValue.js +45 -0
  185. package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/ObservedSelectors.js +62 -0
  186. package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/StyleSelectorObserver.js +294 -0
  187. package/routes/app/offers/scripts/rendering/locations/header/StyleSelectorObserver/constants.js +21 -0
  188. package/routes/app/offers/scripts/rendering/locations/header/WindowResizeObserver.js +43 -0
  189. package/routes/app/offers/scripts/rendering/locations/header/utils.js +25 -0
  190. package/routes/app/offers/scripts/rendering/locations/popup.js +66 -0
  191. package/routes/app/offers/scripts/rendering/locations/sidebar.js +21 -0
  192. package/routes/app/offers/scripts/rendering/variations/ButtonBanner.js +105 -0
  193. package/routes/app/offers/scripts/rendering/variations/ButtonModal.js +114 -0
  194. package/routes/app/offers/scripts/rendering/variations/FormBanner.js +214 -0
  195. package/routes/app/offers/scripts/rendering/variations/FormModal.js +325 -0
  196. package/routes/app/offers/scripts/rendering/variations/LinkBanner.js +105 -0
  197. package/routes/app/offers/scripts/rendering/variations/components/Body.js +29 -0
  198. package/routes/app/offers/scripts/rendering/variations/components/Button.js +128 -0
  199. package/routes/app/offers/scripts/rendering/variations/components/DismissButton.js +39 -0
  200. package/routes/app/offers/scripts/rendering/variations/components/ForegroundImageBanner.js +110 -0
  201. package/routes/app/offers/scripts/rendering/variations/components/ForegroundImageModal.js +128 -0
  202. package/routes/app/offers/scripts/rendering/variations/components/Headline.js +94 -0
  203. package/routes/app/offers/scripts/rendering/variations/components/MultiFieldForm.js +302 -0
  204. package/routes/app/offers/scripts/rendering/variations/components/Tooltip.js +74 -0
  205. package/routes/app/offers/scripts/rendering/variations/icons.js +15 -0
  206. package/routes/app/offers/scripts/utils.js +115 -0
  207. package/routes/app/offers/utils/HTMLUtils.js +10 -0
  208. package/routes/app/offers/utils/createTypeGuard.js +32 -0
  209. package/routes/app/offers/utils/promise-utils.js +22 -0
  210. package/routes/app/websiteBuilder/stores/storeHelpers.js +18 -0
  211. package/sounds/message-initial.mp3 +0 -0
  212. package/sounds/message-received.mp3 +0 -0
  213. package/sounds/message-sent.mp3 +0 -0
  214. package/src/arrays.js +15 -0
  215. package/src/audio.js +106 -0
  216. package/src/bounded-set.js +16 -0
  217. package/src/bounding_box_observer.js +129 -0
  218. package/src/decorators.js +29 -0
  219. package/src/dom.js +128 -0
  220. package/src/dom_roots.js +26 -0
  221. package/src/embedded_forms/EmbeddedForm.js +638 -0
  222. package/src/embedded_forms/QualifiedEmbeddedForm.js +51 -0
  223. package/src/embedded_forms/QualifiedFormField.js +137 -0
  224. package/src/embedded_forms/utils.js +17 -0
  225. package/src/graphql-types.js +1686 -0
  226. package/src/iframes.js +86 -0
  227. package/src/localstorage.js +43 -0
  228. package/src/mirror/Shipper.js +133 -0
  229. package/src/mirror/constants.generated.js +13 -0
  230. package/src/mirror/constants.js +238 -0
  231. package/src/mirror/shipper/ChangeQueue.js +155 -0
  232. package/src/mirror/shipper/DOMSerializer.js +392 -0
  233. package/src/mirror/shipper/observers.js +441 -0
  234. package/src/mirror/shipper/utils.js +98 -0
  235. package/src/mixins/disposable.js +125 -0
  236. package/src/mixins/injectable.js +37 -0
  237. package/src/personalizations/personalization-manager.js +110 -0
  238. package/src/personalizations/strategies/node-freezing-strategy.js +174 -0
  239. package/src/personalizations/utils.js +187 -0
  240. package/src/promises.js +107 -0
  241. package/src/proxy.js +144 -0
  242. package/src/qualified_root.js +35 -0
  243. package/src/query_params.js +55 -0
  244. package/src/shadow-dom-helper.js +63 -0
  245. package/src/singleton_host.js +39 -0
  246. package/src/smart_website/trigger.js +49 -0
  247. package/src/smart_website/utils.js +149 -0
  248. package/src/string.js +53 -0
  249. package/src/timezone.js +57 -0
  250. package/src/timing.js +49 -0
  251. package/src/type-utils.js +76 -0
  252. package/src/url-utils.js +102 -0
  253. package/src/url.js +50 -0
  254. package/src/utils.js +72 -0
  255. package/src/validation.js.js +29 -0
  256. package/src/validation_ts.js +6 -0
  257. package/vendor/actioncable/adapters.js +6 -0
  258. package/vendor/actioncable/connection.js +204 -0
  259. package/vendor/actioncable/connection_monitor.js +129 -0
  260. package/vendor/actioncable/consumer.js +91 -0
  261. package/vendor/actioncable/index.js +34 -0
  262. package/vendor/actioncable/internal.js +22 -0
  263. package/vendor/actioncable/logger.js +28 -0
  264. package/vendor/actioncable/subscription.js +93 -0
  265. package/vendor/actioncable/subscriptions.js +89 -0
  266. package/vendor/open-telemetry-idgenerator.js +43 -0
  267. package/widget/analytics/facebook_tracker.js +8 -0
  268. package/widget/analytics/google_analytics_tracker.js +83 -0
  269. package/widget/analytics/google_tag_manager_tracker.js +22 -0
  270. package/widget/analytics.js +58 -0
  271. package/widget/api_handler/api_handler.js +730 -0
  272. package/widget/api_handler/base_api_handler.js +249 -0
  273. package/widget/booker_intent_tracker.js +391 -0
  274. package/widget/booker_outcome_tracker.js +329 -0
  275. package/widget/capture_widget_exceptions.js +150 -0
  276. package/widget/channel.js +282 -0
  277. package/widget/composite_experience_adapter.js +101 -0
  278. package/widget/constants.generated.js +350 -0
  279. package/widget/constants.js +21 -0
  280. package/widget/container.js +193 -0
  281. package/widget/content_activity_emitter.js +36 -0
  282. package/widget/data360_visitor.js +67 -0
  283. package/widget/date_provider.js +11 -0
  284. package/widget/debug_mode_state.js +175 -0
  285. package/widget/dummy_module.js +9 -0
  286. package/widget/eloqua_visitor.js +17 -0
  287. package/widget/form_cta_booker_intent.js +246 -0
  288. package/widget/hubspot_visitor.js +39 -0
  289. package/widget/inline_meeting_booker_page.js +90 -0
  290. package/widget/local_state/abstract_local_state.js +38 -0
  291. package/widget/local_state/debug_state/abstract_debug_flow.js +29 -0
  292. package/widget/local_state/debug_state/custom_form_flow.js +14 -0
  293. package/widget/local_state/debug_state/hubspot_form_flow.js +19 -0
  294. package/widget/local_state/debug_state/hubspot_v4_form_flow.js +19 -0
  295. package/widget/local_state/debug_state/marketo_form_flow.js +20 -0
  296. package/widget/local_state/debug_state/pardot_form_flow.js +18 -0
  297. package/widget/local_state/debug_state.js +362 -0
  298. package/widget/local_state/trace_state.js +20 -0
  299. package/widget/location_provider.js +9 -0
  300. package/widget/marketo_visitor.js +39 -0
  301. package/widget/meetings/tracing/buttons_forms_triggering_tracer.js +124 -0
  302. package/widget/meetings/tracing/spans/button_spans.js +18 -0
  303. package/widget/meetings/tracing/spans/form_spans.js +11 -0
  304. package/widget/multimodal_v2/assets_preloader.js +97 -0
  305. package/widget/multimodal_v2/components/AppLayout.js +93 -0
  306. package/widget/multimodal_v2/components/CursorOverlay.js +93 -0
  307. package/widget/multimodal_v2/components/PointerRectOverlay.js +74 -0
  308. package/widget/multimodal_v2/components/app/Artifact.js +109 -0
  309. package/widget/multimodal_v2/components/app/Background.js +27 -0
  310. package/widget/multimodal_v2/components/app/CalendarLoadingContent.js +255 -0
  311. package/widget/multimodal_v2/components/app/Chat.js +39 -0
  312. package/widget/multimodal_v2/components/app/CookieConsentModal.js +149 -0
  313. package/widget/multimodal_v2/components/app/Foreground.js +48 -0
  314. package/widget/multimodal_v2/components/app/HiddenInput.js +41 -0
  315. package/widget/multimodal_v2/components/app/Input.js +72 -0
  316. package/widget/multimodal_v2/components/app/LightboxExperience.js +769 -0
  317. package/widget/multimodal_v2/components/app/LoadingOverlay.js +97 -0
  318. package/widget/multimodal_v2/components/app/Main.js +985 -0
  319. package/widget/multimodal_v2/components/app/MessengerButton.js +160 -0
  320. package/widget/multimodal_v2/components/app/Multimodal.js +17 -0
  321. package/widget/multimodal_v2/components/app/OverlayControls.js +79 -0
  322. package/widget/multimodal_v2/components/app/Preview.js +32 -0
  323. package/widget/multimodal_v2/components/app/PrivacyDisclosure.js +57 -0
  324. package/widget/multimodal_v2/components/app/RotateDeviceOverlay.js +70 -0
  325. package/widget/multimodal_v2/components/app/Toolbar.js +156 -0
  326. package/widget/multimodal_v2/components/chat/ChatComposer.js +129 -0
  327. package/widget/multimodal_v2/components/chat/ChatInputForm.js +398 -0
  328. package/widget/multimodal_v2/components/chat/ColdStartQuestions.js +354 -0
  329. package/widget/multimodal_v2/components/chat/ComposerErrorBanner.js +62 -0
  330. package/widget/multimodal_v2/components/chat/PostCallSurvey.js +359 -0
  331. package/widget/multimodal_v2/components/chat/preview/FieldRequestRenderer.js +41 -0
  332. package/widget/multimodal_v2/components/chat/preview/PreviewMessageRenderer.js +60 -0
  333. package/widget/multimodal_v2/components/chat/preview/SharedOfferRenderer.js +143 -0
  334. package/widget/multimodal_v2/components/chat/preview/TextRenderer.js +27 -0
  335. package/widget/multimodal_v2/components/chat/preview/TimelinePreview.js +254 -0
  336. package/widget/multimodal_v2/components/chat/timeline/CalendarEventOfferRenderer.js +103 -0
  337. package/widget/multimodal_v2/components/chat/timeline/CalendarEventPickRenderer.js +148 -0
  338. package/widget/multimodal_v2/components/chat/timeline/FieldEntryRenderer.js +84 -0
  339. package/widget/multimodal_v2/components/chat/timeline/FieldRequestRenderer.js +56 -0
  340. package/widget/multimodal_v2/components/chat/timeline/InlinePrivacyDisclosure.js +66 -0
  341. package/widget/multimodal_v2/components/chat/timeline/LinkPreviewCard.js +70 -0
  342. package/widget/multimodal_v2/components/chat/timeline/MessageEntry.js +88 -0
  343. package/widget/multimodal_v2/components/chat/timeline/PresentContentRenderer.js +30 -0
  344. package/widget/multimodal_v2/components/chat/timeline/PresentDeckRenderer.js +279 -0
  345. package/widget/multimodal_v2/components/chat/timeline/PresentVideoRenderer.js +131 -0
  346. package/widget/multimodal_v2/components/chat/timeline/ShareContentRenderer.js +59 -0
  347. package/widget/multimodal_v2/components/chat/timeline/SharedOfferRenderer.js +131 -0
  348. package/widget/multimodal_v2/components/chat/timeline/SystemRenderer.js +82 -0
  349. package/widget/multimodal_v2/components/chat/timeline/TextRenderer.js +66 -0
  350. package/widget/multimodal_v2/components/chat/timeline/Timeline.js +158 -0
  351. package/widget/multimodal_v2/components/debug/DebugMultimodalPanel.js +327 -0
  352. package/widget/multimodal_v2/components/decks/index.js +160 -0
  353. package/widget/multimodal_v2/components/field_request/BooleanField.js +77 -0
  354. package/widget/multimodal_v2/components/field_request/FieldComponents.js +69 -0
  355. package/widget/multimodal_v2/components/field_request/Form.js +87 -0
  356. package/widget/multimodal_v2/components/field_request/MultiPicklistField.js +240 -0
  357. package/widget/multimodal_v2/components/field_request/PicklistField.js +166 -0
  358. package/widget/multimodal_v2/components/field_request/SingleLineInputField.js +69 -0
  359. package/widget/multimodal_v2/components/field_request/TextField.js +37 -0
  360. package/widget/multimodal_v2/components/field_request/index.js +170 -0
  361. package/widget/multimodal_v2/components/helpers/AutoScroll.js +37 -0
  362. package/widget/multimodal_v2/components/helpers/ErrorBoundary.js +53 -0
  363. package/widget/multimodal_v2/components/helpers/FocusTrapDialog.js +26 -0
  364. package/widget/multimodal_v2/components/helpers/ImpressionTracker.js +94 -0
  365. package/widget/multimodal_v2/components/helpers/ListRenderer.js +37 -0
  366. package/widget/multimodal_v2/components/helpers/Localization.js +76 -0
  367. package/widget/multimodal_v2/components/helpers/Persisted.js +166 -0
  368. package/widget/multimodal_v2/components/helpers/RichText.js +358 -0
  369. package/widget/multimodal_v2/components/helpers/ScreenReaderHeading.js +17 -0
  370. package/widget/multimodal_v2/components/helpers/Thumbnail.js +190 -0
  371. package/widget/multimodal_v2/components/helpers/VisuallyHidden.js +41 -0
  372. package/widget/multimodal_v2/components/helpers/content_click_payloads.js +58 -0
  373. package/widget/multimodal_v2/components/helpers/useDraggable.js +103 -0
  374. package/widget/multimodal_v2/components/helpers/useTextOverflow.js +44 -0
  375. package/widget/multimodal_v2/components/lightbox_gather/index.js +741 -0
  376. package/widget/multimodal_v2/components/meetings/ArtifactEntryPoint.js +252 -0
  377. package/widget/multimodal_v2/components/meetings/MeetingAdditionalAttendees.js +325 -0
  378. package/widget/multimodal_v2/components/meetings/MeetingBookerEntry.js +100 -0
  379. package/widget/multimodal_v2/components/meetings/MeetingDetailsCard.js +99 -0
  380. package/widget/multimodal_v2/components/meetings/MeetingErrorBanner.js +62 -0
  381. package/widget/multimodal_v2/components/meetings/MeetingOfferEmailStep.js +239 -0
  382. package/widget/multimodal_v2/components/meetings/MeetingOfferFooter.js +104 -0
  383. package/widget/multimodal_v2/components/meetings/MeetingOfferSelectionStep.js +60 -0
  384. package/widget/multimodal_v2/components/meetings/MeetingRepHeader.js +222 -0
  385. package/widget/multimodal_v2/components/meetings/MeetingStepShell.js +92 -0
  386. package/widget/multimodal_v2/components/meetings/MeetingSummaryRail.js +515 -0
  387. package/widget/multimodal_v2/components/meetings/MeetingTimeSelector.js +603 -0
  388. package/widget/multimodal_v2/components/meetings/MonthDatePicker.js +422 -0
  389. package/widget/multimodal_v2/components/meetings/NavigationButtons.js +76 -0
  390. package/widget/multimodal_v2/components/meetings/TimeSlotHeader.js +357 -0
  391. package/widget/multimodal_v2/components/meetings/WeekViewHeader.js +20 -0
  392. package/widget/multimodal_v2/components/meetings/constants.js +7 -0
  393. package/widget/multimodal_v2/components/meetings/index.js +47 -0
  394. package/widget/multimodal_v2/components/meetings/utils.js +328 -0
  395. package/widget/multimodal_v2/components/multimodal/Audio.js +28 -0
  396. package/widget/multimodal_v2/components/multimodal/Controls.js +188 -0
  397. package/widget/multimodal_v2/components/multimodal/LiveVideo.js +63 -0
  398. package/widget/multimodal_v2/components/multimodal/MultiModalComponent.js +424 -0
  399. package/widget/multimodal_v2/components/multimodal/MultimodalAvatar.js +36 -0
  400. package/widget/multimodal_v2/components/multimodal/OrbAvatar.js +326 -0
  401. package/widget/multimodal_v2/components/multimodal/Status.js +220 -0
  402. package/widget/multimodal_v2/components/multimodal/VideoAvatar.js +24 -0
  403. package/widget/multimodal_v2/components/multimodal/VideoPreview.js +114 -0
  404. package/widget/multimodal_v2/components/multimodal/useAudioLevelMonitoring.js +96 -0
  405. package/widget/multimodal_v2/components/multimodal/useMultimodal.js +434 -0
  406. package/widget/multimodal_v2/components/presentations/index.js +372 -0
  407. package/widget/multimodal_v2/components/shared/Avatar.js +92 -0
  408. package/widget/multimodal_v2/components/shared/AvatarGroup.js +135 -0
  409. package/widget/multimodal_v2/components/shared/Button.js +245 -0
  410. package/widget/multimodal_v2/components/shared/ButtonGroup.js +133 -0
  411. package/widget/multimodal_v2/components/shared/ComposerForm.js +98 -0
  412. package/widget/multimodal_v2/components/shared/SpeakingIndicator.js +239 -0
  413. package/widget/multimodal_v2/components/shared/ThinkingAnimation.js +165 -0
  414. package/widget/multimodal_v2/components/shared/Tooltip.js +266 -0
  415. package/widget/multimodal_v2/components/shared/controls/Dropdown.js +79 -0
  416. package/widget/multimodal_v2/components/shared/controls/PillToggle.js +142 -0
  417. package/widget/multimodal_v2/components/shared/controls/TextArea.js +114 -0
  418. package/widget/multimodal_v2/components/shared/toolCallLabels.js +12 -0
  419. package/widget/multimodal_v2/components/slides/SlidesThumbnail.js +47 -0
  420. package/widget/multimodal_v2/components/slides/index.js +61 -0
  421. package/widget/multimodal_v2/constants.js +88 -0
  422. package/widget/multimodal_v2/host.split-css.js +2 -0
  423. package/widget/multimodal_v2/host.string.js +96 -0
  424. package/widget/multimodal_v2/images/icons.js +582 -0
  425. package/widget/multimodal_v2/images/posters/piper_low_res.jpg +0 -0
  426. package/widget/multimodal_v2/index.js +23 -0
  427. package/widget/multimodal_v2/index.panda.js +28 -0
  428. package/widget/multimodal_v2/index.split-css.panda.js +2 -0
  429. package/widget/multimodal_v2/inline_meeting_booker.js +182 -0
  430. package/widget/multimodal_v2/locales/cs.js +196 -0
  431. package/widget/multimodal_v2/locales/da.js +196 -0
  432. package/widget/multimodal_v2/locales/de.js +196 -0
  433. package/widget/multimodal_v2/locales/en.js +196 -0
  434. package/widget/multimodal_v2/locales/en_AU.js +197 -0
  435. package/widget/multimodal_v2/locales/en_GB.js +197 -0
  436. package/widget/multimodal_v2/locales/es.js +197 -0
  437. package/widget/multimodal_v2/locales/es_LA.js +196 -0
  438. package/widget/multimodal_v2/locales/fi.js +196 -0
  439. package/widget/multimodal_v2/locales/fr.js +197 -0
  440. package/widget/multimodal_v2/locales/fr_CA.js +196 -0
  441. package/widget/multimodal_v2/locales/id.js +196 -0
  442. package/widget/multimodal_v2/locales/index.js +48 -0
  443. package/widget/multimodal_v2/locales/it.js +196 -0
  444. package/widget/multimodal_v2/locales/ja.js +196 -0
  445. package/widget/multimodal_v2/locales/ko.js +196 -0
  446. package/widget/multimodal_v2/locales/nb.js +196 -0
  447. package/widget/multimodal_v2/locales/nl.js +196 -0
  448. package/widget/multimodal_v2/locales/pl.js +196 -0
  449. package/widget/multimodal_v2/locales/pt_BR.js +196 -0
  450. package/widget/multimodal_v2/locales/ru.js +196 -0
  451. package/widget/multimodal_v2/locales/sv.js +196 -0
  452. package/widget/multimodal_v2/locales/th.js +196 -0
  453. package/widget/multimodal_v2/locales/tr.js +196 -0
  454. package/widget/multimodal_v2/locales/vi.js +196 -0
  455. package/widget/multimodal_v2/locales/zh_CN.js +196 -0
  456. package/widget/multimodal_v2/locales/zh_TW.js +196 -0
  457. package/widget/multimodal_v2/multimodal.js +633 -0
  458. package/widget/multimodal_v2/multimodal_channel.js +195 -0
  459. package/widget/multimodal_v2/signals/active_conversation_signal.js +33 -0
  460. package/widget/multimodal_v2/signals/allowed_conversation_mode_signal.js +38 -0
  461. package/widget/multimodal_v2/signals/artifact_signal.js +22 -0
  462. package/widget/multimodal_v2/signals/layout_signal.js +98 -0
  463. package/widget/multimodal_v2/signals/messages_signal.js +207 -0
  464. package/widget/multimodal_v2/signals/ui_state_signal.js +128 -0
  465. package/widget/multimodal_v2/stable_bundle_src.js +44 -0
  466. package/widget/multimodal_v2/stores/ai_conversation_store.js +221 -0
  467. package/widget/multimodal_v2/stores/artifact_store.js +205 -0
  468. package/widget/multimodal_v2/stores/base_store.js +16 -0
  469. package/widget/multimodal_v2/stores/call_store.js +770 -0
  470. package/widget/multimodal_v2/stores/call_ui_adapter.js +225 -0
  471. package/widget/multimodal_v2/stores/debug_multimodal_scenario_store.js +471 -0
  472. package/widget/multimodal_v2/stores/decks_store.js +285 -0
  473. package/widget/multimodal_v2/stores/device_store.js +63 -0
  474. package/widget/multimodal_v2/stores/docking_store.js +62 -0
  475. package/widget/multimodal_v2/stores/field_request_store.js +326 -0
  476. package/widget/multimodal_v2/stores/meeting_store.js +477 -0
  477. package/widget/multimodal_v2/stores/participant_store.js +73 -0
  478. package/widget/multimodal_v2/stores/post_call_survey_store.js +160 -0
  479. package/widget/multimodal_v2/stores/pounce_tracking_store.js +163 -0
  480. package/widget/multimodal_v2/stores/pounce_tracking_store_v2.js +511 -0
  481. package/widget/multimodal_v2/stores/presentations_store.js +111 -0
  482. package/widget/multimodal_v2/stores/root_store.js +1919 -0
  483. package/widget/multimodal_v2/stores/screen_share_store.js +217 -0
  484. package/widget/multimodal_v2/stores/slides_store.js +21 -0
  485. package/widget/multimodal_v2/stores/translation_store.js +185 -0
  486. package/widget/multimodal_v2/stores/ui_store.js +496 -0
  487. package/widget/multimodal_v2/stores/waiting_store.js +159 -0
  488. package/widget/multimodal_v2/stores/website_navigation_store.js +767 -0
  489. package/widget/multimodal_v2/styled-system/css/conditions.js +34 -0
  490. package/widget/multimodal_v2/styled-system/css/css.js +48 -0
  491. package/widget/multimodal_v2/styled-system/css/cva.js +96 -0
  492. package/widget/multimodal_v2/styled-system/css/cx.js +13 -0
  493. package/widget/multimodal_v2/styled-system/css/index.js +15 -0
  494. package/widget/multimodal_v2/styled-system/css/sva.js +69 -0
  495. package/widget/multimodal_v2/styled-system/helpers.js +384 -0
  496. package/widget/multimodal_v2/styled-system/jsx/create-style-context.js +96 -0
  497. package/widget/multimodal_v2/styled-system/jsx/factory-helper.js +19 -0
  498. package/widget/multimodal_v2/styled-system/jsx/factory.js +111 -0
  499. package/widget/multimodal_v2/styled-system/jsx/index.js +12 -0
  500. package/widget/multimodal_v2/styled-system/jsx/is-valid-prop.js +22 -0
  501. package/widget/multimodal_v2/types.js +105 -0
  502. package/widget/multimodal_v2/utils/auto_scroller.js +157 -0
  503. package/widget/multimodal_v2/utils/flip_animation.js +124 -0
  504. package/widget/multimodal_v2/utils/focus_gate.js +237 -0
  505. package/widget/multimodal_v2/utils/locale.js +16 -0
  506. package/widget/multimodal_v2/utils/media_queries.js +30 -0
  507. package/widget/multimodal_v2/utils/multimodal_cache.js +19 -0
  508. package/widget/multimodal_v2/utils/mutation_effect.js +14 -0
  509. package/widget/multimodal_v2/utils/navigation_interceptor.js +205 -0
  510. package/widget/multimodal_v2/utils/navigation_strategies/dom_swap.js +393 -0
  511. package/widget/multimodal_v2/utils/navigation_strategies/index.js +12 -0
  512. package/widget/multimodal_v2/utils/navigation_strategies/lwr.js +61 -0
  513. package/widget/multimodal_v2/utils/navigation_strategies/navigation_utils.js +46 -0
  514. package/widget/multimodal_v2/utils/navigation_strategies/next_js.js +24 -0
  515. package/widget/multimodal_v2/utils/navigation_strategies/wouter_v3.js +15 -0
  516. package/widget/multimodal_v2/utils/objects_map.js +38 -0
  517. package/widget/multimodal_v2/utils/perceived_voice_turn_tracker.js +345 -0
  518. package/widget/multimodal_v2/utils/sanitize_html.js +132 -0
  519. package/widget/multimodal_v2/utils/signals.js +97 -0
  520. package/widget/multimodal_v2/utils/slide_zoom.js +114 -0
  521. package/widget/multimodal_v2/utils/theme_styles.js +137 -0
  522. package/widget/multimodal_v2/utils/url_observer.js +52 -0
  523. package/widget/multimodal_v2/utils/voice_onset_detector.js +127 -0
  524. package/widget/page_mirror.js +89 -0
  525. package/widget/page_view_activity_emitter.js +71 -0
  526. package/widget/pardot_visitor.js +137 -0
  527. package/widget/personalization_observer.js +96 -0
  528. package/widget/personalizations_config.js +160 -0
  529. package/widget/qualified_form/constants.js +23 -0
  530. package/widget/qualified_form/phone_utils.js +38 -0
  531. package/widget/qualified_form/qualified_form_action.js +91 -0
  532. package/widget/qualified_form/qualified_form_action_orchestrator.js +21 -0
  533. package/widget/qualified_form/qualified_form_api.js +471 -0
  534. package/widget/scroll_disabler.js +109 -0
  535. package/widget/server-logger.js +156 -0
  536. package/widget/smart_website_config.js +112 -0
  537. package/widget/telemetry/context.js +75 -0
  538. package/widget/telemetry/index.js +16 -0
  539. package/widget/telemetry/messenger_uptime.js +80 -0
  540. package/widget/telemetry/metrics.js +120 -0
  541. package/widget/telemetry/span.js +82 -0
  542. package/widget/telemetry/telemetry.js +180 -0
  543. package/widget/telemetry/tracer.js +41 -0
  544. package/widget/telemetry/tracing_store.js +310 -0
  545. package/widget/tracker.js +916 -0
  546. package/widget/utils/native_globals.js +129 -0
  547. package/widget/v1_adapter.js +50 -0
  548. package/widget/v2_adapter.js +368 -0
  549. package/widget/visitor/base_visitor_state.js +11 -0
  550. package/widget/visitor/cookie_visitor_state.js +128 -0
  551. package/widget/visitor/in_memory_visitor_state.js +29 -0
  552. package/widget/visitor/visitor_state.js +384 -0
  553. package/widget/visitor.js +356 -0
  554. package/widget/widget/linked_widget_v2.js +227 -0
  555. package/widget/widget/page_mirror_factory.js +22 -0
  556. package/widget/widget/sentry.js +130 -0
  557. package/widget/widget/widget.js +1698 -0
  558. package/widget/widget.split-css.js +2 -0
  559. package/widget/widget_bootstrap.js +97 -0
  560. 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 };