@projectcor/maia-components 2.11.103-5 → 2.11.103-7

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 (72) hide show
  1. package/lib/App.js +19 -44
  2. package/lib/components/atoms/MAIAInput/MAIAInput.js +6 -1
  3. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.js +20 -0
  4. package/lib/components/atoms/SessionGeneratingDot/SessionGeneratingDot.styles.js +20 -0
  5. package/lib/components/atoms/SessionGeneratingDot/index.js +2 -0
  6. package/lib/components/atoms/icons/MaiaSparkleIcon.js +75 -0
  7. package/lib/components/atoms/icons/index.js +2 -1
  8. package/lib/components/index.js +1 -2
  9. package/lib/components/molecules/AbmSection/AbmAccessibilitySection/AbmAccessibilitySection.js +4 -91
  10. package/lib/components/molecules/ChatAIMessages/ChatAIMessages.js +46 -7
  11. package/lib/components/molecules/ChatAIModal/ChatAIModal.js +311 -69
  12. package/lib/components/molecules/ChatAIModal/ChatAIModal.styles.js +28 -18
  13. package/lib/components/molecules/ChatAIModal/components/ChatAiModalFooter/ChatAiModalFooter.js +9 -2
  14. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.js +69 -61
  15. package/lib/components/molecules/ChatAIModal/components/ChatAiModalHeader/ChatAiModalHeader.styles.js +5 -1
  16. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.js +66 -0
  17. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/MaiaMinimizedPill.styles.js +55 -0
  18. package/lib/components/molecules/ChatAIModal/components/MaiaMinimizedPill/index.js +2 -0
  19. package/lib/components/molecules/ChatFooter/ChatFooter.js +4 -2
  20. package/lib/components/molecules/Sidebar/Sidebar.js +104 -61
  21. package/lib/components/molecules/Sidebar/Sidebar.layout.styles.js +16 -1
  22. package/lib/components/molecules/Sidebar/Sidebar.styles.js +30 -29
  23. package/lib/components/organisms/AbmAgentModal/AbmAgentModal.js +6 -35
  24. package/lib/components/organisms/ChatAI/ChatAI.js +131 -40
  25. package/lib/context/global-context.js +3 -1
  26. package/lib/hooks/useAgentModel/useCreateAgent.js +14 -61
  27. package/lib/hooks/useAgentModel/useUpdateAgent.js +11 -58
  28. package/lib/hooks/useChatManager/useChatManager.js +530 -438
  29. package/lib/hooks/useChatMessages/useChatMessages.js +427 -236
  30. package/lib/hooks/useChats/useChats.js +21 -4
  31. package/lib/hooks/useEvent.js +1 -2
  32. package/lib/hooks/useMinimizedPillBottomOffset.js +110 -0
  33. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.interface.js +1 -1
  34. package/lib/hooks/useOrchestratorStream/useOrchestratorStream.js +139 -521
  35. package/lib/hooks/useStreamingMessage/index.js +2 -3
  36. package/lib/hooks/useStreamingMessage/useStreamingMessage.js +13 -17
  37. package/lib/index.js +2 -5
  38. package/lib/lang/br/index.js +11 -9
  39. package/lib/lang/en/index.js +11 -9
  40. package/lib/lang/es/index.js +11 -9
  41. package/lib/lang/fr/index.js +13 -10
  42. package/lib/services/maia/Chats/getChatsByUserId.js +6 -4
  43. package/lib/services/maia/Chats/index.js +3 -1
  44. package/lib/services/maia/Chats/markSessionAsRead.js +32 -0
  45. package/lib/store/chatsSidebarOptimistic.js +92 -0
  46. package/lib/store/chatsStore.types.js +1 -1
  47. package/lib/store/maiaMinimizedPersistence.js +49 -0
  48. package/lib/store/sessions/activeView.js +22 -0
  49. package/lib/store/sessions/index.js +9 -0
  50. package/lib/store/sessions/sessionHitlContext.js +15 -0
  51. package/lib/store/sessions/sessionNotificationSound.js +57 -0
  52. package/lib/store/sessions/sessionNotifications.js +110 -0
  53. package/lib/store/sessions/sessionNotifications.types.js +2 -0
  54. package/lib/store/sessions/sessionStreamManager.js +576 -0
  55. package/lib/store/sessions/sessionStreamingText.js +80 -0
  56. package/lib/store/sessions/sessions.types.js +35 -0
  57. package/lib/store/sessions/useSessionMeta.js +39 -0
  58. package/lib/store/sessions/useSessionStreamingText.js +18 -0
  59. package/lib/store/sessions/useSessionsStore.js +197 -0
  60. package/lib/store/useChatsStore.js +149 -12
  61. package/lib/types/Chat.js +1 -1
  62. package/lib/types/agentModal.js +1 -1
  63. package/lib/utils/formatUnreadCount.js +6 -0
  64. package/lib/utils/maiaHostOpen.js +54 -0
  65. package/lib/utils/normalizeAgentConnectors.js +3 -28
  66. package/package.json +3 -3
  67. package/lib/components/organisms/ChatAIPage/ChatAIPage.js +0 -543
  68. package/lib/components/organisms/ChatAIPage/ChatAIPage.styles.js +0 -16
  69. package/lib/components/organisms/ChatAIPage/index.js +0 -3
  70. package/lib/dev/DevMaiaPage.js +0 -30
  71. package/lib/hooks/useStreamingMessage/streamingStore.js +0 -69
  72. package/lib/services/maia/Agents/connectors.js +0 -250
