@juspay/neurolink 6.0.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/CHANGELOG.md +14 -3
  2. package/dist/cli/commands/config.d.ts +13 -13
  3. package/dist/cli/index.js +3 -9
  4. package/dist/core/analytics.d.ts +11 -1
  5. package/dist/core/analytics.js +2 -2
  6. package/dist/core/base-provider.js +4 -18
  7. package/dist/core/dynamic-models.d.ts +8 -8
  8. package/dist/core/factory.js +3 -11
  9. package/dist/index.d.ts +2 -4
  10. package/dist/index.js +2 -11
  11. package/dist/lib/core/analytics.d.ts +11 -1
  12. package/dist/lib/core/analytics.js +2 -2
  13. package/dist/lib/core/base-provider.js +4 -18
  14. package/dist/lib/core/dynamic-models.d.ts +8 -8
  15. package/dist/lib/core/factory.js +3 -11
  16. package/dist/lib/index.d.ts +2 -4
  17. package/dist/lib/index.js +2 -11
  18. package/dist/lib/mcp/factory.d.ts +1 -1
  19. package/dist/lib/mcp/index.d.ts +7 -19
  20. package/dist/lib/mcp/index.js +15 -56
  21. package/dist/lib/neurolink.d.ts +1 -9
  22. package/dist/lib/neurolink.js +21 -70
  23. package/dist/lib/providers/amazon-bedrock.js +5 -16
  24. package/dist/lib/providers/anthropic-baseprovider.js +3 -21
  25. package/dist/lib/providers/anthropic.js +4 -7
  26. package/dist/lib/providers/azure-openai.js +4 -2
  27. package/dist/lib/providers/google-vertex.js +5 -9
  28. package/dist/lib/providers/huggingFace.js +5 -10
  29. package/dist/lib/providers/mistral.js +5 -8
  30. package/dist/lib/providers/openAI.js +4 -7
  31. package/dist/lib/utils/providerConfig.d.ts +117 -0
  32. package/dist/lib/utils/providerConfig.js +353 -0
  33. package/dist/lib/utils/providerUtils.d.ts +2 -1
  34. package/dist/lib/utils/providerUtils.js +53 -36
  35. package/dist/lib/utils/timeout.d.ts +72 -1
  36. package/dist/lib/utils/timeout.js +203 -2
  37. package/dist/mcp/factory.d.ts +1 -1
  38. package/dist/mcp/index.d.ts +7 -19
  39. package/dist/mcp/index.js +15 -56
  40. package/dist/neurolink.d.ts +1 -9
  41. package/dist/neurolink.js +21 -70
  42. package/dist/providers/amazon-bedrock.js +5 -16
  43. package/dist/providers/anthropic-baseprovider.js +3 -21
  44. package/dist/providers/anthropic.js +4 -7
  45. package/dist/providers/azure-openai.js +4 -2
  46. package/dist/providers/google-vertex.js +5 -9
  47. package/dist/providers/huggingFace.js +5 -10
  48. package/dist/providers/mistral.js +5 -8
  49. package/dist/providers/openAI.js +4 -7
  50. package/dist/utils/providerConfig.d.ts +117 -0
  51. package/dist/utils/providerConfig.js +353 -0
  52. package/dist/utils/providerUtils.d.ts +2 -1
  53. package/dist/utils/providerUtils.js +53 -36
  54. package/dist/utils/timeout.d.ts +72 -1
  55. package/dist/utils/timeout.js +203 -2
  56. package/package.json +2 -1
  57. package/dist/chat/client-utils.d.ts +0 -95
  58. package/dist/chat/client-utils.js +0 -315
  59. package/dist/chat/index.d.ts +0 -24
  60. package/dist/chat/index.js +0 -33
  61. package/dist/chat/session-storage.d.ts +0 -77
  62. package/dist/chat/session-storage.js +0 -233
  63. package/dist/chat/session.d.ts +0 -96
  64. package/dist/chat/session.js +0 -257
  65. package/dist/chat/sse-handler.d.ts +0 -49
  66. package/dist/chat/sse-handler.js +0 -259
  67. package/dist/chat/types.d.ts +0 -74
  68. package/dist/chat/types.js +0 -5
  69. package/dist/chat/websocket-chat-handler.d.ts +0 -37
  70. package/dist/chat/websocket-chat-handler.js +0 -262
  71. package/dist/cli/commands/mcp.d.ts +0 -20
  72. package/dist/cli/commands/mcp.js +0 -1272
  73. package/dist/core/defaults.d.ts +0 -19
  74. package/dist/core/defaults.js +0 -29
  75. package/dist/core/evaluation-config.d.ts +0 -29
  76. package/dist/core/evaluation-config.js +0 -144
  77. package/dist/factories/compatibility-factory.d.ts +0 -35
  78. package/dist/factories/compatibility-factory.js +0 -71
  79. package/dist/factories/provider-generate-factory.d.ts +0 -20
  80. package/dist/factories/provider-generate-factory.js +0 -93
  81. package/dist/lib/chat/client-utils.d.ts +0 -95
  82. package/dist/lib/chat/client-utils.js +0 -315
  83. package/dist/lib/chat/index.d.ts +0 -24
  84. package/dist/lib/chat/index.js +0 -33
  85. package/dist/lib/chat/session-storage.d.ts +0 -77
  86. package/dist/lib/chat/session-storage.js +0 -233
  87. package/dist/lib/chat/session.d.ts +0 -96
  88. package/dist/lib/chat/session.js +0 -257
  89. package/dist/lib/chat/sse-handler.d.ts +0 -49
  90. package/dist/lib/chat/sse-handler.js +0 -259
  91. package/dist/lib/chat/types.d.ts +0 -74
  92. package/dist/lib/chat/types.js +0 -5
  93. package/dist/lib/chat/websocket-chat-handler.d.ts +0 -37
  94. package/dist/lib/chat/websocket-chat-handler.js +0 -262
  95. package/dist/lib/core/defaults.d.ts +0 -19
  96. package/dist/lib/core/defaults.js +0 -29
  97. package/dist/lib/core/evaluation-config.d.ts +0 -29
  98. package/dist/lib/core/evaluation-config.js +0 -144
  99. package/dist/lib/factories/compatibility-factory.d.ts +0 -35
  100. package/dist/lib/factories/compatibility-factory.js +0 -71
  101. package/dist/lib/factories/provider-generate-factory.d.ts +0 -20
  102. package/dist/lib/factories/provider-generate-factory.js +0 -93
  103. package/dist/lib/mcp/adapters/plugin-bridge.d.ts +0 -40
  104. package/dist/lib/mcp/adapters/plugin-bridge.js +0 -89
  105. package/dist/lib/mcp/auto-discovery.d.ts +0 -62
  106. package/dist/lib/mcp/auto-discovery.js +0 -149
  107. package/dist/lib/mcp/client.d.ts +0 -68
  108. package/dist/lib/mcp/client.js +0 -248
  109. package/dist/lib/mcp/config.d.ts +0 -31
  110. package/dist/lib/mcp/config.js +0 -99
  111. package/dist/lib/mcp/context-manager.d.ts +0 -171
  112. package/dist/lib/mcp/context-manager.js +0 -362
  113. package/dist/lib/mcp/contracts/mcp-contract.d.ts +0 -169
  114. package/dist/lib/mcp/contracts/mcp-contract.js +0 -58
  115. package/dist/lib/mcp/core/plugin-manager.d.ts +0 -46
  116. package/dist/lib/mcp/core/plugin-manager.js +0 -110
  117. package/dist/lib/mcp/demo/plugin-demo.d.ts +0 -20
  118. package/dist/lib/mcp/demo/plugin-demo.js +0 -118
  119. package/dist/lib/mcp/dynamic-chain-executor.d.ts +0 -225
  120. package/dist/lib/mcp/dynamic-chain-executor.js +0 -489
  121. package/dist/lib/mcp/dynamic-orchestrator.d.ts +0 -115
  122. package/dist/lib/mcp/dynamic-orchestrator.js +0 -351
  123. package/dist/lib/mcp/ecosystem.d.ts +0 -75
  124. package/dist/lib/mcp/ecosystem.js +0 -161
  125. package/dist/lib/mcp/error-manager.d.ts +0 -254
  126. package/dist/lib/mcp/error-manager.js +0 -501
  127. package/dist/lib/mcp/error-recovery.d.ts +0 -159
  128. package/dist/lib/mcp/error-recovery.js +0 -405
  129. package/dist/lib/mcp/external-client.d.ts +0 -88
  130. package/dist/lib/mcp/external-client.js +0 -331
  131. package/dist/lib/mcp/external-manager.d.ts +0 -112
  132. package/dist/lib/mcp/external-manager.js +0 -308
  133. package/dist/lib/mcp/function-calling.d.ts +0 -65
  134. package/dist/lib/mcp/function-calling.js +0 -642
  135. package/dist/lib/mcp/health-monitor.d.ts +0 -257
  136. package/dist/lib/mcp/health-monitor.js +0 -630
  137. package/dist/lib/mcp/initialize-tools.d.ts +0 -29
  138. package/dist/lib/mcp/initialize-tools.js +0 -261
  139. package/dist/lib/mcp/initialize.d.ts +0 -18
  140. package/dist/lib/mcp/initialize.js +0 -62
  141. package/dist/lib/mcp/manager.d.ts +0 -68
  142. package/dist/lib/mcp/manager.js +0 -176
  143. package/dist/lib/mcp/neurolink-mcp-client.d.ts +0 -97
  144. package/dist/lib/mcp/neurolink-mcp-client.js +0 -462
  145. package/dist/lib/mcp/orchestrator.d.ts +0 -302
  146. package/dist/lib/mcp/orchestrator.js +0 -703
  147. package/dist/lib/mcp/plugin-manager.d.ts +0 -98
  148. package/dist/lib/mcp/plugin-manager.js +0 -296
  149. package/dist/lib/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
  150. package/dist/lib/mcp/plugins/core/filesystem-mcp.js +0 -142
  151. package/dist/lib/mcp/plugins/filesystem-mcp.d.ts +0 -37
  152. package/dist/lib/mcp/plugins/filesystem-mcp.js +0 -54
  153. package/dist/lib/mcp/security-manager.d.ts +0 -87
  154. package/dist/lib/mcp/security-manager.js +0 -344
  155. package/dist/lib/mcp/semaphore-manager.d.ts +0 -137
  156. package/dist/lib/mcp/semaphore-manager.js +0 -329
  157. package/dist/lib/mcp/session-manager.d.ts +0 -187
  158. package/dist/lib/mcp/session-manager.js +0 -400
  159. package/dist/lib/mcp/session-persistence.d.ts +0 -93
  160. package/dist/lib/mcp/session-persistence.js +0 -301
  161. package/dist/lib/mcp/tool-integration.d.ts +0 -58
  162. package/dist/lib/mcp/tool-integration.js +0 -203
  163. package/dist/lib/mcp/transport-manager.d.ts +0 -154
  164. package/dist/lib/mcp/transport-manager.js +0 -334
  165. package/dist/lib/mcp/unified-mcp.d.ts +0 -133
  166. package/dist/lib/mcp/unified-mcp.js +0 -251
  167. package/dist/lib/mcp/unified-registry.d.ts +0 -165
  168. package/dist/lib/mcp/unified-registry.js +0 -538
  169. package/dist/lib/providers/analytics-helper.d.ts +0 -38
  170. package/dist/lib/providers/analytics-helper.js +0 -216
  171. package/dist/lib/providers/function-calling-provider.d.ts +0 -142
  172. package/dist/lib/providers/function-calling-provider.js +0 -630
  173. package/dist/lib/providers/mcp-provider.d.ts +0 -75
  174. package/dist/lib/providers/mcp-provider.js +0 -283
  175. package/dist/lib/providers/timeout-wrapper.d.ts +0 -40
  176. package/dist/lib/providers/timeout-wrapper.js +0 -100
  177. package/dist/lib/sdk/tool-extension.d.ts +0 -181
  178. package/dist/lib/sdk/tool-extension.js +0 -284
  179. package/dist/lib/services/streaming/streaming-manager.d.ts +0 -29
  180. package/dist/lib/services/streaming/streaming-manager.js +0 -245
  181. package/dist/lib/services/types.d.ts +0 -156
  182. package/dist/lib/services/types.js +0 -2
  183. package/dist/lib/services/websocket/websocket-server.d.ts +0 -34
  184. package/dist/lib/services/websocket/websocket-server.js +0 -305
  185. package/dist/lib/utils/provider-validation.d.ts +0 -36
  186. package/dist/lib/utils/provider-validation.js +0 -625
  187. package/dist/lib/utils/providerUtils-fixed.d.ts +0 -8
  188. package/dist/lib/utils/providerUtils-fixed.js +0 -94
  189. package/dist/lib/utils/streaming-utils.d.ts +0 -79
  190. package/dist/lib/utils/streaming-utils.js +0 -198
  191. package/dist/lib/utils/timeout-manager.d.ts +0 -75
  192. package/dist/lib/utils/timeout-manager.js +0 -244
  193. package/dist/mcp/adapters/plugin-bridge.d.ts +0 -40
  194. package/dist/mcp/adapters/plugin-bridge.js +0 -89
  195. package/dist/mcp/auto-discovery.d.ts +0 -62
  196. package/dist/mcp/auto-discovery.js +0 -149
  197. package/dist/mcp/client.d.ts +0 -68
  198. package/dist/mcp/client.js +0 -248
  199. package/dist/mcp/config.d.ts +0 -31
  200. package/dist/mcp/config.js +0 -99
  201. package/dist/mcp/context-manager.d.ts +0 -171
  202. package/dist/mcp/context-manager.js +0 -362
  203. package/dist/mcp/contracts/mcp-contract.d.ts +0 -169
  204. package/dist/mcp/contracts/mcp-contract.js +0 -58
  205. package/dist/mcp/core/plugin-manager.d.ts +0 -46
  206. package/dist/mcp/core/plugin-manager.js +0 -110
  207. package/dist/mcp/demo/plugin-demo.d.ts +0 -20
  208. package/dist/mcp/demo/plugin-demo.js +0 -118
  209. package/dist/mcp/dynamic-chain-executor.d.ts +0 -225
  210. package/dist/mcp/dynamic-chain-executor.js +0 -489
  211. package/dist/mcp/dynamic-orchestrator.d.ts +0 -115
  212. package/dist/mcp/dynamic-orchestrator.js +0 -351
  213. package/dist/mcp/ecosystem.d.ts +0 -75
  214. package/dist/mcp/ecosystem.js +0 -162
  215. package/dist/mcp/error-manager.d.ts +0 -254
  216. package/dist/mcp/error-manager.js +0 -501
  217. package/dist/mcp/error-recovery.d.ts +0 -159
  218. package/dist/mcp/error-recovery.js +0 -405
  219. package/dist/mcp/external-client.d.ts +0 -88
  220. package/dist/mcp/external-client.js +0 -331
  221. package/dist/mcp/external-manager.d.ts +0 -112
  222. package/dist/mcp/external-manager.js +0 -308
  223. package/dist/mcp/function-calling.d.ts +0 -65
  224. package/dist/mcp/function-calling.js +0 -642
  225. package/dist/mcp/health-monitor.d.ts +0 -257
  226. package/dist/mcp/health-monitor.js +0 -630
  227. package/dist/mcp/initialize-tools.d.ts +0 -29
  228. package/dist/mcp/initialize-tools.js +0 -262
  229. package/dist/mcp/initialize.d.ts +0 -18
  230. package/dist/mcp/initialize.js +0 -62
  231. package/dist/mcp/manager.d.ts +0 -68
  232. package/dist/mcp/manager.js +0 -176
  233. package/dist/mcp/neurolink-mcp-client.d.ts +0 -97
  234. package/dist/mcp/neurolink-mcp-client.js +0 -462
  235. package/dist/mcp/orchestrator.d.ts +0 -302
  236. package/dist/mcp/orchestrator.js +0 -703
  237. package/dist/mcp/plugin-manager.d.ts +0 -98
  238. package/dist/mcp/plugin-manager.js +0 -297
  239. package/dist/mcp/plugins/core/filesystem-mcp.d.ts +0 -36
  240. package/dist/mcp/plugins/core/filesystem-mcp.js +0 -142
  241. package/dist/mcp/plugins/core/neurolink-mcp.json +0 -17
  242. package/dist/mcp/plugins/filesystem-mcp.d.ts +0 -37
  243. package/dist/mcp/plugins/filesystem-mcp.js +0 -54
  244. package/dist/mcp/security-manager.d.ts +0 -87
  245. package/dist/mcp/security-manager.js +0 -344
  246. package/dist/mcp/semaphore-manager.d.ts +0 -137
  247. package/dist/mcp/semaphore-manager.js +0 -329
  248. package/dist/mcp/session-manager.d.ts +0 -187
  249. package/dist/mcp/session-manager.js +0 -400
  250. package/dist/mcp/session-persistence.d.ts +0 -93
  251. package/dist/mcp/session-persistence.js +0 -302
  252. package/dist/mcp/tool-integration.d.ts +0 -58
  253. package/dist/mcp/tool-integration.js +0 -203
  254. package/dist/mcp/transport-manager.d.ts +0 -154
  255. package/dist/mcp/transport-manager.js +0 -335
  256. package/dist/mcp/unified-mcp.d.ts +0 -133
  257. package/dist/mcp/unified-mcp.js +0 -251
  258. package/dist/mcp/unified-registry.d.ts +0 -165
  259. package/dist/mcp/unified-registry.js +0 -539
  260. package/dist/providers/analytics-helper.d.ts +0 -38
  261. package/dist/providers/analytics-helper.js +0 -216
  262. package/dist/providers/function-calling-provider.d.ts +0 -142
  263. package/dist/providers/function-calling-provider.js +0 -630
  264. package/dist/providers/mcp-provider.d.ts +0 -75
  265. package/dist/providers/mcp-provider.js +0 -283
  266. package/dist/providers/timeout-wrapper.d.ts +0 -40
  267. package/dist/providers/timeout-wrapper.js +0 -100
  268. package/dist/sdk/tool-extension.d.ts +0 -181
  269. package/dist/sdk/tool-extension.js +0 -284
  270. package/dist/services/streaming/streaming-manager.d.ts +0 -29
  271. package/dist/services/streaming/streaming-manager.js +0 -245
  272. package/dist/services/types.d.ts +0 -156
  273. package/dist/services/types.js +0 -2
  274. package/dist/services/websocket/websocket-server.d.ts +0 -34
  275. package/dist/services/websocket/websocket-server.js +0 -306
  276. package/dist/utils/provider-validation.d.ts +0 -36
  277. package/dist/utils/provider-validation.js +0 -625
  278. package/dist/utils/providerUtils-fixed.d.ts +0 -8
  279. package/dist/utils/providerUtils-fixed.js +0 -94
  280. package/dist/utils/streaming-utils.d.ts +0 -79
  281. package/dist/utils/streaming-utils.js +0 -198
  282. package/dist/utils/timeout-manager.d.ts +0 -75
  283. package/dist/utils/timeout-manager.js +0 -244
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Provider Configuration Utility
3
+ * Consolidated configuration helpers for all AI providers
4
+ * Eliminates duplicate error messages and configuration logic
5
+ * Enhanced with format validation and advanced error classification
6
+ */
7
+ /**
8
+ * Configuration options for provider validation
9
+ */
10
+ export interface ProviderConfigOptions {
11
+ providerName: string;
12
+ envVarName: string;
13
+ setupUrl: string;
14
+ description: string;
15
+ instructions: string[];
16
+ fallbackEnvVars?: string[];
17
+ }
18
+ /**
19
+ * Enhanced validation result with format checking
20
+ */
21
+ export interface ValidationResult {
22
+ isValid: boolean;
23
+ apiKey: string;
24
+ formatValid?: boolean;
25
+ errorType?: "missing" | "format" | "config";
26
+ error?: string;
27
+ }
28
+ /**
29
+ * Validates API key format for a specific provider
30
+ * @param providerKey Provider identifier (e.g., 'openai', 'anthropic')
31
+ * @param apiKey The API key to validate
32
+ * @returns True if format is valid
33
+ */
34
+ export declare function validateApiKeyFormat(providerKey: string, apiKey: string): boolean;
35
+ /**
36
+ * Enhanced validation with format checking
37
+ * @param config Provider configuration options
38
+ * @param enableFormatValidation Whether to validate API key format
39
+ * @returns Validation result with detailed information
40
+ */
41
+ export declare function validateApiKeyEnhanced(config: ProviderConfigOptions, enableFormatValidation?: boolean): ValidationResult;
42
+ /**
43
+ * Validates an API key for a provider and returns it (BACKWARD COMPATIBLE)
44
+ * Throws detailed error message if validation fails
45
+ * @param config Provider configuration options
46
+ * @returns The validated API key
47
+ */
48
+ export declare function validateApiKey(config: ProviderConfigOptions): string;
49
+ /**
50
+ * Gets a provider model with fallback to default
51
+ * @param envVar Environment variable name for the model
52
+ * @param defaultModel Default model to use if env var not set
53
+ * @returns The model name to use
54
+ */
55
+ export declare function getProviderModel(envVar: string, defaultModel: string): string;
56
+ /**
57
+ * Checks if provider credentials are available
58
+ * @param envVars Array of environment variable names to check
59
+ * @returns True if any of the credentials are available
60
+ */
61
+ export declare function hasProviderCredentials(envVars: string[]): boolean;
62
+ /**
63
+ * Creates Anthropic provider configuration
64
+ */
65
+ export declare function createAnthropicConfig(): ProviderConfigOptions;
66
+ /**
67
+ * Creates OpenAI provider configuration
68
+ */
69
+ export declare function createOpenAIConfig(): ProviderConfigOptions;
70
+ /**
71
+ * Creates HuggingFace provider configuration
72
+ */
73
+ export declare function createHuggingFaceConfig(): ProviderConfigOptions;
74
+ /**
75
+ * Creates Mistral provider configuration
76
+ */
77
+ export declare function createMistralConfig(): ProviderConfigOptions;
78
+ /**
79
+ * Creates AWS Access Key configuration for Bedrock
80
+ */
81
+ export declare function createAWSAccessKeyConfig(): ProviderConfigOptions;
82
+ /**
83
+ * Creates AWS Secret Key configuration for Bedrock
84
+ */
85
+ export declare function createAWSSecretConfig(): ProviderConfigOptions;
86
+ /**
87
+ * Creates Azure OpenAI API Key configuration
88
+ */
89
+ export declare function createAzureAPIKeyConfig(): ProviderConfigOptions;
90
+ /**
91
+ * Creates Azure OpenAI Endpoint configuration
92
+ */
93
+ export declare function createAzureEndpointConfig(): ProviderConfigOptions;
94
+ /**
95
+ * Creates Google Vertex Project ID configuration
96
+ */
97
+ export declare function createVertexProjectConfig(): ProviderConfigOptions;
98
+ /**
99
+ * Creates Google Cloud Authentication configuration
100
+ */
101
+ export declare function createGoogleAuthConfig(): ProviderConfigOptions;
102
+ /**
103
+ * Creates Anthropic Base Provider configuration
104
+ */
105
+ export declare function createAnthropicBaseConfig(): ProviderConfigOptions;
106
+ /**
107
+ * Gets AWS Region with default fallback
108
+ */
109
+ export declare function getAWSRegion(): string;
110
+ /**
111
+ * Gets AWS Session Token if available
112
+ */
113
+ export declare function getAWSSessionToken(): string | undefined;
114
+ /**
115
+ * Checks if HuggingFace credentials are available
116
+ */
117
+ export declare function hasHuggingFaceCredentials(): boolean;
@@ -0,0 +1,353 @@
1
+ /**
2
+ * Provider Configuration Utility
3
+ * Consolidated configuration helpers for all AI providers
4
+ * Eliminates duplicate error messages and configuration logic
5
+ * Enhanced with format validation and advanced error classification
6
+ */
7
+ /**
8
+ * API key format validation patterns (extracted from advanced validation system)
9
+ */
10
+ const API_KEY_FORMATS = {
11
+ openai: /^sk-[A-Za-z0-9]{48,}$/,
12
+ anthropic: /^sk-ant-[A-Za-z0-9\-_]{95,}$/,
13
+ "google-ai": /^AIza[A-Za-z0-9\-_]{35}$/,
14
+ huggingface: /^hf_[A-Za-z0-9]{37}$/,
15
+ mistral: /^[A-Za-z0-9]{32}$/,
16
+ azure: /^[A-Za-z0-9]{32,}$/,
17
+ aws: /^[A-Z0-9]{20}$/, // Access Key ID format
18
+ "google-vertex": /^[A-Za-z0-9\-_]{1,}$/, // Project ID format
19
+ };
20
+ /**
21
+ * Validates API key format for a specific provider
22
+ * @param providerKey Provider identifier (e.g., 'openai', 'anthropic')
23
+ * @param apiKey The API key to validate
24
+ * @returns True if format is valid
25
+ */
26
+ export function validateApiKeyFormat(providerKey, apiKey) {
27
+ const format = API_KEY_FORMATS[providerKey.toLowerCase()];
28
+ if (!format) {
29
+ // No format validation available, assume valid if not empty
30
+ return apiKey.length > 0;
31
+ }
32
+ return format.test(apiKey);
33
+ }
34
+ /**
35
+ * Enhanced validation with format checking
36
+ * @param config Provider configuration options
37
+ * @param enableFormatValidation Whether to validate API key format
38
+ * @returns Validation result with detailed information
39
+ */
40
+ export function validateApiKeyEnhanced(config, enableFormatValidation = false) {
41
+ // Check primary environment variable
42
+ let apiKey = process.env[config.envVarName];
43
+ // Check fallback environment variables if provided
44
+ if (!apiKey && config.fallbackEnvVars) {
45
+ for (const fallbackVar of config.fallbackEnvVars) {
46
+ apiKey = process.env[fallbackVar];
47
+ if (apiKey) {
48
+ break;
49
+ }
50
+ }
51
+ }
52
+ if (!apiKey) {
53
+ return {
54
+ isValid: false,
55
+ apiKey: "",
56
+ errorType: "missing",
57
+ error: createConfigErrorMessage(config),
58
+ };
59
+ }
60
+ // Optional format validation
61
+ if (enableFormatValidation) {
62
+ const providerKey = config.providerName.toLowerCase().replace(/\s/g, "-");
63
+ const formatValid = validateApiKeyFormat(providerKey, apiKey);
64
+ if (!formatValid) {
65
+ return {
66
+ isValid: false,
67
+ apiKey,
68
+ formatValid: false,
69
+ errorType: "format",
70
+ error: `Invalid ${config.providerName} API key format. Please check your API key.`,
71
+ };
72
+ }
73
+ }
74
+ return {
75
+ isValid: true,
76
+ apiKey,
77
+ formatValid: enableFormatValidation ? true : undefined,
78
+ };
79
+ }
80
+ /**
81
+ * Validates an API key for a provider and returns it (BACKWARD COMPATIBLE)
82
+ * Throws detailed error message if validation fails
83
+ * @param config Provider configuration options
84
+ * @returns The validated API key
85
+ */
86
+ export function validateApiKey(config) {
87
+ // Check primary environment variable
88
+ let apiKey = process.env[config.envVarName];
89
+ // Check fallback environment variables if provided
90
+ if (!apiKey && config.fallbackEnvVars) {
91
+ for (const fallbackVar of config.fallbackEnvVars) {
92
+ apiKey = process.env[fallbackVar];
93
+ if (apiKey) {
94
+ break;
95
+ }
96
+ }
97
+ }
98
+ if (!apiKey) {
99
+ throw new Error(createConfigErrorMessage(config));
100
+ }
101
+ return apiKey;
102
+ }
103
+ /**
104
+ * Creates a standardized configuration error message
105
+ * @param config Provider configuration options
106
+ * @returns Formatted error message with setup instructions
107
+ */
108
+ function createConfigErrorMessage(config) {
109
+ const envVarsList = config.fallbackEnvVars
110
+ ? [config.envVarName, ...config.fallbackEnvVars].join(" or ")
111
+ : config.envVarName;
112
+ return `❌ ${config.providerName} Provider Configuration Error
113
+
114
+ Missing required environment variable: ${envVarsList}
115
+
116
+ 🔧 Step 1: Get ${config.description}
117
+ ${config.instructions.join("\n")}
118
+
119
+ 🔧 Step 2: Set Environment Variable
120
+ Add to your .env file:
121
+ ${config.envVarName}=your_key_here
122
+
123
+ 🔧 Step 3: Restart Application
124
+ Restart your application to load the new environment variables.`;
125
+ }
126
+ /**
127
+ * Gets a provider model with fallback to default
128
+ * @param envVar Environment variable name for the model
129
+ * @param defaultModel Default model to use if env var not set
130
+ * @returns The model name to use
131
+ */
132
+ export function getProviderModel(envVar, defaultModel) {
133
+ return process.env[envVar] || defaultModel;
134
+ }
135
+ /**
136
+ * Checks if provider credentials are available
137
+ * @param envVars Array of environment variable names to check
138
+ * @returns True if any of the credentials are available
139
+ */
140
+ export function hasProviderCredentials(envVars) {
141
+ return envVars.some((envVar) => !!process.env[envVar]);
142
+ }
143
+ // =============================================================================
144
+ // PROVIDER-SPECIFIC CONFIGURATION CREATORS
145
+ // =============================================================================
146
+ /**
147
+ * Creates Anthropic provider configuration
148
+ */
149
+ export function createAnthropicConfig() {
150
+ return {
151
+ providerName: "Anthropic",
152
+ envVarName: "ANTHROPIC_API_KEY",
153
+ setupUrl: "https://console.anthropic.com/",
154
+ description: "Anthropic API Key",
155
+ instructions: [
156
+ "1. Visit: https://console.anthropic.com/",
157
+ "2. Sign in or create an account",
158
+ "3. Go to API Keys section",
159
+ "4. Create a new API key",
160
+ ],
161
+ };
162
+ }
163
+ /**
164
+ * Creates OpenAI provider configuration
165
+ */
166
+ export function createOpenAIConfig() {
167
+ return {
168
+ providerName: "OPENAI",
169
+ envVarName: "OPENAI_API_KEY",
170
+ setupUrl: "https://platform.openai.com/api-keys",
171
+ description: "Credentials",
172
+ instructions: [
173
+ "1. Visit: https://platform.openai.com/api-keys",
174
+ "2. Create new API key",
175
+ "3. Copy the key",
176
+ ],
177
+ };
178
+ }
179
+ /**
180
+ * Creates HuggingFace provider configuration
181
+ */
182
+ export function createHuggingFaceConfig() {
183
+ return {
184
+ providerName: "HuggingFace",
185
+ envVarName: "HUGGINGFACE_API_KEY",
186
+ setupUrl: "https://huggingface.co/settings/tokens",
187
+ description: "Credentials",
188
+ instructions: [
189
+ "1. Visit: https://huggingface.co/settings/tokens",
190
+ "2. Create new API token",
191
+ "3. Copy the token",
192
+ ],
193
+ fallbackEnvVars: ["HF_TOKEN"],
194
+ };
195
+ }
196
+ /**
197
+ * Creates Mistral provider configuration
198
+ */
199
+ export function createMistralConfig() {
200
+ return {
201
+ providerName: "Mistral",
202
+ envVarName: "MISTRAL_API_KEY",
203
+ setupUrl: "https://console.mistral.ai/",
204
+ description: "API key",
205
+ instructions: [
206
+ "1. Visit: https://console.mistral.ai/",
207
+ "2. Create or sign in to your account",
208
+ "3. Generate a new API key",
209
+ ],
210
+ };
211
+ }
212
+ /**
213
+ * Creates AWS Access Key configuration for Bedrock
214
+ */
215
+ export function createAWSAccessKeyConfig() {
216
+ return {
217
+ providerName: "AWS Bedrock",
218
+ envVarName: "AWS_ACCESS_KEY_ID",
219
+ setupUrl: "https://console.aws.amazon.com/iam/",
220
+ description: "AWS Credentials",
221
+ instructions: [
222
+ "1. Visit: https://console.aws.amazon.com/iam/",
223
+ "2. Create IAM user with Bedrock permissions",
224
+ "3. Generate access key",
225
+ ],
226
+ };
227
+ }
228
+ /**
229
+ * Creates AWS Secret Key configuration for Bedrock
230
+ */
231
+ export function createAWSSecretConfig() {
232
+ return {
233
+ providerName: "AWS Bedrock",
234
+ envVarName: "AWS_SECRET_ACCESS_KEY",
235
+ setupUrl: "https://console.aws.amazon.com/iam/",
236
+ description: "AWS Credentials",
237
+ instructions: [
238
+ "1. Visit: https://console.aws.amazon.com/iam/",
239
+ "2. Create IAM user with Bedrock permissions",
240
+ "3. Generate access key",
241
+ ],
242
+ };
243
+ }
244
+ /**
245
+ * Creates Azure OpenAI API Key configuration
246
+ */
247
+ export function createAzureAPIKeyConfig() {
248
+ return {
249
+ providerName: "Azure OpenAI",
250
+ envVarName: "AZURE_OPENAI_API_KEY",
251
+ setupUrl: "https://portal.azure.com/",
252
+ description: "Azure OpenAI API Key",
253
+ instructions: [
254
+ "1. Visit: https://portal.azure.com/",
255
+ "2. Create or access Azure OpenAI resource",
256
+ "3. Get API key from Keys and Endpoint section",
257
+ ],
258
+ };
259
+ }
260
+ /**
261
+ * Creates Azure OpenAI Endpoint configuration
262
+ */
263
+ export function createAzureEndpointConfig() {
264
+ return {
265
+ providerName: "Azure OpenAI",
266
+ envVarName: "AZURE_OPENAI_ENDPOINT",
267
+ setupUrl: "https://portal.azure.com/",
268
+ description: "Azure OpenAI Endpoint",
269
+ instructions: [
270
+ "1. Visit: https://portal.azure.com/",
271
+ "2. Access your Azure OpenAI resource",
272
+ "3. Copy endpoint URL from Keys and Endpoint section",
273
+ ],
274
+ };
275
+ }
276
+ /**
277
+ * Creates Google Vertex Project ID configuration
278
+ */
279
+ export function createVertexProjectConfig() {
280
+ return {
281
+ providerName: "Google Vertex AI",
282
+ envVarName: "GOOGLE_CLOUD_PROJECT_ID",
283
+ setupUrl: "https://console.cloud.google.com/",
284
+ description: "Google Cloud Credentials",
285
+ instructions: [
286
+ "1. Visit: https://console.cloud.google.com/",
287
+ "2. Create or select a project",
288
+ "3. Enable Vertex AI API",
289
+ "4. Set up authentication",
290
+ ],
291
+ fallbackEnvVars: ["VERTEX_PROJECT_ID"],
292
+ };
293
+ }
294
+ /**
295
+ * Creates Google Cloud Authentication configuration
296
+ */
297
+ export function createGoogleAuthConfig() {
298
+ return {
299
+ providerName: "Google Vertex AI",
300
+ envVarName: "GOOGLE_APPLICATION_CREDENTIALS",
301
+ setupUrl: "https://console.cloud.google.com/",
302
+ description: "Google Cloud authentication",
303
+ instructions: [
304
+ "🔧 Option 1: Service Account Key File",
305
+ "GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json",
306
+ "",
307
+ "🔧 Option 2: Service Account Key (Base64)",
308
+ "GOOGLE_SERVICE_ACCOUNT_KEY=base64_encoded_key",
309
+ "",
310
+ "🔧 Option 3: Individual Credentials",
311
+ "GOOGLE_AUTH_CLIENT_EMAIL=your-service-account@project.iam.gserviceaccount.com",
312
+ "GOOGLE_AUTH_PRIVATE_KEY=-----BEGIN PRIVATE KEY-----...",
313
+ ],
314
+ fallbackEnvVars: ["GOOGLE_SERVICE_ACCOUNT_KEY", "GOOGLE_AUTH_CLIENT_EMAIL"],
315
+ };
316
+ }
317
+ /**
318
+ * Creates Anthropic Base Provider configuration
319
+ */
320
+ export function createAnthropicBaseConfig() {
321
+ return {
322
+ providerName: "ANTHROPIC",
323
+ envVarName: "ANTHROPIC_API_KEY",
324
+ setupUrl: "https://console.anthropic.com/",
325
+ description: "Credentials",
326
+ instructions: [
327
+ "Get your API key from https://console.anthropic.com/",
328
+ "",
329
+ "💡 Step 2: Add to your .env file (or export in CLI):",
330
+ ],
331
+ };
332
+ }
333
+ // =============================================================================
334
+ // HELPER FUNCTIONS FOR SPECIFIC PROVIDER NEEDS
335
+ // =============================================================================
336
+ /**
337
+ * Gets AWS Region with default fallback
338
+ */
339
+ export function getAWSRegion() {
340
+ return process.env.AWS_REGION || "us-east-1";
341
+ }
342
+ /**
343
+ * Gets AWS Session Token if available
344
+ */
345
+ export function getAWSSessionToken() {
346
+ return process.env.AWS_SESSION_TOKEN;
347
+ }
348
+ /**
349
+ * Checks if HuggingFace credentials are available
350
+ */
351
+ export function hasHuggingFaceCredentials() {
352
+ return hasProviderCredentials(["HUGGINGFACE_API_KEY", "HF_TOKEN"]);
353
+ }
@@ -1,5 +1,6 @@
1
1
  /**
2
- * Get the best available provider based on preferences and availability (async)
2
+ * Get the best available provider based on real-time availability checks
3
+ * Enhanced version consolidated from providerUtils-fixed.ts
3
4
  * @param requestedProvider - Optional preferred provider name
4
5
  * @returns The best provider name to use
5
6
  */
