@envive-ai/react-hooks 0.3.1 → 0.3.3

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 (309) hide show
  1. package/dist/application/commerce-api.cjs +6 -4
  2. package/dist/application/commerce-api.js +7 -5
  3. package/dist/application/models/api/nextMessageRequest.d.cts +3 -1
  4. package/dist/application/models/api/nextMessageRequest.d.ts +3 -1
  5. package/dist/application/models/api/response.d.cts +1 -1
  6. package/dist/application/models/api/response.d.ts +1 -1
  7. package/dist/application/models/frontendConfig.d.cts +1 -1
  8. package/dist/application/models/frontendConfig.d.ts +1 -1
  9. package/dist/application/models/guards/api/isApiFormResponse.cjs +1 -1
  10. package/dist/application/models/guards/api/isApiFormResponse.js +1 -1
  11. package/dist/application/models/guards/api/isApiFormSubmittedResponseAttributes.cjs +1 -1
  12. package/dist/application/models/guards/api/isApiFormSubmittedResponseAttributes.js +1 -1
  13. package/dist/application/models/guards/api/isApiOrderResponseAttributes.cjs +2 -2
  14. package/dist/application/models/guards/api/isApiOrderResponseAttributes.js +2 -2
  15. package/dist/application/models/guards/api/isApiProductResponseAttributes.cjs +1 -1
  16. package/dist/application/models/guards/api/isApiProductResponseAttributes.js +1 -1
  17. package/dist/application/models/guards/api/isApiResponse.cjs +1 -1
  18. package/dist/application/models/guards/api/isApiResponse.js +1 -1
  19. package/dist/application/models/guards/api/isApiSearchEventAttributes.cjs +2 -2
  20. package/dist/application/models/guards/api/isApiSearchEventAttributes.js +2 -2
  21. package/dist/application/models/message.cjs +1 -1
  22. package/dist/application/models/message.d.cts +1 -1
  23. package/dist/application/models/message.d.ts +1 -1
  24. package/dist/application/models/message.js +1 -1
  25. package/dist/application/models/validators/validateGraphQLColorsConfig.cjs +2 -1
  26. package/dist/application/models/validators/validateGraphQLColorsConfig.js +2 -1
  27. package/dist/application/models/validators/validateGraphQLFrontendConfig.cjs +1 -1
  28. package/dist/application/models/validators/validateGraphQLFrontendConfig.d.cts +1 -1
  29. package/dist/application/models/validators/validateGraphQLFrontendConfig.d.ts +1 -1
  30. package/dist/application/models/validators/validateGraphQLFrontendConfig.js +1 -1
  31. package/dist/application/models/variantInfo/variantInfo.cjs +4 -1
  32. package/dist/application/models/variantInfo/variantInfo.d.cts +4 -1
  33. package/dist/application/models/variantInfo/variantInfo.d.ts +4 -1
  34. package/dist/application/models/variantInfo/variantInfo.js +4 -1
  35. package/dist/application/utils/analyticsUtils.cjs +2 -2
  36. package/dist/application/utils/analyticsUtils.js +2 -2
  37. package/dist/application/utils/domObserver.cjs +1 -1
  38. package/dist/application/utils/domObserver.js +1 -1
  39. package/dist/application/utils/elementObserver.cjs +1 -1
  40. package/dist/application/utils/elementObserver.d.cts +2 -2
  41. package/dist/application/utils/elementObserver.d.ts +2 -2
  42. package/dist/application/utils/elementObserver.js +1 -1
  43. package/dist/application/utils/mutationHelper.cjs +2 -2
  44. package/dist/application/utils/mutationHelper.js +2 -2
  45. package/dist/application/utils/nodeSelector.cjs +5 -2
  46. package/dist/application/utils/nodeSelector.js +5 -2
  47. package/dist/application/utils/stringUtils.cjs +1 -1
  48. package/dist/application/utils/stringUtils.js +1 -1
  49. package/dist/atoms/app/index.cjs +12 -1
  50. package/dist/atoms/app/index.d.cts +3 -2
  51. package/dist/atoms/app/index.d.ts +3 -2
  52. package/dist/atoms/app/index.js +13 -3
  53. package/dist/atoms/app/variant.cjs +2 -2
  54. package/dist/atoms/app/variant.d.cts +69 -5
  55. package/dist/atoms/app/variant.d.ts +69 -5
  56. package/dist/atoms/app/variant.js +2 -2
  57. package/dist/atoms/chat/chatState.d.cts +15 -15
  58. package/dist/atoms/chat/chatState.d.ts +15 -15
  59. package/dist/atoms/chat/form.d.cts +2 -2
  60. package/dist/atoms/chat/form.d.ts +2 -2
  61. package/dist/atoms/chat/index.cjs +1 -1
  62. package/dist/atoms/chat/index.d.cts +2 -2
  63. package/dist/atoms/chat/index.d.ts +3 -3
  64. package/dist/atoms/chat/index.js +1 -1
  65. package/dist/atoms/chat/lastMessage.d.cts +2 -2
  66. package/dist/atoms/chat/lastMessage.d.ts +2 -2
  67. package/dist/atoms/chat/messageQueue.cjs +1 -35
  68. package/dist/atoms/chat/messageQueue.js +2 -34
  69. package/dist/atoms/chat/performanceMetrics.d.cts +6 -6
  70. package/dist/atoms/chat/performanceMetrics.d.ts +6 -6
  71. package/dist/atoms/chat/renderedWidgetRefs.d.cts +2 -2
  72. package/dist/atoms/chat/replies.cjs +2 -2
  73. package/dist/atoms/chat/replies.d.cts +2 -2
  74. package/dist/atoms/chat/replies.d.ts +2 -2
  75. package/dist/atoms/chat/replies.js +2 -2
  76. package/dist/atoms/chat/suggestions.d.cts +2 -2
  77. package/dist/atoms/chat/suggestions.d.ts +2 -2
  78. package/dist/atoms/globalSearch/globalSearch.d.cts +6 -6
  79. package/dist/atoms/globalSearch/globalSearch.d.ts +5 -5
  80. package/dist/atoms/org/customerService.d.cts +7 -7
  81. package/dist/atoms/org/customerService.d.ts +6 -6
  82. package/dist/atoms/org/graphqlConfig.cjs +1 -1
  83. package/dist/atoms/org/graphqlConfig.d.cts +5 -5
  84. package/dist/atoms/org/graphqlConfig.d.ts +5 -5
  85. package/dist/atoms/org/graphqlConfig.js +1 -1
  86. package/dist/atoms/org/newOrgConfigAtom.d.cts +2 -2
  87. package/dist/atoms/org/newOrgConfigAtom.d.ts +2 -2
  88. package/dist/atoms/org/orgAnalyticsConfig.cjs +1 -1
  89. package/dist/atoms/org/orgAnalyticsConfig.d.cts +6 -6
  90. package/dist/atoms/org/orgAnalyticsConfig.d.ts +6 -6
  91. package/dist/atoms/org/orgAnalyticsConfig.js +1 -1
  92. package/dist/atoms/search/chatSearch.d.cts +17 -17
  93. package/dist/atoms/search/chatSearch.d.ts +17 -17
  94. package/dist/atoms/search/searchAPI.cjs +2 -2
  95. package/dist/atoms/search/searchAPI.d.cts +14 -14
  96. package/dist/atoms/search/searchAPI.d.ts +14 -14
  97. package/dist/atoms/search/searchAPI.js +2 -2
  98. package/dist/atoms/search/searchServiceAdapter.cjs +1 -1
  99. package/dist/atoms/search/searchServiceAdapter.js +1 -1
  100. package/dist/atoms/search/types.d.cts +1 -1
  101. package/dist/atoms/search/types.d.ts +1 -1
  102. package/dist/atoms/search/utils.d.cts +1 -1
  103. package/dist/atoms/search/utils.d.ts +1 -1
  104. package/dist/contexts/amplitudeContext/amplitudeContext.cjs +2 -2
  105. package/dist/contexts/amplitudeContext/amplitudeContext.js +2 -2
  106. package/dist/contexts/cdnContext/cdnContext.cjs +1 -1
  107. package/dist/contexts/cdnContext/cdnContext.js +1 -1
  108. package/dist/contexts/enviveConfigContext/enviveConfigContext.cjs +2 -3
  109. package/dist/contexts/enviveConfigContext/enviveConfigContext.js +2 -3
  110. package/dist/contexts/enviveContext/enviveContext.cjs +56 -0
  111. package/dist/contexts/enviveContext/enviveContext.d.cts +31 -0
  112. package/dist/contexts/enviveContext/enviveContext.d.ts +31 -0
  113. package/dist/contexts/enviveContext/enviveContext.js +55 -0
  114. package/dist/contexts/enviveContext/index.cjs +5 -0
  115. package/dist/contexts/enviveContext/index.d.cts +3 -0
  116. package/dist/contexts/enviveContext/index.d.ts +3 -0
  117. package/dist/contexts/enviveContext/index.js +4 -0
  118. package/dist/contexts/enviveContext/types.cjs +11 -0
  119. package/dist/contexts/enviveContext/types.d.cts +8 -0
  120. package/dist/contexts/enviveContext/types.d.ts +8 -0
  121. package/dist/contexts/enviveContext/types.js +10 -0
  122. package/dist/contexts/featureFlagContext/featureFlagContext.cjs +2 -2
  123. package/dist/contexts/featureFlagContext/featureFlagContext.js +2 -2
  124. package/dist/contexts/featureFlagServiceContext/featureFlagServiceContext.cjs +2 -2
  125. package/dist/contexts/featureFlagServiceContext/featureFlagServiceContext.js +2 -2
  126. package/dist/contexts/graphqlContext/graphqlContext.cjs +2 -2
  127. package/dist/contexts/graphqlContext/graphqlContext.js +2 -2
  128. package/dist/contexts/hardcopyContext/hardcopyContext.cjs +62 -0
  129. package/dist/contexts/hardcopyContext/hardcopyContext.d.cts +23 -0
  130. package/dist/contexts/hardcopyContext/hardcopyContext.d.ts +23 -0
  131. package/dist/contexts/hardcopyContext/hardcopyContext.js +60 -0
  132. package/dist/contexts/hardcopyContext/index.cjs +4 -0
  133. package/dist/contexts/hardcopyContext/index.d.cts +2 -0
  134. package/dist/contexts/hardcopyContext/index.d.ts +2 -0
  135. package/dist/contexts/hardcopyContext/index.js +3 -0
  136. package/dist/contexts/localStorageContext/localStorageContext.cjs +1 -1
  137. package/dist/contexts/localStorageContext/localStorageContext.js +1 -1
  138. package/dist/contexts/newOrgConfigContext/newOrgConfigContext.cjs +1 -1
  139. package/dist/contexts/newOrgConfigContext/newOrgConfigContext.js +1 -1
  140. package/dist/contexts/pageContext/index.cjs +6 -0
  141. package/dist/contexts/pageContext/index.d.cts +3 -0
  142. package/dist/contexts/pageContext/index.d.ts +3 -0
  143. package/dist/contexts/pageContext/index.js +4 -0
  144. package/dist/contexts/pageContext/mapping.cjs +25 -0
  145. package/dist/contexts/pageContext/mapping.d.cts +8 -0
  146. package/dist/contexts/pageContext/mapping.d.ts +8 -0
  147. package/dist/contexts/pageContext/mapping.js +25 -0
  148. package/dist/contexts/pageContext/pageContext.cjs +66 -0
  149. package/dist/contexts/pageContext/pageContext.d.cts +11 -0
  150. package/dist/contexts/pageContext/pageContext.d.ts +11 -0
  151. package/dist/contexts/pageContext/pageContext.js +64 -0
  152. package/dist/contexts/pageContext/types.cjs +0 -0
  153. package/dist/contexts/pageContext/types.d.cts +27 -0
  154. package/dist/contexts/pageContext/types.d.ts +27 -0
  155. package/dist/contexts/pageContext/types.js +1 -0
  156. package/dist/contexts/salesAgentContext/chatAPI.cjs +45 -0
  157. package/dist/contexts/salesAgentContext/chatAPI.d.cts +35 -0
  158. package/dist/contexts/salesAgentContext/chatAPI.d.ts +35 -0
  159. package/dist/contexts/salesAgentContext/chatAPI.js +44 -0
  160. package/dist/contexts/salesAgentContext/index.cjs +20 -0
  161. package/dist/contexts/salesAgentContext/index.d.cts +4 -0
  162. package/dist/contexts/salesAgentContext/index.d.ts +4 -0
  163. package/dist/contexts/salesAgentContext/index.js +5 -0
  164. package/dist/contexts/salesAgentContext/salesAgentContext.cjs +90 -0
  165. package/dist/contexts/salesAgentContext/salesAgentContext.d.cts +22 -0
  166. package/dist/contexts/salesAgentContext/salesAgentContext.d.ts +22 -0
  167. package/dist/contexts/salesAgentContext/salesAgentContext.js +88 -0
  168. package/dist/contexts/salesAgentContext/salesAgentService.cjs +99 -0
  169. package/dist/contexts/salesAgentContext/salesAgentService.js +98 -0
  170. package/dist/contexts/searchContext/searchContext.cjs +2 -2
  171. package/dist/contexts/searchContext/searchContext.js +2 -2
  172. package/dist/contexts/sessionStorageContext/sessionStorageContext.cjs +1 -1
  173. package/dist/contexts/sessionStorageContext/sessionStorageContext.js +1 -1
  174. package/dist/contexts/systemSettingsContext/systemSettingsContext.d.cts +2 -2
  175. package/dist/contexts/types.cjs +11 -1
  176. package/dist/contexts/types.d.cts +10 -2
  177. package/dist/contexts/types.d.ts +10 -2
  178. package/dist/contexts/types.js +11 -2
  179. package/dist/contexts/userIdentityContext/userIdentityContext.cjs +2 -2
  180. package/dist/contexts/userIdentityContext/userIdentityContext.js +2 -2
  181. package/dist/events/index.cjs +2 -4
  182. package/dist/events/index.js +2 -4
  183. package/dist/hooks/AmplitudeOperations/useAmplitudeOperations.cjs +1 -1
  184. package/dist/hooks/AmplitudeOperations/useAmplitudeOperations.js +1 -1
  185. package/dist/hooks/Debounce/useDebounce.cjs +1 -1
  186. package/dist/hooks/Debounce/useDebounce.js +1 -1
  187. package/dist/hooks/ElementObserver/useElementObserver.cjs +2 -2
  188. package/dist/hooks/ElementObserver/useElementObserver.js +2 -2
  189. package/dist/hooks/GrabAndScroll/useGrabAndScroll.d.cts +2 -2
  190. package/dist/hooks/GrabAndScroll/useGrabAndScroll.d.ts +2 -2
  191. package/dist/hooks/GraphQLConfig/useGraphQLConfig.cjs +9 -3
  192. package/dist/hooks/GraphQLConfig/useGraphQLConfig.js +9 -3
  193. package/dist/hooks/IdentifyUser/useIdentifyUser.cjs +1 -1
  194. package/dist/hooks/IdentifyUser/useIdentifyUser.js +1 -1
  195. package/dist/hooks/ImageResolver/useImageResolver.cjs +1 -1
  196. package/dist/hooks/ImageResolver/useImageResolver.js +1 -1
  197. package/dist/hooks/IsSmallScreen/useIsSmallScreen.cjs +1 -1
  198. package/dist/hooks/IsSmallScreen/useIsSmallScreen.js +1 -1
  199. package/dist/hooks/LocalStorageOperations/useLocalStorageOperations.cjs +11 -3
  200. package/dist/hooks/LocalStorageOperations/useLocalStorageOperations.js +11 -3
  201. package/dist/hooks/Search/useRecommendedProducts.cjs +1 -1
  202. package/dist/hooks/Search/useRecommendedProducts.js +1 -1
  203. package/dist/hooks/Search/useSearch.cjs +2 -2
  204. package/dist/hooks/Search/useSearch.js +2 -2
  205. package/dist/hooks/Search/useSearchInput.cjs +1 -1
  206. package/dist/hooks/Search/useSearchInput.js +1 -1
  207. package/dist/hooks/SearchOperations/useSearchOperations.cjs +1 -1
  208. package/dist/hooks/SearchOperations/useSearchOperations.d.cts +1 -1
  209. package/dist/hooks/SearchOperations/useSearchOperations.d.ts +1 -1
  210. package/dist/hooks/SearchOperations/useSearchOperations.js +1 -1
  211. package/dist/hooks/SessionStorageOperations/useSessionStorageOperations.cjs +1 -1
  212. package/dist/hooks/SessionStorageOperations/useSessionStorageOperations.js +1 -1
  213. package/dist/hooks/TrackComponentVisibleEvent/useTrackComponentVisibleEvent.cjs +1 -1
  214. package/dist/hooks/TrackComponentVisibleEvent/useTrackComponentVisibleEvent.js +1 -1
  215. package/dist/hooks/utils.cjs +3 -3
  216. package/dist/hooks/utils.d.cts +1 -1
  217. package/dist/hooks/utils.d.ts +1 -1
  218. package/dist/hooks/utils.js +3 -3
  219. package/package.json +29 -6
  220. package/src/application/commerce-api.ts +12 -10
  221. package/src/application/models/api/nextMessageRequest.ts +2 -0
  222. package/src/application/models/api/response.ts +4 -4
  223. package/src/application/models/api/search.ts +1 -2
  224. package/src/application/models/api/userEvent.ts +1 -2
  225. package/src/application/models/frontendConfig.ts +2 -2
  226. package/src/application/models/guards/api/isApiOrderResponseAttributes.ts +8 -4
  227. package/src/application/models/guards/api/isApiSearchEventAttributes.ts +1 -1
  228. package/src/application/models/index.ts +1 -0
  229. package/src/application/models/message.ts +5 -5
  230. package/src/application/models/utilityTypes/delimiterCase.ts +1 -0
  231. package/src/application/models/validators/validateGraphQLColorsConfig.ts +2 -1
  232. package/src/application/models/validators/validateGraphQLFrontendConfig.ts +1 -1
  233. package/src/application/models/variantInfo/variantInfo.ts +3 -0
  234. package/src/application/utils/analyticsUtils.ts +3 -3
  235. package/src/application/utils/domObserver.ts +1 -0
  236. package/src/application/utils/elementObserver.ts +1 -0
  237. package/src/application/utils/mutationHelper.ts +3 -1
  238. package/src/application/utils/nodeSelector.ts +7 -1
  239. package/src/application/utils/stringUtils.ts +1 -0
  240. package/src/atoms/app/index.ts +17 -6
  241. package/src/atoms/app/variant.ts +11 -13
  242. package/src/atoms/chat/__tests__/messageQueue.test.spec.ts +61 -0
  243. package/src/atoms/chat/index.ts +8 -8
  244. package/src/atoms/chat/messageQueue.ts +2 -48
  245. package/src/atoms/chat/replies.ts +3 -3
  246. package/src/atoms/org/graphqlConfig.ts +0 -1
  247. package/src/atoms/org/orgAnalyticsConfig.ts +1 -1
  248. package/src/atoms/search/searchAPI.ts +1 -1
  249. package/src/atoms/search/searchServiceAdapter.ts +1 -1
  250. package/src/contexts/amplitudeContext/__tests__/amplitudeContext.test.tsx +4 -3
  251. package/src/contexts/amplitudeContext/amplitudeContext.tsx +5 -5
  252. package/src/contexts/cdnContext/cdnContext.tsx +1 -1
  253. package/src/contexts/enviveConfigContext/__tests__/enviveConfigContext.test.tsx +2 -3
  254. package/src/contexts/enviveConfigContext/enviveConfigContext.tsx +3 -3
  255. package/src/contexts/enviveContext/enviveContext.tsx +89 -0
  256. package/src/contexts/enviveContext/index.ts +2 -0
  257. package/src/contexts/enviveContext/types.ts +4 -0
  258. package/src/contexts/featureFlagContext/featureFlagContext.tsx +1 -1
  259. package/src/contexts/featureFlagServiceContext/featureFlagServiceContext.tsx +1 -1
  260. package/src/contexts/graphqlContext/__tests__/graphqlContext.test.tsx +7 -5
  261. package/src/contexts/graphqlContext/graphqlContext.tsx +1 -5
  262. package/src/contexts/hardcopyContext/hardcopyContext.tsx +70 -0
  263. package/src/contexts/hardcopyContext/index.ts +1 -0
  264. package/src/contexts/localStorageContext/__tests__/localStorageContext.test.tsx +9 -3
  265. package/src/contexts/localStorageContext/localStorageContext.tsx +1 -1
  266. package/src/contexts/newOrgConfigContext/__tests__/newOrgConfigContext.test.tsx +2 -3
  267. package/src/contexts/newOrgConfigContext/newOrgConfigContext.tsx +1 -1
  268. package/src/contexts/pageContext/__tests__/pageContext.test.tsx +666 -0
  269. package/src/contexts/pageContext/index.ts +2 -0
  270. package/src/contexts/pageContext/mapping.ts +38 -0
  271. package/src/contexts/pageContext/pageContext.tsx +78 -0
  272. package/src/contexts/pageContext/types.ts +27 -0
  273. package/src/contexts/salesAgentContext/chatAPI.ts +75 -0
  274. package/src/contexts/salesAgentContext/index.ts +3 -0
  275. package/src/contexts/salesAgentContext/salesAgentContext.tsx +128 -0
  276. package/src/contexts/salesAgentContext/salesAgentService.ts +197 -0
  277. package/src/contexts/searchContext/__tests__/searchContext.test.tsx +14 -15
  278. package/src/contexts/searchContext/searchContext.tsx +1 -1
  279. package/src/contexts/sessionStorageContext/sessionStorageContext.tsx +1 -1
  280. package/src/contexts/systemSettingsContext/__tests__/systemSettingsContext.test.tsx +7 -6
  281. package/src/contexts/types.ts +20 -22
  282. package/src/contexts/userIdentityContext/__tests__/userIdentityContext.test.tsx +3 -8
  283. package/src/contexts/userIdentityContext/userIdentityContext.tsx +1 -1
  284. package/src/events/index.ts +5 -7
  285. package/src/hooks/AmplitudeOperations/useAmplitudeOperations.ts +1 -1
  286. package/src/hooks/Debounce/useDebounce.ts +1 -1
  287. package/src/hooks/ElementObserver/useElementObserver.ts +2 -1
  288. package/src/hooks/GraphQLConfig/useGraphQLConfig.ts +4 -2
  289. package/src/hooks/IdentifyUser/useIdentifyUser.ts +1 -1
  290. package/src/hooks/ImageResolver/useImageResolver.ts +2 -0
  291. package/src/hooks/IsSmallScreen/useIsSmallScreen.ts +1 -1
  292. package/src/hooks/LocalStorageOperations/useLocalStorageOperations.ts +20 -4
  293. package/src/hooks/Search/__tests__/useSearch.test.tsx +15 -10
  294. package/src/hooks/Search/useRecommendedProducts.ts +2 -2
  295. package/src/hooks/Search/useSearchInput.ts +1 -1
  296. package/src/hooks/SearchOperations/useSearchOperations.ts +2 -2
  297. package/src/hooks/SessionStorageOperations/useSessionStorageOperations.ts +1 -1
  298. package/src/hooks/TrackComponentVisibleEvent/useTrackComponentVisibleEvent.ts +2 -2
  299. package/src/hooks/utils.ts +3 -2
  300. package/dist/contexts/chatContext/chatContext.cjs +0 -306
  301. package/dist/contexts/chatContext/chatContext.d.cts +0 -15
  302. package/dist/contexts/chatContext/chatContext.d.ts +0 -15
  303. package/dist/contexts/chatContext/chatContext.js +0 -304
  304. package/dist/contexts/chatContext/index.cjs +0 -4
  305. package/dist/contexts/chatContext/index.d.cts +0 -2
  306. package/dist/contexts/chatContext/index.d.ts +0 -2
  307. package/dist/contexts/chatContext/index.js +0 -3
  308. package/src/contexts/chatContext/chatContext.tsx +0 -463
  309. package/src/contexts/chatContext/index.ts +0 -1