@@ -1,16 +0,0 @@
1
- import styled from 'styled-components';
2
-
3
- /** Contenedor del host (COR content-wrapper o dev full viewport). Debe tener altura explícita. */
4
- export var SCPageHost = styled.div.withConfig({
5
- displayName: "ChatAIPagestyles__SCPageHost",
6
- componentId: "sc-1qi3lp8-0"
7
- })(["width:100%;height:100%;min-height:0;overflow:hidden;"]);
8
- export var SCPageWrapper = styled.div.withConfig({
9
- displayName: "ChatAIPagestyles__SCPageWrapper",
10
- componentId: "sc-1qi3lp8-1"
11
- })(["width:100%;height:100%;min-height:0;display:flex;overflow:hidden;font-family:'Work Sans',sans-serif;"]);
12
- export var SCPageMain = styled.div.withConfig({
13
- displayName: "ChatAIPagestyles__SCPageMain",
14
- componentId: "sc-1qi3lp8-2"
15
- })(["flex:1;min-width:0;min-height:0;display:flex;flex-direction:column;overflow:hidden;background:white;"]);
16
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzdHlsZWQiLCJTQ1BhZ2VIb3N0IiwiZGl2Iiwid2l0aENvbmZpZyIsImRpc3BsYXlOYW1lIiwiY29tcG9uZW50SWQiLCJTQ1BhZ2VXcmFwcGVyIiwiU0NQYWdlTWFpbiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL29yZ2FuaXNtcy9DaGF0QUlQYWdlL0NoYXRBSVBhZ2Uuc3R5bGVzLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc3R5bGVkIGZyb20gJ3N0eWxlZC1jb21wb25lbnRzJ1xuXG4vKiogQ29udGVuZWRvciBkZWwgaG9zdCAoQ09SIGNvbnRlbnQtd3JhcHBlciBvIGRldiBmdWxsIHZpZXdwb3J0KS4gRGViZSB0ZW5lciBhbHR1cmEgZXhwbMOtY2l0YS4gKi9cbmV4cG9ydCBjb25zdCBTQ1BhZ2VIb3N0ID0gc3R5bGVkLmRpdmBcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgbWluLWhlaWdodDogMDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbmBcblxuZXhwb3J0IGNvbnN0IFNDUGFnZVdyYXBwZXIgPSBzdHlsZWQuZGl2YFxuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtaW4taGVpZ2h0OiAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBmb250LWZhbWlseTogJ1dvcmsgU2FucycsIHNhbnMtc2VyaWY7XG5gXG5cbmV4cG9ydCBjb25zdCBTQ1BhZ2VNYWluID0gc3R5bGVkLmRpdmBcbiAgZmxleDogMTtcbiAgbWluLXdpZHRoOiAwO1xuICBtaW4taGVpZ2h0OiAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBvdmVyZmxvdzogaGlkZGVuO1xuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbmBcbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLG1CQUFtQjs7QUFFdEM7QUFDQSxPQUFPLElBQU1DLFVBQVUsR0FBR0QsTUFBTSxDQUFDRSxHQUFHLENBQUFDLFVBQUE7RUFBQUMsV0FBQTtFQUFBQyxXQUFBO0FBQUEsNERBS25DO0FBRUQsT0FBTyxJQUFNQyxhQUFhLEdBQUdOLE1BQU0sQ0FBQ0UsR0FBRyxDQUFBQyxVQUFBO0VBQUFDLFdBQUE7RUFBQUMsV0FBQTtBQUFBLDRHQU90QztBQUVELE9BQU8sSUFBTUUsVUFBVSxHQUFHUCxNQUFNLENBQUNFLEdBQUcsQ0FBQUMsVUFBQTtFQUFBQyxXQUFBO0VBQUFDLFdBQUE7QUFBQSw0R0FRbkMiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -1,3 +0,0 @@
1
- export { ChatAIPage } from './ChatAIPage';
2
- export { SCPageHost } from './ChatAIPage.styles';
3
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDaGF0QUlQYWdlIiwiU0NQYWdlSG9zdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL29yZ2FuaXNtcy9DaGF0QUlQYWdlL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IENoYXRBSVBhZ2UgfSBmcm9tICcuL0NoYXRBSVBhZ2UnXG5leHBvcnQgdHlwZSB7IENoYXRBSVBhZ2VQcm9wcyB9IGZyb20gJy4vQ2hhdEFJUGFnZSdcbmV4cG9ydCB7IFNDUGFnZUhvc3QgfSBmcm9tICcuL0NoYXRBSVBhZ2Uuc3R5bGVzJ1xuIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxVQUFVLFFBQVEsY0FBYztBQUV6QyxTQUFTQyxVQUFVLFFBQVEscUJBQXFCIiwiaWdub3JlTGlzdCI6W119
@@ -1,30 +0,0 @@
1
- import { ChatAIPage } from '../components/organisms/ChatAIPage';
2
- import { SCPageHost } from '../components/organisms/ChatAIPage/ChatAIPage.styles';
3
- import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
4
- export var DevMaiaPage = function DevMaiaPage() {
5
- return /*#__PURE__*/_jsxs(_Fragment, {
6
- children: [/*#__PURE__*/_jsx("div", {
7
- id: "abm-agent-modal"
8
- }), /*#__PURE__*/_jsx("div", {
9
- id: "snackbar-portal-maia-chat-agent"
10
- }), /*#__PURE__*/_jsx("div", {
11
- id: "emoji-picker-container"
12
- }), /*#__PURE__*/_jsx("div", {
13
- id: "emoji-picker-container-maia-chat-agent"
14
- }), /*#__PURE__*/_jsx("div", {
15
- id: "modal-portal-video-onboarding"
16
- }), /*#__PURE__*/_jsx(SCPageHost, {
17
- style: {
18
- height: '100vh'
19
- },
20
- children: /*#__PURE__*/_jsx(ChatAIPage, {
21
- section: "header",
22
- entity: {
23
- projectId: null,
24
- clientId: null
25
- }
26
- })
27
- })]
28
- });
29
- };
30
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDaGF0QUlQYWdlIiwiU0NQYWdlSG9zdCIsImpzeCIsIl9qc3giLCJGcmFnbWVudCIsIl9GcmFnbWVudCIsImpzeHMiLCJfanN4cyIsIkRldk1haWFQYWdlIiwiY2hpbGRyZW4iLCJpZCIsInN0eWxlIiwiaGVpZ2h0Iiwic2VjdGlvbiIsImVudGl0eSIsInByb2plY3RJZCIsImNsaWVudElkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Rldi9EZXZNYWlhUGFnZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhdEFJUGFnZSB9IGZyb20gJy4uL2NvbXBvbmVudHMvb3JnYW5pc21zL0NoYXRBSVBhZ2UnXG5pbXBvcnQgeyBTQ1BhZ2VIb3N0IH0gZnJvbSAnLi4vY29tcG9uZW50cy9vcmdhbmlzbXMvQ2hhdEFJUGFnZS9DaGF0QUlQYWdlLnN0eWxlcydcblxuZXhwb3J0IGNvbnN0IERldk1haWFQYWdlID0gKCkgPT4gKFxuICA8PlxuICAgIDxkaXYgaWQ9XCJhYm0tYWdlbnQtbW9kYWxcIiAvPlxuICAgIDxkaXYgaWQ9XCJzbmFja2Jhci1wb3J0YWwtbWFpYS1jaGF0LWFnZW50XCIgLz5cbiAgICA8ZGl2IGlkPVwiZW1vamktcGlja2VyLWNvbnRhaW5lclwiIC8+XG4gICAgPGRpdiBpZD1cImVtb2ppLXBpY2tlci1jb250YWluZXItbWFpYS1jaGF0LWFnZW50XCIgLz5cbiAgICA8ZGl2IGlkPVwibW9kYWwtcG9ydGFsLXZpZGVvLW9uYm9hcmRpbmdcIiAvPlxuICAgIDxTQ1BhZ2VIb3N0IHN0eWxlPXt7IGhlaWdodDogJzEwMHZoJyB9fT5cbiAgICAgIDxDaGF0QUlQYWdlIHNlY3Rpb249XCJoZWFkZXJcIiBlbnRpdHk9e3sgcHJvamVjdElkOiBudWxsLCBjbGllbnRJZDogbnVsbCB9fSAvPlxuICAgIDwvU0NQYWdlSG9zdD5cbiAgPC8+XG4pXG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLFVBQVUsUUFBUSxvQ0FBb0M7QUFDL0QsU0FBU0MsVUFBVSxRQUFRLHNEQUFzRDtBQUFBLFNBQUFDLEdBQUEsSUFBQUMsSUFBQSxFQUFBQyxRQUFBLElBQUFDLFNBQUEsRUFBQUMsSUFBQSxJQUFBQyxLQUFBO0FBRWpGLE9BQU8sSUFBTUMsV0FBVyxHQUFHLFNBQWRBLFdBQVdBLENBQUE7RUFBQSxvQkFDdEJELEtBQUEsQ0FBQUYsU0FBQTtJQUFBSSxRQUFBLGdCQUNFTixJQUFBO01BQUtPLEVBQUUsRUFBQztJQUFpQixDQUFFLENBQUMsZUFDNUJQLElBQUE7TUFBS08sRUFBRSxFQUFDO0lBQWlDLENBQUUsQ0FBQyxlQUM1Q1AsSUFBQTtNQUFLTyxFQUFFLEVBQUM7SUFBd0IsQ0FBRSxDQUFDLGVBQ25DUCxJQUFBO01BQUtPLEVBQUUsRUFBQztJQUF3QyxDQUFFLENBQUMsZUFDbkRQLElBQUE7TUFBS08sRUFBRSxFQUFDO0lBQStCLENBQUUsQ0FBQyxlQUMxQ1AsSUFBQSxDQUFDRixVQUFVO01BQUNVLEtBQUssRUFBRTtRQUFFQyxNQUFNLEVBQUU7TUFBUSxDQUFFO01BQUFILFFBQUEsZUFDckNOLElBQUEsQ0FBQ0gsVUFBVTtRQUFDYSxPQUFPLEVBQUMsUUFBUTtRQUFDQyxNQUFNLEVBQUU7VUFBRUMsU0FBUyxFQUFFLElBQUk7VUFBRUMsUUFBUSxFQUFFO1FBQUs7TUFBRSxDQUFFO0lBQUMsQ0FDbEUsQ0FBQztFQUFBLENBQ2IsQ0FBQztBQUFBLENBQ0oiLCJpZ25vcmVMaXN0IjpbXX0=
@@ -1,69 +0,0 @@
1
- /**
2
- * Store externo (module-level) para el mensaje actualmente en streaming.
3
- *
4
- * Desacopla el texto del stream del array de `messages` de React: durante
5
- * el streaming, el texto se mantiene acá y solo los componentes suscritos
6
- * (vía `useStreamingMessage` / `useSyncExternalStore`) re-renderizan cuando
7
- * cambia. El array `messages` no se muta en cada token, evitando ráfagas
8
- * de re-renders del padre y ejecuciones innecesarias de useEffects.
9
- */
10
-
11
- var snapshot = {
12
- id: null,
13
- text: ''
14
- };
15
- var listeners = new Set();
16
- var emitChange = function emitChange() {
17
- listeners.forEach(function (listener) {
18
- listener();
19
- });
20
- };
21
- export var streamingStore = {
22
- /** Inicia una nueva sesión de streaming para el mensaje con este id. */start: function start(id) {
23
- snapshot = {
24
- id: id,
25
- text: ''
26
- };
27
- emitChange();
28
- },
29
- /** Setea el texto del mensaje en streaming. Solo aplica si el id coincide. */setText: function setText(id, text) {
30
- if (snapshot.id !== id) {
31
- snapshot = {
32
- id: id,
33
- text: text
34
- };
35
- } else if (snapshot.text !== text) {
36
- snapshot = {
37
- id: id,
38
- text: text
39
- };
40
- } else {
41
- return;
42
- }
43
- emitChange();
44
- },
45
- /** Limpia el estado de streaming (fin de stream, error o aprobación). */clear: function clear() {
46
- if (snapshot.id == null && snapshot.text === '') return;
47
- snapshot = {
48
- id: null,
49
- text: ''
50
- };
51
- emitChange();
52
- },
53
- /** API para useSyncExternalStore. */subscribe: function subscribe(listener) {
54
- listeners.add(listener);
55
- return function () {
56
- listeners["delete"](listener);
57
- };
58
- },
59
- /** Snapshot referencialmente estable mientras no haya cambios. */getSnapshot: function getSnapshot() {
60
- return snapshot;
61
- },
62
- /** Server snapshot (SSR): siempre vacío. */getServerSnapshot: function getServerSnapshot() {
63
- return {
64
- id: null,
65
- text: ''
66
- };
67
- }
68
- };
69
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzbmFwc2hvdCIsImlkIiwidGV4dCIsImxpc3RlbmVycyIsIlNldCIsImVtaXRDaGFuZ2UiLCJmb3JFYWNoIiwibGlzdGVuZXIiLCJzdHJlYW1pbmdTdG9yZSIsInN0YXJ0Iiwic2V0VGV4dCIsImNsZWFyIiwic3Vic2NyaWJlIiwiYWRkIiwiZ2V0U25hcHNob3QiLCJnZXRTZXJ2ZXJTbmFwc2hvdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9ob29rcy91c2VTdHJlYW1pbmdNZXNzYWdlL3N0cmVhbWluZ1N0b3JlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RvcmUgZXh0ZXJubyAobW9kdWxlLWxldmVsKSBwYXJhIGVsIG1lbnNhamUgYWN0dWFsbWVudGUgZW4gc3RyZWFtaW5nLlxuICpcbiAqIERlc2Fjb3BsYSBlbCB0ZXh0byBkZWwgc3RyZWFtIGRlbCBhcnJheSBkZSBgbWVzc2FnZXNgIGRlIFJlYWN0OiBkdXJhbnRlXG4gKiBlbCBzdHJlYW1pbmcsIGVsIHRleHRvIHNlIG1hbnRpZW5lIGFjw6EgeSBzb2xvIGxvcyBjb21wb25lbnRlcyBzdXNjcml0b3NcbiAqICh2w61hIGB1c2VTdHJlYW1pbmdNZXNzYWdlYCAvIGB1c2VTeW5jRXh0ZXJuYWxTdG9yZWApIHJlLXJlbmRlcml6YW4gY3VhbmRvXG4gKiBjYW1iaWEuIEVsIGFycmF5IGBtZXNzYWdlc2Agbm8gc2UgbXV0YSBlbiBjYWRhIHRva2VuLCBldml0YW5kbyByw6FmYWdhc1xuICogZGUgcmUtcmVuZGVycyBkZWwgcGFkcmUgeSBlamVjdWNpb25lcyBpbm5lY2VzYXJpYXMgZGUgdXNlRWZmZWN0cy5cbiAqL1xuXG50eXBlIFN0cmVhbWluZ1NuYXBzaG90ID0ge1xuICBpZDogc3RyaW5nIHwgbnVsbFxuICB0ZXh0OiBzdHJpbmdcbn1cblxubGV0IHNuYXBzaG90OiBTdHJlYW1pbmdTbmFwc2hvdCA9IHsgaWQ6IG51bGwsIHRleHQ6ICcnIH1cbmNvbnN0IGxpc3RlbmVycyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKVxuXG5jb25zdCBlbWl0Q2hhbmdlID0gKCkgPT4ge1xuICBsaXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiB7XG4gICAgbGlzdGVuZXIoKVxuICB9KVxufVxuXG5leHBvcnQgY29uc3Qgc3RyZWFtaW5nU3RvcmUgPSB7XG4gIC8qKiBJbmljaWEgdW5hIG51ZXZhIHNlc2nDs24gZGUgc3RyZWFtaW5nIHBhcmEgZWwgbWVuc2FqZSBjb24gZXN0ZSBpZC4gKi9cbiAgc3RhcnQoaWQ6IHN0cmluZykge1xuICAgIHNuYXBzaG90ID0geyBpZCwgdGV4dDogJycgfVxuICAgIGVtaXRDaGFuZ2UoKVxuICB9LFxuICAvKiogU2V0ZWEgZWwgdGV4dG8gZGVsIG1lbnNhamUgZW4gc3RyZWFtaW5nLiBTb2xvIGFwbGljYSBzaSBlbCBpZCBjb2luY2lkZS4gKi9cbiAgc2V0VGV4dChpZDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcpIHtcbiAgICBpZiAoc25hcHNob3QuaWQgIT09IGlkKSB7XG4gICAgICBzbmFwc2hvdCA9IHsgaWQsIHRleHQgfVxuICAgIH0gZWxzZSBpZiAoc25hcHNob3QudGV4dCAhPT0gdGV4dCkge1xuICAgICAgc25hcHNob3QgPSB7IGlkLCB0ZXh0IH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGVtaXRDaGFuZ2UoKVxuICB9LFxuICAvKiogTGltcGlhIGVsIGVzdGFkbyBkZSBzdHJlYW1pbmcgKGZpbiBkZSBzdHJlYW0sIGVycm9yIG8gYXByb2JhY2nDs24pLiAqL1xuICBjbGVhcigpIHtcbiAgICBpZiAoc25hcHNob3QuaWQgPT0gbnVsbCAmJiBzbmFwc2hvdC50ZXh0ID09PSAnJykgcmV0dXJuXG4gICAgc25hcHNob3QgPSB7IGlkOiBudWxsLCB0ZXh0OiAnJyB9XG4gICAgZW1pdENoYW5nZSgpXG4gIH0sXG4gIC8qKiBBUEkgcGFyYSB1c2VTeW5jRXh0ZXJuYWxTdG9yZS4gKi9cbiAgc3Vic2NyaWJlKGxpc3RlbmVyOiAoKSA9PiB2b2lkKSB7XG4gICAgbGlzdGVuZXJzLmFkZChsaXN0ZW5lcilcbiAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgbGlzdGVuZXJzLmRlbGV0ZShsaXN0ZW5lcilcbiAgICB9XG4gIH0sXG4gIC8qKiBTbmFwc2hvdCByZWZlcmVuY2lhbG1lbnRlIGVzdGFibGUgbWllbnRyYXMgbm8gaGF5YSBjYW1iaW9zLiAqL1xuICBnZXRTbmFwc2hvdCgpOiBTdHJlYW1pbmdTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHNuYXBzaG90XG4gIH0sXG4gIC8qKiBTZXJ2ZXIgc25hcHNob3QgKFNTUik6IHNpZW1wcmUgdmFjw61vLiAqL1xuICBnZXRTZXJ2ZXJTbmFwc2hvdCgpOiBTdHJlYW1pbmdTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHsgaWQ6IG51bGwsIHRleHQ6ICcnIH1cbiAgfSxcbn1cblxuZXhwb3J0IHR5cGUgeyBTdHJlYW1pbmdTbmFwc2hvdCB9XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFPQSxJQUFJQSxRQUEyQixHQUFHO0VBQUVDLEVBQUUsRUFBRSxJQUFJO0VBQUVDLElBQUksRUFBRTtBQUFHLENBQUM7QUFDeEQsSUFBTUMsU0FBUyxHQUFHLElBQUlDLEdBQUcsQ0FBYSxDQUFDO0FBRXZDLElBQU1DLFVBQVUsR0FBRyxTQUFiQSxVQUFVQSxDQUFBLEVBQVM7RUFDdkJGLFNBQVMsQ0FBQ0csT0FBTyxDQUFDLFVBQUFDLFFBQVEsRUFBSTtJQUM1QkEsUUFBUSxDQUFDLENBQUM7RUFDWixDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsT0FBTyxJQUFNQyxjQUFjLEdBQUc7RUFDNUIsd0VBQ0FDLEtBQUssV0FBTEEsS0FBS0EsQ0FBQ1IsRUFBVSxFQUFFO0lBQ2hCRCxRQUFRLEdBQUc7TUFBRUMsRUFBRSxFQUFGQSxFQUFFO01BQUVDLElBQUksRUFBRTtJQUFHLENBQUM7SUFDM0JHLFVBQVUsQ0FBQyxDQUFDO0VBQ2QsQ0FBQztFQUNELDhFQUNBSyxPQUFPLFdBQVBBLE9BQU9BLENBQUNULEVBQVUsRUFBRUMsSUFBWSxFQUFFO0lBQ2hDLElBQUlGLFFBQVEsQ0FBQ0MsRUFBRSxLQUFLQSxFQUFFLEVBQUU7TUFDdEJELFFBQVEsR0FBRztRQUFFQyxFQUFFLEVBQUZBLEVBQUU7UUFBRUMsSUFBSSxFQUFKQTtNQUFLLENBQUM7SUFDekIsQ0FBQyxNQUFNLElBQUlGLFFBQVEsQ0FBQ0UsSUFBSSxLQUFLQSxJQUFJLEVBQUU7TUFDakNGLFFBQVEsR0FBRztRQUFFQyxFQUFFLEVBQUZBLEVBQUU7UUFBRUMsSUFBSSxFQUFKQTtNQUFLLENBQUM7SUFDekIsQ0FBQyxNQUFNO01BQ0w7SUFDRjtJQUNBRyxVQUFVLENBQUMsQ0FBQztFQUNkLENBQUM7RUFDRCx5RUFDQU0sS0FBSyxXQUFMQSxLQUFLQSxDQUFBLEVBQUc7SUFDTixJQUFJWCxRQUFRLENBQUNDLEVBQUUsSUFBSSxJQUFJLElBQUlELFFBQVEsQ0FBQ0UsSUFBSSxLQUFLLEVBQUUsRUFBRTtJQUNqREYsUUFBUSxHQUFHO01BQUVDLEVBQUUsRUFBRSxJQUFJO01BQUVDLElBQUksRUFBRTtJQUFHLENBQUM7SUFDakNHLFVBQVUsQ0FBQyxDQUFDO0VBQ2QsQ0FBQztFQUNELHFDQUNBTyxTQUFTLFdBQVRBLFNBQVNBLENBQUNMLFFBQW9CLEVBQUU7SUFDOUJKLFNBQVMsQ0FBQ1UsR0FBRyxDQUFDTixRQUFRLENBQUM7SUFDdkIsT0FBTyxZQUFNO01BQ1hKLFNBQVMsVUFBTyxDQUFDSSxRQUFRLENBQUM7SUFDNUIsQ0FBQztFQUNILENBQUM7RUFDRCxrRUFDQU8sV0FBVyxXQUFYQSxXQUFXQSxDQUFBLEVBQXNCO0lBQy9CLE9BQU9kLFFBQVE7RUFDakIsQ0FBQztFQUNELDRDQUNBZSxpQkFBaUIsV0FBakJBLGlCQUFpQkEsQ0FBQSxFQUFzQjtJQUNyQyxPQUFPO01BQUVkLEVBQUUsRUFBRSxJQUFJO01BQUVDLElBQUksRUFBRTtJQUFHLENBQUM7RUFDL0I7QUFDRixDQUFDIiwiaWdub3JlTGlzdCI6W119
@@ -1,250 +0,0 @@
1
- import _typeof from "@babel/runtime/helpers/typeof";
2
- import _toArray from "@babel/runtime/helpers/toArray";
3
- import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator";
4
- function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
5
- import _regeneratorRuntime from "@babel/runtime/regenerator";
6
- import { fetchMaia } from '../client';
7
- export var getAvailableConnectors = /*#__PURE__*/function () {
8
- var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
9
- var response;
10
- return _regeneratorRuntime.wrap(function (_context) {
11
- while (1) switch (_context.prev = _context.next) {
12
- case 0:
13
- _context.next = 1;
14
- return fetchMaia({
15
- path: 'connectors',
16
- method: 'GET'
17
- });
18
- case 1:
19
- response = _context.sent;
20
- if (response.ok) {
21
- _context.next = 2;
22
- break;
23
- }
24
- throw new Error('Failed to fetch connectors');
25
- case 2:
26
- return _context.abrupt("return", response.json());
27
- case 3:
28
- case "end":
29
- return _context.stop();
30
- }
31
- }, _callee);
32
- }));
33
- return function getAvailableConnectors() {
34
- return _ref.apply(this, arguments);
35
- };
36
- }();
37
- export var getAgentConnectors = /*#__PURE__*/function () {
38
- var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee2(agentId) {
39
- var response;
40
- return _regeneratorRuntime.wrap(function (_context2) {
41
- while (1) switch (_context2.prev = _context2.next) {
42
- case 0:
43
- _context2.next = 1;
44
- return fetchMaia({
45
- path: "agents/".concat(agentId, "/connectors"),
46
- method: 'GET'
47
- });
48
- case 1:
49
- response = _context2.sent;
50
- if (response.ok) {
51
- _context2.next = 2;
52
- break;
53
- }
54
- throw new Error('Failed to fetch agent connectors');
55
- case 2:
56
- return _context2.abrupt("return", response.json());
57
- case 3:
58
- case "end":
59
- return _context2.stop();
60
- }
61
- }, _callee2);
62
- }));
63
- return function getAgentConnectors(_x) {
64
- return _ref2.apply(this, arguments);
65
- };
66
- }();
67
- export var saveAgentConnectors = /*#__PURE__*/function () {
68
- var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee3(agentId, connectorSlugs) {
69
- var response;
70
- return _regeneratorRuntime.wrap(function (_context3) {
71
- while (1) switch (_context3.prev = _context3.next) {
72
- case 0:
73
- _context3.next = 1;
74
- return fetchMaia({
75
- path: "agents/".concat(agentId, "/connectors"),
76
- method: 'POST',
77
- body: {
78
- connector_slugs: connectorSlugs
79
- }
80
- });
81
- case 1:
82
- response = _context3.sent;
83
- if (response.ok) {
84
- _context3.next = 2;
85
- break;
86
- }
87
- throw new Error('Failed to save agent connectors');
88
- case 2:
89
- return _context3.abrupt("return", response.json());
90
- case 3:
91
- case "end":
92
- return _context3.stop();
93
- }
94
- }, _callee3);
95
- }));
96
- return function saveAgentConnectors(_x2, _x3) {
97
- return _ref3.apply(this, arguments);
98
- };
99
- }();
100
- export var openConnectorAuthorizationWindows = function openConnectorAuthorizationWindows(authorizations, popupWindow) {
101
- if (!authorizations.length) {
102
- if (popupWindow && !popupWindow.closed) {
103
- popupWindow.close();
104
- }
105
- return null;
106
- }
107
- var _authorizations = _toArray(authorizations),
108
- firstAuthorization = _authorizations[0],
109
- remainingAuthorizations = _arrayLikeToArray(_authorizations).slice(1);
110
- var opened = null;
111
- if (popupWindow && !popupWindow.closed) {
112
- popupWindow.location.href = firstAuthorization.auth_url;
113
- opened = popupWindow;
114
- } else {
115
- opened = window.open(firstAuthorization.auth_url, '_blank', 'popup=yes,width=560,height=760');
116
- }
117
- remainingAuthorizations.forEach(function (authorization) {
118
- window.open(authorization.auth_url, '_blank', 'popup=yes,width=560,height=760');
119
- });
120
- return opened;
121
- };
122
- var isConnectorOAuthMessage = function isConnectorOAuthMessage(data) {
123
- return !!data && _typeof(data) === 'object' && 'type' in data && data.type === 'connector-oauth';
124
- };
125
-
126
- /** Waits until the OAuth popup finishes, then confirms the company token via GET. */
127
- export var waitForConnectorAuthorization = /*#__PURE__*/function () {
128
- var _ref5 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee6(_ref4) {
129
- var agentId, slugs, popup, _ref4$timeoutMs, timeoutMs, pending, oauthError, authorizedSlugs;
130
- return _regeneratorRuntime.wrap(function (_context6) {
131
- while (1) switch (_context6.prev = _context6.next) {
132
- case 0:
133
- agentId = _ref4.agentId, slugs = _ref4.slugs, popup = _ref4.popup, _ref4$timeoutMs = _ref4.timeoutMs, timeoutMs = _ref4$timeoutMs === void 0 ? 180000 : _ref4$timeoutMs;
134
- if (slugs.length) {
135
- _context6.next = 1;
136
- break;
137
- }
138
- return _context6.abrupt("return", {
139
- authorized: []
140
- });
141
- case 1:
142
- pending = new Set(slugs);
143
- authorizedSlugs = /*#__PURE__*/function () {
144
- var _ref6 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee4() {
145
- var connectors;
146
- return _regeneratorRuntime.wrap(function (_context4) {
147
- while (1) switch (_context4.prev = _context4.next) {
148
- case 0:
149
- _context4.next = 1;
150
- return getAgentConnectors(agentId);
151
- case 1:
152
- connectors = _context4.sent;
153
- return _context4.abrupt("return", connectors.filter(function (connector) {
154
- return pending.has(connector.slug) && connector.user_authorized;
155
- }).map(function (connector) {
156
- return connector.slug;
157
- }));
158
- case 2:
159
- case "end":
160
- return _context4.stop();
161
- }
162
- }, _callee4);
163
- }));
164
- return function authorizedSlugs() {
165
- return _ref6.apply(this, arguments);
166
- };
167
- }();
168
- return _context6.abrupt("return", new Promise(function (resolve) {
169
- var finished = false;
170
- var finish = /*#__PURE__*/function () {
171
- var _ref7 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee5() {
172
- var authorized, _t;
173
- return _regeneratorRuntime.wrap(function (_context5) {
174
- while (1) switch (_context5.prev = _context5.next) {
175
- case 0:
176
- if (!finished) {
177
- _context5.next = 1;
178
- break;
179
- }
180
- return _context5.abrupt("return");
181
- case 1:
182
- finished = true;
183
- window.removeEventListener('message', onMessage);
184
- window.clearInterval(poll);
185
- window.clearTimeout(timer);
186
- _context5.prev = 2;
187
- _context5.next = 3;
188
- return authorizedSlugs();
189
- case 3:
190
- authorized = _context5.sent;
191
- resolve({
192
- authorized: authorized,
193
- error: authorized.length ? undefined : oauthError
194
- });
195
- _context5.next = 5;
196
- break;
197
- case 4:
198
- _context5.prev = 4;
199
- _t = _context5["catch"](2);
200
- resolve({
201
- authorized: [],
202
- error: oauthError
203
- });
204
- case 5:
205
- case "end":
206
- return _context5.stop();
207
- }
208
- }, _callee5, null, [[2, 4]]);
209
- }));
210
- return function finish() {
211
- return _ref7.apply(this, arguments);
212
- };
213
- }();
214
- var onMessage = function onMessage(event) {
215
- if (!isConnectorOAuthMessage(event.data)) {
216
- return;
217
- }
218
- if (event.data.status === 'error') {
219
- oauthError = event.data.message;
220
- }
221
- void finish();
222
- };
223
- window.addEventListener('message', onMessage);
224
- var poll = window.setInterval(function () {
225
- if (popup && popup.closed) {
226
- void finish();
227
- }
228
- }, 400);
229
- var timer = window.setTimeout(function () {
230
- oauthError = oauthError || 'timeout';
231
- void finish();
232
- }, timeoutMs);
233
- }));
234
- case 2:
235
- case "end":
236
- return _context6.stop();
237
- }
238
- }, _callee6);
239
- }));
240
- return function waitForConnectorAuthorization(_x4) {
241
- return _ref5.apply(this, arguments);
242
- };
243
- }();
244
- export var connectorAuthErrorMessage = function connectorAuthErrorMessage(error) {
245
- if (error.slug === 'netsuite') {
246
- return error.message;
247
- }
248
- return "".concat(error.name, ": ").concat(error.message);
249
- };
250
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmZXRjaE1haWEiLCJnZXRBdmFpbGFibGVDb25uZWN0b3JzIiwiX3JlZiIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwicmVzcG9uc2UiLCJ3cmFwIiwiX2NvbnRleHQiLCJwcmV2IiwibmV4dCIsInBhdGgiLCJtZXRob2QiLCJzZW50Iiwib2siLCJFcnJvciIsImFicnVwdCIsImpzb24iLCJzdG9wIiwiYXBwbHkiLCJhcmd1bWVudHMiLCJnZXRBZ2VudENvbm5lY3RvcnMiLCJfcmVmMiIsIl9jYWxsZWUyIiwiYWdlbnRJZCIsIl9jb250ZXh0MiIsImNvbmNhdCIsIl94Iiwic2F2ZUFnZW50Q29ubmVjdG9ycyIsIl9yZWYzIiwiX2NhbGxlZTMiLCJjb25uZWN0b3JTbHVncyIsIl9jb250ZXh0MyIsImJvZHkiLCJjb25uZWN0b3Jfc2x1Z3MiLCJfeDIiLCJfeDMiLCJvcGVuQ29ubmVjdG9yQXV0aG9yaXphdGlvbldpbmRvd3MiLCJhdXRob3JpemF0aW9ucyIsInBvcHVwV2luZG93IiwibGVuZ3RoIiwiY2xvc2VkIiwiY2xvc2UiLCJfYXV0aG9yaXphdGlvbnMiLCJfdG9BcnJheSIsImZpcnN0QXV0aG9yaXphdGlvbiIsInJlbWFpbmluZ0F1dGhvcml6YXRpb25zIiwiX2FycmF5TGlrZVRvQXJyYXkiLCJzbGljZSIsIm9wZW5lZCIsImxvY2F0aW9uIiwiaHJlZiIsImF1dGhfdXJsIiwid2luZG93Iiwib3BlbiIsImZvckVhY2giLCJhdXRob3JpemF0aW9uIiwiaXNDb25uZWN0b3JPQXV0aE1lc3NhZ2UiLCJkYXRhIiwiX3R5cGVvZiIsInR5cGUiLCJ3YWl0Rm9yQ29ubmVjdG9yQXV0aG9yaXphdGlvbiIsIl9yZWY1IiwiX2NhbGxlZTYiLCJfcmVmNCIsInNsdWdzIiwicG9wdXAiLCJfcmVmNCR0aW1lb3V0TXMiLCJ0aW1lb3V0TXMiLCJwZW5kaW5nIiwib2F1dGhFcnJvciIsImF1dGhvcml6ZWRTbHVncyIsIl9jb250ZXh0NiIsImF1dGhvcml6ZWQiLCJTZXQiLCJfcmVmNiIsIl9jYWxsZWU0IiwiY29ubmVjdG9ycyIsIl9jb250ZXh0NCIsImZpbHRlciIsImNvbm5lY3RvciIsImhhcyIsInNsdWciLCJ1c2VyX2F1dGhvcml6ZWQiLCJtYXAiLCJQcm9taXNlIiwicmVzb2x2ZSIsImZpbmlzaGVkIiwiZmluaXNoIiwiX3JlZjciLCJfY2FsbGVlNSIsIl90IiwiX2NvbnRleHQ1IiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsIm9uTWVzc2FnZSIsImNsZWFySW50ZXJ2YWwiLCJwb2xsIiwiY2xlYXJUaW1lb3V0IiwidGltZXIiLCJlcnJvciIsInVuZGVmaW5lZCIsImV2ZW50Iiwic3RhdHVzIiwibWVzc2FnZSIsImFkZEV2ZW50TGlzdGVuZXIiLCJzZXRJbnRlcnZhbCIsInNldFRpbWVvdXQiLCJfeDQiLCJjb25uZWN0b3JBdXRoRXJyb3JNZXNzYWdlIiwibmFtZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9zZXJ2aWNlcy9tYWlhL0FnZW50cy9jb25uZWN0b3JzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGZldGNoTWFpYSB9IGZyb20gJy4uL2NsaWVudCdcblxuZXhwb3J0IHR5cGUgQ2F0YWxvZ0Nvbm5lY3RvciA9IHtcbiAgaWQ6IG51bWJlclxuICBzbHVnOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nXG4gIGljb25fdXJsPzogc3RyaW5nXG4gIHJlcXVpcmVzX2F1dGg6IGJvb2xlYW5cbiAgaXNfYWN0aXZlOiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIEFnZW50Q29ubmVjdG9yID0gQ2F0YWxvZ0Nvbm5lY3RvciAmIHtcbiAgZW5hYmxlZF9mb3JfYWdlbnQ6IGJvb2xlYW5cbiAgdXNlcl9hdXRob3JpemVkOiBib29sZWFuXG59XG5cbmV4cG9ydCB0eXBlIFBlbmRpbmdDb25uZWN0b3JBdXRob3JpemF0aW9uID0ge1xuICBzbHVnOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIGF1dGhfdXJsOiBzdHJpbmdcbn1cblxuZXhwb3J0IHR5cGUgQ29ubmVjdG9yQXV0aEVycm9yID0ge1xuICBzbHVnOiBzdHJpbmdcbiAgbmFtZTogc3RyaW5nXG4gIG1lc3NhZ2U6IHN0cmluZ1xufVxuXG5leHBvcnQgdHlwZSBTYXZlQWdlbnRDb25uZWN0b3JzUmVzcG9uc2UgPSB7XG4gIGFnZW50X2lkOiBzdHJpbmdcbiAgY29ubmVjdG9yX3NsdWdzOiBzdHJpbmdbXVxuICByZXF1aXJlc19hdXRoPzogUGVuZGluZ0Nvbm5lY3RvckF1dGhvcml6YXRpb25bXVxuICBhdXRoX2Vycm9ycz86IENvbm5lY3RvckF1dGhFcnJvcltdXG59XG5cbmV4cG9ydCBjb25zdCBnZXRBdmFpbGFibGVDb25uZWN0b3JzID0gYXN5bmMgKCk6IFByb21pc2U8Q2F0YWxvZ0Nvbm5lY3RvcltdPiA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICBwYXRoOiAnY29ubmVjdG9ycycsXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgfSlcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggY29ubmVjdG9ycycpXG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpXG59XG5cbmV4cG9ydCBjb25zdCBnZXRBZ2VudENvbm5lY3RvcnMgPSBhc3luYyAoYWdlbnRJZDogc3RyaW5nKTogUHJvbWlzZTxBZ2VudENvbm5lY3RvcltdPiA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hNYWlhKHtcbiAgICBwYXRoOiBgYWdlbnRzLyR7YWdlbnRJZH0vY29ubmVjdG9yc2AsXG4gICAgbWV0aG9kOiAnR0VUJyxcbiAgfSlcblxuICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggYWdlbnQgY29ubmVjdG9ycycpXG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpXG59XG5cbmV4cG9ydCBjb25zdCBzYXZlQWdlbnRDb25uZWN0b3JzID0gYXN5bmMgKFxuICBhZ2VudElkOiBzdHJpbmcsXG4gIGNvbm5lY3RvclNsdWdzOiBzdHJpbmdbXVxuKTogUHJvbWlzZTxTYXZlQWdlbnRDb25uZWN0b3JzUmVzcG9uc2U+ID0+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaE1haWEoe1xuICAgIHBhdGg6IGBhZ2VudHMvJHthZ2VudElkfS9jb25uZWN0b3JzYCxcbiAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICBib2R5OiB7XG4gICAgICBjb25uZWN0b3Jfc2x1Z3M6IGNvbm5lY3RvclNsdWdzLFxuICAgIH0sXG4gIH0pXG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIHNhdmUgYWdlbnQgY29ubmVjdG9ycycpXG4gIH1cblxuICByZXR1cm4gcmVzcG9uc2UuanNvbigpXG59XG5cbmV4cG9ydCBjb25zdCBvcGVuQ29ubmVjdG9yQXV0aG9yaXphdGlvbldpbmRvd3MgPSAoXG4gIGF1dGhvcml6YXRpb25zOiBQZW5kaW5nQ29ubmVjdG9yQXV0aG9yaXphdGlvbltdLFxuICBwb3B1cFdpbmRvdz86IFdpbmRvdyB8IG51bGxcbik6IFdpbmRvdyB8IG51bGwgPT4ge1xuICBpZiAoIWF1dGhvcml6YXRpb25zLmxlbmd0aCkge1xuICAgIGlmIChwb3B1cFdpbmRvdyAmJiAhcG9wdXBXaW5kb3cuY2xvc2VkKSB7XG4gICAgICBwb3B1cFdpbmRvdy5jbG9zZSgpXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBjb25zdCBbZmlyc3RBdXRob3JpemF0aW9uLCAuLi5yZW1haW5pbmdBdXRob3JpemF0aW9uc10gPSBhdXRob3JpemF0aW9uc1xuXG4gIGxldCBvcGVuZWQ6IFdpbmRvdyB8IG51bGwgPSBudWxsXG4gIGlmIChwb3B1cFdpbmRvdyAmJiAhcG9wdXBXaW5kb3cuY2xvc2VkKSB7XG4gICAgcG9wdXBXaW5kb3cubG9jYXRpb24uaHJlZiA9IGZpcnN0QXV0aG9yaXphdGlvbi5hdXRoX3VybFxuICAgIG9wZW5lZCA9IHBvcHVwV2luZG93XG4gIH0gZWxzZSB7XG4gICAgb3BlbmVkID0gd2luZG93Lm9wZW4oZmlyc3RBdXRob3JpemF0aW9uLmF1dGhfdXJsLCAnX2JsYW5rJywgJ3BvcHVwPXllcyx3aWR0aD01NjAsaGVpZ2h0PTc2MCcpXG4gIH1cblxuICByZW1haW5pbmdBdXRob3JpemF0aW9ucy5mb3JFYWNoKGF1dGhvcml6YXRpb24gPT4ge1xuICAgIHdpbmRvdy5vcGVuKGF1dGhvcml6YXRpb24uYXV0aF91cmwsICdfYmxhbmsnLCAncG9wdXA9eWVzLHdpZHRoPTU2MCxoZWlnaHQ9NzYwJylcbiAgfSlcblxuICByZXR1cm4gb3BlbmVkXG59XG5cbmNvbnN0IGlzQ29ubmVjdG9yT0F1dGhNZXNzYWdlID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIHsgdHlwZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZzsgc2x1Zz86IHN0cmluZzsgbWVzc2FnZT86IHN0cmluZyB9ID0+XG4gICEhZGF0YSAmJiB0eXBlb2YgZGF0YSA9PT0gJ29iamVjdCcgJiYgJ3R5cGUnIGluIGRhdGEgJiYgKGRhdGEgYXMgeyB0eXBlOiBzdHJpbmcgfSkudHlwZSA9PT0gJ2Nvbm5lY3Rvci1vYXV0aCdcblxuLyoqIFdhaXRzIHVudGlsIHRoZSBPQXV0aCBwb3B1cCBmaW5pc2hlcywgdGhlbiBjb25maXJtcyB0aGUgY29tcGFueSB0b2tlbiB2aWEgR0VULiAqL1xuZXhwb3J0IGNvbnN0IHdhaXRGb3JDb25uZWN0b3JBdXRob3JpemF0aW9uID0gYXN5bmMgKHtcbiAgYWdlbnRJZCxcbiAgc2x1Z3MsXG4gIHBvcHVwLFxuICB0aW1lb3V0TXMgPSAxODBfMDAwLFxufToge1xuICBhZ2VudElkOiBzdHJpbmdcbiAgc2x1Z3M6IHN0cmluZ1tdXG4gIHBvcHVwPzogV2luZG93IHwgbnVsbFxuICB0aW1lb3V0TXM/OiBudW1iZXJcbn0pOiBQcm9taXNlPHsgYXV0aG9yaXplZDogc3RyaW5nW107IGVycm9yPzogc3RyaW5nIH0+ID0+IHtcbiAgaWYgKCFzbHVncy5sZW5ndGgpIHtcbiAgICByZXR1cm4geyBhdXRob3JpemVkOiBbXSB9XG4gIH1cblxuICBjb25zdCBwZW5kaW5nID0gbmV3IFNldChzbHVncylcbiAgbGV0IG9hdXRoRXJyb3I6IHN0cmluZyB8IHVuZGVmaW5lZFxuXG4gIGNvbnN0IGF1dGhvcml6ZWRTbHVncyA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBjb25uZWN0b3JzID0gYXdhaXQgZ2V0QWdlbnRDb25uZWN0b3JzKGFnZW50SWQpXG4gICAgcmV0dXJuIGNvbm5lY3RvcnMuZmlsdGVyKGNvbm5lY3RvciA9PiBwZW5kaW5nLmhhcyhjb25uZWN0b3Iuc2x1ZykgJiYgY29ubmVjdG9yLnVzZXJfYXV0aG9yaXplZCkubWFwKGNvbm5lY3RvciA9PiBjb25uZWN0b3Iuc2x1ZylcbiAgfVxuXG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICBsZXQgZmluaXNoZWQgPSBmYWxzZVxuXG4gICAgY29uc3QgZmluaXNoID0gYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKGZpbmlzaGVkKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgZmluaXNoZWQgPSB0cnVlXG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG9uTWVzc2FnZSlcbiAgICAgIHdpbmRvdy5jbGVhckludGVydmFsKHBvbGwpXG4gICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHRpbWVyKVxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgYXV0aG9yaXplZCA9IGF3YWl0IGF1dGhvcml6ZWRTbHVncygpXG4gICAgICAgIHJlc29sdmUoeyBhdXRob3JpemVkLCBlcnJvcjogYXV0aG9yaXplZC5sZW5ndGggPyB1bmRlZmluZWQgOiBvYXV0aEVycm9yIH0pXG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmVzb2x2ZSh7IGF1dGhvcml6ZWQ6IFtdLCBlcnJvcjogb2F1dGhFcnJvciB9KVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9uTWVzc2FnZSA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBpZiAoIWlzQ29ubmVjdG9yT0F1dGhNZXNzYWdlKGV2ZW50LmRhdGEpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuICAgICAgaWYgKGV2ZW50LmRhdGEuc3RhdHVzID09PSAnZXJyb3InKSB7XG4gICAgICAgIG9hdXRoRXJyb3IgPSBldmVudC5kYXRhLm1lc3NhZ2VcbiAgICAgIH1cbiAgICAgIHZvaWQgZmluaXNoKClcbiAgICB9XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIG9uTWVzc2FnZSlcblxuICAgIGNvbnN0IHBvbGwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgaWYgKHBvcHVwICYmIHBvcHVwLmNsb3NlZCkge1xuICAgICAgICB2b2lkIGZpbmlzaCgpXG4gICAgICB9XG4gICAgfSwgNDAwKVxuXG4gICAgY29uc3QgdGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBvYXV0aEVycm9yID0gb2F1dGhFcnJvciB8fCAndGltZW91dCdcbiAgICAgIHZvaWQgZmluaXNoKClcbiAgICB9LCB0aW1lb3V0TXMpXG4gIH0pXG59XG5cbmV4cG9ydCBjb25zdCBjb25uZWN0b3JBdXRoRXJyb3JNZXNzYWdlID0gKGVycm9yOiBDb25uZWN0b3JBdXRoRXJyb3IpOiBzdHJpbmcgPT4ge1xuICBpZiAoZXJyb3Iuc2x1ZyA9PT0gJ25ldHN1aXRlJykge1xuICAgIHJldHVybiBlcnJvci5tZXNzYWdlXG4gIH1cbiAgcmV0dXJuIGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YFxufVxuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLFNBQVNBLFNBQVMsUUFBUSxXQUFXO0FB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T0FBQUMsS0FBQSxDQUFBdEUsS0FBQSxPQUFBQyxTQUFBO2NBQUE7WUFBQSxHQWNYO1lBRUQsSUFBTTBFLFNBQVMsR0FBRyxTQUFaQSxTQUFTQSxDQUFJTyxLQUFtQixFQUFLO2NBQ3pDLElBQUksQ0FBQzVDLHVCQUF1QixDQUFDNEMsS0FBSyxDQUFDM0MsSUFBSSxDQUFDLEVBQUU7Z0JBQ3hDO2NBQ0Y7Y0FDQSxJQUFJMkMsS0FBSyxDQUFDM0MsSUFBSSxDQUFDNEMsTUFBTSxLQUFLLE9BQU8sRUFBRTtnQkFDakNoQyxVQUFVLEdBQUcrQixLQUFLLENBQUMzQyxJQUFJLENBQUM2QyxPQUFPO2NBQ2pDO2NBQ0EsS0FBS2YsTUFBTSxDQUFDLENBQUM7WUFDZixDQUFDO1lBRURuQyxNQUFNLENBQUNtRCxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUVWLFNBQVMsQ0FBQztZQUU3QyxJQUFNRSxJQUFJLEdBQUczQyxNQUFNLENBQUNvRCxXQUFXLENBQUMsWUFBTTtjQUNwQyxJQUFJdkMsS0FBSyxJQUFJQSxLQUFLLENBQUN6QixNQUFNLEVBQUU7Z0JBQ3pCLEtBQUsrQyxNQUFNLENBQUMsQ0FBQztjQUNmO1lBQ0YsQ0FBQyxFQUFFLEdBQUcsQ0FBQztZQUVQLElBQU1VLEtBQUssR0FBRzdDLE1BQU0sQ0FBQ3FELFVBQVUsQ0FBQyxZQUFNO2NBQ3BDcEMsVUFBVSxHQUFHQSxVQUFVLElBQUksU0FBUztjQUNwQyxLQUFLa0IsTUFBTSxDQUFDLENBQUM7WUFDZixDQUFDLEVBQUVwQixTQUFTLENBQUM7VUFDZixDQUFDLENBQUM7UUFBQTtRQUFBO1VBQUEsT0FBQUksU0FBQSxDQUFBdEQsSUFBQTtNQUFBO0lBQUEsR0FBQTZDLFFBQUE7RUFBQSxDQUNIO0VBQUEsZ0JBakVZRiw2QkFBNkJBLENBQUE4QyxHQUFBO0lBQUEsT0FBQTdDLEtBQUEsQ0FBQTNDLEtBQUEsT0FBQUMsU0FBQTtFQUFBO0FBQUEsR0FpRXpDO0FBRUQsT0FBTyxJQUFNd0YseUJBQXlCLEdBQUcsU0FBNUJBLHlCQUF5QkEsQ0FBSVQsS0FBeUIsRUFBYTtFQUM5RSxJQUFJQSxLQUFLLENBQUNqQixJQUFJLEtBQUssVUFBVSxFQUFFO0lBQzdCLE9BQU9pQixLQUFLLENBQUNJLE9BQU87RUFDdEI7RUFDQSxVQUFBN0UsTUFBQSxDQUFVeUUsS0FBSyxDQUFDVSxJQUFJLFFBQUFuRixNQUFBLENBQUt5RSxLQUFLLENBQUNJLE9BQU87QUFDeEMsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==