@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,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,3 @@
1
+ export * from './ChatKitProvider';
2
+ export * from './ExternalProviders';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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;