@servicetitan/titan-chat-ui-common 7.1.2 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/hooks/use-customization-chat.js +2 -1
  3. package/dist/hooks/use-customization-chat.js.map +1 -1
  4. package/dist/index.d.ts +1 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +2 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/models/__mocks__/support-chat.mock.js +13 -12
  9. package/dist/models/__mocks__/support-chat.mock.js.map +1 -1
  10. package/dist/models/chat-customizations.js +2 -1
  11. package/dist/models/chat-customizations.js.map +1 -1
  12. package/dist/models/file-descriptor.js +2 -1
  13. package/dist/models/file-descriptor.js.map +1 -1
  14. package/dist/models/index.d.ts +2 -2
  15. package/dist/models/index.d.ts.map +1 -1
  16. package/dist/models/index.js +1 -2
  17. package/dist/models/index.js.map +1 -1
  18. package/dist/models/support-chat.js +37 -41
  19. package/dist/models/support-chat.js.map +1 -1
  20. package/dist/stores/__tests__/chat-ui.store.test.js +117 -106
  21. package/dist/stores/__tests__/chat-ui.store.test.js.map +1 -1
  22. package/dist/stores/chat-ui-backend-echo.store.js +86 -87
  23. package/dist/stores/chat-ui-backend-echo.store.js.map +1 -1
  24. package/dist/stores/chat-ui-backend.store.js +1 -0
  25. package/dist/stores/chat-ui-backend.store.js.map +1 -1
  26. package/dist/stores/chat-ui.store.d.ts +2 -2
  27. package/dist/stores/chat-ui.store.d.ts.map +1 -1
  28. package/dist/stores/chat-ui.store.js +307 -329
  29. package/dist/stores/chat-ui.store.js.map +1 -1
  30. package/dist/stores/index.d.ts +4 -2
  31. package/dist/stores/index.d.ts.map +1 -1
  32. package/dist/stores/index.js +2 -1
  33. package/dist/stores/index.js.map +1 -1
  34. package/dist/streaming/__tests__/chat-sse-client-lifecycle.test.d.ts +2 -0
  35. package/dist/streaming/__tests__/chat-sse-client-lifecycle.test.d.ts.map +1 -0
  36. package/dist/streaming/__tests__/chat-sse-client-lifecycle.test.js +86 -0
  37. package/dist/streaming/__tests__/chat-sse-client-lifecycle.test.js.map +1 -0
  38. package/dist/streaming/__tests__/chat-sse-client-resilience.test.d.ts +2 -0
  39. package/dist/streaming/__tests__/chat-sse-client-resilience.test.d.ts.map +1 -0
  40. package/dist/streaming/__tests__/chat-sse-client-resilience.test.js +140 -0
  41. package/dist/streaming/__tests__/chat-sse-client-resilience.test.js.map +1 -0
  42. package/dist/streaming/__tests__/chat-sse-client.test.d.ts +2 -0
  43. package/dist/streaming/__tests__/chat-sse-client.test.d.ts.map +1 -0
  44. package/dist/streaming/__tests__/chat-sse-client.test.js +209 -0
  45. package/dist/streaming/__tests__/chat-sse-client.test.js.map +1 -0
  46. package/dist/streaming/__tests__/mock-wiring.test.d.ts +2 -0
  47. package/dist/streaming/__tests__/mock-wiring.test.d.ts.map +1 -0
  48. package/dist/streaming/__tests__/mock-wiring.test.js +20 -0
  49. package/dist/streaming/__tests__/mock-wiring.test.js.map +1 -0
  50. package/dist/streaming/__tests__/streaming-progress.model.test.d.ts +2 -0
  51. package/dist/streaming/__tests__/streaming-progress.model.test.d.ts.map +1 -0
  52. package/dist/streaming/__tests__/streaming-progress.model.test.js +89 -0
  53. package/dist/streaming/__tests__/streaming-progress.model.test.js.map +1 -0
  54. package/dist/streaming/chat-sse-client.d.ts +75 -0
  55. package/dist/streaming/chat-sse-client.d.ts.map +1 -0
  56. package/dist/streaming/chat-sse-client.js +189 -0
  57. package/dist/streaming/chat-sse-client.js.map +1 -0
  58. package/dist/streaming/index.d.ts +3 -0
  59. package/dist/streaming/index.d.ts.map +1 -0
  60. package/dist/streaming/index.js +4 -0
  61. package/dist/streaming/index.js.map +1 -0
  62. package/dist/streaming/streaming-progress.model.d.ts +39 -0
  63. package/dist/streaming/streaming-progress.model.d.ts.map +1 -0
  64. package/dist/streaming/streaming-progress.model.js +69 -0
  65. package/dist/streaming/streaming-progress.model.js.map +1 -0
  66. package/dist/utils/__tests__/text-utils.test.js +33 -14
  67. package/dist/utils/__tests__/text-utils.test.js.map +1 -1
  68. package/dist/utils/test-utils.js +5 -5
  69. package/dist/utils/test-utils.js.map +1 -1
  70. package/dist/utils/text-utils.js +12 -12
  71. package/dist/utils/text-utils.js.map +1 -1
  72. package/package.json +3 -2
  73. package/src/index.ts +1 -0
  74. package/src/models/index.ts +2 -2
  75. package/src/stores/chat-ui.store.ts +1 -3
  76. package/src/stores/index.ts +3 -3
  77. package/src/streaming/__tests__/chat-sse-client-lifecycle.test.ts +67 -0
  78. package/src/streaming/__tests__/chat-sse-client-resilience.test.ts +141 -0
  79. package/src/streaming/__tests__/chat-sse-client.test.ts +152 -0
  80. package/src/streaming/__tests__/mock-wiring.test.ts +25 -0
  81. package/src/streaming/__tests__/streaming-progress.model.test.ts +72 -0
  82. package/src/streaming/chat-sse-client.ts +236 -0
  83. package/src/streaming/index.ts +2 -0
  84. package/src/streaming/streaming-progress.model.ts +80 -0
  85. package/tsconfig.tsbuildinfo +1 -1
