@juspay/neurolink 5.0.0 → 5.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 (214) hide show
  1. package/CHANGELOG.md +20 -7
  2. package/README.md +160 -172
  3. package/dist/agent/direct-tools.d.ts +6 -6
  4. package/dist/chat/sse-handler.js +5 -4
  5. package/dist/chat/websocket-chat-handler.js +9 -9
  6. package/dist/cli/commands/config.d.ts +3 -3
  7. package/dist/cli/commands/mcp.js +9 -8
  8. package/dist/cli/commands/ollama.js +3 -3
  9. package/dist/cli/factories/command-factory.d.ts +18 -0
  10. package/dist/cli/factories/command-factory.js +183 -0
  11. package/dist/cli/index.js +105 -157
  12. package/dist/cli/utils/interactive-setup.js +2 -2
  13. package/dist/core/base-provider.d.ts +423 -0
  14. package/dist/core/base-provider.js +365 -0
  15. package/dist/core/constants.d.ts +1 -1
  16. package/dist/core/constants.js +1 -1
  17. package/dist/core/dynamic-models.d.ts +6 -6
  18. package/dist/core/evaluation.d.ts +19 -80
  19. package/dist/core/evaluation.js +185 -484
  20. package/dist/core/factory.d.ts +3 -3
  21. package/dist/core/factory.js +31 -91
  22. package/dist/core/service-registry.d.ts +47 -0
  23. package/dist/core/service-registry.js +112 -0
  24. package/dist/core/types.d.ts +49 -49
  25. package/dist/core/types.js +1 -0
  26. package/dist/factories/compatibility-factory.d.ts +20 -0
  27. package/dist/factories/compatibility-factory.js +69 -0
  28. package/dist/factories/provider-factory.d.ts +72 -0
  29. package/dist/factories/provider-factory.js +144 -0
  30. package/dist/factories/provider-generate-factory.d.ts +20 -0
  31. package/dist/factories/provider-generate-factory.js +87 -0
  32. package/dist/factories/provider-registry.d.ts +38 -0
  33. package/dist/factories/provider-registry.js +107 -0
  34. package/dist/index.d.ts +8 -5
  35. package/dist/index.js +5 -5
  36. package/dist/lib/agent/direct-tools.d.ts +6 -6
  37. package/dist/lib/chat/sse-handler.js +5 -4
  38. package/dist/lib/chat/websocket-chat-handler.js +9 -9
  39. package/dist/lib/core/base-provider.d.ts +423 -0
  40. package/dist/lib/core/base-provider.js +365 -0
  41. package/dist/lib/core/constants.d.ts +1 -1
  42. package/dist/lib/core/constants.js +1 -1
  43. package/dist/lib/core/dynamic-models.d.ts +6 -6
  44. package/dist/lib/core/evaluation.d.ts +19 -80
  45. package/dist/lib/core/evaluation.js +185 -484
  46. package/dist/lib/core/factory.d.ts +3 -3
  47. package/dist/lib/core/factory.js +30 -91
  48. package/dist/lib/core/service-registry.d.ts +47 -0
  49. package/dist/lib/core/service-registry.js +112 -0
  50. package/dist/lib/core/types.d.ts +49 -49
  51. package/dist/lib/core/types.js +1 -0
  52. package/dist/lib/factories/compatibility-factory.d.ts +20 -0
  53. package/dist/lib/factories/compatibility-factory.js +69 -0
  54. package/dist/lib/factories/provider-factory.d.ts +72 -0
  55. package/dist/lib/factories/provider-factory.js +144 -0
  56. package/dist/lib/factories/provider-generate-factory.d.ts +20 -0
  57. package/dist/lib/factories/provider-generate-factory.js +87 -0
  58. package/dist/lib/factories/provider-registry.d.ts +38 -0
  59. package/dist/lib/factories/provider-registry.js +107 -0
  60. package/dist/lib/index.d.ts +8 -5
  61. package/dist/lib/index.js +5 -5
  62. package/dist/lib/mcp/client.js +5 -5
  63. package/dist/lib/mcp/config.js +28 -3
  64. package/dist/lib/mcp/dynamic-orchestrator.js +8 -8
  65. package/dist/lib/mcp/external-client.js +2 -2
  66. package/dist/lib/mcp/factory.d.ts +1 -1
  67. package/dist/lib/mcp/factory.js +1 -1
  68. package/dist/lib/mcp/function-calling.js +1 -1
  69. package/dist/lib/mcp/initialize-tools.d.ts +1 -1
  70. package/dist/lib/mcp/initialize-tools.js +45 -1
  71. package/dist/lib/mcp/initialize.js +16 -6
  72. package/dist/lib/mcp/neurolink-mcp-client.js +10 -10
  73. package/dist/lib/mcp/orchestrator.js +4 -4
  74. package/dist/lib/mcp/servers/agent/direct-tools-server.d.ts +8 -0
  75. package/dist/lib/mcp/servers/agent/direct-tools-server.js +109 -0
  76. package/dist/lib/mcp/servers/ai-providers/ai-analysis-tools.js +10 -10
  77. package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +8 -6
  78. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  79. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.js +16 -16
  80. package/dist/lib/mcp/unified-registry.d.ts +4 -0
  81. package/dist/lib/mcp/unified-registry.js +42 -9
  82. package/dist/lib/neurolink.d.ts +161 -174
  83. package/dist/lib/neurolink.js +723 -397
  84. package/dist/lib/providers/amazon-bedrock.d.ts +32 -0
  85. package/dist/lib/providers/amazon-bedrock.js +143 -0
  86. package/dist/lib/providers/analytics-helper.js +7 -4
  87. package/dist/lib/providers/anthropic-baseprovider.d.ts +23 -0
  88. package/dist/lib/providers/anthropic-baseprovider.js +114 -0
  89. package/dist/lib/providers/anthropic.d.ts +19 -39
  90. package/dist/lib/providers/anthropic.js +84 -378
  91. package/dist/lib/providers/azure-openai.d.ts +20 -0
  92. package/dist/lib/providers/azure-openai.js +89 -0
  93. package/dist/lib/providers/function-calling-provider.d.ts +14 -12
  94. package/dist/lib/providers/function-calling-provider.js +114 -64
  95. package/dist/lib/providers/google-ai-studio.d.ts +23 -0
  96. package/dist/lib/providers/google-ai-studio.js +107 -0
  97. package/dist/lib/providers/google-vertex.d.ts +47 -0
  98. package/dist/lib/providers/google-vertex.js +205 -0
  99. package/dist/lib/providers/huggingFace.d.ts +33 -27
  100. package/dist/lib/providers/huggingFace.js +103 -400
  101. package/dist/lib/providers/index.d.ts +9 -9
  102. package/dist/lib/providers/index.js +9 -9
  103. package/dist/lib/providers/mcp-provider.d.ts +13 -8
  104. package/dist/lib/providers/mcp-provider.js +63 -18
  105. package/dist/lib/providers/mistral.d.ts +42 -0
  106. package/dist/lib/providers/mistral.js +160 -0
  107. package/dist/lib/providers/ollama.d.ts +52 -35
  108. package/dist/lib/providers/ollama.js +297 -477
  109. package/dist/lib/providers/openAI.d.ts +21 -21
  110. package/dist/lib/providers/openAI.js +81 -245
  111. package/dist/lib/sdk/tool-extension.d.ts +181 -0
  112. package/dist/lib/sdk/tool-extension.js +283 -0
  113. package/dist/lib/sdk/tool-registration.d.ts +95 -0
  114. package/dist/lib/sdk/tool-registration.js +167 -0
  115. package/dist/lib/types/generate-types.d.ts +80 -0
  116. package/dist/lib/types/generate-types.js +1 -0
  117. package/dist/lib/types/mcp-types.d.ts +116 -0
  118. package/dist/lib/types/mcp-types.js +5 -0
  119. package/dist/lib/types/stream-types.d.ts +95 -0
  120. package/dist/lib/types/stream-types.js +1 -0
  121. package/dist/lib/types/universal-provider-options.d.ts +87 -0
  122. package/dist/lib/types/universal-provider-options.js +53 -0
  123. package/dist/lib/utils/providerUtils-fixed.js +1 -1
  124. package/dist/lib/utils/streaming-utils.d.ts +14 -2
  125. package/dist/lib/utils/streaming-utils.js +0 -3
  126. package/dist/mcp/client.js +5 -5
  127. package/dist/mcp/config.js +28 -3
  128. package/dist/mcp/dynamic-orchestrator.js +8 -8
  129. package/dist/mcp/external-client.js +2 -2
  130. package/dist/mcp/factory.d.ts +1 -1
  131. package/dist/mcp/factory.js +1 -1
  132. package/dist/mcp/function-calling.js +1 -1
  133. package/dist/mcp/initialize-tools.d.ts +1 -1
  134. package/dist/mcp/initialize-tools.js +45 -1
  135. package/dist/mcp/initialize.js +16 -6
  136. package/dist/mcp/neurolink-mcp-client.js +10 -10
  137. package/dist/mcp/orchestrator.js +4 -4
  138. package/dist/mcp/servers/agent/direct-tools-server.d.ts +8 -0
  139. package/dist/mcp/servers/agent/direct-tools-server.js +109 -0
  140. package/dist/mcp/servers/ai-providers/ai-analysis-tools.js +10 -10
  141. package/dist/mcp/servers/ai-providers/ai-core-server.js +8 -6
  142. package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  143. package/dist/mcp/servers/ai-providers/ai-workflow-tools.js +16 -16
  144. package/dist/mcp/unified-registry.d.ts +4 -0
  145. package/dist/mcp/unified-registry.js +42 -9
  146. package/dist/neurolink.d.ts +161 -174
  147. package/dist/neurolink.js +723 -397
  148. package/dist/providers/amazon-bedrock.d.ts +32 -0
  149. package/dist/providers/amazon-bedrock.js +143 -0
  150. package/dist/providers/analytics-helper.js +7 -4
  151. package/dist/providers/anthropic-baseprovider.d.ts +23 -0
  152. package/dist/providers/anthropic-baseprovider.js +114 -0
  153. package/dist/providers/anthropic.d.ts +19 -39
  154. package/dist/providers/anthropic.js +83 -377
  155. package/dist/providers/azure-openai.d.ts +20 -0
  156. package/dist/providers/azure-openai.js +89 -0
  157. package/dist/providers/function-calling-provider.d.ts +14 -12
  158. package/dist/providers/function-calling-provider.js +114 -64
  159. package/dist/providers/google-ai-studio.d.ts +23 -0
  160. package/dist/providers/google-ai-studio.js +108 -0
  161. package/dist/providers/google-vertex.d.ts +47 -0
  162. package/dist/providers/google-vertex.js +205 -0
  163. package/dist/providers/huggingFace.d.ts +33 -27
  164. package/dist/providers/huggingFace.js +102 -399
  165. package/dist/providers/index.d.ts +9 -9
  166. package/dist/providers/index.js +9 -9
  167. package/dist/providers/mcp-provider.d.ts +13 -8
  168. package/dist/providers/mcp-provider.js +63 -18
  169. package/dist/providers/mistral.d.ts +42 -0
  170. package/dist/providers/mistral.js +160 -0
  171. package/dist/providers/ollama.d.ts +52 -35
  172. package/dist/providers/ollama.js +297 -476
  173. package/dist/providers/openAI.d.ts +21 -21
  174. package/dist/providers/openAI.js +81 -246
  175. package/dist/sdk/tool-extension.d.ts +181 -0
  176. package/dist/sdk/tool-extension.js +283 -0
  177. package/dist/sdk/tool-registration.d.ts +95 -0
  178. package/dist/sdk/tool-registration.js +168 -0
  179. package/dist/types/generate-types.d.ts +80 -0
  180. package/dist/types/generate-types.js +1 -0
  181. package/dist/types/mcp-types.d.ts +116 -0
  182. package/dist/types/mcp-types.js +5 -0
  183. package/dist/types/stream-types.d.ts +95 -0
  184. package/dist/types/stream-types.js +1 -0
  185. package/dist/types/universal-provider-options.d.ts +87 -0
  186. package/dist/types/universal-provider-options.js +53 -0
  187. package/dist/utils/providerUtils-fixed.js +1 -1
  188. package/dist/utils/streaming-utils.d.ts +14 -2
  189. package/dist/utils/streaming-utils.js +0 -3
  190. package/package.json +15 -10
  191. package/dist/lib/providers/agent-enhanced-provider.d.ts +0 -89
  192. package/dist/lib/providers/agent-enhanced-provider.js +0 -614
  193. package/dist/lib/providers/amazonBedrock.d.ts +0 -19
  194. package/dist/lib/providers/amazonBedrock.js +0 -334
  195. package/dist/lib/providers/azureOpenAI.d.ts +0 -39
  196. package/dist/lib/providers/azureOpenAI.js +0 -436
  197. package/dist/lib/providers/googleAIStudio.d.ts +0 -49
  198. package/dist/lib/providers/googleAIStudio.js +0 -333
  199. package/dist/lib/providers/googleVertexAI.d.ts +0 -38
  200. package/dist/lib/providers/googleVertexAI.js +0 -519
  201. package/dist/lib/providers/mistralAI.d.ts +0 -34
  202. package/dist/lib/providers/mistralAI.js +0 -294
  203. package/dist/providers/agent-enhanced-provider.d.ts +0 -89
  204. package/dist/providers/agent-enhanced-provider.js +0 -614
  205. package/dist/providers/amazonBedrock.d.ts +0 -19
  206. package/dist/providers/amazonBedrock.js +0 -334
  207. package/dist/providers/azureOpenAI.d.ts +0 -39
  208. package/dist/providers/azureOpenAI.js +0 -437
  209. package/dist/providers/googleAIStudio.d.ts +0 -49
  210. package/dist/providers/googleAIStudio.js +0 -333
  211. package/dist/providers/googleVertexAI.d.ts +0 -38
  212. package/dist/providers/googleVertexAI.js +0 -519
  213. package/dist/providers/mistralAI.d.ts +0 -34
  214. package/dist/providers/mistralAI.js +0 -294
