@juspay/neurolink 9.51.4 → 9.53.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 (186) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +19 -0
  3. package/dist/agent/directTools.d.ts +2 -2
  4. package/dist/auth/errors.d.ts +1 -1
  5. package/dist/auth/middleware/AuthMiddleware.d.ts +1 -1
  6. package/dist/auth/providers/BaseAuthProvider.d.ts +1 -1
  7. package/dist/autoresearch/config.d.ts +11 -0
  8. package/dist/autoresearch/config.js +108 -0
  9. package/dist/autoresearch/errors.d.ts +40 -0
  10. package/dist/autoresearch/errors.js +20 -0
  11. package/dist/autoresearch/index.d.ts +23 -0
  12. package/dist/autoresearch/index.js +34 -0
  13. package/dist/autoresearch/phasePolicy.d.ts +9 -0
  14. package/dist/autoresearch/phasePolicy.js +69 -0
  15. package/dist/autoresearch/promptCompiler.d.ts +15 -0
  16. package/dist/autoresearch/promptCompiler.js +120 -0
  17. package/dist/autoresearch/repoPolicy.d.ts +32 -0
  18. package/dist/autoresearch/repoPolicy.js +128 -0
  19. package/dist/autoresearch/resultRecorder.d.ts +20 -0
  20. package/dist/autoresearch/resultRecorder.js +130 -0
  21. package/dist/autoresearch/runner.d.ts +10 -0
  22. package/dist/autoresearch/runner.js +102 -0
  23. package/dist/autoresearch/stateStore.d.ts +12 -0
  24. package/dist/autoresearch/stateStore.js +163 -0
  25. package/dist/autoresearch/summaryParser.d.ts +16 -0
  26. package/dist/autoresearch/summaryParser.js +94 -0
  27. package/dist/autoresearch/tools.d.ts +257 -0
  28. package/dist/autoresearch/tools.js +617 -0
  29. package/dist/autoresearch/worker.d.ts +71 -0
  30. package/dist/autoresearch/worker.js +417 -0
  31. package/dist/browser/neurolink.min.js +340 -324
  32. package/dist/cli/commands/autoresearch.d.ts +41 -0
  33. package/dist/cli/commands/autoresearch.js +487 -0
  34. package/dist/cli/commands/config.d.ts +1 -1
  35. package/dist/cli/commands/task.d.ts +2 -0
  36. package/dist/cli/commands/task.js +32 -3
  37. package/dist/cli/loop/optionsSchema.d.ts +1 -1
  38. package/dist/cli/parser.js +4 -1
  39. package/dist/core/baseProvider.js +18 -0
  40. package/dist/core/factory.d.ts +2 -2
  41. package/dist/core/factory.js +4 -4
  42. package/dist/evaluation/errors/EvaluationError.d.ts +1 -1
  43. package/dist/factories/providerFactory.d.ts +4 -4
  44. package/dist/factories/providerFactory.js +20 -7
  45. package/dist/factories/providerRegistry.d.ts +5 -0
  46. package/dist/factories/providerRegistry.js +45 -26
  47. package/dist/lib/agent/directTools.d.ts +2 -2
  48. package/dist/lib/auth/errors.d.ts +1 -1
  49. package/dist/lib/auth/middleware/AuthMiddleware.d.ts +1 -1
  50. package/dist/lib/auth/providers/BaseAuthProvider.d.ts +1 -1
  51. package/dist/lib/autoresearch/config.d.ts +11 -0
  52. package/dist/lib/autoresearch/config.js +109 -0
  53. package/dist/lib/autoresearch/errors.d.ts +40 -0
  54. package/dist/lib/autoresearch/errors.js +21 -0
  55. package/dist/lib/autoresearch/index.d.ts +23 -0
  56. package/dist/lib/autoresearch/index.js +35 -0
  57. package/dist/lib/autoresearch/phasePolicy.d.ts +9 -0
  58. package/dist/lib/autoresearch/phasePolicy.js +70 -0
  59. package/dist/lib/autoresearch/promptCompiler.d.ts +15 -0
  60. package/dist/lib/autoresearch/promptCompiler.js +121 -0
  61. package/dist/lib/autoresearch/repoPolicy.d.ts +32 -0
  62. package/dist/lib/autoresearch/repoPolicy.js +129 -0
  63. package/dist/lib/autoresearch/resultRecorder.d.ts +20 -0
  64. package/dist/lib/autoresearch/resultRecorder.js +131 -0
  65. package/dist/lib/autoresearch/runner.d.ts +10 -0
  66. package/dist/lib/autoresearch/runner.js +103 -0
  67. package/dist/lib/autoresearch/stateStore.d.ts +12 -0
  68. package/dist/lib/autoresearch/stateStore.js +164 -0
  69. package/dist/lib/autoresearch/summaryParser.d.ts +16 -0
  70. package/dist/lib/autoresearch/summaryParser.js +95 -0
  71. package/dist/lib/autoresearch/tools.d.ts +257 -0
  72. package/dist/lib/autoresearch/tools.js +618 -0
  73. package/dist/lib/autoresearch/worker.d.ts +71 -0
  74. package/dist/lib/autoresearch/worker.js +418 -0
  75. package/dist/lib/core/baseProvider.js +18 -0
  76. package/dist/lib/core/factory.d.ts +2 -2
  77. package/dist/lib/core/factory.js +4 -4
  78. package/dist/lib/evaluation/errors/EvaluationError.d.ts +1 -1
  79. package/dist/lib/factories/providerFactory.d.ts +4 -4
  80. package/dist/lib/factories/providerFactory.js +20 -7
  81. package/dist/lib/factories/providerRegistry.d.ts +5 -0
  82. package/dist/lib/factories/providerRegistry.js +45 -26
  83. package/dist/lib/files/fileTools.d.ts +1 -1
  84. package/dist/lib/neurolink.d.ts +21 -0
  85. package/dist/lib/neurolink.js +91 -8
  86. package/dist/lib/providers/amazonBedrock.d.ts +6 -1
  87. package/dist/lib/providers/amazonBedrock.js +14 -2
  88. package/dist/lib/providers/amazonSagemaker.d.ts +7 -1
  89. package/dist/lib/providers/amazonSagemaker.js +21 -3
  90. package/dist/lib/providers/anthropic.d.ts +4 -1
  91. package/dist/lib/providers/anthropic.js +18 -5
  92. package/dist/lib/providers/azureOpenai.d.ts +2 -1
  93. package/dist/lib/providers/azureOpenai.js +10 -5
  94. package/dist/lib/providers/googleAiStudio.d.ts +4 -1
  95. package/dist/lib/providers/googleAiStudio.js +6 -7
  96. package/dist/lib/providers/googleVertex.d.ts +3 -1
  97. package/dist/lib/providers/googleVertex.js +96 -17
  98. package/dist/lib/providers/huggingFace.d.ts +2 -1
  99. package/dist/lib/providers/huggingFace.js +4 -4
  100. package/dist/lib/providers/litellm.d.ts +5 -1
  101. package/dist/lib/providers/litellm.js +16 -11
  102. package/dist/lib/providers/mistral.d.ts +2 -1
  103. package/dist/lib/providers/mistral.js +2 -2
  104. package/dist/lib/providers/ollama.d.ts +3 -1
  105. package/dist/lib/providers/ollama.js +2 -2
  106. package/dist/lib/providers/openAI.d.ts +5 -1
  107. package/dist/lib/providers/openAI.js +15 -5
  108. package/dist/lib/providers/openRouter.d.ts +5 -1
  109. package/dist/lib/providers/openRouter.js +19 -7
  110. package/dist/lib/providers/openaiCompatible.d.ts +4 -1
  111. package/dist/lib/providers/openaiCompatible.js +18 -4
  112. package/dist/lib/tasks/autoresearchTaskExecutor.d.ts +32 -0
  113. package/dist/lib/tasks/autoresearchTaskExecutor.js +303 -0
  114. package/dist/lib/tasks/errors.d.ts +3 -1
  115. package/dist/lib/tasks/errors.js +1 -0
  116. package/dist/lib/tasks/taskExecutor.d.ts +4 -2
  117. package/dist/lib/tasks/taskExecutor.js +8 -1
  118. package/dist/lib/tasks/taskManager.js +27 -3
  119. package/dist/lib/tasks/tools/taskTools.d.ts +1 -1
  120. package/dist/lib/telemetry/attributes.d.ts +15 -0
  121. package/dist/lib/telemetry/attributes.js +16 -0
  122. package/dist/lib/telemetry/tracers.d.ts +1 -0
  123. package/dist/lib/telemetry/tracers.js +1 -0
  124. package/dist/lib/types/autoresearchTypes.d.ts +194 -0
  125. package/dist/lib/types/autoresearchTypes.js +18 -0
  126. package/dist/lib/types/common.d.ts +11 -0
  127. package/dist/lib/types/configTypes.d.ts +7 -0
  128. package/dist/lib/types/generateTypes.d.ts +13 -0
  129. package/dist/lib/types/index.d.ts +16 -14
  130. package/dist/lib/types/index.js +21 -17
  131. package/dist/lib/types/providers.d.ts +75 -0
  132. package/dist/lib/types/streamTypes.d.ts +7 -1
  133. package/dist/lib/types/taskTypes.d.ts +38 -0
  134. package/dist/lib/workflow/config.d.ts +3 -3
  135. package/dist/neurolink.d.ts +21 -0
  136. package/dist/neurolink.js +91 -8
  137. package/dist/providers/amazonBedrock.d.ts +6 -1
  138. package/dist/providers/amazonBedrock.js +14 -2
  139. package/dist/providers/amazonSagemaker.d.ts +7 -1
  140. package/dist/providers/amazonSagemaker.js +21 -3
  141. package/dist/providers/anthropic.d.ts +4 -1
  142. package/dist/providers/anthropic.js +18 -5
  143. package/dist/providers/azureOpenai.d.ts +2 -1
  144. package/dist/providers/azureOpenai.js +10 -5
  145. package/dist/providers/googleAiStudio.d.ts +4 -1
  146. package/dist/providers/googleAiStudio.js +6 -7
  147. package/dist/providers/googleVertex.d.ts +3 -1
  148. package/dist/providers/googleVertex.js +96 -17
  149. package/dist/providers/huggingFace.d.ts +2 -1
  150. package/dist/providers/huggingFace.js +4 -4
  151. package/dist/providers/litellm.d.ts +5 -1
  152. package/dist/providers/litellm.js +16 -11
  153. package/dist/providers/mistral.d.ts +2 -1
  154. package/dist/providers/mistral.js +2 -2
  155. package/dist/providers/ollama.d.ts +3 -1
  156. package/dist/providers/ollama.js +2 -2
  157. package/dist/providers/openAI.d.ts +5 -1
  158. package/dist/providers/openAI.js +15 -5
  159. package/dist/providers/openRouter.d.ts +5 -1
  160. package/dist/providers/openRouter.js +19 -7
  161. package/dist/providers/openaiCompatible.d.ts +4 -1
  162. package/dist/providers/openaiCompatible.js +18 -4
  163. package/dist/rag/errors/RAGError.d.ts +1 -1
  164. package/dist/tasks/autoresearchTaskExecutor.d.ts +32 -0
  165. package/dist/tasks/autoresearchTaskExecutor.js +302 -0
  166. package/dist/tasks/errors.d.ts +3 -1
  167. package/dist/tasks/errors.js +1 -0
  168. package/dist/tasks/taskExecutor.d.ts +4 -2
  169. package/dist/tasks/taskExecutor.js +8 -1
  170. package/dist/tasks/taskManager.js +27 -3
  171. package/dist/tasks/tools/taskTools.d.ts +1 -1
  172. package/dist/telemetry/attributes.d.ts +15 -0
  173. package/dist/telemetry/attributes.js +16 -0
  174. package/dist/telemetry/tracers.d.ts +1 -0
  175. package/dist/telemetry/tracers.js +1 -0
  176. package/dist/types/autoresearchTypes.d.ts +194 -0
  177. package/dist/types/autoresearchTypes.js +17 -0
  178. package/dist/types/common.d.ts +11 -0
  179. package/dist/types/configTypes.d.ts +7 -0
  180. package/dist/types/generateTypes.d.ts +13 -0
  181. package/dist/types/index.d.ts +16 -14
  182. package/dist/types/index.js +21 -17
  183. package/dist/types/providers.d.ts +75 -0
  184. package/dist/types/streamTypes.d.ts +7 -1
  185. package/dist/types/taskTypes.d.ts +38 -0
  186. package/package.json +3 -2