@@ -1,50 +1,33 @@
1
1
  /**
2
2
  * Utility functions for AI provider management
3
+ * Consolidated from providerUtils-fixed.ts
3
4
  */
5
+ import { AIProviderFactory } from "../core/factory.js";
4
6
  import { logger } from "./logger.js";
5
7
  /**
6
- * Get the best available provider based on preferences and availability (async)
8
+ * Get the best available provider based on real-time availability checks
9
+ * Enhanced version consolidated from providerUtils-fixed.ts
7
10
  * @param requestedProvider - Optional preferred provider name
8
11
  * @returns The best provider name to use
9
12
  */
10
13
  export async function getBestProvider(requestedProvider) {
11
- // If a specific provider is requested, return it (existing logic)
12
- if (requestedProvider && requestedProvider !== "auto") {
13
- return requestedProvider;
14
- }
15
14
  // 🔧 FIX: Check for explicit default provider in env
16
15
  if (process.env.DEFAULT_PROVIDER &&
17
- isProviderConfigured(process.env.DEFAULT_PROVIDER)) {
16
+ (await isProviderAvailable(process.env.DEFAULT_PROVIDER))) {
18
17
  return process.env.DEFAULT_PROVIDER;
19
18
  }
20
- // 🔧 FIX: Special case for Ollama when explicitly configured
19
+ // 🔧 FIX: Special case for Ollama - prioritize local when available
21
20
  if (process.env.OLLAMA_BASE_URL && process.env.OLLAMA_MODEL) {
22
- // Quick connectivity check for Ollama (non-blocking)
23
21
  try {
24
- const controller = new AbortController();
25
- const timeout = setTimeout(() => controller.abort(), 2000);
26
- let res;
27
- try {
28
- res = await fetch("http://localhost:11434/api/tags", {
29
- method: "GET",
30
- signal: controller.signal,
31
- });
32
- clearTimeout(timeout);
33
- if (res.ok) {
34
- return "ollama"; // Prioritize working local AI
35
- }
36
- }
37
- catch {
38
- clearTimeout(timeout);
39
- // Fall through to cloud providers
22
+ if (await isProviderAvailable("ollama")) {
23
+ logger.debug(`[getBestProvider] Prioritizing working local Ollama`);
24
+ return "ollama"; // Prioritize working local AI
40
25
  }
41
- // Removed redundant if (res.ok) block here
42
26
  }
43
27
  catch {
44
28
  // Fall through to cloud providers
45
29
  }
46
30
  }
47
- // Existing provider priority logic...
48
31
  const providers = [
49
32
  "google-ai",
50
33
  "anthropic",
@@ -56,24 +39,58 @@ export async function getBestProvider(requestedProvider) {
56
39
  "bedrock",
57
40
  "ollama", // Keep as fallback
58
41
  ];
59
- // Check which providers have their required environment variables
42
+ if (requestedProvider && requestedProvider !== "auto") {
43
+ if (await isProviderAvailable(requestedProvider)) {
44
+ logger.debug(`[getBestProvider] Using requested provider: ${requestedProvider}`);
45
+ return requestedProvider;
46
+ }
47
+ else {
48
+ logger.warn(`[getBestProvider] Requested provider '${requestedProvider}' is not available. Falling back to auto-selection.`);
49
+ }
50
+ }
60
51
  for (const provider of providers) {
61
- if (isProviderConfigured(provider)) {
52
+ if (await isProviderAvailable(provider)) {
62
53
  logger.debug(`[getBestProvider] Selected provider: ${provider}`);
63
54
  return provider;
64
55
  }
65
56
  }
66
- // Default to bedrock if nothing is configured
67
- logger.warn("[getBestProvider] No providers configured, defaulting to bedrock");
68
- return "bedrock";
57
+ throw new Error("No available AI providers. Please check your configurations.");
69
58
  }
70
59
  /**
71
- * Check if a provider has the minimum required configuration
72
- * @param provider - Provider name to check
73
- * @returns True if the provider appears to be configured
60
+ * Check if a provider is truly available by performing a quick authentication test.
61
+ * Enhanced function consolidated from providerUtils-fixed.ts
62
+ * @param providerName - The name of the provider to check.
63
+ * @returns True if the provider is available and authenticated.
74
64
  */
75
- function isProviderConfigured(provider) {
76
- return hasProviderEnvVars(provider);
65
+ async function isProviderAvailable(providerName) {
66
+ if (!hasProviderEnvVars(providerName) && providerName !== "ollama") {
67
+ return false;
68
+ }
69
+ if (providerName === "ollama") {
70
+ try {
71
+ const response = await fetch("http://localhost:11434/api/tags", {
72
+ method: "GET",
73
+ signal: AbortSignal.timeout(2000),
74
+ });
75
+ if (response.ok) {
76
+ const { models } = await response.json();
77
+ const defaultOllamaModel = "llama3.2:latest";
78
+ return models.some((m) => m.name === defaultOllamaModel);
79
+ }
80
+ return false;
81
+ }
82
+ catch (error) {
83
+ return false;
84
+ }
85
+ }
86
+ try {
87
+ const provider = await AIProviderFactory.createProvider(providerName);
88
+ await provider.generate({ prompt: "test", maxTokens: 1 });
89
+ return true;
90
+ }
91
+ catch (error) {
92
+ return false;
93
+ }
77
94
  }
78
95
  /**
79
96
  * Check if a provider has the minimum required environment variables
@@ -66,4 +66,75 @@ export declare function getDefaultTimeout(provider: string, operation?: "generat
66
66
  * @returns Promise that rejects with TimeoutError
67
67
  */
68
68
  export declare function createTimeoutPromise(timeout: number | string | undefined, provider: string, operation: "generate" | "stream"): Promise<never> | null;
69
- export { createTimeoutController } from "../providers/timeout-wrapper.js";
69
+ export interface TimeoutConfig {
70
+ operation: string;
71
+ timeout?: number | string;
72
+ gracefulShutdown?: boolean;
73
+ retryOnTimeout?: boolean;
74
+ maxRetries?: number;
75
+ abortSignal?: AbortSignal;
76
+ }
77
+ export interface TimeoutResult<T> {
78
+ success: boolean;
79
+ data?: T;
80
+ error?: Error;
81
+ timedOut: boolean;
82
+ executionTime: number;
83
+ retriesUsed: number;
84
+ }
85
+ /**
86
+ * Enhanced timeout manager with proper cleanup and abort controller integration
87
+ * Consolidated from timeout-manager.ts
88
+ */
89
+ export declare class TimeoutManager {
90
+ private activeTimeouts;
91
+ /**
92
+ * Execute operation with timeout and proper cleanup
93
+ */
94
+ executeWithTimeout<T>(operation: () => Promise<T>, config: TimeoutConfig): Promise<TimeoutResult<T>>;
95
+ private performSingleOperation;
96
+ private getTimeoutMs;
97
+ private generateOperationId;
98
+ private createTimeoutPromise;
99
+ private registerTimeout;
100
+ cleanup(operationId: string): void;
101
+ gracefulShutdown(): void;
102
+ }
103
+ /**
104
+ * Wrapper functions consolidated from timeout-wrapper.ts
105
+ */
106
+ /**
107
+ * Wrap a promise with timeout
108
+ * @param promise - The promise to wrap
109
+ * @param timeout - Timeout duration (number in ms or string with unit)
110
+ * @param provider - Provider name for error messages
111
+ * @param operation - Operation type (generate or stream)
112
+ * @returns The result of the promise or throws TimeoutError
113
+ */
114
+ export declare function withTimeout<T>(promise: Promise<T>, timeout: number | string | undefined, provider: string, operation: "generate" | "stream"): Promise<T>;
115
+ /**
116
+ * Wrap a streaming async generator with timeout
117
+ * @param generator - The async generator to wrap
118
+ * @param timeout - Timeout duration for the entire stream
119
+ * @param provider - Provider name for error messages
120
+ * @returns Wrapped async generator that respects timeout
121
+ */
122
+ export declare function withStreamingTimeout<T>(generator: AsyncGenerator<T>, timeout: number | string | undefined, provider: string): AsyncGenerator<T>;
123
+ /**
124
+ * Create an abort controller with timeout
125
+ * @param timeout - Timeout duration
126
+ * @param provider - Provider name for error messages
127
+ * @param operation - Operation type
128
+ * @returns AbortController and cleanup function
129
+ */
130
+ export declare function createTimeoutController(timeout: number | string | undefined, provider: string, operation: "generate" | "stream"): {
131
+ controller: AbortController;
132
+ cleanup: () => void;
133
+ timeoutMs: number;
134
+ } | null;
135
+ /**
136
+ * Merge abort signals (for combining user abort with timeout)
137
+ * @param signals - Array of abort signals to merge
138
+ * @returns Combined abort controller
139
+ */
140
+ export declare function mergeAbortSignals(signals: (AbortSignal | undefined)[]): AbortController;