@@ -1,72 +1,60 @@
1
+ function _define_property(obj, key, value) {
2
+ if (key in obj) {
3
+ Object.defineProperty(obj, key, {
4
+ value: value,
5
+ enumerable: true,
6
+ configurable: true,
7
+ writable: true
8
+ });
9
+ } else {
10
+ obj[key] = value;
11
+ }
12
+ return obj;
13
+ }
1
14
  import { expect } from '@jest/globals';
2
15
  import { autorun } from 'mobx';
3
- import { ChatEndReason, ChatError, ChatMessageState, ChatParticipantIcon, ChatRunState, } from '../../models';
16
+ import { ChatEndReason, ChatError, ChatMessageState, ChatParticipantIcon, ChatRunState } from '../../models';
4
17
  import { initTestContainer } from '../../utils/test-utils';
5
18
  import { ChatUiEvent, ChatUiStore, symbolAgent, symbolUser } from '../chat-ui.store';
6
19
  const mockAudio = {
7
20
  Audio: {
8
- play: jest.fn().mockResolvedValue(undefined),
9
- },
21
+ play: jest.fn().mockResolvedValue(undefined)
22
+ }
10
23
  };
11
24
  const mockEventEmitter = {
12
25
  on: jest.fn(),
13
26
  off: jest.fn(),
14
27
  emit: jest.fn(),
15
28
  listeners: jest.fn(),
16
- listenerCount: jest.fn(),
29
+ listenerCount: jest.fn()
17
30
  };