@@ -776,6 +776,24 @@ export class BaseProvider {
776
776
  },
777
777
  responseTime: 0, // BaseProvider doesn't track response time directly
778
778
  toolsUsed: result.toolsUsed || [],
779
+ // Map toolExecutions from EnhancedGenerateResult shape to TextGenerationResult shape
780
+ // Preserve original timing/status fields when present, fall back to safe defaults
781
+ toolExecutions: result.toolExecutions?.map((te) => {
782
+ const t = te;
783
+ return {
784
+ // Spread original fields first so normalized fields take precedence
785
+ ...te,
786
+ toolName: te.name,
787
+ executionTime: typeof t.executionTime === "number"
788
+ ? t.executionTime
789
+ : typeof t.duration === "number"
790
+ ? t.duration
791
+ : 0,
792
+ success: typeof t.success === "boolean"
793
+ ? t.success
794
+ : t.status === undefined || t.status === "success",
795
+ };
796
+ }),
779
797
  enhancedWithTools: !!(result.toolsUsed && result.toolsUsed.length > 0),
780
798
  analytics: result.analytics,
781
799
  evaluation: result.evaluation,
@@ -1,4 +1,4 @@
1
- import type { AIProvider, SupportedModelName } from "../types/index.js";
1
+ import type { AIProvider, SupportedModelName, NeurolinkCredentials } from "../types/index.js";
2
2
  import { AIProviderName } from "../constants/enums.js";
3
3
  import type { UnknownRecord } from "../types/common.js";
4
4
  import type { ProviderPairResult } from "../types/typeAliases.js";
