@microsoft/omnichannel-chat-widget 1.2.3-main.2ce131d → 1.2.3-main.d27a359

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.
@@ -164,6 +164,7 @@ exports.TelemetryEvent = TelemetryEvent;
164
164
  TelemetryEvent["SetBotAuthProviderHideCard"] = "SetBotAuthProviderHideCard";
165
165
  TelemetryEvent["SetBotAuthProviderDisplayCard"] = "SetBotAuthProviderDisplayCard";
166
166
  TelemetryEvent["SetBotAuthProviderNotFound"] = "SetBotAuthProviderNotFound";
167
+ TelemetryEvent["BotAuthActivityUndefinedSignInId"] = "BotAuthActivityUndefinedSignInId";
167
168
  TelemetryEvent["ThirdPartyCookiesBlocked"] = "ThirdPartyCookiesBlocked";
168
169
  TelemetryEvent["ProcessingHTMLTextMiddlewareFailed"] = "ProcessingHTMLTextMiddlewareFailed";
169
170
  TelemetryEvent["ProcessingSanitizationMiddlewareFailed"] = "ProcessingSanitizationMiddlewareFailed";
@@ -83,7 +83,10 @@ class BotAuthActivitySubscriber {
83
83
  const signInUrl = attachment.content.buttons[0].value;
84
84
  const signInId = extractSignInId(signInUrl);
85
85
  if (!signInId) {
86
- return;
86
+ _TelemetryHelper.TelemetryHelper.logLoadingEvent(_TelemetryConstants.LogLevel.INFO, {
87
+ Event: _TelemetryConstants.TelemetryEvent.BotAuthActivityUndefinedSignInId
88
+ });
89
+ return activity;
87
90
  }
88
91
  if (this.signInCardSeen.has(signInId)) {
89
92
  // Prevents duplicate auth
@@ -51,12 +51,15 @@ const handleSystemMessage = (next, args, card, systemMessageStyleProps) => {
51
51
  return () => false;
52
52
  }
53
53
 
54
- // eslint-disable-next-line react/display-name, @typescript-eslint/no-explicit-any
54
+ // eslint-disable-next-line react/display-name
55
55
  return () => /*#__PURE__*/_react.default.createElement("div", {
56
56
  key: card.activity.id,
57
57
  style: systemMessageStyles,
58
- "aria-hidden": "true"
59
- }, card.activity.text);
58
+ "aria-hidden": "true",
59
+ dangerouslySetInnerHTML: {
60
+ __html: (0, _utils.escapeHtml)(card.activity.text)
61
+ }
62
+ });
60
63
  };
61
64
 
