@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,208 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright (c) 2025 Bernier LLC
|
|
3
|
+
|
|
4
|
+
This file is licensed to the client under a limited-use license.
|
|
5
|
+
The client may use and modify this code *only within the scope of the project it was delivered for*.
|
|
6
|
+
Redistribution or use in other products or commercial offerings is not permitted without written consent from Bernier LLC.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { UserManager } from '../../src/services/UserManager';
|
|
10
|
+
|
|
11
|
+
describe('UserManager', () => {
|
|
12
|
+
let manager: UserManager;
|
|
13
|
+
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
manager = new UserManager();
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
describe('user registration', () => {
|
|
19
|
+
it('should register a new user', () => {
|
|
20
|
+
const result = manager.registerUser({
|
|
21
|
+
provider: 'chatkit',
|
|
22
|
+
platformUserId: 'user123',
|
|
23
|
+
displayName: 'Test User',
|
|
24
|
+
email: 'test@example.com'
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
expect(result.success).toBe(true);
|
|
28
|
+
expect(result.data?.displayName).toBe('Test User');
|
|
29
|
+
expect(result.data?.email).toBe('test@example.com');
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it('should update existing user', () => {
|
|
33
|
+
const first = manager.registerUser({
|
|
34
|
+
provider: 'chatkit',
|
|
35
|
+
platformUserId: 'user123',
|
|
36
|
+
displayName: 'First Name'
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const updated = manager.registerUser({
|
|
40
|
+
provider: 'chatkit',
|
|
41
|
+
platformUserId: 'user123',
|
|
42
|
+
displayName: 'Updated Name'
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
expect(updated.success).toBe(true);
|
|
46
|
+
expect(updated.data?.displayName).toBe('Updated Name');
|
|
47
|
+
expect(updated.data?.unifiedId).toBe(first.data?.unifiedId);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
describe('platform linking', () => {
|
|
52
|
+
it('should link platform to existing user', () => {
|
|
53
|
+
const registered = manager.registerUser({
|
|
54
|
+
provider: 'chatkit',
|
|
55
|
+
platformUserId: 'chatkit123'
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
const unifiedId = registered.data!.unifiedId;
|
|
59
|
+
|
|
60
|
+
const linked = manager.linkPlatform(unifiedId, 'slack', 'slack456');
|
|
61
|
+
|
|
62
|
+
expect(linked.success).toBe(true);
|
|
63
|
+
expect(linked.data?.platformIds.has('slack')).toBe(true);
|
|
64
|
+
expect(linked.data?.platformIds.get('slack')).toBe('slack456');
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
it('should fail to link to non-existent user', () => {
|
|
68
|
+
const result = manager.linkPlatform('invalid-id', 'slack', 'slack123');
|
|
69
|
+
|
|
70
|
+
expect(result.success).toBe(false);
|
|
71
|
+
expect(result.error).toBeDefined();
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
describe('user lookup', () => {
|
|
76
|
+
beforeEach(() => {
|
|
77
|
+
manager.registerUser({
|
|
78
|
+
provider: 'chatkit',
|
|
79
|
+
platformUserId: 'chatkit123',
|
|
80
|
+
displayName: 'Test User'
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('should get unified ID from platform ID', () => {
|
|
85
|
+
const unifiedId = manager.getUnifiedId('chatkit', 'chatkit123');
|
|
86
|
+
|
|
87
|
+
expect(unifiedId).toBeDefined();
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
it('should get platform ID from unified ID', () => {
|
|
91
|
+
const unifiedId = manager.getUnifiedId('chatkit', 'chatkit123')!;
|
|
92
|
+
const platformId = manager.getPlatformId(unifiedId, 'chatkit');
|
|
93
|
+
|
|
94
|
+
expect(platformId).toBe('chatkit123');
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it('should get user by unified ID', () => {
|
|
98
|
+
const unifiedId = manager.getUnifiedId('chatkit', 'chatkit123')!;
|
|
99
|
+
const result = manager.getUser(unifiedId);
|
|
100
|
+
|
|
101
|
+
expect(result.success).toBe(true);
|
|
102
|
+
expect(result.data?.displayName).toBe('Test User');
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it('should return error for non-existent user', () => {
|
|
106
|
+
const result = manager.getUser('invalid-id');
|
|
107
|
+
|
|
108
|
+
expect(result.success).toBe(false);
|
|
109
|
+
expect(result.error).toBeDefined();
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
describe('user search', () => {
|
|
114
|
+
beforeEach(() => {
|
|
115
|
+
manager.registerUser({
|
|
116
|
+
provider: 'chatkit',
|
|
117
|
+
platformUserId: 'user1',
|
|
118
|
+
displayName: 'Alice Smith',
|
|
119
|
+
email: 'alice@example.com'
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
manager.registerUser({
|
|
123
|
+
provider: 'chatkit',
|
|
124
|
+
platformUserId: 'user2',
|
|
125
|
+
displayName: 'Bob Jones',
|
|
126
|
+
email: 'bob@example.com'
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('should search users by display name', () => {
|
|
131
|
+
const results = manager.searchUsers('Alice');
|
|
132
|
+
|
|
133
|
+
expect(results).toHaveLength(1);
|
|
134
|
+
expect(results[0].displayName).toBe('Alice Smith');
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it('should search users by email', () => {
|
|
138
|
+
const results = manager.searchUsers('bob@example.com');
|
|
139
|
+
|
|
140
|
+
expect(results).toHaveLength(1);
|
|
141
|
+
expect(results[0].email).toBe('bob@example.com');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('should be case insensitive', () => {
|
|
145
|
+
const results = manager.searchUsers('alice');
|
|
146
|
+
|
|
147
|
+
expect(results).toHaveLength(1);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
describe('user removal', () => {
|
|
152
|
+
it('should remove a user', () => {
|
|
153
|
+
const registered = manager.registerUser({
|
|
154
|
+
provider: 'chatkit',
|
|
155
|
+
platformUserId: 'user123'
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
const unifiedId = registered.data!.unifiedId;
|
|
159
|
+
const result = manager.removeUser(unifiedId);
|
|
160
|
+
|
|
161
|
+
expect(result.success).toBe(true);
|
|
162
|
+
expect(manager.getUserCount()).toBe(0);
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('should fail to remove non-existent user', () => {
|
|
166
|
+
const result = manager.removeUser('invalid-id');
|
|
167
|
+
|
|
168
|
+
expect(result.success).toBe(false);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
describe('bulk operations', () => {
|
|
173
|
+
it('should get all users', () => {
|
|
174
|
+
manager.registerUser({
|
|
175
|
+
provider: 'chatkit',
|
|
176
|
+
platformUserId: 'user1'
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
manager.registerUser({
|
|
180
|
+
provider: 'chatkit',
|
|
181
|
+
platformUserId: 'user2'
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
const users = manager.getAllUsers();
|
|
185
|
+
expect(users).toHaveLength(2);
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
it('should get user count', () => {
|
|
189
|
+
manager.registerUser({
|
|
190
|
+
provider: 'chatkit',
|
|
191
|
+
platformUserId: 'user1'
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
expect(manager.getUserCount()).toBe(1);
|
|
195
|
+
});
|
|
196
|
+
|
|
197
|
+
it('should clear all users', () => {
|
|
198
|
+
manager.registerUser({
|
|
199
|
+
provider: 'chatkit',
|
|
200
|
+
platformUserId: 'user1'
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
manager.clear();
|
|
204
|
+
|
|
205
|
+
expect(manager.getUserCount()).toBe(0);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
});
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { ChatSuiteConfig, SuiteInitResult, ChatSuiteHealth, BroadcastConfig, ProviderMessage, ProviderMessageResult, SuiteResult, ProviderType } from './types';
|
|
2
|
+
import { ConfigManager } from './services/ConfigManager';
|
|
3
|
+
import { UserManager } from './services/UserManager';
|
|
4
|
+
import { ProviderManager } from './services/ProviderManager';
|
|
5
|
+
import { MessageOrchestrator } from './services/MessageOrchestrator';
|
|
6
|
+
/**
|
|
7
|
+
* Main chat suite orchestration class
|
|
8
|
+
*/
|
|
9
|
+
export declare class ChatSuite {
|
|
10
|
+
private configManager;
|
|
11
|
+
private userManager;
|
|
12
|
+
private healthMonitor;
|
|
13
|
+
private providerManager;
|
|
14
|
+
private messageOrchestrator;
|
|
15
|
+
private neverhubAdapter?;
|
|
16
|
+
private neverhubConnected;
|
|
17
|
+
private initialized;
|
|
18
|
+
constructor(config?: Partial<ChatSuiteConfig>);
|
|
19
|
+
/**
|
|
20
|
+
* Initialize the chat suite
|
|
21
|
+
*/
|
|
22
|
+
initialize(): Promise<SuiteInitResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Initialize NeverHub connection
|
|
25
|
+
*/
|
|
26
|
+
private initializeNeverHub;
|
|
27
|
+
/**
|
|
28
|
+
* Initialize ChatKit provider
|
|
29
|
+
*/
|
|
30
|
+
private initializeChatKitProvider;
|
|
31
|
+
/**
|
|
32
|
+
* Send a message through a specific provider
|
|
33
|
+
*/
|
|
34
|
+
sendMessage(providerType: ProviderType, message: ProviderMessage): Promise<SuiteResult<ProviderMessageResult>>;
|
|
35
|
+
/**
|
|
36
|
+
* Broadcast a message to multiple providers
|
|
37
|
+
*/
|
|
38
|
+
broadcastMessage(config: BroadcastConfig): Promise<SuiteResult<ProviderMessageResult[]>>;
|
|
39
|
+
/**
|
|
40
|
+
* Get health status
|
|
41
|
+
*/
|
|
42
|
+
getHealth(): Promise<ChatSuiteHealth>;
|
|
43
|
+
/**
|
|
44
|
+
* Get user manager
|
|
45
|
+
*/
|
|
46
|
+
getUserManager(): UserManager;
|
|
47
|
+
/**
|
|
48
|
+
* Get config manager
|
|
49
|
+
*/
|
|
50
|
+
getConfigManager(): ConfigManager;
|
|
51
|
+
/**
|
|
52
|
+
* Check if initialized
|
|
53
|
+
*/
|
|
54
|
+
isInitialized(): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Check if NeverHub is connected
|
|
57
|
+
*/
|
|
58
|
+
isNeverHubConnected(): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* Get provider manager
|
|
61
|
+
*/
|
|
62
|
+
getProviderManager(): ProviderManager;
|
|
63
|
+
/**
|
|
64
|
+
* Get message orchestrator
|
|
65
|
+
*/
|
|
66
|
+
getMessageOrchestrator(): MessageOrchestrator;
|
|
67
|
+
/**
|
|
68
|
+
* Shutdown the chat suite
|
|
69
|
+
*/
|
|
70
|
+
shutdown(): Promise<void>;
|
|
71
|
+
/**
|
|
72
|
+
* Get initialized provider types
|
|
73
|
+
*/
|
|
74
|
+
private getInitializedProviderTypes;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=ChatSuite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatSuite.d.ts","sourceRoot":"","sources":["../src/ChatSuite.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,eAAe,EACf,qBAAqB,EACrB,WAAW,EAEX,YAAY,EACb,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAcrE;;GAEG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,mBAAmB,CAAsB;IAEjD,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAQ7C;;OAEG;IACU,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC;IAyDnD;;OAEG;YACW,kBAAkB;IA+BhC;;OAEG;YACW,yBAAyB;IAsDvC;;OAEG;IACU,WAAW,CACtB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,WAAW,CAAC,qBAAqB,CAAC,CAAC;IAgC9C;;OAEG;IACU,gBAAgB,CAC3B,MAAM,EAAE,eAAe,GACtB,OAAO,CAAC,WAAW,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAoBhD;;OAEG;IACU,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAIlD;;OAEG;IACI,cAAc,IAAI,WAAW;IAIpC;;OAEG;IACI,gBAAgB,IAAI,aAAa;IAIxC;;OAEG;IACI,aAAa,IAAI,OAAO;IAI/B;;OAEG;IACI,mBAAmB,IAAI,OAAO;IAIrC;;OAEG;IACI,kBAAkB,IAAI,eAAe;IAI5C;;OAEG;IACI,sBAAsB,IAAI,mBAAmB;IAIpD;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAYtC;;OAEG;IACH,OAAO,CAAC,2BAA2B;CAKpC"}
|
|
@@ -0,0 +1,273 @@
|
|
|
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.ChatSuite = void 0;
|
|
11
|
+
const neverhub_adapter_1 = require("@bernierllc/neverhub-adapter");
|
|
12
|
+
const ConfigManager_1 = require("./services/ConfigManager");
|
|
13
|
+
const UserManager_1 = require("./services/UserManager");
|
|
14
|
+
const HealthMonitor_1 = require("./services/HealthMonitor");
|
|
15
|
+
const ProviderManager_1 = require("./services/ProviderManager");
|
|
16
|
+
const MessageOrchestrator_1 = require("./services/MessageOrchestrator");
|
|
17
|
+
const ChatKitProvider_1 = require("./providers/ChatKitProvider");
|
|
18
|
+
const message_bridge_1 = require("./utils/message-bridge");
|
|
19
|
+
const error_handling_1 = require("./utils/error-handling");
|
|
20
|
+
const neverhub_1 = require("./neverhub");
|
|
21
|
+
/**
|
|
22
|
+
* Main chat suite orchestration class
|
|
23
|
+
*/
|
|
24
|
+
class ChatSuite {
|
|
25
|
+
constructor(config) {
|
|
26
|
+
this.neverhubConnected = false;
|
|
27
|
+
this.initialized = false;
|
|
28
|
+
this.configManager = new ConfigManager_1.ConfigManager(config);
|
|
29
|
+
this.userManager = new UserManager_1.UserManager();
|
|
30
|
+
this.healthMonitor = new HealthMonitor_1.HealthMonitor();
|
|
31
|
+
this.providerManager = new ProviderManager_1.ProviderManager();
|
|
32
|
+
this.messageOrchestrator = new MessageOrchestrator_1.MessageOrchestrator();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Initialize the chat suite
|
|
36
|
+
*/
|
|
37
|
+
async initialize() {
|
|
38
|
+
try {
|
|
39
|
+
const config = this.configManager.getConfig();
|
|
40
|
+
// 1. Initialize NeverHub (if enabled)
|
|
41
|
+
if (config.neverhub?.enabled) {
|
|
42
|
+
await this.initializeNeverHub();
|
|
43
|
+
}
|
|
44
|
+
// 2. Initialize ChatKit provider (always required)
|
|
45
|
+
const chatKitResult = await this.initializeChatKitProvider(config);
|
|
46
|
+
if (!chatKitResult.success) {
|
|
47
|
+
throw new error_handling_1.ChatSuiteError(error_handling_1.ChatSuiteErrorType.INITIALIZATION_ERROR, `Failed to initialize ChatKit: ${chatKitResult.error}`);
|
|
48
|
+
}
|
|
49
|
+
// 3. Initialize message bridge (if configured)
|
|
50
|
+
if (config.messageBridge) {
|
|
51
|
+
const bridge = new message_bridge_1.MessageBridge(config.messageBridge);
|
|
52
|
+
this.messageOrchestrator.setMessageBridge(bridge);
|
|
53
|
+
}
|
|
54
|
+
// 4. Start health monitoring
|
|
55
|
+
this.healthMonitor.startMonitoring(60000);
|
|
56
|
+
// 5. Update NeverHub health status
|
|
57
|
+
if (this.neverhubConnected && this.neverhubAdapter) {
|
|
58
|
+
await (0, neverhub_1.updateHealthStatus)(this.neverhubAdapter, 'healthy', {
|
|
59
|
+
providersInitialized: this.providerManager.getProviderCount().initialized
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
this.initialized = true;
|
|
63
|
+
return {
|
|
64
|
+
success: true,
|
|
65
|
+
providersInitialized: this.getInitializedProviderTypes(),
|
|
66
|
+
providersFailed: [],
|
|
67
|
+
aiRoutingEnabled: config.aiRouting?.enabled || false,
|
|
68
|
+
analyticsEnabled: config.analytics?.enabled || false,
|
|
69
|
+
neverhubConnected: this.neverhubConnected
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
return {
|
|
74
|
+
success: false,
|
|
75
|
+
providersInitialized: [],
|
|
76
|
+
providersFailed: ['chatkit'],
|
|
77
|
+
aiRoutingEnabled: false,
|
|
78
|
+
analyticsEnabled: false,
|
|
79
|
+
neverhubConnected: false,
|
|
80
|
+
error: error instanceof Error ? error.message : 'Initialization failed'
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Initialize NeverHub connection
|
|
86
|
+
*/
|
|
87
|
+
async initializeNeverHub() {
|
|
88
|
+
try {
|
|
89
|
+
const detected = await neverhub_adapter_1.NeverHubAdapter.detect();
|
|
90
|
+
if (!detected) {
|
|
91
|
+
console.log('⚠️ NeverHub not available - running without service discovery');
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
this.neverhubAdapter = new neverhub_adapter_1.NeverHubAdapter();
|
|
95
|
+
const config = this.configManager.getConfig();
|
|
96
|
+
if (config.neverhub) {
|
|
97
|
+
const registered = await (0, neverhub_1.registerWithNeverHub)(this.neverhubAdapter, config.neverhub);
|
|
98
|
+
if (registered) {
|
|
99
|
+
this.neverhubConnected = true;
|
|
100
|
+
// Discover available services
|
|
101
|
+
const discovered = await (0, neverhub_1.discoverAllChatServices)(this.neverhubAdapter);
|
|
102
|
+
console.log(`✅ Discovered services:`, {
|
|
103
|
+
providers: discovered.providers.length,
|
|
104
|
+
aiRouter: !!discovered.aiRouter,
|
|
105
|
+
analytics: !!discovered.analytics
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
console.error('❌ NeverHub initialization failed (continuing without):', error);
|
|
112
|
+
this.neverhubConnected = false;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Initialize ChatKit provider
|
|
117
|
+
*/
|
|
118
|
+
async initializeChatKitProvider(config) {
|
|
119
|
+
try {
|
|
120
|
+
const chatKitConfig = config.providers.chatkit;
|
|
121
|
+
if (!chatKitConfig || !chatKitConfig.enabled) {
|
|
122
|
+
return {
|
|
123
|
+
success: false,
|
|
124
|
+
error: 'ChatKit provider is not enabled in configuration'
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
const provider = new ChatKitProvider_1.ChatKitProvider({
|
|
128
|
+
serviceName: chatKitConfig.config.serviceName,
|
|
129
|
+
features: chatKitConfig.config.features,
|
|
130
|
+
config: chatKitConfig.config
|
|
131
|
+
});
|
|
132
|
+
// Register provider
|
|
133
|
+
const registerResult = this.providerManager.registerProvider({
|
|
134
|
+
provider,
|
|
135
|
+
priority: chatKitConfig.priority,
|
|
136
|
+
enabled: chatKitConfig.enabled
|
|
137
|
+
});
|
|
138
|
+
if (!registerResult.success) {
|
|
139
|
+
return registerResult;
|
|
140
|
+
}
|
|
141
|
+
// Initialize provider
|
|
142
|
+
const initResult = await this.providerManager.initializeProvider('chatkit');
|
|
143
|
+
if (!initResult.success) {
|
|
144
|
+
return initResult;
|
|
145
|
+
}
|
|
146
|
+
// Register with health monitor
|
|
147
|
+
this.healthMonitor.registerProvider(provider);
|
|
148
|
+
// Publish provider initialized event
|
|
149
|
+
if (this.neverhubConnected && this.neverhubAdapter) {
|
|
150
|
+
await (0, neverhub_1.publishProviderEvent)(this.neverhubAdapter, neverhub_1.ChatSuiteEventType.PROVIDER_INITIALIZED, 'chatkit');
|
|
151
|
+
}
|
|
152
|
+
return { success: true };
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
return {
|
|
156
|
+
success: false,
|
|
157
|
+
error: error instanceof Error ? error.message : 'Failed to initialize ChatKit'
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Send a message through a specific provider
|
|
163
|
+
*/
|
|
164
|
+
async sendMessage(providerType, message) {
|
|
165
|
+
if (!this.initialized) {
|
|
166
|
+
return {
|
|
167
|
+
success: false,
|
|
168
|
+
error: 'Chat suite is not initialized'
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
const provider = this.providerManager.getProvider(providerType);
|
|
172
|
+
if (!provider) {
|
|
173
|
+
return {
|
|
174
|
+
success: false,
|
|
175
|
+
error: `Provider ${providerType} not found`
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
const result = await this.messageOrchestrator.sendMessage(provider, message);
|
|
179
|
+
// Publish message event
|
|
180
|
+
if (this.neverhubConnected && this.neverhubAdapter && result.success && result.data) {
|
|
181
|
+
await (0, neverhub_1.publishMessageEvent)(this.neverhubAdapter, {
|
|
182
|
+
type: 'message.sent',
|
|
183
|
+
messageId: result.data.messageId || 'unknown',
|
|
184
|
+
provider: providerType,
|
|
185
|
+
timestamp: new Date(),
|
|
186
|
+
data: { content: message.content }
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
return result;
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Broadcast a message to multiple providers
|
|
193
|
+
*/
|
|
194
|
+
async broadcastMessage(config) {
|
|
195
|
+
if (!this.initialized) {
|
|
196
|
+
return {
|
|
197
|
+
success: false,
|
|
198
|
+
error: 'Chat suite is not initialized'
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
const providers = new Map();
|
|
202
|
+
for (const type of config.platforms) {
|
|
203
|
+
const provider = this.providerManager.getProvider(type);
|
|
204
|
+
if (provider && this.providerManager.isInitialized(type)) {
|
|
205
|
+
providers.set(type, provider);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
return this.messageOrchestrator.broadcastMessage(providers, config);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Get health status
|
|
212
|
+
*/
|
|
213
|
+
async getHealth() {
|
|
214
|
+
return this.healthMonitor.checkHealth();
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Get user manager
|
|
218
|
+
*/
|
|
219
|
+
getUserManager() {
|
|
220
|
+
return this.userManager;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Get config manager
|
|
224
|
+
*/
|
|
225
|
+
getConfigManager() {
|
|
226
|
+
return this.configManager;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Check if initialized
|
|
230
|
+
*/
|
|
231
|
+
isInitialized() {
|
|
232
|
+
return this.initialized;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Check if NeverHub is connected
|
|
236
|
+
*/
|
|
237
|
+
isNeverHubConnected() {
|
|
238
|
+
return this.neverhubConnected;
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Get provider manager
|
|
242
|
+
*/
|
|
243
|
+
getProviderManager() {
|
|
244
|
+
return this.providerManager;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Get message orchestrator
|
|
248
|
+
*/
|
|
249
|
+
getMessageOrchestrator() {
|
|
250
|
+
return this.messageOrchestrator;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Shutdown the chat suite
|
|
254
|
+
*/
|
|
255
|
+
async shutdown() {
|
|
256
|
+
this.healthMonitor.stopMonitoring();
|
|
257
|
+
await this.providerManager.shutdownAll();
|
|
258
|
+
if (this.neverhubConnected && this.neverhubAdapter) {
|
|
259
|
+
await (0, neverhub_1.unregisterFromNeverHub)(this.neverhubAdapter);
|
|
260
|
+
}
|
|
261
|
+
this.initialized = false;
|
|
262
|
+
this.neverhubConnected = false;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get initialized provider types
|
|
266
|
+
*/
|
|
267
|
+
getInitializedProviderTypes() {
|
|
268
|
+
return this.providerManager
|
|
269
|
+
.getInitializedProviders()
|
|
270
|
+
.map(p => p.type);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
exports.ChatSuite = ChatSuite;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGxC,cAAc,SAAS,CAAC;AAGxB,cAAc,YAAY,CAAC;AAG3B,cAAc,aAAa,CAAC;AAG5B,cAAc,SAAS,CAAC;AAGxB,cAAc,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
21
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
22
|
+
};
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.ChatSuite = void 0;
|
|
25
|
+
// Main export
|
|
26
|
+
var ChatSuite_1 = require("./ChatSuite");
|
|
27
|
+
Object.defineProperty(exports, "ChatSuite", { enumerable: true, get: function () { return ChatSuite_1.ChatSuite; } });
|
|
28
|
+
// Types
|
|
29
|
+
__exportStar(require("./types"), exports);
|
|
30
|
+
// Services
|
|
31
|
+
__exportStar(require("./services"), exports);
|
|
32
|
+
// Providers
|
|
33
|
+
__exportStar(require("./providers"), exports);
|
|
34
|
+
// Utilities
|
|
35
|
+
__exportStar(require("./utils"), exports);
|
|
36
|
+
// NeverHub integration
|
|
37
|
+
__exportStar(require("./neverhub"), exports);
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { NeverHubAdapter } from '@bernierllc/neverhub-adapter';
|
|
2
|
+
/**
|
|
3
|
+
* Discovered service information
|
|
4
|
+
*/
|
|
5
|
+
export interface DiscoveredService {
|
|
6
|
+
name: string;
|
|
7
|
+
type: string;
|
|
8
|
+
version: string;
|
|
9
|
+
capabilities: Array<{
|
|
10
|
+
type: string;
|
|
11
|
+
name: string;
|
|
12
|
+
version: string;
|
|
13
|
+
}>;
|
|
14
|
+
endpoint?: string;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Discover chat providers through NeverHub
|
|
18
|
+
*/
|
|
19
|
+
export declare function discoverProviders(adapter: NeverHubAdapter): Promise<DiscoveredService[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Discover AI routing service
|
|
22
|
+
*/
|
|
23
|
+
export declare function discoverAIRouter(adapter: NeverHubAdapter): Promise<DiscoveredService | undefined>;
|
|
24
|
+
/**
|
|
25
|
+
* Discover analytics service
|
|
26
|
+
*/
|
|
27
|
+
export declare function discoverAnalytics(adapter: NeverHubAdapter): Promise<DiscoveredService | undefined>;
|
|
28
|
+
/**
|
|
29
|
+
* Discover all chat-related services
|
|
30
|
+
*/
|
|
31
|
+
export declare function discoverAllChatServices(adapter: NeverHubAdapter): Promise<{
|
|
32
|
+
providers: DiscoveredService[];
|
|
33
|
+
aiRouter?: DiscoveredService;
|
|
34
|
+
analytics?: DiscoveredService;
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Get service by name
|
|
38
|
+
*/
|
|
39
|
+
export declare function getService(adapter: NeverHubAdapter, serviceName: string): Promise<DiscoveredService | undefined>;
|
|
40
|
+
//# sourceMappingURL=discovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/neverhub/discovery.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAE/D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAY9B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAiBxC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAiBxC;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC;IACT,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B,CAAC,CAYD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAaxC"}
|