@juspay/neurolink 6.1.0 → 6.2.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 (283) hide show
  1. package/CHANGELOG.md +10 -6
  2. package/dist/cli/commands/config.d.ts +13 -13
  3. package/dist/cli/index.js +3 -9
  4. package/dist/core/analytics.d.ts +11 -1
  5. package/dist/core/analytics.js +2 -2
  6. package/dist/core/base-provider.js +4 -18
  7. package/dist/core/dynamic-models.d.ts +8 -8
  8. package/dist/core/factory.js +3 -11
  9. package/dist/index.d.ts +2 -4
  10. package/dist/index.js +2 -11
  11. package/dist/lib/core/analytics.d.ts +11 -1
  12. package/dist/lib/core/analytics.js +2 -2
  13. package/dist/lib/core/base-provider.js +4 -18
  14. package/dist/lib/core/dynamic-models.d.ts +8 -8
  15. package/dist/lib/core/factory.js +3 -11
  16. package/dist/lib/index.d.ts +2 -4
  17. package/dist/lib/index.js +2 -11
  18. package/dist/lib/mcp/factory.d.ts +1 -1
  19. package/dist/lib/mcp/index.d.ts +7 -19
  20. package/dist/lib/mcp/index.js +15 -56
  21. package/dist/lib/neurolink.d.ts +1 -9
  22. package/dist/lib/neurolink.js +21 -70
  23. package/dist/lib/providers/amazon-bedrock.js +5 -16
  24. package/dist/lib/providers/anthropic-baseprovider.js +3 -21
  25. package/dist/lib/providers/anthropic.js +4 -7
  26. package/dist/lib/providers/azure-openai.js +4 -2
  27. package/dist/lib/providers/google-vertex.js +5 -9
  28. package/dist/lib/providers/huggingFace.js +5 -10
  29. package/dist/lib/providers/mistral.js +5 -8
  30. package/dist/lib/providers/openAI.js +4 -7
  31. package/dist/lib/utils/providerConfig.d.ts +117 -0
  32. package/dist/lib/utils/providerConfig.js +353 -0
  33. package/dist/lib/utils/providerUtils.d.ts +2 -1
  34. package/dist/lib/utils/providerUtils.js +53 -36
  35. package/dist/lib/utils/timeout.d.ts +72 -1
  36. package/dist/lib/utils/timeout.js +203 -2
  37. package/dist/mcp/factory.d.ts +1 -1
  38. package/dist/mcp/index.d.ts +7 -19
  39. package/dist/mcp/index.js +15 -56
  40. package/dist/neurolink.d.ts +1 -9
  41. package/dist/neurolink.js +21 -70
  42. package/dist/providers/amazon-bedrock.js +5 -16
  43. package/dist/providers/anthropic-baseprovider.js +3 -21
  44. package/dist/providers/anthropic.js +4 -7
  45. package/dist/providers/azure-openai.js +4 -2
  46. package/dist/providers/google-vertex.js +5 -9
  47. package/dist/providers/huggingFace.js +5 -10
  48. package/dist/providers/mistral.js +5 -8
  49. package/dist/providers/openAI.js +4 -7
  50. package/dist/utils/providerConfig.d.ts +117 -0
  51. package/dist/utils/providerConfig.js +353 -0
  52. package/dist/utils/providerUtils.d.ts +2 -1
  53. package/dist/utils/providerUtils.js +53 -36
  54. package/dist/utils/timeout.d.ts +72 -1
  55. package/dist/utils/timeout.js +203 -2
  56. package/package.json +1 -1
  57. package/dist/chat/client-utils.d.ts +0 -95
  58. package/dist/chat/client-utils.js +0 -315
  59. package/dist/chat/index.d.ts +0 -24
  60. package/dist/chat/index.js +0 -33
  61. package/dist/chat/session-storage.d.ts +0 -77
  62. package/dist/chat/session-storage.js +0 -233
  63. package/dist/chat/session.d.ts +0 -96
  64. package/dist/chat/session.js +0 -257
  65. package/dist/chat/sse-handler.d.ts +0 -49
  66. package/dist/chat/sse-handler.js +0 -259
  67. package/dist/chat/types.d.ts +0 -74
  68. package/dist/chat/types.js +0 -5
  69. package/dist/chat/websocket-chat-handler.d.ts +0 -37
  70. package/dist/chat/websocket-chat-handler.js +0 -262
  71. package/dist/cli/commands/mcp.d.ts +0 -20
  72. package/dist/cli/commands/mcp.js +0 -1272
  73. package/dist/core/defaults.d.ts +0 -19
  74. package/dist/core/defaults.js +0 -29
  75. package/dist/core/evaluation-config.d.ts +0 -29
  76. package/dist/core/evaluation-config.js +0 -144
  77. package/dist/factories/compatibility-factory.d.ts +0 -35
  78. package/dist/factories/compatibility-factory.js +0 -71
  79. package/dist/factories/provider-generate-factory.d.ts +0 -20
  80. package/dist/factories/provider-generate-factory.js +0 -93
  81. package/dist/lib/chat/client-utils.d.ts +0 -95
  82. package/dist/lib/chat/client-utils.js +0 -315
  83. package/dist/lib/chat/index.d.ts +0 -24
  84. package/dist/lib/chat/index.js +0 -33
  85. package/dist/lib/chat/session-storage.d.ts +0 -77
  86. package/dist/lib/chat/session-storage.js +0 -233
  87. package/dist/lib/chat/session.d.ts +0 -96
  88. package/dist/lib/chat/session.js +0 -257
  89. package/dist/lib/chat/sse-handler.d.ts +0 -49
  90. package/dist/lib/chat/sse-handler.js +0 -259
  91. package/dist/lib/chat/types.d.ts +0 -74
  92. package/dist/lib/chat/types.js +0 -5
  93. package/dist/lib/chat/websocket-chat-handler.d.ts +0 -37
  94. package/dist/lib/chat/websocket-chat-handler.js +0 -262
  95. package/dist/lib/core/defaults.d.ts +0 -19
  96. package/dist/lib/core/defaults.js +0 -29
  97. package/dist/lib/core/evaluation-config.d.ts +0 -29
  98. package/dist/lib/core/evaluation-config.js +0 -144
  99. package/dist/lib/factories/compatibility-factory.d.ts +0 -35
  100. package/dist/lib/factories/compatibility-factory.js +0 -71
  101. package/dist/lib/factories/provider-generate-factory.d.ts +0 -20
  102. package/dist/lib/factories/provider-generate-factory.js +0 -93
  103. package/dist/lib/mcp/adapters/plugin-bridge.d.ts +0 -40
  104. package/dist/lib/mcp/adapters/plugin-bridge.js +0 -89
  105. package/dist/lib/mcp/auto-discovery.d.ts +0 -62
  106. package/dist/lib/mcp/auto-discovery.js +0 -149
  107. package/dist/lib/mcp/client.d.ts +0 -68
  108. package/dist/lib/mcp/client.js +0 -248
  109. package/dist/lib/mcp/config.d.ts +0 -31
  110. package/dist/lib/mcp/config.js +0 -99
  111. package/dist/lib/mcp/context-manager.d.ts +0 -171
  112. package/dist/lib/mcp/context-manager.js +0 -362
  113. package/dist/lib/mcp/contracts/mcp-contract.d.ts +0 -169
  114. package/dist/lib/mcp/contracts/mcp-contract.js +0 -58
  115. package/dist/lib/mcp/core/plugin-manager.d.ts +0 -46
  116. package/dist/lib/mcp/core/plugin-manager.js +0 -110
  117. package/dist/lib/mcp/demo/plugin-demo.d.ts +0 -20
  118. package/dist/lib/mcp/demo/plugin-demo.js +0 -118
  119. package/dist/lib/mcp/dynamic-chain-executor.d.ts +0 -225
  120. package/dist/lib/mcp/dynamic-chain-executor.js +0 -489
  121. package/dist/lib/mcp/dynamic-orchestrator.d.ts +0 -115
  122. package/dist/lib/mcp/dynamic-orchestrator.js +0 -351
  123. package/dist/lib/mcp/ecosystem.d.ts +0 -75
  124. package/dist/lib/mcp/ecosystem.js +0 -161
  125. package/dist/lib/mcp/error-manager.d.ts +0 -254
  126. package/dist/lib/mcp/error-manager.js +0 -501
  127. package/dist/lib/mcp/error-recovery.d.ts +0 -159
  128. package/dist/lib/mcp/error-recovery.js +0 -405
  129. package/dist/lib/mcp/external-client.d.ts +0 -88
  130. package/dist/lib/mcp/external-client.js +0 -331
  131. package/dist/lib/mcp/external-manager.d.ts +0 -112
  132. package/dist/lib/mcp/external-manager.js +0 -308
  133. package/dist/lib/mcp/function-calling.d.ts +0 -65
  134. package/dist/lib/mcp/function-calling.js +0 -642
  135. package/dist/lib/mcp/health-monitor.d.ts +0 -257
  136. package/dist/lib/mcp/health-monitor.js +0 -630
  137. package/dist/lib/mcp/initialize-tools.d.ts +0 -29
  138. package/dist/lib/mcp/initialize-tools.js +0 -261
  139. package/dist/lib/mcp/initialize.d.ts +0 -18
  140. package/dist/lib/mcp/initialize.js +0 -62
  141. package/dist/lib/mcp/manager.d.ts +0 -68
  142. package/dist/lib/mcp/manager.js +0 -176
  143. package/dist/lib/mcp/neurolink-mcp-client.d.ts +0 -97
  144. package/dist/lib/mcp/neurolink-mcp-client.js +0 -462
  145. package/dist/lib/mcp/orchestrator.d.ts +0 -302
  146. package/dist/lib/mcp/orchestrator.js +0 -703
  147. package/dist/lib/mcp/plugin-manager.d.ts +0 -98
  148. package/dist/lib/mcp/plugin-manager.js +0 -296
  149. package/dist/lib/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
  150. package/dist/lib/mcp/plugins/core/filesystem-mcp.js +0 -142
  151. package/dist/lib/mcp/plugins/filesystem-mcp.d.ts +0 -37
  152. package/dist/lib/mcp/plugins/filesystem-mcp.js +0 -54
  153. package/dist/lib/mcp/security-manager.d.ts +0 -87
  154. package/dist/lib/mcp/security-manager.js +0 -344
  155. package/dist/lib/mcp/semaphore-manager.d.ts +0 -137
  156. package/dist/lib/mcp/semaphore-manager.js +0 -329
  157. package/dist/lib/mcp/session-manager.d.ts +0 -187
  158. package/dist/lib/mcp/session-manager.js +0 -400
  159. package/dist/lib/mcp/session-persistence.d.ts +0 -93
  160. package/dist/lib/mcp/session-persistence.js +0 -301
  161. package/dist/lib/mcp/tool-integration.d.ts +0 -58
  162. package/dist/lib/mcp/tool-integration.js +0 -203
  163. package/dist/lib/mcp/transport-manager.d.ts +0 -154
  164. package/dist/lib/mcp/transport-manager.js +0 -334
  165. package/dist/lib/mcp/unified-mcp.d.ts +0 -133
  166. package/dist/lib/mcp/unified-mcp.js +0 -251
  167. package/dist/lib/mcp/unified-registry.d.ts +0 -165
  168. package/dist/lib/mcp/unified-registry.js +0 -538
  169. package/dist/lib/providers/analytics-helper.d.ts +0 -38
  170. package/dist/lib/providers/analytics-helper.js +0 -216
  171. package/dist/lib/providers/function-calling-provider.d.ts +0 -142
  172. package/dist/lib/providers/function-calling-provider.js +0 -630
  173. package/dist/lib/providers/mcp-provider.d.ts +0 -75
  174. package/dist/lib/providers/mcp-provider.js +0 -283
  175. package/dist/lib/providers/timeout-wrapper.d.ts +0 -40
  176. package/dist/lib/providers/timeout-wrapper.js +0 -100
  177. package/dist/lib/sdk/tool-extension.d.ts +0 -181
  178. package/dist/lib/sdk/tool-extension.js +0 -284
  179. package/dist/lib/services/streaming/streaming-manager.d.ts +0 -29
  180. package/dist/lib/services/streaming/streaming-manager.js +0 -245
  181. package/dist/lib/services/types.d.ts +0 -156
  182. package/dist/lib/services/types.js +0 -2
  183. package/dist/lib/services/websocket/websocket-server.d.ts +0 -34
  184. package/dist/lib/services/websocket/websocket-server.js +0 -305
  185. package/dist/lib/utils/provider-validation.d.ts +0 -36
  186. package/dist/lib/utils/provider-validation.js +0 -625
  187. package/dist/lib/utils/providerUtils-fixed.d.ts +0 -8
  188. package/dist/lib/utils/providerUtils-fixed.js +0 -94
  189. package/dist/lib/utils/streaming-utils.d.ts +0 -79
  190. package/dist/lib/utils/streaming-utils.js +0 -198
  191. package/dist/lib/utils/timeout-manager.d.ts +0 -75
  192. package/dist/lib/utils/timeout-manager.js +0 -244
  193. package/dist/mcp/adapters/plugin-bridge.d.ts +0 -40
  194. package/dist/mcp/adapters/plugin-bridge.js +0 -89
  195. package/dist/mcp/auto-discovery.d.ts +0 -62
  196. package/dist/mcp/auto-discovery.js +0 -149
  197. package/dist/mcp/client.d.ts +0 -68
  198. package/dist/mcp/client.js +0 -248
  199. package/dist/mcp/config.d.ts +0 -31
  200. package/dist/mcp/config.js +0 -99
  201. package/dist/mcp/context-manager.d.ts +0 -171
  202. package/dist/mcp/context-manager.js +0 -362
  203. package/dist/mcp/contracts/mcp-contract.d.ts +0 -169
  204. package/dist/mcp/contracts/mcp-contract.js +0 -58
  205. package/dist/mcp/core/plugin-manager.d.ts +0 -46
  206. package/dist/mcp/core/plugin-manager.js +0 -110
  207. package/dist/mcp/demo/plugin-demo.d.ts +0 -20
  208. package/dist/mcp/demo/plugin-demo.js +0 -118
  209. package/dist/mcp/dynamic-chain-executor.d.ts +0 -225
  210. package/dist/mcp/dynamic-chain-executor.js +0 -489
  211. package/dist/mcp/dynamic-orchestrator.d.ts +0 -115
  212. package/dist/mcp/dynamic-orchestrator.js +0 -351
  213. package/dist/mcp/ecosystem.d.ts +0 -75
  214. package/dist/mcp/ecosystem.js +0 -162
  215. package/dist/mcp/error-manager.d.ts +0 -254
  216. package/dist/mcp/error-manager.js +0 -501
  217. package/dist/mcp/error-recovery.d.ts +0 -159
  218. package/dist/mcp/error-recovery.js +0 -405
  219. package/dist/mcp/external-client.d.ts +0 -88
  220. package/dist/mcp/external-client.js +0 -331
  221. package/dist/mcp/external-manager.d.ts +0 -112
  222. package/dist/mcp/external-manager.js +0 -308
  223. package/dist/mcp/function-calling.d.ts +0 -65
  224. package/dist/mcp/function-calling.js +0 -642
  225. package/dist/mcp/health-monitor.d.ts +0 -257
  226. package/dist/mcp/health-monitor.js +0 -630
  227. package/dist/mcp/initialize-tools.d.ts +0 -29
  228. package/dist/mcp/initialize-tools.js +0 -262
  229. package/dist/mcp/initialize.d.ts +0 -18
  230. package/dist/mcp/initialize.js +0 -62
  231. package/dist/mcp/manager.d.ts +0 -68
  232. package/dist/mcp/manager.js +0 -176
  233. package/dist/mcp/neurolink-mcp-client.d.ts +0 -97
  234. package/dist/mcp/neurolink-mcp-client.js +0 -462
  235. package/dist/mcp/orchestrator.d.ts +0 -302
  236. package/dist/mcp/orchestrator.js +0 -703
  237. package/dist/mcp/plugin-manager.d.ts +0 -98
  238. package/dist/mcp/plugin-manager.js +0 -297
  239. package/dist/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
  240. package/dist/mcp/plugins/core/filesystem-mcp.js +0 -142
  241. package/dist/mcp/plugins/core/neurolink-mcp.json +0 -17
  242. package/dist/mcp/plugins/filesystem-mcp.d.ts +0 -37
  243. package/dist/mcp/plugins/filesystem-mcp.js +0 -54
  244. package/dist/mcp/security-manager.d.ts +0 -87
  245. package/dist/mcp/security-manager.js +0 -344
  246. package/dist/mcp/semaphore-manager.d.ts +0 -137
  247. package/dist/mcp/semaphore-manager.js +0 -329
  248. package/dist/mcp/session-manager.d.ts +0 -187
  249. package/dist/mcp/session-manager.js +0 -400
  250. package/dist/mcp/session-persistence.d.ts +0 -93
  251. package/dist/mcp/session-persistence.js +0 -302
  252. package/dist/mcp/tool-integration.d.ts +0 -58
  253. package/dist/mcp/tool-integration.js +0 -203
  254. package/dist/mcp/transport-manager.d.ts +0 -154
  255. package/dist/mcp/transport-manager.js +0 -335
  256. package/dist/mcp/unified-mcp.d.ts +0 -133
  257. package/dist/mcp/unified-mcp.js +0 -251
  258. package/dist/mcp/unified-registry.d.ts +0 -165
  259. package/dist/mcp/unified-registry.js +0 -539
  260. package/dist/providers/analytics-helper.d.ts +0 -38
  261. package/dist/providers/analytics-helper.js +0 -216
  262. package/dist/providers/function-calling-provider.d.ts +0 -142
  263. package/dist/providers/function-calling-provider.js +0 -630
  264. package/dist/providers/mcp-provider.d.ts +0 -75
  265. package/dist/providers/mcp-provider.js +0 -283
  266. package/dist/providers/timeout-wrapper.d.ts +0 -40
  267. package/dist/providers/timeout-wrapper.js +0 -100
  268. package/dist/sdk/tool-extension.d.ts +0 -181
  269. package/dist/sdk/tool-extension.js +0 -284
  270. package/dist/services/streaming/streaming-manager.d.ts +0 -29
  271. package/dist/services/streaming/streaming-manager.js +0 -245
  272. package/dist/services/types.d.ts +0 -156
  273. package/dist/services/types.js +0 -2
  274. package/dist/services/websocket/websocket-server.d.ts +0 -34
  275. package/dist/services/websocket/websocket-server.js +0 -306
  276. package/dist/utils/provider-validation.d.ts +0 -36
  277. package/dist/utils/provider-validation.js +0 -625
  278. package/dist/utils/providerUtils-fixed.d.ts +0 -8
  279. package/dist/utils/providerUtils-fixed.js +0 -94
  280. package/dist/utils/streaming-utils.d.ts +0 -79
  281. package/dist/utils/streaming-utils.js +0 -198
  282. package/dist/utils/timeout-manager.d.ts +0 -75
  283. package/dist/utils/timeout-manager.js +0 -244
