@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.
- package/README.md +295 -0
- package/dist/browser.js +22739 -0
- package/dist/core/AiAgent.d.ts +1126 -0
- package/dist/core/AiAgent.d.ts.map +1 -0
- package/dist/core/AiAgent.js +2037 -0
- package/dist/core/AiAgent.js.map +1 -0
- package/dist/core/api/ApiHelper.d.ts +433 -0
- package/dist/core/api/ApiHelper.d.ts.map +1 -0
- package/dist/core/api/ApiHelper.js +689 -0
- package/dist/core/api/ApiHelper.js.map +1 -0
- package/dist/core/api/CacheAdapter.d.ts +295 -0
- package/dist/core/api/CacheAdapter.d.ts.map +1 -0
- package/dist/core/api/CacheAdapter.js +298 -0
- package/dist/core/api/CacheAdapter.js.map +1 -0
- package/dist/core/auth/AnonymousAuthStrategy.d.ts +87 -0
- package/dist/core/auth/AnonymousAuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/AnonymousAuthStrategy.js +257 -0
- package/dist/core/auth/AnonymousAuthStrategy.js.map +1 -0
- package/dist/core/auth/AuthProvider.d.ts +13 -0
- package/dist/core/auth/AuthProvider.d.ts.map +1 -0
- package/dist/core/auth/AuthProvider.js +2 -0
- package/dist/core/auth/AuthProvider.js.map +1 -0
- package/dist/core/auth/AuthStrategy.d.ts +74 -0
- package/dist/core/auth/AuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/AuthStrategy.js +2 -0
- package/dist/core/auth/AuthStrategy.js.map +1 -0
- package/dist/core/auth/AuthenticationService.d.ts +226 -0
- package/dist/core/auth/AuthenticationService.d.ts.map +1 -0
- package/dist/core/auth/AuthenticationService.js +344 -0
- package/dist/core/auth/AuthenticationService.js.map +1 -0
- package/dist/core/auth/ClientCredentialsAuthStrategy.d.ts +62 -0
- package/dist/core/auth/ClientCredentialsAuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/ClientCredentialsAuthStrategy.js +78 -0
- package/dist/core/auth/ClientCredentialsAuthStrategy.js.map +1 -0
- package/dist/core/auth/PKCEAuthStrategy.d.ts +136 -0
- package/dist/core/auth/PKCEAuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/PKCEAuthStrategy.js +409 -0
- package/dist/core/auth/PKCEAuthStrategy.js.map +1 -0
- package/dist/core/auth/PreAuthStrategy.d.ts +101 -0
- package/dist/core/auth/PreAuthStrategy.d.ts.map +1 -0
- package/dist/core/auth/PreAuthStrategy.js +216 -0
- package/dist/core/auth/PreAuthStrategy.js.map +1 -0
- package/dist/core/auth/msal-browser.js +19683 -0
- package/dist/core/auth/msal-loader.d.ts +14 -0
- package/dist/core/auth/msal-loader.d.ts.map +1 -0
- package/dist/core/auth/msal-loader.js +43 -0
- package/dist/core/auth/msal-loader.js.map +1 -0
- package/dist/core/connection/Connection.d.ts +168 -0
- package/dist/core/connection/Connection.d.ts.map +1 -0
- package/dist/core/connection/Connection.js +290 -0
- package/dist/core/connection/Connection.js.map +1 -0
- package/dist/core/connection/ConnectionState.d.ts +11 -0
- package/dist/core/connection/ConnectionState.d.ts.map +1 -0
- package/dist/core/connection/ConnectionState.js +12 -0
- package/dist/core/connection/ConnectionState.js.map +1 -0
- package/dist/core/connection/Transport.d.ts +98 -0
- package/dist/core/connection/Transport.d.ts.map +1 -0
- package/dist/core/connection/Transport.js +27 -0
- package/dist/core/connection/Transport.js.map +1 -0
- package/dist/core/connection/WebSocketTransport.d.ts +65 -0
- package/dist/core/connection/WebSocketTransport.d.ts.map +1 -0
- package/dist/core/connection/WebSocketTransport.js +177 -0
- package/dist/core/connection/WebSocketTransport.js.map +1 -0
- package/dist/core/errors/SDKError.d.ts +27 -0
- package/dist/core/errors/SDKError.d.ts.map +1 -0
- package/dist/core/errors/SDKError.js +43 -0
- package/dist/core/errors/SDKError.js.map +1 -0
- package/dist/core/events/EventEmitter.d.ts +120 -0
- package/dist/core/events/EventEmitter.d.ts.map +1 -0
- package/dist/core/events/EventEmitter.js +183 -0
- package/dist/core/events/EventEmitter.js.map +1 -0
- package/dist/core/logging/LogLevel.d.ts +33 -0
- package/dist/core/logging/LogLevel.d.ts.map +1 -0
- package/dist/core/logging/LogLevel.js +40 -0
- package/dist/core/logging/LogLevel.js.map +1 -0
- package/dist/core/logging/Logger.d.ts +120 -0
- package/dist/core/logging/Logger.d.ts.map +1 -0
- package/dist/core/logging/Logger.js +204 -0
- package/dist/core/logging/Logger.js.map +1 -0
- package/dist/core/logging/globalLogger.d.ts +8 -0
- package/dist/core/logging/globalLogger.d.ts.map +1 -0
- package/dist/core/logging/globalLogger.js +12 -0
- package/dist/core/logging/globalLogger.js.map +1 -0
- package/dist/core/logging/types.d.ts +45 -0
- package/dist/core/logging/types.d.ts.map +1 -0
- package/dist/core/logging/types.js +2 -0
- package/dist/core/logging/types.js.map +1 -0
- package/dist/core/message/BaseMessageHandler.d.ts +208 -0
- package/dist/core/message/BaseMessageHandler.d.ts.map +1 -0
- package/dist/core/message/BaseMessageHandler.js +155 -0
- package/dist/core/message/BaseMessageHandler.js.map +1 -0
- package/dist/core/message/Message.d.ts +69 -0
- package/dist/core/message/Message.d.ts.map +1 -0
- package/dist/core/message/Message.js +131 -0
- package/dist/core/message/Message.js.map +1 -0
- package/dist/core/message/MessageProcessor.d.ts +51 -0
- package/dist/core/message/MessageProcessor.d.ts.map +1 -0
- package/dist/core/message/MessageProcessor.js +123 -0
- package/dist/core/message/MessageProcessor.js.map +1 -0
- package/dist/core/message/MessageTypes.d.ts +123 -0
- package/dist/core/message/MessageTypes.d.ts.map +1 -0
- package/dist/core/message/MessageTypes.js +106 -0
- package/dist/core/message/MessageTypes.js.map +1 -0
- package/dist/core/message/Transcript.d.ts +373 -0
- package/dist/core/message/Transcript.d.ts.map +1 -0
- package/dist/core/message/Transcript.js +355 -0
- package/dist/core/message/Transcript.js.map +1 -0
- package/dist/core/message/handlers/AgentMessageHandler.d.ts +26 -0
- package/dist/core/message/handlers/AgentMessageHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/AgentMessageHandler.js +130 -0
- package/dist/core/message/handlers/AgentMessageHandler.js.map +1 -0
- package/dist/core/message/handlers/ChatHistoryHandler.d.ts +12 -0
- package/dist/core/message/handlers/ChatHistoryHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/ChatHistoryHandler.js +49 -0
- package/dist/core/message/handlers/ChatHistoryHandler.js.map +1 -0
- package/dist/core/message/handlers/ErrorMessageHandler.d.ts +12 -0
- package/dist/core/message/handlers/ErrorMessageHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/ErrorMessageHandler.js +49 -0
- package/dist/core/message/handlers/ErrorMessageHandler.js.map +1 -0
- package/dist/core/message/handlers/HeartbeatHandler.d.ts +12 -0
- package/dist/core/message/handlers/HeartbeatHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/HeartbeatHandler.js +46 -0
- package/dist/core/message/handlers/HeartbeatHandler.js.map +1 -0
- package/dist/core/message/handlers/TokenRefreshHandler.d.ts +30 -0
- package/dist/core/message/handlers/TokenRefreshHandler.d.ts.map +1 -0
- package/dist/core/message/handlers/TokenRefreshHandler.js +84 -0
- package/dist/core/message/handlers/TokenRefreshHandler.js.map +1 -0
- package/dist/core/message/types.d.ts +107 -0
- package/dist/core/message/types.d.ts.map +1 -0
- package/dist/core/message/types.js +30 -0
- package/dist/core/message/types.js.map +1 -0
- package/dist/core/platform/HookContract.d.ts +112 -0
- package/dist/core/platform/HookContract.d.ts.map +1 -0
- package/dist/core/platform/HookContract.js +13 -0
- package/dist/core/platform/HookContract.js.map +1 -0
- package/dist/core/platform/PlatformComponentService.d.ts +40 -0
- package/dist/core/platform/PlatformComponentService.d.ts.map +1 -0
- package/dist/core/platform/PlatformComponentService.js +12 -0
- package/dist/core/platform/PlatformComponentService.js.map +1 -0
- package/dist/core/platform/PlatformScriptLoader.d.ts +41 -0
- package/dist/core/platform/PlatformScriptLoader.d.ts.map +1 -0
- package/dist/core/platform/PlatformScriptLoader.js +110 -0
- package/dist/core/platform/PlatformScriptLoader.js.map +1 -0
- package/dist/core/polyfills.d.ts +16 -0
- package/dist/core/polyfills.d.ts.map +1 -0
- package/dist/core/polyfills.js +168 -0
- package/dist/core/polyfills.js.map +1 -0
- package/dist/core/portal-initializer/PortalInitializer.d.ts +234 -0
- package/dist/core/portal-initializer/PortalInitializer.d.ts.map +1 -0
- package/dist/core/portal-initializer/PortalInitializer.js +636 -0
- package/dist/core/portal-initializer/PortalInitializer.js.map +1 -0
- package/dist/core/queue/MessageQueue.d.ts +277 -0
- package/dist/core/queue/MessageQueue.d.ts.map +1 -0
- package/dist/core/queue/MessageQueue.js +291 -0
- package/dist/core/queue/MessageQueue.js.map +1 -0
- package/dist/core/types/PortalTypes.d.ts +51 -0
- package/dist/core/types/PortalTypes.d.ts.map +1 -0
- package/dist/core/types/PortalTypes.js +8 -0
- package/dist/core/types/PortalTypes.js.map +1 -0
- package/dist/index.d.ts +91 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- 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"}
|