18
- jest.mock('events', () => ({
19
- EventEmitter: class {
20
- constructor() {
21
- Object.defineProperty(this, "on", {
22
- enumerable: true,
23
- configurable: true,
24
- writable: true,
25
- value: mockEventEmitter.on
26
- });
27
- Object.defineProperty(this, "off", {
28
- enumerable: true,
29
- configurable: true,
30
- writable: true,
31
- value: mockEventEmitter.off
32
- });
33
- Object.defineProperty(this, "emit", {
34
- enumerable: true,
35
- configurable: true,
36
- writable: true,
37
- value: mockEventEmitter.emit
38
- });
39
- Object.defineProperty(this, "listeners", {
40
- enumerable: true,
41
- configurable: true,
42
- writable: true,
43
- value: mockEventEmitter.listeners
44
- });
45
- Object.defineProperty(this, "listenerCount", {
46
- enumerable: true,
47
- configurable: true,
48
- writable: true,
49
- value: mockEventEmitter.listenerCount
50
- });
31
+ jest.mock('events', ()=>({
32
+ EventEmitter: class {
33
+ constructor(){
34
+ _define_property(this, "on", mockEventEmitter.on);
35
+ _define_property(this, "off", mockEventEmitter.off);
36
+ _define_property(this, "emit", mockEventEmitter.emit);
37
+ _define_property(this, "listeners", mockEventEmitter.listeners);
38
+ _define_property(this, "listenerCount", mockEventEmitter.listenerCount);
39
+ }
51
40
  }
52
- },
53
- }));
54
- const initContainer = initTestContainer(ChatUiStore, () => { });
55
- describe('[ChatUiStore]', () => {
41
+ }));
42
+ const initContainer = initTestContainer(ChatUiStore, ()=>{});
43
+ describe('[ChatUiStore]', ()=>{
56
44
  let container;
57
45
  let store;
58
46
  let audioBackup;
59
- beforeEach(() => {
47
+ beforeEach(()=>{
60
48
  container = initContainer();
61
49
  store = container.get(ChatUiStore);
62
50
  jest.useFakeTimers();
63
51
  jest.setSystemTime(Date.parse('2021-01-01T00:00:00.000Z'));
64
52
  audioBackup = global.Audio;
65
- global.Audio = jest.fn().mockImplementation(() => ({
66
- play: mockAudio.Audio.play,
67
- }));
53
+ global.Audio = jest.fn().mockImplementation(()=>({
54
+ play: mockAudio.Audio.play
55
+ }));
68
56
  });
69
- afterEach(() => {
57
+ afterEach(()=>{
70
58
  if (audioBackup) {
71
59
  global.Audio = audioBackup;
72
60
  }
@@ -78,7 +66,7 @@ describe('[ChatUiStore]', () => {
78
66
  mockEventEmitter.listeners.mockClear();
79
67
  mockEventEmitter.listenerCount.mockClear();
80
68
  });
81
- test('should initialize with default values', () => {
69
+ test('should initialize with default values', ()=>{
82
70
  expect(store.isAgentTyping).toBe(false);
83
71
  expect(store.status).toBe(ChatRunState.Offline);
84
72
  expect(store.isFilePickerEnabled).toBe(false);
@@ -104,44 +92,51 @@ describe('[ChatUiStore]', () => {
104
92
  expect(store.isStarting).toBe(false);
105
93
  expect(store.customizations).toEqual({});
106
94
  });
107
- test('should subscribe and unsubscribe to events', () => {
95
+ test('should subscribe and unsubscribe to events', ()=>{
108
96
  const mockCallback = jest.fn();
109
97
  store.on('testEvent', mockCallback);
110
98
  expect(mockEventEmitter.on).toHaveBeenCalledWith('testEvent', mockCallback);
111
99
  store.off('testEvent', mockCallback);
112
100
  expect(mockEventEmitter.off).toHaveBeenCalledWith('testEvent', mockCallback);
113
101
  });
114
- test('should set customizations context', async () => {
115
- const customizations = { abc: '123' };
102
+ test('should set customizations context', async ()=>{
103
+ const customizations = {
104
+ abc: '123'
105
+ };
116
106
  store.setCustomizationContext(customizations);
117
107
  expect(store.customizations).toEqual(customizations);
118
108
  await checkScrollTriggered();
119
109
  });
120
- test('should getLastFailedMessages', () => {
110
+ test('should getLastFailedMessages', ()=>{
121
111
  store.addMessage(false, 'message1');
122
112
  const m2 = store.addMessage(false, 'message2');
123
113
  const m3 = store.addMessage(false, 'message3');
124
114
  expect(store.getLastFailedMessages()).toEqual([]);
125
115
  store.setMessageState(m3, ChatMessageState.Failed);
126
116
  let failedMessages = store.getLastFailedMessages();
127
- expect(failedMessages).toEqual([m3]);
117
+ expect(failedMessages).toEqual([
118
+ m3
119
+ ]);
128
120
  store.setMessageState(m2, ChatMessageState.Failed);
129
121
  failedMessages = store.getLastFailedMessages();
130
- expect(failedMessages).toEqual([m3, m2]);
122
+ expect(failedMessages).toEqual([
123
+ m3,
124
+ m2
125
+ ]);
131
126
  });
132
- describe('with file messages', () => {
133
- test('should set file', () => {
127
+ describe('with file messages', ()=>{
128
+ test('should set file', ()=>{
134
129
  const file = mockFile();
135
130
  store.setFile(file);
136
131
  expect(store.file).toEqual(file);
137
132
  store.setFile(undefined);
138
133
  expect(store.file).toBeUndefined();
139
134
  });
140
- test('should trigger MobX reactions when file changes', () => {
135
+ test('should trigger MobX reactions when file changes', ()=>{
141
136
  const file = mockFile();
142
137
  const reactions = [];
143
138
  // Set up autorun to track file changes
144
- const dispose = autorun(() => {
139
+ const dispose = autorun(()=>{
145
140
  reactions.push(store.file);
146
141
  });
147
142
  // Initial run should capture undefined
@@ -158,7 +153,7 @@ describe('[ChatUiStore]', () => {
158
153
  // Clean up
159
154
  dispose();
160
155
  });
161
- test('should set file picker enabled state', async () => {
156
+ test('should set file picker enabled state', async ()=>{
162
157
  store.setFile(mockFile());
163
158
  store.setFilePickerEnabled(true);
164
159
  expect(store.isFilePickerEnabled).toBe(true);
@@ -171,28 +166,34 @@ describe('[ChatUiStore]', () => {
171
166
  await checkScrollTriggered();
172
167
  });
173
168
  });
174
- describe('with chat errors', () => {
175
- test('should set error', async () => {
176
- var _a;
169
+ describe('with chat errors', ()=>{
170
+ test('should set error', async ()=>{
171
+ var _store_error;
177
172
  store.setError('Test error', {
178
173
  title: 'Test error title',
179
- recoverStrategy: { recoverButtonTitle: 'Test error button' },
180
- data: { some: 'data' },
174
+ recoverStrategy: {
175
+ recoverButtonTitle: 'Test error button'
176
+ },
177
+ data: {
178
+ some: 'data'
179
+ }
181
180
  });
182
- expect((_a = store.error) === null || _a === void 0 ? void 0 : _a.toJSON()).toEqual({
183
- data: { some: 'data' },
181
+ expect((_store_error = store.error) === null || _store_error === void 0 ? void 0 : _store_error.toJSON()).toEqual({
182
+ data: {
183
+ some: 'data'
184
+ },
184
185
  message: 'Test error',
185
186
  name: 'ChatError',
186
187
  recoverStrategy: {
187
- recoverButtonTitle: 'Test error button',
188
+ recoverButtonTitle: 'Test error button'
188
189
  },
189
- title: 'Test error title',
190
+ title: 'Test error title'
190
191
  });
191
192
  expect(store.status).toBe(ChatRunState.Error);
192
193
  expect(store.isError).toBe(true);
193
194
  await checkScrollTriggered();
194
195
  });
195
- test('should reset error', async () => {
196
+ test('should reset error', async ()=>{
196
197
  store.setError('Test error');
197
198
  store.resetError(ChatRunState.Started);
198
199
  expect(store.error).toBeUndefined();
@@ -200,17 +201,17 @@ describe('[ChatUiStore]', () => {
200
201
  await checkScrollTriggered();
201
202
  });
202
203
  });
203
- describe('with messages', () => {
204
+ describe('with messages', ()=>{
204
205
  function expectText(message, expected) {
205
206
  expect(message.type).toBe('message');
206
207
  expect(message.message).toBe(expected);
207
208
  }
208
- test('should add message without sound', async () => {
209
+ test('should add message without sound', async ()=>{
209
210
  store.addMessageWelcome('welcome');
210
211
  await jest.runOnlyPendingTimersAsync();
211
212
  expect(mockAudio.Audio.play).toHaveBeenCalledTimes(0);
212
213
  });
213
- test('should add message', async () => {
214
+ test('should add message', async ()=>{
214
215
  store.setIncomingSound('non-existing-sound.mp3');
215
216
  store.setIncomingSound('non-existing-sound2.mp3');
216
217
  // Welcome message
@@ -228,7 +229,7 @@ describe('[ChatUiStore]', () => {
228
229
  // File message
229
230
  store.addMessageFile({
230
231
  file: new File([], 'fileName'),
231
- displayName: 'displayName',
232
+ displayName: 'displayName'
232
233
  });
233
234
  await jest.runOnlyPendingTimersAsync();
234
235
  expect(mockAudio.Audio.play).toHaveBeenCalledTimes(2); // No sound for outgoing messages
@@ -242,8 +243,8 @@ describe('[ChatUiStore]', () => {
242
243
  expect(store.messages[3].participant.isAgent).toBe(false);
243
244
  expect(store.messages[3].type).toBe('file');
244
245
  });
245
- test('should addMessageTimeout', async () => {
246
- var _a;
246
+ test('should addMessageTimeout', async ()=>{
247
+ var _store_messages_at;
247
248
  // Adding timeout message should not happen when no messages are present
248
249
  store.addMessageTimeout();
249
250
  expect(store.messages.length).toBe(0);
@@ -256,86 +257,86 @@ describe('[ChatUiStore]', () => {
256
257
  store.addMessage(true, 'message1');
257
258
  store.addMessageTimeout();
258
259
  expect(store.messages.length).toBe(3);
259
- expect((_a = store.messages.at(-1)) === null || _a === void 0 ? void 0 : _a.type).toBe('timeout');
260
+ expect((_store_messages_at = store.messages.at(-1)) === null || _store_messages_at === void 0 ? void 0 : _store_messages_at.type).toBe('timeout');
260
261
  // Adding new message should dismiss the timeout message
261
262
  store.addMessage(true, 'message2');
262
- expect(store.messages.some(message => message.type === 'timeout')).toBe(false);
263
+ expect(store.messages.some((message)=>message.type === 'timeout')).toBe(false);
263
264
  await checkScrollTriggered();
264
265
  });
265
266
  });
266
- test('should configure', () => {
267
+ test('should configure', ()=>{
267
268
  store.configure({
268
269
  agentIcon: ChatParticipantIcon.Bot,
269
- agentName: 'Test Agent',
270
+ agentName: 'Test Agent'
270
271
  });
271
272
  expect(store.participants[symbolAgent].icon).toBe(ChatParticipantIcon.Bot);
272
273
  expect(store.participants[symbolAgent].name).toBe('Test Agent');
273
274
  });
274
- describe('with chat events', () => {
275
- test('should run', async () => {
275
+ describe('with chat events', ()=>{
276
+ test('should run', async ()=>{
276
277
  // Without subscription: should throw an error
277
- mockEventEmitter.listeners.mockImplementation(() => []);
278
+ mockEventEmitter.listeners.mockImplementation(()=>[]);
278
279
  await expect(store.run()).rejects.toThrow("No listeners for ChatUiEvent.eventRun ('eventRun')");
279
280
  const spyConfigure = jest.spyOn(store, 'configure');
280
281
  mockEmit();
281
282
  await store.run({
282
283
  agentIcon: ChatParticipantIcon.Bot,
283
- agentName: 'Test Agent',
284
+ agentName: 'Test Agent'
284
285
  }, 'chat data');
285
286
  expect(spyConfigure).toHaveBeenCalled();
286
287
  expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventRun, expect.any(Function), expect.any(Function), 'chat data');
287
288
  });
288
- test('should recover', async () => {
289
+ test('should recover', async ()=>{
289
290
  mockEmit();
290
291
  store.setError('Test error');
291
292
  await store.recover();
292
293
  expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventRecover, expect.any(Function), expect.any(Function), new ChatError('Test error'));
293
294
  });
294
- test('should destroy', async () => {
295
+ test('should destroy', async ()=>{
295
296
  const spyReset = jest.spyOn(store, 'reset');
296
297
  mockEmit();
297
298
  await store.destroy();
298
299
  expect(spyReset).toHaveBeenCalledWith();
299
300
  expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventDestroy, expect.any(Function), expect.any(Function));
300
301
  });
301
- test('should restart', async () => {
302
+ test('should restart', async ()=>{
302
303
  const spyReset = jest.spyOn(store, 'reset');
303
304
  mockEmit();
304
305
  await store.restart();
305
306
  expect(spyReset).toHaveBeenCalledWith();
306
307
  expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventRestart, expect.any(Function), expect.any(Function));
307
308
  });
308
- test('should cancelChat', async () => {
309
+ test('should cancelChat', async ()=>{
309
310
  mockEmit();
310
311
  await store.cancelChat();
311
312
  expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventCancel, expect.any(Function), expect.any(Function));
312
313
  });
313
- test('should endChat', async () => {
314
+ test('should endChat', async ()=>{
314
315
  mockEmit();
315
316
  await store.endChat(ChatEndReason.ByAgent);
316
317
  expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventEndChat, expect.any(Function), expect.any(Function), ChatEndReason.ByAgent);
317
318
  });
318
- test('should chasitorTyping', async () => {
319
+ test('should chasitorTyping', async ()=>{
319
320
  mockEmit();
320
321
  await store.chasitorTyping(false);
321
322
  expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventChasitorTyping, expect.any(Function), expect.any(Function), false);
322
323
  await store.chasitorTyping(true);
323
324
  expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventChasitorTyping, expect.any(Function), expect.any(Function), true);
324
325
  });
325
- test('should sendMessageText', async () => {
326
+ test('should sendMessageText', async ()=>{
326
327
  mockEmit();
327
328
  await store.sendMessageText('Hello, world!');
328
329
  expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventMessageSend, expect.any(Function), expect.any(Function), expect.objectContaining({
329
330
  message: 'Hello, world!',
330
331
  type: 'message',
331
- state: ChatMessageState.Delivering,
332
+ state: ChatMessageState.Delivering
332
333
  }));
333
334
  expect(store.messages.length).toBe(1);
334
335
  expect(store.messages[0].type).toBe('message');
335
336
  expect(store.messages[0].message).toBe('Hello, world!');
336
337
  await checkScrollTriggered();
337
338
  });
338
- test('should sendMessageText with file', async () => {
339
+ test('should sendMessageText with file', async ()=>{
339
340
  mockEmit();
340
341
  const file = mockFile();
341
342
  store.setFilePickerEnabled(true);
@@ -344,7 +345,7 @@ describe('[ChatUiStore]', () => {
344
345
  expect(mockEventEmitter.emit).toHaveBeenCalledWith(ChatUiEvent.eventMessageSendFile, expect.any(Function), expect.any(Function), store.currentFileMessage, file, expect.objectContaining({
345
346
  message: 'Hello, world!',
346
347
  type: 'message',
347
- state: ChatMessageState.Delivering,
348
+ state: ChatMessageState.Delivering
348
349
  }));
349
350
  expect(store.messages.length).toBe(2);
350
351
  expect(store.messages[0].type).toBe('file');
@@ -353,12 +354,12 @@ describe('[ChatUiStore]', () => {
353
354
  expect(store.currentFileMessage).toBeDefined();
354
355
  await checkScrollTriggered();
355
356
  });
356
- test('should sendMessageText empty', async () => {
357
+ test('should sendMessageText empty', async ()=>{
357
358
  mockEmit();
358
359
  await store.sendMessageText(' ');
359
360
  expect(mockEventEmitter.emit).not.toHaveBeenCalled();
360
361
  });
361
- test('should sendMessageRetry', async () => {
362
+ test('should sendMessageRetry', async ()=>{
362
363
  mockEmit();
363
364
  store.setError('Test error');
364
365
  const message = store.addMessage(true, 'message1');
@@ -372,12 +373,12 @@ describe('[ChatUiStore]', () => {
372
373
  expect(message.state).toBe(ChatMessageState.Delivering);
373
374
  await checkScrollTriggered();
374
375
  });
375
- test('should sendMessageFileRetry', async () => {
376
+ test('should sendMessageFileRetry', async ()=>{
376
377
  mockEmit();
377
378
  store.setError('Test error');
378
379
  const fileMessage = store.addMessageFile({
379
380
  file: new File([], 'fileName'),
380
- displayName: 'displayName',
381
+ displayName: 'displayName'
381
382
  });
382
383
  store.setMessageState(fileMessage, ChatMessageState.Failed);
383
384
  const p = store.sendMessageFileRetry(fileMessage);
@@ -390,14 +391,17 @@ describe('[ChatUiStore]', () => {
390
391
  await checkScrollTriggered();
391
392
  });
392
393
  });
393
- test('should setTimer', () => {
394
- store.setTimer({ secondsLeft: 10, secondsTotal: 20 });
394
+ test('should setTimer', ()=>{
395
+ store.setTimer({
396
+ secondsLeft: 10,
397
+ secondsTotal: 20
398
+ });
395
399
  expect(store.timer).toEqual({
396
400
  secondsLeft: 10,
397
- secondsTotal: 20,
401
+ secondsTotal: 20
398
402
  });
399
403
  });
400
- test('should setAgentTyping', async () => {
404
+ test('should setAgentTyping', async ()=>{
401
405
  store.setAgentTyping(true);
402
406
  expect(store.isAgentTyping).toBe(true);
403
407
  await checkScrollTriggered();
@@ -405,12 +409,12 @@ describe('[ChatUiStore]', () => {
405
409
  expect(store.isAgentTyping).toBe(false);
406
410
  await checkScrollTriggered();
407
411
  });
408
- test('should setEndReason', async () => {
412
+ test('should setEndReason', async ()=>{
409
413
  store.setEndReason(ChatEndReason.ByTimeout);
410
414
  expect(store.endReason).toBe(ChatEndReason.ByTimeout);
411
415
  await checkScrollTriggered();
412
416
  });
413
- test('should setEndedChatState', async () => {
417
+ test('should setEndedChatState', async ()=>{
414
418
  store.isFilePickerEnabled = true;
415
419
  store.setFile(mockFile());
416
420
  store.setEndedChatState(ChatEndReason.ByTimeout);
@@ -424,15 +428,21 @@ describe('[ChatUiStore]', () => {
424
428
  });
425
429
  function mockFile() {
426
430
  const file = {
427
- file: new File(['content'], 'file.txt', { type: 'text/plain' }),
428
- displayName: 'file.txt',
431
+ file: new File([
432
+ 'content'
433
+ ], 'file.txt', {
434
+ type: 'text/plain'
435
+ }),
436
+ displayName: 'file.txt'
429
437
  };
430
438
  return file;
431
439
  }
432
440
  function mockEmit() {
433
- mockEventEmitter.listeners.mockImplementation(() => ['1']);
441
+ mockEventEmitter.listeners.mockImplementation(()=>[
442
+ '1'
443
+ ]);
434
444
  mockEventEmitter.listenerCount.mockReturnValue(1);
435
- mockEventEmitter.emit.mockImplementation(async (eventName, resolve) => {
445
+ mockEventEmitter.emit.mockImplementation(async (eventName, resolve)=>{
436
446
  await Promise.resolve();
437
447
  resolve();
438
448
  });
@@ -443,4 +453,5 @@ describe('[ChatUiStore]', () => {
443
453
  expect(counter < store.scrollCounter).toBe(true);
444
454
  }
445
455
  });
456
+
446
457
  //# sourceMappingURL=chat-ui.store.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chat-ui.store.test.js","sourceRoot":"","sources":["../../../src/stores/__tests__/chat-ui.store.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/stores/__tests__/chat-ui.store.test.ts"],"sourcesContent":["import { expect } from '@jest/globals';\nimport { Container } from '@servicetitan/react-ioc';\nimport { autorun } from 'mobx';\nimport {\n ChatCustomizations,\n ChatEndReason,\n ChatError,\n ChatMessageModelBase,\n ChatMessageModelText,\n ChatMessageModelWelcome,\n ChatMessageState,\n ChatParticipantIcon,\n ChatRunState,\n FileDescriptor,\n} from '../../models';\nimport { initTestContainer } from '../../utils/test-utils';\nimport { ChatUiEvent, ChatUiStore, symbolAgent, symbolUser } from '../chat-ui.store';\n\nconst mockAudio = {\n Audio: {\n play: jest.fn().mockResolvedValue(undefined),\n },\n};\nconst mockEventEmitter = {\n on: jest.fn(),\n off: jest.fn(),\n emit: jest.fn(),\n listeners: jest.fn(),\n listenerCount: jest.fn(),\n};\njest.mock('events', () => ({\n EventEmitter: class {\n on = mockEventEmitter.on;\n off = mockEventEmitter.off;\n emit = mockEventEmitter.emit;\n listeners = mockEventEmitter.listeners;\n listenerCount = mockEventEmitter.listenerCount;\n },\n}));\n\nconst initContainer = initTestContainer(ChatUiStore, () => {});\n\ndescribe('[ChatUiStore]', () => {\n let container: Container;\n let store: ChatUiStore<ChatCustomizations>;\n let audioBackup: any;\n\n beforeEach(() => {\n container = initContainer();\n store = container.get(ChatUiStore);\n jest.useFakeTimers();\n jest.setSystemTime(Date.parse('2021-01-01T00:00:00.000Z'));\n audioBackup = global.Audio;\n global.Audio = jest.fn().mockImplementation(() => ({\n play: mockAudio.Audio.play,\n }));\n });\n\n afterEach(() => {\n if (audioBackup) {\n global.Audio = audioBackup;\n }\n jest.useRealTimers();\n jest.clearAllMocks();\n mockEventEmitter.on.mockClear();\n mockEventEmitter.off.mockClear();\n mockEventEmitter.emit.mockClear();\n mockEventEmitter.listeners.mockClear();\n mockEventEmitter.listenerCount.mockClear();\n });\n\n test('should initialize with default values', () => {\n expect(store.isAgentTyping).toBe(false);\n expect(store.status).toBe(ChatRunState.Offline);\n expect(store.isFilePickerEnabled).toBe(false);\n expect(store.file).toBeUndefined();\n expect(store.currentFileMessage).toBeUndefined();\n expect(store.error).toBeUndefined();\n expect(store.endReason).toBeUndefined();\n expect(store.messages).toEqual([]);\n expect(store.scrollCounter).toBe(1);\n expect(store.timer).toBeUndefined();\n expect(store.participants[symbolAgent].isAgent).toBe(true);\n expect(store.participants[symbolAgent].name).toBe('Agent');\n expect(store.participants[symbolAgent].icon).toBe(ChatParticipantIcon.Initials);\n expect(store.participants[symbolUser].isAgent).toBe(false);\n expect(store.participants[symbolUser].name).toBe('User');\n expect(store.participants[symbolUser].icon).toBe(ChatParticipantIcon.Initials);\n // Getters\n expect(store.agent).toBe(store.participants[symbolAgent]);\n expect(store.user).toBe(store.participants[symbolUser]);\n expect(store.isStarted).toBe(false);\n expect(store.isError).toBe(false);\n expect(store.isEnded).toBe(false);\n expect(store.isStarting).toBe(false);\n expect(store.customizations).toEqual({});\n });\n\n test('should subscribe and unsubscribe to events', () => {\n const mockCallback = jest.fn();\n store.on('testEvent', mockCallback);\n expect(mockEventEmitter.on).toHaveBeenCalledWith('testEvent', mockCallback);\n\n store.off('testEvent', mockCallback);\n expect(mockEventEmitter.off).toHaveBeenCalledWith('testEvent', mockCallback);\n });\n\n test('should set customizations context', async () => {\n const customizations = { abc: '123' } as ChatCustomizations;\n store.setCustomizationContext(customizations);\n expect(store.customizations).toEqual(customizations);\n await checkScrollTriggered();\n });\n\n test('should getLastFailedMessages', () => {\n store.addMessage(false, 'message1');\n const m2 = store.addMessage(false, 'message2');\n const m3 = store.addMessage(false, 'message3');\n expect(store.getLastFailedMessages()).toEqual([]);\n\n store.setMessageState(m3, ChatMessageState.Failed);\n let failedMessages = store.getLastFailedMessages();\n expect(failedMessages).toEqual([m3]);\n\n store.setMessageState(m2, ChatMessageState.Failed);\n failedMessages = store.getLastFailedMessages();\n expect(failedMessages).toEqual([m3, m2]);\n });\n\n describe('with file messages', () => {\n test('should set file', () => {\n const file = mockFile();\n store.setFile(file);\n expect(store.file).toEqual(file);\n\n store.setFile(undefined);\n expect(store.file).toBeUndefined();\n });\n\n test('should trigger MobX reactions when file changes', () => {\n const file = mockFile();\n const reactions: (FileDescriptor | undefined)[] = [];\n\n // Set up autorun to track file changes\n const dispose = autorun(() => {\n reactions.push(store.file);\n });\n\n // Initial run should capture undefined\n expect(reactions).toHaveLength(1);\n expect(reactions[0]).toBeUndefined();\n\n // Setting file should trigger reaction\n store.setFile(file);\n expect(reactions).toHaveLength(2);\n expect(reactions[1]).toEqual(file);\n\n // Unsetting file should trigger reaction\n store.setFile(undefined);\n expect(reactions).toHaveLength(3);\n expect(reactions[2]).toBeUndefined();\n\n // Clean up\n dispose();\n });\n\n test('should set file picker enabled state', async () => {\n store.setFile(mockFile());\n store.setFilePickerEnabled(true);\n expect(store.isFilePickerEnabled).toBe(true);\n expect(store.file).toBeUndefined();\n await checkScrollTriggered();\n\n store.setFile(mockFile());\n store.setFilePickerEnabled(false);\n expect(store.isFilePickerEnabled).toBe(false);\n expect(store.file).toBeUndefined();\n await checkScrollTriggered();\n });\n });\n\n describe('with chat errors', () => {\n test('should set error', async () => {\n store.setError('Test error', {\n title: 'Test error title',\n recoverStrategy: { recoverButtonTitle: 'Test error button' },\n data: { some: 'data' },\n });\n expect(store.error?.toJSON()).toEqual({\n data: { some: 'data' },\n message: 'Test error',\n name: 'ChatError',\n recoverStrategy: {\n recoverButtonTitle: 'Test error button',\n },\n title: 'Test error title',\n });\n expect(store.status).toBe(ChatRunState.Error);\n expect(store.isError).toBe(true);\n await checkScrollTriggered();\n });\n\n test('should reset error', async () => {\n store.setError('Test error');\n store.resetError(ChatRunState.Started);\n expect(store.error).toBeUndefined();\n expect(store.status).toBe(ChatRunState.Started);\n await checkScrollTriggered();\n });\n });\n\n describe('with messages', () => {\n function expectText(message: ChatMessageModelBase, expected: string) {\n expect(message.type).toBe('message');\n expect((message as ChatMessageModelText).message).toBe(expected);\n }\n\n test('should add message without sound', async () => {\n store.addMessageWelcome('welcome');\n await jest.runOnlyPendingTimersAsync();\n expect(mockAudio.Audio.play).toHaveBeenCalledTimes(0);\n });\n\n test('should add message', async () => {\n store.setIncomingSound('non-existing-sound.mp3');\n store.setIncomingSound('non-existing-sound2.mp3');\n\n // Welcome message\n store.addMessageWelcome('welcome');\n await jest.runOnlyPendingTimersAsync();\n expect(mockAudio.Audio.play).toHaveBeenCalledTimes(1);\n\n // Incoming message\n store.addMessage(true, 'message1');\n await jest.runOnlyPendingTimersAsync();\n expect(mockAudio.Audio.play).toHaveBeenCalledTimes(2);\n\n // Outgoing message\n store.addMessage(false, 'message2');\n await jest.runOnlyPendingTimersAsync();\n expect(mockAudio.Audio.play).toHaveBeenCalledTimes(2); // No sound for outgoing messages\n\n // File message\n store.addMessageFile({\n file: new File([], 'fileName'),\n displayName: 'displayName',\n });\n await jest.runOnlyPendingTimersAsync();\n expect(mockAudio.Audio.play).toHaveBeenCalledTimes(2); // No sound for outgoing messages\n\n expect(store.messages.length).toBe(4);\n expect(store.messages[0].participant.isAgent).toBe(true);\n expect((store.messages[0] as ChatMessageModelWelcome).message).toBe('welcome');\n expect(store.messages[1].participant.isAgent).toBe(true);\n expectText(store.messages[1], 'message1');\n expect(store.messages[2].participant.isAgent).toBe(false);\n expectText(store.messages[2], 'message2');\n expect(store.messages[3].participant.isAgent).toBe(false);\n expect(store.messages[3].type).toBe('file');\n });\n\n test('should addMessageTimeout', async () => {\n // Adding timeout message should not happen when no messages are present\n store.addMessageTimeout();\n expect(store.messages.length).toBe(0);\n\n // Adding timeout message should not happen when no non-welcome messages are present\n store.addMessageWelcome('welcome');\n store.addMessageTimeout();\n expect(store.messages.length).toBe(1);\n expect(store.messages[0].type).toBe('welcome');\n\n // Adding timeout message should happen when at least one message is present\n store.addMessage(true, 'message1');\n store.addMessageTimeout();\n expect(store.messages.length).toBe(3);\n expect(store.messages.at(-1)?.type).toBe('timeout');\n\n // Adding new message should dismiss the timeout message\n store.addMessage(true, 'message2');\n expect(store.messages.some(message => message.type === 'timeout')).toBe(false);\n await checkScrollTriggered();\n });\n });\n\n test('should configure', () => {\n store.configure({\n agentIcon: ChatParticipantIcon.Bot,\n agentName: 'Test Agent',\n });\n expect(store.participants[symbolAgent].icon).toBe(ChatParticipantIcon.Bot);\n expect(store.participants[symbolAgent].name).toBe('Test Agent');\n });\n\n describe('with chat events', () => {\n test('should run', async () => {\n // Without subscription: should throw an error\n mockEventEmitter.listeners.mockImplementation(() => []);\n await expect(store.run()).rejects.toThrow(\n \"No listeners for ChatUiEvent.eventRun ('eventRun')\"\n );\n\n const spyConfigure = jest.spyOn(store, 'configure');\n mockEmit();\n\n await store.run(\n {\n agentIcon: ChatParticipantIcon.Bot,\n agentName: 'Test Agent',\n },\n 'chat data'\n );\n\n expect(spyConfigure).toHaveBeenCalled();\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventRun,\n expect.any(Function),\n expect.any(Function),\n 'chat data'\n );\n });\n\n test('should recover', async () => {\n mockEmit();\n store.setError('Test error');\n await store.recover();\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventRecover,\n expect.any(Function),\n expect.any(Function),\n new ChatError('Test error')\n );\n });\n\n test('should destroy', async () => {\n const spyReset = jest.spyOn(store, 'reset');\n mockEmit();\n await store.destroy();\n expect(spyReset).toHaveBeenCalledWith();\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventDestroy,\n expect.any(Function),\n expect.any(Function)\n );\n });\n\n test('should restart', async () => {\n const spyReset = jest.spyOn(store, 'reset');\n mockEmit();\n await store.restart();\n expect(spyReset).toHaveBeenCalledWith();\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventRestart,\n expect.any(Function),\n expect.any(Function)\n );\n });\n\n test('should cancelChat', async () => {\n mockEmit();\n await store.cancelChat();\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventCancel,\n expect.any(Function),\n expect.any(Function)\n );\n });\n\n test('should endChat', async () => {\n mockEmit();\n await store.endChat(ChatEndReason.ByAgent);\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventEndChat,\n expect.any(Function),\n expect.any(Function),\n ChatEndReason.ByAgent\n );\n });\n\n test('should chasitorTyping', async () => {\n mockEmit();\n await store.chasitorTyping(false);\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventChasitorTyping,\n expect.any(Function),\n expect.any(Function),\n false\n );\n\n await store.chasitorTyping(true);\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventChasitorTyping,\n expect.any(Function),\n expect.any(Function),\n true\n );\n });\n\n test('should sendMessageText', async () => {\n mockEmit();\n await store.sendMessageText('Hello, world!');\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventMessageSend,\n expect.any(Function),\n expect.any(Function),\n expect.objectContaining({\n message: 'Hello, world!',\n type: 'message',\n state: ChatMessageState.Delivering,\n })\n );\n expect(store.messages.length).toBe(1);\n expect(store.messages[0].type).toBe('message');\n expect((store.messages[0] as ChatMessageModelText).message).toBe('Hello, world!');\n await checkScrollTriggered();\n });\n\n test('should sendMessageText with file', async () => {\n mockEmit();\n const file = mockFile();\n store.setFilePickerEnabled(true);\n store.setFile(file);\n await store.sendMessageText('Hello, world!');\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventMessageSendFile,\n expect.any(Function),\n expect.any(Function),\n store.currentFileMessage,\n file,\n expect.objectContaining({\n message: 'Hello, world!',\n type: 'message',\n state: ChatMessageState.Delivering,\n })\n );\n expect(store.messages.length).toBe(2);\n expect(store.messages[0].type).toBe('file');\n expect(store.messages[1].type).toBe('message');\n expect((store.messages[1] as ChatMessageModelText).message).toBe('Hello, world!');\n expect(store.currentFileMessage).toBeDefined();\n await checkScrollTriggered();\n });\n\n test('should sendMessageText empty', async () => {\n mockEmit();\n await store.sendMessageText(' ');\n expect(mockEventEmitter.emit).not.toHaveBeenCalled();\n });\n\n test('should sendMessageRetry', async () => {\n mockEmit();\n\n store.setError('Test error');\n const message = store.addMessage(true, 'message1');\n store.setMessageState(message, ChatMessageState.Failed);\n\n const p = store.sendMessageRetry(message);\n\n expect(message.state).toBe(ChatMessageState.Delivering);\n await p;\n expect(store.isError).toBe(false);\n expect(store.status).toBe(ChatRunState.Started);\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventMessageSendRetry,\n expect.any(Function),\n expect.any(Function),\n message\n );\n expect(message.state).toBe(ChatMessageState.Delivering);\n await checkScrollTriggered();\n });\n\n test('should sendMessageFileRetry', async () => {\n mockEmit();\n\n store.setError('Test error');\n const fileMessage = store.addMessageFile({\n file: new File([], 'fileName'),\n displayName: 'displayName',\n });\n store.setMessageState(fileMessage, ChatMessageState.Failed);\n\n const p = store.sendMessageFileRetry(fileMessage);\n\n expect(fileMessage.state).toBe(ChatMessageState.Delivering);\n await p;\n expect(store.isError).toBe(false);\n expect(store.status).toBe(ChatRunState.Started);\n expect(mockEventEmitter.emit).toHaveBeenCalledWith(\n ChatUiEvent.eventMessageSendFileRetry,\n expect.any(Function),\n expect.any(Function),\n fileMessage\n );\n expect(fileMessage.state).toBe(ChatMessageState.Delivering);\n await checkScrollTriggered();\n });\n });\n\n test('should setTimer', () => {\n store.setTimer({ secondsLeft: 10, secondsTotal: 20 });\n expect(store.timer).toEqual({\n secondsLeft: 10,\n secondsTotal: 20,\n });\n });\n\n test('should setAgentTyping', async () => {\n store.setAgentTyping(true);\n expect(store.isAgentTyping).toBe(true);\n await checkScrollTriggered();\n\n store.setAgentTyping(false);\n expect(store.isAgentTyping).toBe(false);\n await checkScrollTriggered();\n });\n\n test('should setEndReason', async () => {\n store.setEndReason(ChatEndReason.ByTimeout);\n expect(store.endReason).toBe(ChatEndReason.ByTimeout);\n await checkScrollTriggered();\n });\n\n test('should setEndedChatState', async () => {\n store.isFilePickerEnabled = true;\n store.setFile(mockFile());\n store.setEndedChatState(ChatEndReason.ByTimeout);\n expect(store.endReason).toBe(ChatEndReason.ByTimeout);\n expect(store.status).toBe(ChatRunState.Ended);\n expect(store.isAgentTyping).toBe(false);\n expect(store.currentFileMessage).toBeUndefined();\n expect(store.file).toBeUndefined();\n expect(store.isFilePickerEnabled).toBe(false);\n await checkScrollTriggered();\n });\n\n function mockFile() {\n const file: FileDescriptor = {\n file: new File(['content'], 'file.txt', { type: 'text/plain' }),\n displayName: 'file.txt',\n };\n return file;\n }\n\n function mockEmit() {\n mockEventEmitter.listeners.mockImplementation(() => ['1']);\n mockEventEmitter.listenerCount.mockReturnValue(1);\n mockEventEmitter.emit.mockImplementation(async (eventName: string, resolve: () => void) => {\n await Promise.resolve();\n resolve();\n });\n }\n\n async function checkScrollTriggered() {\n const counter = store.scrollCounter;\n await jest.runOnlyPendingTimersAsync();\n expect(counter < store.scrollCounter).toBe(true);\n }\n});\n"],"names":["expect","autorun","ChatEndReason","ChatError","ChatMessageState","ChatParticipantIcon","ChatRunState","initTestContainer","ChatUiEvent","ChatUiStore","symbolAgent","symbolUser","mockAudio","Audio","play","jest","fn","mockResolvedValue","undefined","mockEventEmitter","on","off","emit","listeners","listenerCount","mock","EventEmitter","initContainer","describe","container","store","audioBackup","beforeEach","get","useFakeTimers","setSystemTime","Date","parse","global","mockImplementation","afterEach","useRealTimers","clearAllMocks","mockClear","test","isAgentTyping","toBe","status","Offline","isFilePickerEnabled","file","toBeUndefined","currentFileMessage","error","endReason","messages","toEqual","scrollCounter","timer","participants","isAgent","name","icon","Initials","agent","user","isStarted","isError","isEnded","isStarting","customizations","mockCallback","toHaveBeenCalledWith","abc","setCustomizationContext","checkScrollTriggered","addMessage","m2","m3","getLastFailedMessages","setMessageState","Failed","failedMessages","mockFile","setFile","reactions","dispose","push","toHaveLength","setFilePickerEnabled","setError","title","recoverStrategy","recoverButtonTitle","data","some","toJSON","message","Error","resetError","Started","expectText","expected","type","addMessageWelcome","runOnlyPendingTimersAsync","toHaveBeenCalledTimes","setIncomingSound","addMessageFile","File","displayName","length","participant","addMessageTimeout","at","configure","agentIcon","Bot","agentName","run","rejects","toThrow","spyConfigure","spyOn","mockEmit","toHaveBeenCalled","eventRun","any","Function","recover","eventRecover","spyReset","destroy","eventDestroy","restart","eventRestart","cancelChat","eventCancel","endChat","ByAgent","eventEndChat","chasitorTyping","eventChasitorTyping","sendMessageText","eventMessageSend","objectContaining","state","Delivering","eventMessageSendFile","toBeDefined","not","p","sendMessageRetry","eventMessageSendRetry","fileMessage","sendMessageFileRetry","eventMessageSendFileRetry","setTimer","secondsLeft","secondsTotal","setAgentTyping","setEndReason","ByTimeout","setEndedChatState","Ended","mockReturnValue","eventName","resolve","Promise","counter"],"mappings":"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"}