@egain/ai-agent-sdk 0.1.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 (164) hide show
  1. package/README.md +295 -0
  2. package/dist/browser.js +22739 -0
  3. package/dist/core/AiAgent.d.ts +1126 -0
  4. package/dist/core/AiAgent.d.ts.map +1 -0
  5. package/dist/core/AiAgent.js +2037 -0
  6. package/dist/core/AiAgent.js.map +1 -0
  7. package/dist/core/api/ApiHelper.d.ts +433 -0
  8. package/dist/core/api/ApiHelper.d.ts.map +1 -0
  9. package/dist/core/api/ApiHelper.js +689 -0
  10. package/dist/core/api/ApiHelper.js.map +1 -0
  11. package/dist/core/api/CacheAdapter.d.ts +295 -0
  12. package/dist/core/api/CacheAdapter.d.ts.map +1 -0
  13. package/dist/core/api/CacheAdapter.js +298 -0
  14. package/dist/core/api/CacheAdapter.js.map +1 -0
  15. package/dist/core/auth/AnonymousAuthStrategy.d.ts +87 -0
  16. package/dist/core/auth/AnonymousAuthStrategy.d.ts.map +1 -0
  17. package/dist/core/auth/AnonymousAuthStrategy.js +257 -0
  18. package/dist/core/auth/AnonymousAuthStrategy.js.map +1 -0
  19. package/dist/core/auth/AuthProvider.d.ts +13 -0
  20. package/dist/core/auth/AuthProvider.d.ts.map +1 -0
  21. package/dist/core/auth/AuthProvider.js +2 -0
  22. package/dist/core/auth/AuthProvider.js.map +1 -0
  23. package/dist/core/auth/AuthStrategy.d.ts +74 -0
  24. package/dist/core/auth/AuthStrategy.d.ts.map +1 -0
  25. package/dist/core/auth/AuthStrategy.js +2 -0
  26. package/dist/core/auth/AuthStrategy.js.map +1 -0
  27. package/dist/core/auth/AuthenticationService.d.ts +226 -0
  28. package/dist/core/auth/AuthenticationService.d.ts.map +1 -0
  29. package/dist/core/auth/AuthenticationService.js +344 -0
  30. package/dist/core/auth/AuthenticationService.js.map +1 -0
  31. package/dist/core/auth/ClientCredentialsAuthStrategy.d.ts +62 -0
  32. package/dist/core/auth/ClientCredentialsAuthStrategy.d.ts.map +1 -0
  33. package/dist/core/auth/ClientCredentialsAuthStrategy.js +78 -0
  34. package/dist/core/auth/ClientCredentialsAuthStrategy.js.map +1 -0
  35. package/dist/core/auth/PKCEAuthStrategy.d.ts +136 -0
  36. package/dist/core/auth/PKCEAuthStrategy.d.ts.map +1 -0
  37. package/dist/core/auth/PKCEAuthStrategy.js +409 -0
  38. package/dist/core/auth/PKCEAuthStrategy.js.map +1 -0
  39. package/dist/core/auth/PreAuthStrategy.d.ts +101 -0
  40. package/dist/core/auth/PreAuthStrategy.d.ts.map +1 -0
  41. package/dist/core/auth/PreAuthStrategy.js +216 -0
  42. package/dist/core/auth/PreAuthStrategy.js.map +1 -0
  43. package/dist/core/auth/msal-browser.js +19683 -0
  44. package/dist/core/auth/msal-loader.d.ts +14 -0
  45. package/dist/core/auth/msal-loader.d.ts.map +1 -0
  46. package/dist/core/auth/msal-loader.js +43 -0
  47. package/dist/core/auth/msal-loader.js.map +1 -0
  48. package/dist/core/connection/Connection.d.ts +168 -0
  49. package/dist/core/connection/Connection.d.ts.map +1 -0
  50. package/dist/core/connection/Connection.js +290 -0
  51. package/dist/core/connection/Connection.js.map +1 -0
  52. package/dist/core/connection/ConnectionState.d.ts +11 -0
  53. package/dist/core/connection/ConnectionState.d.ts.map +1 -0
  54. package/dist/core/connection/ConnectionState.js +12 -0
  55. package/dist/core/connection/ConnectionState.js.map +1 -0
  56. package/dist/core/connection/Transport.d.ts +98 -0
  57. package/dist/core/connection/Transport.d.ts.map +1 -0
  58. package/dist/core/connection/Transport.js +27 -0
  59. package/dist/core/connection/Transport.js.map +1 -0
  60. package/dist/core/connection/WebSocketTransport.d.ts +65 -0
  61. package/dist/core/connection/WebSocketTransport.d.ts.map +1 -0
  62. package/dist/core/connection/WebSocketTransport.js +177 -0
  63. package/dist/core/connection/WebSocketTransport.js.map +1 -0
  64. package/dist/core/errors/SDKError.d.ts +27 -0
  65. package/dist/core/errors/SDKError.d.ts.map +1 -0
  66. package/dist/core/errors/SDKError.js +43 -0
  67. package/dist/core/errors/SDKError.js.map +1 -0
  68. package/dist/core/events/EventEmitter.d.ts +120 -0
  69. package/dist/core/events/EventEmitter.d.ts.map +1 -0
  70. package/dist/core/events/EventEmitter.js +183 -0
  71. package/dist/core/events/EventEmitter.js.map +1 -0
  72. package/dist/core/logging/LogLevel.d.ts +33 -0
  73. package/dist/core/logging/LogLevel.d.ts.map +1 -0
  74. package/dist/core/logging/LogLevel.js +40 -0
  75. package/dist/core/logging/LogLevel.js.map +1 -0
  76. package/dist/core/logging/Logger.d.ts +120 -0
  77. package/dist/core/logging/Logger.d.ts.map +1 -0
  78. package/dist/core/logging/Logger.js +204 -0
  79. package/dist/core/logging/Logger.js.map +1 -0
  80. package/dist/core/logging/globalLogger.d.ts +8 -0
  81. package/dist/core/logging/globalLogger.d.ts.map +1 -0
  82. package/dist/core/logging/globalLogger.js +12 -0
  83. package/dist/core/logging/globalLogger.js.map +1 -0
  84. package/dist/core/logging/types.d.ts +45 -0
  85. package/dist/core/logging/types.d.ts.map +1 -0
  86. package/dist/core/logging/types.js +2 -0
  87. package/dist/core/logging/types.js.map +1 -0
  88. package/dist/core/message/BaseMessageHandler.d.ts +208 -0
  89. package/dist/core/message/BaseMessageHandler.d.ts.map +1 -0
  90. package/dist/core/message/BaseMessageHandler.js +155 -0
  91. package/dist/core/message/BaseMessageHandler.js.map +1 -0
  92. package/dist/core/message/Message.d.ts +69 -0
  93. package/dist/core/message/Message.d.ts.map +1 -0
  94. package/dist/core/message/Message.js +131 -0
  95. package/dist/core/message/Message.js.map +1 -0
  96. package/dist/core/message/MessageProcessor.d.ts +51 -0
  97. package/dist/core/message/MessageProcessor.d.ts.map +1 -0
  98. package/dist/core/message/MessageProcessor.js +123 -0
  99. package/dist/core/message/MessageProcessor.js.map +1 -0
  100. package/dist/core/message/MessageTypes.d.ts +123 -0
  101. package/dist/core/message/MessageTypes.d.ts.map +1 -0
  102. package/dist/core/message/MessageTypes.js +106 -0
  103. package/dist/core/message/MessageTypes.js.map +1 -0
  104. package/dist/core/message/Transcript.d.ts +373 -0
  105. package/dist/core/message/Transcript.d.ts.map +1 -0
  106. package/dist/core/message/Transcript.js +355 -0
  107. package/dist/core/message/Transcript.js.map +1 -0
  108. package/dist/core/message/handlers/AgentMessageHandler.d.ts +26 -0
  109. package/dist/core/message/handlers/AgentMessageHandler.d.ts.map +1 -0
  110. package/dist/core/message/handlers/AgentMessageHandler.js +130 -0
  111. package/dist/core/message/handlers/AgentMessageHandler.js.map +1 -0
  112. package/dist/core/message/handlers/ChatHistoryHandler.d.ts +12 -0
  113. package/dist/core/message/handlers/ChatHistoryHandler.d.ts.map +1 -0
  114. package/dist/core/message/handlers/ChatHistoryHandler.js +49 -0
  115. package/dist/core/message/handlers/ChatHistoryHandler.js.map +1 -0
  116. package/dist/core/message/handlers/ErrorMessageHandler.d.ts +12 -0
  117. package/dist/core/message/handlers/ErrorMessageHandler.d.ts.map +1 -0
  118. package/dist/core/message/handlers/ErrorMessageHandler.js +49 -0
  119. package/dist/core/message/handlers/ErrorMessageHandler.js.map +1 -0
  120. package/dist/core/message/handlers/HeartbeatHandler.d.ts +12 -0
  121. package/dist/core/message/handlers/HeartbeatHandler.d.ts.map +1 -0
  122. package/dist/core/message/handlers/HeartbeatHandler.js +46 -0
  123. package/dist/core/message/handlers/HeartbeatHandler.js.map +1 -0
  124. package/dist/core/message/handlers/TokenRefreshHandler.d.ts +30 -0
  125. package/dist/core/message/handlers/TokenRefreshHandler.d.ts.map +1 -0
  126. package/dist/core/message/handlers/TokenRefreshHandler.js +84 -0
  127. package/dist/core/message/handlers/TokenRefreshHandler.js.map +1 -0
  128. package/dist/core/message/types.d.ts +107 -0
  129. package/dist/core/message/types.d.ts.map +1 -0
  130. package/dist/core/message/types.js +30 -0
  131. package/dist/core/message/types.js.map +1 -0
  132. package/dist/core/platform/HookContract.d.ts +112 -0
  133. package/dist/core/platform/HookContract.d.ts.map +1 -0
  134. package/dist/core/platform/HookContract.js +13 -0
  135. package/dist/core/platform/HookContract.js.map +1 -0
  136. package/dist/core/platform/PlatformComponentService.d.ts +40 -0
  137. package/dist/core/platform/PlatformComponentService.d.ts.map +1 -0
  138. package/dist/core/platform/PlatformComponentService.js +12 -0
  139. package/dist/core/platform/PlatformComponentService.js.map +1 -0
  140. package/dist/core/platform/PlatformScriptLoader.d.ts +41 -0
  141. package/dist/core/platform/PlatformScriptLoader.d.ts.map +1 -0
  142. package/dist/core/platform/PlatformScriptLoader.js +110 -0
  143. package/dist/core/platform/PlatformScriptLoader.js.map +1 -0
  144. package/dist/core/polyfills.d.ts +16 -0
  145. package/dist/core/polyfills.d.ts.map +1 -0
  146. package/dist/core/polyfills.js +168 -0
  147. package/dist/core/polyfills.js.map +1 -0
  148. package/dist/core/portal-initializer/PortalInitializer.d.ts +234 -0
  149. package/dist/core/portal-initializer/PortalInitializer.d.ts.map +1 -0
  150. package/dist/core/portal-initializer/PortalInitializer.js +636 -0
  151. package/dist/core/portal-initializer/PortalInitializer.js.map +1 -0
  152. package/dist/core/queue/MessageQueue.d.ts +277 -0
  153. package/dist/core/queue/MessageQueue.d.ts.map +1 -0
  154. package/dist/core/queue/MessageQueue.js +291 -0
  155. package/dist/core/queue/MessageQueue.js.map +1 -0
  156. package/dist/core/types/PortalTypes.d.ts +51 -0
  157. package/dist/core/types/PortalTypes.d.ts.map +1 -0
  158. package/dist/core/types/PortalTypes.js +8 -0
  159. package/dist/core/types/PortalTypes.js.map +1 -0
  160. package/dist/index.d.ts +91 -0
  161. package/dist/index.d.ts.map +1 -0
  162. package/dist/index.js +82 -0
  163. package/dist/index.js.map +1 -0
  164. package/package.json +84 -0
