@juspay/neurolink 7.37.0 → 7.37.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cli/commands/config.d.ts +18 -18
  3. package/dist/cli/factories/commandFactory.d.ts +24 -0
  4. package/dist/cli/factories/commandFactory.js +297 -245
  5. package/dist/core/baseProvider.d.ts +40 -3
  6. package/dist/core/baseProvider.js +689 -352
  7. package/dist/core/constants.d.ts +2 -30
  8. package/dist/core/constants.js +15 -43
  9. package/dist/factories/providerFactory.js +23 -6
  10. package/dist/index.d.ts +3 -2
  11. package/dist/index.js +4 -3
  12. package/dist/lib/core/baseProvider.d.ts +40 -3
  13. package/dist/lib/core/baseProvider.js +689 -352
  14. package/dist/lib/core/constants.d.ts +2 -30
  15. package/dist/lib/core/constants.js +15 -43
  16. package/dist/lib/factories/providerFactory.js +23 -6
  17. package/dist/lib/index.d.ts +3 -2
  18. package/dist/lib/index.js +4 -3
  19. package/dist/lib/mcp/externalServerManager.js +2 -2
  20. package/dist/lib/mcp/registry.js +2 -2
  21. package/dist/lib/mcp/servers/agent/directToolsServer.js +19 -10
  22. package/dist/lib/mcp/toolRegistry.js +4 -8
  23. package/dist/lib/neurolink.d.ts +62 -27
  24. package/dist/lib/neurolink.js +415 -719
  25. package/dist/lib/providers/amazonBedrock.js +2 -2
  26. package/dist/lib/providers/googleVertex.d.ts +3 -23
  27. package/dist/lib/providers/googleVertex.js +14 -342
  28. package/dist/lib/providers/openAI.d.ts +23 -0
  29. package/dist/lib/providers/openAI.js +313 -6
  30. package/dist/lib/providers/sagemaker/language-model.d.ts +2 -2
  31. package/dist/lib/sdk/toolRegistration.js +18 -1
  32. package/dist/lib/types/common.d.ts +98 -0
  33. package/dist/lib/types/streamTypes.d.ts +13 -6
  34. package/dist/lib/types/typeAliases.d.ts +3 -2
  35. package/dist/lib/utils/parameterValidation.js +6 -25
  36. package/dist/lib/utils/promptRedaction.js +4 -4
  37. package/dist/lib/utils/schemaConversion.d.ts +14 -0
  38. package/dist/lib/utils/schemaConversion.js +140 -0
  39. package/dist/lib/utils/transformationUtils.js +143 -5
  40. package/dist/mcp/externalServerManager.js +2 -2
  41. package/dist/mcp/registry.js +2 -2
  42. package/dist/mcp/servers/agent/directToolsServer.js +19 -10
  43. package/dist/mcp/toolRegistry.js +4 -8
  44. package/dist/neurolink.d.ts +62 -27
  45. package/dist/neurolink.js +415 -719
  46. package/dist/providers/amazonBedrock.js +2 -2
  47. package/dist/providers/googleVertex.d.ts +3 -23
  48. package/dist/providers/googleVertex.js +14 -342
  49. package/dist/providers/openAI.d.ts +23 -0
  50. package/dist/providers/openAI.js +313 -6
  51. package/dist/providers/sagemaker/language-model.d.ts +2 -2
  52. package/dist/sdk/toolRegistration.js +18 -1
  53. package/dist/types/common.d.ts +98 -0
  54. package/dist/types/streamTypes.d.ts +13 -6
  55. package/dist/types/typeAliases.d.ts +3 -2
  56. package/dist/utils/parameterValidation.js +6 -25
  57. package/dist/utils/promptRedaction.js +4 -4
  58. package/dist/utils/schemaConversion.d.ts +14 -0
  59. package/dist/utils/schemaConversion.js +140 -0
  60. package/dist/utils/transformationUtils.js +143 -5
  61. package/package.json +3 -2