62
65
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+
3
+ var _Constants = require("../../../../../common/Constants");
4
+ var _DirectLineActivityType = require("../../enums/DirectLineActivityType");
5
+ var _DirectLineSenderRole = require("../../enums/DirectLineSenderRole");
6
+ var _MessageType = require("../../enums/MessageType");
7
+ var _TelemetryHelper = require("../../../../../common/telemetry/TelemetryHelper");
8
+ var _activityMiddleware = require("./activityMiddleware");
9
+ describe("activityMiddleware test", () => {
10
+ it("createActivityMiddleware() with Channel role sender should returns nothing", () => {
11
+ spyOn(_TelemetryHelper.TelemetryHelper, "logActionEvent").and.callFake(() => false);
12
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
13
+ const args = {
14
+ activity: {
15
+ channelData: {
16
+ type: _MessageType.MessageTypes.Thread
17
+ },
18
+ from: {
19
+ role: _DirectLineSenderRole.DirectLineSenderRole.Channel
20
+ }
21
+ }
22
+ };
23
+ const results = (0, _activityMiddleware.createActivityMiddleware)()()(next)(args);
24
+ expect(results()).toEqual(false);
25
+ expect(_TelemetryHelper.TelemetryHelper.logActionEvent).toHaveBeenCalledTimes(1);
26
+ });
27
+ it("createActivityMiddleware() with Hidden tag should return nothing", () => {
28
+ spyOn(_TelemetryHelper.TelemetryHelper, "logActionEvent").and.callFake(() => false);
29
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
30
+ const args = {
31
+ activity: {
32
+ channelData: {
33
+ tags: [_Constants.Constants.hiddenTag]
34
+ },
35
+ from: {
36
+ role: _DirectLineSenderRole.DirectLineSenderRole.User
37
+ }
38
+ }
39
+ };
40
+ const results = (0, _activityMiddleware.createActivityMiddleware)()()(next)(args);
41
+ expect(results()).toEqual(false);
42
+ expect(_TelemetryHelper.TelemetryHelper.logActionEvent).toHaveBeenCalledTimes(0);
43
+ });
44
+ it("createActivityMiddleware() with System tag should return system message", () => {
45
+ var _results$props, _results$props$danger;
46
+ spyOn(_TelemetryHelper.TelemetryHelper, "logActionEvent").and.callFake(() => false);
47
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
48
+ const systemMessage = "system message";
49
+ const args = {
50
+ activity: {
51
+ text: systemMessage,
52
+ channelData: {
53
+ tags: [_Constants.Constants.systemMessageTag]
54
+ },
55
+ from: {
56
+ role: _DirectLineSenderRole.DirectLineSenderRole.User
57
+ }
58
+ }
59
+ };
60
+ const results = (0, _activityMiddleware.createActivityMiddleware)()()(next)(args);
61
+ expect(_TelemetryHelper.TelemetryHelper.logActionEvent).toHaveBeenCalledTimes(0);
62
+ expect((_results$props = results().props) === null || _results$props === void 0 ? void 0 : (_results$props$danger = _results$props.dangerouslySetInnerHTML) === null || _results$props$danger === void 0 ? void 0 : _results$props$danger.__html).toEqual(systemMessage);
63
+ });
64
+ it("createActivityMiddleware() should escape html texts to prevent XSS attacks", () => {
65
+ var _results$props2, _results$props2$dange;
66
+ spyOn(_TelemetryHelper.TelemetryHelper, "logActionEvent").and.callFake(() => false);
67
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
68
+ const systemMessage = "<img src='' onerror=\"alert('XSS attack')\"/>";
69
+ const args = {
70
+ activity: {
71
+ text: systemMessage,
72
+ channelData: {
73
+ tags: [_Constants.Constants.systemMessageTag]
74
+ },
75
+ from: {
76
+ role: _DirectLineSenderRole.DirectLineSenderRole.User
77
+ }
78
+ }
79
+ };
80
+ const results = (0, _activityMiddleware.createActivityMiddleware)()()(next)(args);
81
+ expect(_TelemetryHelper.TelemetryHelper.logActionEvent).toHaveBeenCalledTimes(0);
82
+ expect((_results$props2 = results().props) === null || _results$props2 === void 0 ? void 0 : (_results$props2$dange = _results$props2.dangerouslySetInnerHTML) === null || _results$props2$dange === void 0 ? void 0 : _results$props2$dange.__html).toEqual("&lt;img src=&#39;&#39; onerror=&quot;alert(&#39;XSS attack&#39;)&quot;&#x2F;&gt;");
83
+ });
84
+ it("createActivityMiddleware() with QueuePosition tag should log QueuePosition message", () => {
85
+ spyOn(_TelemetryHelper.TelemetryHelper, "logActionEvent").and.callFake(() => false);
86
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
87
+ const systemMessage = "system message";
88
+ const args = {
89
+ activity: {
90
+ text: systemMessage,
91
+ channelData: {
92
+ tags: [_Constants.Constants.systemMessageTag, _Constants.Constants.queuePositionMessageTag]
93
+ },
94
+ from: {
95
+ role: _DirectLineSenderRole.DirectLineSenderRole.User
96
+ }
97
+ }
98
+ };
99
+ (0, _activityMiddleware.createActivityMiddleware)()()(next)(args);
100
+ expect(_TelemetryHelper.TelemetryHelper.logActionEvent).toHaveBeenCalledTimes(1);
101
+ });
102
+ it("createActivityMiddleware() with same clientmessageid with next activity should return nothing", () => {
103
+ spyOn(_TelemetryHelper.TelemetryHelper, "logActionEvent").and.callFake(() => false);
104
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
105
+ const systemMessage = "system message";
106
+ const args = {
107
+ activity: {
108
+ text: systemMessage,
109
+ channelData: {
110
+ tags: [_Constants.Constants.systemMessageTag],
111
+ clientmessageid: "1234"
112
+ },
113
+ from: {
114
+ role: _DirectLineSenderRole.DirectLineSenderRole.User
115
+ }
116
+ },
117
+ nextVisibleActivity: {
118
+ channelData: {
119
+ clientmessageid: "1234"
120
+ }
121
+ }
122
+ };
123
+ const results = (0, _activityMiddleware.createActivityMiddleware)()()(next)(args);
124
+ expect(results()).toEqual(false);
125
+ });
126
+ it("createActivityMiddleware() with same messageid with next activity should return nothing", () => {
127
+ spyOn(_TelemetryHelper.TelemetryHelper, "logActionEvent").and.callFake(() => false);
128
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
129
+ const systemMessage = "system message";
130
+ const args = {
131
+ activity: {
132
+ text: systemMessage,
133
+ channelData: {
134
+ tags: [_Constants.Constants.systemMessageTag]
135
+ },
136
+ from: {
137
+ role: _DirectLineSenderRole.DirectLineSenderRole.User
138
+ },
139
+ messageid: "1234"
140
+ },
141
+ nextVisibleActivity: {
142
+ messageid: "1234"
143
+ }
144
+ };
145
+ const results = (0, _activityMiddleware.createActivityMiddleware)()()(next)(args);
146
+ expect(results()).toEqual(false);
147
+ });
148
+ it("createActivityMiddleware() should render normal user messages", () => {
149
+ var _results$props3, _results$props3$child, _results$props3$child2;
150
+ spyOn(_TelemetryHelper.TelemetryHelper, "logActionEvent").and.callFake(() => false);
151
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
152
+ const userMessage = "Hello World";
153
+ const args = {
154
+ activity: {
155
+ text: userMessage,
156
+ channelId: "webchat",
157
+ channelData: {
158
+ isHtmlEncoded: false
159
+ },
160
+ from: {
161
+ role: _DirectLineSenderRole.DirectLineSenderRole.User
162
+ },
163
+ type: _DirectLineActivityType.DirectLineActivityType.Message
164
+ }
165
+ };
166
+ const results = (0, _activityMiddleware.createActivityMiddleware)()()(next)(args);
167
+ expect((_results$props3 = results().props) === null || _results$props3 === void 0 ? void 0 : (_results$props3$child = _results$props3.children) === null || _results$props3$child === void 0 ? void 0 : (_results$props3$child2 = _results$props3$child.activity) === null || _results$props3$child2 === void 0 ? void 0 : _results$props3$child2.text).toEqual(userMessage);
168
+ });
169
+ it("createActivityMiddleware() should not render typing messages", () => {
170
+ var _results$activity;
171
+ spyOn(_TelemetryHelper.TelemetryHelper, "logActionEvent").and.callFake(() => false);
172
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
173
+ const userMessage = "Hello World";
174
+ const args = {
175
+ activity: {
176
+ text: userMessage,
177
+ channelId: "webchat",
178
+ channelData: {
179
+ isHtmlEncoded: false
180
+ },
181
+ from: {
182
+ role: _DirectLineSenderRole.DirectLineSenderRole.User
183
+ },
184
+ type: _DirectLineActivityType.DirectLineActivityType.Typing
185
+ }
186
+ };
187
+ const results = (0, _activityMiddleware.createActivityMiddleware)()()(next)(args);
188
+ expect((_results$activity = results().activity) === null || _results$activity === void 0 ? void 0 : _results$activity.text).toEqual(userMessage);
189
+ });
190
+ });
@@ -158,6 +158,7 @@ export let TelemetryEvent;
158
158
  TelemetryEvent["SetBotAuthProviderHideCard"] = "SetBotAuthProviderHideCard";
