@juspay/neurolink 7.28.1 → 7.29.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.
@@ -1,36 +1,51 @@
1
1
  import type { LanguageModelV1 } from "ai";
2
- import type { MiddlewareContext, MiddlewareConfig, MiddlewareFactoryOptions, MiddlewareChainStats } from "./types.js";
2
+ import type { MiddlewareContext, MiddlewareConfig, MiddlewareFactoryOptions, MiddlewareChainStats, MiddlewarePreset, NeuroLinkMiddleware, MiddlewareRegistrationOptions } from "./types.js";
3
+ import { MiddlewareRegistry } from "./registry.js";
3
4
  /**
4
- * Middleware factory for creating and applying middleware chains
5
+ * Middleware factory for creating and applying middleware chains.
6
+ * Each factory instance manages its own registry and configuration.
5
7
  */
6
8
  export declare class MiddlewareFactory {
9
+ registry: MiddlewareRegistry;
10
+ presets: Map<string, MiddlewarePreset>;
11
+ private options;
12
+ constructor(options?: MiddlewareFactoryOptions);
13
+ /**
14
+ * Initialize the factory with built-in middleware and presets
15
+ */
16
+ private initialize;
17
+ /**
18
+ * Register a custom preset
19
+ */
20
+ registerPreset(preset: MiddlewarePreset, replace?: boolean): void;
21
+ /**
22
+ * Register a custom middleware
23
+ */
24
+ register(middleware: NeuroLinkMiddleware, options?: MiddlewareRegistrationOptions): void;
7
25
  /**
8
26
  * Apply middleware to a language model
9
27
  */
10
- static applyMiddleware(model: LanguageModelV1, context: MiddlewareContext, options?: MiddlewareFactoryOptions): LanguageModelV1;
28
+ applyMiddleware(model: LanguageModelV1, context: MiddlewareContext, options?: MiddlewareFactoryOptions): LanguageModelV1;
29
+ private getCreator;
11
30
  /**
12
31
  * Build middleware configuration from factory options
13
32
  */
14
- private static buildMiddlewareConfig;
33
+ private buildMiddlewareConfig;
15
34
  /**
16
35
  * Get preset configuration
17
36
  */
18
- private static getPresetConfig;
19
- /**
20
- * Get built-in preset configurations
21
- */
22
- private static getBuiltInPresets;
37
+ private getPresetConfig;
23
38
  /**
24
39
  * Create middleware context from provider and options
25
40
  */
26
- static createContext(provider: string, model: string, options?: Record<string, unknown>, session?: {
41
+ createContext(provider: string, model: string, options?: Record<string, unknown>, session?: {
27
42
  sessionId?: string;
28
43
  userId?: string;
29
44
  }): MiddlewareContext;
30
45
  /**
31
46
  * Validate middleware configuration
32
47
  */
33
- static validateConfig(config: Record<string, MiddlewareConfig>): {
48
+ validateConfig(config: Record<string, MiddlewareConfig>): {
34
49
  isValid: boolean;
35
50
  errors: string[];
36
51
  warnings: string[];
@@ -38,7 +53,7 @@ export declare class MiddlewareFactory {
38
53
  /**
39
54
  * Get available presets
40
55
  */
41
- static getAvailablePresets(): Array<{
56
+ getAvailablePresets(): Array<{
42
57
  name: string;
43
58
  description: string;
44
59
  middleware: string[];
@@ -46,9 +61,9 @@ export declare class MiddlewareFactory {
46
61
  /**
47
62
  * Get middleware chain statistics
48
63
  */
49
- static getChainStats(context: MiddlewareContext, config: Record<string, MiddlewareConfig>): MiddlewareChainStats;
64
+ getChainStats(context: MiddlewareContext, config: Record<string, MiddlewareConfig>): MiddlewareChainStats;
50
65
  /**
51
66
  * Create a middleware-enabled model factory function
52
67
  */
53
- static createModelFactory(baseModelFactory: () => Promise<LanguageModelV1>, defaultOptions?: MiddlewareFactoryOptions): (context: MiddlewareContext, options?: MiddlewareFactoryOptions) => Promise<LanguageModelV1>;
68
+ createModelFactory(baseModelFactory: () => Promise<LanguageModelV1>, defaultOptions?: MiddlewareFactoryOptions): (context: MiddlewareContext, options?: MiddlewareFactoryOptions) => Promise<LanguageModelV1>;
54
69
  }
@@ -1,20 +1,104 @@
1
1
  import { wrapLanguageModel } from "ai";
2
- import { middlewareRegistry } from "./registry.js";
2
+ import { MiddlewareRegistry } from "./registry.js";
3
+ import { createAnalyticsMiddleware } from "./builtin/analytics.js";
4
+ import { createGuardrailsMiddleware } from "./builtin/guardrails.js";
3
5
  import { logger } from "../utils/logger.js";
4
6
  /**
5
- * Middleware factory for creating and applying middleware chains
7
+ * Middleware factory for creating and applying middleware chains.
8
+ * Each factory instance manages its own registry and configuration.
6
9
  */
7
10
  export class MiddlewareFactory {
11
+ registry;
12
+ presets = new Map();
13
+ options;
14
+ constructor(options = {}) {
15
+ this.options = options;
16
+ this.registry = new MiddlewareRegistry();
17
+ this.initialize(options);
18
+ }
19
+ /**
20
+ * Initialize the factory with built-in middleware and presets
21
+ */
22
+ initialize(options) {
23
+ // Register built-in middleware creators
24
+ const builtInMiddlewareCreators = {
25
+ analytics: createAnalyticsMiddleware,
26
+ guardrails: createGuardrailsMiddleware,
27
+ };
28
+ // Register built-in presets
29
+ this.registerPreset({
30
+ name: "default",
31
+ description: "Default preset with analytics enabled.",
32
+ config: { analytics: { enabled: true } },
33
+ });
34
+ this.registerPreset({
35
+ name: "all",
36
+ description: "Enables all available middleware.",
37
+ config: { analytics: { enabled: true }, guardrails: { enabled: true } },
38
+ });
39
+ this.registerPreset({
40
+ name: "security",
41
+ description: "Focuses on security with guardrails.",
42
+ config: { guardrails: { enabled: true } },
43
+ });
44
+ // Register custom middleware if provided
45
+ if (options.middleware) {
46
+ for (const customMiddleware of options.middleware) {
47
+ this.register(customMiddleware);
48
+ }
49
+ }
50
+ // Register all built-in middleware so they are available to be configured
51
+ for (const middlewareId in builtInMiddlewareCreators) {
52
+ if (!this.registry.has(middlewareId)) {
53
+ const creator = builtInMiddlewareCreators[middlewareId];
54
+ const config = options.middlewareConfig?.[middlewareId]?.config;
55
+ this.registry.register(creator(config));
56
+ }
57
+ }
58
+ }
59
+ /**
60
+ * Register a custom preset
61
+ */
62
+ registerPreset(preset, replace = false) {
63
+ if (this.presets.has(preset.name) && !replace) {
64
+ throw new Error(`Preset with name '${preset.name}' already exists. Use replace: true to override.`);
65
+ }
66
+ this.presets.set(preset.name, preset);
67
+ }
68
+ /**
69
+ * Register a custom middleware
70
+ */
71
+ register(middleware, options) {
72
+ this.registry.register(middleware, options);
73
+ }
8
74
  /**
9
75
  * Apply middleware to a language model
10
76
  */
11
- static applyMiddleware(model, context, options = {}) {
77
+ applyMiddleware(model, context, options = {}) {
12
78
  const startTime = Date.now();
13
79
  try {
80
+ // Merge constructor options with call-time options
81
+ const mergedOptions = {
82
+ ...this.options,
83
+ ...options,
84
+ middlewareConfig: {
85
+ ...this.options.middlewareConfig,
86
+ ...options.middlewareConfig,
87
+ },
88
+ };
14
89
  // Build middleware configuration
15
- const middlewareConfig = this.buildMiddlewareConfig(options);
90
+ const middlewareConfig = this.buildMiddlewareConfig(mergedOptions);
91
+ // Re-register middleware with the correct configuration for this call
92
+ for (const [id, config] of Object.entries(middlewareConfig)) {
93
+ if (config.enabled && this.registry.has(id)) {
94
+ const creator = this.getCreator(id);
95
+ if (creator) {
96
+ this.registry.register(creator(config.config), { replace: true });
97
+ }
98
+ }
99
+ }
16
100
  // Build middleware chain
17
- const middlewareChain = middlewareRegistry.buildChain(context, middlewareConfig);
101
+ const middlewareChain = this.registry.buildChain(context, middlewareConfig);
18
102
  if (middlewareChain.length === 0) {
19
103
  logger.debug("No middleware to apply", { provider: context.provider });
20
104
  return model;
@@ -47,25 +131,47 @@ export class MiddlewareFactory {
47
131
  return model;
48
132
  }
49
133
  }
134
+ getCreator(id) {
135
+ const builtInMiddlewareCreators = {
136
+ analytics: createAnalyticsMiddleware,
137
+ guardrails: createGuardrailsMiddleware,
138
+ };
139
+ return builtInMiddlewareCreators[id];
140
+ }
50
141
  /**
51
142
  * Build middleware configuration from factory options
52
143
  */
53
- static buildMiddlewareConfig(options) {
144
+ buildMiddlewareConfig(options) {
54
145
  const config = {};
55
- // Start with all registered middleware
56
- const allMiddleware = middlewareRegistry.list();
146
+ const allMiddleware = this.registry.list();
147
+ // Initialize all middleware as disabled. Configuration will enable them.
57
148
  for (const middleware of allMiddleware) {
58
- // Default configuration
59
149
  config[middleware.metadata.id] = {
60
- enabled: middleware.metadata.defaultEnabled || false,
150
+ enabled: false,
61
151
  config: {},
62
152
  };
63
153
  }
64
- // Apply preset configuration if specified
65
- if (options.preset) {
66
- const presetConfig = this.getPresetConfig(options.preset);
154
+ // Determine which preset to use.
155
+ let presetName = options.preset;
156
+ // If no preset is given, and no other specific middleware config is provided, use the default.
157
+ if (!presetName &&
158
+ (!options.middlewareConfig ||
159
+ Object.keys(options.middlewareConfig).length === 0) &&
160
+ (!options.enabledMiddleware || options.enabledMiddleware.length === 0)) {
161
+ presetName = "default";
162
+ }
163
+ // Apply preset configuration
164
+ if (presetName) {
165
+ const presetConfig = this.getPresetConfig(presetName);
67
166
  if (presetConfig) {
68
- Object.assign(config, presetConfig);
167
+ for (const [middlewareId, middlewareConfig] of Object.entries(presetConfig)) {
168
+ if (config[middlewareId]) {
169
+ config[middlewareId] = {
170
+ ...config[middlewareId],
171
+ ...middlewareConfig,
172
+ };
173
+ }
174
+ }
69
175
  }
70
176
  }
71
177
  // Apply explicit middleware configurations
@@ -98,59 +204,14 @@ export class MiddlewareFactory {
98
204
  /**
99
205
  * Get preset configuration
100
206
  */
101
- static getPresetConfig(presetName) {
102
- const presets = this.getBuiltInPresets();
103
- return presets[presetName] || null;
104
- }
105
- /**
106
- * Get built-in preset configurations
107
- */
108
- static getBuiltInPresets() {
109
- return {
110
- // Development preset - logging and basic analytics
111
- development: {
112
- logging: { enabled: true },
113
- analytics: { enabled: true },
114
- },
115
- // Production preset - analytics, caching, rate limiting
116
- production: {
117
- analytics: { enabled: true },
118
- caching: { enabled: true },
119
- rateLimit: { enabled: true },
120
- retry: { enabled: true },
121
- },
122
- // Security preset - guardrails and content filtering
123
- security: {
124
- guardrails: { enabled: true },
125
- logging: { enabled: true },
126
- rateLimit: { enabled: true },
127
- },
128
- // Performance preset - caching and optimization
129
- performance: {
130
- caching: { enabled: true },
131
- retry: { enabled: true },
132
- timeout: { enabled: true },
133
- },
134
- // Enterprise preset - all middleware enabled
135
- enterprise: {
136
- analytics: { enabled: true },
137
- guardrails: { enabled: true },
138
- logging: { enabled: true },
139
- caching: { enabled: true },
140
- rateLimit: { enabled: true },
141
- retry: { enabled: true },
142
- timeout: { enabled: true },
143
- },
144
- // Minimal preset - only essential middleware
145
- minimal: {
146
- analytics: { enabled: true },
147
- },
148
- };
207
+ getPresetConfig(presetName) {
208
+ const preset = this.presets.get(presetName);
209
+ return preset ? preset.config : null;
149
210
  }
150
211
  /**
151
212
  * Create middleware context from provider and options
152
213
  */
153
- static createContext(provider, model, options = {}, session) {
214
+ createContext(provider, model, options = {}, session) {
154
215
  return {
155
216
  provider,
156
217
  model,
@@ -165,12 +226,12 @@ export class MiddlewareFactory {
165
226
  /**
166
227
  * Validate middleware configuration
167
228
  */
168
- static validateConfig(config) {
229
+ validateConfig(config) {
169
230
  const errors = [];
170
231
  const warnings = [];
171
232
  for (const [middlewareId, middlewareConfig] of Object.entries(config)) {
172
233
  // Check if middleware is registered
173
- if (!middlewareRegistry.has(middlewareId)) {
234
+ if (!this.registry.has(middlewareId)) {
174
235
  errors.push(`Middleware '${middlewareId}' is not registered`);
175
236
  continue;
176
237
  }
@@ -198,54 +259,19 @@ export class MiddlewareFactory {
198
259
  /**
199
260
  * Get available presets
200
261
  */
201
- static getAvailablePresets() {
202
- return [
203
- {
204
- name: "development",
205
- description: "Logging and basic analytics for development",
206
- middleware: ["logging", "analytics"],
207
- },
208
- {
209
- name: "production",
210
- description: "Optimized for production with caching and rate limiting",
211
- middleware: ["analytics", "caching", "rateLimit", "retry"],
212
- },
213
- {
214
- name: "security",
215
- description: "Enhanced security with guardrails and monitoring",
216
- middleware: ["guardrails", "logging", "rateLimit"],
217
- },
218
- {
219
- name: "performance",
220
- description: "Optimized for performance with caching and retries",
221
- middleware: ["caching", "retry", "timeout"],
222
- },
223
- {
224
- name: "enterprise",
225
- description: "Full enterprise feature set with all middleware",
226
- middleware: [
227
- "analytics",
228
- "guardrails",
229
- "logging",
230
- "caching",
231
- "rateLimit",
232
- "retry",
233
- "timeout",
234
- ],
235
- },
236
- {
237
- name: "minimal",
238
- description: "Minimal overhead with only essential features",
239
- middleware: ["analytics"],
240
- },
241
- ];
262
+ getAvailablePresets() {
263
+ return Array.from(this.presets.values()).map((preset) => ({
264
+ name: preset.name,
265
+ description: preset.description,
266
+ middleware: Object.keys(preset.config),
267
+ }));
242
268
  }
243
269
  /**
244
270
  * Get middleware chain statistics
245
271
  */
246
- static getChainStats(context, config) {
247
- const chain = middlewareRegistry.buildChain(context, config);
248
- const stats = middlewareRegistry.getAggregatedStats();
272
+ getChainStats(context, config) {
273
+ const chain = this.registry.buildChain(context, config);
274
+ const stats = this.registry.getAggregatedStats();
249
275
  const results = {};
250
276
  let totalExecutionTime = 0;
251
277
  let appliedMiddleware = 0;
@@ -269,7 +295,7 @@ export class MiddlewareFactory {
269
295
  /**
270
296
  * Create a middleware-enabled model factory function
271
297
  */
272
- static createModelFactory(baseModelFactory, defaultOptions = {}) {
298
+ createModelFactory(baseModelFactory, defaultOptions = {}) {
273
299
  return async (context, options = {}) => {
274
300
  // Get base model
275
301
  const baseModel = await baseModelFactory();
@@ -5,54 +5,8 @@
5
5
  * with the AI SDK's wrapLanguageModel functionality. It allows for modular enhancement
6
6
  * of language models with features like analytics, guardrails, caching, and more.
7
7
  */
8
- import type { NeuroLinkMiddleware, MiddlewareRegistrationOptions, MiddlewareConfig } from "./types.js";
8
+ import { MiddlewareFactory } from "./factory.js";
9
9
  export type { NeuroLinkMiddleware, MiddlewareConfig, MiddlewareContext, MiddlewareConditions, MiddlewareRegistrationOptions, MiddlewareExecutionResult, MiddlewareChainStats, MiddlewarePreset, MiddlewareFactoryOptions, BuiltInMiddlewareType, } from "./types.js";
10
10
  export type { LanguageModelV1Middleware } from "ai";
11
- export { MiddlewareRegistry, middlewareRegistry } from "./registry.js";
12
- export { MiddlewareFactory } from "./factory.js";
13
- /**
14
- * Convenience function to register a middleware
15
- */
16
- export declare function registerMiddleware(middleware: NeuroLinkMiddleware, options?: MiddlewareRegistrationOptions): void;
17
- /**
18
- * Convenience function to unregister a middleware
19
- */
20
- export declare function unregisterMiddleware(middlewareId: string): boolean;
21
- /**
22
- * Convenience function to get all registered middleware
23
- */
24
- export declare function listMiddleware(): NeuroLinkMiddleware[];
25
- /**
26
- * Convenience function to check if a middleware is registered
27
- */
28
- export declare function hasMiddleware(middlewareId: string): boolean;
29
- /**
30
- * Convenience function to get middleware execution statistics
31
- */
32
- export declare function getMiddlewareStats(): Record<string, {
33
- totalExecutions: number;
34
- successfulExecutions: number;
35
- failedExecutions: number;
36
- averageExecutionTime: number;
37
- lastExecutionTime: number;
38
- }>;
39
- /**
40
- * Convenience function to clear middleware execution statistics
41
- */
42
- export declare function clearMiddlewareStats(middlewareId?: string): void;
43
- /**
44
- * Convenience function to get available middleware presets
45
- */
46
- export declare function getAvailablePresets(): Array<{
47
- name: string;
48
- description: string;
49
- middleware: string[];
50
- }>;
51
- /**
52
- * Convenience function to validate middleware configuration
53
- */
54
- export declare function validateMiddlewareConfig(config: Record<string, MiddlewareConfig>): {
55
- isValid: boolean;
56
- errors: string[];
57
- warnings: string[];
58
- };
11
+ export { MiddlewareFactory };
12
+ export default MiddlewareFactory;
@@ -5,63 +5,9 @@
5
5
  * with the AI SDK's wrapLanguageModel functionality. It allows for modular enhancement
6
6
  * of language models with features like analytics, guardrails, caching, and more.
7
7
  */
8
- import { middlewareRegistry } from "./registry.js";
8
+ // Import types and classes
9
9
  import { MiddlewareFactory } from "./factory.js";
10
- // Registry for managing middleware
11
- export { MiddlewareRegistry, middlewareRegistry } from "./registry.js";
12
10
  // Factory for creating and applying middleware chains
13
- export { MiddlewareFactory } from "./factory.js";
14
- // Re-export built-in middleware when they're implemented
15
- // export { analyticsMiddleware } from './built-in/analytics.js';
16
- // export { guardrailsMiddleware } from './built-in/guardrails.js';
17
- // export { loggingMiddleware } from './built-in/logging.js';
18
- // export { cachingMiddleware } from './built-in/caching.js';
19
- // export { rateLimitMiddleware } from './built-in/rateLimit.js';
20
- /**
21
- * Convenience function to register a middleware
22
- */
23
- export function registerMiddleware(middleware, options) {
24
- middlewareRegistry.register(middleware, options);
25
- }
26
- /**
27
- * Convenience function to unregister a middleware
28
- */
29
- export function unregisterMiddleware(middlewareId) {
30
- return middlewareRegistry.unregister(middlewareId);
31
- }
32
- /**
33
- * Convenience function to get all registered middleware
34
- */
35
- export function listMiddleware() {
36
- return middlewareRegistry.list();
37
- }
38
- /**
39
- * Convenience function to check if a middleware is registered
40
- */
41
- export function hasMiddleware(middlewareId) {
42
- return middlewareRegistry.has(middlewareId);
43
- }
44
- /**
45
- * Convenience function to get middleware execution statistics
46
- */
47
- export function getMiddlewareStats() {
48
- return middlewareRegistry.getAggregatedStats();
49
- }
50
- /**
51
- * Convenience function to clear middleware execution statistics
52
- */
53
- export function clearMiddlewareStats(middlewareId) {
54
- middlewareRegistry.clearStats(middlewareId);
55
- }
56
- /**
57
- * Convenience function to get available middleware presets
58
- */
59
- export function getAvailablePresets() {
60
- return MiddlewareFactory.getAvailablePresets();
61
- }
62
- /**
63
- * Convenience function to validate middleware configuration
64
- */
65
- export function validateMiddlewareConfig(config) {
66
- return MiddlewareFactory.validateConfig(config);
67
- }
11
+ export { MiddlewareFactory };
12
+ // Export the factory as the default export for clean, direct usage
13
+ export default MiddlewareFactory;
@@ -1,8 +1,7 @@
1
1
  import type { LanguageModelV1Middleware } from "ai";
2
2
  import type { NeuroLinkMiddleware, MiddlewareConfig, MiddlewareContext, MiddlewareRegistrationOptions, MiddlewareExecutionResult } from "./types.js";
3
3
  /**
4
- * Global middleware registry for NeuroLink
5
- * Manages registration, configuration, and execution of middleware
4
+ * Manages the registration, configuration, and execution of middleware for a single factory instance.
6
5
  */
7
6
  export declare class MiddlewareRegistry {
8
7
  private middleware;
@@ -75,4 +74,3 @@ export declare class MiddlewareRegistry {
75
74
  */
76
75
  clear(): void;
77
76
  }
78
- export declare const middlewareRegistry: MiddlewareRegistry;
@@ -1,7 +1,6 @@
1
1
  import { logger } from "../utils/logger.js";
2
2
  /**
3
- * Global middleware registry for NeuroLink
4
- * Manages registration, configuration, and execution of middleware
3
+ * Manages the registration, configuration, and execution of middleware for a single factory instance.
5
4
  */
6
5
  export class MiddlewareRegistry {
7
6
  middleware = new Map();
@@ -143,7 +142,9 @@ export class MiddlewareRegistry {
143
142
  ...config?.config,
144
143
  };
145
144
  // Create wrapper that tracks execution
146
- const wrappedMiddleware = {};
145
+ const wrappedMiddleware = {
146
+ metadata: middleware.metadata,
147
+ };
147
148
  if (middleware.transformParams) {
148
149
  wrappedMiddleware.transformParams = async (args) => {
149
150
  const startTime = Date.now();
@@ -279,5 +280,3 @@ export class MiddlewareRegistry {
279
280
  logger.debug("All middleware cleared from registry");
280
281
  }
281
282
  }
282
- // Global middleware registry instance
283
- export const middlewareRegistry = new MiddlewareRegistry();
@@ -118,12 +118,14 @@ export interface MiddlewarePreset {
118
118
  /** Description of the preset */
119
119
  description: string;
120
120
  /** Middleware configurations in the preset */
121
- middleware: Record<string, MiddlewareConfig>;
121
+ config: Record<string, MiddlewareConfig>;
122
122
  }
123
123
  /**
124
124
  * Factory options for middleware
125
125
  */
126
126
  export interface MiddlewareFactoryOptions {
127
+ /** Custom middleware to register on initialization */
128
+ middleware?: NeuroLinkMiddleware[];
127
129
  /** Enable specific middleware */
128
130
  enabledMiddleware?: string[];
129
131
  /** Disable specific middleware */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juspay/neurolink",
3
- "version": "7.28.1",
3
+ "version": "7.29.0",
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",