@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,101 @@
|
|
|
1
|
+
import type { Provider, ProviderMessage, ProviderMessageResult, ProviderHealth } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Base class for external providers (Slack, Discord, Teams)
|
|
4
|
+
* These are optional peer dependencies and will be implemented when those packages are available
|
|
5
|
+
*/
|
|
6
|
+
declare abstract class ExternalProvider implements Provider {
|
|
7
|
+
abstract readonly type: 'slack' | 'discord' | 'teams';
|
|
8
|
+
abstract readonly name: string;
|
|
9
|
+
protected initialized: boolean;
|
|
10
|
+
initialize(): Promise<void>;
|
|
11
|
+
isInitialized(): boolean;
|
|
12
|
+
sendMessage(_message: ProviderMessage): Promise<ProviderMessageResult>;
|
|
13
|
+
getHealth(): Promise<ProviderHealth>;
|
|
14
|
+
shutdown(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Slack provider placeholder
|
|
18
|
+
*
|
|
19
|
+
* To enable Slack integration:
|
|
20
|
+
* 1. Install @bernierllc/chat-integration-slack
|
|
21
|
+
* 2. Import SlackProvider from that package
|
|
22
|
+
* 3. Register with the chat suite
|
|
23
|
+
*
|
|
24
|
+
* Example:
|
|
25
|
+
* ```typescript
|
|
26
|
+
* import { SlackProvider } from '@bernierllc/chat-integration-slack';
|
|
27
|
+
*
|
|
28
|
+
* const slackProvider = new SlackProvider({
|
|
29
|
+
* token: process.env.SLACK_BOT_TOKEN,
|
|
30
|
+
* channels: ['#general', '#dev']
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* await chatSuite.registerProvider(slackProvider);
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export declare class SlackProvider extends ExternalProvider {
|
|
37
|
+
readonly type: "slack";
|
|
38
|
+
readonly name = "@bernierllc/chat-integration-slack";
|
|
39
|
+
constructor(_config?: Record<string, unknown>);
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Discord provider placeholder
|
|
43
|
+
*
|
|
44
|
+
* To enable Discord integration:
|
|
45
|
+
* 1. Install @bernierllc/chat-integration-discord
|
|
46
|
+
* 2. Import DiscordProvider from that package
|
|
47
|
+
* 3. Register with the chat suite
|
|
48
|
+
*
|
|
49
|
+
* Example:
|
|
50
|
+
* ```typescript
|
|
51
|
+
* import { DiscordProvider } from '@bernierllc/chat-integration-discord';
|
|
52
|
+
*
|
|
53
|
+
* const discordProvider = new DiscordProvider({
|
|
54
|
+
* token: process.env.DISCORD_BOT_TOKEN,
|
|
55
|
+
* guilds: ['123456789012345678']
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* await chatSuite.registerProvider(discordProvider);
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export declare class DiscordProvider extends ExternalProvider {
|
|
62
|
+
readonly type: "discord";
|
|
63
|
+
readonly name = "@bernierllc/chat-integration-discord";
|
|
64
|
+
constructor(_config?: Record<string, unknown>);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Microsoft Teams provider placeholder
|
|
68
|
+
*
|
|
69
|
+
* To enable Teams integration:
|
|
70
|
+
* 1. Install @bernierllc/chat-integration-teams
|
|
71
|
+
* 2. Import TeamsProvider from that package
|
|
72
|
+
* 3. Register with the chat suite
|
|
73
|
+
*
|
|
74
|
+
* Example:
|
|
75
|
+
* ```typescript
|
|
76
|
+
* import { TeamsProvider } from '@bernierllc/chat-integration-teams';
|
|
77
|
+
*
|
|
78
|
+
* const teamsProvider = new TeamsProvider({
|
|
79
|
+
* tenantId: process.env.TEAMS_TENANT_ID,
|
|
80
|
+
* clientId: process.env.TEAMS_CLIENT_ID,
|
|
81
|
+
* clientSecret: process.env.TEAMS_CLIENT_SECRET
|
|
82
|
+
* });
|
|
83
|
+
*
|
|
84
|
+
* await chatSuite.registerProvider(teamsProvider);
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare class TeamsProvider extends ExternalProvider {
|
|
88
|
+
readonly type: "teams";
|
|
89
|
+
readonly name = "@bernierllc/chat-integration-teams";
|
|
90
|
+
constructor(_config?: Record<string, unknown>);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Check if an external provider package is available
|
|
94
|
+
*/
|
|
95
|
+
export declare function isProviderAvailable(providerName: string): boolean;
|
|
96
|
+
/**
|
|
97
|
+
* Get list of available external providers
|
|
98
|
+
*/
|
|
99
|
+
export declare function getAvailableProviders(): string[];
|
|
100
|
+
export {};
|
|
101
|
+
//# sourceMappingURL=ExternalProviders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExternalProviders.d.ts","sourceRoot":"","sources":["../../src/providers/ExternalProviders.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACV,QAAQ,EACR,eAAe,EACf,qBAAqB,EACrB,cAAc,EACf,MAAM,UAAU,CAAC;AAElB;;;GAGG;AACH,uBAAe,gBAAiB,YAAW,QAAQ;IACjD,kBAAyB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC;IAC7D,kBAAyB,IAAI,EAAE,MAAM,CAAC;IAEtC,SAAS,CAAC,WAAW,UAAS;IAEjB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC,aAAa,IAAI,OAAO;IAIlB,WAAW,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAOtE,SAAS,IAAI,OAAO,CAAC,cAAc,CAAC;IAWpC,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAGvC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,aAAc,SAAQ,gBAAgB;IACjD,SAAgB,IAAI,EAAG,OAAO,CAAU;IACxC,SAAgB,IAAI,wCAAwC;gBAEhD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG9C;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,eAAgB,SAAQ,gBAAgB;IACnD,SAAgB,IAAI,EAAG,SAAS,CAAU;IAC1C,SAAgB,IAAI,0CAA0C;gBAElD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG9C;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,aAAc,SAAQ,gBAAgB;IACjD,SAAgB,IAAI,EAAG,OAAO,CAAU;IACxC,SAAgB,IAAI,wCAAwC;gBAEhD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAG9C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAOjE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAQhD"}
|
|
@@ -0,0 +1,153 @@
|
|
|
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.TeamsProvider = exports.DiscordProvider = exports.SlackProvider = void 0;
|
|
11
|
+
exports.isProviderAvailable = isProviderAvailable;
|
|
12
|
+
exports.getAvailableProviders = getAvailableProviders;
|
|
13
|
+
/**
|
|
14
|
+
* Base class for external providers (Slack, Discord, Teams)
|
|
15
|
+
* These are optional peer dependencies and will be implemented when those packages are available
|
|
16
|
+
*/
|
|
17
|
+
class ExternalProvider {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.initialized = false;
|
|
20
|
+
}
|
|
21
|
+
async initialize() {
|
|
22
|
+
throw new Error(`${this.name} provider is not implemented yet. ` +
|
|
23
|
+
`Install ${this.name} package to enable this provider.`);
|
|
24
|
+
}
|
|
25
|
+
isInitialized() {
|
|
26
|
+
return this.initialized;
|
|
27
|
+
}
|
|
28
|
+
async sendMessage(_message) {
|
|
29
|
+
throw new Error(`${this.name} provider is not available. ` +
|
|
30
|
+
`Install ${this.name} package to send messages.`);
|
|
31
|
+
}
|
|
32
|
+
async getHealth() {
|
|
33
|
+
return {
|
|
34
|
+
status: 'unknown',
|
|
35
|
+
lastCheck: new Date(),
|
|
36
|
+
errorCount: 0,
|
|
37
|
+
details: {
|
|
38
|
+
error: `${this.name} provider not installed`
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
async shutdown() {
|
|
43
|
+
this.initialized = false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Slack provider placeholder
|
|
48
|
+
*
|
|
49
|
+
* To enable Slack integration:
|
|
50
|
+
* 1. Install @bernierllc/chat-integration-slack
|
|
51
|
+
* 2. Import SlackProvider from that package
|
|
52
|
+
* 3. Register with the chat suite
|
|
53
|
+
*
|
|
54
|
+
* Example:
|
|
55
|
+
* ```typescript
|
|
56
|
+
* import { SlackProvider } from '@bernierllc/chat-integration-slack';
|
|
57
|
+
*
|
|
58
|
+
* const slackProvider = new SlackProvider({
|
|
59
|
+
* token: process.env.SLACK_BOT_TOKEN,
|
|
60
|
+
* channels: ['#general', '#dev']
|
|
61
|
+
* });
|
|
62
|
+
*
|
|
63
|
+
* await chatSuite.registerProvider(slackProvider);
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
class SlackProvider extends ExternalProvider {
|
|
67
|
+
constructor(_config) {
|
|
68
|
+
super();
|
|
69
|
+
this.type = 'slack';
|
|
70
|
+
this.name = '@bernierllc/chat-integration-slack';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
exports.SlackProvider = SlackProvider;
|
|
74
|
+
/**
|
|
75
|
+
* Discord provider placeholder
|
|
76
|
+
*
|
|
77
|
+
* To enable Discord integration:
|
|
78
|
+
* 1. Install @bernierllc/chat-integration-discord
|
|
79
|
+
* 2. Import DiscordProvider from that package
|
|
80
|
+
* 3. Register with the chat suite
|
|
81
|
+
*
|
|
82
|
+
* Example:
|
|
83
|
+
* ```typescript
|
|
84
|
+
* import { DiscordProvider } from '@bernierllc/chat-integration-discord';
|
|
85
|
+
*
|
|
86
|
+
* const discordProvider = new DiscordProvider({
|
|
87
|
+
* token: process.env.DISCORD_BOT_TOKEN,
|
|
88
|
+
* guilds: ['123456789012345678']
|
|
89
|
+
* });
|
|
90
|
+
*
|
|
91
|
+
* await chatSuite.registerProvider(discordProvider);
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
class DiscordProvider extends ExternalProvider {
|
|
95
|
+
constructor(_config) {
|
|
96
|
+
super();
|
|
97
|
+
this.type = 'discord';
|
|
98
|
+
this.name = '@bernierllc/chat-integration-discord';
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
exports.DiscordProvider = DiscordProvider;
|
|
102
|
+
/**
|
|
103
|
+
* Microsoft Teams provider placeholder
|
|
104
|
+
*
|
|
105
|
+
* To enable Teams integration:
|
|
106
|
+
* 1. Install @bernierllc/chat-integration-teams
|
|
107
|
+
* 2. Import TeamsProvider from that package
|
|
108
|
+
* 3. Register with the chat suite
|
|
109
|
+
*
|
|
110
|
+
* Example:
|
|
111
|
+
* ```typescript
|
|
112
|
+
* import { TeamsProvider } from '@bernierllc/chat-integration-teams';
|
|
113
|
+
*
|
|
114
|
+
* const teamsProvider = new TeamsProvider({
|
|
115
|
+
* tenantId: process.env.TEAMS_TENANT_ID,
|
|
116
|
+
* clientId: process.env.TEAMS_CLIENT_ID,
|
|
117
|
+
* clientSecret: process.env.TEAMS_CLIENT_SECRET
|
|
118
|
+
* });
|
|
119
|
+
*
|
|
120
|
+
* await chatSuite.registerProvider(teamsProvider);
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
class TeamsProvider extends ExternalProvider {
|
|
124
|
+
constructor(_config) {
|
|
125
|
+
super();
|
|
126
|
+
this.type = 'teams';
|
|
127
|
+
this.name = '@bernierllc/chat-integration-teams';
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
exports.TeamsProvider = TeamsProvider;
|
|
131
|
+
/**
|
|
132
|
+
* Check if an external provider package is available
|
|
133
|
+
*/
|
|
134
|
+
function isProviderAvailable(providerName) {
|
|
135
|
+
try {
|
|
136
|
+
require.resolve(providerName);
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get list of available external providers
|
|
145
|
+
*/
|
|
146
|
+
function getAvailableProviders() {
|
|
147
|
+
const providers = [
|
|
148
|
+
'@bernierllc/chat-integration-slack',
|
|
149
|
+
'@bernierllc/chat-integration-discord',
|
|
150
|
+
'@bernierllc/chat-integration-teams'
|
|
151
|
+
];
|
|
152
|
+
return providers.filter(isProviderAvailable);
|
|
153
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAQA,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
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
|
+
__exportStar(require("./ChatKitProvider"), exports);
|
|
25
|
+
__exportStar(require("./ExternalProviders"), exports);
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ChatSuiteConfig } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Manages chat suite configuration with validation and inheritance
|
|
4
|
+
*/
|
|
5
|
+
export declare class ConfigManager {
|
|
6
|
+
private config;
|
|
7
|
+
private configOverrides;
|
|
8
|
+
constructor(initialConfig?: Partial<ChatSuiteConfig>);
|
|
9
|
+
/**
|
|
10
|
+
* Get the current configuration
|
|
11
|
+
*/
|
|
12
|
+
getConfig(): Readonly<ChatSuiteConfig>;
|
|
13
|
+
/**
|
|
14
|
+
* Update configuration
|
|
15
|
+
*/
|
|
16
|
+
updateConfig(updates: Partial<ChatSuiteConfig>): void;
|
|
17
|
+
/**
|
|
18
|
+
* Get a specific configuration value
|
|
19
|
+
*/
|
|
20
|
+
get<K extends keyof ChatSuiteConfig>(key: K): ChatSuiteConfig[K];
|
|
21
|
+
/**
|
|
22
|
+
* Set a configuration override
|
|
23
|
+
*/
|
|
24
|
+
setOverride(key: string, value: unknown): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get a configuration override
|
|
27
|
+
*/
|
|
28
|
+
getOverride(key: string): unknown;
|
|
29
|
+
/**
|
|
30
|
+
* Clear all overrides
|
|
31
|
+
*/
|
|
32
|
+
clearOverrides(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Reset to default configuration
|
|
35
|
+
*/
|
|
36
|
+
reset(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Validate the current configuration
|
|
39
|
+
*/
|
|
40
|
+
private validateConfiguration;
|
|
41
|
+
/**
|
|
42
|
+
* Export configuration as JSON
|
|
43
|
+
*/
|
|
44
|
+
toJSON(): string;
|
|
45
|
+
/**
|
|
46
|
+
* Load configuration from JSON
|
|
47
|
+
*/
|
|
48
|
+
fromJSON(json: string): void;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=ConfigManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConfigManager.d.ts","sourceRoot":"","sources":["../../src/services/ConfigManager.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAIhD;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,eAAe,CAAmC;gBAE9C,aAAa,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC;IAKpD;;OAEG;IACI,SAAS,IAAI,QAAQ,CAAC,eAAe,CAAC;IAI7C;;OAEG;IACI,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI;IAM5D;;OAEG;IACI,GAAG,CAAC,CAAC,SAAS,MAAM,eAAe,EAAE,GAAG,EAAE,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC;IAIvE;;OAEG;IACI,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAIrD;;OAEG;IACI,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIxC;;OAEG;IACI,cAAc,IAAI,IAAI;IAI7B;;OAEG;IACI,KAAK,IAAI,IAAI;IAKpB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAU7B;;OAEG;IACI,MAAM,IAAI,MAAM;IAIvB;;OAEG;IACI,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CAYpC"}
|
|
@@ -0,0 +1,95 @@
|
|
|
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.ConfigManager = void 0;
|
|
11
|
+
const config_inheritance_1 = require("../utils/config-inheritance");
|
|
12
|
+
const error_handling_1 = require("../utils/error-handling");
|
|
13
|
+
/**
|
|
14
|
+
* Manages chat suite configuration with validation and inheritance
|
|
15
|
+
*/
|
|
16
|
+
class ConfigManager {
|
|
17
|
+
constructor(initialConfig) {
|
|
18
|
+
this.configOverrides = new Map();
|
|
19
|
+
this.config = (0, config_inheritance_1.mergeConfigs)(config_inheritance_1.DEFAULT_SUITE_CONFIG, initialConfig || {});
|
|
20
|
+
this.validateConfiguration();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Get the current configuration
|
|
24
|
+
*/
|
|
25
|
+
getConfig() {
|
|
26
|
+
return this.config;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Update configuration
|
|
30
|
+
*/
|
|
31
|
+
updateConfig(updates) {
|
|
32
|
+
const newConfig = (0, config_inheritance_1.mergeConfigs)(this.config, updates);
|
|
33
|
+
this.validateConfiguration(newConfig);
|
|
34
|
+
this.config = newConfig;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get a specific configuration value
|
|
38
|
+
*/
|
|
39
|
+
get(key) {
|
|
40
|
+
return this.config[key];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Set a configuration override
|
|
44
|
+
*/
|
|
45
|
+
setOverride(key, value) {
|
|
46
|
+
this.configOverrides.set(key, value);
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Get a configuration override
|
|
50
|
+
*/
|
|
51
|
+
getOverride(key) {
|
|
52
|
+
return this.configOverrides.get(key);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Clear all overrides
|
|
56
|
+
*/
|
|
57
|
+
clearOverrides() {
|
|
58
|
+
this.configOverrides.clear();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Reset to default configuration
|
|
62
|
+
*/
|
|
63
|
+
reset() {
|
|
64
|
+
this.config = { ...config_inheritance_1.DEFAULT_SUITE_CONFIG };
|
|
65
|
+
this.configOverrides.clear();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Validate the current configuration
|
|
69
|
+
*/
|
|
70
|
+
validateConfiguration(config = this.config) {
|
|
71
|
+
const validation = (0, config_inheritance_1.validateConfig)(config);
|
|
72
|
+
if (!validation.valid) {
|
|
73
|
+
throw new error_handling_1.ChatSuiteError(error_handling_1.ChatSuiteErrorType.CONFIGURATION_ERROR, `Configuration validation failed: ${validation.errors.join(', ')}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Export configuration as JSON
|
|
78
|
+
*/
|
|
79
|
+
toJSON() {
|
|
80
|
+
return JSON.stringify(this.config, null, 2);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Load configuration from JSON
|
|
84
|
+
*/
|
|
85
|
+
fromJSON(json) {
|
|
86
|
+
try {
|
|
87
|
+
const parsed = JSON.parse(json);
|
|
88
|
+
this.updateConfig(parsed);
|
|
89
|
+
}
|
|
90
|
+
catch (error) {
|
|
91
|
+
throw new error_handling_1.ChatSuiteError(error_handling_1.ChatSuiteErrorType.CONFIGURATION_ERROR, 'Failed to parse configuration JSON', error instanceof Error ? error : undefined);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
exports.ConfigManager = ConfigManager;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { Provider, ProviderType, ChatSuiteHealth } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Health check result
|
|
4
|
+
*/
|
|
5
|
+
export interface HealthCheckResult {
|
|
6
|
+
healthy: boolean;
|
|
7
|
+
timestamp: Date;
|
|
8
|
+
details?: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Monitors health of all chat suite components
|
|
12
|
+
*/
|
|
13
|
+
export declare class HealthMonitor {
|
|
14
|
+
private providers;
|
|
15
|
+
private lastHealthCheck?;
|
|
16
|
+
private healthCheckInterval?;
|
|
17
|
+
/**
|
|
18
|
+
* Register a provider for health monitoring
|
|
19
|
+
*/
|
|
20
|
+
registerProvider(provider: Provider): void;
|
|
21
|
+
/**
|
|
22
|
+
* Unregister a provider
|
|
23
|
+
*/
|
|
24
|
+
unregisterProvider(providerType: ProviderType): void;
|
|
25
|
+
/**
|
|
26
|
+
* Start periodic health checks
|
|
27
|
+
*/
|
|
28
|
+
startMonitoring(intervalMs?: number): void;
|
|
29
|
+
/**
|
|
30
|
+
* Stop periodic health checks
|
|
31
|
+
*/
|
|
32
|
+
stopMonitoring(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Perform health check on all components
|
|
35
|
+
*/
|
|
36
|
+
checkHealth(): Promise<ChatSuiteHealth>;
|
|
37
|
+
/**
|
|
38
|
+
* Get health status for a specific provider
|
|
39
|
+
*/
|
|
40
|
+
checkProviderHealth(providerType: ProviderType): Promise<HealthCheckResult>;
|
|
41
|
+
/**
|
|
42
|
+
* Get the last health check timestamp
|
|
43
|
+
*/
|
|
44
|
+
getLastCheckTime(): Date | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Get all registered providers
|
|
47
|
+
*/
|
|
48
|
+
getRegisteredProviders(): ProviderType[];
|
|
49
|
+
/**
|
|
50
|
+
* Check if monitoring is active
|
|
51
|
+
*/
|
|
52
|
+
isMonitoring(): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Clean up resources
|
|
55
|
+
*/
|
|
56
|
+
shutdown(): void;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=HealthMonitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HealthMonitor.d.ts","sourceRoot":"","sources":["../../src/services/HealthMonitor.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAExE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAA0C;IAC3D,OAAO,CAAC,eAAe,CAAC,CAAO;IAC/B,OAAO,CAAC,mBAAmB,CAAC,CAAiB;IAE7C;;OAEG;IACI,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAIjD;;OAEG;IACI,kBAAkB,CAAC,YAAY,EAAE,YAAY,GAAG,IAAI;IAI3D;;OAEG;IACI,eAAe,CAAC,UAAU,GAAE,MAAc,GAAG,IAAI;IAOxD;;OAEG;IACI,cAAc,IAAI,IAAI;IAO7B;;OAEG;IACU,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;IAwCpD;;OAEG;IACU,mBAAmB,CAAC,YAAY,EAAE,YAAY,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAiCxF;;OAEG;IACI,gBAAgB,IAAI,IAAI,GAAG,SAAS;IAI3C;;OAEG;IACI,sBAAsB,IAAI,YAAY,EAAE;IAI/C;;OAEG;IACI,YAAY,IAAI,OAAO;IAI9B;;OAEG;IACI,QAAQ,IAAI,IAAI;CAIxB"}
|
|
@@ -0,0 +1,148 @@
|
|
|
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.HealthMonitor = void 0;
|
|
11
|
+
/**
|
|
12
|
+
* Monitors health of all chat suite components
|
|
13
|
+
*/
|
|
14
|
+
class HealthMonitor {
|
|
15
|
+
constructor() {
|
|
16
|
+
this.providers = new Map();
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Register a provider for health monitoring
|
|
20
|
+
*/
|
|
21
|
+
registerProvider(provider) {
|
|
22
|
+
this.providers.set(provider.type, provider);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Unregister a provider
|
|
26
|
+
*/
|
|
27
|
+
unregisterProvider(providerType) {
|
|
28
|
+
this.providers.delete(providerType);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Start periodic health checks
|
|
32
|
+
*/
|
|
33
|
+
startMonitoring(intervalMs = 60000) {
|
|
34
|
+
this.stopMonitoring();
|
|
35
|
+
this.healthCheckInterval = setInterval(() => {
|
|
36
|
+
void this.checkHealth();
|
|
37
|
+
}, intervalMs);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Stop periodic health checks
|
|
41
|
+
*/
|
|
42
|
+
stopMonitoring() {
|
|
43
|
+
if (this.healthCheckInterval) {
|
|
44
|
+
clearInterval(this.healthCheckInterval);
|
|
45
|
+
this.healthCheckInterval = undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Perform health check on all components
|
|
50
|
+
*/
|
|
51
|
+
async checkHealth() {
|
|
52
|
+
const timestamp = new Date();
|
|
53
|
+
this.lastHealthCheck = timestamp;
|
|
54
|
+
const providerStatuses = {};
|
|
55
|
+
// Check each provider
|
|
56
|
+
for (const [type, provider] of this.providers) {
|
|
57
|
+
try {
|
|
58
|
+
const health = await provider.getHealth();
|
|
59
|
+
providerStatuses[type] = {
|
|
60
|
+
status: health.status,
|
|
61
|
+
latency: health.latency,
|
|
62
|
+
errorCount: health.errorCount
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
providerStatuses[type] = {
|
|
67
|
+
status: 'unhealthy',
|
|
68
|
+
errorCount: 1
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Determine overall status
|
|
73
|
+
const statuses = Object.values(providerStatuses).map(p => p.status);
|
|
74
|
+
let overallStatus = 'healthy';
|
|
75
|
+
if (statuses.some(s => s === 'unhealthy')) {
|
|
76
|
+
overallStatus = 'unhealthy';
|
|
77
|
+
}
|
|
78
|
+
else if (statuses.some(s => s === 'degraded')) {
|
|
79
|
+
overallStatus = 'degraded';
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
status: overallStatus,
|
|
83
|
+
providers: providerStatuses,
|
|
84
|
+
timestamp
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get health status for a specific provider
|
|
89
|
+
*/
|
|
90
|
+
async checkProviderHealth(providerType) {
|
|
91
|
+
const provider = this.providers.get(providerType);
|
|
92
|
+
if (!provider) {
|
|
93
|
+
return {
|
|
94
|
+
healthy: false,
|
|
95
|
+
timestamp: new Date(),
|
|
96
|
+
details: { error: 'Provider not registered' }
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const health = await provider.getHealth();
|
|
101
|
+
return {
|
|
102
|
+
healthy: health.status === 'healthy',
|
|
103
|
+
timestamp: new Date(),
|
|
104
|
+
details: {
|
|
105
|
+
status: health.status,
|
|
106
|
+
latency: health.latency,
|
|
107
|
+
errorCount: health.errorCount,
|
|
108
|
+
uptime: health.uptime
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
return {
|
|
114
|
+
healthy: false,
|
|
115
|
+
timestamp: new Date(),
|
|
116
|
+
details: {
|
|
117
|
+
error: error instanceof Error ? error.message : 'Health check failed'
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get the last health check timestamp
|
|
124
|
+
*/
|
|
125
|
+
getLastCheckTime() {
|
|
126
|
+
return this.lastHealthCheck;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Get all registered providers
|
|
130
|
+
*/
|
|
131
|
+
getRegisteredProviders() {
|
|
132
|
+
return Array.from(this.providers.keys());
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Check if monitoring is active
|
|
136
|
+
*/
|
|
137
|
+
isMonitoring() {
|
|
138
|
+
return this.healthCheckInterval !== undefined;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Clean up resources
|
|
142
|
+
*/
|
|
143
|
+
shutdown() {
|
|
144
|
+
this.stopMonitoring();
|
|
145
|
+
this.providers.clear();
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
exports.HealthMonitor = HealthMonitor;
|