@@ -27,7 +27,7 @@ export declare class AIProviderFactory {
27
27
  * @param region - Optional region override for cloud providers
28
28
  * @returns AIProvider instance
29
29
  */
30
- static createProvider(providerName: string, modelName?: string | null, enableMCP?: boolean, sdk?: UnknownRecord, region?: string): Promise<AIProvider>;
30
+ static createProvider(providerName: string, modelName?: string | null, enableMCP?: boolean, sdk?: UnknownRecord, region?: string, credentials?: NeurolinkCredentials): Promise<AIProvider>;
31
31
  /**
32
32
  * Create a provider instance with specific provider enum and model
33
33
  * @param provider - Provider enum value
@@ -167,7 +167,7 @@ export class AIProviderFactory {
167
167
  return resolvedModelName;
168
168
  }
169
169
  }
170
- static async createResolvedProvider(providerName, resolvedModelName, sdk, region, functionTag) {
170
+ static async createResolvedProvider(providerName, resolvedModelName, sdk, region, functionTag, credentials) {
171
171
  await withTimeout(ProviderRegistry.registerAllProviders(), 30_000, ErrorFactory.toolTimeout("provider-registration", 30_000));
172
172
  const normalizedName = this.normalizeProviderName(providerName);
173
173
  const finalModelName = resolvedModelName === "default" || resolvedModelName === null
@@ -179,7 +179,7 @@ export class AIProviderFactory {
179
179
  resolvedModelName: resolvedModelName || "not resolved",
180
180
  finalModelName: finalModelName || "using provider default",
181
181
  });
182
- const provider = await withTimeout(ProviderFactory.createProvider(normalizedName, finalModelName, sdk, region), 30_000, ErrorFactory.toolTimeout(`provider-creation:${normalizedName}`, 30_000));
182
+ const provider = await withTimeout(ProviderFactory.createProvider(normalizedName, finalModelName, sdk, region, credentials), 30_000, ErrorFactory.toolTimeout(`provider-creation:${normalizedName}`, 30_000));
183
183
  return { normalizedName, finalModelName, provider };
184
184
  }
185
185
  /**
@@ -191,7 +191,7 @@ export class AIProviderFactory {
191
191
  * @param region - Optional region override for cloud providers
192
192
  * @returns AIProvider instance
193
193
  */
194
- static async createProvider(providerName, modelName, enableMCP = true, sdk, region) {
194
+ static async createProvider(providerName, modelName, enableMCP = true, sdk, region, credentials) {
195
195
  const functionTag = "AIProviderFactory.createProvider";
196
196
  // Providers are registered via ProviderFactory.initialize() on first use
197
197
  return factoryTracer.startActiveSpan("neurolink.factory.createProvider", {
@@ -225,7 +225,7 @@ export class AIProviderFactory {
225
225
  // The dynamic model provider now provides reliable functionality without hanging
226
226
  let resolvedModelName = this.resolveModelFromEnvironment(providerName, modelName, functionTag);
227
227
  resolvedModelName = await this.resolveDynamicModelName(providerName, modelName, resolvedModelName, functionTag);
228
- const { normalizedName, finalModelName, provider } = await this.createResolvedProvider(providerName, resolvedModelName, sdk, region, functionTag);
228
+ const { normalizedName, finalModelName, provider } = await this.createResolvedProvider(providerName, resolvedModelName, sdk, region, functionTag, credentials);
229
229
  // Summary logging in format expected by debugging tools
230
230
  logger.debug(`[AIProviderFactory] Provider creation completed { providerName: '${normalizedName}', modelName: '${finalModelName}' }`);
231
231
  logger.debug(`[AIProviderFactory] Resolved model: ${finalModelName}`);
@@ -69,7 +69,7 @@ export declare const evaluationErrors: {
69
69
  /** Rate limit hit during evaluation */
70
70
  readonly RATE_LIMIT_ERROR: "RATE_LIMIT_ERROR";
71
71
  };
72
- create: (code: "PROVIDER_ERROR" | "CONFIGURATION_ERROR" | "EVALUATION_FAILED" | "PARSE_ERROR" | "STRATEGY_NOT_FOUND" | "CUSTOM_EVALUATOR_ERROR" | "BATCH_EVALUATION_ERROR" | "AGGREGATION_ERROR" | "REGISTRY_ERROR" | "MAX_RETRIES_EXCEEDED" | "TIMEOUT_ERROR" | "RATE_LIMIT_ERROR", message: string, options?: {
72
+ create: (code: "EVALUATION_FAILED" | "PARSE_ERROR" | "STRATEGY_NOT_FOUND" | "PROVIDER_ERROR" | "CONFIGURATION_ERROR" | "CUSTOM_EVALUATOR_ERROR" | "BATCH_EVALUATION_ERROR" | "AGGREGATION_ERROR" | "REGISTRY_ERROR" | "MAX_RETRIES_EXCEEDED" | "TIMEOUT_ERROR" | "RATE_LIMIT_ERROR", message: string, options?: {
73
73
  retryable?: boolean;
74
74
  details?: Record<string, unknown>;
75
75
  cause?: Error;
@@ -1,6 +1,6 @@
1
1
  import type { AIProviderName } from "../constants/enums.js";
2
2
  import type { UnknownRecord } from "../types/common.js";
3
- import type { AIProvider } from "../types/index.js";
3
+ import type { AIProvider, NeurolinkCredentials } from "../types/index.js";
4
4
  /**
5
5
  * Provider constructor interface - supports both sync constructors and async factory functions
6
6
  */
@@ -33,7 +33,7 @@ export declare class ProviderFactory {
33
33
  * @param providerName - Provider name (optional, uses NEUROLINK_PROVIDER env var or 'vertex' as default)
34
34
  * @param modelName - Model name (optional, uses provider-specific env var or registry default)
35
35
  */
36
- static createProvider(providerName?: AIProviderName | string, modelName?: string, sdk?: UnknownRecord, region?: string): Promise<AIProvider>;
36
+ static createProvider(providerName?: AIProviderName | string, modelName?: string, sdk?: UnknownRecord, region?: string, credentials?: NeurolinkCredentials): Promise<AIProvider>;
37
37
  /**
38
38
  * Check if a provider is registered
39
39
  */
@@ -67,10 +67,10 @@ export declare class ProviderFactory {
67
67
  * Create the best available provider for the given name
68
68
  * Used by NeuroLink SDK for streaming and generation
69
69
  */
70
- static createBestProvider(providerName: AIProviderName | string, modelName?: string, enableMCP?: boolean, sdk?: UnknownRecord): Promise<AIProvider>;
70
+ static createBestProvider(providerName: AIProviderName | string, modelName?: string, enableMCP?: boolean, sdk?: UnknownRecord, credentials?: NeurolinkCredentials): Promise<AIProvider>;
71
71
  }
72
72
  /**
73
73
  * Helper function to create providers with backward compatibility
74
74
  */
75
- export declare function createAIProvider(providerName: AIProviderName | string, modelName?: string): Promise<AIProvider>;
75
+ export declare function createAIProvider(providerName: AIProviderName | string, modelName?: string, credentials?: NeurolinkCredentials): Promise<AIProvider>;
76
76
  export {};
@@ -30,7 +30,7 @@ export class ProviderFactory {
30
30
  * @param providerName - Provider name (optional, uses NEUROLINK_PROVIDER env var or 'vertex' as default)
31
31
  * @param modelName - Model name (optional, uses provider-specific env var or registry default)
32
32
  */
33
- static async createProvider(providerName, modelName, sdk, region) {
33
+ static async createProvider(providerName, modelName, sdk, region, credentials) {
34
34
  // Note: Providers are registered explicitly by ProviderRegistry to avoid circular dependencies
35
35
  // Use environment variable or default if not specified
36
36
  const resolvedProviderName = providerName ||
@@ -56,13 +56,26 @@ export class ProviderFactory {
56
56
  // Fallback to registry default if no env var
57
57
  model = model || registration.defaultModel;
58
58
  }
59
+ // Map registered provider names to NeurolinkCredentials keys.
60
+ // Most names match (openai, anthropic, vertex, bedrock, etc.)
61
+ // but some differ (google-ai → googleAiStudio, openai-compatible → openaiCompatible).
62
+ const credentialKeyMap = {
63
+ "google-ai": "googleAiStudio",
64
+ "openai-compatible": "openaiCompatible",
65
+ huggingface: "huggingFace",
66
+ };
67
+ const credKey = credentialKeyMap[normalizedName] ?? normalizedName;
68
+ // Extract provider-scoped credential slice (e.g. credentials.openai for OpenAI)
69
+ const scopedCredentials = credentials
70
+ ? credentials[credKey]
71
+ : undefined;
59
72
  try {
60
73
  if (typeof registration.constructor !== "function") {
61
74
  throw new Error(`Invalid constructor for provider ${providerName}: not a function`);
62
75
  }
63
76
  let result;
64
77
  try {
65
- const factoryResult = registration.constructor(model, resolvedProviderName, sdk, region);
78
+ const factoryResult = registration.constructor(model, resolvedProviderName, sdk, region, scopedCredentials);
66
79
  // Handle both sync and async results
67
80
  result =
68
81
  factoryResult instanceof Promise
@@ -74,7 +87,7 @@ export class ProviderFactory {
74
87
  registration.constructor.prototype.constructor ===
75
88
  registration.constructor) {
76
89
  try {
77
- result = new registration.constructor(model, resolvedProviderName, sdk, region);
90
+ result = new registration.constructor(model, resolvedProviderName, sdk, region, scopedCredentials);
78
91
  }
79
92
  catch (constructorError) {
80
93
  throw new Error(`Both factory function and constructor failed. Factory error: ${factoryError}. Constructor error: ${constructorError}`, { cause: constructorError });
@@ -154,13 +167,13 @@ export class ProviderFactory {
154
167
  * Create the best available provider for the given name
155
168
  * Used by NeuroLink SDK for streaming and generation
156
169
  */
157
- static async createBestProvider(providerName, modelName, enableMCP, sdk) {
158
- return await ProviderFactory.createProvider(providerName, modelName, sdk);
170
+ static async createBestProvider(providerName, modelName, enableMCP, sdk, credentials) {
171
+ return await ProviderFactory.createProvider(providerName, modelName, sdk, undefined, credentials);
159
172
  }
160
173
  }
161
174
  /**
162
175
  * Helper function to create providers with backward compatibility
163
176
  */
164
- export async function createAIProvider(providerName, modelName) {
165
- return await ProviderFactory.createProvider(providerName, modelName);
177
+ export async function createAIProvider(providerName, modelName, credentials) {
178
+ return await ProviderFactory.createProvider(providerName, modelName, undefined, undefined, credentials);
166
179
  }
@@ -13,6 +13,11 @@ export declare class ProviderRegistry {
13
13
  static registerAllProviders(): Promise<void>;
14
14
  /**
15
15
  * Internal registration implementation
16
+ *
17
+ * This method is a flat list of 13 provider registrations. Each registration
18
+ * is self-contained and extracting helpers would add indirection without
19
+ * reducing complexity — the function is long because there are many providers,
20
+ * not because any single registration is complex.
16
21
  */
17
22
  private static _doRegister;
18
23
  /**
@@ -32,82 +32,101 @@ export class ProviderRegistry {
32
32
  }
33
33
  /**
34
34
  * Internal registration implementation
35
+ *
36
+ * This method is a flat list of 13 provider registrations. Each registration
37
+ * is self-contained and extracting helpers would add indirection without
38
+ * reducing complexity — the function is long because there are many providers,
39
+ * not because any single registration is complex.
35
40
  */
41
+ // eslint-disable-next-line max-lines-per-function
36
42
  static async _doRegister() {
37
43
  try {
38
44
  // Register providers with dynamic import factory functions
39
45
  const { ProviderFactory } = await import("./providerFactory.js");
40
46
  // Register Google AI Studio Provider (our validated baseline)
41
- ProviderFactory.registerProvider(AIProviderName.GOOGLE_AI, async (modelName, _providerName, sdk) => {
47
+ ProviderFactory.registerProvider(AIProviderName.GOOGLE_AI, async (modelName, _providerName, sdk, _region, credentials) => {
48
+ const googleAiCreds = credentials;
42
49
  const { GoogleAIStudioProvider } = await import("../providers/googleAiStudio.js");
43
- return new GoogleAIStudioProvider(modelName, sdk);
50
+ return new GoogleAIStudioProvider(modelName, sdk, googleAiCreds);
44
51
  }, GoogleAIModels.GEMINI_2_5_FLASH, ["googleAiStudio", "google", "gemini", "google-ai", "google-ai-studio"]);
45
52
  // Register OpenAI provider
46
- ProviderFactory.registerProvider(AIProviderName.OPENAI, async (modelName, _providerName, sdk) => {
53
+ ProviderFactory.registerProvider(AIProviderName.OPENAI, async (modelName, _providerName, sdk, _region, credentials) => {
54
+ const openaiCreds = credentials;
47
55
  const { OpenAIProvider } = await import("../providers/openAI.js");
48
- return new OpenAIProvider(modelName, sdk);
56
+ return new OpenAIProvider(modelName, sdk, undefined, openaiCreds);
49
57
  }, OpenAIModels.GPT_4O_MINI, ["gpt", "chatgpt"]);
50
58
  // Register Anthropic provider
51
- ProviderFactory.registerProvider(AIProviderName.ANTHROPIC, async (modelName, _providerName, sdk) => {
59
+ ProviderFactory.registerProvider(AIProviderName.ANTHROPIC, async (modelName, _providerName, sdk, _region, credentials) => {
60
+ const anthropicCreds = credentials;
52
61
  const { AnthropicProvider } = await import("../providers/anthropic.js");
53
- return new AnthropicProvider(modelName, sdk);
62
+ return new AnthropicProvider(modelName, sdk, undefined, anthropicCreds);
54
63
  }, AnthropicModels.CLAUDE_SONNET_4_6, ["claude", "anthropic"]);
55
64
  // Register Amazon Bedrock provider
56
- ProviderFactory.registerProvider(AIProviderName.BEDROCK, async (modelName, _providerName, sdk, region) => {
65
+ ProviderFactory.registerProvider(AIProviderName.BEDROCK, async (modelName, _providerName, sdk, region, credentials) => {
66
+ const bedrockCreds = credentials;
57
67
  const { AmazonBedrockProvider } = await import("../providers/amazonBedrock.js");
58
- return new AmazonBedrockProvider(modelName, sdk, region);
68
+ return new AmazonBedrockProvider(modelName, sdk, region, bedrockCreds);
59
69
  }, undefined, // Let provider read BEDROCK_MODEL from .env
60
70
  ["bedrock", "aws"]);
61
71
  // Register Azure OpenAI provider
62
- ProviderFactory.registerProvider(AIProviderName.AZURE, async (modelName, _providerName, sdk) => {
72
+ ProviderFactory.registerProvider(AIProviderName.AZURE, async (modelName, _providerName, sdk, _region, credentials) => {
73
+ const azureCreds = credentials;
63
74
  const { AzureOpenAIProvider } = await import("../providers/azureOpenai.js");
64
- return new AzureOpenAIProvider(modelName, sdk);
75
+ return new AzureOpenAIProvider(modelName, sdk, undefined, azureCreds);
65
76
  }, process.env.AZURE_MODEL ||
66
77
  process.env.AZURE_OPENAI_MODEL ||
67
78
  process.env.AZURE_OPENAI_DEPLOYMENT ||
68
79
  process.env.AZURE_OPENAI_DEPLOYMENT_ID ||
69
80
  "gpt-4o-mini", ["azure", "azureOpenai"]);
70
81
  // Register Google Vertex AI provider
71
- ProviderFactory.registerProvider(AIProviderName.VERTEX, async (modelName, providerName, sdk, region) => {
82
+ ProviderFactory.registerProvider(AIProviderName.VERTEX, async (modelName, providerName, sdk, region, credentials) => {
83
+ const vertexCreds = credentials;
72
84
  const { GoogleVertexProvider } = await import("../providers/googleVertex.js");
73
- return new GoogleVertexProvider(modelName, providerName, sdk, region);
85
+ return new GoogleVertexProvider(modelName, providerName, sdk, region, vertexCreds);
74
86
  }, VertexModels.CLAUDE_4_6_SONNET, ["vertex", "googleVertex"]);
75
87
  // Register Hugging Face provider (Unified Router implementation)
76
- ProviderFactory.registerProvider(AIProviderName.HUGGINGFACE, async (modelName) => {
88
+ ProviderFactory.registerProvider(AIProviderName.HUGGINGFACE, async (modelName, _providerName, _sdk, _region, credentials) => {
89
+ const hfCreds = credentials;
77
90
  const { HuggingFaceProvider } = await import("../providers/huggingFace.js");
78
- return new HuggingFaceProvider(modelName);
91
+ return new HuggingFaceProvider(modelName, undefined, hfCreds);
79
92
  }, process.env.HUGGINGFACE_MODEL ||
80
93
  HuggingFaceModels.QWEN_2_5_72B_INSTRUCT, ["huggingface", "hf"]);
81
94
  // Register Mistral AI provider
82
- ProviderFactory.registerProvider(AIProviderName.MISTRAL, async (modelName, _providerName, sdk) => {
95
+ ProviderFactory.registerProvider(AIProviderName.MISTRAL, async (modelName, _providerName, sdk, _region, credentials) => {
96
+ const mistralCreds = credentials;
83
97
  const { MistralProvider } = await import("../providers/mistral.js");
84
- return new MistralProvider(modelName, sdk);
98
+ return new MistralProvider(modelName, sdk, undefined, mistralCreds);
85
99
  }, MistralModels.MISTRAL_LARGE_LATEST, ["mistral"]);
86
100
  // Register Ollama provider
87
- ProviderFactory.registerProvider(AIProviderName.OLLAMA, async (modelName) => {
101
+ ProviderFactory.registerProvider(AIProviderName.OLLAMA, async (modelName, _providerName, _sdk, _region, credentials) => {
102
+ const ollamaCreds = credentials;
88
103
  const { OllamaProvider } = await import("../providers/ollama.js");
89
- return new OllamaProvider(modelName);
104
+ return new OllamaProvider(modelName, ollamaCreds);
90
105
  }, process.env.OLLAMA_MODEL || OllamaModels.LLAMA3_2_LATEST, ["ollama", "local"]);
91
106
  // Register LiteLLM provider
92
- ProviderFactory.registerProvider(AIProviderName.LITELLM, async (modelName, _providerName, sdk) => {
107
+ ProviderFactory.registerProvider(AIProviderName.LITELLM, async (modelName, _providerName, sdk, _region, credentials) => {
108
+ const litellmCreds = credentials;
93
109
  const { LiteLLMProvider } = await import("../providers/litellm.js");
94
- return new LiteLLMProvider(modelName, sdk);
110
+ return new LiteLLMProvider(modelName, sdk, undefined, litellmCreds);
95
111
  }, process.env.LITELLM_MODEL || LiteLLMModels.OPENAI_GPT_4O_MINI, ["litellm"]);
96
112
  // Register OpenAI Compatible provider
97
- ProviderFactory.registerProvider(AIProviderName.OPENAI_COMPATIBLE, async (modelName, _providerName, sdk) => {
113
+ ProviderFactory.registerProvider(AIProviderName.OPENAI_COMPATIBLE, async (modelName, _providerName, sdk, _region, credentials) => {
114
+ const openaiCompatCreds = credentials;
98
115
  const { OpenAICompatibleProvider } = await import("../providers/openaiCompatible.js");
99
- return new OpenAICompatibleProvider(modelName, sdk);
116
+ return new OpenAICompatibleProvider(modelName, sdk, undefined, openaiCompatCreds);
100
117
  }, process.env.OPENAI_COMPATIBLE_MODEL || undefined, // Enable auto-discovery when no model specified
101
118
  ["openai-compatible", "vllm", "compatible"]);
102
119
  // Register OpenRouter provider (300+ models from 60+ providers)
103
- ProviderFactory.registerProvider(AIProviderName.OPENROUTER, async (modelName, _providerName, sdk) => {
120
+ ProviderFactory.registerProvider(AIProviderName.OPENROUTER, async (modelName, _providerName, sdk, _region, credentials) => {
121
+ const openrouterCreds = credentials;
104
122
  const { OpenRouterProvider } = await import("../providers/openRouter.js");
105
- return new OpenRouterProvider(modelName, sdk);
123
+ return new OpenRouterProvider(modelName, sdk, undefined, openrouterCreds);
106
124
  }, process.env.OPENROUTER_MODEL || "anthropic/claude-3-5-sonnet", ["openrouter", "or"]);
107
125
  // Register Amazon SageMaker provider
108
- ProviderFactory.registerProvider(AIProviderName.SAGEMAKER, async (modelName, _providerName, _sdk, region) => {
126
+ ProviderFactory.registerProvider(AIProviderName.SAGEMAKER, async (modelName, _providerName, _sdk, region, credentials) => {
127
+ const sagemakerCreds = credentials;
109
128
  const { AmazonSageMakerProvider } = await import("../providers/amazonSagemaker.js");
110
- return new AmazonSageMakerProvider(modelName, undefined, region);
129
+ return new AmazonSageMakerProvider(modelName, undefined, region, undefined, sagemakerCreds);
111
130
  }, process.env.SAGEMAKER_MODEL || "sagemaker-model", ["sagemaker", "aws-sagemaker"]);
112
131
  logger.debug("All providers registered successfully");
113
132
  this.registered = true;
@@ -101,7 +101,7 @@ export declare const directAgentTools: {
101
101
  writeFile: import("ai").Tool<{
102
102
  path: string;
103
103
  content: string;
104
- mode: "create" | "append" | "overwrite";
104
+ mode: "append" | "create" | "overwrite";
105
105
  }, {
106
106
  success: boolean;
107
107
  error: string;
@@ -112,7 +112,7 @@ export declare const directAgentTools: {
112
112
  } | {
113
113
  success: boolean;
114
114
  path: string;
115
- mode: "create" | "append" | "overwrite";
115
+ mode: "append" | "create" | "overwrite";
116
116
  size: number;
117
117
  written: number;
118
118
  error?: undefined;
@@ -55,7 +55,7 @@ export declare const AuthError: {
55
55
  readonly JWKS_FETCH_FAILED: "AUTH-070";
56
56
  readonly JWKS_KEY_NOT_FOUND: "AUTH-071";
57
57
  };
58
- create: (code: "SESSION_NOT_FOUND" | "INVALID_TOKEN" | "EXPIRED_TOKEN" | "MISSING_TOKEN" | "TOKEN_DECODE_FAILED" | "INVALID_SIGNATURE" | "SESSION_EXPIRED" | "SESSION_REVOKED" | "INSUFFICIENT_PERMISSIONS" | "INSUFFICIENT_ROLES" | "ACCESS_DENIED" | "USER_NOT_FOUND" | "USER_DISABLED" | "EMAIL_NOT_VERIFIED" | "MFA_REQUIRED" | "PROVIDER_ERROR" | "PROVIDER_NOT_FOUND" | "PROVIDER_INIT_FAILED" | "CONFIGURATION_ERROR" | "CREATION_FAILED" | "REGISTRATION_FAILED" | "DUPLICATE_REGISTRATION" | "MIDDLEWARE_ERROR" | "RATE_LIMITED" | "JWKS_FETCH_FAILED" | "JWKS_KEY_NOT_FOUND", message: string, options?: {
58
+ create: (code: "SESSION_NOT_FOUND" | "CONFIGURATION_ERROR" | "RATE_LIMITED" | "PROVIDER_ERROR" | "MIDDLEWARE_ERROR" | "INVALID_TOKEN" | "EXPIRED_TOKEN" | "MISSING_TOKEN" | "TOKEN_DECODE_FAILED" | "INVALID_SIGNATURE" | "SESSION_EXPIRED" | "SESSION_REVOKED" | "INSUFFICIENT_PERMISSIONS" | "INSUFFICIENT_ROLES" | "ACCESS_DENIED" | "USER_NOT_FOUND" | "USER_DISABLED" | "EMAIL_NOT_VERIFIED" | "MFA_REQUIRED" | "PROVIDER_NOT_FOUND" | "PROVIDER_INIT_FAILED" | "CREATION_FAILED" | "REGISTRATION_FAILED" | "DUPLICATE_REGISTRATION" | "JWKS_FETCH_FAILED" | "JWKS_KEY_NOT_FOUND", message: string, options?: {
59
59
  retryable?: boolean;
60
60
  details?: Record<string, unknown>;
61
61
  cause?: Error;
@@ -31,7 +31,7 @@ export declare const AuthMiddlewareError: {
31
31
  readonly PROVIDER_ERROR: "AUTH_MIDDLEWARE-005";
32
32
  readonly CONFIGURATION_ERROR: "AUTH_MIDDLEWARE-006";
33
33
  };
34
- create: (code: "INVALID_TOKEN" | "MISSING_TOKEN" | "PROVIDER_ERROR" | "CONFIGURATION_ERROR" | "UNAUTHORIZED" | "FORBIDDEN", message: string, options?: {
34
+ create: (code: "CONFIGURATION_ERROR" | "UNAUTHORIZED" | "FORBIDDEN" | "PROVIDER_ERROR" | "INVALID_TOKEN" | "MISSING_TOKEN", message: string, options?: {
35
35
  retryable?: boolean;
36
36
  details?: Record<string, unknown>;
37
37
  cause?: Error;
@@ -44,7 +44,7 @@ export declare const AuthProviderError: {
44
44
  readonly JWKS_FETCH_FAILED: "AUTH-070";
45
45
  readonly JWKS_KEY_NOT_FOUND: "AUTH-071";
46
46
  };
47
- create: (code: "SESSION_NOT_FOUND" | "INVALID_TOKEN" | "EXPIRED_TOKEN" | "MISSING_TOKEN" | "TOKEN_DECODE_FAILED" | "INVALID_SIGNATURE" | "SESSION_EXPIRED" | "SESSION_REVOKED" | "INSUFFICIENT_PERMISSIONS" | "INSUFFICIENT_ROLES" | "ACCESS_DENIED" | "USER_NOT_FOUND" | "USER_DISABLED" | "EMAIL_NOT_VERIFIED" | "MFA_REQUIRED" | "PROVIDER_ERROR" | "PROVIDER_NOT_FOUND" | "PROVIDER_INIT_FAILED" | "CONFIGURATION_ERROR" | "CREATION_FAILED" | "REGISTRATION_FAILED" | "DUPLICATE_REGISTRATION" | "MIDDLEWARE_ERROR" | "RATE_LIMITED" | "JWKS_FETCH_FAILED" | "JWKS_KEY_NOT_FOUND", message: string, options?: {
47
+ create: (code: "SESSION_NOT_FOUND" | "CONFIGURATION_ERROR" | "RATE_LIMITED" | "PROVIDER_ERROR" | "MIDDLEWARE_ERROR" | "INVALID_TOKEN" | "EXPIRED_TOKEN" | "MISSING_TOKEN" | "TOKEN_DECODE_FAILED" | "INVALID_SIGNATURE" | "SESSION_EXPIRED" | "SESSION_REVOKED" | "INSUFFICIENT_PERMISSIONS" | "INSUFFICIENT_ROLES" | "ACCESS_DENIED" | "USER_NOT_FOUND" | "USER_DISABLED" | "EMAIL_NOT_VERIFIED" | "MFA_REQUIRED" | "PROVIDER_NOT_FOUND" | "PROVIDER_INIT_FAILED" | "CREATION_FAILED" | "REGISTRATION_FAILED" | "DUPLICATE_REGISTRATION" | "JWKS_FETCH_FAILED" | "JWKS_KEY_NOT_FOUND", message: string, options?: {
48
48
  retryable?: boolean;
49
49
  details?: Record<string, unknown>;
50
50
  cause?: Error;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Research configuration validation and resolution.
3
+ */
4
+ import type { ResearchConfig } from "../types/autoresearchTypes.js";
5
+ export declare function resolveConfig(partial: Partial<ResearchConfig> & {
6
+ repoPath: string;
7
+ mutablePaths: string[];
8
+ runCommand: string;
9
+ metric: ResearchConfig["metric"];
10
+ }): ResearchConfig;
11
+ export declare function validateConfig(config: ResearchConfig): void;
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Research configuration validation and resolution.
3
+ */
4
+ import { existsSync, statSync } from "node:fs";
5
+ import path from "node:path";
6
+ import { logger } from "../utils/logger.js";
7
+ import { AutoresearchError } from "./errors.js";
8
+ import { AUTORESEARCH_DEFAULTS } from "../types/autoresearchTypes.js";
9
+ export function resolveConfig(partial) {
10
+ const config = {
11
+ repoPath: path.resolve(partial.repoPath),
12
+ programPath: partial.programPath ?? AUTORESEARCH_DEFAULTS.programPath,
13
+ mutablePaths: partial.mutablePaths,
14
+ immutablePaths: partial.immutablePaths ?? [],
15
+ resultsPath: partial.resultsPath ?? AUTORESEARCH_DEFAULTS.resultsPath,
16
+ statePath: partial.statePath ?? AUTORESEARCH_DEFAULTS.statePath,
17
+ runCommand: partial.runCommand,
18
+ logPath: partial.logPath ?? AUTORESEARCH_DEFAULTS.logPath,
19
+ metric: partial.metric,
20
+ memoryMetric: partial.memoryMetric,
21
+ timeoutMs: partial.timeoutMs ?? AUTORESEARCH_DEFAULTS.timeoutMs,
22
+ branchPrefix: partial.branchPrefix ?? AUTORESEARCH_DEFAULTS.branchPrefix,
23
+ provider: partial.provider,
24
+ model: partial.model,
25
+ maxExperiments: partial.maxExperiments,
26
+ thinkingLevel: partial.thinkingLevel ?? AUTORESEARCH_DEFAULTS.thinkingLevel,
27
+ };
28
+ return config;
29
+ }
30
+ export function validateConfig(config) {
31
+ // Verify repoPath exists and is a directory
32
+ if (!existsSync(config.repoPath) ||
33
+ !statSync(config.repoPath).isDirectory()) {
34
+ throw AutoresearchError.create("CONFIG_INVALID", `repoPath does not exist or is not a directory: ${config.repoPath}`);
35
+ }
36
+ // Verify it's a git repo
37
+ if (!existsSync(path.join(config.repoPath, ".git"))) {
38
+ throw AutoresearchError.create("REPO_NOT_FOUND", `repoPath is not a git repository: ${config.repoPath}`);
39
+ }
40
+ // Verify mutablePaths is non-empty
41
+ if (config.mutablePaths.length === 0) {
42
+ throw AutoresearchError.create("CONFIG_INVALID", "mutablePaths must contain at least one path");
43
+ }
44
+ // Verify mutable and immutable don't overlap (normalize paths first)
45
+ const normMutable = config.mutablePaths.map((p) => path.normalize(p).replace(/\/+$/, ""));
46
+ const normImmutable = config.immutablePaths.map((p) => path.normalize(p).replace(/\/+$/, ""));
47
+ const overlap = normMutable.filter((p) => normImmutable.includes(p));
48
+ if (overlap.length > 0) {
49
+ throw AutoresearchError.create("CONFIG_INVALID", `mutablePaths and immutablePaths overlap: ${overlap.join(", ")}`);
50
+ }
51
+ // Verify metric pattern — length limit and basic ReDoS safety
52
+ const MAX_PATTERN_LENGTH = 200;
53
+ if (config.metric.pattern.length > MAX_PATTERN_LENGTH) {
54
+ throw AutoresearchError.create("CONFIG_INVALID", `metric.pattern exceeds ${MAX_PATTERN_LENGTH} characters: ${config.metric.pattern.slice(0, 50)}...`);
55
+ }
56
+ // Reject patterns with obvious catastrophic backtracking (nested quantifiers)
57
+ if (/(\+|\*|\{)\s*(\+|\*|\{)/.test(config.metric.pattern) ||
58
+ /\(\?[^)]*\)\+\+/.test(config.metric.pattern)) {
59
+ throw AutoresearchError.create("CONFIG_INVALID", `metric.pattern contains nested quantifiers (potential ReDoS): ${config.metric.pattern}`);
60
+ }
61
+ // Verify metric pattern is valid regex with exactly one capture group
62
+ try {
63
+ const _regex = new RegExp(config.metric.pattern);
64
+ const match = new RegExp(config.metric.pattern + "|").exec("");
65
+ const groupCount = (match?.length ?? 1) - 1;
66
+ if (groupCount !== 1) {
67
+ throw AutoresearchError.create("CONFIG_INVALID", `metric.pattern must have exactly one capture group, found ${groupCount}: ${config.metric.pattern}`);
68
+ }
69
+ }
70
+ catch (error) {
71
+ if (error instanceof Error &&
72
+ "code" in error &&
73
+ typeof error.code === "string") {
74
+ throw error; // Rethrow structured AutoresearchError
75
+ }
76
+ throw AutoresearchError.create("CONFIG_INVALID", `metric.pattern is not a valid regex: ${config.metric.pattern}`);
77
+ }
78
+ // Validate memoryMetric.pattern with the same checks if present
79
+ if (config.memoryMetric) {
80
+ if (config.memoryMetric.pattern.length > MAX_PATTERN_LENGTH) {
81
+ throw AutoresearchError.create("CONFIG_INVALID", `memoryMetric.pattern exceeds ${MAX_PATTERN_LENGTH} characters`);
82
+ }
83
+ if (/(\+|\*|\{)\s*(\+|\*|\{)/.test(config.memoryMetric.pattern) ||
84
+ /\(\?[^)]*\)\+\+/.test(config.memoryMetric.pattern)) {
85
+ throw AutoresearchError.create("CONFIG_INVALID", `memoryMetric.pattern contains nested quantifiers (potential ReDoS)`);
86
+ }
87
+ try {
88
+ const _memRegex = new RegExp(config.memoryMetric.pattern);
89
+ const memMatch = new RegExp(config.memoryMetric.pattern + "|").exec("");
90
+ const memGroupCount = (memMatch?.length ?? 1) - 1;
91
+ if (memGroupCount !== 1) {
92
+ throw AutoresearchError.create("CONFIG_INVALID", `memoryMetric.pattern must have exactly one capture group, found ${memGroupCount}`);
93
+ }
94
+ }
95
+ catch (error) {
96
+ if (error instanceof Error &&
97
+ "code" in error &&
98
+ typeof error.code === "string") {
99
+ throw error; // Rethrow structured AutoresearchError
100
+ }
101
+ throw AutoresearchError.create("CONFIG_INVALID", `memoryMetric.pattern is not a valid regex: ${config.memoryMetric.pattern}`);
102
+ }
103
+ }
104
+ logger.info("[Autoresearch] Config validated", {
105
+ repoPath: config.repoPath,
106
+ mutablePaths: config.mutablePaths,
107
+ });
108
+ }
109
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Error definitions for the NeuroLink AutoResearch system.
3
+ */
4
+ export declare const AutoresearchErrorCodes: {
5
+ readonly CONFIG_INVALID: "AUTORESEARCH-001";
6
+ readonly STATE_CORRUPT: "AUTORESEARCH-002";
7
+ readonly STATE_NOT_FOUND: "AUTORESEARCH-003";
8
+ readonly REPO_NOT_FOUND: "AUTORESEARCH-004";
9
+ readonly BRANCH_ERROR: "AUTORESEARCH-005";
10
+ readonly PATH_VIOLATION: "AUTORESEARCH-006";
11
+ readonly COMMIT_REJECTED: "AUTORESEARCH-007";
12
+ readonly EXPERIMENT_TIMEOUT: "AUTORESEARCH-008";
13
+ readonly EXPERIMENT_FAILED: "AUTORESEARCH-009";
14
+ readonly PARSE_FAILED: "AUTORESEARCH-010";
15
+ readonly RESULTS_WRITE_FAILED: "AUTORESEARCH-011";
16
+ readonly REVERT_FAILED: "AUTORESEARCH-012";
17
+ readonly WORKER_NOT_INITIALIZED: "AUTORESEARCH-013";
18
+ };
19
+ export declare const AutoresearchError: {
20
+ codes: {
21
+ readonly CONFIG_INVALID: "AUTORESEARCH-001";
22
+ readonly STATE_CORRUPT: "AUTORESEARCH-002";
23
+ readonly STATE_NOT_FOUND: "AUTORESEARCH-003";
24
+ readonly REPO_NOT_FOUND: "AUTORESEARCH-004";
25
+ readonly BRANCH_ERROR: "AUTORESEARCH-005";
26
+ readonly PATH_VIOLATION: "AUTORESEARCH-006";
27
+ readonly COMMIT_REJECTED: "AUTORESEARCH-007";
28
+ readonly EXPERIMENT_TIMEOUT: "AUTORESEARCH-008";
29
+ readonly EXPERIMENT_FAILED: "AUTORESEARCH-009";
30
+ readonly PARSE_FAILED: "AUTORESEARCH-010";
31
+ readonly RESULTS_WRITE_FAILED: "AUTORESEARCH-011";
32
+ readonly REVERT_FAILED: "AUTORESEARCH-012";
33
+ readonly WORKER_NOT_INITIALIZED: "AUTORESEARCH-013";
34
+ };
35
+ create: (code: "CONFIG_INVALID" | "STATE_CORRUPT" | "STATE_NOT_FOUND" | "REPO_NOT_FOUND" | "BRANCH_ERROR" | "PATH_VIOLATION" | "COMMIT_REJECTED" | "EXPERIMENT_TIMEOUT" | "EXPERIMENT_FAILED" | "PARSE_FAILED" | "RESULTS_WRITE_FAILED" | "REVERT_FAILED" | "WORKER_NOT_INITIALIZED", message: string, options?: {
36
+ retryable?: boolean;
37
+ details?: Record<string, unknown>;
38
+ cause?: Error;
39
+ } | undefined) => import("../core/infrastructure/baseError.js").NeuroLinkFeatureError;
40
+ };
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Error definitions for the NeuroLink AutoResearch system.
3
+ */
4
+ import { createErrorFactory } from "../core/infrastructure/baseError.js";
5
+ export const AutoresearchErrorCodes = {
6
+ CONFIG_INVALID: "AUTORESEARCH-001",
7
+ STATE_CORRUPT: "AUTORESEARCH-002",
8
+ STATE_NOT_FOUND: "AUTORESEARCH-003",
9
+ REPO_NOT_FOUND: "AUTORESEARCH-004",
10
+ BRANCH_ERROR: "AUTORESEARCH-005",
11
+ PATH_VIOLATION: "AUTORESEARCH-006",
12
+ COMMIT_REJECTED: "AUTORESEARCH-007",
13
+ EXPERIMENT_TIMEOUT: "AUTORESEARCH-008",
14
+ EXPERIMENT_FAILED: "AUTORESEARCH-009",
15
+ PARSE_FAILED: "AUTORESEARCH-010",
16
+ RESULTS_WRITE_FAILED: "AUTORESEARCH-011",
17
+ REVERT_FAILED: "AUTORESEARCH-012",
18
+ WORKER_NOT_INITIALIZED: "AUTORESEARCH-013",
19
+ };
20
+ export const AutoresearchError = createErrorFactory("Autoresearch", AutoresearchErrorCodes);
21
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1,23 @@
1
+ /**
2
+ * NeuroLink AutoResearch — Autonomous Experiment Engine
3
+ *
4
+ * An autonomous experiment loop that proposes code changes, executes
5
+ * experiments, evaluates results against a deterministic metric, and
6
+ * keeps or discards each change — running unattended for hours.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { resolveConfig, validateConfig, ResearchStateStore, RepoPolicy, ExperimentRunner, ResultRecorder } from "@juspay/neurolink/autoresearch";
11
+ * ```
12
+ */
13
+ export { resolveConfig, validateConfig } from "./config.js";
14
+ export { ResearchStateStore } from "./stateStore.js";
15
+ export { RepoPolicy } from "./repoPolicy.js";
16
+ export { ExperimentRunner } from "./runner.js";
17
+ export { ResultRecorder } from "./resultRecorder.js";
18
+ export { parseExperimentSummary } from "./summaryParser.js";
19
+ export { getPhaseToolPolicy, getAllResearchToolNames } from "./phasePolicy.js";
20
+ export { PromptCompiler } from "./promptCompiler.js";
21
+ export { createResearchTools } from "./tools.js";
22
+ export { ResearchWorker } from "./worker.js";
23
+ export { AutoresearchError, AutoresearchErrorCodes } from "./errors.js";
@@ -0,0 +1,35 @@
1
+ /**
2
+ * NeuroLink AutoResearch — Autonomous Experiment Engine
3
+ *
4
+ * An autonomous experiment loop that proposes code changes, executes
5
+ * experiments, evaluates results against a deterministic metric, and
6
+ * keeps or discards each change — running unattended for hours.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { resolveConfig, validateConfig, ResearchStateStore, RepoPolicy, ExperimentRunner, ResultRecorder } from "@juspay/neurolink/autoresearch";
11
+ * ```
12
+ */
13
+ // Configuration
14
+ export { resolveConfig, validateConfig } from "./config.js";
15
+ // State management
16
+ export { ResearchStateStore } from "./stateStore.js";
17
+ // Policy enforcement
18
+ export { RepoPolicy } from "./repoPolicy.js";
19
+ // Experiment execution
20
+ export { ExperimentRunner } from "./runner.js";
21
+ // Result tracking
22
+ export { ResultRecorder } from "./resultRecorder.js";
23
+ // Log parsing
24
+ export { parseExperimentSummary } from "./summaryParser.js";
25
+ // Phase policy
26
+ export { getPhaseToolPolicy, getAllResearchToolNames } from "./phasePolicy.js";
27
+ // Prompt compilation
28
+ export { PromptCompiler } from "./promptCompiler.js";
29
+ // Research tools
30
+ export { createResearchTools } from "./tools.js";
31
+ // Worker orchestrator
32
+ export { ResearchWorker } from "./worker.js";
33
+ // Errors
34
+ export { AutoresearchError, AutoresearchErrorCodes } from "./errors.js";
35
+ //# sourceMappingURL=index.js.map