@@ -0,0 +1,14 @@
1
+ import type { ZodUnknownSchema } from "../types/tools.js";
2
+ /**
3
+ * Convert Zod schema to JSON Schema format for Claude AI
4
+ */
5
+ export declare function convertZodToJsonSchema(zodSchema: ZodUnknownSchema): object;
6
+ /**
7
+ * Check if a value is a Zod schema
8
+ */
9
+ export declare function isZodSchema(value: unknown): boolean;
10
+ /**
11
+ * Convert JSON Schema to Zod schema format using official json-schema-to-zod library
12
+ * This ensures complete preservation of all schema structure and validation rules
13
+ */
14
+ export declare function convertJsonSchemaToZod(jsonSchema: Record<string, unknown>): ZodUnknownSchema;
@@ -0,0 +1,140 @@
1
+ import { zodToJsonSchema } from "zod-to-json-schema";
2
+ import { jsonSchemaToZod } from "json-schema-to-zod";
3
+ import { z } from "zod";
4
+ import { logger } from "./logger.js";
5
+ /**
6
+ * Convert Zod schema to JSON Schema format for Claude AI
7
+ */
8
+ export function convertZodToJsonSchema(zodSchema) {
9
+ try {
10
+ // Use a type assertion that bypasses the infinite recursion check
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ const jsonSchema = zodToJsonSchema(zodSchema, {
13
+ name: "ToolParameters",
14
+ target: "jsonSchema7",
15
+ errorMessages: true,
16
+ });
17
+ // CRITICAL FIX: Ensure schema always has a proper type field for Google Vertex AI
18
+ if (!jsonSchema.type) {
19
+ // Default to "object" type if not specified, as most tool schemas are objects
20
+ jsonSchema.type = "object";
21
+ // If no properties, ensure it's at least an empty object schema
22
+ if (!jsonSchema.properties) {
23
+ jsonSchema.properties = {};
24
+ }
25
+ logger.info(`[SCHEMA-TYPE-FIX] Added missing type field to JSON Schema`, {
26
+ originalType: undefined,
27
+ fixedType: jsonSchema.type,
28
+ hasProperties: !!jsonSchema.properties,
29
+ addedEmptyProperties: !jsonSchema.properties,
30
+ });
31
+ }
32
+ logger.debug("Converted Zod schema to JSON Schema", {
33
+ hasProperties: !!jsonSchema.properties,
34
+ propertiesCount: Object.keys(jsonSchema.properties || {}).length,
35
+ schemaType: jsonSchema.type,
36
+ hasTypeField: !!jsonSchema.type,
37
+ });
38
+ return jsonSchema;
39
+ }
40
+ catch (error) {
41
+ logger.warn("Failed to convert Zod schema to JSON Schema", {
42
+ error: error instanceof Error ? error.message : String(error),
43
+ });
44
+ // Return a valid empty object schema instead of empty object
45
+ return {
46
+ type: "object",
47
+ properties: {},
48
+ };
49
+ }
50
+ }
51
+ /**
52
+ * Check if a value is a Zod schema
53
+ */
54
+ export function isZodSchema(value) {
55
+ return !!(value &&
56
+ typeof value === "object" &&
57
+ "_def" in value &&
58
+ typeof value.parse === "function");
59
+ }
60
+ /**
61
+ * Convert JSON Schema to Zod schema format using official json-schema-to-zod library
62
+ * This ensures complete preservation of all schema structure and validation rules
63
+ */
64
+ export function convertJsonSchemaToZod(jsonSchema) {
65
+ const startTime = Date.now();
66
+ try {
67
+ // Handle empty or invalid schemas
68
+ if (!jsonSchema || typeof jsonSchema !== "object") {
69
+ logger.debug("🔍 [SCHEMA-CONVERSION] Invalid or empty JSON schema, using fallback");
70
+ return z.object({}).passthrough();
71
+ }
72
+ // Log detailed input schema for debugging
73
+ logger.debug("🔍 [SCHEMA-CONVERSION] ===== STARTING OFFICIAL LIBRARY CONVERSION =====");
74
+ logger.debug("🔍 [SCHEMA-CONVERSION] Input JSON Schema:", {
75
+ type: jsonSchema.type,
76
+ hasProperties: !!jsonSchema.properties,
77
+ propertiesCount: jsonSchema.properties
78
+ ? Object.keys(jsonSchema.properties).length
79
+ : 0,
80
+ requiredCount: Array.isArray(jsonSchema.required)
81
+ ? jsonSchema.required.length
82
+ : 0,
83
+ required: jsonSchema.required,
84
+ sampleProperties: jsonSchema.properties
85
+ ? Object.keys(jsonSchema.properties).slice(0, 5)
86
+ : [],
87
+ });
88
+ // Use official library to convert JSON Schema to Zod code
89
+ const zodCodeResult = jsonSchemaToZod(jsonSchema, {
90
+ module: "esm",
91
+ name: "schema",
92
+ });
93
+ logger.debug("🔍 [SCHEMA-CONVERSION] Generated Zod code:", {
94
+ codeLength: zodCodeResult.length,
95
+ codePreview: zodCodeResult.substring(0, 200) + "...",
96
+ });
97
+ // Extract the actual Zod schema expression from the generated code
98
+ // Generated code looks like: "import { z } from "zod"\n\nexport const schema = z.object({...})\n"
99
+ const schemaMatch = zodCodeResult.match(/export const schema = (z\..+?)(?:\n|$)/s);
100
+ if (!schemaMatch) {
101
+ throw new Error("Could not extract Zod schema from generated code");
102
+ }
103
+ const schemaExpression = schemaMatch[1].trim();
104
+ logger.debug("🔍 [SCHEMA-CONVERSION] Extracted schema expression:", {
105
+ expression: schemaExpression.substring(0, 300) + "...",
106
+ });
107
+ // Use Function constructor instead of eval for better scope control
108
+ const createZodSchema = new Function("z", `return ${schemaExpression}`);
109
+ const zodSchema = createZodSchema(z);
110
+ const conversionTime = Date.now() - startTime;
111
+ logger.debug("🔍 [SCHEMA-CONVERSION] ===== CONVERSION SUCCESSFUL =====", {
112
+ inputType: jsonSchema.type,
113
+ propertiesCount: jsonSchema.properties
114
+ ? Object.keys(jsonSchema.properties).length
115
+ : 0,
116
+ requiredCount: Array.isArray(jsonSchema.required)
117
+ ? jsonSchema.required.length
118
+ : 0,
119
+ conversionSuccess: true,
120
+ conversionTimeMs: conversionTime,
121
+ libraryUsed: "json-schema-to-zod-official",
122
+ zodSchemaType: zodSchema?.constructor?.name || "unknown",
123
+ });
124
+ return zodSchema;
125
+ }
126
+ catch (error) {
127
+ const conversionTime = Date.now() - startTime;
128
+ logger.warn("🚨 [SCHEMA-CONVERSION] Official library conversion failed, using passthrough fallback", {
129
+ error: error instanceof Error ? error.message : String(error),
130
+ errorType: error instanceof Error ? error.constructor.name : typeof error,
131
+ inputSchemaType: jsonSchema?.type,
132
+ inputSchemaKeys: jsonSchema && typeof jsonSchema === "object"
133
+ ? Object.keys(jsonSchema)
134
+ : [],
135
+ conversionTimeMs: conversionTime,
136
+ libraryUsed: "json-schema-to-zod-official-FAILED",
137
+ });
138
+ return z.object({}).passthrough();
139
+ }
140
+ }
@@ -2,6 +2,7 @@
2
2
  * Object Transformation Utilities
