@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,301 +0,0 @@
1
- /**
2
- * NeuroLink Session Persistence Layer
3
- * Provides file-based persistence for sessions with atomic writes and recovery
4
- */
5
- import fs from "fs/promises";
6
- import path from "path";
7
- import crypto from "crypto";
8
- /**
9
- * Session Persistence Manager
10
- * Handles saving and loading sessions to/from disk with recovery mechanisms
11
- */
12
- export class SessionPersistence {
13
- directory;
14
- snapshotInterval;
15
- retentionPeriod;
16
- enableChecksum;
17
- maxRetries;
18
- snapshotTimer = null;
19
- sessionMap;
20
- constructor(sessionMap, options = {}) {
21
- this.sessionMap = sessionMap;
22
- this.directory = options.directory || ".neurolink/sessions";
23
- this.snapshotInterval = options.snapshotInterval || 30000; // 30 seconds
24
- this.retentionPeriod = options.retentionPeriod || 86400000; // 24 hours
25
- this.enableChecksum = options.enableChecksum ?? true;
26
- this.maxRetries = options.maxRetries || 3;
27
- }
28
- /**
29
- * Initialize persistence layer
30
- */
31
- async initialize() {
32
- // Create sessions directory if it doesn't exist
33
- await this.ensureDirectory();
34
- // Load existing sessions
35
- await this.loadSessions();
36
- // Start snapshot timer
37
- this.startSnapshotTimer();
38
- if (process.env.NEUROLINK_DEBUG === "true") {
39
- console.log(`[SessionPersistence] Initialized with directory: ${this.directory}`);
40
- }
41
- }
42
- /**
43
- * Ensure sessions directory exists
44
- */
45
- async ensureDirectory() {
46
- await fs.mkdir(this.directory, { recursive: true });
47
- }
48
- /**
49
- * Calculate checksum for data integrity
50
- */
51
- calculateChecksum(data) {
52
- return crypto.createHash("sha256").update(data).digest("hex");
53
- }
54
- /**
55
- * Serialize session to JSON with metadata
56
- */
57
- serializeSession(session) {
58
- // Convert Map to array for JSON serialization
59
- const sessionData = {
60
- ...session,
61
- state: Array.from(session.state.entries()),
62
- };
63
- const fileData = {
64
- session: sessionData,
65
- checksum: "",
66
- version: "1.0",
67
- lastSaved: Date.now(),
68
- };
69
- if (this.enableChecksum) {
70
- // First serialization without checksum
71
- const tempJsonData = JSON.stringify(fileData, null, 2);
72
- // Calculate checksum based on the first serialization
73
- fileData.checksum = this.calculateChecksum(tempJsonData);
74
- }
75
- // Final serialization with checksum included
76
- return JSON.stringify(fileData, null, 2);
77
- }
78
- /**
79
- * Deserialize session from JSON
80
- */
81
- deserializeSession(data) {
82
- try {
83
- const fileData = JSON.parse(data);
84
- // Verify checksum if enabled
85
- if (this.enableChecksum && fileData.checksum) {
86
- const tempData = { ...fileData, checksum: "" };
87
- const expectedChecksum = this.calculateChecksum(JSON.stringify(tempData, null, 2));
88
- if (fileData.checksum !== expectedChecksum) {
89
- console.error("[SessionPersistence] Checksum mismatch, session corrupted");
90
- return null;
91
- }
92
- }
93
- // Convert state array back to Map
94
- const serializedSession = fileData.session;
95
- const session = {
96
- ...serializedSession,
97
- state: new Map(serializedSession.state),
98
- };
99
- return session;
100
- }
101
- catch (error) {
102
- console.error("[SessionPersistence] Failed to deserialize session:", error);
103
- return null;
104
- }
105
- }
106
- /**
107
- * Save single session with atomic write
108
- */
109
- async saveSession(sessionId, session) {
110
- const filename = `${sessionId}.json`;
111
- const filepath = path.join(this.directory, filename);
112
- const tempPath = `${filepath}.tmp`;
113
- let retries = 0;
114
- while (retries < this.maxRetries) {
115
- try {
116
- // Serialize session
117
- const data = this.serializeSession(session);
118
- // Write to temporary file first (atomic write pattern)
119
- await fs.writeFile(tempPath, data, "utf8");
120
- // Rename temp file to final location (atomic operation)
121
- await fs.rename(tempPath, filepath);
122
- if (process.env.NEUROLINK_DEBUG === "true") {
123
- console.log(`[SessionPersistence] Saved session ${sessionId}`);
124
- }
125
- return true;
126
- }
127
- catch (error) {
128
- retries++;
129
- console.error(`[SessionPersistence] Failed to save session (attempt ${retries}):`, error);
130
- // Clean up temp file if it exists
131
- try {
132
- await fs.unlink(tempPath);
133
- }
134
- catch {
135
- // Ignore errors when cleaning up temp file
136
- }
137
- if (retries < this.maxRetries) {
138
- // Exponential backoff
139
- await new Promise((resolve) => setTimeout(resolve, Math.pow(2, retries) * 100));
140
- }
141
- }
142
- }
143
- return false;
144
- }
145
- /**
146
- * Load single session from disk
147
- */
148
- async loadSession(sessionId) {
149
- const filename = `${sessionId}.json`;
150
- const filepath = path.join(this.directory, filename);
151
- try {
152
- const data = await fs.readFile(filepath, "utf8");
153
- return this.deserializeSession(data);
154
- }
155
- catch (error) {
156
- if (error.code !== "ENOENT") {
157
- console.error(`[SessionPersistence] Failed to load session ${sessionId}:`, error);
158
- }
159
- return null;
160
- }
161
- }
162
- /**
163
- * Load all sessions from disk on startup
164
- */
165
- async loadSessions() {
166
- try {
167
- const files = await fs.readdir(this.directory);
168
- const sessionFiles = files.filter((f) => f.endsWith(".json"));
169
- let loaded = 0;
170
- let expired = 0;
171
- for (const file of sessionFiles) {
172
- const sessionId = file.replace(".json", "");
173
- const session = await this.loadSession(sessionId);
174
- if (session) {
175
- // Check if session is expired
176
- if (session.expiresAt < Date.now()) {
177
- expired++;
178
- // Clean up expired session file
179
- await this.deleteSession(sessionId);
180
- }
181
- else {
182
- // Restore to memory
183
- this.sessionMap.set(sessionId, session);
184
- loaded++;
185
- }
186
- }
187
- }
188
- console.log(`[SessionPersistence] Loaded ${loaded} sessions, cleaned ${expired} expired sessions`);
189
- }
190
- catch (error) {
191
- console.error("[SessionPersistence] Failed to load sessions:", error);
192
- }
193
- }
194
- /**
195
- * Save all active sessions (snapshot)
196
- */
197
- async saveAllSessions() {
198
- const sessions = Array.from(this.sessionMap.entries());
199
- // Filter out expired sessions and create save promises
200
- const savePromises = sessions
201
- .filter(([_, session]) => session.expiresAt >= Date.now())
202
- .map(async ([sessionId, session]) => {
203
- return (await this.saveSession(sessionId, session)) ? 1 : 0;
204
- });
205
- // Execute all save operations concurrently
206
- const results = await Promise.all(savePromises);
207
- const saved = results.reduce((sum, result) => sum + result, 0);
208
- if (process.env.NEUROLINK_DEBUG === "true") {
209
- console.log(`[SessionPersistence] Snapshot: saved ${saved}/${sessions.length} sessions`);
210
- }
211
- }
212
- /**
213
- * Delete session file
214
- */
215
- async deleteSession(sessionId) {
216
- const filename = `${sessionId}.json`;
217
- const filepath = path.join(this.directory, filename);
218
- try {
219
- await fs.unlink(filepath);
220
- // Keep memory and disk state in sync
221
- this.sessionMap.delete(sessionId);
222
- }
223
- catch (error) {
224
- if (error.code !== "ENOENT") {
225
- console.error(`[SessionPersistence] Failed to delete session ${sessionId}:`, error);
226
- }
227
- }
228
- }
229
- /**
230
- * Clean up old session files
231
- */
232
- async cleanupOldSessions() {
233
- try {
234
- const files = await fs.readdir(this.directory);
235
- const now = Date.now();
236
- let cleaned = 0;
237
- for (const file of files) {
238
- if (!file.endsWith(".json")) {
239
- continue;
240
- }
241
- const filepath = path.join(this.directory, file);
242
- const stats = await fs.stat(filepath);
243
- // Remove files older than retention period
244
- if (now - stats.mtimeMs > this.retentionPeriod) {
245
- await fs.unlink(filepath);
246
- cleaned++;
247
- }
248
- }
249
- if (cleaned > 0) {
250
- console.log(`[SessionPersistence] Cleaned up ${cleaned} old session files`);
251
- }
252
- }
253
- catch (error) {
254
- console.error("[SessionPersistence] Cleanup failed:", error);
255
- }
256
- }
257
- /**
258
- * Start periodic snapshot timer
259
- */
260
- startSnapshotTimer() {
261
- if (this.snapshotTimer) {
262
- clearInterval(this.snapshotTimer);
263
- }
264
- this.snapshotTimer = setInterval(async () => {
265
- await this.saveAllSessions();
266
- await this.cleanupOldSessions();
267
- }, this.snapshotInterval);
268
- }
269
- /**
270
- * Stop snapshot timer
271
- */
272
- stopSnapshotTimer() {
273
- if (this.snapshotTimer) {
274
- clearInterval(this.snapshotTimer);
275
- this.snapshotTimer = null;
276
- }
277
- }
278
- /**
279
- * Shutdown persistence layer
280
- */
281
- async shutdown() {
282
- this.stopSnapshotTimer();
283
- // Final snapshot before shutdown
284
- await this.saveAllSessions();
285
- console.log("[SessionPersistence] Shutdown complete");
286
- }
287
- }
288
- /**
289
- * Default session persistence instance
290
- */
291
- export let defaultSessionPersistence = null;
292
- /**
293
- * Initialize default session persistence
294
- */
295
- export async function initializeSessionPersistence(sessionMap, options) {
296
- if (!defaultSessionPersistence) {
297
- defaultSessionPersistence = new SessionPersistence(sessionMap, options);
298
- await defaultSessionPersistence.initialize();
299
- }
300
- return defaultSessionPersistence;
301
- }
@@ -1,58 +0,0 @@
1
- /**
2
- * MCP Tool Integration Layer
3
- * Connects MCP tools to NeuroLink AI providers following Lighthouse patterns
4
- */
5
- import type { Unknown } from "../types/common.js";
6
- import type { NeuroLinkExecutionContext, ToolResult } from "./factory.js";
7
- /**
8
- * Tool Integration System
9
- * Provides natural language tool discovery and execution
10
- */
11
- export declare class MCPToolIntegration {
12
- private registry;
13
- private context;
14
- constructor(context?: Partial<NeuroLinkExecutionContext>);
15
- /**
16
- * Initialize tools from all active servers
17
- */
18
- private initializeTools;
19
- /**
20
- * Get all available tools
21
- */
22
- getAvailableTools(): Promise<import("./tool-registry.js").ToolInfo[]>;
23
- /**
24
- * Find tools that match a query
25
- */
26
- findTools(query: string): Promise<Array<{
27
- name: string;
28
- description: string;
29
- serverId: string;
30
- relevance: number;
31
- }>>;
32
- /**
33
- * Execute a tool by name
34
- */
35
- executeTool(toolName: string, params: Unknown, serverId?: string): Promise<ToolResult>;
36
- /**
37
- * Enhance AI prompt with tool context
38
- */
39
- createToolAwarePrompt(userPrompt: string): Promise<string>;
40
- /**
41
- * Analyze AI response for tool usage requests
42
- */
43
- analyzeForToolUsage(aiResponse: string): Array<{
44
- toolName: string;
45
- params: Unknown;
46
- confidence: number;
47
- }>;
48
- /**
49
- * Update context for tool execution
50
- */
51
- updateContext(updates: Partial<NeuroLinkExecutionContext>): void;
52
- }
53
- export declare function getToolIntegration(context?: Partial<NeuroLinkExecutionContext>): MCPToolIntegration;
54
- /**
55
- * Initialize MCP tools for a session
56
- * Following Lighthouse's initialization pattern
57
- */
58
- export declare function initializeMCPTools(sessionId: string, context?: Partial<NeuroLinkExecutionContext>): Promise<MCPToolIntegration>;
@@ -1,203 +0,0 @@
1
- /**
2
- * MCP Tool Integration Layer
3
- * Connects MCP tools to NeuroLink AI providers following Lighthouse patterns
4
- */
5
- import { mcpConfig } from "./config.js";
6
- import { logger } from "../utils/logger.js";
7
- import { MCPToolRegistry } from "./tool-registry.js";
8
- /**
9
- * Tool Integration System
10
- * Provides natural language tool discovery and execution
11
- */
12
- export class MCPToolIntegration {
13
- registry;
14
- context;
15
- constructor(context) {
16
- this.registry = new MCPToolRegistry();
17
- this.context = {
18
- sessionId: context?.sessionId || `session-${Date.now()}`,
19
- userId: context?.userId || "anonymous",
20
- aiProvider: context?.aiProvider || "unknown",
21
- ...context,
22
- // Ensure secureFS is properly typed
23
- secureFS: context?.secureFS || {
24
- readFile: async () => {
25
- throw new Error("secureFS not configured");
26
- },
27
- writeFile: async () => {
28
- throw new Error("secureFS not configured");
29
- },
30
- readdir: async () => {
31
- throw new Error("secureFS not configured");
32
- },
33
- stat: async () => {
34
- throw new Error("secureFS not configured");
35
- },
36
- mkdir: async () => {
37
- throw new Error("secureFS not configured");
38
- },
39
- exists: async () => false,
40
- rmdir: async () => {
41
- throw new Error("secureFS not configured");
42
- },
43
- unlink: async () => {
44
- throw new Error("secureFS not configured");
45
- },
46
- },
47
- };
48
- // Initialize with all active servers
49
- this.initializeTools();
50
- }
51
- /**
52
- * Initialize tools from all active servers
53
- */
54
- async initializeTools() {
55
- const servers = await mcpConfig.getServers();
56
- for (const server of servers) {
57
- await this.registry.registerServer(server.id ||
58
- server.name ||
59
- "unknown", server);
60
- }
61
- const tools = await this.registry.listTools();
62
- logger.debug("[Tool Integration] Initialized with servers:", {
63
- serverCount: servers.length,
64
- toolCount: tools.length,
65
- });
66
- }
67
- /**
68
- * Get all available tools
69
- */
70
- getAvailableTools() {
71
- return this.registry.listTools();
72
- }
73
- /**
74
- * Find tools that match a query
75
- */
76
- async findTools(query) {
77
- const allTools = await this.registry.listTools();
78
- const queryLower = query.toLowerCase();
79
- const results = [];
80
- for (const toolInfo of allTools) {
81
- let relevance = 0;
82
- // Check tool name
83
- if (toolInfo.name.toLowerCase().includes(queryLower)) {
84
- relevance += 10;
85
- }
86
- // Check tool description
87
- if (toolInfo.description?.toLowerCase().includes(queryLower)) {
88
- relevance += 5;
89
- }
90
- // Check category if present (category might not exist on ToolInfo)
91
- // if (toolInfo.category?.toLowerCase().includes(queryLower)) {
92
- // relevance += 3;
93
- // }
94
- if (relevance > 0) {
95
- results.push({
96
- name: toolInfo.name,
97
- description: toolInfo.description || "No description available",
98
- serverId: toolInfo.serverId || "unknown",
99
- relevance,
100
- });
101
- }
102
- }
103
- // Sort by relevance
104
- return results.sort((a, b) => b.relevance - a.relevance);
105
- }
106
- /**
107
- * Execute a tool by name
108
- */
109
- async executeTool(toolName, params, serverId) {
110
- try {
111
- // If serverId is provided, use qualified name
112
- const qualifiedName = serverId ? `${serverId}.${toolName}` : toolName;
113
- const result = await this.registry.executeTool(qualifiedName, params, this.context);
114
- return result;
115
- }
116
- catch (error) {
117
- logger.error("[Tool Integration] Tool execution failed:", error);
118
- return {
119
- success: false,
120
- error: error instanceof Error ? error.message : String(error),
121
- metadata: {
122
- toolName,
123
- serverId,
124
- timestamp: Date.now(),
125
- },
126
- };
127
- }
128
- }
129
- /**
130
- * Enhance AI prompt with tool context
131
- */
132
- async createToolAwarePrompt(userPrompt) {
133
- const tools = await this.getAvailableTools();
134
- const toolDescriptions = tools
135
- .map((t) => `- ${t.name}: ${t.description}`)
136
- .join("\n");
137
- return `${userPrompt}
138
-
139
- Available tools:
140
- ${toolDescriptions}
141
-
142
- You can use these tools to provide more accurate and real-time information.`;
143
- }
144
- /**
145
- * Analyze AI response for tool usage requests
146
- */
147
- analyzeForToolUsage(aiResponse) {
148
- const toolRequests = [];
149
- // Simple pattern matching for tool requests
150
- // This can be enhanced with more sophisticated NLP
151
- const toolPattern = /<tool[^>]*>([^<]+)<\/tool>/g;
152
- let match;
153
- while ((match = toolPattern.exec(aiResponse)) !== null) {
154
- try {
155
- const toolData = JSON.parse(match[1]);
156
- toolRequests.push({
157
- toolName: toolData.name,
158
- params: toolData.params || {},
159
- confidence: 1.0,
160
- });
161
- }
162
- catch (error) {
163
- logger.warn("[Tool Integration] Failed to parse tool request:", match[1]);
164
- }
165
- }
166
- return toolRequests;
167
- }
168
- /**
169
- * Update context for tool execution
170
- */
171
- updateContext(updates) {
172
- this.context = {
173
- ...this.context,
174
- ...updates,
175
- };
176
- }
177
- }
178
- /**
179
- * Create a global tool integration instance
180
- * This can be initialized once and reused
181
- */
182
- let globalToolIntegration = null;
183
- export function getToolIntegration(context) {
184
- if (!globalToolIntegration) {
185
- globalToolIntegration = new MCPToolIntegration(context);
186
- }
187
- else if (context) {
188
- globalToolIntegration.updateContext(context);
189
- }
190
- return globalToolIntegration;
191
- }
192
- /**
193
- * Initialize MCP tools for a session
194
- * Following Lighthouse's initialization pattern
195
- */
196
- export async function initializeMCPTools(sessionId, context) {
197
- const integration = getToolIntegration({
198
- sessionId,
199
- ...context,
200
- });
201
- logger.debug("[Tool Integration] MCP tools initialized for session:", sessionId);
202
- return integration;
203
- }