@@ -1,304 +0,0 @@
1
- import { createAppLoadedEvent, createVisitUserEvent } from "../../hooks/utils.js";
2
- import { useMessageInterceptor } from "../../interceptors/useMessageInterceptor.js";
3
- import { MessageRole, MessageType } from "../../application/models/message.js";
4
- import logger_default from "../../application/logging/logger.js";
5
- import "../../application/models/index.js";
6
- import { getAtomStore } from "../../atoms/atomStore/atomStore.js";
7
- import "../../atoms/atomStore/index.js";
8
- import { supportedEventAtom, variantInfoAtom } from "../../atoms/app/variant.js";
9
- import { chatIdAtom, userIdAtom } from "../../atoms/app/index.js";
10
- import { SpiffyMetricsEventName } from "../amplitudeContext/amplitudeContext.js";
11
- import { messageFromResponse } from "../../application/utils/messageFromResponse.js";
12
- import "../../application/utils/index.js";
13
- import { messagesAtom, requestFailureAtom, responseStreamingAtom, suggestionsAtom, suggestionsLoadingAtom, userEventsAtom, userHasRepliedAtom } from "../../atoms/chat/chatState.js";
14
- import { clearUserEventAtom, createResponsePayload, processUserEventAtom, userEventQueueAtom, userQueueEventCountAtom } from "../../atoms/chat/messageQueue.js";
15
- import { PerfMetricsEvents, logPerfMetricAtom } from "../../atoms/chat/performanceMetrics.js";
16
- import { chatAtom } from "../../atoms/chat/index.js";
17
- import { chatSearchIsLoadingAtom, chatSearchProductSortingAtom, chatSearchProducts, chatSearchStateAtom, handleSearchResultsAtom } from "../../atoms/search/chatSearch.js";
18
- import { SessionRestartRequired } from "../../types/exceptions/sessionExceptions.js";
19
- import commerce_api_default from "../../application/commerce-api.js";
20
- import { useAmplitudeTracking } from "../../hooks/AmplitudeOperations/useAmplitudeOperations.js";
21
- import { useSystemSettingsContext } from "../../hooks/SystemSettingsContext/useSystemSettingsContext.js";
22
- import "../../hooks/SystemSettingsContext/index.js";
23
- import { UserEventCategory } from "@spiffy-ai/commerce-api-client";
24
- import { v4 } from "uuid";
25
- import { createContext, useCallback, useEffect, useMemo, useState } from "react";
26
- import { useAtom, useAtomValue, useSetAtom } from "jotai";
27
- import { jsx } from "react/jsx-runtime";
28
-
29
- //#region src/contexts/chatContext/chatContext.tsx
30
- /**
31
- * Record the chat assistant response in Amplitude
32
- *
33
- * @param startTimeMs The start time of the assistant response
34
- * @param payload The payload used to generate the response
35
- */
36
- const recordAssistantResponse = (startTimeMs, payload, track) => {
37
- const atomStore = getAtomStore();
38
- const chatState = atomStore.get(chatAtom);
39
- const chatSearchState = atomStore.get(chatSearchStateAtom);
40
- const searchProducts = atomStore.get(chatSearchProducts);
41
- const searchProductsSort = atomStore.get(chatSearchProductSortingAtom);
42
- const assistantResponseTimeMs = {
43
- start: startTimeMs,
44
- end: Date.now()
45
- };
46
- let userQueryProperty;
47
- if (chatState.replyEventCategory === UserEventCategory.SuggestionClicked && chatState.suggestion) userQueryProperty = chatState.suggestion.content;
48
- else if (chatState.userQuery && chatState.userQuery.length > 0) userQueryProperty = chatState.userQuery;
49
- const eventProps = {
50
- response_time_ms: assistantResponseTimeMs.end - assistantResponseTimeMs.start,
51
- user_event_type: chatState.replyEventCategory,
52
- user_query: userQueryProperty
53
- };
54
- if (chatState.replyEventCategory === UserEventCategory.FormSubmitted) {
55
- const lastAssistantTurn = chatState.messages.filter((turn) => turn.length > 0 && turn[0].role === MessageRole.Assistant).pop();
56
- eventProps.form_submitted_attributes = {
57
- form_type: payload.userEvents?.find((event) => event.category === UserEventCategory.FormSubmitted)?.attributes.formType,
58
- status: lastAssistantTurn?.some((response) => response.type === MessageType.Order) ? "success" : "failed"
59
- };
60
- }
61
- if (chatSearchState === "product-page") {
62
- eventProps.search_products_returned = searchProducts.length;
63
- eventProps.search_products_sort_type = searchProductsSort;
64
- }
65
- track(SpiffyMetricsEventName.ChatAssistantResponse, { eventProps });
66
- };
67
- const ChatContext = createContext(void 0);
68
- const updateMessageState = (message, lastMessage, setMessages) => {
69
- if (lastMessage == null) {
70
- setMessages((prev) => [...prev, [message]]);
71
- return message;
72
- }
73
- if (lastMessage.type === MessageType.Text && message.type === MessageType.Text) {
74
- const newMessage = {
75
- ...lastMessage,
76
- metadata: {
77
- ...lastMessage.metadata,
78
- content: lastMessage.metadata.content + message.metadata.content
79
- }
80
- };
81
- setMessages((prev) => {
82
- const lastTurn = prev[prev.length - 1];
83
- return [...prev.slice(0, prev.length - 1), [...lastTurn.slice(0, lastTurn.length - 1), newMessage]];
84
- });
85
- return newMessage;
86
- }
87
- setMessages((prev) => [...prev.slice(0, prev.length - 1), [...prev[prev.length - 1], message]]);
88
- return message;
89
- };
90
- const handleStreamingError = (_error, setRequestFailure, setMessages) => {
91
- setRequestFailure(true);
92
- setMessages((prev) => [...prev, [{
93
- id: v4(),
94
- role: MessageRole.Assistant,
95
- type: MessageType.Text,
96
- createdAt: (/* @__PURE__ */ new Date()).toISOString(),
97
- metadata: { content: "I'm sorry! I'm having trouble right now. Please refresh the page or try again in a moment." }
98
- }]]);
99
- };
100
- const processStreamingResponse = async (stream, messageInterceptor, handleSearchResults, setMessages, setSearchIsLoading, chatId) => {
101
- let lastMessage;
102
- let hasSearchResults = false;
103
- for await (const response of stream) try {
104
- if (messageInterceptor.intercept(response)) return { hasSearchResults };
105
- const message = messageFromResponse(response);
106
- if (!message) throw new Error("Failed to transform API response to client message");
107
- if (message.type === MessageType.ProductSearch) {
108
- handleSearchResults(message);
109
- hasSearchResults = true;
110
- setSearchIsLoading(false);
111
- }
112
- lastMessage = updateMessageState(message, lastMessage, setMessages);
113
- } catch (error) {
114
- logger_default.logWarn(`[spiffy-ai] Failed to generate responses from stream chat_id=${chatId}`, error, {
115
- lastResponse: lastMessage,
116
- response
117
- });
118
- }
119
- return { hasSearchResults };
120
- };
121
- const ChatContextProvider = ({ children }) => {
122
- const logPerfMetric = useSetAtom(logPerfMetricAtom);
123
- const [widgetInitialized, setWidgetInitialized] = useState(false);
124
- const setUserHasReplied = useSetAtom(userHasRepliedAtom);
125
- const [messages, setMessages] = useAtom(messagesAtom);
126
- const setUserEvents = useSetAtom(userEventsAtom);
127
- const setSuggestions = useSetAtom(suggestionsAtom);
128
- const [suggestionsLoading, setSuggestionsLoading] = useAtom(suggestionsLoadingAtom);
129
- const [responseStreaming, setResponseStreaming] = useAtom(responseStreamingAtom);
130
- const setRequestFailure = useSetAtom(requestFailureAtom);
131
- const userEvents = useAtomValue(userEventQueueAtom);
132
- const userQueueEventCount = useAtomValue(userQueueEventCountAtom);
133
- const markUserEventsProcessed = useSetAtom(processUserEventAtom);
134
- const clearUserEventQueue = useSetAtom(clearUserEventAtom);
135
- const userId = useAtomValue(userIdAtom);
136
- const chatId = useAtomValue(chatIdAtom);
137
- const supportedEvent = useAtomValue(supportedEventAtom);
138
- const orgId = "mock-org-id";
139
- const variantInfo = useAtomValue(variantInfoAtom);
140
- const settingsContext = useSystemSettingsContext();
141
- const messageInterceptor = useMessageInterceptor();
142
- const handleSearchResults = useSetAtom(handleSearchResultsAtom);
143
- const setSearchIsLoading = useSetAtom(chatSearchIsLoadingAtom);
144
- const { track } = useAmplitudeTracking();
145
- const getStreamingResponses = useCallback(async (payload) => {
146
- logPerfMetric(PerfMetricsEvents.FirstResponseStarted);
147
- const stream = commerce_api_default.getNextResponseStreaming(payload);
148
- try {
149
- setRequestFailure(false);
150
- const { hasSearchResults } = await processStreamingResponse(stream, messageInterceptor, handleSearchResults, setMessages, setSearchIsLoading, chatId);
151
- return { hasSearchResults };
152
- } catch (e) {
153
- handleStreamingError(e, setRequestFailure, setMessages);
154
- throw e;
155
- } finally {
156
- logPerfMetric(PerfMetricsEvents.FirstResponseCompleted);
157
- }
158
- }, [
159
- logPerfMetric,
160
- setRequestFailure,
161
- messageInterceptor,
162
- handleSearchResults,
163
- setMessages,
164
- setSearchIsLoading,
165
- chatId
166
- ]);
167
- const getSuggestions = useCallback(async () => {
168
- logPerfMetric(PerfMetricsEvents.FirstSuggestionsStarted);
169
- setSuggestionsLoading(true);
170
- setSuggestions([]);
171
- const payloadWithoutAppLoaded = createResponsePayload({
172
- userEvents: [],
173
- generationParams: settingsContext.generationParams
174
- });
175
- setSuggestions((await commerce_api_default.getNextSuggestions(payloadWithoutAppLoaded)).sort((a, b) => a.content.length - b.content.length));
176
- setSuggestionsLoading(false);
177
- logPerfMetric(PerfMetricsEvents.FirstSuggestionsCompleted);
178
- }, [
179
- logPerfMetric,
180
- setSuggestionsLoading,
181
- setSuggestions,
182
- settingsContext.generationParams
183
- ]);
184
- const getResponses = useCallback(async (payload) => {
185
- try {
186
- const requestPayload = payload ?? createResponsePayload({
187
- userEvents,
188
- generationParams: settingsContext.generationParams
189
- });
190
- setResponseStreaming(true);
191
- setSuggestions([]);
192
- const startTimeMs = Date.now();
193
- await getStreamingResponses(requestPayload);
194
- recordAssistantResponse(startTimeMs, requestPayload, track);
195
- await getSuggestions();
196
- } catch (error) {
197
- logger_default.logError("[spiffy-ai] getResponses error", error);
198
- } finally {
199
- markUserEventsProcessed(userEvents.map(({ eventId }) => eventId));
200
- setUserHasReplied(false);
201
- setResponseStreaming(false);
202
- }
203
- }, [
204
- userEvents,
205
- settingsContext.generationParams,
206
- setResponseStreaming,
207
- setSuggestions,
208
- getStreamingResponses,
209
- markUserEventsProcessed,
210
- getSuggestions,
211
- setUserHasReplied,
212
- track
213
- ]);
214
- useEffect(() => {
215
- const processUserEvents = async () => {
216
- if (responseStreaming || !widgetInitialized) return;
217
- if (variantInfo.variant === "pdp" && !variantInfo.productId || variantInfo.variant === "plp" && !variantInfo.plpId || variantInfo.variant === "page_visit" && !variantInfo.url) {
218
- logger_default.logDebug("[spiffy-ai] variantInfo has invalid values, skipping...", {
219
- variantInfo,
220
- supportedEvent
221
- });
222
- return;
223
- }
224
- logger_default.logDebug(`Assistants Turn is_currently_streaming=${responseStreaming} initialized=${widgetInitialized}`);
225
- try {
226
- await getResponses();
227
- logger_default.logInfo(`Assistants Turn [finished]`);
228
- } catch (error) {
229
- logger_default.logError("[spiffy-ai] Assistants Turn error", error);
230
- }
231
- };
232
- if (userQueueEventCount > 0) processUserEvents();
233
- }, [
234
- getResponses,
235
- responseStreaming,
236
- userQueueEventCount,
237
- widgetInitialized,
238
- variantInfo,
239
- supportedEvent
240
- ]);
241
- useEffect(() => {
242
- if (widgetInitialized || responseStreaming) {
243
- logger_default.logDebug(`[spiffy-ai] initializeWidget [skipped] is_currently_streaming=${responseStreaming} is_initialized=${widgetInitialized}`);
244
- return;
245
- }
246
- const hydrateChat = async () => {
247
- try {
248
- logger_default.logDebug(`[spiffy-ai] initializeWidget is_currently_streaming=${responseStreaming} is_initialized=${widgetInitialized}`);
249
- const { messages: existingMessages, userEvents: userEvents$1 } = await commerce_api_default.getResponses(orgId, chatId, userId);
250
- setMessages([...existingMessages]);
251
- setUserEvents([...userEvents$1]);
252
- getResponses();
253
- } catch (error) {
254
- logger_default.logInfo(`Init chat [exception] chat_id=${chatId} error=${error}`, error);
255
- if (error instanceof SessionRestartRequired) {
256
- const appLoadedEvent = createAppLoadedEvent();
257
- const visitEvent = createVisitUserEvent({ variantInfo });
258
- setMessages([]);
259
- clearUserEventQueue();
260
- if (visitEvent) getResponses(createResponsePayload({
261
- userEvents: [appLoadedEvent, visitEvent],
262
- generationParams: settingsContext.generationParams
263
- }));
264
- }
265
- } finally {
266
- setWidgetInitialized(true);
267
- }
268
- };
269
- hydrateChat();
270
- }, []);
271
- const onFocus = useCallback(async () => {
272
- try {
273
- if (!responseStreaming && !suggestionsLoading && orgId) {
274
- const { messages: existingMessages } = await commerce_api_default.getResponses(orgId, chatId, userId);
275
- if (existingMessages.length > messages.length) setMessages([...existingMessages]);
276
- }
277
- } catch (error) {
278
- logger_default.logError("[spiffy-ai] onFocus error", error);
279
- }
280
- }, [
281
- responseStreaming,
282
- suggestionsLoading,
283
- orgId,
284
- chatId,
285
- userId,
286
- messages.length,
287
- setMessages
288
- ]);
289
- useEffect(() => {
290
- window.addEventListener("focus", onFocus);
291
- return () => {
292
- window.removeEventListener("focus", onFocus);
293
- };
294
- }, [onFocus]);
295
- const chatContext = useMemo(() => ({}), []);
296
- return /* @__PURE__ */ jsx(ChatContext.Provider, {
297
- value: chatContext,
298
- children
299
- });
300
- };
301
-
302
- //#endregion
303
- export { ChatContext, ChatContextProvider };
304
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdENvbnRleHQuanMiLCJuYW1lcyI6WyJ1c2VyUXVlcnlQcm9wZXJ0eTogc3RyaW5nIHwgdW5kZWZpbmVkIiwiZXZlbnRQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4iLCJ1dWlkIiwibGFzdE1lc3NhZ2U6IE1lc3NhZ2UgfCB1bmRlZmluZWQiLCJlcnJvcjogdW5rbm93biIsIkNvbW1lcmNlQXBpQ2xpZW50IiwidXNlckV2ZW50cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb250ZXh0cy9jaGF0Q29udGV4dC9jaGF0Q29udGV4dC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVXNlckV2ZW50Q2F0ZWdvcnkgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgdXNlQXRvbSwgdXNlQXRvbVZhbHVlLCB1c2VTZXRBdG9tIH0gZnJvbSAnam90YWknO1xuaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VTdGF0ZSwgUmVhY3ROb2RlLCB1c2VDYWxsYmFjaywgdXNlTWVtbyB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBDb21tZXJjZUFwaUNsaWVudCBmcm9tICdzcmMvYXBwbGljYXRpb24vY29tbWVyY2UtYXBpJztcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IFNlc3Npb25SZXN0YXJ0UmVxdWlyZWQgfSBmcm9tICdzcmMvdHlwZXMvZXhjZXB0aW9ucy9zZXNzaW9uRXhjZXB0aW9ucyc7XG5pbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5pbXBvcnQge1xuICBNZXNzYWdlLFxuICBNZXNzYWdlUm9sZSxcbiAgTWVzc2FnZVR5cGUsXG4gIE5leHRNZXNzYWdlUmVxdWVzdCxcbiAgUmVzcG9uc2UsXG59IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuaW1wb3J0IHsgU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSB9IGZyb20gJ3NyYy9jb250ZXh0cy9hbXBsaXR1ZGVDb250ZXh0L2FtcGxpdHVkZUNvbnRleHQnO1xuaW1wb3J0IHsgbWVzc2FnZUZyb21SZXNwb25zZSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi91dGlscyc7XG5pbXBvcnQgeyBjaGF0SWRBdG9tLCB1c2VySWRBdG9tLCB2YXJpYW50SW5mb0F0b20gfSBmcm9tICdzcmMvYXRvbXMvYXBwJztcbmltcG9ydCB7XG4gIG1lc3NhZ2VzQXRvbSxcbiAgcmVxdWVzdEZhaWx1cmVBdG9tLFxuICByZXNwb25zZVN0cmVhbWluZ0F0b20sXG4gIHVzZXJIYXNSZXBsaWVkQXRvbSxcbiAgUGVyZk1ldHJpY3NFdmVudHMsXG4gIGxvZ1BlcmZNZXRyaWNBdG9tLFxuICB1c2VyRXZlbnRzQXRvbSxcbiAgc3VnZ2VzdGlvbnNMb2FkaW5nQXRvbSxcbiAgc3VnZ2VzdGlvbnNBdG9tLFxufSBmcm9tICdzcmMvYXRvbXMvY2hhdCc7XG5pbXBvcnQge1xuICBjaGF0U2VhcmNoUHJvZHVjdFNvcnRpbmdBdG9tLFxuICBjaGF0U2VhcmNoUHJvZHVjdHMsXG4gIGNoYXRTZWFyY2hTdGF0ZUF0b20sXG4gIGhhbmRsZVNlYXJjaFJlc3VsdHNBdG9tLFxuICBjaGF0U2VhcmNoSXNMb2FkaW5nQXRvbSxcbn0gZnJvbSAnc3JjL2F0b21zL3NlYXJjaC9jaGF0U2VhcmNoJztcbmltcG9ydCB7IGNyZWF0ZUFwcExvYWRlZEV2ZW50LCBjcmVhdGVWaXNpdFVzZXJFdmVudCB9IGZyb20gJ3NyYy9ob29rcy91dGlscyc7XG5pbXBvcnQgeyB1c2VNZXNzYWdlSW50ZXJjZXB0b3IgfSBmcm9tICdzcmMvaW50ZXJjZXB0b3JzL3VzZU1lc3NhZ2VJbnRlcmNlcHRvcic7XG5pbXBvcnQgeyBzdXBwb3J0ZWRFdmVudEF0b20gfSBmcm9tICdzcmMvYXRvbXMvYXBwL3ZhcmlhbnQnO1xuaW1wb3J0IHsgY2hhdEF0b20gfSBmcm9tICdzcmMvYXRvbXMvY2hhdCc7XG5pbXBvcnQgeyBnZXRBdG9tU3RvcmUgfSBmcm9tICdzcmMvYXRvbXMvYXRvbVN0b3JlJztcbmltcG9ydCB7XG4gIGNsZWFyVXNlckV2ZW50QXRvbSxcbiAgY3JlYXRlUmVzcG9uc2VQYXlsb2FkLFxuICBwcm9jZXNzVXNlckV2ZW50QXRvbSxcbiAgdXNlckV2ZW50UXVldWVBdG9tLFxuICB1c2VyUXVldWVFdmVudENvdW50QXRvbSxcbn0gZnJvbSAnc3JjL2F0b21zL2NoYXQvbWVzc2FnZVF1ZXVlJztcbmltcG9ydCB7IHVzZUFtcGxpdHVkZVRyYWNraW5nIH0gZnJvbSAnc3JjL2hvb2tzL0FtcGxpdHVkZU9wZXJhdGlvbnMvdXNlQW1wbGl0dWRlT3BlcmF0aW9ucyc7XG5pbXBvcnQgeyB1c2VTeXN0ZW1TZXR0aW5nc0NvbnRleHQgfSBmcm9tICdzcmMvaG9va3MvU3lzdGVtU2V0dGluZ3NDb250ZXh0JztcblxuLyoqXG4gKiBSZWNvcmQgdGhlIGNoYXQgYXNzaXN0YW50IHJlc3BvbnNlIGluIEFtcGxpdHVkZVxuICpcbiAqIEBwYXJhbSBzdGFydFRpbWVNcyBUaGUgc3RhcnQgdGltZSBvZiB0aGUgYXNzaXN0YW50IHJlc3BvbnNlXG4gKiBAcGFyYW0gcGF5bG9hZCBUaGUgcGF5bG9hZCB1c2VkIHRvIGdlbmVyYXRlIHRoZSByZXNwb25zZVxuICovXG5jb25zdCByZWNvcmRBc3Npc3RhbnRSZXNwb25zZSA9IChcbiAgc3RhcnRUaW1lTXM6IG51bWJlcixcbiAgcGF5bG9hZDogTmV4dE1lc3NhZ2VSZXF1ZXN0LFxuICB0cmFjazogKGV2ZW50TmFtZTogU3BpZmZ5TWV0cmljc0V2ZW50TmFtZSwgZXZlbnRQcm9wcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSA9PiB2b2lkLFxuKSA9PiB7XG4gIGNvbnN0IGF0b21TdG9yZSA9IGdldEF0b21TdG9yZSgpO1xuICBjb25zdCBjaGF0U3RhdGUgPSBhdG9tU3RvcmUuZ2V0KGNoYXRBdG9tKTtcbiAgY29uc3QgY2hhdFNlYXJjaFN0YXRlID0gYXRvbVN0b3JlLmdldChjaGF0U2VhcmNoU3RhdGVBdG9tKTtcbiAgY29uc3Qgc2VhcmNoUHJvZHVjdHMgPSBhdG9tU3RvcmUuZ2V0KGNoYXRTZWFyY2hQcm9kdWN0cyk7XG4gIGNvbnN0IHNlYXJjaFByb2R1Y3RzU29ydCA9IGF0b21TdG9yZS5nZXQoY2hhdFNlYXJjaFByb2R1Y3RTb3J0aW5nQXRvbSk7XG4gIGNvbnN0IGFzc2lzdGFudFJlc3BvbnNlVGltZU1zID0geyBzdGFydDogc3RhcnRUaW1lTXMsIGVuZDogRGF0ZS5ub3coKSB9O1xuICBsZXQgdXNlclF1ZXJ5UHJvcGVydHk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAoXG4gICAgY2hhdFN0YXRlLnJlcGx5RXZlbnRDYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuU3VnZ2VzdGlvbkNsaWNrZWQgJiZcbiAgICBjaGF0U3RhdGUuc3VnZ2VzdGlvblxuICApIHtcbiAgICB1c2VyUXVlcnlQcm9wZXJ0eSA9IGNoYXRTdGF0ZS5zdWdnZXN0aW9uLmNvbnRlbnQ7XG4gIH0gZWxzZSBpZiAoY2hhdFN0YXRlLnVzZXJRdWVyeSAmJiBjaGF0U3RhdGUudXNlclF1ZXJ5Lmxlbmd0aCA+IDApIHtcbiAgICB1c2VyUXVlcnlQcm9wZXJ0eSA9IGNoYXRTdGF0ZS51c2VyUXVlcnk7XG4gIH1cblxuICBjb25zdCBldmVudFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHtcbiAgICByZXNwb25zZV90aW1lX21zOiBhc3Npc3RhbnRSZXNwb25zZVRpbWVNcy5lbmQgLSBhc3Npc3RhbnRSZXNwb25zZVRpbWVNcy5zdGFydCxcbiAgICB1c2VyX2V2ZW50X3R5cGU6IGNoYXRTdGF0ZS5yZXBseUV2ZW50Q2F0ZWdvcnksXG4gICAgdXNlcl9xdWVyeTogdXNlclF1ZXJ5UHJvcGVydHksXG4gIH07XG5cbiAgaWYgKGNoYXRTdGF0ZS5yZXBseUV2ZW50Q2F0ZWdvcnkgPT09IFVzZXJFdmVudENhdGVnb3J5LkZvcm1TdWJtaXR0ZWQpIHtcbiAgICBjb25zdCBsYXN0QXNzaXN0YW50VHVybiA9IGNoYXRTdGF0ZS5tZXNzYWdlc1xuICAgICAgLmZpbHRlcih0dXJuID0+IHR1cm4ubGVuZ3RoID4gMCAmJiB0dXJuWzBdLnJvbGUgPT09IE1lc3NhZ2VSb2xlLkFzc2lzdGFudClcbiAgICAgIC5wb3AoKTtcbiAgICBjb25zdCBmb3JtVHlwZSA9IHBheWxvYWQudXNlckV2ZW50cz8uZmluZChcbiAgICAgIGV2ZW50ID0+IGV2ZW50LmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5Gb3JtU3VibWl0dGVkLFxuICAgICk/LmF0dHJpYnV0ZXMuZm9ybVR5cGU7XG4gICAgY29uc3QgZm9ybVN0YXR1cyA9IGxhc3RBc3Npc3RhbnRUdXJuPy5zb21lKHJlc3BvbnNlID0+IHJlc3BvbnNlLnR5cGUgPT09IE1lc3NhZ2VUeXBlLk9yZGVyKTtcbiAgICBldmVudFByb3BzLmZvcm1fc3VibWl0dGVkX2F0dHJpYnV0ZXMgPSB7XG4gICAgICBmb3JtX3R5cGU6IGZvcm1UeXBlLFxuICAgICAgc3RhdHVzOiBmb3JtU3RhdHVzID8gJ3N1Y2Nlc3MnIDogJ2ZhaWxlZCcsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChjaGF0U2VhcmNoU3RhdGUgPT09ICdwcm9kdWN0LXBhZ2UnKSB7XG4gICAgZXZlbnRQcm9wcy5zZWFyY2hfcHJvZHVjdHNfcmV0dXJuZWQgPSBzZWFyY2hQcm9kdWN0cy5sZW5ndGg7XG4gICAgZXZlbnRQcm9wcy5zZWFyY2hfcHJvZHVjdHNfc29ydF90eXBlID0gc2VhcmNoUHJvZHVjdHNTb3J0O1xuICB9XG5cbiAgdHJhY2soU3BpZmZ5TWV0cmljc0V2ZW50TmFtZS5DaGF0QXNzaXN0YW50UmVzcG9uc2UsIHtcbiAgICBldmVudFByb3BzLFxuICB9KTtcbn07XG5cbmludGVyZmFjZSBDaGF0Q29udGV4dFBhcmFtcyB7fVxuXG5jb25zdCBDaGF0Q29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8Q2hhdENvbnRleHRQYXJhbXMgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbmNvbnN0IHVwZGF0ZU1lc3NhZ2VTdGF0ZSA9IChcbiAgbWVzc2FnZTogTWVzc2FnZSxcbiAgbGFzdE1lc3NhZ2U6IE1lc3NhZ2UsXG4gIHNldE1lc3NhZ2VzOiAodXBkYXRlcjogKHByZXY6IE1lc3NhZ2VbXVtdKSA9PiBNZXNzYWdlW11bXSkgPT4gdm9pZCxcbik6IE1lc3NhZ2UgPT4ge1xuICBpZiAobGFzdE1lc3NhZ2UgPT0gbnVsbCkge1xuICAgIHNldE1lc3NhZ2VzKHByZXYgPT4gWy4uLnByZXYsIFttZXNzYWdlXV0pO1xuICAgIHJldHVybiBtZXNzYWdlO1xuICB9XG4gIGlmIChsYXN0TWVzc2FnZS50eXBlID09PSBNZXNzYWdlVHlwZS5UZXh0ICYmIG1lc3NhZ2UudHlwZSA9PT0gTWVzc2FnZVR5cGUuVGV4dCkge1xuICAgIGNvbnN0IG5ld01lc3NhZ2UgPSB7XG4gICAgICAuLi5sYXN0TWVzc2FnZSxcbiAgICAgIG1ldGFkYXRhOiB7XG4gICAgICAgIC4uLmxhc3RNZXNzYWdlLm1ldGFkYXRhLFxuICAgICAgICBjb250ZW50OiBsYXN0TWVzc2FnZS5tZXRhZGF0YS5jb250ZW50ICsgbWVzc2FnZS5tZXRhZGF0YS5jb250ZW50LFxuICAgICAgfSxcbiAgICB9O1xuICAgIHNldE1lc3NhZ2VzKHByZXYgPT4ge1xuICAgICAgY29uc3QgbGFzdFR1cm4gPSBwcmV2W3ByZXYubGVuZ3RoIC0gMV07XG4gICAgICByZXR1cm4gW1xuICAgICAgICAuLi5wcmV2LnNsaWNlKDAsIHByZXYubGVuZ3RoIC0gMSksXG4gICAgICAgIFsuLi5sYXN0VHVybi5zbGljZSgwLCBsYXN0VHVybi5sZW5ndGggLSAxKSwgbmV3TWVzc2FnZV0sXG4gICAgICBdO1xuICAgIH0pO1xuICAgIHJldHVybiBuZXdNZXNzYWdlO1xuICB9XG4gIHNldE1lc3NhZ2VzKHByZXYgPT4gWy4uLnByZXYuc2xpY2UoMCwgcHJldi5sZW5ndGggLSAxKSwgWy4uLnByZXZbcHJldi5sZW5ndGggLSAxXSwgbWVzc2FnZV1dKTtcbiAgcmV0dXJuIG1lc3NhZ2U7XG59O1xuXG5jb25zdCBoYW5kbGVTdHJlYW1pbmdFcnJvciA9IChcbiAgX2Vycm9yOiB1bmtub3duLFxuICBzZXRSZXF1ZXN0RmFpbHVyZTogKGZhaWxlZDogYm9vbGVhbikgPT4gdm9pZCxcbiAgc2V0TWVzc2FnZXM6ICh1cGRhdGVyOiAocHJldjogTWVzc2FnZVtdW10pID0+IE1lc3NhZ2VbXVtdKSA9PiB2b2lkLFxuKSA9PiB7XG4gIHNldFJlcXVlc3RGYWlsdXJlKHRydWUpO1xuICBzZXRNZXNzYWdlcyhwcmV2ID0+IFtcbiAgICAuLi5wcmV2LFxuICAgIFtcbiAgICAgIHtcbiAgICAgICAgaWQ6IHV1aWQoKSxcbiAgICAgICAgcm9sZTogTWVzc2FnZVJvbGUuQXNzaXN0YW50LFxuICAgICAgICB0eXBlOiBNZXNzYWdlVHlwZS5UZXh0LFxuICAgICAgICBjcmVhdGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgICBjb250ZW50OlxuICAgICAgICAgICAgXCJJJ20gc29ycnkhIEknbSBoYXZpbmcgdHJvdWJsZSByaWdodCBub3cuIFBsZWFzZSByZWZyZXNoIHRoZSBwYWdlIG9yIHRyeSBhZ2FpbiBpbiBhIG1vbWVudC5cIixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgXSxcbiAgXSk7XG59O1xuXG5jb25zdCBwcm9jZXNzU3RyZWFtaW5nUmVzcG9uc2UgPSBhc3luYyAoXG4gIHN0cmVhbTogQXN5bmNJdGVyYWJsZTxSZXNwb25zZT4sXG4gIG1lc3NhZ2VJbnRlcmNlcHRvcjoge1xuICAgIGludGVyY2VwdDogKHJlc3BvbnNlPzogUmVzcG9uc2UpID0+IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIH0sXG4gIGhhbmRsZVNlYXJjaFJlc3VsdHM6IChtZXNzYWdlOiBNZXNzYWdlKSA9PiB2b2lkLFxuICBzZXRNZXNzYWdlczogKHVwZGF0ZXI6IChwcmV2OiBNZXNzYWdlW11bXSkgPT4gTWVzc2FnZVtdW10pID0+IHZvaWQsXG4gIHNldFNlYXJjaElzTG9hZGluZzogKGxvYWRpbmc6IGJvb2xlYW4pID0+IHZvaWQsXG4gIGNoYXRJZDogc3RyaW5nLFxuKTogUHJvbWlzZTx7IGhhc1NlYXJjaFJlc3VsdHM6IGJvb2xlYW4gfT4gPT4ge1xuICBsZXQgbGFzdE1lc3NhZ2U6IE1lc3NhZ2UgfCB1bmRlZmluZWQ7XG4gIGxldCBoYXNTZWFyY2hSZXN1bHRzID0gZmFsc2U7XG5cbiAgZm9yIGF3YWl0IChjb25zdCByZXNwb25zZSBvZiBzdHJlYW0pIHtcbiAgICB0cnkge1xuICAgICAgaWYgKG1lc3NhZ2VJbnRlcmNlcHRvci5pbnRlcmNlcHQocmVzcG9uc2UpKSB7XG4gICAgICAgIHJldHVybiB7IGhhc1NlYXJjaFJlc3VsdHMgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWVzc2FnZSA9IG1lc3NhZ2VGcm9tUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHRyYW5zZm9ybSBBUEkgcmVzcG9uc2UgdG8gY2xpZW50IG1lc3NhZ2UnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaCkge1xuICAgICAgICBoYW5kbGVTZWFyY2hSZXN1bHRzKG1lc3NhZ2UpO1xuICAgICAgICBoYXNTZWFyY2hSZXN1bHRzID0gdHJ1ZTtcbiAgICAgICAgc2V0U2VhcmNoSXNMb2FkaW5nKGZhbHNlKTsgLy8gVXBkYXRlIHNlYXJjaCBsb2FkaW5nIGltbWVkaWF0ZWx5IHdoZW4gcmVzdWx0cyBhcmUgZGV0ZWN0ZWRcbiAgICAgIH1cblxuICAgICAgbGFzdE1lc3NhZ2UgPSB1cGRhdGVNZXNzYWdlU3RhdGUobWVzc2FnZSwgbGFzdE1lc3NhZ2UhLCBzZXRNZXNzYWdlcyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgICBgW3NwaWZmeS1haV0gRmFpbGVkIHRvIGdlbmVyYXRlIHJlc3BvbnNlcyBmcm9tIHN0cmVhbSBjaGF0X2lkPSR7Y2hhdElkfWAsXG4gICAgICAgIGVycm9yLFxuICAgICAgICB7XG4gICAgICAgICAgbGFzdFJlc3BvbnNlOiBsYXN0TWVzc2FnZSxcbiAgICAgICAgICByZXNwb25zZSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgaGFzU2VhcmNoUmVzdWx0cyB9O1xufTtcblxuY29uc3QgQ2hhdENvbnRleHRQcm92aWRlciA9ICh7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0Tm9kZSB9KSA9PiB7XG4gIGNvbnN0IGxvZ1BlcmZNZXRyaWMgPSB1c2VTZXRBdG9tKGxvZ1BlcmZNZXRyaWNBdG9tKTtcbiAgY29uc3QgW3dpZGdldEluaXRpYWxpemVkLCBzZXRXaWRnZXRJbml0aWFsaXplZF0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gIGNvbnN0IHNldFVzZXJIYXNSZXBsaWVkID0gdXNlU2V0QXRvbSh1c2VySGFzUmVwbGllZEF0b20pO1xuICAvLyBUT0RPOiBjcmVhdGUgYXRvbXMgZm9yIHNldHRpbmcvZ2V0dGluZyB0aGUgbGFzdCBtZXNzYWdlIHR1cm5cbiAgY29uc3QgW21lc3NhZ2VzLCBzZXRNZXNzYWdlc10gPSB1c2VBdG9tPE1lc3NhZ2VbXVtdPihtZXNzYWdlc0F0b20pO1xuICBjb25zdCBzZXRVc2VyRXZlbnRzID0gdXNlU2V0QXRvbSh1c2VyRXZlbnRzQXRvbSk7XG4gIGNvbnN0IHNldFN1Z2dlc3Rpb25zID0gdXNlU2V0QXRvbShzdWdnZXN0aW9uc0F0b20pO1xuICBjb25zdCBbc3VnZ2VzdGlvbnNMb2FkaW5nLCBzZXRTdWdnZXN0aW9uc0xvYWRpbmddID0gdXNlQXRvbTxib29sZWFuPihzdWdnZXN0aW9uc0xvYWRpbmdBdG9tKTtcbiAgY29uc3QgW3Jlc3BvbnNlU3RyZWFtaW5nLCBzZXRSZXNwb25zZVN0cmVhbWluZ10gPSB1c2VBdG9tPGJvb2xlYW4+KHJlc3BvbnNlU3RyZWFtaW5nQXRvbSk7XG4gIGNvbnN0IHNldFJlcXVlc3RGYWlsdXJlID0gdXNlU2V0QXRvbShyZXF1ZXN0RmFpbHVyZUF0b20pO1xuICBjb25zdCB1c2VyRXZlbnRzID0gdXNlQXRvbVZhbHVlKHVzZXJFdmVudFF1ZXVlQXRvbSk7XG4gIGNvbnN0IHVzZXJRdWV1ZUV2ZW50Q291bnQgPSB1c2VBdG9tVmFsdWUodXNlclF1ZXVlRXZlbnRDb3VudEF0b20pO1xuICBjb25zdCBtYXJrVXNlckV2ZW50c1Byb2Nlc3NlZCA9IHVzZVNldEF0b20ocHJvY2Vzc1VzZXJFdmVudEF0b20pO1xuICBjb25zdCBjbGVhclVzZXJFdmVudFF1ZXVlID0gdXNlU2V0QXRvbShjbGVhclVzZXJFdmVudEF0b20pO1xuICBjb25zdCB1c2VySWQgPSB1c2VBdG9tVmFsdWUodXNlcklkQXRvbSk7XG4gIGNvbnN0IGNoYXRJZCA9IHVzZUF0b21WYWx1ZShjaGF0SWRBdG9tKTtcbiAgY29uc3Qgc3VwcG9ydGVkRXZlbnQgPSB1c2VBdG9tVmFsdWUoc3VwcG9ydGVkRXZlbnRBdG9tKTtcbiAgLy8gVE9ETzogUmVwbGFjZSB3aXRoIGFjdHVhbCBvcmdJZCBmcm9tIHVzZUVudml2ZUNvbmZpZyBvciBOZXdPcmdDb25maWdDb250ZXh0IHdoZW4gYXZhaWxhYmxlXG4gIGNvbnN0IG9yZ0lkID0gJ21vY2stb3JnLWlkJztcblxuICBjb25zdCB2YXJpYW50SW5mbyA9IHVzZUF0b21WYWx1ZSh2YXJpYW50SW5mb0F0b20pO1xuICBjb25zdCBzZXR0aW5nc0NvbnRleHQgPSB1c2VTeXN0ZW1TZXR0aW5nc0NvbnRleHQoKTtcbiAgY29uc3QgbWVzc2FnZUludGVyY2VwdG9yID0gdXNlTWVzc2FnZUludGVyY2VwdG9yKCk7XG4gIGNvbnN0IGhhbmRsZVNlYXJjaFJlc3VsdHMgPSB1c2VTZXRBdG9tKGhhbmRsZVNlYXJjaFJlc3VsdHNBdG9tKTtcbiAgY29uc3Qgc2V0U2VhcmNoSXNMb2FkaW5nID0gdXNlU2V0QXRvbShjaGF0U2VhcmNoSXNMb2FkaW5nQXRvbSk7XG4gIGNvbnN0IHsgdHJhY2sgfSA9IHVzZUFtcGxpdHVkZVRyYWNraW5nKCk7XG5cbiAgY29uc3QgZ2V0U3RyZWFtaW5nUmVzcG9uc2VzID0gdXNlQ2FsbGJhY2soXG4gICAgYXN5bmMgKHBheWxvYWQ6IE5leHRNZXNzYWdlUmVxdWVzdCk6IFByb21pc2U8eyBoYXNTZWFyY2hSZXN1bHRzOiBib29sZWFuIH0+ID0+IHtcbiAgICAgIGxvZ1BlcmZNZXRyaWMoUGVyZk1ldHJpY3NFdmVudHMuRmlyc3RSZXNwb25zZVN0YXJ0ZWQpO1xuICAgICAgY29uc3Qgc3RyZWFtID0gQ29tbWVyY2VBcGlDbGllbnQuZ2V0TmV4dFJlc3BvbnNlU3RyZWFtaW5nKHBheWxvYWQpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBzZXRSZXF1ZXN0RmFpbHVyZShmYWxzZSk7XG5cbiAgICAgICAgY29uc3QgeyBoYXNTZWFyY2hSZXN1bHRzIH0gPSBhd2FpdCBwcm9jZXNzU3RyZWFtaW5nUmVzcG9uc2UoXG4gICAgICAgICAgc3RyZWFtLFxuICAgICAgICAgIG1lc3NhZ2VJbnRlcmNlcHRvcixcbiAgICAgICAgICBoYW5kbGVTZWFyY2hSZXN1bHRzLFxuICAgICAgICAgIHNldE1lc3NhZ2VzLFxuICAgICAgICAgIHNldFNlYXJjaElzTG9hZGluZyxcbiAgICAgICAgICBjaGF0SWQsXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHsgaGFzU2VhcmNoUmVzdWx0cyB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBoYW5kbGVTdHJlYW1pbmdFcnJvcihlLCBzZXRSZXF1ZXN0RmFpbHVyZSwgc2V0TWVzc2FnZXMpO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgbG9nUGVyZk1ldHJpYyhQZXJmTWV0cmljc0V2ZW50cy5GaXJzdFJlc3BvbnNlQ29tcGxldGVkKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIGxvZ1BlcmZNZXRyaWMsXG4gICAgICBzZXRSZXF1ZXN0RmFpbHVyZSxcbiAgICAgIG1lc3NhZ2VJbnRlcmNlcHRvcixcbiAgICAgIGhhbmRsZVNlYXJjaFJlc3VsdHMsXG4gICAgICBzZXRNZXNzYWdlcyxcbiAgICAgIHNldFNlYXJjaElzTG9hZGluZyxcbiAgICAgIGNoYXRJZCxcbiAgICBdLFxuICApO1xuXG4gIGNvbnN0IGdldFN1Z2dlc3Rpb25zID0gdXNlQ2FsbGJhY2soYXN5bmMgKCkgPT4ge1xuICAgIGxvZ1BlcmZNZXRyaWMoUGVyZk1ldHJpY3NFdmVudHMuRmlyc3RTdWdnZXN0aW9uc1N0YXJ0ZWQpO1xuICAgIHNldFN1Z2dlc3Rpb25zTG9hZGluZyh0cnVlKTtcbiAgICBzZXRTdWdnZXN0aW9ucyhbXSk7XG5cbiAgICBjb25zdCBwYXlsb2FkV2l0aG91dEFwcExvYWRlZCA9IGNyZWF0ZVJlc3BvbnNlUGF5bG9hZCh7XG4gICAgICB1c2VyRXZlbnRzOiBbXSxcbiAgICAgIGdlbmVyYXRpb25QYXJhbXM6IHNldHRpbmdzQ29udGV4dC5nZW5lcmF0aW9uUGFyYW1zLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0TmV4dFN1Z2dlc3Rpb25zKHBheWxvYWRXaXRob3V0QXBwTG9hZGVkKTtcblxuICAgIC8vIHNvcnQgdGhlIHN1Z2dlc3Rpb25zIGJ5IHNob3J0ZXN0IGxlbmd0aCBzbyB0aGUgcGlsbHMgY2FuIGJlIHN0YWNrZWQgaG9yaXpvbnRhbGx5XG4gICAgc2V0U3VnZ2VzdGlvbnMocmVzcG9uc2Uuc29ydCgoYSwgYikgPT4gYS5jb250ZW50Lmxlbmd0aCAtIGIuY29udGVudC5sZW5ndGgpKTtcbiAgICBzZXRTdWdnZXN0aW9uc0xvYWRpbmcoZmFsc2UpO1xuICAgIGxvZ1BlcmZNZXRyaWMoUGVyZk1ldHJpY3NFdmVudHMuRmlyc3RTdWdnZXN0aW9uc0NvbXBsZXRlZCk7XG4gIH0sIFtsb2dQZXJmTWV0cmljLCBzZXRTdWdnZXN0aW9uc0xvYWRpbmcsIHNldFN1Z2dlc3Rpb25zLCBzZXR0aW5nc0NvbnRleHQuZ2VuZXJhdGlvblBhcmFtc10pO1xuXG4gIGNvbnN0IGdldFJlc3BvbnNlcyA9IHVzZUNhbGxiYWNrKFxuICAgIGFzeW5jIChwYXlsb2FkPzogTmV4dE1lc3NhZ2VSZXF1ZXN0KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXF1ZXN0UGF5bG9hZCA9XG4gICAgICAgICAgcGF5bG9hZCA/P1xuICAgICAgICAgIGNyZWF0ZVJlc3BvbnNlUGF5bG9hZCh7XG4gICAgICAgICAgICB1c2VyRXZlbnRzLFxuICAgICAgICAgICAgZ2VuZXJhdGlvblBhcmFtczogc2V0dGluZ3NDb250ZXh0LmdlbmVyYXRpb25QYXJhbXMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgc2V0UmVzcG9uc2VTdHJlYW1pbmcodHJ1ZSk7XG4gICAgICAgIHNldFN1Z2dlc3Rpb25zKFtdKTtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lTXMgPSBEYXRlLm5vdygpO1xuXG4gICAgICAgIGF3YWl0IGdldFN0cmVhbWluZ1Jlc3BvbnNlcyhyZXF1ZXN0UGF5bG9hZCk7XG5cbiAgICAgICAgcmVjb3JkQXNzaXN0YW50UmVzcG9uc2Uoc3RhcnRUaW1lTXMsIHJlcXVlc3RQYXlsb2FkLCB0cmFjayk7XG4gICAgICAgIGF3YWl0IGdldFN1Z2dlc3Rpb25zKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBMb2dnZXIubG9nRXJyb3IoJ1tzcGlmZnktYWldIGdldFJlc3BvbnNlcyBlcnJvcicsIGVycm9yKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIC8vIFJlbW92ZSBzZWFyY2ggbG9hZGluZyBtYW5hZ2VtZW50IGZyb20gaGVyZSAtIGl0J3Mgbm93IGhhbmRsZWQgaW5kZXBlbmRlbnRseVxuICAgICAgICAvLyBpbiB0aGUgcHJvY2Vzc1N0cmVhbWluZ1Jlc3BvbnNlIGZ1bmN0aW9uIHdoZW4gc2VhcmNoIHJlc3VsdHMgYXJlIGRldGVjdGVkXG4gICAgICAgIG1hcmtVc2VyRXZlbnRzUHJvY2Vzc2VkKHVzZXJFdmVudHMubWFwKCh7IGV2ZW50SWQgfSkgPT4gZXZlbnRJZCkpO1xuICAgICAgICBzZXRVc2VySGFzUmVwbGllZChmYWxzZSk7XG4gICAgICAgIHNldFJlc3BvbnNlU3RyZWFtaW5nKGZhbHNlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFtcbiAgICAgIHVzZXJFdmVudHMsXG4gICAgICBzZXR0aW5nc0NvbnRleHQuZ2VuZXJhdGlvblBhcmFtcyxcbiAgICAgIHNldFJlc3BvbnNlU3RyZWFtaW5nLFxuICAgICAgc2V0U3VnZ2VzdGlvbnMsXG4gICAgICBnZXRTdHJlYW1pbmdSZXNwb25zZXMsXG4gICAgICBtYXJrVXNlckV2ZW50c1Byb2Nlc3NlZCxcbiAgICAgIGdldFN1Z2dlc3Rpb25zLFxuICAgICAgc2V0VXNlckhhc1JlcGxpZWQsXG4gICAgICB0cmFjayxcbiAgICBdLFxuICApO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgcHJvY2Vzc1VzZXJFdmVudHMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAocmVzcG9uc2VTdHJlYW1pbmcgfHwgIXdpZGdldEluaXRpYWxpemVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICAodmFyaWFudEluZm8udmFyaWFudCA9PT0gJ3BkcCcgJiYgIXZhcmlhbnRJbmZvLnByb2R1Y3RJZCkgfHxcbiAgICAgICAgKHZhcmlhbnRJbmZvLnZhcmlhbnQgPT09ICdwbHAnICYmICF2YXJpYW50SW5mby5wbHBJZCkgfHxcbiAgICAgICAgKHZhcmlhbnRJbmZvLnZhcmlhbnQgPT09ICdwYWdlX3Zpc2l0JyAmJiAhdmFyaWFudEluZm8udXJsKVxuICAgICAgKSB7XG4gICAgICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gdmFyaWFudEluZm8gaGFzIGludmFsaWQgdmFsdWVzLCBza2lwcGluZy4uLicsIHtcbiAgICAgICAgICB2YXJpYW50SW5mbyxcbiAgICAgICAgICBzdXBwb3J0ZWRFdmVudCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgICBgQXNzaXN0YW50cyBUdXJuIGlzX2N1cnJlbnRseV9zdHJlYW1pbmc9JHtyZXNwb25zZVN0cmVhbWluZ30gaW5pdGlhbGl6ZWQ9JHt3aWRnZXRJbml0aWFsaXplZH1gLFxuICAgICAgKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGdldFJlc3BvbnNlcygpO1xuICAgICAgICBMb2dnZXIubG9nSW5mbyhgQXNzaXN0YW50cyBUdXJuIFtmaW5pc2hlZF1gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgIExvZ2dlci5sb2dFcnJvcignW3NwaWZmeS1haV0gQXNzaXN0YW50cyBUdXJuIGVycm9yJywgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgaWYgKHVzZXJRdWV1ZUV2ZW50Q291bnQgPiAwKSB7XG4gICAgICBwcm9jZXNzVXNlckV2ZW50cygpO1xuICAgIH1cbiAgfSwgW1xuICAgIGdldFJlc3BvbnNlcyxcbiAgICByZXNwb25zZVN0cmVhbWluZyxcbiAgICB1c2VyUXVldWVFdmVudENvdW50LFxuICAgIHdpZGdldEluaXRpYWxpemVkLFxuICAgIHZhcmlhbnRJbmZvLFxuICAgIHN1cHBvcnRlZEV2ZW50LFxuICBdKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh3aWRnZXRJbml0aWFsaXplZCB8fCByZXNwb25zZVN0cmVhbWluZykge1xuICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgICBgW3NwaWZmeS1haV0gaW5pdGlhbGl6ZVdpZGdldCBbc2tpcHBlZF0gaXNfY3VycmVudGx5X3N0cmVhbWluZz0ke3Jlc3BvbnNlU3RyZWFtaW5nfSBpc19pbml0aWFsaXplZD0ke3dpZGdldEluaXRpYWxpemVkfWAsXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGh5ZHJhdGVDaGF0ID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgICAgIGBbc3BpZmZ5LWFpXSBpbml0aWFsaXplV2lkZ2V0IGlzX2N1cnJlbnRseV9zdHJlYW1pbmc9JHtyZXNwb25zZVN0cmVhbWluZ30gaXNfaW5pdGlhbGl6ZWQ9JHt3aWRnZXRJbml0aWFsaXplZH1gLFxuICAgICAgICApO1xuICAgICAgICAvLyBvbiBtb3VudCwgdHJ5IHRvIGdldCB0aGUgcmVzcG9uc2VzIGZyb20gYW4gYWN0aXZlIHNlc3Npb24gaWYgb25lIGV4aXN0c1xuICAgICAgICBpZiAoIW9yZ0lkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcmdJZCBpcyBub3QgYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBtZXNzYWdlczogZXhpc3RpbmdNZXNzYWdlcywgdXNlckV2ZW50cyB9ID0gYXdhaXQgQ29tbWVyY2VBcGlDbGllbnQuZ2V0UmVzcG9uc2VzKFxuICAgICAgICAgIG9yZ0lkLFxuICAgICAgICAgIGNoYXRJZCxcbiAgICAgICAgICB1c2VySWQsXG4gICAgICAgICk7XG4gICAgICAgIHNldE1lc3NhZ2VzKFsuLi5leGlzdGluZ01lc3NhZ2VzXSk7XG4gICAgICAgIHNldFVzZXJFdmVudHMoWy4uLnVzZXJFdmVudHNdKTtcbiAgICAgICAgZ2V0UmVzcG9uc2VzKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBubyBhY3RpdmUgY2hhdCBzZXNzaW9uIHdhcyBmb3VuZCwgc3RhcnQgYSBuZXcgb25lXG4gICAgICAgIExvZ2dlci5sb2dJbmZvKGBJbml0IGNoYXQgW2V4Y2VwdGlvbl0gY2hhdF9pZD0ke2NoYXRJZH0gZXJyb3I9JHtlcnJvcn1gLCBlcnJvcik7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFNlc3Npb25SZXN0YXJ0UmVxdWlyZWQpIHtcbiAgICAgICAgICBjb25zdCBhcHBMb2FkZWRFdmVudCA9IGNyZWF0ZUFwcExvYWRlZEV2ZW50KCk7XG4gICAgICAgICAgY29uc3QgdmlzaXRFdmVudCA9IGNyZWF0ZVZpc2l0VXNlckV2ZW50KHsgdmFyaWFudEluZm8gfSk7XG4gICAgICAgICAgc2V0TWVzc2FnZXMoW10pO1xuICAgICAgICAgIGNsZWFyVXNlckV2ZW50UXVldWUoKTtcbiAgICAgICAgICBpZiAodmlzaXRFdmVudCkge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IGNyZWF0ZVJlc3BvbnNlUGF5bG9hZCh7XG4gICAgICAgICAgICAgIHVzZXJFdmVudHM6IFthcHBMb2FkZWRFdmVudCwgdmlzaXRFdmVudF0sXG4gICAgICAgICAgICAgIGdlbmVyYXRpb25QYXJhbXM6IHNldHRpbmdzQ29udGV4dC5nZW5lcmF0aW9uUGFyYW1zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBnZXRSZXNwb25zZXMocGF5bG9hZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBzZXRXaWRnZXRJbml0aWFsaXplZCh0cnVlKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaHlkcmF0ZUNoYXQoKTtcbiAgfSwgW10pO1xuXG4gIGNvbnN0IG9uRm9jdXMgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghcmVzcG9uc2VTdHJlYW1pbmcgJiYgIXN1Z2dlc3Rpb25zTG9hZGluZyAmJiBvcmdJZCkge1xuICAgICAgICBjb25zdCB7IG1lc3NhZ2VzOiBleGlzdGluZ01lc3NhZ2VzIH0gPSBhd2FpdCBDb21tZXJjZUFwaUNsaWVudC5nZXRSZXNwb25zZXMoXG4gICAgICAgICAgb3JnSWQsXG4gICAgICAgICAgY2hhdElkLFxuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZXhpc3RpbmdNZXNzYWdlcy5sZW5ndGggPiBtZXNzYWdlcy5sZW5ndGgpIHtcbiAgICAgICAgICBzZXRNZXNzYWdlcyhbLi4uZXhpc3RpbmdNZXNzYWdlc10pO1xuICAgICAgICAgIC8vIFRPRE86IElzIHRoaXMgYnVnIGhhY2sgc3RpbGwgbmVjZXNzYXJ5P1xuICAgICAgICAgIC8vIElmIGl0IGlzLCBjb21lIHVwIHdpdGggYSBiZXR0ZXIgc29sdXRpb24gZm9yIGl0XG4gICAgICAgICAgLy8gfSBlbHNlIGlmIChleGlzdGluZ01lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIC8vICAgLy8gaWYgdGhlcmUgd2FzIGFuIGVycm9yIGR1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24gb2YgYSBuZXcgc2Vzc2lvbiwgdGhlIHNlc3Npb24gd291bGQgYmVcbiAgICAgICAgICAvLyAgIC8vIGNyZWF0ZWQgaW4gdGhlIGJhY2tlbmQgYnV0IHdpdGhvdXQgYW55IG1lc3NhZ2VzLiBSZXRyeSB0aGUgbmV4dF9yZXNwb25zZXMgcmVxdWVzdCB3aXRoXG4gICAgICAgICAgLy8gICAvLyB0aGUgY3VycmVudCBzZXQgb2YgcGFyYW1ldGVycyB0byBcImp1bXBzdGFydFwiIHRoZSBzZXNzaW9uXG4gICAgICAgICAgLy8gICB0cmlnZ2VyR2V0UmVzcG9uc2VDYWxsKCdvbkZvY3VzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgTG9nZ2VyLmxvZ0Vycm9yKCdbc3BpZmZ5LWFpXSBvbkZvY3VzIGVycm9yJywgZXJyb3IpO1xuICAgIH1cbiAgfSwgW3Jlc3BvbnNlU3RyZWFtaW5nLCBzdWdnZXN0aW9uc0xvYWRpbmcsIG9yZ0lkLCBjaGF0SWQsIHVzZXJJZCwgbWVzc2FnZXMubGVuZ3RoLCBzZXRNZXNzYWdlc10pO1xuXG4gIC8vIGxpc3RlbiBmb3IgcGFnZSBmb2N1cyB0byBnZXQgbGF0ZXN0IG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlclxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIG9uRm9jdXMpO1xuXG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIG9uRm9jdXMpO1xuICAgIH07XG4gIH0sIFtvbkZvY3VzXSk7XG5cbiAgY29uc3QgY2hhdENvbnRleHQgPSB1c2VNZW1vKCgpID0+ICh7fSksIFtdKTtcblxuICByZXR1cm4gPENoYXRDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXtjaGF0Q29udGV4dH0+e2NoaWxkcmVufTwvQ2hhdENvbnRleHQuUHJvdmlkZXI+O1xufTtcblxuZXhwb3J0IHsgQ2hhdENvbnRleHQsIENoYXRDb250ZXh0UHJvdmlkZXIgfTtcbmV4cG9ydCB0eXBlIHsgQ2hhdENvbnRleHRQYXJhbXMgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3REEsTUFBTSwyQkFDSixhQUNBLFNBQ0EsVUFDRztDQUNILE1BQU0sWUFBWSxjQUFjO0NBQ2hDLE1BQU0sWUFBWSxVQUFVLElBQUksU0FBUztDQUN6QyxNQUFNLGtCQUFrQixVQUFVLElBQUksb0JBQW9CO0NBQzFELE1BQU0saUJBQWlCLFVBQVUsSUFBSSxtQkFBbUI7Q0FDeEQsTUFBTSxxQkFBcUIsVUFBVSxJQUFJLDZCQUE2QjtDQUN0RSxNQUFNLDBCQUEwQjtFQUFFLE9BQU87RUFBYSxLQUFLLEtBQUssS0FBSztFQUFFO0NBQ3ZFLElBQUlBO0FBRUosS0FDRSxVQUFVLHVCQUF1QixrQkFBa0IscUJBQ25ELFVBQVUsV0FFVixxQkFBb0IsVUFBVSxXQUFXO1VBQ2hDLFVBQVUsYUFBYSxVQUFVLFVBQVUsU0FBUyxFQUM3RCxxQkFBb0IsVUFBVTtDQUdoQyxNQUFNQyxhQUFzQztFQUMxQyxrQkFBa0Isd0JBQXdCLE1BQU0sd0JBQXdCO0VBQ3hFLGlCQUFpQixVQUFVO0VBQzNCLFlBQVk7RUFDYjtBQUVELEtBQUksVUFBVSx1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
@@ -1,4 +0,0 @@
1
- const require_chatContext = require('./chatContext.cjs');
2
-
3
- exports.ChatContext = require_chatContext.ChatContext;
4
- exports.ChatContextProvider = require_chatContext.ChatContextProvider;
@@ -1,2 +0,0 @@
1
- import { ChatContext, ChatContextParams, ChatContextProvider } from "./chatContext.cjs";
2
- export { ChatContext, ChatContextParams, ChatContextProvider };
@@ -1,2 +0,0 @@
1
- import { ChatContext, ChatContextParams, ChatContextProvider } from "./chatContext.js";
2
- export { ChatContext, ChatContextParams, ChatContextProvider };
@@ -1,3 +0,0 @@
1
- import { ChatContext, ChatContextProvider } from "./chatContext.js";
2
-
3
- export { ChatContext, ChatContextProvider };