@telia-ace/knowledge-widget-bot-provider 0.0.1-alpha.52 → 0.0.1-alpha.55

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.
@@ -74,6 +74,7 @@ const StyledContactList = styled(ContactList)`
74
74
  a {
75
75
  display: flex;
76
76
  align-items: center;
77
+ outline-offset: -2px;
77
78
  }
78
79
 
79
80
  &:not(:last-child) {
@@ -1 +1 @@
1
- {"version":3,"file":"contact-method-list.js","sources":["../src/ui/contact-method-list.tsx"],"sourcesContent":["import {\r\n ContactList,\r\n ContactMethod as GenericContactMethod,\r\n} from '@telia-ace/knowledge-widget-adapters';\r\nimport { useContainer, useDispatch } from '@telia-ace/knowledge-widget-ui';\r\nimport React, { useMemo, useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport { ActionItem } from '../types';\r\nimport ContactMethod from './contact-method';\r\n\r\ntype Props = {\r\n actions: ActionItem[];\r\n contactMethodIds?: string[];\r\n entryId: string;\r\n groupId: string;\r\n};\r\nconst ContactMethodList: React.FC<Props> = ({ actions, entryId, groupId }) => {\r\n const dispatch = useDispatch();\r\n const container = useContainer();\r\n const [expanded, setExpanded] = useState<string[]>([]);\r\n\r\n const items = useMemo<any[]>(() => {\r\n return actions.map((action) => {\r\n return {\r\n ...action.data,\r\n onClick: (_event: any, data: any) => {\r\n if (data.inline && !data.expanded) {\r\n setExpanded([...expanded, data.id]);\r\n } else {\r\n const { events } = container.get('$widget');\r\n events.dispatch('provider:open-contact-method', {\r\n entryId,\r\n contactMethod: data,\r\n actionKey: action.actionKey,\r\n });\r\n }\r\n },\r\n };\r\n });\r\n }, [actions, container, entryId, expanded]);\r\n\r\n if (!items.length) {\r\n return null;\r\n }\r\n\r\n return (\r\n <StyledContactList\r\n contactMethods={items}\r\n dispatch={dispatch}\r\n itemRenderer={(cm: any, props: any) => {\r\n const isExpanded = expanded.includes(cm.id) || cm.expanded;\r\n if (isExpanded && cm.inline) {\r\n return (\r\n <StyledContactMethod\r\n contactMethodId={cm.id}\r\n groupId={groupId}\r\n guideId={cm.body.guideId}\r\n />\r\n );\r\n }\r\n return <StyledGenericContactMethod {...cm} {...props} />;\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default ContactMethodList;\r\n\r\nconst StyledContactList = styled(ContactList)`\r\n > ul > li {\r\n a {\r\n display: flex;\r\n align-items: center;\r\n }\r\n\r\n &:not(:last-child) {\r\n ${(p) => p.theme.border && `border-bottom: ${p.theme.border};`}\r\n }\r\n }\r\n`;\r\n\r\nconst StyledContactMethod = styled(ContactMethod)`\r\n i {\r\n margin: 0 ${(p) => p.theme.sizes?.medium} 0 0;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n`;\r\nconst StyledGenericContactMethod = styled(GenericContactMethod)`\r\n padding: ${(p) => p.theme.sizes?.medium};\r\n i {\r\n margin: 0 ${(p) => p.theme.sizes?.medium} 0 0;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n`;\r\n"],"names":["GenericContactMethod"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,MAAM,oBAAqC,CAAC,EAAE,SAAS,SAAS,cAAc;AAC1E,QAAM,WAAW;AACjB,QAAM,YAAY;AAClB,QAAM,CAAC,UAAU,eAAe,SAAmB,CAAE,CAAA;AAE/C,QAAA,QAAQ,QAAe,MAAM;AACxB,WAAA,QAAQ,IAAI,CAAC,WAAW;AACpB,aAAA,iCACA,OAAO,OADP;AAAA,QAEH,SAAS,CAAC,QAAa,SAAc;AACjC,cAAI,KAAK,UAAU,CAAC,KAAK,UAAU;AAC/B,wBAAY,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;AAAA,UAAA,OAC/B;AACH,kBAAM,EAAE,WAAW,UAAU,IAAI,SAAS;AAC1C,mBAAO,SAAS,gCAAgC;AAAA,cAC5C;AAAA,cACA,eAAe;AAAA,cACf,WAAW,OAAO;AAAA,YAAA,CACrB;AAAA,UACL;AAAA,QACJ;AAAA,MAAA;AAAA,IACJ,CACH;AAAA,KACF,CAAC,SAAS,WAAW,SAAS,QAAQ,CAAC;AAEtC,MAAA,CAAC,MAAM,QAAQ;AACR,WAAA;AAAA,EACX;AAEA,SACK,sBAAA,cAAA,mBAAA;AAAA,IACG,gBAAgB;AAAA,IAChB;AAAA,IACA,cAAc,CAAC,IAAS,UAAe;AACnC,YAAM,aAAa,SAAS,SAAS,GAAG,EAAE,KAAK,GAAG;AAC9C,UAAA,cAAc,GAAG,QAAQ;AACzB,eACK,sBAAA,cAAA,qBAAA;AAAA,UACG,iBAAiB,GAAG;AAAA,UACpB;AAAA,UACA,SAAS,GAAG,KAAK;AAAA,QAAA,CACrB;AAAA,MAER;AACA,aAAQ,sBAAA,cAAA,4BAAA,kCAA+B,KAAQ,MAAO;AAAA,IAC1D;AAAA,EAAA,CACJ;AAER;AAIA,MAAM,oBAAoB,OAAO,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAQ9B,CAAC,MAAM,EAAE,MAAM,UAAU,kBAAkB,EAAE,MAAM;AAAA;AAAA;AAAA;AAKjE,MAAM,sBAAsB,OAAO,aAAa;AAAA;AAAA,oBAE5B,CAAC,MAAM;;AAAA,iBAAE,MAAM,UAAR,mBAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAM1C,MAAM,6BAA6B,OAAOA,eAAoB;AAAA,eAC/C,CAAC,MAAM;;AAAA,iBAAE,MAAM,UAAR,mBAAe;AAAA;AAAA;AAAA,oBAEjB,CAAC,MAAM;;AAAA,iBAAE,MAAM,UAAR,mBAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;"}
1
+ {"version":3,"file":"contact-method-list.js","sources":["../src/ui/contact-method-list.tsx"],"sourcesContent":["import {\r\n ContactList,\r\n ContactMethod as GenericContactMethod,\r\n} from '@telia-ace/knowledge-widget-adapters';\r\nimport { useContainer, useDispatch } from '@telia-ace/knowledge-widget-ui';\r\nimport React, { useMemo, useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport { ActionItem } from '../types';\r\nimport ContactMethod from './contact-method';\r\n\r\ntype Props = {\r\n actions: ActionItem[];\r\n contactMethodIds?: string[];\r\n entryId: string;\r\n groupId: string;\r\n};\r\nconst ContactMethodList: React.FC<Props> = ({ actions, entryId, groupId }) => {\r\n const dispatch = useDispatch();\r\n const container = useContainer();\r\n const [expanded, setExpanded] = useState<string[]>([]);\r\n\r\n const items = useMemo<any[]>(() => {\r\n return actions.map((action) => {\r\n return {\r\n ...action.data,\r\n onClick: (_event: any, data: any) => {\r\n if (data.inline && !data.expanded) {\r\n setExpanded([...expanded, data.id]);\r\n } else {\r\n const { events } = container.get('$widget');\r\n events.dispatch('provider:open-contact-method', {\r\n entryId,\r\n contactMethod: data,\r\n actionKey: action.actionKey,\r\n });\r\n }\r\n },\r\n };\r\n });\r\n }, [actions, container, entryId, expanded]);\r\n\r\n if (!items.length) {\r\n return null;\r\n }\r\n\r\n return (\r\n <StyledContactList\r\n contactMethods={items}\r\n dispatch={dispatch}\r\n itemRenderer={(cm: any, props: any) => {\r\n const isExpanded = expanded.includes(cm.id) || cm.expanded;\r\n if (isExpanded && cm.inline) {\r\n return (\r\n <StyledContactMethod\r\n contactMethodId={cm.id}\r\n groupId={groupId}\r\n guideId={cm.body.guideId}\r\n />\r\n );\r\n }\r\n return <StyledGenericContactMethod {...cm} {...props} />;\r\n }}\r\n />\r\n );\r\n};\r\n\r\nexport default ContactMethodList;\r\n\r\nconst StyledContactList = styled(ContactList)`\r\n > ul > li {\r\n a {\r\n display: flex;\r\n align-items: center;\r\n outline-offset: -2px;\r\n }\r\n\r\n &:not(:last-child) {\r\n ${(p) => p.theme.border && `border-bottom: ${p.theme.border};`}\r\n }\r\n }\r\n`;\r\n\r\nconst StyledContactMethod = styled(ContactMethod)`\r\n i {\r\n margin: 0 ${(p) => p.theme.sizes?.medium} 0 0;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n`;\r\nconst StyledGenericContactMethod = styled(GenericContactMethod)`\r\n padding: ${(p) => p.theme.sizes?.medium};\r\n i {\r\n margin: 0 ${(p) => p.theme.sizes?.medium} 0 0;\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n }\r\n`;\r\n"],"names":["GenericContactMethod"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgBA,MAAM,oBAAqC,CAAC,EAAE,SAAS,SAAS,cAAc;AAC1E,QAAM,WAAW;AACjB,QAAM,YAAY;AAClB,QAAM,CAAC,UAAU,eAAe,SAAmB,CAAE,CAAA;AAE/C,QAAA,QAAQ,QAAe,MAAM;AACxB,WAAA,QAAQ,IAAI,CAAC,WAAW;AACpB,aAAA,iCACA,OAAO,OADP;AAAA,QAEH,SAAS,CAAC,QAAa,SAAc;AACjC,cAAI,KAAK,UAAU,CAAC,KAAK,UAAU;AAC/B,wBAAY,CAAC,GAAG,UAAU,KAAK,EAAE,CAAC;AAAA,UAAA,OAC/B;AACH,kBAAM,EAAE,WAAW,UAAU,IAAI,SAAS;AAC1C,mBAAO,SAAS,gCAAgC;AAAA,cAC5C;AAAA,cACA,eAAe;AAAA,cACf,WAAW,OAAO;AAAA,YAAA,CACrB;AAAA,UACL;AAAA,QACJ;AAAA,MAAA;AAAA,IACJ,CACH;AAAA,KACF,CAAC,SAAS,WAAW,SAAS,QAAQ,CAAC;AAEtC,MAAA,CAAC,MAAM,QAAQ;AACR,WAAA;AAAA,EACX;AAEA,SACK,sBAAA,cAAA,mBAAA;AAAA,IACG,gBAAgB;AAAA,IAChB;AAAA,IACA,cAAc,CAAC,IAAS,UAAe;AACnC,YAAM,aAAa,SAAS,SAAS,GAAG,EAAE,KAAK,GAAG;AAC9C,UAAA,cAAc,GAAG,QAAQ;AACzB,eACK,sBAAA,cAAA,qBAAA;AAAA,UACG,iBAAiB,GAAG;AAAA,UACpB;AAAA,UACA,SAAS,GAAG,KAAK;AAAA,QAAA,CACrB;AAAA,MAER;AACA,aAAQ,sBAAA,cAAA,4BAAA,kCAA+B,KAAQ,MAAO;AAAA,IAC1D;AAAA,EAAA,CACJ;AAER;AAIA,MAAM,oBAAoB,OAAO,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,cAS9B,CAAC,MAAM,EAAE,MAAM,UAAU,kBAAkB,EAAE,MAAM;AAAA;AAAA;AAAA;AAKjE,MAAM,sBAAsB,OAAO,aAAa;AAAA;AAAA,oBAE5B,CAAC,MAAM;;AAAA,iBAAE,MAAM,UAAR,mBAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAM1C,MAAM,6BAA6B,OAAOA,eAAoB;AAAA,eAC/C,CAAC,MAAM;;AAAA,iBAAE,MAAM,UAAR,mBAAe;AAAA;AAAA;AAAA,oBAEjB,CAAC,MAAM;;AAAA,iBAAE,MAAM,UAAR,mBAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;"}
@@ -56,7 +56,7 @@ const ContactMethod = ({ contactMethodId, guideId, groupId, className }) => {
56
56
  const { events } = container.get("$widget");
57
57
  const unsubscribe = events.subscribe("bot-provider:form-submitted", (_, data) => __async(this, null, function* () {
58
58
  var _a;
59
- if (((_a = data.form.meta) == null ? void 0 : _a.groupId) !== groupId) {
59
+ if (((_a = data.form.meta) == null ? void 0 : _a.groupId) !== groupId || data.id !== contactMethod.id) {
60
60
  return;
61
61
  }
62
62
  const platform = yield container.getAsync("contactMethods");
@@ -1 +1 @@
1
- {"version":3,"file":"contact-method.js","sources":["../src/ui/contact-method.tsx"],"sourcesContent":["import {\r\n ContactMethod as GenericContactMethod,\r\n ContactMethodPlatform,\r\n} from '@telia-ace/knowledge-widget-adapters';\r\nimport { DataType } from '@telia-ace/knowledge-widget-types-grid';\r\nimport { useContainer, useDispatch } from '@telia-ace/knowledge-widget-ui';\r\nimport { FormBuilder } from '@telia-ace/widget-forms';\r\nimport { Widget } from '@webprovisions/platform';\r\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport { updateForm } from '../utils';\r\n\r\ntype Props = {\r\n contactMethodId: string;\r\n groupId: string;\r\n guideId?: string;\r\n className?: string;\r\n};\r\nconst ContactMethod: React.FC<Props> = ({ contactMethodId, guideId, groupId, className }) => {\r\n const [contactMethod, setContactMethod] = useState<any>();\r\n const container = useContainer();\r\n const dispatch = useDispatch();\r\n const mountedRef = useRef<boolean>(true);\r\n\r\n useEffect(() => {\r\n const { events } = container.get('$widget') as Widget;\r\n\r\n const unsubscribe = events.subscribe('bot-provider:form-submitted', async (_, data) => {\r\n // making sure that this is the form that is submitted\r\n if (data.form.meta?.groupId !== groupId) {\r\n return;\r\n }\r\n\r\n const platform = (await container.getAsync('contactMethods')) as ContactMethodPlatform;\r\n\r\n const updatedMethod = {\r\n ...contactMethod,\r\n body: {\r\n ...contactMethod.body,\r\n form: data.form,\r\n },\r\n };\r\n\r\n const { errors, valid, errorTypes } = await platform.validate(updatedMethod);\r\n\r\n if (!valid) {\r\n const builder = new FormBuilder(contactMethod.body.form);\r\n setContactMethod(undefined);\r\n\r\n builder.setValidationErrors(errors);\r\n\r\n updatedMethod.body = {\r\n ...updatedMethod.body,\r\n form: builder.get(),\r\n };\r\n\r\n setContactMethod({ ...updatedMethod });\r\n return;\r\n }\r\n\r\n const result = await platform.submit(updatedMethod);\r\n\r\n updatedMethod.confirmation = result;\r\n setContactMethod(updatedMethod);\r\n });\r\n\r\n const unsubscribeEvaluate = events.subscribe('bot-provider:evaluate', async (_, data) => {\r\n if (data.id != contactMethodId) {\r\n return;\r\n }\r\n\r\n const platform = (await container.getAsync('contactMethods')) as ContactMethodPlatform;\r\n\r\n const updatedForm = await platform.evaluate(contactMethod);\r\n\r\n let updatedMethod = {\r\n ...contactMethod,\r\n body: {\r\n ...contactMethod.body,\r\n form: updatedForm,\r\n },\r\n };\r\n\r\n const updatedBody = updateForm(updatedMethod, {\r\n submit: 'Submit',\r\n errors: {},\r\n meta: { groupId },\r\n });\r\n\r\n updatedMethod = {\r\n ...updatedMethod,\r\n body: updatedBody,\r\n };\r\n\r\n setContactMethod(updatedMethod);\r\n });\r\n\r\n return () => {\r\n unsubscribe();\r\n unsubscribeEvaluate();\r\n };\r\n }, [container, contactMethod, setContactMethod]);\r\n\r\n const fetchContactMethod = useCallback(\r\n async (id: string) => {\r\n const dataClient = await container.getAsync('dataClient');\r\n\r\n const cm = await dataClient.fetch(DataType.ContactMethod, {\r\n contactMethodId: id,\r\n guideId,\r\n });\r\n\r\n const body = updateForm(cm, {\r\n submit: 'Submit',\r\n errors: {},\r\n meta: { groupId },\r\n });\r\n cm.body = body;\r\n cm.body.guideId = guideId;\r\n\r\n if (!mountedRef.current) {\r\n return null;\r\n }\r\n setContactMethod(cm);\r\n },\r\n [mountedRef]\r\n );\r\n\r\n useEffect(() => {\r\n fetchContactMethod(contactMethodId);\r\n return () => {\r\n mountedRef.current = false; // clean up\r\n };\r\n }, [contactMethodId, fetchContactMethod]);\r\n\r\n if (!contactMethod) {\r\n return null;\r\n }\r\n return (\r\n <StyledGenericContactMethod\r\n {...contactMethod}\r\n body={contactMethod.body}\r\n inline={true}\r\n expanded={true}\r\n dispatch={dispatch}\r\n className={className}\r\n />\r\n );\r\n};\r\n\r\nexport default ContactMethod;\r\n\r\nconst StyledGenericContactMethod = styled(GenericContactMethod)`\r\n padding: ${(p) => p.theme.sizes?.normal} ${(p) => p.theme.sizes?.medium};\r\n`;\r\n"],"names":["GenericContactMethod"],"mappings":"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"}
1
+ {"version":3,"file":"contact-method.js","sources":["../src/ui/contact-method.tsx"],"sourcesContent":["import {\r\n ContactMethod as GenericContactMethod,\r\n ContactMethodPlatform,\r\n} from '@telia-ace/knowledge-widget-adapters';\r\nimport { DataType } from '@telia-ace/knowledge-widget-types-grid';\r\nimport { useContainer, useDispatch } from '@telia-ace/knowledge-widget-ui';\r\nimport { FormBuilder } from '@telia-ace/widget-forms';\r\nimport { Widget } from '@webprovisions/platform';\r\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\r\nimport styled from 'styled-components';\r\nimport { updateForm } from '../utils';\r\n\r\ntype Props = {\r\n contactMethodId: string;\r\n groupId: string;\r\n guideId?: string;\r\n className?: string;\r\n};\r\nconst ContactMethod: React.FC<Props> = ({ contactMethodId, guideId, groupId, className }) => {\r\n const [contactMethod, setContactMethod] = useState<any>();\r\n const container = useContainer();\r\n const dispatch = useDispatch();\r\n const mountedRef = useRef<boolean>(true);\r\n\r\n useEffect(() => {\r\n const { events } = container.get('$widget') as Widget;\r\n\r\n const unsubscribe = events.subscribe('bot-provider:form-submitted', async (_, data) => {\r\n // making sure that this is the form that is submitted\r\n if (data.form.meta?.groupId !== groupId || data.id !== contactMethod.id) {\r\n return;\r\n }\r\n\r\n const platform = (await container.getAsync('contactMethods')) as ContactMethodPlatform;\r\n\r\n const updatedMethod = {\r\n ...contactMethod,\r\n body: {\r\n ...contactMethod.body,\r\n form: data.form,\r\n },\r\n };\r\n\r\n const { errors, valid, errorTypes } = await platform.validate(updatedMethod);\r\n\r\n if (!valid) {\r\n const builder = new FormBuilder(contactMethod.body.form);\r\n setContactMethod(undefined);\r\n\r\n builder.setValidationErrors(errors);\r\n\r\n updatedMethod.body = {\r\n ...updatedMethod.body,\r\n form: builder.get(),\r\n };\r\n\r\n setContactMethod({ ...updatedMethod });\r\n return;\r\n }\r\n\r\n const result = await platform.submit(updatedMethod);\r\n\r\n updatedMethod.confirmation = result;\r\n setContactMethod(updatedMethod);\r\n });\r\n\r\n const unsubscribeEvaluate = events.subscribe('bot-provider:evaluate', async (_, data) => {\r\n if (data.id != contactMethodId) {\r\n return;\r\n }\r\n\r\n const platform = (await container.getAsync('contactMethods')) as ContactMethodPlatform;\r\n\r\n const updatedForm = await platform.evaluate(contactMethod);\r\n\r\n let updatedMethod = {\r\n ...contactMethod,\r\n body: {\r\n ...contactMethod.body,\r\n form: updatedForm,\r\n },\r\n };\r\n\r\n const updatedBody = updateForm(updatedMethod, {\r\n submit: 'Submit',\r\n errors: {},\r\n meta: { groupId },\r\n });\r\n\r\n updatedMethod = {\r\n ...updatedMethod,\r\n body: updatedBody,\r\n };\r\n\r\n setContactMethod(updatedMethod);\r\n });\r\n\r\n return () => {\r\n unsubscribe();\r\n unsubscribeEvaluate();\r\n };\r\n }, [container, contactMethod, setContactMethod]);\r\n\r\n const fetchContactMethod = useCallback(\r\n async (id: string) => {\r\n const dataClient = await container.getAsync('dataClient');\r\n\r\n const cm = await dataClient.fetch(DataType.ContactMethod, {\r\n contactMethodId: id,\r\n guideId,\r\n });\r\n\r\n const body = updateForm(cm, {\r\n submit: 'Submit',\r\n errors: {},\r\n meta: { groupId },\r\n });\r\n cm.body = body;\r\n cm.body.guideId = guideId;\r\n\r\n if (!mountedRef.current) {\r\n return null;\r\n }\r\n setContactMethod(cm);\r\n },\r\n [mountedRef]\r\n );\r\n\r\n useEffect(() => {\r\n fetchContactMethod(contactMethodId);\r\n return () => {\r\n mountedRef.current = false; // clean up\r\n };\r\n }, [contactMethodId, fetchContactMethod]);\r\n\r\n if (!contactMethod) {\r\n return null;\r\n }\r\n return (\r\n <StyledGenericContactMethod\r\n {...contactMethod}\r\n body={contactMethod.body}\r\n inline={true}\r\n expanded={true}\r\n dispatch={dispatch}\r\n className={className}\r\n />\r\n );\r\n};\r\n\r\nexport default ContactMethod;\r\n\r\nconst StyledGenericContactMethod = styled(GenericContactMethod)`\r\n padding: ${(p) => p.theme.sizes?.normal} ${(p) => p.theme.sizes?.medium};\r\n`;\r\n"],"names":["GenericContactMethod"],"mappings":"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"}
package/dist/index2.js CHANGED
@@ -204,7 +204,8 @@ const processEntries = (entries, prevGroup) => __async(this, null, function* ()
204
204
  var _a;
205
205
  const action = {
206
206
  label: i.title,
207
- actionKey: i.actionKey
207
+ actionKey: i.actionKey,
208
+ symbol: !!i.symbol ? i.symbol : void 0
208
209
  };
209
210
  if (i.data) {
210
211
  const entryAction = entry.actions[i.actionKey];
@@ -626,7 +627,8 @@ class HttpClient {
626
627
  return {
627
628
  command: { site: this.endpoint },
628
629
  clientId: this.clientId,
629
- globalState: {}
630
+ globalState: {},
631
+ funnel: this.container.get("$widget").name
630
632
  };
631
633
  }
632
634
  postEnvelope(envelope, prevGroup) {
@@ -682,6 +684,7 @@ class HttpClient {
682
684
  "Content-Type": "application/json"
683
685
  }
684
686
  };
687
+ envelope.funnel = this.container.get("$widget").name;
685
688
  return Object.assign({}, fetchOptions, {
686
689
  body: JSON.stringify(envelope),
687
690
  credentials: "same-origin"
@@ -1 +1 @@
1
- {"version":3,"file":"index2.js","sources":["../src/types.ts","../src/utils.ts","../src/entry-handler.ts","../src/http-client.ts","../src/store.ts","../src/provider.ts","../src/plugin.ts"],"sourcesContent":["import { ConversationMessageListItemType } from '@telia-ace/widget-conversation';\r\n\r\nexport enum CustomMessageTypes {\r\n ContactMethod = 'ace-knowledge-bot-contact-method',\r\n ContactList = 'ace-knowledge-bot-contact-list',\r\n FeedbackList = 'ace-knowledge-bot-feedback-list',\r\n NotificationList = 'ace-knowledge-bot-notification-list',\r\n NoGoodAlternative = 'ace-knowledge-bot-no-good-alternative',\r\n}\r\n\r\ntype LooseObject = { [key: string]: any };\r\n\r\nexport interface ActionItem {\r\n label: string;\r\n actionKey: string;\r\n data?: any;\r\n}\r\n\r\nexport interface MessageGroup {\r\n id: string;\r\n isUser: boolean;\r\n items: MessageGroupItem[];\r\n writer?: any;\r\n meta: { [key: string]: any };\r\n}\r\n\r\nexport interface MessageGroupItem {\r\n id: string;\r\n groupId: string;\r\n isUser: boolean;\r\n message: [ConversationMessageListItemType | CustomMessageTypes, any];\r\n}\r\n\r\nexport interface ClientEnvelope {\r\n command?: LooseObject;\r\n action?: {\r\n key: string;\r\n content: any;\r\n };\r\n globalState?: LooseObject;\r\n localState?: LooseObject;\r\n clientId?: string;\r\n}\r\n\r\nexport interface ServerEnvelope {\r\n clientId?: string | undefined;\r\n entries: ServerEntry[];\r\n globalState?: GlobalState;\r\n resolveCommand?: string;\r\n clientEnvelope?: ClientEnvelope;\r\n}\r\n\r\nexport interface GlobalState {\r\n completedInteractionsCount: number;\r\n lastQuestion?: string;\r\n lastBotGuide: number;\r\n lastGuideTitle?: string;\r\n site: string;\r\n invincibleParameters: object;\r\n}\r\n\r\nexport interface ServerEntry {\r\n id: string;\r\n type: string;\r\n content: any;\r\n actions: { [key: string]: any };\r\n tags: string[];\r\n relation?: string;\r\n timestamp: string;\r\n localState?: { [key: string]: any };\r\n}\r\n\r\nexport interface ListContent {\r\n header?: string;\r\n actions: ActionItem[];\r\n contactMethodIds?: string[];\r\n entryId: string;\r\n groupId: string;\r\n}\r\n","import { ContactMethodType } from '@telia-ace/knowledge-widget-adapters';\r\nimport { ConversationMessageListItemType } from '@telia-ace/widget-conversation';\r\nimport { FormBuilder, submitButton } from '@telia-ace/widget-forms';\r\nimport { Symbol } from '@telia-ace/widget-ui';\r\nimport { uuid } from '@telia-ace/widget-utilities';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { CustomMessageTypes, MessageGroup, MessageGroupItem } from './types';\r\n\r\nconst convertLegacySymbol = (symbol?: { type: string; content: string }): Symbol | undefined => {\r\n if (symbol) {\r\n const { type, content } = symbol;\r\n if (type && content) {\r\n return { type, content };\r\n }\r\n }\r\n};\r\n\r\nexport const createGroup = ({\r\n isUser,\r\n items = [],\r\n meta = {},\r\n}: {\r\n isUser: boolean;\r\n items?: Partial<MessageGroupItem>[];\r\n meta?: MessageGroup['meta'];\r\n}) => {\r\n const groupId = uuid();\r\n\r\n const group = {\r\n id: groupId,\r\n isUser,\r\n items: items.map((i) => {\r\n return {\r\n id: i.id || uuid(),\r\n isUser: isUser,\r\n groupId: groupId,\r\n message: i.message || [],\r\n };\r\n }),\r\n meta,\r\n } as MessageGroup;\r\n\r\n return group;\r\n};\r\n\r\nexport const contactMethodFromLegacy = (\r\n {\r\n id,\r\n title,\r\n defaultIcon,\r\n exits: [exit],\r\n exitType,\r\n confirmationText,\r\n expandFormAutomatically,\r\n form,\r\n description,\r\n }: any,\r\n options: {\r\n validation?: any;\r\n guideId?: string;\r\n } = {}\r\n): any => {\r\n const { adapter } = exit || { Adapter: {} };\r\n const { clientName = '', settings: adapterSettings = {}, customClientName = '' } = adapter;\r\n const { validation } = options;\r\n\r\n const settings: any = {\r\n id: id.toString(),\r\n title: title,\r\n description: description,\r\n symbol: convertLegacySymbol(defaultIcon),\r\n clientName: clientName === 'custom.adapter' ? customClientName : clientName,\r\n expanded: true,\r\n inline: true,\r\n body: {},\r\n };\r\n\r\n if (clientName.indexOf('phone') > -1 || clientName.indexOf('freetext') > -1) {\r\n const { displayTextBeforeClick, textBeforeClick } = adapterSettings;\r\n if (displayTextBeforeClick === 'true') {\r\n settings.expanded = false;\r\n settings.title = textBeforeClick;\r\n }\r\n\r\n if (clientName.indexOf('phone.text') > -1) {\r\n settings.body.phoneNumber = adapterSettings.phoneNumber;\r\n } else {\r\n settings.body.freetext = adapterSettings.freetext;\r\n }\r\n }\r\n\r\n if (\r\n clientName.indexOf('chat.popup') > -1 ||\r\n clientName.indexOf('link') > -1 ||\r\n (clientName === 'custom.adapter' && exitType === 'custom')\r\n ) {\r\n settings.body = adapterSettings;\r\n settings.body.confirmationFallback = confirmationText;\r\n }\r\n\r\n if (clientName.indexOf('ace') > -1) {\r\n settings.body = adapterSettings;\r\n }\r\n\r\n if (form && form.hasValueComponents) {\r\n if (validation) {\r\n settings.body.form = FormBuilder.fromLegacyForm(id.toString(), form, validation).get();\r\n } else {\r\n settings.body.form = FormBuilder.fromLegacyForm(id.toString(), form).get();\r\n }\r\n if (!expandFormAutomatically) {\r\n settings.expanded = settings.inline = false;\r\n }\r\n\r\n settings.body = updateForm(settings, { submit: 'Submit' });\r\n }\r\n\r\n if (options.guideId) {\r\n settings.body.guideId = options.guideId;\r\n }\r\n\r\n return settings;\r\n};\r\n\r\nexport const getListType = (state: any) => {\r\n if (state?.$type === 'Humany.Matching.Bots.Conversations.GuideListState, Humany.Matching') {\r\n return ConversationMessageListItemType.LinkList;\r\n } else if (\r\n state?.$type ===\r\n 'Humany.Matching.Bots.Conversations.States.GuideFeedbackState, Humany.Matching'\r\n ) {\r\n return CustomMessageTypes.FeedbackList;\r\n } else if (\r\n state?.$type === 'Humany.Matching.Bots.Conversations.States.ContactState, Humany.Matching'\r\n ) {\r\n return CustomMessageTypes.ContactList;\r\n } else return ConversationMessageListItemType.ButtonList;\r\n};\r\n\r\nexport const getKnowledgeBotEndpoint = (\r\n container: Container,\r\n component: any /*: ComponentNodeController */\r\n) => {\r\n const { knowledgeBotEndpoint } = component.properties();\r\n\r\n if (knowledgeBotEndpoint) {\r\n return `${knowledgeBotEndpoint}/conversations`;\r\n }\r\n\r\n const { data } = container.get('$settings');\r\n\r\n if (!data || !data.projection) throw new Error('Missing Knowledge Bot endpoint');\r\n\r\n return `${data.projection}/conversations`;\r\n};\r\n\r\nexport const updateForm = (\r\n contactMethod: ContactMethodType,\r\n {\r\n submit,\r\n errors,\r\n meta,\r\n }: { submit: string; errors?: { [key: string]: string }; meta?: { [key: string]: string } }\r\n): any => {\r\n if (contactMethod?.body?.form) {\r\n const { body } = contactMethod;\r\n const builder = new FormBuilder(body.form);\r\n\r\n if (!body.form.layout.submit) {\r\n builder.createComponent(submitButton(submit, 'submit'));\r\n }\r\n\r\n if (errors) {\r\n builder.setValidationErrors(errors);\r\n }\r\n\r\n if (meta) {\r\n (builder as any).setMeta(meta);\r\n }\r\n\r\n return {\r\n ...body,\r\n form: builder.get(),\r\n };\r\n }\r\n return contactMethod?.body || {};\r\n};\r\n","import { ConversationMessageListItemType } from '@telia-ace/widget-conversation';\r\nimport { uuid } from '@telia-ace/widget-utilities';\r\nimport {\r\n ActionItem,\r\n CustomMessageTypes,\r\n ListContent,\r\n MessageGroup,\r\n MessageGroupItem,\r\n ServerEntry,\r\n} from './types';\r\nimport { contactMethodFromLegacy, createGroup, getListType } from './utils';\r\n\r\nconst createGroupItem = ({\r\n messageId,\r\n message,\r\n group,\r\n}: {\r\n messageId: string;\r\n message: MessageGroupItem['message'];\r\n group: MessageGroup;\r\n}) => {\r\n return {\r\n id: messageId,\r\n message,\r\n groupId: group.id,\r\n isUser: group.isUser,\r\n };\r\n};\r\n\r\nexport const processEntries = async (entries: ServerEntry[], prevGroup?: MessageGroup) => {\r\n const createListContent = (\r\n listType: string,\r\n entry: ServerEntry,\r\n groupId: string,\r\n listContent: ListContent = {\r\n actions: [],\r\n entryId: entry.id,\r\n groupId,\r\n }\r\n ) => {\r\n const contactMethodIds: string[] = [];\r\n\r\n listContent.actions = entry.content.items.map((i: any) => {\r\n const action = {\r\n label: i.title,\r\n actionKey: i.actionKey,\r\n } as ActionItem;\r\n\r\n if (i.data) {\r\n const entryAction = entry.actions[i.actionKey];\r\n if (listType === CustomMessageTypes.ContactList) {\r\n contactMethodIds.push(i.data.id);\r\n action.data = contactMethodFromLegacy(i.data, {\r\n guideId: entryAction?.guideId?.toString(),\r\n });\r\n } else {\r\n action.data = i.data;\r\n }\r\n }\r\n return action;\r\n });\r\n\r\n if (listType === CustomMessageTypes.ContactList) {\r\n listContent.contactMethodIds = contactMethodIds;\r\n }\r\n\r\n return listContent;\r\n };\r\n\r\n const transform = async (\r\n entry: ServerEntry,\r\n group: MessageGroup,\r\n related: ServerEntry[] = [],\r\n prevGroup?: MessageGroup\r\n ) => {\r\n const messageId = uuid();\r\n\r\n switch (entry.type) {\r\n case 'List':\r\n {\r\n const { header, items, html } = entry.content;\r\n\r\n const result = [];\r\n\r\n let listContent = {\r\n actions: [],\r\n entryId: entry.id,\r\n groupId: group.id,\r\n } as ListContent;\r\n\r\n if (header) {\r\n listContent.header = header;\r\n }\r\n\r\n if (items?.length > 0) {\r\n const listType = getListType(entry.localState);\r\n listContent = createListContent(listType, entry, group.id, listContent);\r\n\r\n // entry has related entries\r\n if (!!related.length) {\r\n const pagingEntry = related.find((e) => e.tags.includes('paging'));\r\n const fallbackEntry = related.find((e) => e.tags.includes('fallback'));\r\n\r\n if (pagingEntry?.content) {\r\n group.meta.paging = {\r\n actions: pagingEntry.actions,\r\n items: pagingEntry.content.items,\r\n localState: pagingEntry.localState,\r\n };\r\n pagingEntry.content.items.forEach((i: any) => {\r\n listContent.actions.push({\r\n label: i.title,\r\n actionKey: i.actionKey,\r\n data: {\r\n groupId: !!prevGroup ? prevGroup.id : group.id,\r\n },\r\n });\r\n });\r\n }\r\n\r\n if (fallbackEntry) {\r\n const fallbackAction = fallbackEntry.content.items.find(\r\n (i: any) => i.actionKey === 'help'\r\n );\r\n if (fallbackAction) {\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n ConversationMessageListItemType.Separator,\r\n undefined,\r\n ],\r\n group,\r\n })\r\n );\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n CustomMessageTypes.NoGoodAlternative,\r\n { body: fallbackAction.title },\r\n ],\r\n group,\r\n })\r\n );\r\n }\r\n }\r\n }\r\n\r\n result.unshift(\r\n createGroupItem({\r\n messageId,\r\n message: [listType, listContent],\r\n group,\r\n })\r\n );\r\n }\r\n\r\n if (html) {\r\n result.unshift(\r\n createGroupItem({\r\n messageId,\r\n message: [ConversationMessageListItemType.HTML, { body: html }],\r\n group,\r\n })\r\n );\r\n }\r\n\r\n return result;\r\n }\r\n break;\r\n case 'Text':\r\n {\r\n const result = [];\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n ConversationMessageListItemType.HTML,\r\n { body: entry.content.html },\r\n ],\r\n group,\r\n })\r\n );\r\n\r\n // embedded contact methods\r\n if (!!related.length) {\r\n const contactMethodListEntry = related.find(\r\n (e) =>\r\n e.type === 'List' &&\r\n e.localState?.$type ===\r\n 'Humany.Matching.Bots.Conversations.States.ContactState, Humany.Matching'\r\n );\r\n\r\n const dialogListEntry = related.find((e) => e.tags.includes('dialog'));\r\n const feedbackEntry = related.find((e) => e.tags.includes('feedback'));\r\n\r\n if (dialogListEntry) {\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n ConversationMessageListItemType.ButtonList,\r\n {\r\n actions: dialogListEntry.content.items.map((i: any) => {\r\n return {\r\n label: i.title,\r\n actionKey: i.actionKey,\r\n };\r\n }),\r\n },\r\n ],\r\n group,\r\n })\r\n );\r\n }\r\n\r\n if (contactMethodListEntry) {\r\n const listContent = createListContent(\r\n CustomMessageTypes.ContactList,\r\n contactMethodListEntry,\r\n group.id\r\n );\r\n\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n message: [ConversationMessageListItemType.Separator, undefined],\r\n group,\r\n })\r\n );\r\n\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n message: [CustomMessageTypes.ContactList, listContent],\r\n group,\r\n })\r\n );\r\n }\r\n\r\n if (feedbackEntry) {\r\n if (feedbackEntry.content.html) {\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n group,\r\n message: [\r\n ConversationMessageListItemType.HTML,\r\n {\r\n body: feedbackEntry.content.html,\r\n },\r\n ],\r\n })\r\n );\r\n }\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n group,\r\n message: [\r\n CustomMessageTypes.FeedbackList,\r\n {\r\n actions: feedbackEntry.content.items.map((i: any) => {\r\n return {\r\n actionKey: i.actionKey,\r\n label: i.title,\r\n };\r\n }),\r\n },\r\n ],\r\n })\r\n );\r\n }\r\n }\r\n return result;\r\n }\r\n break;\r\n case 'Contact': {\r\n return [\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n CustomMessageTypes.ContactMethod,\r\n {\r\n contactMethodId: entry.content.id,\r\n groupId: group.id,\r\n guideId: entry.content.guideId,\r\n },\r\n ],\r\n group,\r\n }),\r\n ];\r\n }\r\n case 'CategorizedNoticeList': {\r\n const result = [\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n CustomMessageTypes.NotificationList,\r\n {\r\n id: entry.content.item.id.toString(),\r\n header: entry.content.item.title,\r\n items: entry.content.item.listNotices,\r\n symbol: entry.content.item.defaultIcon,\r\n },\r\n ],\r\n group,\r\n }),\r\n ];\r\n\r\n (entry.content.notices || []).forEach((notice: any) => {\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n ConversationMessageListItemType.HTML,\r\n {\r\n body: notice.body,\r\n },\r\n ],\r\n group,\r\n })\r\n );\r\n });\r\n\r\n return result;\r\n }\r\n case 'footerNotice': {\r\n return [\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n ConversationMessageListItemType.HTML,\r\n {\r\n body: entry.content.item.body,\r\n },\r\n ],\r\n group,\r\n }),\r\n ];\r\n }\r\n case 'Error': {\r\n return [\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n ConversationMessageListItemType.HTML,\r\n {\r\n body: entry.content.message || 'Something went wrong.',\r\n },\r\n ],\r\n group,\r\n }),\r\n ];\r\n }\r\n\r\n default:\r\n return [];\r\n }\r\n };\r\n\r\n const splitEntry = (entry: ServerEntry): ServerEntry | ServerEntry[] => {\r\n if (['CategorizedNoticeList', 'NoticeList'].includes(entry.type)) {\r\n return (entry.content.items || []).reduce((acc: any, item: any) => {\r\n if (!entry.content.isInitialNotices) {\r\n return acc;\r\n }\r\n acc.push({\r\n ...entry,\r\n id: uuid(),\r\n type: item.type || entry.type,\r\n content: {\r\n $type: entry.content.$type,\r\n isInitialNotices: entry.content.isInitialNotices,\r\n notices: item.notices,\r\n item,\r\n },\r\n });\r\n return acc;\r\n }, []);\r\n }\r\n return entry;\r\n };\r\n\r\n // map of in which order the messages should be displayed\r\n // lower numbers will be displayed above higher\r\n const sortMap = new Map<string, number>([\r\n ['Text', 1],\r\n ['List', 2],\r\n ['Contact', 3],\r\n ['CategorizedNoticeList', 10],\r\n ]);\r\n\r\n const result: MessageGroup[] = [];\r\n const filteredEntries = entries\r\n .sort((item, other) => {\r\n // sort the entries based on it's types sort value\r\n const defaultSortValue = 20;\r\n\r\n var sortValue = sortMap.get(item.type) || defaultSortValue;\r\n var sortValueOther = sortMap.get(other.type) || defaultSortValue;\r\n return sortValue - sortValueOther;\r\n })\r\n .filter((entry) => !entry.relation) // remove any \"relation entries\"\r\n .reduce<ServerEntry[]>((acc, entry) => {\r\n // some entries needs to be splitted into seperate groups\r\n return acc.concat(splitEntry(entry));\r\n }, []);\r\n\r\n for (const entry of filteredEntries) {\r\n const relatedEntries = entries.filter((other) => other.relation === entry.id);\r\n const group = createGroup({ isUser: false });\r\n\r\n const items = await transform(entry, group, relatedEntries, prevGroup);\r\n items.forEach((item) => {\r\n group.items.push(item);\r\n });\r\n\r\n if (group.items.length) {\r\n result.push(group);\r\n }\r\n }\r\n return result;\r\n};\r\n","import { uuid } from '@telia-ace/widget-utilities';\r\nimport { Container, EventManager } from '@webprovisions/platform';\r\nimport { processEntries } from './entry-handler';\r\nimport Store from './store';\r\nimport { ClientEnvelope, MessageGroup, ServerEntry, ServerEnvelope } from './types';\r\n\r\nclass HttpClient {\r\n private globalState: any;\r\n private clientId: string;\r\n private entries: ServerEntry[];\r\n\r\n constructor(\r\n private endpoint: string,\r\n private events: EventManager,\r\n private store: Store,\r\n private container: Container\r\n ) {\r\n this.clientId = uuid();\r\n this.entries = [];\r\n }\r\n\r\n async start() {\r\n const storedMessages = await this.store.read();\r\n\r\n // if there are a session stored, rehydrate the messages\r\n // otherwise create a new session\r\n if (storedMessages && storedMessages.length > 0) {\r\n const storedGlobalState = this.store.readGlobalState();\r\n this.globalState = storedGlobalState;\r\n return storedMessages;\r\n } else {\r\n const envelope = this.createInitialEnvelope();\r\n const initialResponse = await this.postEnvelope(envelope);\r\n return initialResponse;\r\n }\r\n }\r\n\r\n async sendMessage(message: string) {\r\n const envelope = {\r\n command: { phrase: message },\r\n globalState: this.globalState,\r\n clientId: this.clientId,\r\n };\r\n\r\n const result = await this.postEnvelope(envelope);\r\n return result;\r\n }\r\n\r\n async helpAction() {\r\n return this.postEnvelope({\r\n action: {\r\n key: 'help',\r\n content: {\r\n $type: 'Humany.Matching.Bots.Conversations.Actions.Help, Humany.Matching',\r\n },\r\n },\r\n globalState: this.globalState,\r\n clientId: this.clientId,\r\n });\r\n }\r\n\r\n async nextAction(group: MessageGroup) {\r\n const { paging } = group.meta;\r\n if (!paging.actions?.next) {\r\n return;\r\n }\r\n return this.postEnvelope(\r\n {\r\n action: {\r\n key: 'next',\r\n content: paging.actions.next,\r\n },\r\n localState: paging.localState,\r\n globalState: this.globalState,\r\n clientId: this.clientId,\r\n },\r\n group\r\n ).then((response) => {\r\n const listItemIndex = group.items.findIndex((item) => item.message[0] === 'link-list');\r\n if (listItemIndex === -1 || !response) {\r\n return group;\r\n }\r\n\r\n return {\r\n ...group,\r\n meta: {\r\n ...group.meta,\r\n ...response[0].meta,\r\n },\r\n items: [\r\n ...group.items.slice(0, listItemIndex),\r\n {\r\n ...group.items[listItemIndex],\r\n message: [\r\n response[0].items[0].message[0],\r\n {\r\n ...group.items[listItemIndex].message[1],\r\n ...response[0].items[0].message[1],\r\n },\r\n ],\r\n },\r\n ...group.items.slice(listItemIndex + 1),\r\n ],\r\n };\r\n });\r\n }\r\n\r\n async showContactMethodAction(data: {\r\n contactMethod: any;\r\n actionKey: string;\r\n entryId: string;\r\n }) {\r\n const entry = this.entries.find((e) => e.id === data.entryId);\r\n const actionItem = entry?.actions[data.actionKey];\r\n\r\n if (!actionItem) {\r\n return;\r\n }\r\n\r\n return this.postEnvelope({\r\n action: {\r\n key: data.actionKey,\r\n content: actionItem,\r\n },\r\n localState: entry.localState,\r\n globalState: this.globalState,\r\n clientId: this.clientId,\r\n });\r\n }\r\n\r\n async defaultAction(action: string) {\r\n const entry = this.getEntryOfAction(action);\r\n\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n return this.postEnvelope({\r\n action: {\r\n key: action,\r\n content: entry.actions[action],\r\n },\r\n localState: entry.localState,\r\n globalState: this.globalState,\r\n clientId: this.clientId,\r\n });\r\n }\r\n\r\n private createInitialEnvelope(): ClientEnvelope {\r\n return {\r\n command: { site: this.endpoint },\r\n clientId: this.clientId,\r\n globalState: {},\r\n };\r\n }\r\n\r\n private async postEnvelope(envelope: ClientEnvelope, prevGroup?: MessageGroup) {\r\n try {\r\n const response = await fetch(this.endpoint, this.getHttpOptions(envelope));\r\n\r\n if (!response.ok) {\r\n throw response;\r\n }\r\n\r\n const data = await response.json();\r\n\r\n return this.handleResponse(data, prevGroup);\r\n } catch (error: any) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.warn('Something went wrong when posting the envelope.');\r\n }\r\n let message = 'Something went wrong';\r\n\r\n if (error.message === 'Failed to fetch') {\r\n message = 'Lost connection... Please try again.';\r\n }\r\n return this.handleResponse({\r\n entries: [\r\n {\r\n id: uuid(),\r\n type: 'Error',\r\n timestamp: new Date().toISOString(),\r\n content: {\r\n message,\r\n },\r\n actions: {},\r\n tags: [],\r\n },\r\n ],\r\n });\r\n }\r\n }\r\n\r\n private async handleResponse(data: ServerEnvelope, prevGroup?: MessageGroup) {\r\n this.entries = this.entries.concat(data.entries);\r\n\r\n const widgetEntry = data.entries.find((e) => e.type === 'Widget');\r\n\r\n if (widgetEntry) {\r\n this.events.dispatch('provider:widget-entry', widgetEntry.content);\r\n }\r\n\r\n if (data.globalState) {\r\n this.globalState = data.globalState;\r\n }\r\n const groups = await processEntries(data.entries, prevGroup);\r\n return groups;\r\n }\r\n\r\n private getHttpOptions(envelope: ClientEnvelope) {\r\n const fetchOptions = {\r\n method: 'POST',\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n };\r\n return Object.assign({}, fetchOptions, {\r\n body: JSON.stringify(envelope),\r\n credentials: 'same-origin' as RequestCredentials,\r\n });\r\n }\r\n\r\n private getEntryOfAction(action: string) {\r\n return this.entries.find((entry) => !!entry.actions[action]);\r\n }\r\n}\r\n\r\nexport default HttpClient;\r\n","import { createStorageWriter, readStorage, StorageCategory } from '@telia-ace/widget-services';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { GlobalState, MessageGroup } from './types';\r\n\r\nclass Store {\r\n private enabled = false; // set whether or not to store data\r\n private sessionMessageStorageVariable: string = 'knowledge-bot-messages';\r\n private botProviderGlobalStateKey = 'bot-provider-global-state';\r\n private botProviderMetaStateKey = 'bot-provider-conversation-meta';\r\n\r\n constructor(private container: Container) {}\r\n\r\n async readGlobalState() {\r\n if (!this.enabled) {\r\n return undefined;\r\n }\r\n const state: GlobalState | undefined = await readStorage(\r\n this.container,\r\n this.botProviderGlobalStateKey\r\n );\r\n return state;\r\n }\r\n\r\n async readMetaState() {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n return readStorage(this.container, this.botProviderMetaStateKey);\r\n }\r\n\r\n async write(groups: MessageGroup[]) {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n return createStorageWriter(\r\n this.container,\r\n this.sessionMessageStorageVariable,\r\n StorageCategory.Necessary\r\n ).then((write) => {\r\n return write(groups);\r\n });\r\n }\r\n\r\n async read() {\r\n if (!this.enabled) {\r\n return [];\r\n }\r\n return readStorage<MessageGroup[]>(this.container, this.sessionMessageStorageVariable).then(\r\n (groups) => {\r\n return groups || [];\r\n }\r\n );\r\n }\r\n}\r\n\r\nexport default Store;\r\n","import { ComponentNodeController } from '@telia-ace/knowledge-widget-core';\r\nimport { ConversationMessageListItemType } from '@telia-ace/widget-conversation';\r\nimport { createStorageWriter, StorageCategory } from '@telia-ace/widget-services';\r\nimport { uuid } from '@telia-ace/widget-utilities';\r\nimport { Container, EventManager, Widget } from '@webprovisions/platform';\r\nimport HttpClient from './http-client';\r\nimport Store from './store';\r\nimport { MessageGroup, ServerEntry } from './types';\r\nimport { createGroup, getKnowledgeBotEndpoint } from './utils';\r\n\r\nclass KnowledgeBotProvider {\r\n private agent: any;\r\n private user: any;\r\n private httpClient: HttpClient;\r\n private events: EventManager;\r\n private groups: MessageGroup[] = [];\r\n private store: Store;\r\n\r\n constructor(\r\n private container: Container,\r\n private conversation: any,\r\n component: ComponentNodeController\r\n ) {\r\n const { events } = this.container.get('$widget') as Widget;\r\n this.events = events;\r\n this.store = new Store(container);\r\n this.agent = conversation.createAgent({\r\n name: '',\r\n avatar: undefined,\r\n });\r\n this.user = conversation.user;\r\n const endpoint = getKnowledgeBotEndpoint(container, component);\r\n this.httpClient = new HttpClient(endpoint, events, this.store, this.container);\r\n\r\n this.events.subscribe('provider:widget-entry', (_event, data: ServerEntry['content']) => {\r\n this.onWidgetEntryReceived(data);\r\n });\r\n\r\n this.events.subscribe(\r\n 'provider:open-contact-method',\r\n async (_event, data: { contactMethod: any; entryId: string; actionKey: string }) => {\r\n const response = await this.httpClient.showContactMethodAction(data);\r\n\r\n if (response) {\r\n if (!!data.contactMethod.title) this.printUserMessage(data.contactMethod.title);\r\n this.onMessagesReceived(response);\r\n }\r\n }\r\n );\r\n }\r\n\r\n async initialize() {\r\n const loader = this.conversation.loading();\r\n\r\n const storedMeta: any = await this.store.readMetaState();\r\n if (storedMeta?.agent) {\r\n this.agent.update({\r\n name: storedMeta.agent.name,\r\n avatar: storedMeta.agent.avatar,\r\n });\r\n }\r\n\r\n const response = await this.httpClient.start();\r\n if (response) {\r\n this.onMessagesReceived(response);\r\n }\r\n\r\n loader();\r\n }\r\n\r\n async onMessagesReceived(groups: MessageGroup[]) {\r\n this.groups = this.groups.concat(groups);\r\n await this.store.write(this.groups);\r\n groups.forEach((group) => {\r\n const items = group.items.map((item) => item.message);\r\n if (group.isUser) {\r\n group.writer = this.user.print(items);\r\n } else {\r\n group.writer = this.agent.print(items);\r\n }\r\n });\r\n }\r\n\r\n async onInput(action: string | { [key: string]: any; actionKey: string; label?: string }) {\r\n const actionKey = typeof action === 'string' ? action : action.actionKey;\r\n\r\n switch (actionKey) {\r\n case 'next':\r\n {\r\n if (typeof action === 'string') {\r\n return;\r\n }\r\n const group = this.groups.find((other) => other.id === action.data?.groupId);\r\n\r\n if (group) {\r\n const response = await this.httpClient.nextAction(group);\r\n if (response) {\r\n const combined = response.items.map((item) => item.message);\r\n group.meta.paging = response?.meta.paging;\r\n group.writer.update(combined);\r\n }\r\n }\r\n }\r\n break;\r\n case 'help':\r\n {\r\n const loader = this.conversation.loading();\r\n\r\n const response = await this.httpClient.helpAction();\r\n loader();\r\n if (response) {\r\n this.onMessagesReceived(response);\r\n }\r\n }\r\n break;\r\n default:\r\n {\r\n if (typeof action !== 'string' && action.label) {\r\n this.printUserMessage(action.label);\r\n }\r\n const loader = this.conversation.loading();\r\n const response = await this.httpClient.defaultAction(actionKey);\r\n if (response) {\r\n this.onMessagesReceived(response);\r\n }\r\n loader();\r\n }\r\n break;\r\n }\r\n }\r\n\r\n private printUserMessage(message: string) {\r\n const group = createGroup({\r\n isUser: true,\r\n items: [\r\n {\r\n id: uuid(),\r\n isUser: true,\r\n message: [ConversationMessageListItemType.HTML, { body: message }],\r\n },\r\n ],\r\n });\r\n this.onMessagesReceived([group]);\r\n return group;\r\n }\r\n\r\n async onMessageSend(message: string) {\r\n const loader = this.conversation.loading();\r\n const response = await this.httpClient.sendMessage(message);\r\n\r\n this.printUserMessage(message);\r\n\r\n if (response) {\r\n this.onMessagesReceived(response);\r\n }\r\n loader();\r\n }\r\n\r\n private async onWidgetEntryReceived(data: ServerEntry['content']) {\r\n const agentSettings = {\r\n name: data.agent.name,\r\n avatar: data.agent.avatar,\r\n };\r\n this.agent.update(agentSettings);\r\n const write = await createStorageWriter(\r\n this.container,\r\n 'bot-provider-conversation-meta',\r\n StorageCategory.Necessary\r\n );\r\n write({\r\n agent: agentSettings,\r\n });\r\n }\r\n}\r\n\r\nexport default KnowledgeBotProvider;\r\n","import {\r\n ConversationPlatform,\r\n registerCustomMessageComponent,\r\n} from '@telia-ace/widget-conversation';\r\nimport { Container, Widget } from '@webprovisions/platform';\r\nimport KnowledgeBotProvider from './provider';\r\nimport { CustomMessageTypes } from './types';\r\n\r\nconst KnowledgeBotProviderPlugin = async (container: Container) => {\r\n const platform = await ConversationPlatform.getInstance(container);\r\n\r\n registerCustomMessageComponent(\r\n container,\r\n CustomMessageTypes.ContactList,\r\n import('./ui/contact-method-list')\r\n );\r\n registerCustomMessageComponent(\r\n container,\r\n CustomMessageTypes.ContactMethod,\r\n import('./ui/contact-method')\r\n );\r\n\r\n registerCustomMessageComponent(\r\n container,\r\n CustomMessageTypes.NotificationList,\r\n import('./ui/notification-list')\r\n );\r\n registerCustomMessageComponent(\r\n container,\r\n CustomMessageTypes.NoGoodAlternative,\r\n import('./ui/no-good-alternative')\r\n );\r\n registerCustomMessageComponent(\r\n container,\r\n CustomMessageTypes.FeedbackList,\r\n import('./ui/feedback-list')\r\n );\r\n\r\n platform.registerProvider('ace-knowledge-bot', (conversation, component) => {\r\n const provider = new KnowledgeBotProvider(container, conversation, component);\r\n provider.initialize();\r\n\r\n component.actions.watch('conversation.user-submit', (input, next) => {\r\n provider.onMessageSend(input.text);\r\n });\r\n\r\n component.actions.watch('conversation.action', (input, next) => {\r\n provider.onInput(input);\r\n\r\n return next(input);\r\n });\r\n\r\n component.actions.create('evaluate', (input) => {\r\n const { events } = container.get('$widget') as Widget;\r\n events.dispatch('bot-provider:evaluate', input);\r\n });\r\n\r\n component.actions.create('submit', (input) => {\r\n const { events } = container.get('$widget') as Widget;\r\n events.dispatch('bot-provider:form-submitted', input);\r\n });\r\n });\r\n};\r\n\r\nexport default KnowledgeBotProviderPlugin;\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index2.js","sources":["../src/types.ts","../src/utils.ts","../src/entry-handler.ts","../src/http-client.ts","../src/store.ts","../src/provider.ts","../src/plugin.ts"],"sourcesContent":["import { ConversationMessageListItemType } from '@telia-ace/widget-conversation';\r\n\r\nexport enum CustomMessageTypes {\r\n ContactMethod = 'ace-knowledge-bot-contact-method',\r\n ContactList = 'ace-knowledge-bot-contact-list',\r\n FeedbackList = 'ace-knowledge-bot-feedback-list',\r\n NotificationList = 'ace-knowledge-bot-notification-list',\r\n NoGoodAlternative = 'ace-knowledge-bot-no-good-alternative',\r\n}\r\n\r\ntype LooseObject = { [key: string]: any };\r\n\r\nexport interface ActionItem {\r\n label: string;\r\n actionKey: string;\r\n data?: any;\r\n}\r\n\r\nexport interface MessageGroup {\r\n id: string;\r\n isUser: boolean;\r\n items: MessageGroupItem[];\r\n writer?: any;\r\n meta: { [key: string]: any };\r\n}\r\n\r\nexport interface MessageGroupItem {\r\n id: string;\r\n groupId: string;\r\n isUser: boolean;\r\n message: [ConversationMessageListItemType | CustomMessageTypes, any];\r\n}\r\n\r\nexport interface ClientEnvelope {\r\n command?: LooseObject;\r\n action?: {\r\n key: string;\r\n content: any;\r\n };\r\n globalState?: LooseObject;\r\n localState?: LooseObject;\r\n clientId?: string;\r\n funnel?: string;\r\n}\r\n\r\nexport interface ServerEnvelope {\r\n clientId?: string | undefined;\r\n entries: ServerEntry[];\r\n globalState?: GlobalState;\r\n resolveCommand?: string;\r\n clientEnvelope?: ClientEnvelope;\r\n}\r\n\r\nexport interface GlobalState {\r\n completedInteractionsCount: number;\r\n lastQuestion?: string;\r\n lastBotGuide: number;\r\n lastGuideTitle?: string;\r\n site: string;\r\n invincibleParameters: object;\r\n}\r\n\r\nexport interface ServerEntry {\r\n id: string;\r\n type: string;\r\n content: any;\r\n actions: { [key: string]: any };\r\n tags: string[];\r\n relation?: string;\r\n timestamp: string;\r\n localState?: { [key: string]: any };\r\n}\r\n\r\nexport interface ListContent {\r\n header?: string;\r\n actions: ActionItem[];\r\n contactMethodIds?: string[];\r\n entryId: string;\r\n groupId: string;\r\n}\r\n","import { ContactMethodType } from '@telia-ace/knowledge-widget-adapters';\r\nimport { ConversationMessageListItemType } from '@telia-ace/widget-conversation';\r\nimport { FormBuilder, submitButton } from '@telia-ace/widget-forms';\r\nimport { Symbol } from '@telia-ace/widget-ui';\r\nimport { uuid } from '@telia-ace/widget-utilities';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { CustomMessageTypes, MessageGroup, MessageGroupItem } from './types';\r\n\r\nconst convertLegacySymbol = (symbol?: { type: string; content: string }): Symbol | undefined => {\r\n if (symbol) {\r\n const { type, content } = symbol;\r\n if (type && content) {\r\n return { type, content };\r\n }\r\n }\r\n};\r\n\r\nexport const createGroup = ({\r\n isUser,\r\n items = [],\r\n meta = {},\r\n}: {\r\n isUser: boolean;\r\n items?: Partial<MessageGroupItem>[];\r\n meta?: MessageGroup['meta'];\r\n}) => {\r\n const groupId = uuid();\r\n\r\n const group = {\r\n id: groupId,\r\n isUser,\r\n items: items.map((i) => {\r\n return {\r\n id: i.id || uuid(),\r\n isUser: isUser,\r\n groupId: groupId,\r\n message: i.message || [],\r\n };\r\n }),\r\n meta,\r\n } as MessageGroup;\r\n\r\n return group;\r\n};\r\n\r\nexport const contactMethodFromLegacy = (\r\n {\r\n id,\r\n title,\r\n defaultIcon,\r\n exits: [exit],\r\n exitType,\r\n confirmationText,\r\n expandFormAutomatically,\r\n form,\r\n description,\r\n }: any,\r\n options: {\r\n validation?: any;\r\n guideId?: string;\r\n } = {}\r\n): any => {\r\n const { adapter } = exit || { Adapter: {} };\r\n const { clientName = '', settings: adapterSettings = {}, customClientName = '' } = adapter;\r\n const { validation } = options;\r\n\r\n const settings: any = {\r\n id: id.toString(),\r\n title: title,\r\n description: description,\r\n symbol: convertLegacySymbol(defaultIcon),\r\n clientName: clientName === 'custom.adapter' ? customClientName : clientName,\r\n expanded: true,\r\n inline: true,\r\n body: {},\r\n };\r\n\r\n if (clientName.indexOf('phone') > -1 || clientName.indexOf('freetext') > -1) {\r\n const { displayTextBeforeClick, textBeforeClick } = adapterSettings;\r\n if (displayTextBeforeClick === 'true') {\r\n settings.expanded = false;\r\n settings.title = textBeforeClick;\r\n }\r\n\r\n if (clientName.indexOf('phone.text') > -1) {\r\n settings.body.phoneNumber = adapterSettings.phoneNumber;\r\n } else {\r\n settings.body.freetext = adapterSettings.freetext;\r\n }\r\n }\r\n\r\n if (\r\n clientName.indexOf('chat.popup') > -1 ||\r\n clientName.indexOf('link') > -1 ||\r\n (clientName === 'custom.adapter' && exitType === 'custom')\r\n ) {\r\n settings.body = adapterSettings;\r\n settings.body.confirmationFallback = confirmationText;\r\n }\r\n\r\n if (clientName.indexOf('ace') > -1) {\r\n settings.body = adapterSettings;\r\n }\r\n\r\n if (form && form.hasValueComponents) {\r\n if (validation) {\r\n settings.body.form = FormBuilder.fromLegacyForm(id.toString(), form, validation).get();\r\n } else {\r\n settings.body.form = FormBuilder.fromLegacyForm(id.toString(), form).get();\r\n }\r\n if (!expandFormAutomatically) {\r\n settings.expanded = settings.inline = false;\r\n }\r\n\r\n settings.body = updateForm(settings, { submit: 'Submit' });\r\n }\r\n\r\n if (options.guideId) {\r\n settings.body.guideId = options.guideId;\r\n }\r\n\r\n return settings;\r\n};\r\n\r\nexport const getListType = (state: any) => {\r\n if (state?.$type === 'Humany.Matching.Bots.Conversations.GuideListState, Humany.Matching') {\r\n return ConversationMessageListItemType.LinkList;\r\n } else if (\r\n state?.$type ===\r\n 'Humany.Matching.Bots.Conversations.States.GuideFeedbackState, Humany.Matching'\r\n ) {\r\n return CustomMessageTypes.FeedbackList;\r\n } else if (\r\n state?.$type === 'Humany.Matching.Bots.Conversations.States.ContactState, Humany.Matching'\r\n ) {\r\n return CustomMessageTypes.ContactList;\r\n } else return ConversationMessageListItemType.ButtonList;\r\n};\r\n\r\nexport const getKnowledgeBotEndpoint = (\r\n container: Container,\r\n component: any /*: ComponentNodeController */\r\n) => {\r\n const { knowledgeBotEndpoint } = component.properties();\r\n\r\n if (knowledgeBotEndpoint) {\r\n return `${knowledgeBotEndpoint}/conversations`;\r\n }\r\n\r\n const { data } = container.get('$settings');\r\n\r\n if (!data || !data.projection) throw new Error('Missing Knowledge Bot endpoint');\r\n\r\n return `${data.projection}/conversations`;\r\n};\r\n\r\nexport const updateForm = (\r\n contactMethod: ContactMethodType,\r\n {\r\n submit,\r\n errors,\r\n meta,\r\n }: { submit: string; errors?: { [key: string]: string }; meta?: { [key: string]: string } }\r\n): any => {\r\n if (contactMethod?.body?.form) {\r\n const { body } = contactMethod;\r\n const builder = new FormBuilder(body.form);\r\n\r\n if (!body.form.layout.submit) {\r\n builder.createComponent(submitButton(submit, 'submit'));\r\n }\r\n\r\n if (errors) {\r\n builder.setValidationErrors(errors);\r\n }\r\n\r\n if (meta) {\r\n (builder as any).setMeta(meta);\r\n }\r\n\r\n return {\r\n ...body,\r\n form: builder.get(),\r\n };\r\n }\r\n return contactMethod?.body || {};\r\n};\r\n","import { ConversationMessageListItemType } from '@telia-ace/widget-conversation';\r\nimport { uuid } from '@telia-ace/widget-utilities';\r\nimport {\r\n ActionItem,\r\n CustomMessageTypes,\r\n ListContent,\r\n MessageGroup,\r\n MessageGroupItem,\r\n ServerEntry,\r\n} from './types';\r\nimport { contactMethodFromLegacy, createGroup, getListType } from './utils';\r\n\r\nconst createGroupItem = ({\r\n messageId,\r\n message,\r\n group,\r\n}: {\r\n messageId: string;\r\n message: MessageGroupItem['message'];\r\n group: MessageGroup;\r\n}) => {\r\n return {\r\n id: messageId,\r\n message,\r\n groupId: group.id,\r\n isUser: group.isUser,\r\n };\r\n};\r\n\r\nexport const processEntries = async (entries: ServerEntry[], prevGroup?: MessageGroup) => {\r\n const createListContent = (\r\n listType: string,\r\n entry: ServerEntry,\r\n groupId: string,\r\n listContent: ListContent = {\r\n actions: [],\r\n entryId: entry.id,\r\n groupId,\r\n }\r\n ) => {\r\n const contactMethodIds: string[] = [];\r\n\r\n listContent.actions = entry.content.items.map((i: any) => {\r\n const action = {\r\n label: i.title,\r\n actionKey: i.actionKey,\r\n symbol: !!i.symbol ? i.symbol : undefined,\r\n } as ActionItem;\r\n\r\n if (i.data) {\r\n const entryAction = entry.actions[i.actionKey];\r\n if (listType === CustomMessageTypes.ContactList) {\r\n contactMethodIds.push(i.data.id);\r\n action.data = contactMethodFromLegacy(i.data, {\r\n guideId: entryAction?.guideId?.toString(),\r\n });\r\n } else {\r\n action.data = i.data;\r\n }\r\n }\r\n return action;\r\n });\r\n\r\n if (listType === CustomMessageTypes.ContactList) {\r\n listContent.contactMethodIds = contactMethodIds;\r\n }\r\n\r\n return listContent;\r\n };\r\n\r\n const transform = async (\r\n entry: ServerEntry,\r\n group: MessageGroup,\r\n related: ServerEntry[] = [],\r\n prevGroup?: MessageGroup\r\n ) => {\r\n const messageId = uuid();\r\n\r\n switch (entry.type) {\r\n case 'List':\r\n {\r\n const { header, items, html } = entry.content;\r\n\r\n const result = [];\r\n\r\n let listContent = {\r\n actions: [],\r\n entryId: entry.id,\r\n groupId: group.id,\r\n } as ListContent;\r\n\r\n if (header) {\r\n listContent.header = header;\r\n }\r\n\r\n if (items?.length > 0) {\r\n const listType = getListType(entry.localState);\r\n listContent = createListContent(listType, entry, group.id, listContent);\r\n\r\n // entry has related entries\r\n if (!!related.length) {\r\n const pagingEntry = related.find((e) => e.tags.includes('paging'));\r\n const fallbackEntry = related.find((e) => e.tags.includes('fallback'));\r\n\r\n if (pagingEntry?.content) {\r\n group.meta.paging = {\r\n actions: pagingEntry.actions,\r\n items: pagingEntry.content.items,\r\n localState: pagingEntry.localState,\r\n };\r\n pagingEntry.content.items.forEach((i: any) => {\r\n listContent.actions.push({\r\n label: i.title,\r\n actionKey: i.actionKey,\r\n data: {\r\n groupId: !!prevGroup ? prevGroup.id : group.id,\r\n },\r\n });\r\n });\r\n }\r\n\r\n if (fallbackEntry) {\r\n const fallbackAction = fallbackEntry.content.items.find(\r\n (i: any) => i.actionKey === 'help'\r\n );\r\n if (fallbackAction) {\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n ConversationMessageListItemType.Separator,\r\n undefined,\r\n ],\r\n group,\r\n })\r\n );\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n CustomMessageTypes.NoGoodAlternative,\r\n { body: fallbackAction.title },\r\n ],\r\n group,\r\n })\r\n );\r\n }\r\n }\r\n }\r\n\r\n result.unshift(\r\n createGroupItem({\r\n messageId,\r\n message: [listType, listContent],\r\n group,\r\n })\r\n );\r\n }\r\n\r\n if (html) {\r\n result.unshift(\r\n createGroupItem({\r\n messageId,\r\n message: [ConversationMessageListItemType.HTML, { body: html }],\r\n group,\r\n })\r\n );\r\n }\r\n\r\n return result;\r\n }\r\n break;\r\n case 'Text':\r\n {\r\n const result = [];\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n ConversationMessageListItemType.HTML,\r\n { body: entry.content.html },\r\n ],\r\n group,\r\n })\r\n );\r\n\r\n // embedded contact methods\r\n if (!!related.length) {\r\n const contactMethodListEntry = related.find(\r\n (e) =>\r\n e.type === 'List' &&\r\n e.localState?.$type ===\r\n 'Humany.Matching.Bots.Conversations.States.ContactState, Humany.Matching'\r\n );\r\n\r\n const dialogListEntry = related.find((e) => e.tags.includes('dialog'));\r\n const feedbackEntry = related.find((e) => e.tags.includes('feedback'));\r\n\r\n if (dialogListEntry) {\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n ConversationMessageListItemType.ButtonList,\r\n {\r\n actions: dialogListEntry.content.items.map((i: any) => {\r\n return {\r\n label: i.title,\r\n actionKey: i.actionKey,\r\n };\r\n }),\r\n },\r\n ],\r\n group,\r\n })\r\n );\r\n }\r\n\r\n if (contactMethodListEntry) {\r\n const listContent = createListContent(\r\n CustomMessageTypes.ContactList,\r\n contactMethodListEntry,\r\n group.id\r\n );\r\n\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n message: [ConversationMessageListItemType.Separator, undefined],\r\n group,\r\n })\r\n );\r\n\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n message: [CustomMessageTypes.ContactList, listContent],\r\n group,\r\n })\r\n );\r\n }\r\n\r\n if (feedbackEntry) {\r\n if (feedbackEntry.content.html) {\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n group,\r\n message: [\r\n ConversationMessageListItemType.HTML,\r\n {\r\n body: feedbackEntry.content.html,\r\n },\r\n ],\r\n })\r\n );\r\n }\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n group,\r\n message: [\r\n CustomMessageTypes.FeedbackList,\r\n {\r\n actions: feedbackEntry.content.items.map((i: any) => {\r\n return {\r\n actionKey: i.actionKey,\r\n label: i.title,\r\n };\r\n }),\r\n },\r\n ],\r\n })\r\n );\r\n }\r\n }\r\n return result;\r\n }\r\n break;\r\n case 'Contact': {\r\n return [\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n CustomMessageTypes.ContactMethod,\r\n {\r\n contactMethodId: entry.content.id,\r\n groupId: group.id,\r\n guideId: entry.content.guideId,\r\n },\r\n ],\r\n group,\r\n }),\r\n ];\r\n }\r\n case 'CategorizedNoticeList': {\r\n const result = [\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n CustomMessageTypes.NotificationList,\r\n {\r\n id: entry.content.item.id.toString(),\r\n header: entry.content.item.title,\r\n items: entry.content.item.listNotices,\r\n symbol: entry.content.item.defaultIcon,\r\n },\r\n ],\r\n group,\r\n }),\r\n ];\r\n\r\n (entry.content.notices || []).forEach((notice: any) => {\r\n result.push(\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n ConversationMessageListItemType.HTML,\r\n {\r\n body: notice.body,\r\n },\r\n ],\r\n group,\r\n })\r\n );\r\n });\r\n\r\n return result;\r\n }\r\n case 'footerNotice': {\r\n return [\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n ConversationMessageListItemType.HTML,\r\n {\r\n body: entry.content.item.body,\r\n },\r\n ],\r\n group,\r\n }),\r\n ];\r\n }\r\n case 'Error': {\r\n return [\r\n createGroupItem({\r\n messageId,\r\n message: [\r\n ConversationMessageListItemType.HTML,\r\n {\r\n body: entry.content.message || 'Something went wrong.',\r\n },\r\n ],\r\n group,\r\n }),\r\n ];\r\n }\r\n\r\n default:\r\n return [];\r\n }\r\n };\r\n\r\n const splitEntry = (entry: ServerEntry): ServerEntry | ServerEntry[] => {\r\n if (['CategorizedNoticeList', 'NoticeList'].includes(entry.type)) {\r\n return (entry.content.items || []).reduce((acc: any, item: any) => {\r\n if (!entry.content.isInitialNotices) {\r\n return acc;\r\n }\r\n acc.push({\r\n ...entry,\r\n id: uuid(),\r\n type: item.type || entry.type,\r\n content: {\r\n $type: entry.content.$type,\r\n isInitialNotices: entry.content.isInitialNotices,\r\n notices: item.notices,\r\n item,\r\n },\r\n });\r\n return acc;\r\n }, []);\r\n }\r\n return entry;\r\n };\r\n\r\n // map of in which order the messages should be displayed\r\n // lower numbers will be displayed above higher\r\n const sortMap = new Map<string, number>([\r\n ['Text', 1],\r\n ['List', 2],\r\n ['Contact', 3],\r\n ['CategorizedNoticeList', 10],\r\n ]);\r\n\r\n const result: MessageGroup[] = [];\r\n const filteredEntries = entries\r\n .sort((item, other) => {\r\n // sort the entries based on it's types sort value\r\n const defaultSortValue = 20;\r\n\r\n var sortValue = sortMap.get(item.type) || defaultSortValue;\r\n var sortValueOther = sortMap.get(other.type) || defaultSortValue;\r\n return sortValue - sortValueOther;\r\n })\r\n .filter((entry) => !entry.relation) // remove any \"relation entries\"\r\n .reduce<ServerEntry[]>((acc, entry) => {\r\n // some entries needs to be splitted into seperate groups\r\n return acc.concat(splitEntry(entry));\r\n }, []);\r\n\r\n for (const entry of filteredEntries) {\r\n const relatedEntries = entries.filter((other) => other.relation === entry.id);\r\n const group = createGroup({ isUser: false });\r\n\r\n const items = await transform(entry, group, relatedEntries, prevGroup);\r\n items.forEach((item) => {\r\n group.items.push(item);\r\n });\r\n\r\n if (group.items.length) {\r\n result.push(group);\r\n }\r\n }\r\n return result;\r\n};\r\n","import { uuid } from '@telia-ace/widget-utilities';\r\nimport { Container, EventManager } from '@webprovisions/platform';\r\nimport { processEntries } from './entry-handler';\r\nimport Store from './store';\r\nimport { ClientEnvelope, MessageGroup, ServerEntry, ServerEnvelope } from './types';\r\n\r\nclass HttpClient {\r\n private globalState: any;\r\n private clientId: string;\r\n private entries: ServerEntry[];\r\n\r\n constructor(\r\n private endpoint: string,\r\n private events: EventManager,\r\n private store: Store,\r\n private container: Container\r\n ) {\r\n this.clientId = uuid();\r\n this.entries = [];\r\n }\r\n\r\n async start() {\r\n const storedMessages = await this.store.read();\r\n\r\n // if there are a session stored, rehydrate the messages\r\n // otherwise create a new session\r\n if (storedMessages && storedMessages.length > 0) {\r\n const storedGlobalState = this.store.readGlobalState();\r\n this.globalState = storedGlobalState;\r\n return storedMessages;\r\n } else {\r\n const envelope = this.createInitialEnvelope();\r\n const initialResponse = await this.postEnvelope(envelope);\r\n return initialResponse;\r\n }\r\n }\r\n\r\n async sendMessage(message: string) {\r\n const envelope = {\r\n command: { phrase: message },\r\n globalState: this.globalState,\r\n clientId: this.clientId,\r\n };\r\n\r\n const result = await this.postEnvelope(envelope);\r\n return result;\r\n }\r\n\r\n async helpAction() {\r\n return this.postEnvelope({\r\n action: {\r\n key: 'help',\r\n content: {\r\n $type: 'Humany.Matching.Bots.Conversations.Actions.Help, Humany.Matching',\r\n },\r\n },\r\n globalState: this.globalState,\r\n clientId: this.clientId,\r\n });\r\n }\r\n\r\n async nextAction(group: MessageGroup) {\r\n const { paging } = group.meta;\r\n if (!paging.actions?.next) {\r\n return;\r\n }\r\n return this.postEnvelope(\r\n {\r\n action: {\r\n key: 'next',\r\n content: paging.actions.next,\r\n },\r\n localState: paging.localState,\r\n globalState: this.globalState,\r\n clientId: this.clientId,\r\n },\r\n group\r\n ).then((response) => {\r\n const listItemIndex = group.items.findIndex((item) => item.message[0] === 'link-list');\r\n if (listItemIndex === -1 || !response) {\r\n return group;\r\n }\r\n\r\n return {\r\n ...group,\r\n meta: {\r\n ...group.meta,\r\n ...response[0].meta,\r\n },\r\n items: [\r\n ...group.items.slice(0, listItemIndex),\r\n {\r\n ...group.items[listItemIndex],\r\n message: [\r\n response[0].items[0].message[0],\r\n {\r\n ...group.items[listItemIndex].message[1],\r\n ...response[0].items[0].message[1],\r\n },\r\n ],\r\n },\r\n ...group.items.slice(listItemIndex + 1),\r\n ],\r\n };\r\n });\r\n }\r\n\r\n async showContactMethodAction(data: {\r\n contactMethod: any;\r\n actionKey: string;\r\n entryId: string;\r\n }) {\r\n const entry = this.entries.find((e) => e.id === data.entryId);\r\n const actionItem = entry?.actions[data.actionKey];\r\n\r\n if (!actionItem) {\r\n return;\r\n }\r\n\r\n return this.postEnvelope({\r\n action: {\r\n key: data.actionKey,\r\n content: actionItem,\r\n },\r\n localState: entry.localState,\r\n globalState: this.globalState,\r\n clientId: this.clientId,\r\n });\r\n }\r\n\r\n async defaultAction(action: string) {\r\n const entry = this.getEntryOfAction(action);\r\n\r\n if (!entry) {\r\n return;\r\n }\r\n\r\n return this.postEnvelope({\r\n action: {\r\n key: action,\r\n content: entry.actions[action],\r\n },\r\n localState: entry.localState,\r\n globalState: this.globalState,\r\n clientId: this.clientId,\r\n });\r\n }\r\n\r\n private createInitialEnvelope(): ClientEnvelope {\r\n return {\r\n command: { site: this.endpoint },\r\n clientId: this.clientId,\r\n globalState: {},\r\n funnel: this.container.get('$widget').name,\r\n };\r\n }\r\n\r\n private async postEnvelope(envelope: ClientEnvelope, prevGroup?: MessageGroup) {\r\n try {\r\n const response = await fetch(this.endpoint, this.getHttpOptions(envelope));\r\n\r\n if (!response.ok) {\r\n throw response;\r\n }\r\n\r\n const data = await response.json();\r\n\r\n return this.handleResponse(data, prevGroup);\r\n } catch (error: any) {\r\n if (process.env.NODE_ENV !== 'production') {\r\n console.warn('Something went wrong when posting the envelope.');\r\n }\r\n let message = 'Something went wrong';\r\n\r\n if (error.message === 'Failed to fetch') {\r\n message = 'Lost connection... Please try again.';\r\n }\r\n return this.handleResponse({\r\n entries: [\r\n {\r\n id: uuid(),\r\n type: 'Error',\r\n timestamp: new Date().toISOString(),\r\n content: {\r\n message,\r\n },\r\n actions: {},\r\n tags: [],\r\n },\r\n ],\r\n });\r\n }\r\n }\r\n\r\n private async handleResponse(data: ServerEnvelope, prevGroup?: MessageGroup) {\r\n this.entries = this.entries.concat(data.entries);\r\n\r\n const widgetEntry = data.entries.find((e) => e.type === 'Widget');\r\n\r\n if (widgetEntry) {\r\n this.events.dispatch('provider:widget-entry', widgetEntry.content);\r\n }\r\n\r\n if (data.globalState) {\r\n this.globalState = data.globalState;\r\n }\r\n const groups = await processEntries(data.entries, prevGroup);\r\n return groups;\r\n }\r\n\r\n private getHttpOptions(envelope: ClientEnvelope) {\r\n const fetchOptions = {\r\n method: 'POST',\r\n headers: {\r\n Accept: 'application/json',\r\n 'Content-Type': 'application/json',\r\n },\r\n };\r\n envelope.funnel = this.container.get('$widget').name;\r\n return Object.assign({}, fetchOptions, {\r\n body: JSON.stringify(envelope),\r\n credentials: 'same-origin' as RequestCredentials,\r\n });\r\n }\r\n\r\n private getEntryOfAction(action: string) {\r\n return this.entries.find((entry) => !!entry.actions[action]);\r\n }\r\n}\r\n\r\nexport default HttpClient;\r\n","import { createStorageWriter, readStorage, StorageCategory } from '@telia-ace/widget-services';\r\nimport { Container } from '@webprovisions/platform';\r\nimport { GlobalState, MessageGroup } from './types';\r\n\r\nclass Store {\r\n private enabled = false; // set whether or not to store data\r\n private sessionMessageStorageVariable: string = 'knowledge-bot-messages';\r\n private botProviderGlobalStateKey = 'bot-provider-global-state';\r\n private botProviderMetaStateKey = 'bot-provider-conversation-meta';\r\n\r\n constructor(private container: Container) {}\r\n\r\n async readGlobalState() {\r\n if (!this.enabled) {\r\n return undefined;\r\n }\r\n const state: GlobalState | undefined = await readStorage(\r\n this.container,\r\n this.botProviderGlobalStateKey\r\n );\r\n return state;\r\n }\r\n\r\n async readMetaState() {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n return readStorage(this.container, this.botProviderMetaStateKey);\r\n }\r\n\r\n async write(groups: MessageGroup[]) {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n return createStorageWriter(\r\n this.container,\r\n this.sessionMessageStorageVariable,\r\n StorageCategory.Necessary\r\n ).then((write) => {\r\n return write(groups);\r\n });\r\n }\r\n\r\n async read() {\r\n if (!this.enabled) {\r\n return [];\r\n }\r\n return readStorage<MessageGroup[]>(this.container, this.sessionMessageStorageVariable).then(\r\n (groups) => {\r\n return groups || [];\r\n }\r\n );\r\n }\r\n}\r\n\r\nexport default Store;\r\n","import { ComponentNodeController } from '@telia-ace/knowledge-widget-core';\r\nimport { ConversationMessageListItemType } from '@telia-ace/widget-conversation';\r\nimport { createStorageWriter, StorageCategory } from '@telia-ace/widget-services';\r\nimport { uuid } from '@telia-ace/widget-utilities';\r\nimport { Container, EventManager, Widget } from '@webprovisions/platform';\r\nimport HttpClient from './http-client';\r\nimport Store from './store';\r\nimport { MessageGroup, ServerEntry } from './types';\r\nimport { createGroup, getKnowledgeBotEndpoint } from './utils';\r\n\r\nclass KnowledgeBotProvider {\r\n private agent: any;\r\n private user: any;\r\n private httpClient: HttpClient;\r\n private events: EventManager;\r\n private groups: MessageGroup[] = [];\r\n private store: Store;\r\n\r\n constructor(\r\n private container: Container,\r\n private conversation: any,\r\n component: ComponentNodeController\r\n ) {\r\n const { events } = this.container.get('$widget') as Widget;\r\n this.events = events;\r\n this.store = new Store(container);\r\n this.agent = conversation.createAgent({\r\n name: '',\r\n avatar: undefined,\r\n });\r\n this.user = conversation.user;\r\n const endpoint = getKnowledgeBotEndpoint(container, component);\r\n this.httpClient = new HttpClient(endpoint, events, this.store, this.container);\r\n\r\n this.events.subscribe('provider:widget-entry', (_event, data: ServerEntry['content']) => {\r\n this.onWidgetEntryReceived(data);\r\n });\r\n\r\n this.events.subscribe(\r\n 'provider:open-contact-method',\r\n async (_event, data: { contactMethod: any; entryId: string; actionKey: string }) => {\r\n const response = await this.httpClient.showContactMethodAction(data);\r\n\r\n if (response) {\r\n if (!!data.contactMethod.title) this.printUserMessage(data.contactMethod.title);\r\n this.onMessagesReceived(response);\r\n }\r\n }\r\n );\r\n }\r\n\r\n async initialize() {\r\n const loader = this.conversation.loading();\r\n\r\n const storedMeta: any = await this.store.readMetaState();\r\n if (storedMeta?.agent) {\r\n this.agent.update({\r\n name: storedMeta.agent.name,\r\n avatar: storedMeta.agent.avatar,\r\n });\r\n }\r\n\r\n const response = await this.httpClient.start();\r\n if (response) {\r\n this.onMessagesReceived(response);\r\n }\r\n\r\n loader();\r\n }\r\n\r\n async onMessagesReceived(groups: MessageGroup[]) {\r\n this.groups = this.groups.concat(groups);\r\n await this.store.write(this.groups);\r\n groups.forEach((group) => {\r\n const items = group.items.map((item) => item.message);\r\n if (group.isUser) {\r\n group.writer = this.user.print(items);\r\n } else {\r\n group.writer = this.agent.print(items);\r\n }\r\n });\r\n }\r\n\r\n async onInput(action: string | { [key: string]: any; actionKey: string; label?: string }) {\r\n const actionKey = typeof action === 'string' ? action : action.actionKey;\r\n\r\n switch (actionKey) {\r\n case 'next':\r\n {\r\n if (typeof action === 'string') {\r\n return;\r\n }\r\n const group = this.groups.find((other) => other.id === action.data?.groupId);\r\n\r\n if (group) {\r\n const response = await this.httpClient.nextAction(group);\r\n if (response) {\r\n const combined = response.items.map((item) => item.message);\r\n group.meta.paging = response?.meta.paging;\r\n group.writer.update(combined);\r\n }\r\n }\r\n }\r\n break;\r\n case 'help':\r\n {\r\n const loader = this.conversation.loading();\r\n\r\n const response = await this.httpClient.helpAction();\r\n loader();\r\n if (response) {\r\n this.onMessagesReceived(response);\r\n }\r\n }\r\n break;\r\n default:\r\n {\r\n if (typeof action !== 'string' && action.label) {\r\n this.printUserMessage(action.label);\r\n }\r\n const loader = this.conversation.loading();\r\n const response = await this.httpClient.defaultAction(actionKey);\r\n if (response) {\r\n this.onMessagesReceived(response);\r\n }\r\n loader();\r\n }\r\n break;\r\n }\r\n }\r\n\r\n private printUserMessage(message: string) {\r\n const group = createGroup({\r\n isUser: true,\r\n items: [\r\n {\r\n id: uuid(),\r\n isUser: true,\r\n message: [ConversationMessageListItemType.HTML, { body: message }],\r\n },\r\n ],\r\n });\r\n this.onMessagesReceived([group]);\r\n return group;\r\n }\r\n\r\n async onMessageSend(message: string) {\r\n const loader = this.conversation.loading();\r\n const response = await this.httpClient.sendMessage(message);\r\n\r\n this.printUserMessage(message);\r\n\r\n if (response) {\r\n this.onMessagesReceived(response);\r\n }\r\n loader();\r\n }\r\n\r\n private async onWidgetEntryReceived(data: ServerEntry['content']) {\r\n const agentSettings = {\r\n name: data.agent.name,\r\n avatar: data.agent.avatar,\r\n };\r\n this.agent.update(agentSettings);\r\n const write = await createStorageWriter(\r\n this.container,\r\n 'bot-provider-conversation-meta',\r\n StorageCategory.Necessary\r\n );\r\n write({\r\n agent: agentSettings,\r\n });\r\n }\r\n}\r\n\r\nexport default KnowledgeBotProvider;\r\n","import {\r\n ConversationPlatform,\r\n registerCustomMessageComponent,\r\n} from '@telia-ace/widget-conversation';\r\nimport { Container, Widget } from '@webprovisions/platform';\r\nimport KnowledgeBotProvider from './provider';\r\nimport { CustomMessageTypes } from './types';\r\n\r\nconst KnowledgeBotProviderPlugin = async (container: Container) => {\r\n const platform = await ConversationPlatform.getInstance(container);\r\n\r\n registerCustomMessageComponent(\r\n container,\r\n CustomMessageTypes.ContactList,\r\n import('./ui/contact-method-list')\r\n );\r\n registerCustomMessageComponent(\r\n container,\r\n CustomMessageTypes.ContactMethod,\r\n import('./ui/contact-method')\r\n );\r\n\r\n registerCustomMessageComponent(\r\n container,\r\n CustomMessageTypes.NotificationList,\r\n import('./ui/notification-list')\r\n );\r\n registerCustomMessageComponent(\r\n container,\r\n CustomMessageTypes.NoGoodAlternative,\r\n import('./ui/no-good-alternative')\r\n );\r\n registerCustomMessageComponent(\r\n container,\r\n CustomMessageTypes.FeedbackList,\r\n import('./ui/feedback-list')\r\n );\r\n\r\n platform.registerProvider('ace-knowledge-bot', (conversation, component) => {\r\n const provider = new KnowledgeBotProvider(container, conversation, component);\r\n provider.initialize();\r\n\r\n component.actions.watch('conversation.user-submit', (input, next) => {\r\n provider.onMessageSend(input.text);\r\n });\r\n\r\n component.actions.watch('conversation.action', (input, next) => {\r\n provider.onInput(input);\r\n\r\n return next(input);\r\n });\r\n\r\n component.actions.create('evaluate', (input) => {\r\n const { events } = container.get('$widget') as Widget;\r\n events.dispatch('bot-provider:evaluate', input);\r\n });\r\n\r\n component.actions.create('submit', (input) => {\r\n const { events } = container.get('$widget') as Widget;\r\n events.dispatch('bot-provider:form-submitted', input);\r\n });\r\n });\r\n};\r\n\r\nexport default KnowledgeBotProviderPlugin;\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEY,IAAA,uCAAA,wBAAL;AACa,sBAAA,mBAAA;AACF,sBAAA,iBAAA;AACC,sBAAA,kBAAA;AACI,sBAAA,sBAAA;AACC,sBAAA,uBAAA;AALZ,SAAA;AAAA,GAAA,sBAAA,CAAA,CAAA;ACMZ,MAAM,sBAAsB,CAAC,WAAmE;AAC5F,MAAI,QAAQ;AACF,UAAA,EAAE,MAAM,YAAY;AAC1B,QAAI,QAAQ,SAAS;AACV,aAAA,EAAE,MAAM;IACnB;AAAA,EACJ;AACJ;AAEO,MAAM,cAAc,CAAC;AAAA,EACxB;AAAA,EACA,QAAQ,CAAC;AAAA,EACT,OAAO,CAAC;AAAA,MAKN;AACF,QAAM,UAAU;AAEhB,QAAM,QAAQ;AAAA,IACV,IAAI;AAAA,IACJ;AAAA,IACA,OAAO,MAAM,IAAI,CAAC,MAAM;AACb,aAAA;AAAA,QACH,IAAI,EAAE,MAAM,KAAK;AAAA,QACjB;AAAA,QACA;AAAA,QACA,SAAS,EAAE,WAAW,CAAC;AAAA,MAAA;AAAA,IAC3B,CACH;AAAA,IACD;AAAA,EAAA;AAGG,SAAA;AACX;AAEO,MAAM,0BAA0B,CACnC;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO,CAAC;AAAA,EACR;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,GAEJ,UAGI,CAAA,MACE;AACN,QAAM,EAAE,YAAY,QAAQ,EAAE,SAAS,CAAG,EAAA;AACpC,QAAA,EAAE,aAAa,IAAI,UAAU,kBAAkB,CAAA,GAAI,mBAAmB,OAAO;AACnF,QAAM,EAAE,eAAe;AAEvB,QAAM,WAAgB;AAAA,IAClB,IAAI,GAAG,SAAS;AAAA,IAChB;AAAA,IACA;AAAA,IACA,QAAQ,oBAAoB,WAAW;AAAA,IACvC,YAAY,eAAe,mBAAmB,mBAAmB;AAAA,IACjE,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,MAAM,CAAC;AAAA,EAAA;AAGP,MAAA,WAAW,QAAQ,OAAO,IAAI,MAAM,WAAW,QAAQ,UAAU,IAAI,IAAI;AACnE,UAAA,EAAE,wBAAwB,oBAAoB;AACpD,QAAI,2BAA2B,QAAQ;AACnC,eAAS,WAAW;AACpB,eAAS,QAAQ;AAAA,IACrB;AAEA,QAAI,WAAW,QAAQ,YAAY,IAAI,IAAI;AAC9B,eAAA,KAAK,cAAc,gBAAgB;AAAA,IAAA,OACzC;AACM,eAAA,KAAK,WAAW,gBAAgB;AAAA,IAC7C;AAAA,EACJ;AAEA,MACI,WAAW,QAAQ,YAAY,IAAI,MACnC,WAAW,QAAQ,MAAM,IAAI,MAC5B,eAAe,oBAAoB,aAAa,UACnD;AACE,aAAS,OAAO;AAChB,aAAS,KAAK,uBAAuB;AAAA,EACzC;AAEA,MAAI,WAAW,QAAQ,KAAK,IAAI,IAAI;AAChC,aAAS,OAAO;AAAA,EACpB;AAEI,MAAA,QAAQ,KAAK,oBAAoB;AACjC,QAAI,YAAY;AACH,eAAA,KAAK,OAAO,YAAY,eAAe,GAAG,YAAY,MAAM,UAAU,EAAE,IAAI;AAAA,IAAA,OAClF;AACM,eAAA,KAAK,OAAO,YAAY,eAAe,GAAG,YAAY,IAAI,EAAE;IACzE;AACA,QAAI,CAAC,yBAAyB;AACjB,eAAA,WAAW,SAAS,SAAS;AAAA,IAC1C;AAEA,aAAS,OAAO,WAAW,UAAU,EAAE,QAAQ,UAAU;AAAA,EAC7D;AAEA,MAAI,QAAQ,SAAS;AACR,aAAA,KAAK,UAAU,QAAQ;AAAA,EACpC;AAEO,SAAA;AACX;AAEa,MAAA,cAAc,CAAC,UAAe;AACnC,MAAA,gCAAO,WAAU,sEAAsE;AACvF,WAAO,gCAAgC;AAAA,EAAA,WAEvC,gCAAO,WACP,iFACF;AACE,WAAO,mBAAmB;AAAA,EAAA,WAE1B,gCAAO,WAAU,2EACnB;AACE,WAAO,mBAAmB;AAAA,EAC9B;AAAO,WAAO,gCAAgC;AAClD;AAEa,MAAA,0BAA0B,CACnC,WACA,cACC;AACK,QAAA,EAAE,yBAAyB,UAAU,WAAW;AAEtD,MAAI,sBAAsB;AACtB,WAAO,GAAG;AAAA,EACd;AAEA,QAAM,EAAE,SAAS,UAAU,IAAI,WAAW;AAEtC,MAAA,CAAC,QAAQ,CAAC,KAAK;AAAkB,UAAA,IAAI,MAAM,gCAAgC;AAE/E,SAAO,GAAG,KAAK;AACnB;AAEa,MAAA,aAAa,CACtB,eACA;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,MAEE;;AACF,MAAA,qDAAe,SAAf,mBAAqB,MAAM;AAC3B,UAAM,EAAE,SAAS;AACjB,UAAM,UAAU,IAAI,YAAY,KAAK,IAAI;AAEzC,QAAI,CAAC,KAAK,KAAK,OAAO,QAAQ;AAC1B,cAAQ,gBAAgB,aAAa,QAAQ,QAAQ,CAAC;AAAA,IAC1D;AAEA,QAAI,QAAQ;AACR,cAAQ,oBAAoB,MAAM;AAAA,IACtC;AAEA,QAAI,MAAM;AACL,cAAgB,QAAQ,IAAI;AAAA,IACjC;AAEO,WAAA,iCACA,OADA;AAAA,MAEH,MAAM,QAAQ,IAAI;AAAA,IAAA;AAAA,EAE1B;AACO,SAAA,gDAAe,SAAQ;AAClC;AC9KA,MAAM,kBAAkB,CAAC;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,MAKE;AACK,SAAA;AAAA,IACH,IAAI;AAAA,IACJ;AAAA,IACA,SAAS,MAAM;AAAA,IACf,QAAQ,MAAM;AAAA,EAAA;AAEtB;AAEa,MAAA,iBAAiB,CAAO,SAAwB,cAA6B;AACtF,QAAM,oBAAoB,CACtB,UACA,OACA,SACA,cAA2B;AAAA,IACvB,SAAS,CAAC;AAAA,IACV,SAAS,MAAM;AAAA,IACf;AAAA,EAAA,MAEH;AACD,UAAM,mBAA6B,CAAA;AAEnC,gBAAY,UAAU,MAAM,QAAQ,MAAM,IAAI,CAAC,MAAW;;AACtD,YAAM,SAAS;AAAA,QACX,OAAO,EAAE;AAAA,QACT,WAAW,EAAE;AAAA,QACb,QAAQ,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,MAAA;AAGpC,UAAI,EAAE,MAAM;AACF,cAAA,cAAc,MAAM,QAAQ,EAAE;AAChC,YAAA,aAAa,mBAAmB,aAAa;AAC5B,2BAAA,KAAK,EAAE,KAAK,EAAE;AACxB,iBAAA,OAAO,wBAAwB,EAAE,MAAM;AAAA,YAC1C,SAAS,iDAAa,YAAb,mBAAsB;AAAA,UAAS,CAC3C;AAAA,QAAA,OACE;AACH,iBAAO,OAAO,EAAE;AAAA,QACpB;AAAA,MACJ;AACO,aAAA;AAAA,IAAA,CACV;AAEG,QAAA,aAAa,mBAAmB,aAAa;AAC7C,kBAAY,mBAAmB;AAAA,IACnC;AAEO,WAAA;AAAA,EAAA;AAGX,QAAM,YAAY,CACd,IACA,OAGC,sBAJD,IACA,IAGC,mBAJD,OACA,OACA,UAAyB,IACzB,YACC;AACD,UAAM,YAAY;AAElB,YAAQ,MAAM;AAAA,WACL,QACD;AACI,cAAM,EAAE,QAAQ,OAAO,SAAS,MAAM;AAEtC,cAAM,UAAS,CAAA;AAEf,YAAI,cAAc;AAAA,UACd,SAAS,CAAC;AAAA,UACV,SAAS,MAAM;AAAA,UACf,SAAS,MAAM;AAAA,QAAA;AAGnB,YAAI,QAAQ;AACR,sBAAY,SAAS;AAAA,QACzB;AAEI,YAAA,gCAAO,UAAS,GAAG;AACb,gBAAA,WAAW,YAAY,MAAM,UAAU;AAC7C,wBAAc,kBAAkB,UAAU,OAAO,MAAM,IAAI,WAAW;AAGlE,cAAA,CAAC,CAAC,QAAQ,QAAQ;AACZ,kBAAA,cAAc,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,SAAS,QAAQ,CAAC;AAC3D,kBAAA,gBAAgB,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,SAAS,UAAU,CAAC;AAErE,gBAAI,2CAAa,SAAS;AACtB,oBAAM,KAAK,SAAS;AAAA,gBAChB,SAAS,YAAY;AAAA,gBACrB,OAAO,YAAY,QAAQ;AAAA,gBAC3B,YAAY,YAAY;AAAA,cAAA;AAE5B,0BAAY,QAAQ,MAAM,QAAQ,CAAC,MAAW;AAC1C,4BAAY,QAAQ,KAAK;AAAA,kBACrB,OAAO,EAAE;AAAA,kBACT,WAAW,EAAE;AAAA,kBACb,MAAM;AAAA,oBACF,SAAS,CAAC,CAAC,aAAY,WAAU,KAAK,MAAM;AAAA,kBAChD;AAAA,gBAAA,CACH;AAAA,cAAA,CACJ;AAAA,YACL;AAEA,gBAAI,eAAe;AACT,oBAAA,iBAAiB,cAAc,QAAQ,MAAM,KAC/C,CAAC,MAAW,EAAE,cAAc,MAChC;AACA,kBAAI,gBAAgB;AAChB,wBAAO,KACH,gBAAgB;AAAA,kBACZ;AAAA,kBACA,SAAS;AAAA,oBACL,gCAAgC;AAAA,oBAChC;AAAA,kBACJ;AAAA,kBACA;AAAA,gBACH,CAAA,CACL;AACA,wBAAO,KACH,gBAAgB;AAAA,kBACZ;AAAA,kBACA,SAAS;AAAA,oBACL,mBAAmB;AAAA,oBACnB,EAAE,MAAM,eAAe,MAAM;AAAA,kBACjC;AAAA,kBACA;AAAA,gBACH,CAAA,CACL;AAAA,cACJ;AAAA,YACJ;AAAA,UACJ;AAEA,kBAAO,QACH,gBAAgB;AAAA,YACZ;AAAA,YACA,SAAS,CAAC,UAAU,WAAW;AAAA,YAC/B;AAAA,UACH,CAAA,CACL;AAAA,QACJ;AAEA,YAAI,MAAM;AACN,kBAAO,QACH,gBAAgB;AAAA,YACZ;AAAA,YACA,SAAS,CAAC,gCAAgC,MAAM,EAAE,MAAM,MAAM;AAAA,YAC9D;AAAA,UACH,CAAA,CACL;AAAA,QACJ;AAEO,eAAA;AAAA,MACX;AAAA,WAEC,QACD;AACI,cAAM,UAAS,CAAA;AACf,gBAAO,KACH,gBAAgB;AAAA,UACZ;AAAA,UACA,SAAS;AAAA,YACL,gCAAgC;AAAA,YAChC,EAAE,MAAM,MAAM,QAAQ,KAAK;AAAA,UAC/B;AAAA,UACA;AAAA,QACH,CAAA,CACL;AAGI,YAAA,CAAC,CAAC,QAAQ,QAAQ;AACZ,gBAAA,yBAAyB,QAAQ,KACnC,CAAC,MAAA;;AACG,qBAAE,SAAS,UACX,SAAE,eAAF,mBAAc,WACV;AAAA,WACZ;AAEM,gBAAA,kBAAkB,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,SAAS,QAAQ,CAAC;AAC/D,gBAAA,gBAAgB,QAAQ,KAAK,CAAC,MAAM,EAAE,KAAK,SAAS,UAAU,CAAC;AAErE,cAAI,iBAAiB;AACjB,oBAAO,KACH,gBAAgB;AAAA,cACZ;AAAA,cACA,SAAS;AAAA,gBACL,gCAAgC;AAAA,gBAChC;AAAA,kBACI,SAAS,gBAAgB,QAAQ,MAAM,IAAI,CAAC,MAAW;AAC5C,2BAAA;AAAA,sBACH,OAAO,EAAE;AAAA,sBACT,WAAW,EAAE;AAAA,oBAAA;AAAA,kBACjB,CACH;AAAA,gBACL;AAAA,cACJ;AAAA,cACA;AAAA,YACH,CAAA,CACL;AAAA,UACJ;AAEA,cAAI,wBAAwB;AACxB,kBAAM,cAAc,kBAChB,mBAAmB,aACnB,wBACA,MAAM,EACV;AAEA,oBAAO,KACH,gBAAgB;AAAA,cACZ;AAAA,cACA,SAAS,CAAC,gCAAgC,WAAW,MAAS;AAAA,cAC9D;AAAA,YACH,CAAA,CACL;AAEA,oBAAO,KACH,gBAAgB;AAAA,cACZ;AAAA,cACA,SAAS,CAAC,mBAAmB,aAAa,WAAW;AAAA,cACrD;AAAA,YACH,CAAA,CACL;AAAA,UACJ;AAEA,cAAI,eAAe;AACX,gBAAA,cAAc,QAAQ,MAAM;AAC5B,sBAAO,KACH,gBAAgB;AAAA,gBACZ;AAAA,gBACA;AAAA,gBACA,SAAS;AAAA,kBACL,gCAAgC;AAAA,kBAChC;AAAA,oBACI,MAAM,cAAc,QAAQ;AAAA,kBAChC;AAAA,gBACJ;AAAA,cACH,CAAA,CACL;AAAA,YACJ;AACA,oBAAO,KACH,gBAAgB;AAAA,cACZ;AAAA,cACA;AAAA,cACA,SAAS;AAAA,gBACL,mBAAmB;AAAA,gBACnB;AAAA,kBACI,SAAS,cAAc,QAAQ,MAAM,IAAI,CAAC,MAAW;AAC1C,2BAAA;AAAA,sBACH,WAAW,EAAE;AAAA,sBACb,OAAO,EAAE;AAAA,oBAAA;AAAA,kBACb,CACH;AAAA,gBACL;AAAA,cACJ;AAAA,YACH,CAAA,CACL;AAAA,UACJ;AAAA,QACJ;AACO,eAAA;AAAA,MACX;AAAA,WAEC,WAAW;AACL,eAAA;AAAA,UACH,gBAAgB;AAAA,YACZ;AAAA,YACA,SAAS;AAAA,cACL,mBAAmB;AAAA,cACnB;AAAA,gBACI,iBAAiB,MAAM,QAAQ;AAAA,gBAC/B,SAAS,MAAM;AAAA,gBACf,SAAS,MAAM,QAAQ;AAAA,cAC3B;AAAA,YACJ;AAAA,YACA;AAAA,UAAA,CACH;AAAA,QAAA;AAAA,MAET;AAAA,WACK,yBAAyB;AAC1B,cAAM,UAAS;AAAA,UACX,gBAAgB;AAAA,YACZ;AAAA,YACA,SAAS;AAAA,cACL,mBAAmB;AAAA,cACnB;AAAA,gBACI,IAAI,MAAM,QAAQ,KAAK,GAAG,SAAS;AAAA,gBACnC,QAAQ,MAAM,QAAQ,KAAK;AAAA,gBAC3B,OAAO,MAAM,QAAQ,KAAK;AAAA,gBAC1B,QAAQ,MAAM,QAAQ,KAAK;AAAA,cAC/B;AAAA,YACJ;AAAA,YACA;AAAA,UAAA,CACH;AAAA,QAAA;AAGJ,eAAM,QAAQ,WAAW,CAAA,GAAI,QAAQ,CAAC,WAAgB;AACnD,kBAAO,KACH,gBAAgB;AAAA,YACZ;AAAA,YACA,SAAS;AAAA,cACL,gCAAgC;AAAA,cAChC;AAAA,gBACI,MAAM,OAAO;AAAA,cACjB;AAAA,YACJ;AAAA,YACA;AAAA,UACH,CAAA,CACL;AAAA,QAAA,CACH;AAEM,eAAA;AAAA,MACX;AAAA,WACK,gBAAgB;AACV,eAAA;AAAA,UACH,gBAAgB;AAAA,YACZ;AAAA,YACA,SAAS;AAAA,cACL,gCAAgC;AAAA,cAChC;AAAA,gBACI,MAAM,MAAM,QAAQ,KAAK;AAAA,cAC7B;AAAA,YACJ;AAAA,YACA;AAAA,UAAA,CACH;AAAA,QAAA;AAAA,MAET;AAAA,WACK,SAAS;AACH,eAAA;AAAA,UACH,gBAAgB;AAAA,YACZ;AAAA,YACA,SAAS;AAAA,cACL,gCAAgC;AAAA,cAChC;AAAA,gBACI,MAAM,MAAM,QAAQ,WAAW;AAAA,cACnC;AAAA,YACJ;AAAA,YACA;AAAA,UAAA,CACH;AAAA,QAAA;AAAA,MAET;AAAA;AAGI,eAAO;;EAAC;AAId,QAAA,aAAa,CAAC,UAAoD;AACpE,QAAI,CAAC,yBAAyB,YAAY,EAAE,SAAS,MAAM,IAAI,GAAG;AACtD,aAAA,OAAM,QAAQ,SAAS,IAAI,OAAO,CAAC,KAAU,SAAc;AAC3D,YAAA,CAAC,MAAM,QAAQ,kBAAkB;AAC1B,iBAAA;AAAA,QACX;AACA,YAAI,KAAK,iCACF,QADE;AAAA,UAEL,IAAI,KAAK;AAAA,UACT,MAAM,KAAK,QAAQ,MAAM;AAAA,UACzB,SAAS;AAAA,YACL,OAAO,MAAM,QAAQ;AAAA,YACrB,kBAAkB,MAAM,QAAQ;AAAA,YAChC,SAAS,KAAK;AAAA,YACd;AAAA,UACJ;AAAA,QAAA,EACH;AACM,eAAA;AAAA,MACX,GAAG,CAAE,CAAA;AAAA,IACT;AACO,WAAA;AAAA,EAAA;AAKL,QAAA,8BAAc,IAAoB;AAAA,IACpC,CAAC,QAAQ,CAAC;AAAA,IACV,CAAC,QAAQ,CAAC;AAAA,IACV,CAAC,WAAW,CAAC;AAAA,IACb,CAAC,yBAAyB,EAAE;AAAA,EAAA,CAC/B;AAED,QAAM,SAAyB,CAAA;AAC/B,QAAM,kBAAkB,QACnB,KAAK,CAAC,MAAM,UAAU;AAEnB,UAAM,mBAAmB;AAEzB,QAAI,YAAY,QAAQ,IAAI,KAAK,IAAI,KAAK;AAC1C,QAAI,iBAAiB,QAAQ,IAAI,MAAM,IAAI,KAAK;AAChD,WAAO,YAAY;AAAA,EAAA,CACtB,EACA,OAAO,CAAC,UAAU,CAAC,MAAM,QAAQ,EACjC,OAAsB,CAAC,KAAK,UAAU;AAEnC,WAAO,IAAI,OAAO,WAAW,KAAK,CAAC;AAAA,EACvC,GAAG,CAAE,CAAA;AAET,aAAW,SAAS,iBAAiB;AAC3B,UAAA,iBAAiB,QAAQ,OAAO,CAAC,UAAU,MAAM,aAAa,MAAM,EAAE;AAC5E,UAAM,QAAQ,YAAY,EAAE,QAAQ,MAAO,CAAA;AAE3C,UAAM,QAAQ,MAAM,UAAU,OAAO,OAAO,gBAAgB,SAAS;AAC/D,UAAA,QAAQ,CAAC,SAAS;AACd,YAAA,MAAM,KAAK,IAAI;AAAA,IAAA,CACxB;AAEG,QAAA,MAAM,MAAM,QAAQ;AACpB,aAAO,KAAK,KAAK;AAAA,IACrB;AAAA,EACJ;AACO,SAAA;AACX;ACnaA,MAAM,WAAW;AAAA,EAKb,YACY,UACA,QACA,OACA,WACV;AAJU,SAAA,WAAA;AACA,SAAA,SAAA;AACA,SAAA,QAAA;AACA,SAAA,YAAA;AAER,SAAK,WAAW;AAChB,SAAK,UAAU;EACnB;AAAA,EAEA,AAAM,QAAQ;AAAA;AACV,YAAM,iBAAiB,MAAM,KAAK,MAAM,KAAK;AAIzC,UAAA,kBAAkB,eAAe,SAAS,GAAG;AACvC,cAAA,oBAAoB,KAAK,MAAM,gBAAgB;AACrD,aAAK,cAAc;AACZ,eAAA;AAAA,MAAA,OACJ;AACG,cAAA,WAAW,KAAK;AACtB,cAAM,kBAAkB,MAAM,KAAK,aAAa,QAAQ;AACjD,eAAA;AAAA,MACX;AAAA,IACJ;AAAA;AAAA,EAEA,AAAM,YAAY,SAAiB;AAAA;AAC/B,YAAM,WAAW;AAAA,QACb,SAAS,EAAE,QAAQ,QAAQ;AAAA,QAC3B,aAAa,KAAK;AAAA,QAClB,UAAU,KAAK;AAAA,MAAA;AAGnB,YAAM,SAAS,MAAM,KAAK,aAAa,QAAQ;AACxC,aAAA;AAAA,IACX;AAAA;AAAA,EAEA,AAAM,aAAa;AAAA;AACf,aAAO,KAAK,aAAa;AAAA,QACrB,QAAQ;AAAA,UACJ,KAAK;AAAA,UACL,SAAS;AAAA,YACL,OAAO;AAAA,UACX;AAAA,QACJ;AAAA,QACA,aAAa,KAAK;AAAA,QAClB,UAAU,KAAK;AAAA,MAAA,CAClB;AAAA,IACL;AAAA;AAAA,EAEA,AAAM,WAAW,OAAqB;AAAA;;AAC5B,YAAA,EAAE,WAAW,MAAM;AACrB,UAAA,CAAC,cAAO,YAAP,mBAAgB,OAAM;AACvB;AAAA,MACJ;AACA,aAAO,KAAK,aACR;AAAA,QACI,QAAQ;AAAA,UACJ,KAAK;AAAA,UACL,SAAS,OAAO,QAAQ;AAAA,QAC5B;AAAA,QACA,YAAY,OAAO;AAAA,QACnB,aAAa,KAAK;AAAA,QAClB,UAAU,KAAK;AAAA,MAEnB,GAAA,KACJ,EAAE,KAAK,CAAC,aAAa;AACX,cAAA,gBAAgB,MAAM,MAAM,UAAU,CAAC,SAAS,KAAK,QAAQ,OAAO,WAAW;AACjF,YAAA,kBAAkB,MAAM,CAAC,UAAU;AAC5B,iBAAA;AAAA,QACX;AAEO,eAAA,iCACA,QADA;AAAA,UAEH,MAAM,kCACC,MAAM,OACN,SAAS,GAAG;AAAA,UAEnB,OAAO;AAAA,YACH,GAAG,MAAM,MAAM,MAAM,GAAG,aAAa;AAAA,YACrC,iCACO,MAAM,MAAM,iBADnB;AAAA,cAEI,SAAS;AAAA,gBACL,SAAS,GAAG,MAAM,GAAG,QAAQ;AAAA,gBAC7B,kCACO,MAAM,MAAM,eAAe,QAAQ,KACnC,SAAS,GAAG,MAAM,GAAG,QAAQ;AAAA,cAExC;AAAA,YACJ;AAAA,YACA,GAAG,MAAM,MAAM,MAAM,gBAAgB,CAAC;AAAA,UAC1C;AAAA,QAAA;AAAA,MACJ,CACH;AAAA,IACL;AAAA;AAAA,EAEA,AAAM,wBAAwB,MAI3B;AAAA;AACO,YAAA,QAAQ,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO;AACtD,YAAA,aAAa,+BAAO,QAAQ,KAAK;AAEvC,UAAI,CAAC,YAAY;AACb;AAAA,MACJ;AAEA,aAAO,KAAK,aAAa;AAAA,QACrB,QAAQ;AAAA,UACJ,KAAK,KAAK;AAAA,UACV,SAAS;AAAA,QACb;AAAA,QACA,YAAY,MAAM;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,UAAU,KAAK;AAAA,MAAA,CAClB;AAAA,IACL;AAAA;AAAA,EAEA,AAAM,cAAc,QAAgB;AAAA;AAC1B,YAAA,QAAQ,KAAK,iBAAiB,MAAM;AAE1C,UAAI,CAAC,OAAO;AACR;AAAA,MACJ;AAEA,aAAO,KAAK,aAAa;AAAA,QACrB,QAAQ;AAAA,UACJ,KAAK;AAAA,UACL,SAAS,MAAM,QAAQ;AAAA,QAC3B;AAAA,QACA,YAAY,MAAM;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,UAAU,KAAK;AAAA,MAAA,CAClB;AAAA,IACL;AAAA;AAAA,EAEA,wBAAgD;AACrC,WAAA;AAAA,MACH,SAAS,EAAE,MAAM,KAAK,SAAS;AAAA,MAC/B,UAAU,KAAK;AAAA,MACf,aAAa,CAAC;AAAA,MACd,QAAQ,KAAK,UAAU,IAAI,SAAS,EAAE;AAAA,IAAA;AAAA,EAE9C;AAAA,EAEA,AAAc,aAAa,UAA0B,WAA0B;AAAA;AACvE,UAAA;AACM,cAAA,WAAW,MAAM,MAAM,KAAK,UAAU,KAAK,eAAe,QAAQ,CAAC;AAErE,YAAA,CAAC,SAAS,IAAI;AACR,gBAAA;AAAA,QACV;AAEM,cAAA,OAAO,MAAM,SAAS;AAErB,eAAA,KAAK,eAAe,MAAM,SAAS;AAAA,eACrC;AAIL,YAAI,UAAU;AAEV,YAAA,MAAM,YAAY,mBAAmB;AAC3B,oBAAA;AAAA,QACd;AACA,eAAO,KAAK,eAAe;AAAA,UACvB,SAAS;AAAA,YACL;AAAA,cACI,IAAI,KAAK;AAAA,cACT,MAAM;AAAA,cACN,WAAW,IAAI,KAAK,EAAE,YAAY;AAAA,cAClC,SAAS;AAAA,gBACL;AAAA,cACJ;AAAA,cACA,SAAS,CAAC;AAAA,cACV,MAAM,CAAC;AAAA,YACX;AAAA,UACJ;AAAA,QAAA,CACH;AAAA,MACL;AAAA,IACJ;AAAA;AAAA,EAEA,AAAc,eAAe,MAAsB,WAA0B;AAAA;AACzE,WAAK,UAAU,KAAK,QAAQ,OAAO,KAAK,OAAO;AAEzC,YAAA,cAAc,KAAK,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,QAAQ;AAEhE,UAAI,aAAa;AACb,aAAK,OAAO,SAAS,yBAAyB,YAAY,OAAO;AAAA,MACrE;AAEA,UAAI,KAAK,aAAa;AAClB,aAAK,cAAc,KAAK;AAAA,MAC5B;AACA,YAAM,SAAS,MAAM,eAAe,KAAK,SAAS,SAAS;AACpD,aAAA;AAAA,IACX;AAAA;AAAA,EAEQ,eAAe,UAA0B;AAC7C,UAAM,eAAe;AAAA,MACjB,QAAQ;AAAA,MACR,SAAS;AAAA,QACL,QAAQ;AAAA,QACR,gBAAgB;AAAA,MACpB;AAAA,IAAA;AAEJ,aAAS,SAAS,KAAK,UAAU,IAAI,SAAS,EAAE;AAChD,WAAO,OAAO,OAAO,CAAC,GAAG,cAAc;AAAA,MACnC,MAAM,KAAK,UAAU,QAAQ;AAAA,MAC7B,aAAa;AAAA,IAAA,CAChB;AAAA,EACL;AAAA,EAEQ,iBAAiB,QAAgB;AAC9B,WAAA,KAAK,QAAQ,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,QAAQ,OAAO;AAAA,EAC/D;AACJ;AChOA,MAAM,MAAM;AAAA,EAMR,YAAoB,WAAsB;AAAtB,SAAA,YAAA;AALpB,SAAQ,UAAU;AAClB,SAAQ,gCAAwC;AAChD,SAAQ,4BAA4B;AACpC,SAAQ,0BAA0B;AAAA,EAES;AAAA,EAE3C,AAAM,kBAAkB;AAAA;AAChB,UAAA,CAAC,KAAK,SAAS;AACR,eAAA;AAAA,MACX;AACA,YAAM,QAAiC,MAAM,YACzC,KAAK,WACL,KAAK,yBACT;AACO,aAAA;AAAA,IACX;AAAA;AAAA,EAEA,AAAM,gBAAgB;AAAA;AACd,UAAA,CAAC,KAAK,SAAS;AACf;AAAA,MACJ;AACA,aAAO,YAAY,KAAK,WAAW,KAAK,uBAAuB;AAAA,IACnE;AAAA;AAAA,EAEA,AAAM,MAAM,QAAwB;AAAA;AAC5B,UAAA,CAAC,KAAK,SAAS;AACf;AAAA,MACJ;AACO,aAAA,oBACH,KAAK,WACL,KAAK,+BACL,gBAAgB,SACpB,EAAE,KAAK,CAAC,UAAU;AACd,eAAO,MAAM,MAAM;AAAA,MAAA,CACtB;AAAA,IACL;AAAA;AAAA,EAEA,AAAM,OAAO;AAAA;AACL,UAAA,CAAC,KAAK,SAAS;AACf,eAAO;MACX;AACO,aAAA,YAA4B,KAAK,WAAW,KAAK,6BAA6B,EAAE,KACnF,CAAC,WAAW;AACR,eAAO,UAAU,CAAA;AAAA,MAAC,CAE1B;AAAA,IACJ;AAAA;AACJ;AC3CA,MAAM,qBAAqB;AAAA,EAQvB,YACY,WACA,cACR,WACF;AAHU,SAAA,YAAA;AACA,SAAA,eAAA;AALZ,SAAQ,SAAyB;AAQ7B,UAAM,EAAE,WAAW,KAAK,UAAU,IAAI,SAAS;AAC/C,SAAK,SAAS;AACT,SAAA,QAAQ,IAAI,MAAM,SAAS;AAC3B,SAAA,QAAQ,aAAa,YAAY;AAAA,MAClC,MAAM;AAAA,MACN,QAAQ;AAAA,IAAA,CACX;AACD,SAAK,OAAO,aAAa;AACnB,UAAA,WAAW,wBAAwB,WAAW,SAAS;AACxD,SAAA,aAAa,IAAI,WAAW,UAAU,QAAQ,KAAK,OAAO,KAAK,SAAS;AAE7E,SAAK,OAAO,UAAU,yBAAyB,CAAC,QAAQ,SAAiC;AACrF,WAAK,sBAAsB,IAAI;AAAA,IAAA,CAClC;AAED,SAAK,OAAO,UACR,gCACA,CAAO,QAAQ,SAAqE;AAChF,YAAM,WAAW,MAAM,KAAK,WAAW,wBAAwB,IAAI;AAEnE,UAAI,UAAU;AACN,YAAA,CAAC,CAAC,KAAK,cAAc;AAAY,eAAA,iBAAiB,KAAK,cAAc,KAAK;AAC9E,aAAK,mBAAmB,QAAQ;AAAA,MACpC;AAAA,IAAA,EAER;AAAA,EACJ;AAAA,EAEA,AAAM,aAAa;AAAA;AACT,YAAA,SAAS,KAAK,aAAa,QAAQ;AAEzC,YAAM,aAAkB,MAAM,KAAK,MAAM,cAAc;AACvD,UAAI,yCAAY,OAAO;AACnB,aAAK,MAAM,OAAO;AAAA,UACd,MAAM,WAAW,MAAM;AAAA,UACvB,QAAQ,WAAW,MAAM;AAAA,QAAA,CAC5B;AAAA,MACL;AAEA,YAAM,WAAW,MAAM,KAAK,WAAW,MAAM;AAC7C,UAAI,UAAU;AACV,aAAK,mBAAmB,QAAQ;AAAA,MACpC;AAEO;IACX;AAAA;AAAA,EAEA,AAAM,mBAAmB,QAAwB;AAAA;AAC7C,WAAK,SAAS,KAAK,OAAO,OAAO,MAAM;AACvC,YAAM,KAAK,MAAM,MAAM,KAAK,MAAM;AAC3B,aAAA,QAAQ,CAAC,UAAU;AACtB,cAAM,QAAQ,MAAM,MAAM,IAAI,CAAC,SAAS,KAAK,OAAO;AACpD,YAAI,MAAM,QAAQ;AACd,gBAAM,SAAS,KAAK,KAAK,MAAM,KAAK;AAAA,QAAA,OACjC;AACH,gBAAM,SAAS,KAAK,MAAM,MAAM,KAAK;AAAA,QACzC;AAAA,MAAA,CACH;AAAA,IACL;AAAA;AAAA,EAEA,AAAM,QAAQ,QAA4E;AAAA;AACtF,YAAM,YAAY,OAAO,WAAW,WAAW,SAAS,OAAO;AAEvD,cAAA;AAAA,aACC;AACD;AACQ,gBAAA,OAAO,WAAW,UAAU;AAC5B;AAAA,YACJ;AACM,kBAAA,QAAQ,KAAK,OAAO,KAAK,CAAC;;AAAU,2BAAM,OAAO,cAAO,SAAP,mBAAa;AAAA,aAAO;AAE3E,gBAAI,OAAO;AACP,oBAAM,WAAW,MAAM,KAAK,WAAW,WAAW,KAAK;AACvD,kBAAI,UAAU;AACV,sBAAM,WAAW,SAAS,MAAM,IAAI,CAAC,SAAS,KAAK,OAAO;AACpD,sBAAA,KAAK,SAAS,qCAAU,KAAK;AAC7B,sBAAA,OAAO,OAAO,QAAQ;AAAA,cAChC;AAAA,YACJ;AAAA,UACJ;AACA;AAAA,aACC;AACD;AACU,kBAAA,SAAS,KAAK,aAAa,QAAQ;AAEzC,kBAAM,WAAW,MAAM,KAAK,WAAW,WAAW;AAC3C;AACP,gBAAI,UAAU;AACV,mBAAK,mBAAmB,QAAQ;AAAA,YACpC;AAAA,UACJ;AACA;AAAA;AAEA;AACI,gBAAI,OAAO,WAAW,YAAY,OAAO,OAAO;AACvC,mBAAA,iBAAiB,OAAO,KAAK;AAAA,YACtC;AACM,kBAAA,SAAS,KAAK,aAAa,QAAQ;AACzC,kBAAM,WAAW,MAAM,KAAK,WAAW,cAAc,SAAS;AAC9D,gBAAI,UAAU;AACV,mBAAK,mBAAmB,QAAQ;AAAA,YACpC;AACO;UACX;AACA;AAAA;AAAA,IAEZ;AAAA;AAAA,EAEQ,iBAAiB,SAAiB;AACtC,UAAM,QAAQ,YAAY;AAAA,MACtB,QAAQ;AAAA,MACR,OAAO;AAAA,QACH;AAAA,UACI,IAAI,KAAK;AAAA,UACT,QAAQ;AAAA,UACR,SAAS,CAAC,gCAAgC,MAAM,EAAE,MAAM,SAAS;AAAA,QACrE;AAAA,MACJ;AAAA,IAAA,CACH;AACI,SAAA,mBAAmB,CAAC,KAAK,CAAC;AACxB,WAAA;AAAA,EACX;AAAA,EAEA,AAAM,cAAc,SAAiB;AAAA;AAC3B,YAAA,SAAS,KAAK,aAAa,QAAQ;AACzC,YAAM,WAAW,MAAM,KAAK,WAAW,YAAY,OAAO;AAE1D,WAAK,iBAAiB,OAAO;AAE7B,UAAI,UAAU;AACV,aAAK,mBAAmB,QAAQ;AAAA,MACpC;AACO;IACX;AAAA;AAAA,EAEA,AAAc,sBAAsB,MAA8B;AAAA;AAC9D,YAAM,gBAAgB;AAAA,QAClB,MAAM,KAAK,MAAM;AAAA,QACjB,QAAQ,KAAK,MAAM;AAAA,MAAA;AAElB,WAAA,MAAM,OAAO,aAAa;AAC/B,YAAM,QAAQ,MAAM,oBAChB,KAAK,WACL,kCACA,gBAAgB,SACpB;AACM,YAAA;AAAA,QACF,OAAO;AAAA,MAAA,CACV;AAAA,IACL;AAAA;AACJ;ACrKM,MAAA,6BAA6B,CAAO,cAAyB;AAC/D,QAAM,WAAW,MAAM,qBAAqB,YAAY,SAAS;AAEjE,iCACI,WACA,mBAAmB,aACnB,OAAO,2BACX;AACA,iCACI,WACA,mBAAmB,eACnB,OAAO,sBACX;AAEA,iCACI,WACA,mBAAmB,kBACnB,OAAO,yBACX;AACA,iCACI,WACA,mBAAmB,mBACnB,OAAO,2BACX;AACA,iCACI,WACA,mBAAmB,cACnB,OAAO,qBACX;AAEA,WAAS,iBAAiB,qBAAqB,CAAC,cAAc,cAAc;AACxE,UAAM,WAAW,IAAI,qBAAqB,WAAW,cAAc,SAAS;AAC5E,aAAS,WAAW;AAEpB,cAAU,QAAQ,MAAM,4BAA4B,CAAC,OAAO,SAAS;AACxD,eAAA,cAAc,MAAM,IAAI;AAAA,IAAA,CACpC;AAED,cAAU,QAAQ,MAAM,uBAAuB,CAAC,OAAO,SAAS;AAC5D,eAAS,QAAQ,KAAK;AAEtB,aAAO,KAAK,KAAK;AAAA,IAAA,CACpB;AAED,cAAU,QAAQ,OAAO,YAAY,CAAC,UAAU;AAC5C,YAAM,EAAE,WAAW,UAAU,IAAI,SAAS;AACnC,aAAA,SAAS,yBAAyB,KAAK;AAAA,IAAA,CACjD;AAED,cAAU,QAAQ,OAAO,UAAU,CAAC,UAAU;AAC1C,YAAM,EAAE,WAAW,UAAU,IAAI,SAAS;AACnC,aAAA,SAAS,+BAA+B,KAAK;AAAA,IAAA,CACvD;AAAA,EAAA,CACJ;AACL;;"}
package/dist/types.d.ts CHANGED
@@ -38,6 +38,7 @@ export interface ClientEnvelope {
38
38
  globalState?: LooseObject;
39
39
  localState?: LooseObject;
40
40
  clientId?: string;
41
+ funnel?: string;
41
42
  }
42
43
  export interface ServerEnvelope {
43
44
  clientId?: string | undefined;
package/package.json CHANGED
@@ -1,12 +1,13 @@
1
1
  {
2
2
  "name": "@telia-ace/knowledge-widget-bot-provider",
3
- "version": "0.0.1-alpha.52",
3
+ "version": "0.0.1-alpha.55",
4
4
  "description": "Bot Provider Plugin ACE Knowledge Widgets.",
5
5
  "license": "SEE LICENSE IN LICENSE.txt",
6
6
  "author": "Telia Company AB",
7
7
  "keywords": [
8
8
  "telia"
9
9
  ],
10
+ "source": "src/index.ts",
10
11
  "module": "dist/index.js",
11
12
  "types": "dist/index.d.ts",
12
13
  "files": [
@@ -24,12 +25,12 @@
24
25
  },
25
26
  "sideEffects": false,
26
27
  "dependencies": {
27
- "@telia-ace/knowledge-widget-adapters": "^1.0.19",
28
- "@telia-ace/knowledge-widget-types-grid": "^1.0.19",
29
- "@telia-ace/knowledge-widget-ui": "^1.0.16",
30
- "@telia-ace/widget-conversation": "^1.0.17",
31
- "@telia-ace/widget-forms": "^1.0.13",
32
- "@telia-ace/widget-services": "^1.0.9",
28
+ "@telia-ace/knowledge-widget-adapters": "^1.0.22",
29
+ "@telia-ace/knowledge-widget-types-grid": "^1.0.22",
30
+ "@telia-ace/knowledge-widget-ui": "^1.0.19",
31
+ "@telia-ace/widget-conversation": "^1.0.22",
32
+ "@telia-ace/widget-forms": "^1.0.17",
33
+ "@telia-ace/widget-services": "^1.0.10",
33
34
  "@telia-ace/widget-utilities": "^1.0.2",
34
35
  "@webprovisions/bootstrapping": "^1.0.12"
35
36
  },
@@ -40,5 +41,5 @@
40
41
  "devDependencies": {
41
42
  "@types/uuid": "^8.3.4"
42
43
  },
43
- "gitHead": "1ebcbf462e3e5d7ba00dfce49f11b5936c7da555"
44
+ "gitHead": "55b5291d2c388bcba1b43d0b4c0319829f3fbfbd"
44
45
  }