159
159
  TelemetryEvent["SetBotAuthProviderDisplayCard"] = "SetBotAuthProviderDisplayCard";
160
160
  TelemetryEvent["SetBotAuthProviderNotFound"] = "SetBotAuthProviderNotFound";
161
+ TelemetryEvent["BotAuthActivityUndefinedSignInId"] = "BotAuthActivityUndefinedSignInId";
161
162
  TelemetryEvent["ThirdPartyCookiesBlocked"] = "ThirdPartyCookiesBlocked";
162
163
  TelemetryEvent["ProcessingHTMLTextMiddlewareFailed"] = "ProcessingHTMLTextMiddlewareFailed";
163
164
  TelemetryEvent["ProcessingSanitizationMiddlewareFailed"] = "ProcessingSanitizationMiddlewareFailed";
@@ -79,7 +79,10 @@ export class BotAuthActivitySubscriber {
79
79
  const signInUrl = attachment.content.buttons[0].value;
80
80
  const signInId = extractSignInId(signInUrl);
81
81
  if (!signInId) {
82
- return;
82
+ TelemetryHelper.logLoadingEvent(LogLevel.INFO, {
83
+ Event: TelemetryEvent.BotAuthActivityUndefinedSignInId
84
+ });
85
+ return activity;
83
86
  }
84
87
  if (this.signInCardSeen.has(signInId)) {
85
88
  // Prevents duplicate auth
@@ -44,12 +44,15 @@ const handleSystemMessage = (next, args, card, systemMessageStyleProps) => {
44
44
  return () => false;
45
45
  }
46
46
 
47
- // eslint-disable-next-line react/display-name, @typescript-eslint/no-explicit-any
47
+ // eslint-disable-next-line react/display-name
48
48
  return () => /*#__PURE__*/React.createElement("div", {
49
49
  key: card.activity.id,
50
50
  style: systemMessageStyles,
51
- "aria-hidden": "true"
52
- }, card.activity.text);
51
+ "aria-hidden": "true",
52
+ dangerouslySetInnerHTML: {
53
+ __html: escapeHtml(card.activity.text)
54
+ }
55
+ });
53
56
  };
