@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,208 @@
1
+ /**
2
+ * # Custom Message Handlers
3
+ *
4
+ * Message handlers process incoming messages from the AI Agent server.
5
+ * You can create custom handlers to implement specialized message processing,
6
+ * custom business logic, or integration with other systems.
7
+ *
8
+ * ## Overview
9
+ *
10
+ * The SDK uses a chain of message handlers to process incoming messages.
11
+ * Each handler can:
12
+ * - Decide if it can handle a specific message type
13
+ * - Process the message and return a result
14
+ * - Pass the message to the next handler in the chain
15
+ *
16
+ * ## Built-in Handlers
17
+ *
18
+ * The SDK includes these handlers by default:
19
+ * - `AgentMessageHandler` - Processes agent responses
20
+ * - `HeartbeatHandler` - Handles typing indicators
21
+ * - `ErrorMessageHandler` - Handles error messages
22
+ * - `TokenRefreshHandler` - Handles token refresh requests
23
+ * - `ChatHistoryHandler` - Processes chat history messages
24
+ *
25
+ * ## Creating a Custom Handler
26
+ *
27
+ * Extend `BaseMessageHandler` to create your own:
28
+ *
29
+ * ```typescript
30
+ * import { BaseMessageHandler, Message, MessageHandlerResult } from "@eGain/ai-agent-sdk";
31
+ *
32
+ * class CustomHandler extends BaseMessageHandler {
33
+ * canHandle(message: Message): boolean {
34
+ * // Return true if this handler should process the message
35
+ * return message.role === 'custom_type';
36
+ * }
37
+ *
38
+ * handle(message: Message): MessageHandlerResult {
39
+ * // Process the message
40
+ * console.log('Custom message:', message.content);
41
+ *
42
+ * return {
43
+ * type: 'custom_processed',
44
+ * message,
45
+ * timestamp: Date.now()
46
+ * };
47
+ * }
48
+ * }
49
+ * ```
50
+ *
51
+ * ## Registering Custom Handlers
52
+ *
53
+ * Add your handler to the message processor:
54
+ *
55
+ * ```typescript
56
+ * const agent = new AiAgent({ ... });
57
+ * await agent.initialize();
58
+ *
59
+ * // Get the message processor
60
+ * const processor = agent.getMessageProcessor();
61
+ *
62
+ * // Add custom handler with priority (lower = higher priority)
63
+ * processor.addHandler(new CustomHandler(), 5);
64
+ * ```
65
+ *
66
+ * ## Handler Priority
67
+ *
68
+ * Handlers are processed in priority order (lowest number first).
69
+ * Built-in handlers use priorities 0-100. Use higher numbers for
70
+ * handlers that should run after built-in processing.
71
+ *
72
+ * ```typescript
73
+ * processor.addHandler(new HighPriorityHandler(), 1); // Runs first
74
+ * processor.addHandler(new LowPriorityHandler(), 200); // Runs last
75
+ * ```
76
+ *
77
+ * ## Use Cases
78
+ *
79
+ * - **Analytics**: Track specific message types
80
+ * - **Transformations**: Modify messages before display
81
+ * - **Integrations**: Forward messages to external systems
82
+ * - **Custom UI**: Trigger specific UI behaviors
83
+ *
84
+ * @module CustomHandlers
85
+ * @category Advanced
86
+ */
87
+ import { Message } from './Message.js';
88
+ import { MessageHandlerResult } from './types.js';
89
+ /**
90
+ * Base class for message handlers.
91
+ *
92
+ * All custom message handlers must extend this class and implement
93
+ * the `canHandle` and `handle` methods.
94
+ *
95
+ * @example Simple handler
96
+ * ```typescript
97
+ * class LoggingHandler extends BaseMessageHandler {
98
+ * canHandle(message: Message): boolean {
99
+ * return true; // Handle all messages
100
+ * }
101
+ *
102
+ * handle(message: Message): MessageHandlerResult {
103
+ * console.log(`[${message.persona}] ${message.content}`);
104
+ * return {
105
+ * type: 'logged',
106
+ * message,
107
+ * timestamp: Date.now()
108
+ * };
109
+ * }
110
+ * }
111
+ * ```
112
+ *
113
+ * @example Async handler
114
+ * ```typescript
115
+ * class AsyncHandler extends BaseMessageHandler {
116
+ * canHandle(message: Message): boolean {
117
+ * return message.role === 'needs_processing';
118
+ * }
119
+ *
120
+ * async handle(message: Message): Promise<MessageHandlerResult> {
121
+ * const result = await processExternally(message);
122
+ * return {
123
+ * type: 'processed',
124
+ * message,
125
+ * data: result,
126
+ * timestamp: Date.now()
127
+ * };
128
+ * }
129
+ * }
130
+ * ```
131
+ *
132
+ * @example Conditional handler
133
+ * ```typescript
134
+ * class SentimentHandler extends BaseMessageHandler {
135
+ * canHandle(message: Message): boolean {
136
+ * // Only handle agent messages with content
137
+ * return message.persona === 'agent' && !!message.content;
138
+ * }
139
+ *
140
+ * handle(message: Message): MessageHandlerResult {
141
+ * const sentiment = analyzeSentiment(message.content);
142
+ * return {
143
+ * type: 'sentiment_analyzed',
144
+ * message,
145
+ * sentiment,
146
+ * timestamp: Date.now()
147
+ * };
148
+ * }
149
+ * }
150
+ * ```
151
+ *
152
+ * @category Advanced
153
+ * @group CustomHandlers
154
+ */
155
+ export declare abstract class BaseMessageHandler {
156
+ /**
157
+ * Check if this handler can process the given message.
158
+ *
159
+ * This method is called for each incoming message. Return `true`
160
+ * if this handler should process the message, `false` otherwise.
161
+ *
162
+ * @param message - The incoming message to check
163
+ * @returns `true` if this handler can process the message
164
+ *
165
+ * @example
166
+ * ```typescript
167
+ * canHandle(message: Message): boolean {
168
+ * // Handle only customer messages
169
+ * return message.persona === 'customer';
170
+ * }
171
+ * ```
172
+ */
173
+ abstract canHandle(message: Message): boolean;
174
+ /**
175
+ * Process the message.
176
+ *
177
+ * Called when `canHandle` returns `true`. Implement your message
178
+ * processing logic here. Can be synchronous or asynchronous.
179
+ *
180
+ * @param message - The message to process
181
+ * @returns Handler result or Promise resolving to result
182
+ *
183
+ * @example Synchronous
184
+ * ```typescript
185
+ * handle(message: Message): MessageHandlerResult {
186
+ * return {
187
+ * type: 'processed',
188
+ * message,
189
+ * timestamp: Date.now()
190
+ * };
191
+ * }
192
+ * ```
193
+ *
194
+ * @example Asynchronous
195
+ * ```typescript
196
+ * async handle(message: Message): Promise<MessageHandlerResult> {
197
+ * await saveToDatabase(message);
198
+ * return {
199
+ * type: 'saved',
200
+ * message,
201
+ * timestamp: Date.now()
202
+ * };
203
+ * }
204
+ * ```
205
+ */
206
+ abstract handle(message: Message): Promise<MessageHandlerResult> | MessageHandlerResult;
207
+ }
208
+ //# sourceMappingURL=BaseMessageHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseMessageHandler.d.ts","sourceRoot":"","sources":["../../../src/core/message/BaseMessageHandler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqFG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AACH,8BAAsB,kBAAkB;IACtC;;;;;;;;;;;;;;;;OAgBG;IACH,QAAQ,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO;IAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,GAAG,oBAAoB;CACxF"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * # Custom Message Handlers
3
+ *
4
+ * Message handlers process incoming messages from the AI Agent server.
5
+ * You can create custom handlers to implement specialized message processing,
6
+ * custom business logic, or integration with other systems.
7
+ *
8
+ * ## Overview
9
+ *
10
+ * The SDK uses a chain of message handlers to process incoming messages.
11
+ * Each handler can:
12
+ * - Decide if it can handle a specific message type
13
+ * - Process the message and return a result
14
+ * - Pass the message to the next handler in the chain
15
+ *
16
+ * ## Built-in Handlers
17
+ *
18
+ * The SDK includes these handlers by default:
19
+ * - `AgentMessageHandler` - Processes agent responses
20
+ * - `HeartbeatHandler` - Handles typing indicators
21
+ * - `ErrorMessageHandler` - Handles error messages
22
+ * - `TokenRefreshHandler` - Handles token refresh requests
23
+ * - `ChatHistoryHandler` - Processes chat history messages
24
+ *
25
+ * ## Creating a Custom Handler
26
+ *
27
+ * Extend `BaseMessageHandler` to create your own:
28
+ *
29
+ * ```typescript
30
+ * import { BaseMessageHandler, Message, MessageHandlerResult } from "@eGain/ai-agent-sdk";
31
+ *
32
+ * class CustomHandler extends BaseMessageHandler {
33
+ * canHandle(message: Message): boolean {
34
+ * // Return true if this handler should process the message
35
+ * return message.role === 'custom_type';
36
+ * }
37
+ *
38
+ * handle(message: Message): MessageHandlerResult {
39
+ * // Process the message
40
+ * console.log('Custom message:', message.content);
41
+ *
42
+ * return {
43
+ * type: 'custom_processed',
44
+ * message,
45
+ * timestamp: Date.now()
46
+ * };
47
+ * }
48
+ * }
49
+ * ```
50
+ *
51
+ * ## Registering Custom Handlers
52
+ *
53
+ * Add your handler to the message processor:
54
+ *
55
+ * ```typescript
56
+ * const agent = new AiAgent({ ... });
57
+ * await agent.initialize();
58
+ *
59
+ * // Get the message processor
60
+ * const processor = agent.getMessageProcessor();
61
+ *
62
+ * // Add custom handler with priority (lower = higher priority)
63
+ * processor.addHandler(new CustomHandler(), 5);
64
+ * ```
65
+ *
66
+ * ## Handler Priority
67
+ *
68
+ * Handlers are processed in priority order (lowest number first).
69
+ * Built-in handlers use priorities 0-100. Use higher numbers for
70
+ * handlers that should run after built-in processing.
71
+ *
72
+ * ```typescript
73
+ * processor.addHandler(new HighPriorityHandler(), 1); // Runs first
74
+ * processor.addHandler(new LowPriorityHandler(), 200); // Runs last
75
+ * ```
76
+ *
77
+ * ## Use Cases
78
+ *
79
+ * - **Analytics**: Track specific message types
80
+ * - **Transformations**: Modify messages before display
81
+ * - **Integrations**: Forward messages to external systems
82
+ * - **Custom UI**: Trigger specific UI behaviors
83
+ *
84
+ * @module CustomHandlers
85
+ * @category Advanced
86
+ */
87
+ /**
88
+ * Base class for message handlers.
89
+ *
90
+ * All custom message handlers must extend this class and implement
91
+ * the `canHandle` and `handle` methods.
92
+ *
93
+ * @example Simple handler
94
+ * ```typescript
95
+ * class LoggingHandler extends BaseMessageHandler {
96
+ * canHandle(message: Message): boolean {
97
+ * return true; // Handle all messages
98
+ * }
99
+ *
100
+ * handle(message: Message): MessageHandlerResult {
101
+ * console.log(`[${message.persona}] ${message.content}`);
102
+ * return {
103
+ * type: 'logged',
104
+ * message,
105
+ * timestamp: Date.now()
106
+ * };
107
+ * }
108
+ * }
109
+ * ```
110
+ *
111
+ * @example Async handler
112
+ * ```typescript
113
+ * class AsyncHandler extends BaseMessageHandler {
114
+ * canHandle(message: Message): boolean {
115
+ * return message.role === 'needs_processing';
116
+ * }
117
+ *
118
+ * async handle(message: Message): Promise<MessageHandlerResult> {
119
+ * const result = await processExternally(message);
120
+ * return {
121
+ * type: 'processed',
122
+ * message,
123
+ * data: result,
124
+ * timestamp: Date.now()
125
+ * };
126
+ * }
127
+ * }
128
+ * ```
129
+ *
130
+ * @example Conditional handler
131
+ * ```typescript
132
+ * class SentimentHandler extends BaseMessageHandler {
133
+ * canHandle(message: Message): boolean {
134
+ * // Only handle agent messages with content
135
+ * return message.persona === 'agent' && !!message.content;
136
+ * }
137
+ *
138
+ * handle(message: Message): MessageHandlerResult {
139
+ * const sentiment = analyzeSentiment(message.content);
140
+ * return {
141
+ * type: 'sentiment_analyzed',
142
+ * message,
143
+ * sentiment,
144
+ * timestamp: Date.now()
145
+ * };
146
+ * }
147
+ * }
148
+ * ```
149
+ *
150
+ * @category Advanced
151
+ * @group CustomHandlers
152
+ */
153
+ export class BaseMessageHandler {
154
+ }
155
+ //# sourceMappingURL=BaseMessageHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseMessageHandler.js","sourceRoot":"","sources":["../../../src/core/message/BaseMessageHandler.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqFG;AAKH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiEG;AACH,MAAM,OAAgB,kBAAkB;CAqDvC"}
@@ -0,0 +1,69 @@
1
+ import { Persona, Role, MessageData, SessionContext } from './types.js';
2
+ /**
3
+ * Message class representing both incoming and outgoing messages
4
+ */
5
+ export declare class Message {
6
+ readonly messageId?: string;
7
+ readonly persona: Persona;
8
+ readonly role: Role;
9
+ readonly content?: string;
10
+ readonly messageData?: MessageData;
11
+ readonly timestamp: number;
12
+ readonly from?: string;
13
+ readonly to?: string;
14
+ readonly agentId?: any;
15
+ readonly sessionId?: any;
16
+ /**
17
+ * Create a new Message instance
18
+ */
19
+ constructor(persona: Persona, role: Role, content?: string, options?: {
20
+ messageId?: string;
21
+ messageData?: MessageData;
22
+ timestamp?: number;
23
+ from?: string;
24
+ to?: string;
25
+ agentId?: string;
26
+ sessionId?: string;
27
+ });
28
+ /**
29
+ * Validate message structure
30
+ * @throws {Error} If message is invalid
31
+ */
32
+ validate(): void;
33
+ /**
34
+ * Convert message to payload string (JSON) for transmission
35
+ * Outgoing payload is configured here
36
+ * @returns JSON string
37
+ */
38
+ toPayloadString(): string;
39
+ /**
40
+ * Create a Message instance from JSON data (typically from WebSocket)
41
+ */
42
+ static fromJSON(data: any, sessionContext: SessionContext): Message;
43
+ /**
44
+ * Check if this is an incoming message
45
+ * Incoming messages come from the server (agent, system, or metadata)
46
+ * Can also be identified by the 'from' field if it's set to an agent ID
47
+ */
48
+ isIncoming(): boolean;
49
+ /**
50
+ * Check if this is an outgoing message
51
+ * Outgoing messages are sent by the client (customer)
52
+ * Can also be identified by the 'from' field if it's set to a customer/client ID
53
+ */
54
+ isOutgoing(): boolean;
55
+ /**
56
+ * Create a copy of this message with updated fields
57
+ */
58
+ clone(updates?: Partial<{
59
+ persona: Persona;
60
+ role: Role;
61
+ content: string;
62
+ messageId: string;
63
+ messageData: MessageData;
64
+ timestamp: number;
65
+ from: string;
66
+ to: string;
67
+ }>): Message;
68
+ }
69
+ //# sourceMappingURL=Message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Message.d.ts","sourceRoot":"","sources":["../../../src/core/message/Message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAW,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjF;;GAEG;AACH,qBAAa,OAAO;IAClB,SAAgB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnC,SAAgB,OAAO,EAAE,OAAO,CAAC;IACjC,SAAgB,IAAI,EAAE,IAAI,CAAC;IAC3B,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjC,SAAgB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1C,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC,SAAgB,IAAI,CAAC,EAAE,MAAM,CAAC;IAC9B,SAAgB,EAAE,CAAC,EAAE,MAAM,CAAC;IAC5B,SAAgB,OAAO,CAAC,EAAE,GAAG,CAAC;IAC9B,SAAgB,SAAS,CAAC,EAAE,GAAG,CAAC;IAEhC;;OAEG;gBAED,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE;QACR,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,WAAW,CAAC,EAAE,WAAW,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;IAcH;;;OAGG;IACH,QAAQ,IAAI,IAAI;IAYhB;;;;OAIG;IACH,eAAe,IAAI,MAAM;IAoBzB;;OAEG;IACH,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,cAAc,EAAE,cAAc,GAAG,OAAO;IAgCnE;;;;OAIG;IACH,UAAU,IAAI,OAAO;IAarB;;;;OAIG;IACH,UAAU,IAAI,OAAO;IAerB;;OAEG;IACH,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QACtB,OAAO,EAAE,OAAO,CAAC;QACjB,IAAI,EAAE,IAAI,CAAC;QACX,OAAO,EAAE,MAAM,CAAC;QAChB,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,WAAW,CAAC;QACzB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC,GAAG,OAAO;CAcb"}
@@ -0,0 +1,131 @@
1
+ import { PERSONA } from './types.js';
2
+ /**
3
+ * Message class representing both incoming and outgoing messages
4
+ */
5
+ export class Message {
6
+ /**
7
+ * Create a new Message instance
8
+ */
9
+ constructor(persona, role, content, options) {
10
+ this.persona = persona;
11
+ this.role = role;
12
+ this.content = content;
13
+ this.messageId = options?.messageId;
14
+ this.messageData = options?.messageData;
15
+ this.timestamp = options?.timestamp ?? Date.now();
16
+ this.from = options?.from;
17
+ this.to = options?.to;
18
+ this.agentId = options?.agentId;
19
+ this.sessionId = options?.sessionId;
20
+ }
21
+ /**
22
+ * Validate message structure
23
+ * @throws {Error} If message is invalid
24
+ */
25
+ validate() {
26
+ if (!this.persona) {
27
+ throw new Error('Message must have a persona');
28
+ }
29
+ if (!this.role) {
30
+ throw new Error('Message must have a role');
31
+ }
32
+ if (this.content !== undefined && typeof this.content !== 'string') {
33
+ throw new Error('Message content must be a string');
34
+ }
35
+ }
36
+ /**
37
+ * Convert message to payload string (JSON) for transmission
38
+ * Outgoing payload is configured here
39
+ * @returns JSON string
40
+ */
41
+ toPayloadString() {
42
+ this.validate();
43
+ const payload = {
44
+ persona: this.persona,
45
+ role: this.role,
46
+ };
47
+ // Only include content if it's defined
48
+ if (this.content !== undefined) {
49
+ payload.content = this.content;
50
+ }
51
+ // Include messageData if present (for context, escalation, feedback, etc.)
52
+ if (this.messageData) {
53
+ payload.messageData = this.messageData;
54
+ }
55
+ return JSON.stringify(payload);
56
+ }
57
+ /**
58
+ * Create a Message instance from JSON data (typically from WebSocket)
59
+ */
60
+ static fromJSON(data, sessionContext) {
61
+ if (typeof data === 'string') {
62
+ data = JSON.parse(data);
63
+ }
64
+ if (!sessionContext) {
65
+ throw new Error('Session context is required');
66
+ }
67
+ if (!data || typeof data !== 'object') {
68
+ throw new Error('Invalid message data: must be an object');
69
+ }
70
+ const message = new Message(data.persona, data.role, data.content || '', {
71
+ messageId: data.messageId,
72
+ messageData: data.messageData,
73
+ timestamp: data.timestamp,
74
+ from: sessionContext.agentName,
75
+ to: sessionContext.customerName,
76
+ agentId: sessionContext.agentId,
77
+ sessionId: sessionContext.sessionId,
78
+ });
79
+ message.validate();
80
+ return message;
81
+ }
82
+ /**
83
+ * Check if this is an incoming message
84
+ * Incoming messages come from the server (agent, system, or metadata)
85
+ * Can also be identified by the 'from' field if it's set to an agent ID
86
+ */
87
+ isIncoming() {
88
+ // If 'from' field is set and persona is agent/system/metadata, it's incoming
89
+ if (this.from && (this.persona === PERSONA.AGENT || this.persona === PERSONA.SYSTEM || this.persona === PERSONA.METADATA)) {
90
+ return true;
91
+ }
92
+ // Fallback to checking persona (server-side personas are incoming)
93
+ if (this.persona === PERSONA.AGENT || this.persona === PERSONA.SYSTEM || this.persona === PERSONA.METADATA) {
94
+ return true;
95
+ }
96
+ // If messageId is set, it's likely incoming (set by server)
97
+ return !!this.messageId;
98
+ }
99
+ /**
100
+ * Check if this is an outgoing message
101
+ * Outgoing messages are sent by the client (customer)
102
+ * Can also be identified by the 'from' field if it's set to a customer/client ID
103
+ */
104
+ isOutgoing() {
105
+ // Customer persona messages are always outgoing
106
+ if (this.persona === PERSONA.CUSTOMER) {
107
+ return true;
108
+ }
109
+ // If 'from' field indicates a customer/client and persona is system, it's outgoing
110
+ // (e.g., context messages, escalation, feedback sent by client)
111
+ if (this.persona === PERSONA.SYSTEM && this.from && !this.messageId) {
112
+ // System messages without messageId and with 'from' are likely outgoing
113
+ return true;
114
+ }
115
+ // Default: if no messageId and persona is customer, it's outgoing
116
+ return false;
117
+ }
118
+ /**
119
+ * Create a copy of this message with updated fields
120
+ */
121
+ clone(updates) {
122
+ return new Message(updates?.persona ?? this.persona, updates?.role ?? this.role, updates?.content ?? this.content, {
123
+ messageId: updates?.messageId ?? this.messageId,
124
+ messageData: updates?.messageData ?? this.messageData,
125
+ timestamp: updates?.timestamp ?? this.timestamp,
126
+ from: updates?.from ?? this.from,
127
+ to: updates?.to ?? this.to,
128
+ });
129
+ }
130
+ }
131
+ //# sourceMappingURL=Message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Message.js","sourceRoot":"","sources":["../../../src/core/message/Message.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ import { BaseMessageHandler } from './BaseMessageHandler.js';
2
+ import { Message } from './Message.js';
3
+ import { MessageHandlerResult } from './types.js';
4
+ import { Logger } from '../logging/Logger.js';
5
+ /**
6
+ * MessageProcessor class that routes messages to appropriate handlers
7
+ * Uses a handler registry pattern where handlers are checked in priority order
8
+ */
9
+ export declare class MessageProcessor {
10
+ private handlers;
11
+ private logger;
12
+ /**
13
+ * Create a new MessageProcessor instance
14
+ * Registers default handlers
15
+ */
16
+ constructor(logger?: Logger);
17
+ /**
18
+ * Register default handlers in priority order
19
+ * More specific handlers should come first (lower index = higher priority)
20
+ * The first handler that can process a message wins
21
+ */
22
+ private registerDefaultHandlers;
23
+ /**
24
+ * Process an incoming message
25
+ * Routes the message to the first handler that can process it
26
+ * @param message - The incoming message
27
+ * @returns Processing result or null if no handler matched
28
+ */
29
+ process(message: Message): Promise<MessageHandlerResult | null>;
30
+ /**
31
+ * Add a custom handler
32
+ * @param handler - Handler instance
33
+ * @param priority - Position to insert (lower = higher priority, default: end of list)
34
+ */
35
+ addHandler(handler: BaseMessageHandler, priority?: number): void;
36
+ /**
37
+ * Remove a handler
38
+ * @param handler - Handler instance to remove
39
+ */
40
+ removeHandler(handler: BaseMessageHandler): void;
41
+ /**
42
+ * Get all registered handlers
43
+ * @returns Array of registered handlers
44
+ */
45
+ getHandlers(): BaseMessageHandler[];
46
+ /**
47
+ * Clear all handlers and re-register defaults
48
+ */
49
+ reset(): void;
50
+ }
51
+ //# sourceMappingURL=MessageProcessor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MessageProcessor.d.ts","sourceRoot":"","sources":["../../../src/core/message/MessageProcessor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAMlD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C;;;GAGG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,MAAM,CAAS;IAEvB;;;OAGG;gBACS,MAAM,CAAC,EAAE,MAAM;IAK3B;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;;;;OAKG;IACG,OAAO,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC;IAkCrE;;;;OAIG;IACH,UAAU,CAAC,OAAO,EAAE,kBAAkB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAiBhE;;;OAGG;IACH,aAAa,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAQhD;;;OAGG;IACH,WAAW,IAAI,kBAAkB,EAAE;IAInC;;OAEG;IACH,KAAK,IAAI,IAAI;CAId"}