@@ -0,0 +1,72 @@
1
+ import type { AIProvider, AIProviderName } from "../core/types.js";
2
+ /**
3
+ * Provider constructor interface - supports both sync constructors and async factory functions
4
+ */
5
+ type ProviderConstructor = {
6
+ new (modelName?: string, providerName?: any, sdk?: any): AIProvider;
7
+ } | ((modelName?: string, providerName?: any, sdk?: any) => Promise<AIProvider>);
8
+ /**
9
+ * Provider registration entry
10
+ */
11
+ interface ProviderRegistration {
12
+ constructor: ProviderConstructor;
13
+ defaultModel?: string;
14
+ aliases?: string[];
15
+ }
16
+ /**
17
+ * True Factory Pattern implementation for AI Providers
18
+ * Uses registration-based approach to eliminate switch statements
19
+ * and enable dynamic provider registration
20
+ */
21
+ export declare class ProviderFactory {
22
+ private static readonly providers;
23
+ private static initialized;
24
+ /**
25
+ * Register a provider with the factory
26
+ */
27
+ static registerProvider(name: AIProviderName | string, constructor: ProviderConstructor, defaultModel?: string, // Optional - provider can read from env
28
+ aliases?: string[]): void;
29
+ /**
30
+ * Create a provider instance
31
+ */
32
+ static createProvider(providerName: AIProviderName | string, modelName?: string, sdk?: any): Promise<AIProvider>;
33
+ /**
34
+ * Check if a provider is registered
35
+ */
36
+ static hasProvider(providerName: string): boolean;
37
+ /**
38
+ * Get list of available providers
39
+ */
40
+ static getAvailableProviders(): string[];
41
+ /**
42
+ * Get provider registration info
43
+ */
44
+ static getProviderInfo(providerName: string): ProviderRegistration | undefined;
45
+ /**
46
+ * Normalize provider names using aliases (PHASE 1: Factory Pattern)
47
+ */
48
+ static normalizeProviderName(providerName: string): string | null;
49
+ /**
50
+ * Clear all registrations (mainly for testing)
51
+ */
52
+ static clearRegistrations(): void;
53
+ /**
54
+ * Ensure providers are initialized
55
+ */
56
+ private static ensureInitialized;
57
+ /**
58
+ * Initialize default providers
59
+ * NOTE: Providers are now registered by ProviderRegistry to avoid circular dependencies
60
+ */
61
+ private static initializeDefaultProviders;
62
+ /**
63
+ * Create the best available provider for the given name
64
+ * Used by NeuroLink SDK for streaming and generation
65
+ */
66
+ static createBestProvider(providerName: AIProviderName | string, modelName?: string, enableMCP?: boolean, sdk?: any): Promise<AIProvider>;
67
+ }
68
+ /**
69
+ * Helper function to create providers with backward compatibility
70
+ */
71
+ export declare function createAIProvider(providerName: AIProviderName | string, modelName?: string): Promise<AIProvider>;
72
+ export {};
@@ -0,0 +1,144 @@
1
+ import { logger } from "../utils/logger.js";
2
+ /**
3
+ * True Factory Pattern implementation for AI Providers
4
+ * Uses registration-based approach to eliminate switch statements
5
+ * and enable dynamic provider registration
6
+ */
7
+ export class ProviderFactory {
8
+ static providers = new Map();
9
+ static initialized = false;
10
+ /**
11
+ * Register a provider with the factory
12
+ */
13
+ static registerProvider(name, constructor, defaultModel, // Optional - provider can read from env
14
+ aliases = []) {
15
+ const registration = {
16
+ constructor,
17
+ defaultModel,
18
+ aliases,
19
+ };
20
+ // Register main name
21
+ this.providers.set(name.toLowerCase(), registration);
22
+ // Register aliases
23
+ aliases.forEach((alias) => {
24
+ this.providers.set(alias.toLowerCase(), registration);
25
+ });
26
+ logger.debug(`Registered provider: ${name} with model ${defaultModel || "from-env"}`);
27
+ }
28
+ /**
29
+ * Create a provider instance
30
+ */
31
+ static async createProvider(providerName, modelName, sdk) {
32
+ // Note: Providers are registered explicitly by ProviderRegistry to avoid circular dependencies
33
+ const normalizedName = providerName.toLowerCase();
34
+ const registration = this.providers.get(normalizedName);
35
+ if (!registration) {
36
+ throw new Error(`Unknown provider: ${providerName}. Available providers: ${this.getAvailableProviders().join(", ")}`);
37
+ }
38
+ const model = modelName || registration.defaultModel;
39
+ try {
40
+ // Check if constructor is an async factory function or a class constructor
41
+ if (typeof registration.constructor === "function") {
42
+ // Check if it has a prototype (class constructor) or not (factory function)
43
+ if (registration.constructor.prototype &&
44
+ registration.constructor.prototype.constructor ===
45
+ registration.constructor) {
46
+ // It's a class constructor
47
+ return new registration.constructor(model, providerName, sdk);
48
+ }
49
+ else {
50
+ // It's a factory function - call it and await if it returns a promise
51
+ const result = registration.constructor(model, providerName, sdk);
52
+ if (result && typeof result.then === "function") {
53
+ // It's a Promise (async factory)
54
+ return await result;
55
+ }
56
+ else {
57
+ // It's a sync result, return it
58
+ return result;
59
+ }
60
+ }
61
+ }
62
+ else {
63
+ // Fallback - use as class constructor
64
+ return new registration.constructor(model, sdk);
65
+ }
66
+ }
67
+ catch (error) {
68
+ logger.error(`Failed to create provider ${providerName}:`, error);
69
+ throw new Error(`Failed to create provider ${providerName}: ${error}`);
70
+ }
71
+ }
72
+ /**
73
+ * Check if a provider is registered
74
+ */
75
+ static hasProvider(providerName) {
76
+ return this.providers.has(providerName.toLowerCase());
77
+ }
78
+ /**
79
+ * Get list of available providers
80
+ */
81
+ static getAvailableProviders() {
82
+ return Array.from(this.providers.keys()).filter((name, index, arr) => arr.indexOf(name) === index);
83
+ }
84
+ /**
85
+ * Get provider registration info
86
+ */
87
+ static getProviderInfo(providerName) {
88
+ return this.providers.get(providerName.toLowerCase());
89
+ }
90
+ /**
91
+ * Normalize provider names using aliases (PHASE 1: Factory Pattern)
92
+ */
93
+ static normalizeProviderName(providerName) {
94
+ const normalized = providerName.toLowerCase();
95
+ // Check direct registration
96
+ if (this.providers.has(normalized)) {
97
+ return normalized;
98
+ }
99
+ // Check aliases from all registrations
100
+ for (const [name, registration] of this.providers.entries()) {
101
+ if (registration.aliases?.includes(normalized)) {
102
+ return name;
103
+ }
104
+ }
105
+ return null;
106
+ }
107
+ /**
108
+ * Clear all registrations (mainly for testing)
109
+ */
110
+ static clearRegistrations() {
111
+ this.providers.clear();
112
+ this.initialized = false;
113
+ }
114
+ /**
115
+ * Ensure providers are initialized
116
+ */
117
+ static ensureInitialized() {
118
+ if (!this.initialized) {
119
+ this.initializeDefaultProviders();
120
+ this.initialized = true;
121
+ }
122
+ }
123
+ /**
124
+ * Initialize default providers
125
+ * NOTE: Providers are now registered by ProviderRegistry to avoid circular dependencies
126
+ */
127
+ static initializeDefaultProviders() {
128
+ logger.debug("BaseProvider factory pattern ready - providers registered by ProviderRegistry");
129
+ // No hardcoded registrations - all done dynamically by ProviderRegistry
130
+ }
131
+ /**
132
+ * Create the best available provider for the given name
133
+ * Used by NeuroLink SDK for streaming and generation
134
+ */
135
+ static async createBestProvider(providerName, modelName, enableMCP, sdk) {
136
+ return await this.createProvider(providerName, modelName, sdk);
137
+ }
138
+ }
139
+ /**
140
+ * Helper function to create providers with backward compatibility
141
+ */
142
+ export async function createAIProvider(providerName, modelName) {
143
+ return await ProviderFactory.createProvider(providerName, modelName);
144
+ }
@@ -0,0 +1,20 @@
1
+ import type { EnhancedProvider } from "../types/generate-types.js";
2
+ import type { AIProvider } from "../core/types.js";
3
+ /**
4
+ * Factory for enhancing providers with generate() capability using Proxy pattern
5
+ * Maintains 100% backward compatibility while adding new generate method
6
+ */
7
+ export declare class ProviderGenerateFactory {
8
+ /**
9
+ * Enhance any provider with generate() method using TypeScript Proxy
10
+ */
11
+ static enhanceProvider<T extends AIProvider>(provider: T): T & EnhancedProvider;
12
+ /**
13
+ * Create the generate() method that internally uses generateText for performance parity
14
+ */
15
+ private static createGenerateMethod;
16
+ /**
17
+ * Enhance all providers from a registry
18
+ */
19
+ static enhanceAllProviders(providers: Map<string, AIProvider>): Map<string, AIProvider & EnhancedProvider>;
20
+ }
@@ -0,0 +1,87 @@
1
+ import { CompatibilityConversionFactory } from "./compatibility-factory.js";
2
+ /**
3
+ * Factory for enhancing providers with generate() capability using Proxy pattern
4
+ * Maintains 100% backward compatibility while adding new generate method
5
+ */
6
+ export class ProviderGenerateFactory {
7
+ /**
8
+ * Enhance any provider with generate() method using TypeScript Proxy
9
+ */
10
+ static enhanceProvider(provider) {
11
+ return new Proxy(provider, {
12
+ get(target, prop, receiver) {
13
+ if (prop === "generate") {
14
+ return ProviderGenerateFactory.createGenerateMethod(target);
15
+ }
16
+ return Reflect.get(target, prop, receiver);
17
+ },
18
+ has(target, prop) {
19
+ if (prop === "generate") {
20
+ return true;
21
+ }
22
+ return Reflect.has(target, prop);
23
+ },
24
+ });
25
+ }
26
+ /**
27
+ * Create the generate() method that internally uses generateText for performance parity
28
+ */
29
+ static createGenerateMethod(provider) {
30
+ return async (options) => {
31
+ // Validate input
32
+ if (!options.input?.text) {
33
+ throw new Error("Generate options must include input.text");
34
+ }
35
+ // Convert GenerateOptions to TextGenerationOptions
36
+ const textOptions = CompatibilityConversionFactory.convertGenerateToText_Options(options);
37
+ try {
38
+ // Use existing generate method for identical performance
39
+ const textResult = await provider.generate(textOptions);
40
+ // Convert back to GenerateResult format with type safety
41
+ const generateResult = {
42
+ content: textResult?.content || "",
43
+ outputs: { text: textResult?.content || "" },
44
+ provider: textResult?.provider,
45
+ model: textResult?.model,
46
+ usage: textResult?.usage
47
+ ? {
48
+ inputTokens: textResult.usage?.promptTokens || 0,
49
+ outputTokens: textResult.usage?.completionTokens || 0,
50
+ totalTokens: textResult.usage?.totalTokens || 0,
51
+ }
52
+ : undefined,
53
+ responseTime: textResult?.responseTime,
54
+ toolsUsed: textResult?.toolsUsed,
55
+ toolExecutions: textResult?.toolExecutions?.map((te) => ({
56
+ name: te.toolName || te.name || "",
57
+ input: te.input || {},
58
+ output: te.output || te.result,
59
+ duration: te.executionTime || te.duration || 0,
60
+ })),
61
+ enhancedWithTools: textResult?.enhancedWithTools,
62
+ availableTools: textResult?.availableTools?.map((at) => ({
63
+ name: at.name || "",
64
+ description: at.description || "",
65
+ parameters: at.parameters || {},
66
+ })),
67
+ analytics: textResult?.analytics,
68
+ evaluation: textResult?.evaluation,
69
+ };
70
+ return generateResult;
71
+ }
72
+ catch (error) {
73
+ throw new Error(`Generate method failed: ${error}`);
74
+ }
75
+ };
76
+ }
77
+ /**
78
+ * Enhance all providers from a registry
79
+ */
80
+ static enhanceAllProviders(providers) {
81
+ const enhancedProviders = new Map();
82
+ for (const [name, provider] of providers) {
83
+ enhancedProviders.set(name, this.enhanceProvider(provider));
84
+ }
85
+ return enhancedProviders;
86
+ }
87
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Configuration options for the provider registry
3
+ */
4
+ export interface ProviderRegistryOptions {
5
+ /**
6
+ * Enable loading of manual MCP configurations from .mcp-config.json
7
+ * Should only be true for CLI mode, false for SDK mode
8
+ */
9
+ enableManualMCP?: boolean;
10
+ }
11
+ /**
12
+ * Provider Registry - registers all providers with the factory
13
+ * This is where we migrate providers one by one to the new pattern
14
+ */
15
+ export declare class ProviderRegistry {
16
+ private static registered;
17
+ private static options;
18
+ /**
19
+ * Register all providers with the factory
20
+ */
21
+ static registerAllProviders(): Promise<void>;
22
+ /**
23
+ * Check if providers are registered
24
+ */
25
+ static isRegistered(): boolean;
26
+ /**
27
+ * Clear registrations (for testing)
28
+ */
29
+ static clearRegistrations(): void;
30
+ /**
31
+ * Set registry options (should be called before initialization)
32
+ */
33
+ static setOptions(options: ProviderRegistryOptions): void;
34
+ /**
35
+ * Get current registry options
36
+ */
37
+ static getOptions(): ProviderRegistryOptions;
38
+ }
@@ -0,0 +1,107 @@
1
+ import { ProviderFactory } from "./provider-factory.js";
2
+ // ✅ FINAL CIRCULAR DEPENDENCY FIX: Lazy loading all providers
3
+ // Removed all static imports - providers loaded dynamically when needed
4
+ // This breaks the circular dependency chain completely
5
+ import { AIProviderName, GoogleAIModels, OpenAIModels } from "../core/types.js";
6
+ import { logger } from "../utils/logger.js";
7
+ /**
8
+ * Provider Registry - registers all providers with the factory
9
+ * This is where we migrate providers one by one to the new pattern
10
+ */
11
+ export class ProviderRegistry {
12
+ static registered = false;
13
+ static options = {
14
+ enableManualMCP: false, // Default to disabled for safety
15
+ };
16
+ /**
17
+ * Register all providers with the factory
18
+ */
19
+ static async registerAllProviders() {
20
+ if (this.registered) {
21
+ return;
22
+ }
23
+ try {
24
+ // ✅ LAZY LOADING: Register providers with dynamic import factory functions
25
+ const { ProviderFactory } = await import("./provider-factory.js");
26
+ // Register Google AI Studio Provider (our validated baseline)
27
+ ProviderFactory.registerProvider(AIProviderName.GOOGLE_AI, async (modelName, providerName, sdk) => {
28
+ const { GoogleAIStudioProvider } = await import("../providers/google-ai-studio.js");
29
+ return new GoogleAIStudioProvider(modelName, sdk);
30
+ }, GoogleAIModels.GEMINI_2_5_FLASH, ["google-ai-studio", "google", "gemini", "google-ai"]);
31
+ // Register OpenAI provider
32
+ ProviderFactory.registerProvider(AIProviderName.OPENAI, async (modelName, providerName, sdk) => {
33
+ const { OpenAIProvider } = await import("../providers/openAI.js");
34
+ return new OpenAIProvider(modelName);
35
+ }, OpenAIModels.GPT_4O_MINI, ["gpt", "chatgpt"]);
36
+ // Register Anthropic provider
37
+ ProviderFactory.registerProvider(AIProviderName.ANTHROPIC, async (modelName, providerName, sdk) => {
38
+ const { AnthropicProvider } = await import("../providers/anthropic.js");
39
+ return new AnthropicProvider(modelName, sdk);
40
+ }, "claude-3-5-sonnet-20241022", ["claude", "anthropic"]);
41
+ // Register Amazon Bedrock provider
42
+ ProviderFactory.registerProvider(AIProviderName.BEDROCK, async (modelName) => {
43
+ const { AmazonBedrockProvider } = await import("../providers/amazon-bedrock.js");
44
+ return new AmazonBedrockProvider(modelName);
45
+ }, undefined, // Let provider read BEDROCK_MODEL from .env
46
+ ["bedrock", "aws"]);
47
+ // Register Azure OpenAI provider
48
+ ProviderFactory.registerProvider(AIProviderName.AZURE, async (modelName) => {
49
+ const { AzureOpenAIProvider } = await import("../providers/azure-openai.js");
50
+ return new AzureOpenAIProvider(modelName);
51
+ }, "gpt-4o-mini", ["azure", "azure-openai"]);
52
+ // Register Google Vertex AI provider
53
+ ProviderFactory.registerProvider(AIProviderName.VERTEX, async (modelName) => {
54
+ const { GoogleVertexProvider } = await import("../providers/google-vertex.js");
55
+ return new GoogleVertexProvider(modelName);
56
+ }, "gemini-2.5-pro", ["vertex", "google-vertex"]);
57
+ // Register Hugging Face provider (Unified Router implementation)
58
+ ProviderFactory.registerProvider(AIProviderName.HUGGINGFACE, async (modelName) => {
59
+ const { HuggingFaceProvider } = await import("../providers/huggingFace.js");
60
+ return new HuggingFaceProvider(modelName);
61
+ }, process.env.HUGGINGFACE_MODEL || "microsoft/DialoGPT-medium", ["huggingface", "hf"]);
62
+ // Register Mistral AI provider
63
+ ProviderFactory.registerProvider(AIProviderName.MISTRAL, async (modelName, providerName, sdk) => {
64
+ const { MistralProvider } = await import("../providers/mistral.js");
65
+ return new MistralProvider(modelName, sdk);
66
+ }, "mistral-large-latest", ["mistral"]);
67
+ // Register Ollama provider
68
+ ProviderFactory.registerProvider(AIProviderName.OLLAMA, async (modelName) => {
69
+ const { OllamaProvider } = await import("../providers/ollama.js");
70
+ return new OllamaProvider(modelName);
71
+ }, process.env.OLLAMA_MODEL || "llama3.1:8b", ["ollama", "local"]);
72
+ logger.debug("All providers registered successfully");
73
+ this.registered = true;
74
+ }
75
+ catch (error) {
76
+ logger.error("Failed to register providers:", error);
77
+ throw error;
78
+ }
79
+ }
80
+ /**
81
+ * Check if providers are registered
82
+ */
83
+ static isRegistered() {
84
+ return this.registered;
85
+ }
86
+ /**
87
+ * Clear registrations (for testing)
88
+ */
89
+ static clearRegistrations() {
90
+ ProviderFactory.clearRegistrations();
91
+ this.registered = false;
92
+ }
93
+ /**
94
+ * Set registry options (should be called before initialization)
95
+ */
96
+ static setOptions(options) {
97
+ this.options = { ...this.options, ...options };
98
+ logger.debug("Provider registry options updated:", this.options);
99
+ }
100
+ /**
101
+ * Get current registry options
102
+ */
103
+ static getOptions() {
104
+ return { ...this.options };
105
+ }
106
+ }
107
+ // Note: Providers are registered explicitly when needed to avoid circular dependencies
@@ -9,13 +9,16 @@
9
9
  import { AIProviderFactory } from "./core/factory.js";
10
10
  export { AIProviderFactory };
11
11
  export type { AIProvider, AIProviderName, ProviderConfig, StreamingOptions, ProviderAttempt, SupportedModelName, } from "./core/types.js";
12
+ export type { GenerateOptions, GenerateResult, EnhancedProvider, } from "./types/generate-types.js";
13
+ export { CompatibilityConversionFactory } from "./factories/compatibility-factory.js";
14
+ export { ProviderGenerateFactory } from "./factories/provider-generate-factory.js";
15
+ export type { SimpleTool, ToolContext } from "./sdk/tool-registration.js";
16
+ export { createTool, createTypedTool, validateTool, } from "./sdk/tool-registration.js";
17
+ export type { InMemoryMCPServerConfig, InMemoryToolInfo, InMemoryToolResult, } from "./types/mcp-types.js";
12
18
  export { BedrockModels, OpenAIModels, VertexModels, DEFAULT_PROVIDER_CONFIGS, } from "./core/types.js";
13
- export { GoogleVertexAI, AmazonBedrock, OpenAI, AnthropicProvider, AzureOpenAIProvider, } from "./providers/index.js";
14
- export type { ProviderName } from "./providers/index.js";
15
- export { PROVIDERS, AVAILABLE_PROVIDERS } from "./providers/index.js";
16
19
  export { getBestProvider, getAvailableProviders, isValidProvider, } from "./utils/providerUtils.js";
17
20
  export { NeuroLink } from "./neurolink.js";
18
- export type { TextGenerationOptions, StreamTextOptions, TextGenerationResult, } from "./neurolink.js";
21
+ export type { ProviderStatus, MCPStatus, MCPServerInfo } from "./neurolink.js";
19
22
  export declare const VERSION = "1.0.0";
20
23
  /**
21
24
  * Quick start factory function
@@ -25,7 +28,7 @@ export declare const VERSION = "1.0.0";
25
28
  * import { createAIProvider } from '@juspay/neurolink';
26
29
  *
27
30
  * const provider = await createAIProvider('bedrock');
28
- * const result = await provider.streamText('Hello, AI!');
31
+ * const result = await provider.stream({ input: { text: 'Hello, AI!' } });
29
32
  * ```
30
33
  */
31
34
  export declare function createAIProvider(providerName?: string, modelName?: string): Promise<import("./index.js").AIProvider>;
package/dist/lib/index.js CHANGED
@@ -9,14 +9,14 @@
9
9
  // Core exports
10
10
  import { AIProviderFactory } from "./core/factory.js";
11
11
  export { AIProviderFactory };
12
+ export { CompatibilityConversionFactory } from "./factories/compatibility-factory.js";
13
+ export { ProviderGenerateFactory } from "./factories/provider-generate-factory.js";
14
+ export { createTool, createTypedTool, validateTool, } from "./sdk/tool-registration.js";
12
15
  // Model enums
13
16
  export { BedrockModels, OpenAIModels, VertexModels, DEFAULT_PROVIDER_CONFIGS, } from "./core/types.js";
14
- // Provider exports
15
- export { GoogleVertexAI, AmazonBedrock, OpenAI, AnthropicProvider, AzureOpenAIProvider, } from "./providers/index.js";
16
- export { PROVIDERS, AVAILABLE_PROVIDERS } from "./providers/index.js";
17
17
  // Utility exports
18
18
  export { getBestProvider, getAvailableProviders, isValidProvider, } from "./utils/providerUtils.js";
19
- // Main NeuroLink wrapper class
19
+ // Main NeuroLink wrapper class and diagnostic types
20
20
  export { NeuroLink } from "./neurolink.js";
21
21
  // Version
22
22
  export const VERSION = "1.0.0";
@@ -28,7 +28,7 @@ export const VERSION = "1.0.0";
28
28
  * import { createAIProvider } from '@juspay/neurolink';
29
29
  *
30
30
  * const provider = await createAIProvider('bedrock');
31
- * const result = await provider.streamText('Hello, AI!');
31
+ * const result = await provider.stream({ input: { text: 'Hello, AI!' } });
32
32
  * ```
33
33
  */
34
34
  export async function createAIProvider(providerName, modelName) {
@@ -49,11 +49,11 @@ export class NeuroLinkMCPClient extends EventEmitter {
49
49
  return result;
50
50
  }
51
51
  // If it's in Lighthouse format with content array
52
- if (result.content &&
53
- Array.isArray(result.content) &&
54
- result.content[0]?.text) {
52
+ if (result.text &&
53
+ Array.isArray(result.text) &&
54
+ result.text[0]?.text) {
55
55
  try {
56
- const data = JSON.parse(result.content[0].text);
56
+ const data = JSON.parse(result.text[0].text);
57
57
  return {
58
58
  success: !result.isError,
59
59
  data,
@@ -69,7 +69,7 @@ export class NeuroLinkMCPClient extends EventEmitter {
69
69
  // If JSON parsing fails, return the text as-is
70
70
  return {
71
71
  success: !result.isError,
72
- data: { text: result.content[0].text },
72
+ data: { text: result.text[0].text },
73
73
  metadata: {
74
74
  toolName,
75
75
  serverId,
@@ -3,15 +3,36 @@
3
3
  * Central registry for all MCP servers following Lighthouse patterns
4
4
  * Handles built-in servers only - auto-discovery handled by unified registry
5
5
  */
6
- import { aiCoreServer } from "./servers/ai-providers/ai-core-server.js";
7
6
  import { utilityServer } from "./servers/utilities/utility-server.js";
8
7
  import { logger } from "../utils/logger.js";
8
+ /**
9
+ * Lazy-loaded AI Core Server to avoid circular dependencies
10
+ */
11
+ let aiCoreServerCache = null;
12
+ async function getAICoreServer() {
13
+ if (!aiCoreServerCache) {
14
+ const { aiCoreServer } = await import("./servers/ai-providers/ai-core-server.js");
15
+ aiCoreServerCache = aiCoreServer;
16
+ }
17
+ return aiCoreServerCache;
18
+ }
19
+ /**
20
+ * Lazy-loaded Direct Tools Server to avoid circular dependencies
21
+ */
22
+ let directToolsServerCache = null;
23
+ async function getDirectToolsServer() {
24
+ if (!directToolsServerCache) {
25
+ const { directToolsServer } = await import("./servers/agent/direct-tools-server.js");
26
+ directToolsServerCache = directToolsServer;
27
+ }
28
+ return directToolsServerCache;
29
+ }
9
30
  /**
10
31
  * Built-in MCP servers (kept for backward compatibility)
11
32
  * Add new servers here as they are created
12
33
  */
13
34
  export const allServers = [
14
- aiCoreServer,
35
+ // aiCoreServer will be added dynamically in getServers()
15
36
  utilityServer,
16
37
  // Add more servers as they are created
17
38
  ];
@@ -25,8 +46,12 @@ export const mcpConfig = {
25
46
  */
26
47
  getServers: async () => {
27
48
  const activeServers = [];
49
+ // Get all servers including dynamically loaded ones
50
+ const aiCoreServer = await getAICoreServer();
51
+ const directToolsServer = await getDirectToolsServer();
52
+ const servers = [aiCoreServer, directToolsServer, ...allServers];
28
53
  // Include built-in servers with filtering
29
- for (const server of allServers) {
54
+ for (const server of servers) {
30
55
  const implementedTools = {};
31
56
  let hasImplementedTools = false;
32
57
  for (const toolName in server.tools) {
@@ -199,11 +199,11 @@ export class DynamicOrchestrator extends MCPOrchestrator {
199
199
  .replace("{previousResults}", previousResults || "None yet");
200
200
  try {
201
201
  // Use AI Core Server to get tool decision
202
- const generateTextTool = aiCoreServer.tools["generate-text"];
203
- if (!generateTextTool) {
204
- throw new Error("generate-text tool not found");
202
+ const generateTool = aiCoreServer.tools["generate"];
203
+ if (!generateTool) {
204
+ throw new Error("generate tool not found");
205
205
  }
206
- const aiResponse = await generateTextTool.execute({
206
+ const aiResponse = await generateTool.execute({
207
207
  prompt: "Select the next tool to execute based on the context provided.",
208
208
  systemPrompt,
209
209
  provider: "google-ai", // Use fast model for decisions
@@ -279,11 +279,11 @@ ${executionSummary}
279
279
  Provide a clear, concise answer that addresses the user's request based on the tool results.`;
280
280
  try {
281
281
  // Use AI to generate final summary
282
- const generateTextTool = aiCoreServer.tools["generate-text"];
283
- if (!generateTextTool) {
284
- throw new Error("generate-text tool not found");
282
+ const generateTool = aiCoreServer.tools["generate"];
283
+ if (!generateTool) {
284
+ throw new Error("generate tool not found");
285
285
  }
286
- const aiResponse = await generateTextTool.execute({
286
+ const aiResponse = await generateTool.execute({
287
287
  prompt: summaryPrompt,
288
288
  provider: "google-ai",
289
289
  model: "gemini-2.5-pro",
@@ -139,7 +139,7 @@ export class ExternalMCPClient extends EventEmitter {
139
139
  // Transform MCP response to NeuroLink format
140
140
  const result = {
141
141
  success: !response.isError,
142
- data: response.content || response.result || response,
142
+ data: response.text || response.result || response,
143
143
  metadata: {
144
144
  toolName,
145
145
  serverId: this.config.name,
@@ -150,7 +150,7 @@ export class ExternalMCPClient extends EventEmitter {
150
150
  },
151
151
  };
152
152
  if (response.isError) {
153
- result.error = response.content?.[0]?.text || "Tool execution failed";
153
+ result.error = response.text?.[0]?.text || "Tool execution failed";
154
154
  }
155
155
  logger.debug(`[External MCP] Tool ${toolName} executed in ${executionTime}ms`);
156
156
  return result;
@@ -134,7 +134,7 @@ export interface MCPServerConfig {
134
134
  * });
135
135
  *
136
136
  * aiCoreServer.registerTool({
137
- * name: 'generate-text',
137
+ * name: 'generate',
138
138
  * description: 'Generate text using AI providers',
139
139
  * execute: async (params, context) => {
140
140
  * // Tool implementation