54
57
 
55
58
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -0,0 +1,188 @@
1
+ import { Constants } from "../../../../../common/Constants";
2
+ import { DirectLineActivityType } from "../../enums/DirectLineActivityType";
3
+ import { DirectLineSenderRole } from "../../enums/DirectLineSenderRole";
4
+ import { MessageTypes } from "../../enums/MessageType";
5
+ import { TelemetryHelper } from "../../../../../common/telemetry/TelemetryHelper";
6
+ import { createActivityMiddleware } from "./activityMiddleware";
7
+ describe("activityMiddleware test", () => {
8
+ it("createActivityMiddleware() with Channel role sender should returns nothing", () => {
9
+ spyOn(TelemetryHelper, "logActionEvent").and.callFake(() => false);
10
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
11
+ const args = {
12
+ activity: {
13
+ channelData: {
14
+ type: MessageTypes.Thread
15
+ },
16
+ from: {
17
+ role: DirectLineSenderRole.Channel
18
+ }
19
+ }
20
+ };
21
+ const results = createActivityMiddleware()()(next)(args);
22
+ expect(results()).toEqual(false);
23
+ expect(TelemetryHelper.logActionEvent).toHaveBeenCalledTimes(1);
24
+ });
25
+ it("createActivityMiddleware() with Hidden tag should return nothing", () => {
26
+ spyOn(TelemetryHelper, "logActionEvent").and.callFake(() => false);
27
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
28
+ const args = {
29
+ activity: {
30
+ channelData: {
31
+ tags: [Constants.hiddenTag]
32
+ },
33
+ from: {
34
+ role: DirectLineSenderRole.User
35
+ }
36
+ }
37
+ };
38
+ const results = createActivityMiddleware()()(next)(args);
39
+ expect(results()).toEqual(false);
40
+ expect(TelemetryHelper.logActionEvent).toHaveBeenCalledTimes(0);
41
+ });
42
+ it("createActivityMiddleware() with System tag should return system message", () => {
43
+ var _results$props, _results$props$danger;
44
+ spyOn(TelemetryHelper, "logActionEvent").and.callFake(() => false);
45
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
46
+ const systemMessage = "system message";
47
+ const args = {
48
+ activity: {
49
+ text: systemMessage,
50
+ channelData: {
51
+ tags: [Constants.systemMessageTag]
52
+ },
53
+ from: {
54
+ role: DirectLineSenderRole.User
55
+ }
56
+ }
57
+ };
58
+ const results = createActivityMiddleware()()(next)(args);
59
+ expect(TelemetryHelper.logActionEvent).toHaveBeenCalledTimes(0);
60
+ expect((_results$props = results().props) === null || _results$props === void 0 ? void 0 : (_results$props$danger = _results$props.dangerouslySetInnerHTML) === null || _results$props$danger === void 0 ? void 0 : _results$props$danger.__html).toEqual(systemMessage);
61
+ });
62
+ it("createActivityMiddleware() should escape html texts to prevent XSS attacks", () => {
63
+ var _results$props2, _results$props2$dange;
64
+ spyOn(TelemetryHelper, "logActionEvent").and.callFake(() => false);
65
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
66
+ const systemMessage = "<img src='' onerror=\"alert('XSS attack')\"/>";
67
+ const args = {
68
+ activity: {
69
+ text: systemMessage,
70
+ channelData: {
71
+ tags: [Constants.systemMessageTag]
72
+ },
73
+ from: {
74
+ role: DirectLineSenderRole.User
75
+ }
76
+ }
77
+ };
78
+ const results = createActivityMiddleware()()(next)(args);
79
+ expect(TelemetryHelper.logActionEvent).toHaveBeenCalledTimes(0);
80
+ expect((_results$props2 = results().props) === null || _results$props2 === void 0 ? void 0 : (_results$props2$dange = _results$props2.dangerouslySetInnerHTML) === null || _results$props2$dange === void 0 ? void 0 : _results$props2$dange.__html).toEqual("&lt;img src=&#39;&#39; onerror=&quot;alert(&#39;XSS attack&#39;)&quot;&#x2F;&gt;");
81
+ });
82
+ it("createActivityMiddleware() with QueuePosition tag should log QueuePosition message", () => {
83
+ spyOn(TelemetryHelper, "logActionEvent").and.callFake(() => false);
84
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
85
+ const systemMessage = "system message";
86
+ const args = {
87
+ activity: {
88
+ text: systemMessage,
89
+ channelData: {
90
+ tags: [Constants.systemMessageTag, Constants.queuePositionMessageTag]
91
+ },
92
+ from: {
93
+ role: DirectLineSenderRole.User
94
+ }
95
+ }
96
+ };
97
+ createActivityMiddleware()()(next)(args);
98
+ expect(TelemetryHelper.logActionEvent).toHaveBeenCalledTimes(1);
99
+ });
100
+ it("createActivityMiddleware() with same clientmessageid with next activity should return nothing", () => {
101
+ spyOn(TelemetryHelper, "logActionEvent").and.callFake(() => false);
102
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
103
+ const systemMessage = "system message";
104
+ const args = {
105
+ activity: {
106
+ text: systemMessage,
107
+ channelData: {
108
+ tags: [Constants.systemMessageTag],
109
+ clientmessageid: "1234"
110
+ },
111
+ from: {
112
+ role: DirectLineSenderRole.User
113
+ }
114
+ },
115
+ nextVisibleActivity: {
116
+ channelData: {
117
+ clientmessageid: "1234"
118
+ }
119
+ }
120
+ };
121
+ const results = createActivityMiddleware()()(next)(args);
122
+ expect(results()).toEqual(false);
123
+ });
124
+ it("createActivityMiddleware() with same messageid with next activity should return nothing", () => {
125
+ spyOn(TelemetryHelper, "logActionEvent").and.callFake(() => false);
126
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
127
+ const systemMessage = "system message";
128
+ const args = {
129
+ activity: {
130
+ text: systemMessage,
131
+ channelData: {
132
+ tags: [Constants.systemMessageTag]
133
+ },
134
+ from: {
135
+ role: DirectLineSenderRole.User
136
+ },
137
+ messageid: "1234"
138
+ },
139
+ nextVisibleActivity: {
140
+ messageid: "1234"
141
+ }
142
+ };
143
+ const results = createActivityMiddleware()()(next)(args);
144
+ expect(results()).toEqual(false);
145
+ });
146
+ it("createActivityMiddleware() should render normal user messages", () => {
147
+ var _results$props3, _results$props3$child, _results$props3$child2;
148
+ spyOn(TelemetryHelper, "logActionEvent").and.callFake(() => false);
149
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
150
+ const userMessage = "Hello World";
151
+ const args = {
152
+ activity: {
153
+ text: userMessage,
154
+ channelId: "webchat",
155
+ channelData: {
156
+ isHtmlEncoded: false
157
+ },
158
+ from: {
159
+ role: DirectLineSenderRole.User
160
+ },
161
+ type: DirectLineActivityType.Message
162
+ }
163
+ };
164
+ const results = createActivityMiddleware()()(next)(args);
165
+ expect((_results$props3 = results().props) === null || _results$props3 === void 0 ? void 0 : (_results$props3$child = _results$props3.children) === null || _results$props3$child === void 0 ? void 0 : (_results$props3$child2 = _results$props3$child.activity) === null || _results$props3$child2 === void 0 ? void 0 : _results$props3$child2.text).toEqual(userMessage);
166
+ });
167
+ it("createActivityMiddleware() should not render typing messages", () => {
168
+ var _results$activity;
169
+ spyOn(TelemetryHelper, "logActionEvent").and.callFake(() => false);
170
+ const next = args => () => args; // eslint-disable-line @typescript-eslint/no-explicit-any
171
+ const userMessage = "Hello World";
172
+ const args = {
173
+ activity: {
174
+ text: userMessage,
175
+ channelId: "webchat",
176
+ channelData: {
177
+ isHtmlEncoded: false
178
+ },
179
+ from: {
180
+ role: DirectLineSenderRole.User
181
+ },
182
+ type: DirectLineActivityType.Typing
183
+ }
184
+ };
185
+ const results = createActivityMiddleware()()(next)(args);
186
+ expect((_results$activity = results().activity) === null || _results$activity === void 0 ? void 0 : _results$activity.text).toEqual(userMessage);
187
+ });
188
+ });
@@ -151,6 +151,7 @@ export declare enum TelemetryEvent {
151
151
  SetBotAuthProviderHideCard = "SetBotAuthProviderHideCard",
152
152
  SetBotAuthProviderDisplayCard = "SetBotAuthProviderDisplayCard",
153
153
  SetBotAuthProviderNotFound = "SetBotAuthProviderNotFound",
154
+ BotAuthActivityUndefinedSignInId = "BotAuthActivityUndefinedSignInId",
154
155
  ThirdPartyCookiesBlocked = "ThirdPartyCookiesBlocked",
155
156
  ProcessingHTMLTextMiddlewareFailed = "ProcessingHTMLTextMiddlewareFailed",
156
157
  ProcessingSanitizationMiddlewareFailed = "ProcessingSanitizationMiddlewareFailed",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/omnichannel-chat-widget",
3
- "version": "1.2.3-main.2ce131d",
3
+ "version": "1.2.3-main.d27a359",
4
4
  "description": "Microsoft Omnichannel Chat Widget",
5
5
  "main": "lib/cjs/index.js",
6
6
  "types": "lib/types/index.d.ts",