@juspay/neurolink 6.1.0 → 6.2.1

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 (303) hide show
  1. package/CHANGELOG.md +16 -6
  2. package/dist/agent/direct-tools.js +6 -5
  3. package/dist/cli/commands/config.d.ts +13 -13
  4. package/dist/cli/index.js +3 -9
  5. package/dist/config/configManager.js +11 -10
  6. package/dist/core/analytics.d.ts +11 -1
  7. package/dist/core/analytics.js +2 -2
  8. package/dist/core/base-provider.js +4 -18
  9. package/dist/core/dynamic-models.d.ts +8 -8
  10. package/dist/core/factory.js +3 -11
  11. package/dist/index.d.ts +2 -4
  12. package/dist/index.js +2 -11
  13. package/dist/lib/agent/direct-tools.js +6 -5
  14. package/dist/lib/config/configManager.js +11 -10
  15. package/dist/lib/core/analytics.d.ts +11 -1
  16. package/dist/lib/core/analytics.js +2 -2
  17. package/dist/lib/core/base-provider.js +4 -18
  18. package/dist/lib/core/dynamic-models.d.ts +8 -8
  19. package/dist/lib/core/factory.js +3 -11
  20. package/dist/lib/index.d.ts +2 -4
  21. package/dist/lib/index.js +2 -11
  22. package/dist/lib/mcp/factory.d.ts +1 -1
  23. package/dist/lib/mcp/index.d.ts +9 -21
  24. package/dist/lib/mcp/index.js +16 -57
  25. package/dist/lib/mcp/registry.js +1 -1
  26. package/dist/lib/mcp/servers/ai-providers/ai-analysis-tools.js +2 -1
  27. package/dist/lib/mcp/tool-registry.js +1 -1
  28. package/dist/lib/neurolink.d.ts +1 -9
  29. package/dist/lib/neurolink.js +22 -71
  30. package/dist/lib/providers/amazon-bedrock.js +5 -16
  31. package/dist/lib/providers/anthropic-baseprovider.js +3 -21
  32. package/dist/lib/providers/anthropic.js +4 -7
  33. package/dist/lib/providers/azure-openai.js +6 -3
  34. package/dist/lib/providers/google-vertex.js +5 -9
  35. package/dist/lib/providers/huggingFace.js +5 -10
  36. package/dist/lib/providers/mistral.js +5 -8
  37. package/dist/lib/providers/openAI.js +4 -7
  38. package/dist/lib/telemetry/index.js +2 -1
  39. package/dist/lib/utils/logger.d.ts +62 -2
  40. package/dist/lib/utils/logger.js +174 -9
  41. package/dist/lib/utils/providerConfig.d.ts +117 -0
  42. package/dist/lib/utils/providerConfig.js +353 -0
  43. package/dist/lib/utils/providerUtils.d.ts +2 -1
  44. package/dist/lib/utils/providerUtils.js +53 -36
  45. package/dist/lib/utils/timeout.d.ts +72 -1
  46. package/dist/lib/utils/timeout.js +203 -2
  47. package/dist/mcp/factory.d.ts +1 -1
  48. package/dist/mcp/index.d.ts +9 -21
  49. package/dist/mcp/index.js +16 -57
  50. package/dist/mcp/registry.js +1 -1
  51. package/dist/mcp/servers/ai-providers/ai-analysis-tools.js +2 -1
  52. package/dist/mcp/tool-registry.js +1 -1
  53. package/dist/neurolink.d.ts +1 -9
  54. package/dist/neurolink.js +22 -71
  55. package/dist/providers/amazon-bedrock.js +5 -16
  56. package/dist/providers/anthropic-baseprovider.js +3 -21
  57. package/dist/providers/anthropic.js +4 -7
  58. package/dist/providers/azure-openai.js +6 -3
  59. package/dist/providers/google-vertex.js +5 -9
  60. package/dist/providers/huggingFace.js +5 -10
  61. package/dist/providers/mistral.js +5 -8
  62. package/dist/providers/openAI.js +4 -7
  63. package/dist/telemetry/index.js +2 -1
  64. package/dist/utils/logger.d.ts +62 -2
  65. package/dist/utils/logger.js +174 -9
  66. package/dist/utils/providerConfig.d.ts +117 -0
  67. package/dist/utils/providerConfig.js +353 -0
  68. package/dist/utils/providerUtils.d.ts +2 -1
  69. package/dist/utils/providerUtils.js +53 -36
  70. package/dist/utils/timeout.d.ts +72 -1
  71. package/dist/utils/timeout.js +203 -2
  72. package/package.json +1 -1
  73. package/dist/chat/client-utils.d.ts +0 -95
  74. package/dist/chat/client-utils.js +0 -315
  75. package/dist/chat/index.d.ts +0 -24
  76. package/dist/chat/index.js +0 -33
  77. package/dist/chat/session-storage.d.ts +0 -77
  78. package/dist/chat/session-storage.js +0 -233
  79. package/dist/chat/session.d.ts +0 -96
  80. package/dist/chat/session.js +0 -257
  81. package/dist/chat/sse-handler.d.ts +0 -49
  82. package/dist/chat/sse-handler.js +0 -259
  83. package/dist/chat/types.d.ts +0 -74
  84. package/dist/chat/types.js +0 -5
  85. package/dist/chat/websocket-chat-handler.d.ts +0 -37
  86. package/dist/chat/websocket-chat-handler.js +0 -262
  87. package/dist/cli/commands/mcp.d.ts +0 -20
  88. package/dist/cli/commands/mcp.js +0 -1272
  89. package/dist/core/defaults.d.ts +0 -19
  90. package/dist/core/defaults.js +0 -29
  91. package/dist/core/evaluation-config.d.ts +0 -29
  92. package/dist/core/evaluation-config.js +0 -144
  93. package/dist/factories/compatibility-factory.d.ts +0 -35
  94. package/dist/factories/compatibility-factory.js +0 -71
  95. package/dist/factories/provider-generate-factory.d.ts +0 -20
  96. package/dist/factories/provider-generate-factory.js +0 -93
  97. package/dist/lib/chat/client-utils.d.ts +0 -95
  98. package/dist/lib/chat/client-utils.js +0 -315
  99. package/dist/lib/chat/index.d.ts +0 -24
  100. package/dist/lib/chat/index.js +0 -33
  101. package/dist/lib/chat/session-storage.d.ts +0 -77
  102. package/dist/lib/chat/session-storage.js +0 -233
  103. package/dist/lib/chat/session.d.ts +0 -96
  104. package/dist/lib/chat/session.js +0 -257
  105. package/dist/lib/chat/sse-handler.d.ts +0 -49
  106. package/dist/lib/chat/sse-handler.js +0 -259
  107. package/dist/lib/chat/types.d.ts +0 -74
  108. package/dist/lib/chat/types.js +0 -5
  109. package/dist/lib/chat/websocket-chat-handler.d.ts +0 -37
  110. package/dist/lib/chat/websocket-chat-handler.js +0 -262
  111. package/dist/lib/core/defaults.d.ts +0 -19
  112. package/dist/lib/core/defaults.js +0 -29
  113. package/dist/lib/core/evaluation-config.d.ts +0 -29
  114. package/dist/lib/core/evaluation-config.js +0 -144
  115. package/dist/lib/factories/compatibility-factory.d.ts +0 -35
  116. package/dist/lib/factories/compatibility-factory.js +0 -71
  117. package/dist/lib/factories/provider-generate-factory.d.ts +0 -20
  118. package/dist/lib/factories/provider-generate-factory.js +0 -93
  119. package/dist/lib/mcp/adapters/plugin-bridge.d.ts +0 -40
  120. package/dist/lib/mcp/adapters/plugin-bridge.js +0 -89
  121. package/dist/lib/mcp/auto-discovery.d.ts +0 -62
  122. package/dist/lib/mcp/auto-discovery.js +0 -149
  123. package/dist/lib/mcp/client.d.ts +0 -68
  124. package/dist/lib/mcp/client.js +0 -248
  125. package/dist/lib/mcp/config.d.ts +0 -31
  126. package/dist/lib/mcp/config.js +0 -99
  127. package/dist/lib/mcp/context-manager.d.ts +0 -171
  128. package/dist/lib/mcp/context-manager.js +0 -362
  129. package/dist/lib/mcp/contracts/mcp-contract.d.ts +0 -169
  130. package/dist/lib/mcp/contracts/mcp-contract.js +0 -58
  131. package/dist/lib/mcp/core/plugin-manager.d.ts +0 -46
  132. package/dist/lib/mcp/core/plugin-manager.js +0 -110
  133. package/dist/lib/mcp/demo/plugin-demo.d.ts +0 -20
  134. package/dist/lib/mcp/demo/plugin-demo.js +0 -118
  135. package/dist/lib/mcp/dynamic-chain-executor.d.ts +0 -225
  136. package/dist/lib/mcp/dynamic-chain-executor.js +0 -489
  137. package/dist/lib/mcp/dynamic-orchestrator.d.ts +0 -115
  138. package/dist/lib/mcp/dynamic-orchestrator.js +0 -351
  139. package/dist/lib/mcp/ecosystem.d.ts +0 -75
  140. package/dist/lib/mcp/ecosystem.js +0 -161
  141. package/dist/lib/mcp/error-manager.d.ts +0 -254
  142. package/dist/lib/mcp/error-manager.js +0 -501
  143. package/dist/lib/mcp/error-recovery.d.ts +0 -159
  144. package/dist/lib/mcp/error-recovery.js +0 -405
  145. package/dist/lib/mcp/external-client.d.ts +0 -88
  146. package/dist/lib/mcp/external-client.js +0 -331
  147. package/dist/lib/mcp/external-manager.d.ts +0 -112
  148. package/dist/lib/mcp/external-manager.js +0 -308
  149. package/dist/lib/mcp/function-calling.d.ts +0 -65
  150. package/dist/lib/mcp/function-calling.js +0 -642
  151. package/dist/lib/mcp/health-monitor.d.ts +0 -257
  152. package/dist/lib/mcp/health-monitor.js +0 -630
  153. package/dist/lib/mcp/initialize-tools.d.ts +0 -29
  154. package/dist/lib/mcp/initialize-tools.js +0 -261
  155. package/dist/lib/mcp/initialize.d.ts +0 -18
  156. package/dist/lib/mcp/initialize.js +0 -62
  157. package/dist/lib/mcp/logging.d.ts +0 -38
  158. package/dist/lib/mcp/logging.js +0 -100
  159. package/dist/lib/mcp/manager.d.ts +0 -68
  160. package/dist/lib/mcp/manager.js +0 -176
  161. package/dist/lib/mcp/neurolink-mcp-client.d.ts +0 -97
  162. package/dist/lib/mcp/neurolink-mcp-client.js +0 -462
  163. package/dist/lib/mcp/orchestrator.d.ts +0 -302
  164. package/dist/lib/mcp/orchestrator.js +0 -703
  165. package/dist/lib/mcp/plugin-manager.d.ts +0 -98
  166. package/dist/lib/mcp/plugin-manager.js +0 -296
  167. package/dist/lib/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
  168. package/dist/lib/mcp/plugins/core/filesystem-mcp.js +0 -142
  169. package/dist/lib/mcp/plugins/filesystem-mcp.d.ts +0 -37
  170. package/dist/lib/mcp/plugins/filesystem-mcp.js +0 -54
  171. package/dist/lib/mcp/security-manager.d.ts +0 -87
  172. package/dist/lib/mcp/security-manager.js +0 -344
  173. package/dist/lib/mcp/semaphore-manager.d.ts +0 -137
  174. package/dist/lib/mcp/semaphore-manager.js +0 -329
  175. package/dist/lib/mcp/session-manager.d.ts +0 -187
  176. package/dist/lib/mcp/session-manager.js +0 -400
  177. package/dist/lib/mcp/session-persistence.d.ts +0 -93
  178. package/dist/lib/mcp/session-persistence.js +0 -301
  179. package/dist/lib/mcp/tool-integration.d.ts +0 -58
  180. package/dist/lib/mcp/tool-integration.js +0 -203
  181. package/dist/lib/mcp/transport-manager.d.ts +0 -154
  182. package/dist/lib/mcp/transport-manager.js +0 -334
  183. package/dist/lib/mcp/unified-mcp.d.ts +0 -133
  184. package/dist/lib/mcp/unified-mcp.js +0 -251
  185. package/dist/lib/mcp/unified-registry.d.ts +0 -165
  186. package/dist/lib/mcp/unified-registry.js +0 -538
  187. package/dist/lib/providers/analytics-helper.d.ts +0 -38
  188. package/dist/lib/providers/analytics-helper.js +0 -216
  189. package/dist/lib/providers/function-calling-provider.d.ts +0 -142
  190. package/dist/lib/providers/function-calling-provider.js +0 -630
  191. package/dist/lib/providers/mcp-provider.d.ts +0 -75
  192. package/dist/lib/providers/mcp-provider.js +0 -283
  193. package/dist/lib/providers/timeout-wrapper.d.ts +0 -40
  194. package/dist/lib/providers/timeout-wrapper.js +0 -100
  195. package/dist/lib/sdk/tool-extension.d.ts +0 -181
  196. package/dist/lib/sdk/tool-extension.js +0 -284
  197. package/dist/lib/services/streaming/streaming-manager.d.ts +0 -29
  198. package/dist/lib/services/streaming/streaming-manager.js +0 -245
  199. package/dist/lib/services/types.d.ts +0 -156
  200. package/dist/lib/services/types.js +0 -2
  201. package/dist/lib/services/websocket/websocket-server.d.ts +0 -34
  202. package/dist/lib/services/websocket/websocket-server.js +0 -305
  203. package/dist/lib/utils/provider-validation.d.ts +0 -36
  204. package/dist/lib/utils/provider-validation.js +0 -625
  205. package/dist/lib/utils/providerUtils-fixed.d.ts +0 -8
  206. package/dist/lib/utils/providerUtils-fixed.js +0 -94
  207. package/dist/lib/utils/streaming-utils.d.ts +0 -79
  208. package/dist/lib/utils/streaming-utils.js +0 -198
  209. package/dist/lib/utils/timeout-manager.d.ts +0 -75
  210. package/dist/lib/utils/timeout-manager.js +0 -244
  211. package/dist/mcp/adapters/plugin-bridge.d.ts +0 -40
  212. package/dist/mcp/adapters/plugin-bridge.js +0 -89
  213. package/dist/mcp/auto-discovery.d.ts +0 -62
  214. package/dist/mcp/auto-discovery.js +0 -149
  215. package/dist/mcp/client.d.ts +0 -68
  216. package/dist/mcp/client.js +0 -248
  217. package/dist/mcp/config.d.ts +0 -31
  218. package/dist/mcp/config.js +0 -99
  219. package/dist/mcp/context-manager.d.ts +0 -171
  220. package/dist/mcp/context-manager.js +0 -362
  221. package/dist/mcp/contracts/mcp-contract.d.ts +0 -169
  222. package/dist/mcp/contracts/mcp-contract.js +0 -58
  223. package/dist/mcp/core/plugin-manager.d.ts +0 -46
  224. package/dist/mcp/core/plugin-manager.js +0 -110
  225. package/dist/mcp/demo/plugin-demo.d.ts +0 -20
  226. package/dist/mcp/demo/plugin-demo.js +0 -118
  227. package/dist/mcp/dynamic-chain-executor.d.ts +0 -225
  228. package/dist/mcp/dynamic-chain-executor.js +0 -489
  229. package/dist/mcp/dynamic-orchestrator.d.ts +0 -115
  230. package/dist/mcp/dynamic-orchestrator.js +0 -351
  231. package/dist/mcp/ecosystem.d.ts +0 -75
  232. package/dist/mcp/ecosystem.js +0 -162
  233. package/dist/mcp/error-manager.d.ts +0 -254
  234. package/dist/mcp/error-manager.js +0 -501
  235. package/dist/mcp/error-recovery.d.ts +0 -159
  236. package/dist/mcp/error-recovery.js +0 -405
  237. package/dist/mcp/external-client.d.ts +0 -88
  238. package/dist/mcp/external-client.js +0 -331
  239. package/dist/mcp/external-manager.d.ts +0 -112
  240. package/dist/mcp/external-manager.js +0 -308
  241. package/dist/mcp/function-calling.d.ts +0 -65
  242. package/dist/mcp/function-calling.js +0 -642
  243. package/dist/mcp/health-monitor.d.ts +0 -257
  244. package/dist/mcp/health-monitor.js +0 -630
  245. package/dist/mcp/initialize-tools.d.ts +0 -29
  246. package/dist/mcp/initialize-tools.js +0 -262
  247. package/dist/mcp/initialize.d.ts +0 -18
  248. package/dist/mcp/initialize.js +0 -62
  249. package/dist/mcp/logging.d.ts +0 -38
  250. package/dist/mcp/logging.js +0 -100
  251. package/dist/mcp/manager.d.ts +0 -68
  252. package/dist/mcp/manager.js +0 -176
  253. package/dist/mcp/neurolink-mcp-client.d.ts +0 -97
  254. package/dist/mcp/neurolink-mcp-client.js +0 -462
  255. package/dist/mcp/orchestrator.d.ts +0 -302
  256. package/dist/mcp/orchestrator.js +0 -703
  257. package/dist/mcp/plugin-manager.d.ts +0 -98
  258. package/dist/mcp/plugin-manager.js +0 -297
  259. package/dist/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
  260. package/dist/mcp/plugins/core/filesystem-mcp.js +0 -142
  261. package/dist/mcp/plugins/core/neurolink-mcp.json +0 -17
  262. package/dist/mcp/plugins/filesystem-mcp.d.ts +0 -37
  263. package/dist/mcp/plugins/filesystem-mcp.js +0 -54
  264. package/dist/mcp/security-manager.d.ts +0 -87
  265. package/dist/mcp/security-manager.js +0 -344
  266. package/dist/mcp/semaphore-manager.d.ts +0 -137
  267. package/dist/mcp/semaphore-manager.js +0 -329
  268. package/dist/mcp/session-manager.d.ts +0 -187
  269. package/dist/mcp/session-manager.js +0 -400
  270. package/dist/mcp/session-persistence.d.ts +0 -93
  271. package/dist/mcp/session-persistence.js +0 -302
  272. package/dist/mcp/tool-integration.d.ts +0 -58
  273. package/dist/mcp/tool-integration.js +0 -203
  274. package/dist/mcp/transport-manager.d.ts +0 -154
  275. package/dist/mcp/transport-manager.js +0 -335
  276. package/dist/mcp/unified-mcp.d.ts +0 -133
  277. package/dist/mcp/unified-mcp.js +0 -251
  278. package/dist/mcp/unified-registry.d.ts +0 -165
  279. package/dist/mcp/unified-registry.js +0 -539
  280. package/dist/providers/analytics-helper.d.ts +0 -38
  281. package/dist/providers/analytics-helper.js +0 -216
  282. package/dist/providers/function-calling-provider.d.ts +0 -142
  283. package/dist/providers/function-calling-provider.js +0 -630
  284. package/dist/providers/mcp-provider.d.ts +0 -75
  285. package/dist/providers/mcp-provider.js +0 -283
  286. package/dist/providers/timeout-wrapper.d.ts +0 -40
  287. package/dist/providers/timeout-wrapper.js +0 -100
  288. package/dist/sdk/tool-extension.d.ts +0 -181
  289. package/dist/sdk/tool-extension.js +0 -284
  290. package/dist/services/streaming/streaming-manager.d.ts +0 -29
  291. package/dist/services/streaming/streaming-manager.js +0 -245
  292. package/dist/services/types.d.ts +0 -156
  293. package/dist/services/types.js +0 -2
  294. package/dist/services/websocket/websocket-server.d.ts +0 -34
  295. package/dist/services/websocket/websocket-server.js +0 -306
  296. package/dist/utils/provider-validation.d.ts +0 -36
  297. package/dist/utils/provider-validation.js +0 -625
  298. package/dist/utils/providerUtils-fixed.d.ts +0 -8
  299. package/dist/utils/providerUtils-fixed.js +0 -94
  300. package/dist/utils/streaming-utils.d.ts +0 -79
  301. package/dist/utils/streaming-utils.js +0 -198
  302. package/dist/utils/timeout-manager.d.ts +0 -75
  303. 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
- }