@@ -0,0 +1,277 @@
1
+ /**
2
+ * # Message Queue
3
+ *
4
+ * The Message Queue feature provides automatic message buffering when the
5
+ * connection is unavailable. Messages are queued locally and automatically
6
+ * sent when the connection is restored.
7
+ *
8
+ * ## Overview
9
+ *
10
+ * When you call `agent.send()` while disconnected:
11
+ * 1. The message is added to an internal queue
12
+ * 2. The SDK continues without throwing an error
13
+ * 3. When connection is restored, queued messages are sent automatically
14
+ * 4. A `queueFlushed` event is emitted with the count of sent messages
15
+ *
16
+ * ## Quick Start
17
+ *
18
+ * Message queuing works automatically:
19
+ *
20
+ * ```typescript
21
+ * // This works even if disconnected
22
+ * await agent.send("Hello!"); // Queued if offline
23
+ *
24
+ * // Check queue status
25
+ * const queueSize = agent.getQueueSize();
26
+ * console.log(`${queueSize} messages waiting`);
27
+ *
28
+ * // Clear the queue if needed
29
+ * agent.clearQueue();
30
+ * ```
31
+ *
32
+ * ## Queue Events
33
+ *
34
+ * Listen for queue-related events:
35
+ *
36
+ * ```typescript
37
+ * agent.on('queueFlushed', (event) => {
38
+ * console.log(`Sent ${event.payload.count} queued messages`);
39
+ * });
40
+ * ```
41
+ *
42
+ * ## Configuration
43
+ *
44
+ * Configure queue behavior when creating the agent:
45
+ *
46
+ * ```typescript
47
+ * const agent = new AiAgent({
48
+ * id: "agent-id",
49
+ * endpoint: "https://your-endpoint.com",
50
+ * maxQueueSize: 1000 // Maximum messages to queue (default: 1000)
51
+ * });
52
+ * ```
53
+ *
54
+ * ## Retry Behavior
55
+ *
56
+ * The queue includes automatic retry logic:
57
+ * - Each message is retried up to 3 times
58
+ * - Failed messages are removed after max attempts
59
+ * - An error event is emitted for failed messages
60
+ *
61
+ * ## Use Cases
62
+ *
63
+ * - **Offline Support**: Continue sending while temporarily disconnected
64
+ * - **Network Resilience**: Handle flaky network connections
65
+ * - **User Experience**: No need to handle connection state in UI
66
+ *
67
+ * @module MessageQueue
68
+ * @category Features
69
+ */
70
+ /**
71
+ * Queued message with metadata for retry handling.
72
+ *
73
+ * Each queued message includes a unique ID for idempotency,
74
+ * timestamp for ordering, and attempt counter for retry logic.
75
+ *
76
+ * @example
77
+ * ```typescript
78
+ * const queuedMessage: QueuedMessage = {
79
+ * id: "msg-123",
80
+ * data: { persona: "customer", content: "Hello" },
81
+ * timestamp: Date.now(),
82
+ * attempts: 0
83
+ * };
84
+ * ```
85
+ *
86
+ * @category Features
87
+ * @group MessageQueue
88
+ */
89
+ export interface QueuedMessage {
90
+ /** Unique message identifier for idempotency */
91
+ id: string;
92
+ /** The message payload to be sent */
93
+ data: any;
94
+ /** Timestamp when the message was queued */
95
+ timestamp: number;
96
+ /** Number of send attempts made */
97
+ attempts: number;
98
+ }
99
+ /**
100
+ * FIFO message queue with idempotency and retry support.
101
+ *
102
+ * The MessageQueue class manages outgoing messages when the connection
103
+ * is unavailable. Messages are stored in order and sent when the
104
+ * connection is restored.
105
+ *
106
+ * @example Basic usage
107
+ * ```typescript
108
+ * const queue = new MessageQueue(1000, 3); // max 1000 messages, 3 retries
109
+ *
110
+ * // Add a message
111
+ * const id = queue.enqueue({ text: "Hello" });
112
+ *
113
+ * // Check queue status
114
+ * console.log(`Queue size: ${queue.size()}`);
115
+ * console.log(`Is empty: ${queue.isEmpty()}`);
116
+ *
117
+ * // Process messages
118
+ * while (!queue.isEmpty()) {
119
+ * const message = queue.peek();
120
+ * try {
121
+ * await sendToServer(message.data);
122
+ * queue.dequeue(); // Remove on success
123
+ * } catch (error) {
124
+ * const shouldRetry = queue.markAttempted(message.id);
125
+ * if (!shouldRetry) {
126
+ * queue.remove(message.id); // Max retries exceeded
127
+ * }
128
+ * }
129
+ * }
130
+ * ```
131
+ *
132
+ * @example With custom ID
133
+ * ```typescript
134
+ * // Use custom ID for idempotency
135
+ * const messageId = queue.enqueue(data, "custom-id-123");
136
+ *
137
+ * // Later, you can remove by ID
138
+ * queue.remove("custom-id-123");
139
+ * ```
140
+ *
141
+ * @category Features
142
+ * @group MessageQueue
143
+ */
144
+ export declare class MessageQueue {
145
+ private queue;
146
+ private maxSize;
147
+ private maxAttempts;
148
+ /**
149
+ * Create a new MessageQueue
150
+ * @param maxSize - Maximum number of messages to queue (default: 1000)
151
+ * @param maxAttempts - Maximum send attempts per message (default: 3)
152
+ */
153
+ constructor(maxSize?: number, maxAttempts?: number);
154
+ /**
155
+ * Add a message to the queue.
156
+ *
157
+ * Messages are added to the end of the queue (FIFO order).
158
+ * If the queue is full, a MessageError is thrown.
159
+ *
160
+ * @param data - The message data to queue
161
+ * @param id - Optional custom message ID (auto-generated if not provided)
162
+ * @returns The message ID
163
+ * @throws MessageError if queue is full
164
+ *
165
+ * @example
166
+ * ```typescript
167
+ * // Auto-generated ID
168
+ * const id1 = queue.enqueue({ text: "Hello" });
169
+ *
170
+ * // Custom ID for tracking
171
+ * const id2 = queue.enqueue({ text: "World" }, "my-message-id");
172
+ * ```
173
+ */
174
+ enqueue(data: any, id?: string): string;
175
+ /**
176
+ * Get the next message without removing it.
177
+ *
178
+ * Use this to inspect the next message before deciding
179
+ * whether to process and remove it.
180
+ *
181
+ * @returns The next message or null if queue is empty
182
+ *
183
+ * @example
184
+ * ```typescript
185
+ * const next = queue.peek();
186
+ * if (next) {
187
+ * console.log(`Next message: ${next.id}`);
188
+ * }
189
+ * ```
190
+ */
191
+ peek(): QueuedMessage | null;
192
+ /**
193
+ * Remove and return the next message from the queue.
194
+ *
195
+ * Call this after successfully processing a message.
196
+ *
197
+ * @returns The removed message or null if queue is empty
198
+ *
199
+ * @example
200
+ * ```typescript
201
+ * const message = queue.dequeue();
202
+ * if (message) {
203
+ * await processMessage(message.data);
204
+ * }
205
+ * ```
206
+ */
207
+ dequeue(): QueuedMessage | null;
208
+ /**
209
+ * Mark a message as attempted and check if retry is allowed.
210
+ *
211
+ * Call this when a send attempt fails. Returns true if the
212
+ * message should be retried, false if max attempts exceeded.
213
+ *
214
+ * @param id - The message ID to mark
215
+ * @returns True if retry is allowed, false if max attempts reached
216
+ *
217
+ * @example
218
+ * ```typescript
219
+ * try {
220
+ * await sendMessage(message.data);
221
+ * queue.dequeue();
222
+ * } catch (error) {
223
+ * const shouldRetry = queue.markAttempted(message.id);
224
+ * if (!shouldRetry) {
225
+ * queue.remove(message.id);
226
+ * console.error(`Message ${message.id} failed permanently`);
227
+ * }
228
+ * }
229
+ * ```
230
+ */
231
+ markAttempted(id: string): boolean;
232
+ /**
233
+ * Remove a message by ID.
234
+ *
235
+ * Use this to remove a message that failed permanently
236
+ * or is no longer needed.
237
+ *
238
+ * @param id - The message ID to remove
239
+ * @returns True if message was found and removed
240
+ *
241
+ * @example
242
+ * ```typescript
243
+ * const removed = queue.remove("message-id");
244
+ * console.log(removed ? "Removed" : "Not found");
245
+ * ```
246
+ */
247
+ remove(id: string): boolean;
248
+ /**
249
+ * Get the current number of messages in the queue.
250
+ * @returns Number of queued messages
251
+ */
252
+ size(): number;
253
+ /**
254
+ * Check if the queue is empty.
255
+ * @returns True if no messages are queued
256
+ */
257
+ isEmpty(): boolean;
258
+ /**
259
+ * Remove all messages from the queue.
260
+ *
261
+ * Use with caution - all queued messages will be lost.
262
+ */
263
+ clear(): void;
264
+ /**
265
+ * Get all messages in the queue (for debugging).
266
+ *
267
+ * Returns a read-only copy of the queue contents.
268
+ *
269
+ * @returns Array of all queued messages
270
+ */
271
+ getAll(): readonly QueuedMessage[];
272
+ /**
273
+ * Generate a unique message ID
274
+ */
275
+ private generateId;
276
+ }
277
+ //# sourceMappingURL=MessageQueue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageQueue.d.ts","sourceRoot":"","sources":["../../../src/core/queue/MessageQueue.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoEG;AAIH;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,aAAa;IAC5B,gDAAgD;IAChD,EAAE,EAAE,MAAM,CAAC;IACX,qCAAqC;IACrC,IAAI,EAAE,GAAG,CAAC;IACV,4CAA4C;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAuB;IACpC,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAS;IAE5B;;;;OAIG;gBACS,OAAO,GAAE,MAAa,EAAE,WAAW,GAAE,MAAU;IAK3D;;;;;;;;;;;;;;;;;;;OAmBG;IACH,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAiBvC;;;;;;;;;;;;;;;OAeG;IACH,IAAI,IAAI,aAAa,GAAG,IAAI;IAI5B;;;;;;;;;;;;;;OAcG;IACH,OAAO,IAAI,aAAa,GAAG,IAAI;IAI/B;;;;;;;;;;;;;;;;;;;;;;OAsBG;IACH,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IASlC;;;;;;;;;;;;;;OAcG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAS3B;;;OAGG;IACH,IAAI,IAAI,MAAM;IAId;;;OAGG;IACH,OAAO,IAAI,OAAO;IAIlB;;;;OAIG;IACH,KAAK,IAAI,IAAI;IAIb;;;;;;OAMG;IACH,MAAM,IAAI,SAAS,aAAa,EAAE;IAIlC;;OAEG;IACH,OAAO,CAAC,UAAU;CAGnB"}
@@ -0,0 +1,291 @@
1
+ /**
2
+ * # Message Queue
3
+ *
4
+ * The Message Queue feature provides automatic message buffering when the
5
+ * connection is unavailable. Messages are queued locally and automatically
6
+ * sent when the connection is restored.
7
+ *
8
+ * ## Overview
9
+ *
10
+ * When you call `agent.send()` while disconnected:
11
+ * 1. The message is added to an internal queue
12
+ * 2. The SDK continues without throwing an error
13
+ * 3. When connection is restored, queued messages are sent automatically
14
+ * 4. A `queueFlushed` event is emitted with the count of sent messages
15
+ *
16
+ * ## Quick Start
17
+ *
18
+ * Message queuing works automatically:
19
+ *
20
+ * ```typescript
21
+ * // This works even if disconnected
22
+ * await agent.send("Hello!"); // Queued if offline
23
+ *
24
+ * // Check queue status
25
+ * const queueSize = agent.getQueueSize();
26
+ * console.log(`${queueSize} messages waiting`);
27
+ *
28
+ * // Clear the queue if needed
29
+ * agent.clearQueue();
30
+ * ```
31
+ *
32
+ * ## Queue Events
33
+ *
34
+ * Listen for queue-related events:
35
+ *
36
+ * ```typescript
37
+ * agent.on('queueFlushed', (event) => {
38
+ * console.log(`Sent ${event.payload.count} queued messages`);
39
+ * });
40
+ * ```
41
+ *
42
+ * ## Configuration
43
+ *
44
+ * Configure queue behavior when creating the agent:
45
+ *
46
+ * ```typescript
47
+ * const agent = new AiAgent({
48
+ * id: "agent-id",
49
+ * endpoint: "https://your-endpoint.com",
50
+ * maxQueueSize: 1000 // Maximum messages to queue (default: 1000)
51
+ * });
52
+ * ```
53
+ *
54
+ * ## Retry Behavior
55
+ *
56
+ * The queue includes automatic retry logic:
57
+ * - Each message is retried up to 3 times
58
+ * - Failed messages are removed after max attempts
59
+ * - An error event is emitted for failed messages
60
+ *
61
+ * ## Use Cases
62
+ *
63
+ * - **Offline Support**: Continue sending while temporarily disconnected
64
+ * - **Network Resilience**: Handle flaky network connections
65
+ * - **User Experience**: No need to handle connection state in UI
66
+ *
67
+ * @module MessageQueue
68
+ * @category Features
69
+ */
70
+ import { MessageError } from '../errors/SDKError.js';
71
+ /**
72
+ * FIFO message queue with idempotency and retry support.
73
+ *
74
+ * The MessageQueue class manages outgoing messages when the connection
75
+ * is unavailable. Messages are stored in order and sent when the
76
+ * connection is restored.
77
+ *
78
+ * @example Basic usage
79
+ * ```typescript
80
+ * const queue = new MessageQueue(1000, 3); // max 1000 messages, 3 retries
81
+ *
82
+ * // Add a message
83
+ * const id = queue.enqueue({ text: "Hello" });
84
+ *
85
+ * // Check queue status
86
+ * console.log(`Queue size: ${queue.size()}`);
87
+ * console.log(`Is empty: ${queue.isEmpty()}`);
88
+ *
89
+ * // Process messages
90
+ * while (!queue.isEmpty()) {
91
+ * const message = queue.peek();
92
+ * try {
93
+ * await sendToServer(message.data);
94
+ * queue.dequeue(); // Remove on success
95
+ * } catch (error) {
96
+ * const shouldRetry = queue.markAttempted(message.id);
97
+ * if (!shouldRetry) {
98
+ * queue.remove(message.id); // Max retries exceeded
99
+ * }
100
+ * }
101
+ * }
102
+ * ```
103
+ *
104
+ * @example With custom ID
105
+ * ```typescript
106
+ * // Use custom ID for idempotency
107
+ * const messageId = queue.enqueue(data, "custom-id-123");
108
+ *
109
+ * // Later, you can remove by ID
110
+ * queue.remove("custom-id-123");
111
+ * ```
112
+ *
113
+ * @category Features
114
+ * @group MessageQueue
115
+ */
116
+ export class MessageQueue {
117
+ /**
118
+ * Create a new MessageQueue
119
+ * @param maxSize - Maximum number of messages to queue (default: 1000)
120
+ * @param maxAttempts - Maximum send attempts per message (default: 3)
121
+ */
122
+ constructor(maxSize = 1000, maxAttempts = 3) {
123
+ this.queue = [];
124
+ this.maxSize = maxSize;
125
+ this.maxAttempts = maxAttempts;
126
+ }
127
+ /**
128
+ * Add a message to the queue.
129
+ *
130
+ * Messages are added to the end of the queue (FIFO order).
131
+ * If the queue is full, a MessageError is thrown.
132
+ *
133
+ * @param data - The message data to queue
134
+ * @param id - Optional custom message ID (auto-generated if not provided)
135
+ * @returns The message ID
136
+ * @throws MessageError if queue is full
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * // Auto-generated ID
141
+ * const id1 = queue.enqueue({ text: "Hello" });
142
+ *
143
+ * // Custom ID for tracking
144
+ * const id2 = queue.enqueue({ text: "World" }, "my-message-id");
145
+ * ```
146
+ */
147
+ enqueue(data, id) {
148
+ if (this.queue.length >= this.maxSize) {
149
+ throw new MessageError(`Queue is full (max size: ${this.maxSize})`);
150
+ }
151
+ const messageId = id || this.generateId();
152
+ const message = {
153
+ id: messageId,
154
+ data,
155
+ timestamp: Date.now(),
156
+ attempts: 0,
157
+ };
158
+ this.queue.push(message);
159
+ return messageId;
160
+ }
161
+ /**
162
+ * Get the next message without removing it.
163
+ *
164
+ * Use this to inspect the next message before deciding
165
+ * whether to process and remove it.
166
+ *
167
+ * @returns The next message or null if queue is empty
168
+ *
169
+ * @example
170
+ * ```typescript
171
+ * const next = queue.peek();
172
+ * if (next) {
173
+ * console.log(`Next message: ${next.id}`);
174
+ * }
175
+ * ```
176
+ */
177
+ peek() {
178
+ return this.queue.length > 0 ? this.queue[0] : null;
179
+ }
180
+ /**
181
+ * Remove and return the next message from the queue.
182
+ *
183
+ * Call this after successfully processing a message.
184
+ *
185
+ * @returns The removed message or null if queue is empty
186
+ *
187
+ * @example
188
+ * ```typescript
189
+ * const message = queue.dequeue();
190
+ * if (message) {
191
+ * await processMessage(message.data);
192
+ * }
193
+ * ```
194
+ */
195
+ dequeue() {
196
+ return this.queue.shift() || null;
197
+ }
198
+ /**
199
+ * Mark a message as attempted and check if retry is allowed.
200
+ *
201
+ * Call this when a send attempt fails. Returns true if the
202
+ * message should be retried, false if max attempts exceeded.
203
+ *
204
+ * @param id - The message ID to mark
205
+ * @returns True if retry is allowed, false if max attempts reached
206
+ *
207
+ * @example
208
+ * ```typescript
209
+ * try {
210
+ * await sendMessage(message.data);
211
+ * queue.dequeue();
212
+ * } catch (error) {
213
+ * const shouldRetry = queue.markAttempted(message.id);
214
+ * if (!shouldRetry) {
215
+ * queue.remove(message.id);
216
+ * console.error(`Message ${message.id} failed permanently`);
217
+ * }
218
+ * }
219
+ * ```
220
+ */
221
+ markAttempted(id) {
222
+ const message = this.queue.find((msg) => msg.id === id);
223
+ if (message) {
224
+ message.attempts++;
225
+ return message.attempts < this.maxAttempts;
226
+ }
227
+ return false;
228
+ }
229
+ /**
230
+ * Remove a message by ID.
231
+ *
232
+ * Use this to remove a message that failed permanently
233
+ * or is no longer needed.
234
+ *
235
+ * @param id - The message ID to remove
236
+ * @returns True if message was found and removed
237
+ *
238
+ * @example
239
+ * ```typescript
240
+ * const removed = queue.remove("message-id");
241
+ * console.log(removed ? "Removed" : "Not found");
242
+ * ```
243
+ */
244
+ remove(id) {
245
+ const index = this.queue.findIndex((msg) => msg.id === id);
246
+ if (index !== -1) {
247
+ this.queue.splice(index, 1);
248
+ return true;
249
+ }
250
+ return false;
251
+ }
252
+ /**
253
+ * Get the current number of messages in the queue.
254
+ * @returns Number of queued messages
255
+ */
256
+ size() {
257
+ return this.queue.length;
258
+ }
259
+ /**
260
+ * Check if the queue is empty.
261
+ * @returns True if no messages are queued
262
+ */
263
+ isEmpty() {
264
+ return this.queue.length === 0;
265
+ }
266
+ /**
267
+ * Remove all messages from the queue.
268
+ *
269
+ * Use with caution - all queued messages will be lost.
270
+ */
271
+ clear() {
272
+ this.queue = [];
273
+ }
274
+ /**
275
+ * Get all messages in the queue (for debugging).
276
+ *
277
+ * Returns a read-only copy of the queue contents.
278
+ *
279
+ * @returns Array of all queued messages
280
+ */
281
+ getAll() {
282
+ return [...this.queue];
283
+ }
284
+ /**
285
+ * Generate a unique message ID
286
+ */
287
+ generateId() {
288
+ return `${Date.now()}-${Math.random().toString(36).substring(2, 11)}`;
289
+ }
290
+ }
291
+ //# sourceMappingURL=MessageQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageQueue.js","sourceRoot":"","sources":["../../../src/core/queue/MessageQueue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Portal types for the CC (Contact Center) widget initialization flow.
3
+ * Derived from the cc-widget's portalService and store types.
4
+ *
5
+ * @module PortalTypes
6
+ */
7
+ /**
8
+ * Represents a knowledge portal accessible to the user.
9
+ *
10
+ * @interface Portal
11
+ */
12
+ export interface Portal {
13
+ /** Unique identifier (string or number) */
14
+ id: string | number;
15
+ /** Display name of the portal */
16
+ name: string;
17
+ /** Optional description */
18
+ description?: string;
19
+ /** Optional department association */
20
+ department?: {
21
+ id: number;
22
+ name: string;
23
+ };
24
+ }
25
+ /**
26
+ * Represents a user profile within a portal.
27
+ *
28
+ * @interface UserProfile
29
+ */
30
+ export interface UserProfile {
31
+ /** Unique identifier (string or number) */
32
+ id: string | number;
33
+ /** Display name of the profile */
34
+ name: string;
35
+ /** Whether this profile was last used in the current portal */
36
+ isLastUsedInPortal?: boolean;
37
+ }
38
+ /**
39
+ * Represents an AI agent in the agent selection list.
40
+ *
41
+ * @interface AgentListItem
42
+ */
43
+ export interface AgentListItem {
44
+ /** Unique agent identifier */
45
+ agentId: string;
46
+ /** Display name of the agent */
47
+ name: string;
48
+ /** Optional description */
49
+ description?: string;
50
+ }
51
+ //# sourceMappingURL=PortalTypes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PortalTypes.d.ts","sourceRoot":"","sources":["../../../src/core/types/PortalTypes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;GAIG;AACH,MAAM,WAAW,MAAM;IACrB,2CAA2C;IAC3C,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,UAAU,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,2CAA2C;IAC3C,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Portal types for the CC (Contact Center) widget initialization flow.
3
+ * Derived from the cc-widget's portalService and store types.
4
+ *
5
+ * @module PortalTypes
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=PortalTypes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PortalTypes.js","sourceRoot":"","sources":["../../../src/core/types/PortalTypes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}