3
3
  * Centralizes repeated object transformation patterns to improve code reuse and maintainability
4
4
  */
5
+ import { logger } from "./logger.js";
5
6
  // ============================================================================
6
7
  // TOOL EXECUTION TRANSFORMATIONS
7
8
  // ============================================================================
@@ -43,22 +44,109 @@ export function transformToolExecutions(toolExecutions) {
43
44
  if (!toolName) {
44
45
  toolName = `tool_execution_${index}`;
45
46
  }
47
+ // Enhanced tool parameter extraction with structured logging
48
+ const parameterExtractionData = {
49
+ executionIndex: index,
50
+ toolNameExtracted: toolName,
51
+ primarySources: {
52
+ hasInput: !!teRecord.input,
53
+ hasParameters: !!teRecord.parameters,
54
+ hasArgs: !!teRecord.args,
55
+ inputType: typeof teRecord.input,
56
+ parametersType: typeof teRecord.parameters,
57
+ argsType: typeof teRecord.args,
58
+ },
59
+ rawRecordKeys: Object.keys(teRecord),
60
+ };
61
+ logger.debug("[TransformationUtils] Tool parameter extraction analysis", parameterExtractionData);
46
62
  // Enhanced input extraction
47
63
  let input = teRecord.input ||
48
64
  teRecord.parameters ||
49
65
  teRecord.args ||
50
66
  {};
67
+ const primaryExtractionResult = {
68
+ keysCount: Object.keys(input).length,
69
+ keys: Object.keys(input),
70
+ extractionSuccessful: Object.keys(input).length > 0,
71
+ extractionSource: teRecord.input
72
+ ? "input"
73
+ : teRecord.parameters
74
+ ? "parameters"
75
+ : teRecord.args
76
+ ? "args"
77
+ : "empty",
78
+ };
79
+ logger.debug("[TransformationUtils] Primary parameter extraction result", primaryExtractionResult);
51
80
  // Extract input from nested toolCall if available
52
81
  if (Object.keys(input).length === 0 &&
53
82
  teRecord.toolCall &&
54
83
  typeof teRecord.toolCall === "object") {
55
84
  const toolCall = teRecord.toolCall;
85
+ const nestedExtractionData = {
86
+ reason: "Primary extraction failed, checking nested toolCall",
87
+ nestedSources: {
88
+ hasInput: !!toolCall.input,
89
+ hasParameters: !!toolCall.parameters,
90
+ hasArgs: !!toolCall.args,
91
+ },
92
+ toolCallKeys: Object.keys(toolCall),
93
+ };
94
+ logger.debug("[TransformationUtils] Nested parameter extraction attempt", nestedExtractionData);
56
95
  input =
57
96
  toolCall.input ||
58
97
  toolCall.parameters ||
59
98
  toolCall.args ||
60
99
  {};
100
+ const nestedExtractionResult = {
101
+ keysCount: Object.keys(input).length,
102
+ keys: Object.keys(input),
103
+ extractionSuccessful: Object.keys(input).length > 0,
104
+ extractionSource: toolCall.input
105
+ ? "toolCall.input"
106
+ : toolCall.parameters
107
+ ? "toolCall.parameters"
108
+ : toolCall.args
109
+ ? "toolCall.args"
110
+ : "empty",
111
+ };
112
+ logger.debug("[TransformationUtils] Nested parameter extraction result", nestedExtractionResult);
113
+ }
114
+ // Target tool parameter analysis for critical tools
115
+ if (toolName &&
116
+ (toolName.includes("SuccessRateSRByTime") ||
117
+ toolName.includes("juspay-analytics"))) {
118
+ const targetToolAnalysis = {
119
+ toolName,
120
+ inputKeys: Object.keys(input),
121
+ keysCount: Object.keys(input).length,
122
+ hasStartTime: "startTime" in input,
123
+ hasEndTime: "endTime" in input,
124
+ startTimeValue: input.startTime || "MISSING",
125
+ endTimeValue: input.endTime || "MISSING",
126
+ extractionStatus: Object.keys(input).length === 0 ? "FAILED" : "SUCCESS",
127
+ };
128
+ logger.debug("[TransformationUtils] Target tool parameter analysis", targetToolAnalysis);
129
+ if (Object.keys(input).length === 0) {
130
+ logger.error("[TransformationUtils] Critical: Target tool parameter extraction failed", {
131
+ toolName,
132
+ reason: "Both primary and nested extraction returned empty parameters",
133
+ impact: "AI response did not contain expected parameter structure",
134
+ });
135
+ }
61
136
  }
137
+ // Final parameter extraction summary
138
+ const finalExtractionSummary = {
139
+ toolName,
140
+ inputKeysCount: Object.keys(input).length,
141
+ inputKeys: Object.keys(input),
142
+ hasParameters: Object.keys(input).length > 0,
143
+ duration: teRecord.duration ??
144
+ teRecord.executionTime ??
145
+ teRecord.responseTime ??
146
+ 0,
147
+ hasOutput: !!(teRecord.output || teRecord.result || teRecord.response),
148
+ };
149
+ logger.debug("[TransformationUtils] Final parameter extraction result", finalExtractionSummary);
62
150
  // Enhanced output extraction with success indication
63
151
  const output = teRecord.output ||
64
152
  teRecord.result ||
@@ -169,14 +257,61 @@ export function transformAvailableTools(availableTools) {
169
257
  }
170
258
  return availableTools.map((tool) => {
171
259
  const toolRecord = tool;
260
+ let extractedParameters = {};
261
+ const inputSchema = toolRecord.inputSchema;
262
+ const directParameters = toolRecord.parameters;
263
+ const fallbackSchema = toolRecord.schema;
264
+ if (inputSchema && typeof inputSchema === "object") {
265
+ if (inputSchema.$ref && inputSchema.definitions) {
266
+ const definitions = inputSchema.definitions;
267
+ const refValue = inputSchema.$ref;
268
+ if (typeof refValue === "string") {
269
+ const refKey = refValue.replace("#/definitions/", "");
270
+ if (definitions[refKey] && typeof definitions[refKey] === "object") {
271
+ const resolvedSchema = definitions[refKey];
272
+ extractedParameters = {
273
+ type: resolvedSchema.type || "object",
274
+ properties: resolvedSchema.properties || {},
275
+ required: resolvedSchema.required || [],
276
+ ...resolvedSchema, // Include all schema metadata
277
+ };
278
+ }
279
+ }
280
+ }
281
+ else if (inputSchema.properties) {
282
+ extractedParameters = {
283
+ type: inputSchema.type || "object",
284
+ properties: inputSchema.properties,
285
+ required: inputSchema.required || [],
286
+ ...inputSchema,
287
+ };
288
+ }
289
+ else if (inputSchema.type === "object") {
290
+ extractedParameters = inputSchema;
291
+ }
292
+ else {
293
+ extractedParameters = inputSchema;
294
+ }
295
+ }
296
+ else if (directParameters && typeof directParameters === "object") {
297
+ extractedParameters = directParameters;
298
+ }
299
+ else if (fallbackSchema && typeof fallbackSchema === "object") {
300
+ extractedParameters = fallbackSchema;
301
+ }
302
+ if (!extractedParameters || typeof extractedParameters !== "object") {
303
+ extractedParameters = {};
304
+ }
305
+ if (extractedParameters &&
306
+ !extractedParameters.type &&
307
+ extractedParameters.properties) {
308
+ extractedParameters.type = "object";
309
+ }
172
310
  return {
173
311
  name: tool.name || "",
174
312
  description: tool.description || "",
175
313
  server: tool.server || "",
176
- parameters: toolRecord.inputSchema ||
177
- toolRecord.parameters ||
178
- toolRecord.schema ||
179
- {},
314
+ parameters: extractedParameters,
180
315
  };
181
316
  });
182
317
  }
