@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.
Files changed (105) hide show
  1. package/.eslintrc.js +26 -0
  2. package/README.md +542 -0
  3. package/__tests__/integration/ChatSuite.test.ts +235 -0
  4. package/__tests__/unit/ConfigManager.test.ts +122 -0
  5. package/__tests__/unit/MessageOrchestrator.test.ts +223 -0
  6. package/__tests__/unit/UserManager.test.ts +208 -0
  7. package/dist/ChatSuite.d.ts +76 -0
  8. package/dist/ChatSuite.d.ts.map +1 -0
  9. package/dist/ChatSuite.js +273 -0
  10. package/dist/index.d.ts +7 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +37 -0
  13. package/dist/neverhub/discovery.d.ts +40 -0
  14. package/dist/neverhub/discovery.d.ts.map +1 -0
  15. package/dist/neverhub/discovery.js +106 -0
  16. package/dist/neverhub/event-handlers.d.ts +38 -0
  17. package/dist/neverhub/event-handlers.d.ts.map +1 -0
  18. package/dist/neverhub/event-handlers.js +125 -0
  19. package/dist/neverhub/index.d.ts +4 -0
  20. package/dist/neverhub/index.d.ts.map +1 -0
  21. package/dist/neverhub/index.js +26 -0
  22. package/dist/neverhub/service-registration.d.ts +29 -0
  23. package/dist/neverhub/service-registration.d.ts.map +1 -0
  24. package/dist/neverhub/service-registration.js +66 -0
  25. package/dist/providers/ChatKitProvider.d.ts +53 -0
  26. package/dist/providers/ChatKitProvider.d.ts.map +1 -0
  27. package/dist/providers/ChatKitProvider.js +167 -0
  28. package/dist/providers/ExternalProviders.d.ts +101 -0
  29. package/dist/providers/ExternalProviders.d.ts.map +1 -0
  30. package/dist/providers/ExternalProviders.js +153 -0
  31. package/dist/providers/index.d.ts +3 -0
  32. package/dist/providers/index.d.ts.map +1 -0
  33. package/dist/providers/index.js +25 -0
  34. package/dist/services/ConfigManager.d.ts +50 -0
  35. package/dist/services/ConfigManager.d.ts.map +1 -0
  36. package/dist/services/ConfigManager.js +95 -0
  37. package/dist/services/HealthMonitor.d.ts +58 -0
  38. package/dist/services/HealthMonitor.d.ts.map +1 -0
  39. package/dist/services/HealthMonitor.js +148 -0
  40. package/dist/services/MessageOrchestrator.d.ts +63 -0
  41. package/dist/services/MessageOrchestrator.d.ts.map +1 -0
  42. package/dist/services/MessageOrchestrator.js +212 -0
  43. package/dist/services/ProviderManager.d.ts +83 -0
  44. package/dist/services/ProviderManager.d.ts.map +1 -0
  45. package/dist/services/ProviderManager.js +204 -0
  46. package/dist/services/UserManager.d.ts +61 -0
  47. package/dist/services/UserManager.d.ts.map +1 -0
  48. package/dist/services/UserManager.js +141 -0
  49. package/dist/services/index.d.ts +6 -0
  50. package/dist/services/index.d.ts.map +1 -0
  51. package/dist/services/index.js +28 -0
  52. package/dist/types/index.d.ts +4 -0
  53. package/dist/types/index.d.ts.map +1 -0
  54. package/dist/types/index.js +26 -0
  55. package/dist/types/message-types.d.ts +80 -0
  56. package/dist/types/message-types.d.ts.map +1 -0
  57. package/dist/types/message-types.js +32 -0
  58. package/dist/types/provider-types.d.ts +96 -0
  59. package/dist/types/provider-types.d.ts.map +1 -0
  60. package/dist/types/provider-types.js +9 -0
  61. package/dist/types/suite-types.d.ts +101 -0
  62. package/dist/types/suite-types.d.ts.map +1 -0
  63. package/dist/types/suite-types.js +9 -0
  64. package/dist/utils/config-inheritance.d.ts +24 -0
  65. package/dist/utils/config-inheritance.d.ts.map +1 -0
  66. package/dist/utils/config-inheritance.js +167 -0
  67. package/dist/utils/error-handling.d.ts +37 -0
  68. package/dist/utils/error-handling.d.ts.map +1 -0
  69. package/dist/utils/error-handling.js +102 -0
  70. package/dist/utils/index.d.ts +5 -0
  71. package/dist/utils/index.d.ts.map +1 -0
  72. package/dist/utils/index.js +27 -0
  73. package/dist/utils/message-bridge.d.ts +68 -0
  74. package/dist/utils/message-bridge.d.ts.map +1 -0
  75. package/dist/utils/message-bridge.js +126 -0
  76. package/dist/utils/user-mapping.d.ts +63 -0
  77. package/dist/utils/user-mapping.d.ts.map +1 -0
  78. package/dist/utils/user-mapping.js +110 -0
  79. package/jest.config.cjs +30 -0
  80. package/package.json +67 -0
  81. package/src/ChatSuite.ts +347 -0
  82. package/src/index.ts +25 -0
  83. package/src/neverhub/discovery.ts +137 -0
  84. package/src/neverhub/event-handlers.ts +141 -0
  85. package/src/neverhub/index.ts +11 -0
  86. package/src/neverhub/service-registration.ts +89 -0
  87. package/src/providers/ChatKitProvider.ts +193 -0
  88. package/src/providers/ExternalProviders.ts +171 -0
  89. package/src/providers/index.ts +10 -0
  90. package/src/services/ConfigManager.ts +112 -0
  91. package/src/services/HealthMonitor.ts +169 -0
  92. package/src/services/MessageOrchestrator.ts +271 -0
  93. package/src/services/ProviderManager.ts +247 -0
  94. package/src/services/UserManager.ts +176 -0
  95. package/src/services/index.ts +13 -0
  96. package/src/types/index.ts +11 -0
  97. package/src/types/message-types.ts +94 -0
  98. package/src/types/provider-types.ts +116 -0
  99. package/src/types/suite-types.ts +117 -0
  100. package/src/utils/config-inheritance.ts +189 -0
  101. package/src/utils/error-handling.ts +114 -0
  102. package/src/utils/index.ts +12 -0
  103. package/src/utils/message-bridge.ts +164 -0
  104. package/src/utils/user-mapping.ts +132 -0
  105. 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"}