@juspay/neurolink 5.1.0 → 5.3.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 (190) hide show
  1. package/CHANGELOG.md +21 -9
  2. package/README.md +123 -126
  3. package/dist/agent/direct-tools.d.ts +6 -6
  4. package/dist/cli/commands/config.d.ts +3 -3
  5. package/dist/cli/commands/mcp.js +8 -7
  6. package/dist/cli/factories/command-factory.d.ts +4 -0
  7. package/dist/cli/factories/command-factory.js +63 -8
  8. package/dist/cli/index.js +87 -140
  9. package/dist/core/base-provider.d.ts +423 -0
  10. package/dist/core/base-provider.js +376 -0
  11. package/dist/core/constants.d.ts +2 -1
  12. package/dist/core/constants.js +2 -1
  13. package/dist/core/dynamic-models.d.ts +6 -6
  14. package/dist/core/evaluation.d.ts +19 -80
  15. package/dist/core/evaluation.js +185 -484
  16. package/dist/core/factory.d.ts +3 -3
  17. package/dist/core/factory.js +31 -91
  18. package/dist/core/service-registry.d.ts +47 -0
  19. package/dist/core/service-registry.js +112 -0
  20. package/dist/core/types.d.ts +8 -1
  21. package/dist/factories/compatibility-factory.js +1 -1
  22. package/dist/factories/provider-factory.d.ts +72 -0
  23. package/dist/factories/provider-factory.js +144 -0
  24. package/dist/factories/provider-registry.d.ts +38 -0
  25. package/dist/factories/provider-registry.js +107 -0
  26. package/dist/index.d.ts +4 -3
  27. package/dist/index.js +2 -4
  28. package/dist/lib/agent/direct-tools.d.ts +6 -6
  29. package/dist/lib/core/base-provider.d.ts +423 -0
  30. package/dist/lib/core/base-provider.js +376 -0
  31. package/dist/lib/core/constants.d.ts +2 -1
  32. package/dist/lib/core/constants.js +2 -1
  33. package/dist/lib/core/dynamic-models.d.ts +6 -6
  34. package/dist/lib/core/evaluation.d.ts +19 -80
  35. package/dist/lib/core/evaluation.js +185 -484
  36. package/dist/lib/core/factory.d.ts +3 -3
  37. package/dist/lib/core/factory.js +30 -91
  38. package/dist/lib/core/service-registry.d.ts +47 -0
  39. package/dist/lib/core/service-registry.js +112 -0
  40. package/dist/lib/core/types.d.ts +8 -1
  41. package/dist/lib/factories/compatibility-factory.js +1 -1
  42. package/dist/lib/factories/provider-factory.d.ts +72 -0
  43. package/dist/lib/factories/provider-factory.js +144 -0
  44. package/dist/lib/factories/provider-registry.d.ts +38 -0
  45. package/dist/lib/factories/provider-registry.js +107 -0
  46. package/dist/lib/index.d.ts +4 -3
  47. package/dist/lib/index.js +2 -4
  48. package/dist/lib/mcp/client.d.ts +1 -0
  49. package/dist/lib/mcp/client.js +1 -0
  50. package/dist/lib/mcp/config.js +28 -3
  51. package/dist/lib/mcp/context-manager.d.ts +1 -0
  52. package/dist/lib/mcp/context-manager.js +8 -4
  53. package/dist/lib/mcp/function-calling.d.ts +13 -0
  54. package/dist/lib/mcp/function-calling.js +134 -35
  55. package/dist/lib/mcp/initialize-tools.d.ts +1 -1
  56. package/dist/lib/mcp/initialize-tools.js +45 -1
  57. package/dist/lib/mcp/initialize.js +16 -6
  58. package/dist/lib/mcp/neurolink-mcp-client.d.ts +1 -0
  59. package/dist/lib/mcp/neurolink-mcp-client.js +21 -5
  60. package/dist/lib/mcp/servers/agent/direct-tools-server.d.ts +8 -0
  61. package/dist/lib/mcp/servers/agent/direct-tools-server.js +109 -0
  62. package/dist/lib/mcp/servers/ai-providers/ai-core-server.js +3 -1
  63. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  64. package/dist/lib/mcp/unified-registry.d.ts +4 -0
  65. package/dist/lib/mcp/unified-registry.js +42 -9
  66. package/dist/lib/neurolink.d.ts +156 -117
  67. package/dist/lib/neurolink.js +619 -404
  68. package/dist/lib/providers/amazon-bedrock.d.ts +32 -0
  69. package/dist/lib/providers/amazon-bedrock.js +143 -0
  70. package/dist/lib/providers/analytics-helper.js +7 -4
  71. package/dist/lib/providers/anthropic-baseprovider.d.ts +23 -0
  72. package/dist/lib/providers/anthropic-baseprovider.js +114 -0
  73. package/dist/lib/providers/anthropic.d.ts +19 -43
  74. package/dist/lib/providers/anthropic.js +82 -306
  75. package/dist/lib/providers/azure-openai.d.ts +20 -0
  76. package/dist/lib/providers/azure-openai.js +89 -0
  77. package/dist/lib/providers/function-calling-provider.d.ts +64 -2
  78. package/dist/lib/providers/function-calling-provider.js +208 -9
  79. package/dist/lib/providers/google-ai-studio.d.ts +23 -0
  80. package/dist/lib/providers/google-ai-studio.js +107 -0
  81. package/dist/lib/providers/google-vertex.d.ts +47 -0
  82. package/dist/lib/providers/google-vertex.js +205 -0
  83. package/dist/lib/providers/huggingFace.d.ts +32 -25
  84. package/dist/lib/providers/huggingFace.js +97 -431
  85. package/dist/lib/providers/index.d.ts +9 -9
  86. package/dist/lib/providers/index.js +9 -9
  87. package/dist/lib/providers/mcp-provider.js +24 -5
  88. package/dist/lib/providers/mistral.d.ts +42 -0
  89. package/dist/lib/providers/mistral.js +160 -0
  90. package/dist/lib/providers/ollama.d.ts +52 -36
  91. package/dist/lib/providers/ollama.js +297 -520
  92. package/dist/lib/providers/openAI.d.ts +19 -18
  93. package/dist/lib/providers/openAI.js +76 -275
  94. package/dist/lib/sdk/tool-extension.d.ts +181 -0
  95. package/dist/lib/sdk/tool-extension.js +283 -0
  96. package/dist/lib/sdk/tool-registration.d.ts +95 -0
  97. package/dist/lib/sdk/tool-registration.js +167 -0
  98. package/dist/lib/services/streaming/streaming-manager.js +11 -10
  99. package/dist/lib/services/websocket/websocket-server.js +12 -11
  100. package/dist/lib/telemetry/telemetry-service.js +8 -7
  101. package/dist/lib/types/generate-types.d.ts +1 -0
  102. package/dist/lib/types/mcp-types.d.ts +116 -0
  103. package/dist/lib/types/mcp-types.js +5 -0
  104. package/dist/lib/types/stream-types.d.ts +30 -18
  105. package/dist/lib/types/universal-provider-options.d.ts +87 -0
  106. package/dist/lib/types/universal-provider-options.js +53 -0
  107. package/dist/mcp/client.d.ts +1 -0
  108. package/dist/mcp/client.js +1 -0
  109. package/dist/mcp/config.js +28 -3
  110. package/dist/mcp/context-manager.d.ts +1 -0
  111. package/dist/mcp/context-manager.js +8 -4
  112. package/dist/mcp/function-calling.d.ts +13 -0
  113. package/dist/mcp/function-calling.js +134 -35
  114. package/dist/mcp/initialize-tools.d.ts +1 -1
  115. package/dist/mcp/initialize-tools.js +45 -1
  116. package/dist/mcp/initialize.js +16 -6
  117. package/dist/mcp/neurolink-mcp-client.d.ts +1 -0
  118. package/dist/mcp/neurolink-mcp-client.js +21 -5
  119. package/dist/mcp/servers/agent/direct-tools-server.d.ts +8 -0
  120. package/dist/mcp/servers/agent/direct-tools-server.js +109 -0
  121. package/dist/mcp/servers/ai-providers/ai-core-server.js +3 -1
  122. package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  123. package/dist/mcp/unified-registry.d.ts +4 -0
  124. package/dist/mcp/unified-registry.js +42 -9
  125. package/dist/neurolink.d.ts +156 -117
  126. package/dist/neurolink.js +619 -404
  127. package/dist/providers/amazon-bedrock.d.ts +32 -0
  128. package/dist/providers/amazon-bedrock.js +143 -0
  129. package/dist/providers/analytics-helper.js +7 -4
  130. package/dist/providers/anthropic-baseprovider.d.ts +23 -0
  131. package/dist/providers/anthropic-baseprovider.js +114 -0
  132. package/dist/providers/anthropic.d.ts +19 -43
  133. package/dist/providers/anthropic.js +81 -305
  134. package/dist/providers/azure-openai.d.ts +20 -0
  135. package/dist/providers/azure-openai.js +89 -0
  136. package/dist/providers/function-calling-provider.d.ts +64 -2
  137. package/dist/providers/function-calling-provider.js +208 -9
  138. package/dist/providers/google-ai-studio.d.ts +23 -0
  139. package/dist/providers/google-ai-studio.js +108 -0
  140. package/dist/providers/google-vertex.d.ts +47 -0
  141. package/dist/providers/google-vertex.js +205 -0
  142. package/dist/providers/huggingFace.d.ts +32 -25
  143. package/dist/providers/huggingFace.js +96 -430
  144. package/dist/providers/index.d.ts +9 -9
  145. package/dist/providers/index.js +9 -9
  146. package/dist/providers/mcp-provider.js +24 -5
  147. package/dist/providers/mistral.d.ts +42 -0
  148. package/dist/providers/mistral.js +160 -0
  149. package/dist/providers/ollama.d.ts +52 -36
  150. package/dist/providers/ollama.js +297 -519
  151. package/dist/providers/openAI.d.ts +19 -18
  152. package/dist/providers/openAI.js +76 -276
  153. package/dist/sdk/tool-extension.d.ts +181 -0
  154. package/dist/sdk/tool-extension.js +283 -0
  155. package/dist/sdk/tool-registration.d.ts +95 -0
  156. package/dist/sdk/tool-registration.js +168 -0
  157. package/dist/services/streaming/streaming-manager.js +11 -10
  158. package/dist/services/websocket/websocket-server.js +12 -11
  159. package/dist/telemetry/telemetry-service.js +8 -7
  160. package/dist/types/generate-types.d.ts +1 -0
  161. package/dist/types/mcp-types.d.ts +116 -0
  162. package/dist/types/mcp-types.js +5 -0
  163. package/dist/types/stream-types.d.ts +30 -18
  164. package/dist/types/universal-provider-options.d.ts +87 -0
  165. package/dist/types/universal-provider-options.js +53 -0
  166. package/package.json +12 -5
  167. package/dist/lib/providers/agent-enhanced-provider.d.ts +0 -93
  168. package/dist/lib/providers/agent-enhanced-provider.js +0 -605
  169. package/dist/lib/providers/amazonBedrock.d.ts +0 -28
  170. package/dist/lib/providers/amazonBedrock.js +0 -364
  171. package/dist/lib/providers/azureOpenAI.d.ts +0 -42
  172. package/dist/lib/providers/azureOpenAI.js +0 -347
  173. package/dist/lib/providers/googleAIStudio.d.ts +0 -42
  174. package/dist/lib/providers/googleAIStudio.js +0 -364
  175. package/dist/lib/providers/googleVertexAI.d.ts +0 -34
  176. package/dist/lib/providers/googleVertexAI.js +0 -547
  177. package/dist/lib/providers/mistralAI.d.ts +0 -37
  178. package/dist/lib/providers/mistralAI.js +0 -325
  179. package/dist/providers/agent-enhanced-provider.d.ts +0 -93
  180. package/dist/providers/agent-enhanced-provider.js +0 -606
  181. package/dist/providers/amazonBedrock.d.ts +0 -28
  182. package/dist/providers/amazonBedrock.js +0 -364
  183. package/dist/providers/azureOpenAI.d.ts +0 -42
  184. package/dist/providers/azureOpenAI.js +0 -348
  185. package/dist/providers/googleAIStudio.d.ts +0 -42
  186. package/dist/providers/googleAIStudio.js +0 -364
  187. package/dist/providers/googleVertexAI.d.ts +0 -34
  188. package/dist/providers/googleVertexAI.js +0 -547
  189. package/dist/providers/mistralAI.d.ts +0 -37
  190. package/dist/providers/mistralAI.js +0 -325