@@ -1,315 +0,0 @@
1
- /**
2
- * Phase 3: SSE Chat Utilities
3
- * Client-side utilities for SSE chat integration
4
- */
5
- /**
6
- * Client for SSE chat communication
7
- */
8
- export class ChatClient {
9
- eventSource;
10
- options;
11
- messages = [];
12
- reconnectCount = 0;
13
- isConnected = false;
14
- isReconnecting = false;
15
- reconnectTimeout;
16
- constructor(options) {
17
- this.options = {
18
- ...options,
19
- onMessage: options.onMessage || (() => { }),
20
- onError: options.onError || (() => { }),
21
- onConnect: options.onConnect || (() => { }),
22
- onDisconnect: options.onDisconnect || (() => { }),
23
- reconnectAttempts: options.reconnectAttempts ?? 5,
24
- reconnectDelay: options.reconnectDelay ?? 1000,
25
- };
26
- }
27
- /**
28
- * Connect to SSE endpoint
29
- */
30
- connect() {
31
- if (this.eventSource) {
32
- this.disconnect();
33
- }
34
- const url = new URL("/chat/stream", this.options.endpoint);
35
- url.searchParams.set("sessionId", this.options.sessionId);
36
- this.eventSource = new EventSource(url.toString());
37
- this.eventSource.onopen = () => {
38
- this.isConnected = true;
39
- this.isReconnecting = false;
40
- this.reconnectCount = 0;
41
- this.options.onConnect();
42
- };
43
- this.eventSource.onmessage = (event) => {
44
- try {
45
- const sseEvent = JSON.parse(event.data);
46
- this.handleSSEEvent(sseEvent);
47
- }
48
- catch (error) {
49
- console.error("Failed to parse SSE event:", error);
50
- }
51
- };
52
- this.eventSource.onerror = (error) => {
53
- this.isConnected = false;
54
- this.options.onDisconnect();
55
- if (this.reconnectCount < this.options.reconnectAttempts) {
56
- this.isReconnecting = true;
57
- this.scheduleReconnect();
58
- }
59
- else {
60
- this.isReconnecting = false;
61
- this.options.onError(new Error("Max reconnection attempts reached"));
62
- }
63
- };
64
- // Handle specific event types
65
- this.eventSource.addEventListener("data", (event) => {
66
- this.handleDataEvent(JSON.parse(event.data));
67
- });
68
- this.eventSource.addEventListener("errMsg", (event) => {
69
- this.handleErrorEvent(JSON.parse(event.data));
70
- });
71
- this.eventSource.addEventListener("complete", (event) => {
72
- this.handleCompleteEvent(JSON.parse(event.data));
73
- });
74
- }
75
- /**
76
- * Send message to chat
77
- */
78
- async sendMessage(content) {
79
- if (!this.isConnected) {
80
- throw new Error("Not connected to chat server");
81
- }
82
- try {
83
- const response = await fetch(`${this.options.endpoint}/chat/send`, {
84
- method: "POST",
85
- headers: {
86
- "Content-Type": "application/json",
87
- },
88
- body: JSON.stringify({
89
- sessionId: this.options.sessionId,
90
- message: content,
91
- }),
92
- });
93
- if (!response.ok) {
94
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
95
- }
96
- }
97
- catch (error) {
98
- this.options.onError(error);
99
- throw error;
100
- }
101
- }
102
- /**
103
- * Disconnect from SSE endpoint
104
- */
105
- disconnect() {
106
- if (this.eventSource) {
107
- this.eventSource.close();
108
- this.eventSource = undefined;
109
- }
110
- if (this.reconnectTimeout) {
111
- clearTimeout(this.reconnectTimeout);
112
- this.reconnectTimeout = undefined;
113
- }
114
- this.isConnected = false;
115
- this.isReconnecting = false;
116
- this.options.onDisconnect();
117
- }
118
- /**
119
- * Get message history
120
- */
121
- getMessages() {
122
- return [...this.messages];
123
- }
124
- /**
125
- * Clear message history
126
- */
127
- clearMessages() {
128
- this.messages = [];
129
- }
130
- /**
131
- * Check connection status
132
- */
133
- getConnectionStatus() {
134
- return {
135
- connected: this.isConnected,
136
- reconnecting: this.isReconnecting,
137
- reconnectCount: this.reconnectCount,
138
- };
139
- }
140
- handleSSEEvent(event) {
141
- switch (event.type) {
142
- case "data":
143
- if (this.isDataEventData(event.data)) {
144
- this.handleDataEvent(event.data);
145
- }
146
- break;
147
- case "error":
148
- if (this.isErrorEventData(event.data)) {
149
- this.handleErrorEvent(event.data);
150
- }
151
- break;
152
- case "complete":
153
- if (this.isCompleteEventData(event.data)) {
154
- this.handleCompleteEvent(event.data);
155
- }
156
- break;
157
- case "heartbeat":
158
- // Heartbeat received, connection is alive
159
- break;
160
- }
161
- }
162
- isDataEventData(data) {
163
- return (typeof data === "object" &&
164
- data !== null &&
165
- typeof data.type === "string");
166
- }
167
- isErrorEventData(data) {
168
- return typeof data === "object" && data !== null;
169
- }
170
- isCompleteEventData(data) {
171
- return typeof data === "object" && data !== null;
172
- }
173
- handleDataEvent(data) {
174
- if (data.type === "chunk") {
175
- // Handle streaming response chunk
176
- const lastMessage = this.messages[this.messages.length - 1];
177
- if (lastMessage && lastMessage.role === "assistant") {
178
- // Append to existing assistant message
179
- lastMessage.content += data.content;
180
- this.options.onMessage(lastMessage);
181
- }
182
- else {
183
- // Create new assistant message
184
- const message = {
185
- id: `msg_${Date.now()}_assistant`,
186
- role: "assistant",
187
- content: data.content || "",
188
- timestamp: Date.now(),
189
- };
190
- this.messages.push(message);
191
- this.options.onMessage(message);
192
- }
193
- }
194
- else if (data.type === "start") {
195
- // New conversation started
196
- const userMessage = {
197
- id: String(data.messageId || `msg_${Date.now()}_user`),
198
- role: "user",
199
- content: data.content || "", // Use data content if available
200
- timestamp: Date.now(),
201
- };
202
- this.messages.push(userMessage);
203
- }
204
- }
205
- handleErrorEvent(data) {
206
- this.options.onError(new Error(data.message || "Chat error"));
207
- }
208
- handleCompleteEvent(data) {
209
- // Message completion - final processing
210
- if (data.totalTokens) {
211
- const lastMessage = this.messages[this.messages.length - 1];
212
- if (lastMessage) {
213
- // Initialize metadata if it doesn't exist
214
- if (!lastMessage.metadata) {
215
- lastMessage.metadata = {};
216
- }
217
- lastMessage.metadata.tokens = data.totalTokens;
218
- }
219
- }
220
- }
221
- scheduleReconnect() {
222
- const delay = this.options.reconnectDelay * Math.pow(2, this.reconnectCount);
223
- this.reconnectTimeout = setTimeout(() => {
224
- this.reconnectCount++;
225
- this.reconnectTimeout = undefined;
226
- this.connect();
227
- }, delay);
228
- }
229
- }
230
- /**
231
- * Create chat client instance
232
- */
233
- export function createChatClient(options) {
234
- return new ChatClient(options);
235
- }
236
- /**
237
- * React-style hook for chat streaming (can be adapted for other frameworks)
238
- */
239
- export function useChatStream(options) {
240
- // This would typically use React hooks or similar framework state management
241
- // For now, providing a basic implementation that can be extended
242
- const client = new ChatClient(options);
243
- // Connect on creation
244
- client.connect();
245
- return {
246
- get messages() {
247
- return client.getMessages();
248
- },
249
- get isConnected() {
250
- return client.getConnectionStatus().connected;
251
- },
252
- get isReconnecting() {
253
- return client.getConnectionStatus().reconnecting;
254
- },
255
- sendMessage: async (content) => {
256
- await client.sendMessage(content);
257
- },
258
- disconnect: () => {
259
- client.disconnect();
260
- },
261
- reconnect: () => {
262
- client.connect();
263
- },
264
- clearHistory: () => {
265
- client.clearMessages();
266
- },
267
- };
268
- }
269
- /**
270
- * Utility for creating SSE EventSource with automatic reconnection
271
- */
272
- export function createSSEConnection(url, options = {}) {
273
- let eventSource = null;
274
- let reconnectCount = 0;
275
- let isConnected = false;
276
- const maxAttempts = options.maxReconnectAttempts ?? 5;
277
- const connect = () => {
278
- if (eventSource) {
279
- eventSource.close();
280
- }
281
- eventSource = new EventSource(url);
282
- eventSource.onopen = () => {
283
- isConnected = true;
284
- reconnectCount = 0;
285
- options.onOpen?.();
286
- };
287
- eventSource.onmessage = (event) => {
288
- options.onMessage?.(event);
289
- };
290
- eventSource.onerror = () => {
291
- isConnected = false;
292
- if (options.reconnect && reconnectCount < maxAttempts) {
293
- setTimeout(() => {
294
- reconnectCount++;
295
- connect();
296
- }, 1000 * Math.pow(2, reconnectCount));
297
- }
298
- else {
299
- options.onError?.(new Error("SSE connection failed"));
300
- }
301
- };
302
- };
303
- const disconnect = () => {
304
- if (eventSource) {
305
- eventSource.close();
306
- eventSource = null;
307
- }
308
- isConnected = false;
309
- };
310
- return {
311
- connect,
312
- disconnect,
313
- isConnected: () => isConnected,
314
- };
315
- }
@@ -1,24 +0,0 @@
1
- /**
2
- * Phase 3: SSE Chat Utilities
3
- * Main chat module exports
4
- */
5
- import { SSEChatHandler } from "./sse-handler.js";
6
- export { SSEChatHandler } from "./sse-handler.js";
7
- export { ChatSession } from "./session.js";
8
- export { MemorySessionStorage, FileSessionStorage, RedisSessionStorage, SessionStorageFactory, } from "./session-storage.js";
9
- export { createChatClient, useChatStream } from "./client-utils.js";
10
- export type { ChatMessage, ChatRequest, SSEOptions, SessionOptions, SSEEvent, ChatSessionState, StreamingChatResponse, SessionStorage, ContextManager, } from "./types.js";
11
- /**
12
- * Quick setup helper for SSE chat
13
- */
14
- export declare function createSSEChat(provider: unknown, options?: unknown): Promise<SSEChatHandler>;
15
- /**
16
- * Quick setup helper for chat session
17
- */
18
- export declare function createChatSession(sessionId: string, options?: unknown): Promise<import("./session.js").ChatSession>;
19
- export declare function createEnhancedChatService(options: {
20
- provider: unknown;
21
- enableSSE?: boolean;
22
- enableWebSocket?: boolean;
23
- streamingConfig?: unknown;
24
- }): Promise<SSEChatHandler>;
@@ -1,33 +0,0 @@
1
- /**
2
- * Phase 3: SSE Chat Utilities
3
- * Main chat module exports
4
- */
5
- import { SSEChatHandler } from "./sse-handler.js";
6
- export { SSEChatHandler } from "./sse-handler.js";
7
- export { ChatSession } from "./session.js";
8
- export { MemorySessionStorage, FileSessionStorage, RedisSessionStorage, SessionStorageFactory, } from "./session-storage.js";
9
- export { createChatClient, useChatStream } from "./client-utils.js";
10
- /**
11
- * Quick setup helper for SSE chat
12
- */
13
- export async function createSSEChat(provider, options) {
14
- const { SSEChatHandler } = await import("./sse-handler.js");
15
- return new SSEChatHandler(provider, options);
16
- }
17
- /**
18
- * Quick setup helper for chat session
19
- */
20
- export async function createChatSession(sessionId, options) {
21
- const { ChatSession } = await import("./session.js");
22
- return new ChatSession(sessionId, options);
23
- }
24
- export async function createEnhancedChatService(options) {
25
- if (options.enableWebSocket) {
26
- const { WebSocketChatHandler } = await import("./websocket-chat-handler.js");
27
- return new WebSocketChatHandler(options.provider, {
28
- sseOptions: options.enableSSE ? {} : undefined,
29
- wsOptions: options.streamingConfig,
30
- });
31
- }
32
- return new SSEChatHandler(options.provider);
33
- }
@@ -1,77 +0,0 @@
1
- /**
2
- * Phase 3: SSE Chat Utilities
3
- * Session storage adapters for persistence
4
- */
5
- import type { SessionStorage, ChatSessionState } from "./types.js";
6
- /**
7
- * In-memory session storage (default)
8
- */
9
- export declare class MemorySessionStorage implements SessionStorage {
10
- private sessions;
11
- get(sessionId: string): Promise<ChatSessionState | null>;
12
- set(sessionId: string, state: ChatSessionState): Promise<void>;
13
- delete(sessionId: string): Promise<void>;
14
- list(): Promise<string[]>;
15
- cleanup(maxAge: number): Promise<number>;
16
- /**
17
- * Get storage statistics
18
- */
19
- getStats(): {
20
- totalSessions: number;
21
- memoryUsageBytes: number;
22
- oldestSession?: number;
23
- newestSession?: number;
24
- };
25
- /**
26
- * Clear all sessions
27
- */
28
- clear(): Promise<void>;
29
- }
30
- /**
31
- * File-based session storage
32
- */
33
- export declare class FileSessionStorage implements SessionStorage {
34
- private basePath;
35
- private constructor();
36
- static create(basePath?: string): Promise<FileSessionStorage>;
37
- get(sessionId: string): Promise<ChatSessionState | null>;
38
- set(sessionId: string, state: ChatSessionState): Promise<void>;
39
- delete(sessionId: string): Promise<void>;
40
- list(): Promise<string[]>;
41
- cleanup(maxAge: number): Promise<number>;
42
- private getFilePath;
43
- private ensureDirectory;
44
- }
45
- /**
46
- * Redis session storage (for production scaling)
47
- */
48
- interface RedisClient {
49
- get(key: string): Promise<string | null>;
50
- set(key: string, value: string, options?: unknown): Promise<unknown>;
51
- del(key: string): Promise<number>;
52
- exists(key: string): Promise<number>;
53
- expire?(key: string, ttl: number): Promise<unknown>;
54
- keys?(pattern: string): Promise<string[]>;
55
- }
56
- export declare class RedisSessionStorage implements SessionStorage {
57
- private client;
58
- private keyPrefix;
59
- constructor(redisClient: RedisClient, keyPrefix?: string);
60
- get(sessionId: string): Promise<ChatSessionState | null>;
61
- set(sessionId: string, state: ChatSessionState): Promise<void>;
62
- delete(sessionId: string): Promise<void>;
63
- list(): Promise<string[]>;
64
- cleanup(maxAge: number): Promise<number>;
65
- private getKey;
66
- }
67
- /**
68
- * Session storage factory
69
- */
70
- export declare class SessionStorageFactory {
71
- static create(type: "memory" | "file" | "redis", options?: {
72
- basePath?: string;
73
- redisClient?: RedisClient;
74
- keyPrefix?: string;
75
- }): Promise<SessionStorage>;
76
- }
77
- export {};
@@ -1,233 +0,0 @@
1
- /**
2
- * Phase 3: SSE Chat Utilities
3
- * Session storage adapters for persistence
4
- */
5
- import { promises as fs } from "fs";
6
- /**
7
- * In-memory session storage (default)
8
- */
9
- export class MemorySessionStorage {
10
- sessions = new Map();
11
- async get(sessionId) {
12
- return this.sessions.get(sessionId) || null;
13
- }
14
- async set(sessionId, state) {
15
- this.sessions.set(sessionId, state);
16
- }
17
- async delete(sessionId) {
18
- this.sessions.delete(sessionId);
19
- }
20
- async list() {
21
- return Array.from(this.sessions.keys());
22
- }
23
- async cleanup(maxAge) {
24
- const now = Date.now();
25
- let removed = 0;
26
- for (const [sessionId, state] of this.sessions.entries()) {
27
- if (now - state.lastActivity > maxAge) {
28
- this.sessions.delete(sessionId);
29
- removed++;
30
- }
31
- }
32
- return removed;
33
- }
34
- /**
35
- * Get storage statistics
36
- */
37
- getStats() {
38
- const sessions = Array.from(this.sessions.values());
39
- const memoryUsageBytes = Buffer.byteLength(JSON.stringify(sessions), "utf8");
40
- const timestamps = sessions.map((s) => s.lastActivity);
41
- return {
42
- totalSessions: this.sessions.size,
43
- memoryUsageBytes,
44
- oldestSession: timestamps.length > 0 ? Math.min(...timestamps) : undefined,
45
- newestSession: timestamps.length > 0 ? Math.max(...timestamps) : undefined,
46
- };
47
- }
48
- /**
49
- * Clear all sessions
50
- */
51
- async clear() {
52
- this.sessions.clear();
53
- }
54
- }
55
- /**
56
- * File-based session storage
57
- */
58
- export class FileSessionStorage {
59
- basePath;
60
- constructor(basePath) {
61
- this.basePath = basePath;
62
- }
63
- static async create(basePath = "./sessions") {
64
- const instance = new FileSessionStorage(basePath);
65
- await instance.ensureDirectory();
66
- return instance;
67
- }
68
- async get(sessionId) {
69
- try {
70
- const filePath = this.getFilePath(sessionId);
71
- const data = await fs.readFile(filePath, "utf-8");
72
- return JSON.parse(data);
73
- }
74
- catch (error) {
75
- if (error?.code === "ENOENT") {
76
- return null; // File doesn't exist
77
- }
78
- throw error;
79
- }
80
- }
81
- async set(sessionId, state) {
82
- const filePath = this.getFilePath(sessionId);
83
- const data = JSON.stringify({
84
- ...state,
85
- lastActivity: state.lastActivity ?? Date.now(),
86
- }, null, 2);
87
- await fs.writeFile(filePath, data, "utf-8");
88
- }
89
- async delete(sessionId) {
90
- try {
91
- const filePath = this.getFilePath(sessionId);
92
- await fs.unlink(filePath);
93
- }
94
- catch (error) {
95
- if (error?.code !== "ENOENT") {
96
- throw error;
97
- }
98
- }
99
- }
100
- async list() {
101
- try {
102
- const files = await fs.readdir(this.basePath);
103
- return files
104
- .filter((file) => file.endsWith(".json"))
105
- .map((file) => file.replace(".json", ""));
106
- }
107
- catch (error) {
108
- return [];
109
- }
110
- }
111
- async cleanup(maxAge) {
112
- const sessionIds = await this.list();
113
- const now = Date.now();
114
- let removed = 0;
115
- for (const sessionId of sessionIds) {
116
- const state = await this.get(sessionId);
117
- if (state && now - state.lastActivity > maxAge) {
118
- await this.delete(sessionId);
119
- removed++;
120
- }
121
- }
122
- return removed;
123
- }
124
- getFilePath(sessionId) {
125
- return `${this.basePath}/${sessionId}.json`;
126
- }
127
- async ensureDirectory() {
128
- try {
129
- await fs.mkdir(this.basePath, { recursive: true });
130
- }
131
- catch (error) {
132
- if (error?.code !== "EEXIST") {
133
- throw error; // Rethrow unexpected errors
134
- }
135
- // Directory already exists, which is fine
136
- }
137
- }
138
- }
139
- export class RedisSessionStorage {
140
- client;
141
- keyPrefix;
142
- constructor(redisClient, keyPrefix = "neurolink:session:") {
143
- this.client = redisClient;
144
- this.keyPrefix = keyPrefix;
145
- }
146
- async get(sessionId) {
147
- try {
148
- const data = await this.client.get(this.getKey(sessionId));
149
- return data ? JSON.parse(data) : null;
150
- }
151
- catch (error) {
152
- console.error("Redis get error:", error);
153
- return null;
154
- }
155
- }
156
- async set(sessionId, state) {
157
- try {
158
- const key = this.getKey(sessionId);
159
- const data = JSON.stringify({
160
- ...state,
161
- lastActivity: Date.now(),
162
- });
163
- await this.client.set(key, data);
164
- // Set TTL if supported
165
- if (this.client.expire) {
166
- await this.client.expire(key, 3600); // 1 hour default
167
- }
168
- }
169
- catch (error) {
170
- console.error("Redis set error:", error);
171
- throw error;
172
- }
173
- }
174
- async delete(sessionId) {
175
- try {
176
- await this.client.del(this.getKey(sessionId));
177
- }
178
- catch (error) {
179
- console.error("Redis delete error:", error);
180
- throw error;
181
- }
182
- }
183
- async list() {
184
- try {
185
- if (!this.client.keys) {
186
- console.warn("Redis client does not support keys operation");
187
- return [];
188
- }
189
- const keys = await this.client.keys(`${this.keyPrefix}*`);
190
- return keys.map((key) => key.replace(this.keyPrefix, ""));
191
- }
192
- catch (error) {
193
- console.error("Redis list error:", error);
194
- return [];
195
- }
196
- }
197
- async cleanup(maxAge) {
198
- const sessionIds = await this.list();
199
- const now = Date.now();
200
- let removed = 0;
201
- for (const sessionId of sessionIds) {
202
- const state = await this.get(sessionId);
203
- if (state && now - state.lastActivity > maxAge) {
204
- await this.delete(sessionId);
205
- removed++;
206
- }
207
- }
208
- return removed;
209
- }
210
- getKey(sessionId) {
211
- return `${this.keyPrefix}${sessionId}`;
212
- }
213
- }
214
- /**
215
- * Session storage factory
216
- */
217
- export class SessionStorageFactory {
218
- static async create(type, options) {
219
- switch (type) {
220
- case "memory":
221
- return new MemorySessionStorage();
222
- case "file":
223
- return await FileSessionStorage.create(options?.basePath);
224
- case "redis":
225
- if (!options?.redisClient) {
226
- throw new Error("Redis client required for Redis storage");
227
- }
228
- return new RedisSessionStorage(options.redisClient, options.keyPrefix);
229
- default:
230
- throw new Error(`Unknown storage type: ${type}`);
231
- }
232
- }
233
- }