@bernierllc/chat-suite 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +26 -0
- package/README.md +542 -0
- package/__tests__/integration/ChatSuite.test.ts +235 -0
- package/__tests__/unit/ConfigManager.test.ts +122 -0
- package/__tests__/unit/MessageOrchestrator.test.ts +223 -0
- package/__tests__/unit/UserManager.test.ts +208 -0
- package/dist/ChatSuite.d.ts +76 -0
- package/dist/ChatSuite.d.ts.map +1 -0
- package/dist/ChatSuite.js +273 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +37 -0
- package/dist/neverhub/discovery.d.ts +40 -0
- package/dist/neverhub/discovery.d.ts.map +1 -0
- package/dist/neverhub/discovery.js +106 -0
- package/dist/neverhub/event-handlers.d.ts +38 -0
- package/dist/neverhub/event-handlers.d.ts.map +1 -0
- package/dist/neverhub/event-handlers.js +125 -0
- package/dist/neverhub/index.d.ts +4 -0
- package/dist/neverhub/index.d.ts.map +1 -0
- package/dist/neverhub/index.js +26 -0
- package/dist/neverhub/service-registration.d.ts +29 -0
- package/dist/neverhub/service-registration.d.ts.map +1 -0
- package/dist/neverhub/service-registration.js +66 -0
- package/dist/providers/ChatKitProvider.d.ts +53 -0
- package/dist/providers/ChatKitProvider.d.ts.map +1 -0
- package/dist/providers/ChatKitProvider.js +167 -0
- package/dist/providers/ExternalProviders.d.ts +101 -0
- package/dist/providers/ExternalProviders.d.ts.map +1 -0
- package/dist/providers/ExternalProviders.js +153 -0
- package/dist/providers/index.d.ts +3 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +25 -0
- package/dist/services/ConfigManager.d.ts +50 -0
- package/dist/services/ConfigManager.d.ts.map +1 -0
- package/dist/services/ConfigManager.js +95 -0
- package/dist/services/HealthMonitor.d.ts +58 -0
- package/dist/services/HealthMonitor.d.ts.map +1 -0
- package/dist/services/HealthMonitor.js +148 -0
- package/dist/services/MessageOrchestrator.d.ts +63 -0
- package/dist/services/MessageOrchestrator.d.ts.map +1 -0
- package/dist/services/MessageOrchestrator.js +212 -0
- package/dist/services/ProviderManager.d.ts +83 -0
- package/dist/services/ProviderManager.d.ts.map +1 -0
- package/dist/services/ProviderManager.js +204 -0
- package/dist/services/UserManager.d.ts +61 -0
- package/dist/services/UserManager.d.ts.map +1 -0
- package/dist/services/UserManager.js +141 -0
- package/dist/services/index.d.ts +6 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +28 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +26 -0
- package/dist/types/message-types.d.ts +80 -0
- package/dist/types/message-types.d.ts.map +1 -0
- package/dist/types/message-types.js +32 -0
- package/dist/types/provider-types.d.ts +96 -0
- package/dist/types/provider-types.d.ts.map +1 -0
- package/dist/types/provider-types.js +9 -0
- package/dist/types/suite-types.d.ts +101 -0
- package/dist/types/suite-types.d.ts.map +1 -0
- package/dist/types/suite-types.js +9 -0
- package/dist/utils/config-inheritance.d.ts +24 -0
- package/dist/utils/config-inheritance.d.ts.map +1 -0
- package/dist/utils/config-inheritance.js +167 -0
- package/dist/utils/error-handling.d.ts +37 -0
- package/dist/utils/error-handling.d.ts.map +1 -0
- package/dist/utils/error-handling.js +102 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +27 -0
- package/dist/utils/message-bridge.d.ts +68 -0
- package/dist/utils/message-bridge.d.ts.map +1 -0
- package/dist/utils/message-bridge.js +126 -0
- package/dist/utils/user-mapping.d.ts +63 -0
- package/dist/utils/user-mapping.d.ts.map +1 -0
- package/dist/utils/user-mapping.js +110 -0
- package/jest.config.cjs +30 -0
- package/package.json +67 -0
- package/src/ChatSuite.ts +347 -0
- package/src/index.ts +25 -0
- package/src/neverhub/discovery.ts +137 -0
- package/src/neverhub/event-handlers.ts +141 -0
- package/src/neverhub/index.ts +11 -0
- package/src/neverhub/service-registration.ts +89 -0
- package/src/providers/ChatKitProvider.ts +193 -0
- package/src/providers/ExternalProviders.ts +171 -0
- package/src/providers/index.ts +10 -0
- package/src/services/ConfigManager.ts +112 -0
- package/src/services/HealthMonitor.ts +169 -0
- package/src/services/MessageOrchestrator.ts +271 -0
- package/src/services/ProviderManager.ts +247 -0
- package/src/services/UserManager.ts +176 -0
- package/src/services/index.ts +13 -0
- package/src/types/index.ts +11 -0
- package/src/types/message-types.ts +94 -0
- package/src/types/provider-types.ts +116 -0
- package/src/types/suite-types.ts +117 -0
- package/src/utils/config-inheritance.ts +189 -0
- package/src/utils/error-handling.ts +114 -0
- package/src/utils/index.ts +12 -0
- package/src/utils/message-bridge.ts +164 -0
- package/src/utils/user-mapping.ts +132 -0
- package/tsconfig.json +31 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { Provider, ProviderType, ProviderMessage, ProviderMessageResult, OrchestratedMessage, BroadcastConfig, SuiteResult } from '../types';
|
|
2
|
+
import { MessagePriority, MessageStatus } from '../types';
|
|
3
|
+
import { MessageBridge } from '../utils/message-bridge';
|
|
4
|
+
/**
|
|
5
|
+
* Orchestrates messages across all providers
|
|
6
|
+
*/
|
|
7
|
+
export declare class MessageOrchestrator {
|
|
8
|
+
private messageBridge?;
|
|
9
|
+
private messages;
|
|
10
|
+
/**
|
|
11
|
+
* Set message bridge for cross-platform sync
|
|
12
|
+
*/
|
|
13
|
+
setMessageBridge(bridge: MessageBridge): void;
|
|
14
|
+
/**
|
|
15
|
+
* Send a message through a specific provider
|
|
16
|
+
*/
|
|
17
|
+
sendMessage(provider: Provider, message: ProviderMessage): Promise<SuiteResult<ProviderMessageResult>>;
|
|
18
|
+
/**
|
|
19
|
+
* Broadcast a message to multiple platforms
|
|
20
|
+
*/
|
|
21
|
+
broadcastMessage(providers: Map<ProviderType, Provider>, config: BroadcastConfig): Promise<SuiteResult<ProviderMessageResult[]>>;
|
|
22
|
+
/**
|
|
23
|
+
* Bridge a message from one provider to another
|
|
24
|
+
*/
|
|
25
|
+
bridgeMessage(sourceProvider: Provider, targetProvider: Provider, message: ProviderMessage): Promise<SuiteResult<ProviderMessageResult>>;
|
|
26
|
+
/**
|
|
27
|
+
* Get an orchestrated message by ID
|
|
28
|
+
*/
|
|
29
|
+
getMessage(messageId: string): OrchestratedMessage | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Get all messages
|
|
32
|
+
*/
|
|
33
|
+
getAllMessages(): OrchestratedMessage[];
|
|
34
|
+
/**
|
|
35
|
+
* Get messages by status
|
|
36
|
+
*/
|
|
37
|
+
getMessagesByStatus(status: MessageStatus): OrchestratedMessage[];
|
|
38
|
+
/**
|
|
39
|
+
* Update message status
|
|
40
|
+
*/
|
|
41
|
+
updateMessageStatus(messageId: string, status: MessageStatus): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Clear all messages
|
|
44
|
+
*/
|
|
45
|
+
clearMessages(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Get message count
|
|
48
|
+
*/
|
|
49
|
+
getMessageCount(): number;
|
|
50
|
+
/**
|
|
51
|
+
* Get statistics
|
|
52
|
+
*/
|
|
53
|
+
getStats(): {
|
|
54
|
+
total: number;
|
|
55
|
+
byStatus: Record<MessageStatus, number>;
|
|
56
|
+
byPriority: Record<MessagePriority, number>;
|
|
57
|
+
};
|
|
58
|
+
/**
|
|
59
|
+
* Generate a unique message ID
|
|
60
|
+
*/
|
|
61
|
+
private generateMessageId;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=MessageOrchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessageOrchestrator.d.ts","sourceRoot":"","sources":["../../src/services/MessageOrchestrator.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,WAAW,EACZ,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD;;GAEG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,aAAa,CAAC,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAA+C;IAE/D;;OAEG;IACI,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI;IAIpD;;OAEG;IACU,WAAW,CACtB,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAwB9C;;OAEG;IACU,gBAAgB,CAC3B,SAAS,EAAE,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,EACtC,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,WAAW,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAuDhD;;OAEG;IACU,aAAa,CACxB,cAAc,EAAE,QAAQ,EACxB,cAAc,EAAE,QAAQ,EACxB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IA8C9C;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS;IAIrE;;OAEG;IACI,cAAc,IAAI,mBAAmB,EAAE;IAI9C;;OAEG;IACI,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,mBAAmB,EAAE;IAIxE;;OAEG;IACI,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO;IAW7E;;OAEG;IACI,aAAa,IAAI,IAAI;IAI5B;;OAEG;IACI,eAAe,IAAI,MAAM;IAIhC;;OAEG;IACI,QAAQ,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QACxC,UAAU,EAAE,MAAM,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;KAC7C;IA6BD;;OAEG;IACH,OAAO,CAAC,iBAAiB;CAG1B"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.MessageOrchestrator = void 0;
|
|
11
|
+
const types_1 = require("../types");
|
|
12
|
+
const error_handling_1 = require("../utils/error-handling");
|
|
13
|
+
/**
|
|
14
|
+
* Orchestrates messages across all providers
|
|
15
|
+
*/
|
|
16
|
+
class MessageOrchestrator {
|
|
17
|
+
constructor() {
|
|
18
|
+
this.messages = new Map();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Set message bridge for cross-platform sync
|
|
22
|
+
*/
|
|
23
|
+
setMessageBridge(bridge) {
|
|
24
|
+
this.messageBridge = bridge;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Send a message through a specific provider
|
|
28
|
+
*/
|
|
29
|
+
async sendMessage(provider, message) {
|
|
30
|
+
try {
|
|
31
|
+
if (!provider.isInitialized()) {
|
|
32
|
+
return {
|
|
33
|
+
success: false,
|
|
34
|
+
error: `Provider ${provider.type} is not initialized`
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
const result = await (0, error_handling_1.retryOperation)(() => provider.sendMessage(message), 3, 1000);
|
|
38
|
+
return { success: true, data: result };
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
return {
|
|
42
|
+
success: false,
|
|
43
|
+
error: error instanceof Error ? error.message : 'Failed to send message'
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Broadcast a message to multiple platforms
|
|
49
|
+
*/
|
|
50
|
+
async broadcastMessage(providers, config) {
|
|
51
|
+
try {
|
|
52
|
+
const results = [];
|
|
53
|
+
const targetProviders = config.platforms
|
|
54
|
+
.map(type => providers.get(type))
|
|
55
|
+
.filter((p) => p !== undefined);
|
|
56
|
+
if (targetProviders.length === 0) {
|
|
57
|
+
return {
|
|
58
|
+
success: false,
|
|
59
|
+
error: 'No valid providers found for broadcast'
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
// Create orchestrated message
|
|
63
|
+
const orchestratedMessage = {
|
|
64
|
+
id: this.generateMessageId(),
|
|
65
|
+
content: config.content,
|
|
66
|
+
priority: config.priority || types_1.MessagePriority.NORMAL,
|
|
67
|
+
status: types_1.MessageStatus.SENDING,
|
|
68
|
+
targetProviders: config.platforms,
|
|
69
|
+
metadata: config.metadata,
|
|
70
|
+
createdAt: new Date(),
|
|
71
|
+
updatedAt: new Date()
|
|
72
|
+
};
|
|
73
|
+
this.messages.set(orchestratedMessage.id, orchestratedMessage);
|
|
74
|
+
// Send to all providers
|
|
75
|
+
for (const provider of targetProviders) {
|
|
76
|
+
const providerMessage = {
|
|
77
|
+
content: config.content,
|
|
78
|
+
channelId: config.channels?.[0],
|
|
79
|
+
metadata: config.metadata
|
|
80
|
+
};
|
|
81
|
+
const result = await this.sendMessage(provider, providerMessage);
|
|
82
|
+
if (result.success && result.data) {
|
|
83
|
+
results.push(result.data);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Update orchestrated message status
|
|
87
|
+
orchestratedMessage.status = results.length > 0 ? types_1.MessageStatus.SENT : types_1.MessageStatus.FAILED;
|
|
88
|
+
orchestratedMessage.updatedAt = new Date();
|
|
89
|
+
return { success: true, data: results };
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
return {
|
|
93
|
+
success: false,
|
|
94
|
+
error: error instanceof Error ? error.message : 'Failed to broadcast message'
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Bridge a message from one provider to another
|
|
100
|
+
*/
|
|
101
|
+
async bridgeMessage(sourceProvider, targetProvider, message) {
|
|
102
|
+
try {
|
|
103
|
+
if (!this.messageBridge) {
|
|
104
|
+
throw new error_handling_1.ChatSuiteError(error_handling_1.ChatSuiteErrorType.CONFIGURATION_ERROR, 'Message bridge not configured');
|
|
105
|
+
}
|
|
106
|
+
if (!this.messageBridge.shouldBridge(sourceProvider.type, targetProvider.type)) {
|
|
107
|
+
return {
|
|
108
|
+
success: false,
|
|
109
|
+
error: `Bridging from ${sourceProvider.type} to ${targetProvider.type} is not enabled`
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
// Transform message for target provider
|
|
113
|
+
const transformedMessage = this.messageBridge.transformMessage(message, sourceProvider.type, targetProvider.type);
|
|
114
|
+
// Send to target provider
|
|
115
|
+
const result = await this.sendMessage(targetProvider, transformedMessage);
|
|
116
|
+
if (result.success && result.data) {
|
|
117
|
+
// Record the bridge
|
|
118
|
+
this.messageBridge.recordBridgedMessage({
|
|
119
|
+
originalMessageId: result.data.messageId || 'unknown',
|
|
120
|
+
sourceProvider: sourceProvider.type,
|
|
121
|
+
targetProvider: targetProvider.type,
|
|
122
|
+
targetMessageId: result.data.messageId,
|
|
123
|
+
timestamp: new Date()
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
return {
|
|
130
|
+
success: false,
|
|
131
|
+
error: error instanceof Error ? error.message : 'Failed to bridge message'
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get an orchestrated message by ID
|
|
137
|
+
*/
|
|
138
|
+
getMessage(messageId) {
|
|
139
|
+
return this.messages.get(messageId);
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Get all messages
|
|
143
|
+
*/
|
|
144
|
+
getAllMessages() {
|
|
145
|
+
return Array.from(this.messages.values());
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Get messages by status
|
|
149
|
+
*/
|
|
150
|
+
getMessagesByStatus(status) {
|
|
151
|
+
return Array.from(this.messages.values()).filter(m => m.status === status);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Update message status
|
|
155
|
+
*/
|
|
156
|
+
updateMessageStatus(messageId, status) {
|
|
157
|
+
const message = this.messages.get(messageId);
|
|
158
|
+
if (!message) {
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
message.status = status;
|
|
162
|
+
message.updatedAt = new Date();
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Clear all messages
|
|
167
|
+
*/
|
|
168
|
+
clearMessages() {
|
|
169
|
+
this.messages.clear();
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Get message count
|
|
173
|
+
*/
|
|
174
|
+
getMessageCount() {
|
|
175
|
+
return this.messages.size;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Get statistics
|
|
179
|
+
*/
|
|
180
|
+
getStats() {
|
|
181
|
+
const byStatus = {
|
|
182
|
+
[types_1.MessageStatus.PENDING]: 0,
|
|
183
|
+
[types_1.MessageStatus.ROUTING]: 0,
|
|
184
|
+
[types_1.MessageStatus.SENDING]: 0,
|
|
185
|
+
[types_1.MessageStatus.SENT]: 0,
|
|
186
|
+
[types_1.MessageStatus.FAILED]: 0,
|
|
187
|
+
[types_1.MessageStatus.RETRYING]: 0
|
|
188
|
+
};
|
|
189
|
+
const byPriority = {
|
|
190
|
+
[types_1.MessagePriority.LOW]: 0,
|
|
191
|
+
[types_1.MessagePriority.NORMAL]: 0,
|
|
192
|
+
[types_1.MessagePriority.HIGH]: 0,
|
|
193
|
+
[types_1.MessagePriority.URGENT]: 0
|
|
194
|
+
};
|
|
195
|
+
this.messages.forEach(message => {
|
|
196
|
+
byStatus[message.status]++;
|
|
197
|
+
byPriority[message.priority]++;
|
|
198
|
+
});
|
|
199
|
+
return {
|
|
200
|
+
total: this.messages.size,
|
|
201
|
+
byStatus,
|
|
202
|
+
byPriority
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Generate a unique message ID
|
|
207
|
+
*/
|
|
208
|
+
generateMessageId() {
|
|
209
|
+
return `msg_${Date.now()}_${Math.random().toString(36).substring(2, 9)}`;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
exports.MessageOrchestrator = MessageOrchestrator;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import type { Provider, ProviderType, SuiteResult } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Provider registration information
|
|
4
|
+
*/
|
|
5
|
+
export interface ProviderRegistration {
|
|
6
|
+
provider: Provider;
|
|
7
|
+
priority: number;
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Manages all chat providers
|
|
12
|
+
*/
|
|
13
|
+
export declare class ProviderManager {
|
|
14
|
+
private providers;
|
|
15
|
+
private initializedProviders;
|
|
16
|
+
/**
|
|
17
|
+
* Register a provider
|
|
18
|
+
*/
|
|
19
|
+
registerProvider(registration: ProviderRegistration): SuiteResult<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Initialize a provider
|
|
22
|
+
*/
|
|
23
|
+
initializeProvider(providerType: ProviderType): Promise<SuiteResult<void>>;
|
|
24
|
+
/**
|
|
25
|
+
* Initialize all enabled providers
|
|
26
|
+
*/
|
|
27
|
+
initializeAll(): Promise<{
|
|
28
|
+
successful: ProviderType[];
|
|
29
|
+
failed: Array<{
|
|
30
|
+
type: ProviderType;
|
|
31
|
+
error: string;
|
|
32
|
+
}>;
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Get a provider by type
|
|
36
|
+
*/
|
|
37
|
+
getProvider(providerType: ProviderType): Provider | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Check if a provider is initialized
|
|
40
|
+
*/
|
|
41
|
+
isInitialized(providerType: ProviderType): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Get all enabled providers sorted by priority
|
|
44
|
+
*/
|
|
45
|
+
getEnabledProviders(): Provider[];
|
|
46
|
+
/**
|
|
47
|
+
* Get all initialized providers
|
|
48
|
+
*/
|
|
49
|
+
getInitializedProviders(): Provider[];
|
|
50
|
+
/**
|
|
51
|
+
* Get provider by priority (1 = highest)
|
|
52
|
+
*/
|
|
53
|
+
getProviderByPriority(priority: number): Provider | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* Get highest priority provider
|
|
56
|
+
*/
|
|
57
|
+
getPrimaryProvider(): Provider | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Shutdown a provider
|
|
60
|
+
*/
|
|
61
|
+
shutdownProvider(providerType: ProviderType): Promise<SuiteResult<void>>;
|
|
62
|
+
/**
|
|
63
|
+
* Shutdown all providers
|
|
64
|
+
*/
|
|
65
|
+
shutdownAll(): Promise<void>;
|
|
66
|
+
/**
|
|
67
|
+
* Unregister a provider
|
|
68
|
+
*/
|
|
69
|
+
unregisterProvider(providerType: ProviderType): SuiteResult<void>;
|
|
70
|
+
/**
|
|
71
|
+
* Get provider count
|
|
72
|
+
*/
|
|
73
|
+
getProviderCount(): {
|
|
74
|
+
total: number;
|
|
75
|
+
enabled: number;
|
|
76
|
+
initialized: number;
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Clear all providers
|
|
80
|
+
*/
|
|
81
|
+
clear(): void;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=ProviderManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderManager.d.ts","sourceRoot":"","sources":["../../src/services/ProviderManager.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAGpE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,SAAS,CAAsD;IACvE,OAAO,CAAC,oBAAoB,CAAgC;IAE5D;;OAEG;IACI,gBAAgB,CAAC,YAAY,EAAE,oBAAoB,GAAG,WAAW,CAAC,IAAI,CAAC;IAmB9E;;OAEG;IACU,kBAAkB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IA4BvF;;OAEG;IACU,aAAa,IAAI,OAAO,CAAC;QACpC,UAAU,EAAE,YAAY,EAAE,CAAC;QAC3B,MAAM,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,YAAY,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACtD,CAAC;IAoBF;;OAEG;IACI,WAAW,CAAC,YAAY,EAAE,YAAY,GAAG,QAAQ,GAAG,SAAS;IAIpE;;OAEG;IACI,aAAa,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO;IAIzD;;OAEG;IACI,mBAAmB,IAAI,QAAQ,EAAE;IAQxC;;OAEG;IACI,uBAAuB,IAAI,QAAQ,EAAE;IAM5C;;OAEG;IACI,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS;IAOpE;;OAEG;IACI,kBAAkB,IAAI,QAAQ,GAAG,SAAS;IAQjD;;OAEG;IACU,gBAAgB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAyBrF;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAQzC;;OAEG;IACI,kBAAkB,CAAC,YAAY,EAAE,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC;IAmBxE;;OAEG;IACI,gBAAgB,IAAI;QACzB,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,EAAE,MAAM,CAAC;KACrB;IAUD;;OAEG;IACI,KAAK,IAAI,IAAI;CAIrB"}
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
Copyright (c) 2025 Bernier LLC
|
|
4
|
+
|
|
5
|
+
This file is licensed to the client under a limited-use license.
|
|
6
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
7
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ProviderManager = void 0;
|
|
11
|
+
const error_handling_1 = require("../utils/error-handling");
|
|
12
|
+
/**
|
|
13
|
+
* Manages all chat providers
|
|
14
|
+
*/
|
|
15
|
+
class ProviderManager {
|
|
16
|
+
constructor() {
|
|
17
|
+
this.providers = new Map();
|
|
18
|
+
this.initializedProviders = new Set();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Register a provider
|
|
22
|
+
*/
|
|
23
|
+
registerProvider(registration) {
|
|
24
|
+
try {
|
|
25
|
+
if (this.providers.has(registration.provider.type)) {
|
|
26
|
+
return {
|
|
27
|
+
success: false,
|
|
28
|
+
error: `Provider ${registration.provider.type} is already registered`
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
this.providers.set(registration.provider.type, registration);
|
|
32
|
+
return { success: true };
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
return {
|
|
36
|
+
success: false,
|
|
37
|
+
error: error instanceof Error ? error.message : 'Failed to register provider'
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Initialize a provider
|
|
43
|
+
*/
|
|
44
|
+
async initializeProvider(providerType) {
|
|
45
|
+
try {
|
|
46
|
+
const registration = this.providers.get(providerType);
|
|
47
|
+
if (!registration) {
|
|
48
|
+
return {
|
|
49
|
+
success: false,
|
|
50
|
+
error: `Provider ${providerType} not registered`
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
if (!registration.enabled) {
|
|
54
|
+
return {
|
|
55
|
+
success: false,
|
|
56
|
+
error: `Provider ${providerType} is not enabled`
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
await registration.provider.initialize();
|
|
60
|
+
this.initializedProviders.add(providerType);
|
|
61
|
+
return { success: true };
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
return {
|
|
65
|
+
success: false,
|
|
66
|
+
error: error instanceof Error ? error.message : 'Failed to initialize provider'
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Initialize all enabled providers
|
|
72
|
+
*/
|
|
73
|
+
async initializeAll() {
|
|
74
|
+
const successful = [];
|
|
75
|
+
const failed = [];
|
|
76
|
+
for (const [type, registration] of this.providers) {
|
|
77
|
+
if (!registration.enabled) {
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
const result = await this.initializeProvider(type);
|
|
81
|
+
if (result.success) {
|
|
82
|
+
successful.push(type);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
failed.push({ type, error: result.error || 'Unknown error' });
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return { successful, failed };
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get a provider by type
|
|
92
|
+
*/
|
|
93
|
+
getProvider(providerType) {
|
|
94
|
+
return this.providers.get(providerType)?.provider;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Check if a provider is initialized
|
|
98
|
+
*/
|
|
99
|
+
isInitialized(providerType) {
|
|
100
|
+
return this.initializedProviders.has(providerType);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Get all enabled providers sorted by priority
|
|
104
|
+
*/
|
|
105
|
+
getEnabledProviders() {
|
|
106
|
+
const enabled = Array.from(this.providers.values())
|
|
107
|
+
.filter(reg => reg.enabled)
|
|
108
|
+
.sort((a, b) => a.priority - b.priority);
|
|
109
|
+
return enabled.map(reg => reg.provider);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get all initialized providers
|
|
113
|
+
*/
|
|
114
|
+
getInitializedProviders() {
|
|
115
|
+
return Array.from(this.initializedProviders)
|
|
116
|
+
.map(type => this.providers.get(type)?.provider)
|
|
117
|
+
.filter((p) => p !== undefined);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Get provider by priority (1 = highest)
|
|
121
|
+
*/
|
|
122
|
+
getProviderByPriority(priority) {
|
|
123
|
+
const registration = Array.from(this.providers.values())
|
|
124
|
+
.find(reg => reg.priority === priority && reg.enabled);
|
|
125
|
+
return registration?.provider;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Get highest priority provider
|
|
129
|
+
*/
|
|
130
|
+
getPrimaryProvider() {
|
|
131
|
+
const enabled = Array.from(this.providers.values())
|
|
132
|
+
.filter(reg => reg.enabled)
|
|
133
|
+
.sort((a, b) => a.priority - b.priority);
|
|
134
|
+
return enabled[0]?.provider;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Shutdown a provider
|
|
138
|
+
*/
|
|
139
|
+
async shutdownProvider(providerType) {
|
|
140
|
+
try {
|
|
141
|
+
const provider = this.providers.get(providerType)?.provider;
|
|
142
|
+
if (!provider) {
|
|
143
|
+
return {
|
|
144
|
+
success: false,
|
|
145
|
+
error: `Provider ${providerType} not found`
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
if (!this.initializedProviders.has(providerType)) {
|
|
149
|
+
return { success: true }; // Already shutdown
|
|
150
|
+
}
|
|
151
|
+
await provider.shutdown();
|
|
152
|
+
this.initializedProviders.delete(providerType);
|
|
153
|
+
return { success: true };
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
return {
|
|
157
|
+
success: false,
|
|
158
|
+
error: error instanceof Error ? error.message : 'Failed to shutdown provider'
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Shutdown all providers
|
|
164
|
+
*/
|
|
165
|
+
async shutdownAll() {
|
|
166
|
+
const shutdownPromises = Array.from(this.initializedProviders).map(type => this.shutdownProvider(type));
|
|
167
|
+
await Promise.all(shutdownPromises);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Unregister a provider
|
|
171
|
+
*/
|
|
172
|
+
unregisterProvider(providerType) {
|
|
173
|
+
if (this.initializedProviders.has(providerType)) {
|
|
174
|
+
throw new error_handling_1.ChatSuiteError(error_handling_1.ChatSuiteErrorType.PROVIDER_ERROR, `Cannot unregister initialized provider ${providerType}. Shutdown first.`);
|
|
175
|
+
}
|
|
176
|
+
const deleted = this.providers.delete(providerType);
|
|
177
|
+
if (!deleted) {
|
|
178
|
+
return {
|
|
179
|
+
success: false,
|
|
180
|
+
error: `Provider ${providerType} not registered`
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
return { success: true };
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get provider count
|
|
187
|
+
*/
|
|
188
|
+
getProviderCount() {
|
|
189
|
+
const enabled = Array.from(this.providers.values()).filter(r => r.enabled).length;
|
|
190
|
+
return {
|
|
191
|
+
total: this.providers.size,
|
|
192
|
+
enabled,
|
|
193
|
+
initialized: this.initializedProviders.size
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Clear all providers
|
|
198
|
+
*/
|
|
199
|
+
clear() {
|
|
200
|
+
this.providers.clear();
|
|
201
|
+
this.initializedProviders.clear();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
exports.ProviderManager = ProviderManager;
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { ProviderType } from '../types';
|
|
2
|
+
import { UserIdentity } from '../utils/user-mapping';
|
|
3
|
+
import type { SuiteResult } from '../types';
|
|
4
|
+
/**
|
|
5
|
+
* User registration data
|
|
6
|
+
*/
|
|
7
|
+
export interface UserRegistration {
|
|
8
|
+
provider: ProviderType;
|
|
9
|
+
platformUserId: string;
|
|
10
|
+
displayName?: string;
|
|
11
|
+
email?: string;
|
|
12
|
+
metadata?: Record<string, unknown>;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Manages users across all chat providers
|
|
16
|
+
*/
|
|
17
|
+
export declare class UserManager {
|
|
18
|
+
private mapper;
|
|
19
|
+
constructor();
|
|
20
|
+
/**
|
|
21
|
+
* Register a new user or update existing user
|
|
22
|
+
*/
|
|
23
|
+
registerUser(registration: UserRegistration): SuiteResult<UserIdentity>;
|
|
24
|
+
/**
|
|
25
|
+
* Link a platform account to an existing user
|
|
26
|
+
*/
|
|
27
|
+
linkPlatform(unifiedId: string, provider: ProviderType, platformUserId: string): SuiteResult<UserIdentity>;
|
|
28
|
+
/**
|
|
29
|
+
* Get unified user ID from platform-specific ID
|
|
30
|
+
*/
|
|
31
|
+
getUnifiedId(provider: ProviderType, platformUserId: string): string | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Get platform-specific user ID
|
|
34
|
+
*/
|
|
35
|
+
getPlatformId(unifiedId: string, provider: ProviderType): string | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Get complete user identity
|
|
38
|
+
*/
|
|
39
|
+
getUser(unifiedId: string): SuiteResult<UserIdentity>;
|
|
40
|
+
/**
|
|
41
|
+
* Get all users
|
|
42
|
+
*/
|
|
43
|
+
getAllUsers(): UserIdentity[];
|
|
44
|
+
/**
|
|
45
|
+
* Remove a user
|
|
46
|
+
*/
|
|
47
|
+
removeUser(unifiedId: string): SuiteResult<void>;
|
|
48
|
+
/**
|
|
49
|
+
* Get user count
|
|
50
|
+
*/
|
|
51
|
+
getUserCount(): number;
|
|
52
|
+
/**
|
|
53
|
+
* Search users by display name or email
|
|
54
|
+
*/
|
|
55
|
+
searchUsers(query: string): UserIdentity[];
|
|
56
|
+
/**
|
|
57
|
+
* Clear all users
|
|
58
|
+
*/
|
|
59
|
+
clear(): void;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=UserManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserManager.d.ts","sourceRoot":"","sources":["../../src/services/UserManager.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAc,YAAY,EAAmB,MAAM,uBAAuB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,YAAY,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED;;GAEG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAa;;IAM3B;;OAEG;IACI,YAAY,CAAC,YAAY,EAAE,gBAAgB,GAAG,WAAW,CAAC,YAAY,CAAC;IAgD9E;;OAEG;IACI,YAAY,CACjB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,YAAY,EACtB,cAAc,EAAE,MAAM,GACrB,WAAW,CAAC,YAAY,CAAC;IAiB5B;;OAEG;IACI,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvF;;OAEG;IACI,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS;IAInF;;OAEG;IACI,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC;IAQ5D;;OAEG;IACI,WAAW,IAAI,YAAY,EAAE;IAIpC;;OAEG;IACI,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC;IAQvD;;OAEG;IACI,YAAY,IAAI,MAAM;IAI7B;;OAEG;IACI,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE;IAQjD;;OAEG;IACI,KAAK,IAAI,IAAI;CAGrB"}
|