@@ -5,7 +5,7 @@ declare const componentIdentifier = "aiProviderFactory";
5
5
  */
6
6
  export declare class AIProviderFactory {
7
7
  /**
8
- * Normalize provider name to match dynamic model registry keys
8
+ * Normalize provider name using ProviderFactory
9
9
  */
10
10
  private static normalizeProviderName;
11
11
  /**
@@ -15,7 +15,7 @@ export declare class AIProviderFactory {
15
15
  * @param enableMCP - Optional flag to enable MCP integration (default: true)
16
16
  * @returns AIProvider instance
17
17
  */
18
- static createProvider(providerName: string, modelName?: string | null, enableMCP?: boolean): Promise<AIProvider>;
18
+ static createProvider(providerName: string, modelName?: string | null, enableMCP?: boolean, sdk?: any): Promise<AIProvider>;
19
19
  /**
20
20
  * Create a provider instance with specific provider enum and model
21
21
  * @param provider - Provider enum value
@@ -30,7 +30,7 @@ export declare class AIProviderFactory {
30
30
  * @param enableMCP - Optional flag to enable MCP integration (default: true)
31
31
  * @returns AIProvider instance
32
32
  */
33
- static createBestProvider(requestedProvider?: string, modelName?: string | null, enableMCP?: boolean): Promise<AIProvider>;
33
+ static createBestProvider(requestedProvider?: string, modelName?: string | null, enableMCP?: boolean, sdk?: any): Promise<AIProvider>;
34
34
  /**
35
35
  * Create primary and fallback provider instances
36
36
  * @param primaryProvider - Primary provider name
@@ -1,4 +1,6 @@
1
- import { GoogleVertexAI, AmazonBedrock, OpenAI, AnthropicProvider, AzureOpenAIProvider, GoogleAIStudio, HuggingFace, Ollama, MistralAI, } from "../providers/index.js";
1
+ // CIRCULAR DEPENDENCY FIX: Remove barrel export import
2
+ // Providers are now managed via ProviderFactory instead of direct imports
3
+ import { ProviderFactory } from "../factories/provider-factory.js";
2
4
  import { getBestProvider } from "../utils/providerUtils.js";
3
5
  import { logger } from "../utils/logger.js";
4
6
  const componentIdentifier = "aiProviderFactory";
@@ -7,45 +9,16 @@ const componentIdentifier = "aiProviderFactory";
7
9
  */
8
10
  export class AIProviderFactory {
9
11
  /**
10
- * Normalize provider name to match dynamic model registry keys
12
+ * Normalize provider name using ProviderFactory
11
13
  */
12
14
  static normalizeProviderName(providerName) {
13
- switch (providerName.toLowerCase()) {
14
- case "vertex":
15
- case "google":
16
- case "gemini":
17
- return "google";
18
- case "bedrock":
19
- case "amazon":
20
- case "aws":
21
- return "bedrock";
22
- case "openai":
23
- case "gpt":
24
- return "openai";
25
- case "anthropic":
26
- case "claude":
27
- return "anthropic";
28
- case "azure":
29
- case "azure-openai":
30
- return "openai"; // Azure uses OpenAI models
31
- case "google-ai":
32
- case "google-studio":
33
- return "google";
34
- case "huggingface":
35
- case "hugging-face":
36
- case "hf":
37
- return "huggingface";
38
- case "ollama":
39
- case "local":
40
- case "local-ollama":
41
- return "ollama";
42
- case "mistral":
43
- case "mistral-ai":
44
- case "mistralai":
45
- return "mistral";
46
- default:
47
- return providerName.toLowerCase();
15
+ // Use ProviderFactory registration - no more legacy switch statements
16
+ const normalized = ProviderFactory.normalizeProviderName(providerName);
17
+ if (normalized) {
18
+ return normalized;
48
19
  }
20
+ // If not found in factory, return as-is (will be handled by factory error handling)
21
+ return providerName.toLowerCase();
49
22
  }
50
23
  /**
51
24
  * Create a provider instance for the specified provider type
@@ -54,8 +27,9 @@ export class AIProviderFactory {
54
27
  * @param enableMCP - Optional flag to enable MCP integration (default: true)
55
28
  * @returns AIProvider instance
56
29
  */
57
- static async createProvider(providerName, modelName, enableMCP = true) {
58
- const functionTag = "AIProviderFactory.createProvider";
30
+ static async createProvider(providerName, modelName, enableMCP = true, sdk) {
31
+ const functionTag = "AIawait ProviderFactory.createProvider";
32
+ // Providers are registered via ProviderFactory.initialize() on first use
59
33
  logger.debug(`[${functionTag}] Provider creation started`, {
60
34
  providerName,
61
35
  modelName: modelName || "default",
@@ -114,53 +88,18 @@ export class AIProviderFactory {
114
88
  // }
115
89
  // }
116
90
  let provider;
117
- switch (providerName.toLowerCase()) {
118
- case "vertex":
119
- case "google":
120
- case "gemini":
121
- provider = new GoogleVertexAI(resolvedModelName === "default" ? null : resolvedModelName);
122
- break;
123
- case "bedrock":
124
- case "amazon":
125
- case "aws":
126
- provider = new AmazonBedrock(resolvedModelName === "default" ? null : resolvedModelName);
127
- break;
128
- case "openai":
129
- case "gpt":
130
- provider = new OpenAI(resolvedModelName === "default" ? null : resolvedModelName);
131
- break;
132
- case "anthropic":
133
- case "claude":
134
- provider = new AnthropicProvider();
135
- break;
136
- case "azure":
137
- case "azure-openai":
138
- provider = new AzureOpenAIProvider();
139
- break;
140
- case "google-ai":
141
- case "google-studio":
142
- provider = new GoogleAIStudio(resolvedModelName === "default" ? null : resolvedModelName);
143
- break;
144
- case "huggingface":
145
- case "hugging-face":
146
- case "hf":
147
- provider = new HuggingFace(resolvedModelName === "default" ? null : resolvedModelName);
148
- break;
149
- case "ollama":
150
- case "local":
151
- case "local-ollama":
152
- provider = new Ollama(resolvedModelName === "default"
153
- ? undefined
154
- : resolvedModelName || undefined);
155
- break;
156
- case "mistral":
157
- case "mistral-ai":
158
- case "mistralai":
159
- provider = new MistralAI(resolvedModelName === "default" ? null : resolvedModelName);
160
- break;
161
- default:
162
- throw new Error(`Unknown provider: ${providerName}. Supported providers: vertex, bedrock, openai, anthropic, azure, google-ai, huggingface, ollama, mistral`);
163
- }
91
+ // PURE FACTORY PATTERN: No switch statements - use ProviderFactory exclusively
92
+ const normalizedName = this.normalizeProviderName(providerName);
93
+ const finalModelName = resolvedModelName === "default" || resolvedModelName === null
94
+ ? undefined
95
+ : resolvedModelName;
96
+ provider = await ProviderFactory.createProvider(normalizedName, finalModelName, sdk);
97
+ logger.debug(componentIdentifier, "Pure factory pattern provider created", {
98
+ providerName: normalizedName,
99
+ modelName: finalModelName,
100
+ factoryUsed: true,
101
+ });
102
+ // PURE FACTORY PATTERN: All providers handled by ProviderFactory - no switch statements needed
164
103
  // Wrap with MCP if enabled
165
104
  if (enableMCP) {
166
105
  try {
@@ -182,7 +121,7 @@ export class AIProviderFactory {
182
121
  }
183
122
  logger.debug(`[${functionTag}] Provider creation succeeded`, {
184
123
  providerName,
185
- modelName: modelName || "default",
124
+ modelName: finalModelName || "default",
186
125
  providerType: provider.constructor.name,
187
126
  mcpEnabled: enableMCP,
188
127
  });
@@ -205,7 +144,7 @@ export class AIProviderFactory {
205
144
  * @returns AIProvider instance
206
145
  */
207
146
  static async createProviderWithModel(provider, model) {
208
- const functionTag = "AIProviderFactory.createProviderWithModel";
147
+ const functionTag = "AIawait ProviderFactory.createProviderWithModel";
209
148
  logger.debug(`[${functionTag}] Provider model creation started`, {
210
149
  provider,
211
150
  model,
@@ -236,7 +175,7 @@ export class AIProviderFactory {
236
175
  * @param enableMCP - Optional flag to enable MCP integration (default: true)
237
176
  * @returns AIProvider instance
238
177
  */
239
- static async createBestProvider(requestedProvider, modelName, enableMCP = true) {
178
+ static async createBestProvider(requestedProvider, modelName, enableMCP = true, sdk) {
240
179
  const functionTag = "AIProviderFactory.createBestProvider";
241
180
  try {
242
181
  const bestProvider = await getBestProvider(requestedProvider);
@@ -246,7 +185,7 @@ export class AIProviderFactory {
246
185
  modelName: modelName || "default",
247
186
  enableMCP,
248
187
  });
249
- return await this.createProvider(bestProvider, modelName, enableMCP);
188
+ return await this.createProvider(bestProvider, modelName, enableMCP, sdk);
250
189
  }
251
190
  catch (error) {
252
191
  const errorMessage = error instanceof Error ? error.message : String(error);
@@ -266,7 +205,7 @@ export class AIProviderFactory {
266
205
  * @returns Object with primary and fallback providers
267
206
  */
268
207
  static async createProviderWithFallback(primaryProvider, fallbackProvider, modelName, enableMCP = true) {
269
- const functionTag = "AIProviderFactory.createProviderWithFallback";
208
+ const functionTag = "AIawait ProviderFactory.createProviderWithFallback";
270
209
  logger.debug(`[${functionTag}] Fallback provider setup started`, {
271
210
  primaryProvider,
272
211
  fallbackProvider,
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Service Registry for Dependency Injection
3
+ * Breaks circular dependencies by providing lazy loading and centralized service management
4
+ */
5
+ export interface ServiceFactory<T = any> {
6
+ (): T | Promise<T>;
7
+ }
8
+ export interface ServiceRegistration {
9
+ factory: ServiceFactory;
10
+ singleton: boolean;
11
+ instance?: any;
12
+ }
13
+ export declare class ServiceRegistry {
14
+ private static services;
15
+ private static initializing;
16
+ /**
17
+ * Register a service with optional singleton behavior
18
+ */
19
+ static register<T>(name: string, factory: ServiceFactory<T>, options?: {
20
+ singleton?: boolean;
21
+ }): void;
22
+ /**
23
+ * Get a service instance with circular dependency detection
24
+ */
25
+ static get<T>(name: string): Promise<T>;
26
+ /**
27
+ * Get a service synchronously (throws if async initialization required)
28
+ */
29
+ static getSync<T>(name: string): T;
30
+ /**
31
+ * Check if a service is registered
32
+ */
33
+ static has(name: string): boolean;
34
+ /**
35
+ * Clear all services (useful for testing)
36
+ */
37
+ static clear(): void;
38
+ /**
39
+ * Get all registered service names
40
+ */
41
+ static getRegisteredServices(): string[];
42
+ /**
43
+ * Register multiple services at once
44
+ */
45
+ static registerBatch(services: Record<string, ServiceFactory>): void;
46
+ }
47
+ export declare const serviceRegistry: typeof ServiceRegistry;
@@ -0,0 +1,112 @@
1
+ /**
2
+ * Service Registry for Dependency Injection
3
+ * Breaks circular dependencies by providing lazy loading and centralized service management
4
+ */
5
+ import { logger } from "../utils/logger.js";
6
+ export class ServiceRegistry {
7
+ static services = new Map();
8
+ static initializing = new Set();
9
+ /**
10
+ * Register a service with optional singleton behavior
11
+ */
12
+ static register(name, factory, options = {}) {
13
+ if (this.services.has(name)) {
14
+ logger.warn(`Service ${name} is already registered. Overwriting.`);
15
+ }
16
+ this.services.set(name, {
17
+ factory,
18
+ singleton: options.singleton ?? true,
19
+ instance: undefined,
20
+ });
21
+ logger.debug(`Service registered: ${name} (singleton: ${options.singleton ?? true})`);
22
+ }
23
+ /**
24
+ * Get a service instance with circular dependency detection
25
+ */
26
+ static async get(name) {
27
+ const registration = this.services.get(name);
28
+ if (!registration) {
29
+ throw new Error(`Service ${name} not registered. Available services: ${Array.from(this.services.keys()).join(", ")}`);
30
+ }
31
+ // Check for circular dependency
32
+ if (this.initializing.has(name)) {
33
+ throw new Error(`Circular dependency detected: ${name} is already being initialized. Chain: ${Array.from(this.initializing).join(" -> ")} -> ${name}`);
34
+ }
35
+ // Return existing singleton instance if available
36
+ if (registration.singleton && registration.instance !== undefined) {
37
+ return registration.instance;
38
+ }
39
+ try {
40
+ // Mark as initializing to detect circular dependencies
41
+ this.initializing.add(name);
42
+ logger.debug(`Initializing service: ${name}`);
43
+ // Create new instance
44
+ const instance = await registration.factory();
45
+ // Store singleton instance
46
+ if (registration.singleton) {
47
+ registration.instance = instance;
48
+ }
49
+ logger.debug(`Service initialized: ${name}`);
50
+ return instance;
51
+ }
52
+ catch (error) {
53
+ logger.error(`Failed to initialize service ${name}:`, error);
54
+ throw error;
55
+ }
56
+ finally {
57
+ // Remove from initializing set
58
+ this.initializing.delete(name);
59
+ }
60
+ }
61
+ /**
62
+ * Get a service synchronously (throws if async initialization required)
63
+ */
64
+ static getSync(name) {
65
+ const registration = this.services.get(name);
66
+ if (!registration) {
67
+ throw new Error(`Service ${name} not registered`);
68
+ }
69
+ if (registration.singleton && registration.instance !== undefined) {
70
+ return registration.instance;
71
+ }
72
+ // Try synchronous initialization
73
+ const result = registration.factory();
74
+ if (result instanceof Promise) {
75
+ throw new Error(`Service ${name} requires asynchronous initialization. Use get() instead.`);
76
+ }
77
+ if (registration.singleton) {
78
+ registration.instance = result;
79
+ }
80
+ return result;
81
+ }
82
+ /**
83
+ * Check if a service is registered
84
+ */
85
+ static has(name) {
86
+ return this.services.has(name);
87
+ }
88
+ /**
89
+ * Clear all services (useful for testing)
90
+ */
91
+ static clear() {
92
+ this.services.clear();
93
+ this.initializing.clear();
94
+ logger.debug("Service registry cleared");
95
+ }
96
+ /**
97
+ * Get all registered service names
98
+ */
99
+ static getRegisteredServices() {
100
+ return Array.from(this.services.keys());
101
+ }
102
+ /**
103
+ * Register multiple services at once
104
+ */
105
+ static registerBatch(services) {
106
+ for (const [name, factory] of Object.entries(services)) {
107
+ this.register(name, factory);
108
+ }
109
+ }
110
+ }
111
+ // Export singleton instance for convenience
112
+ export const serviceRegistry = ServiceRegistry;
@@ -26,6 +26,8 @@ export interface TextGenerationResult {
26
26
  server: string;
27
27
  category?: string;
28
28
  }>;
29
+ analytics?: any;
30
+ evaluation?: any;
29
31
  }
30
32
  /**
31
33
  * Supported AI Provider Names
@@ -100,7 +102,10 @@ export interface StreamingOptions {
100
102
  * Text generation options interface
101
103
  */
102
104
  export interface TextGenerationOptions {
103
- prompt: string;
105
+ prompt?: string;
106
+ input?: {
107
+ text: string;
108
+ };
104
109
  provider?: AIProviderName;
105
110
  model?: string;
106
111
  temperature?: number;
@@ -109,6 +114,8 @@ export interface TextGenerationOptions {
109
114
  schema?: ZodType<unknown, ZodTypeDef, unknown> | Schema<unknown>;
110
115
  tools?: Record<string, Tool>;
111
116
  timeout?: number | string;
117
+ disableTools?: boolean;
118
+ maxSteps?: number;
112
119
  enableEvaluation?: boolean;
113
120
  enableAnalytics?: boolean;
114
121
  context?: Record<string, any>;
@@ -9,7 +9,7 @@ export class CompatibilityConversionFactory {
9
9
  static convertTextToGenerate(options) {
10
10
  const { prompt, ...rest } = options;
11
11
  return {
12
- input: { text: prompt },
12
+ input: { text: prompt || "" },
13
13
  output: { format: "text" },
14
14
  provider: rest.provider,
15
15
  model: rest.model,
@@ -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,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
+ }