@@ -246,7 +381,10 @@ export function transformSchemaToParameterDescription(schema) {
246
381
  .map(([key, value]) => {
247
382
  const typedValue = value;
248
383
  const required = requiredParams.has(key) ? " (required)" : "";
249
- return ` - ${key}: ${typedValue.type || "unknown"}${required}`;
384
+ const description = typedValue.description
385
+ ? ` - ${typedValue.description}`
386
+ : "";
387
+ return ` - ${key}: ${typedValue.type || "unknown"}${required}${description}`;
250
388
  })
251
389
  .join("\n");
252
390
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juspay/neurolink",
3
- "version": "7.37.0",
3
+ "version": "7.37.1",
4
4
  "description": "Universal AI Development Platform with working MCP integration, multi-provider support, and professional CLI. Built-in tools operational, 58+ external MCP servers discoverable. Connect to filesystem, GitHub, database operations, and more. Build, test, and deploy AI applications with 9 major providers: OpenAI, Anthropic, Google AI, AWS Bedrock, Azure, Hugging Face, Ollama, and Mistral AI.",
5
5
  "author": {
6
6
  "name": "Juspay Technologies",
@@ -174,6 +174,7 @@
174
174
  "chalk": "^5.3.0",
175
175
  "dotenv": "^16.5.0",
176
176
  "inquirer": "^9.2.15",
177
+ "json-schema-to-zod": "^2.6.1",
177
178
  "mathjs": "^14.5.3",
178
179
  "nanoid": "^5.1.5",
179
180
  "ollama-ai-provider": "^1.2.0",
@@ -186,7 +187,7 @@
186
187
  "ws": "^8.18.3",
187
188
  "yargs": "^17.7.2",
188
189
  "zod": "^3.22.0",
189
- "zod-to-json-schema": "^3.24.5"
190
+ "zod-to-json-schema": "^3.24.6"
190
191
  },
191
192
  "devDependencies": {
192
193
  "@biomejs/biome": "^2.1.4",