@juspay/neurolink 3.0.0 → 4.0.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 (192) hide show
  1. package/CHANGELOG.md +62 -4
  2. package/README.md +235 -2
  3. package/dist/agent/direct-tools.d.ts +6 -6
  4. package/dist/chat/client-utils.d.ts +92 -0
  5. package/dist/chat/client-utils.js +298 -0
  6. package/dist/chat/index.d.ts +27 -0
  7. package/dist/chat/index.js +41 -0
  8. package/dist/chat/session-storage.d.ts +77 -0
  9. package/dist/chat/session-storage.js +233 -0
  10. package/dist/chat/session.d.ts +95 -0
  11. package/dist/chat/session.js +257 -0
  12. package/dist/chat/sse-handler.d.ts +49 -0
  13. package/dist/chat/sse-handler.js +266 -0
  14. package/dist/chat/types.d.ts +73 -0
  15. package/dist/chat/types.js +5 -0
  16. package/dist/chat/websocket-chat-handler.d.ts +36 -0
  17. package/dist/chat/websocket-chat-handler.js +262 -0
  18. package/dist/cli/commands/config.js +12 -12
  19. package/dist/cli/commands/mcp.js +3 -4
  20. package/dist/cli/index.d.ts +0 -7
  21. package/dist/cli/index.js +256 -27
  22. package/dist/config/configManager.d.ts +60 -0
  23. package/dist/config/configManager.js +300 -0
  24. package/dist/config/types.d.ts +136 -0
  25. package/dist/config/types.js +43 -0
  26. package/dist/core/analytics.d.ts +23 -0
  27. package/dist/core/analytics.js +131 -0
  28. package/dist/core/constants.d.ts +41 -0
  29. package/dist/core/constants.js +50 -0
  30. package/dist/core/defaults.d.ts +18 -0
  31. package/dist/core/defaults.js +29 -0
  32. package/dist/core/evaluation-config.d.ts +29 -0
  33. package/dist/core/evaluation-config.js +144 -0
  34. package/dist/core/evaluation-providers.d.ts +30 -0
  35. package/dist/core/evaluation-providers.js +187 -0
  36. package/dist/core/evaluation.d.ts +117 -0
  37. package/dist/core/evaluation.js +528 -0
  38. package/dist/core/factory.js +33 -25
  39. package/dist/core/types.d.ts +165 -6
  40. package/dist/core/types.js +3 -4
  41. package/dist/index.d.ts +9 -4
  42. package/dist/index.js +25 -4
  43. package/dist/lib/agent/direct-tools.d.ts +6 -6
  44. package/dist/lib/chat/client-utils.d.ts +92 -0
  45. package/dist/lib/chat/client-utils.js +298 -0
  46. package/dist/lib/chat/index.d.ts +27 -0
  47. package/dist/lib/chat/index.js +41 -0
  48. package/dist/lib/chat/session-storage.d.ts +77 -0
  49. package/dist/lib/chat/session-storage.js +233 -0
  50. package/dist/lib/chat/session.d.ts +95 -0
  51. package/dist/lib/chat/session.js +257 -0
  52. package/dist/lib/chat/sse-handler.d.ts +49 -0
  53. package/dist/lib/chat/sse-handler.js +266 -0
  54. package/dist/lib/chat/types.d.ts +73 -0
  55. package/dist/lib/chat/types.js +5 -0
  56. package/dist/lib/chat/websocket-chat-handler.d.ts +36 -0
  57. package/dist/lib/chat/websocket-chat-handler.js +262 -0
  58. package/dist/lib/config/configManager.d.ts +60 -0
  59. package/dist/lib/config/configManager.js +300 -0
  60. package/dist/lib/config/types.d.ts +136 -0
  61. package/dist/lib/config/types.js +43 -0
  62. package/dist/lib/core/analytics.d.ts +23 -0
  63. package/dist/lib/core/analytics.js +131 -0
  64. package/dist/lib/core/constants.d.ts +41 -0
  65. package/dist/lib/core/constants.js +50 -0
  66. package/dist/lib/core/defaults.d.ts +18 -0
  67. package/dist/lib/core/defaults.js +29 -0
  68. package/dist/lib/core/evaluation-config.d.ts +29 -0
  69. package/dist/lib/core/evaluation-config.js +144 -0
  70. package/dist/lib/core/evaluation-providers.d.ts +30 -0
  71. package/dist/lib/core/evaluation-providers.js +187 -0
  72. package/dist/lib/core/evaluation.d.ts +117 -0
  73. package/dist/lib/core/evaluation.js +528 -0
  74. package/dist/lib/core/factory.js +33 -26
  75. package/dist/lib/core/types.d.ts +165 -6
  76. package/dist/lib/core/types.js +3 -4
  77. package/dist/lib/index.d.ts +9 -4
  78. package/dist/lib/index.js +25 -4
  79. package/dist/lib/mcp/contracts/mcpContract.d.ts +118 -0
  80. package/dist/lib/mcp/contracts/mcpContract.js +5 -0
  81. package/dist/lib/mcp/function-calling.js +11 -3
  82. package/dist/lib/mcp/logging.js +5 -0
  83. package/dist/lib/mcp/neurolink-mcp-client.js +2 -1
  84. package/dist/lib/mcp/orchestrator.js +18 -9
  85. package/dist/lib/mcp/registry.d.ts +49 -16
  86. package/dist/lib/mcp/registry.js +80 -6
  87. package/dist/lib/mcp/servers/ai-providers/ai-workflow-tools.js +5 -4
  88. package/dist/lib/mcp/tool-integration.js +1 -1
  89. package/dist/lib/mcp/tool-registry.d.ts +55 -34
  90. package/dist/lib/mcp/tool-registry.js +111 -97
  91. package/dist/lib/mcp/unified-mcp.js +6 -1
  92. package/dist/lib/mcp/unified-registry.d.ts +12 -4
  93. package/dist/lib/mcp/unified-registry.js +17 -4
  94. package/dist/lib/neurolink.d.ts +28 -0
  95. package/dist/lib/neurolink.js +48 -4
  96. package/dist/lib/providers/agent-enhanced-provider.d.ts +11 -2
  97. package/dist/lib/providers/agent-enhanced-provider.js +86 -15
  98. package/dist/lib/providers/amazonBedrock.d.ts +9 -1
  99. package/dist/lib/providers/amazonBedrock.js +26 -2
  100. package/dist/lib/providers/analytics-helper.d.ts +53 -0
  101. package/dist/lib/providers/analytics-helper.js +151 -0
  102. package/dist/lib/providers/anthropic.d.ts +11 -1
  103. package/dist/lib/providers/anthropic.js +29 -4
  104. package/dist/lib/providers/azureOpenAI.d.ts +3 -1
  105. package/dist/lib/providers/azureOpenAI.js +28 -4
  106. package/dist/lib/providers/function-calling-provider.d.ts +9 -1
  107. package/dist/lib/providers/function-calling-provider.js +14 -1
  108. package/dist/lib/providers/googleAIStudio.d.ts +15 -1
  109. package/dist/lib/providers/googleAIStudio.js +32 -2
  110. package/dist/lib/providers/googleVertexAI.d.ts +9 -1
  111. package/dist/lib/providers/googleVertexAI.js +31 -2
  112. package/dist/lib/providers/huggingFace.d.ts +3 -1
  113. package/dist/lib/providers/huggingFace.js +26 -3
  114. package/dist/lib/providers/mcp-provider.d.ts +9 -1
  115. package/dist/lib/providers/mcp-provider.js +12 -0
  116. package/dist/lib/providers/mistralAI.d.ts +3 -1
  117. package/dist/lib/providers/mistralAI.js +25 -2
  118. package/dist/lib/providers/ollama.d.ts +3 -1
  119. package/dist/lib/providers/ollama.js +27 -4
  120. package/dist/lib/providers/openAI.d.ts +15 -1
  121. package/dist/lib/providers/openAI.js +32 -2
  122. package/dist/lib/proxy/proxy-fetch.js +8 -7
  123. package/dist/lib/services/streaming/streaming-manager.d.ts +29 -0
  124. package/dist/lib/services/streaming/streaming-manager.js +244 -0
  125. package/dist/lib/services/types.d.ts +155 -0
  126. package/dist/lib/services/types.js +2 -0
  127. package/dist/lib/services/websocket/websocket-server.d.ts +34 -0
  128. package/dist/lib/services/websocket/websocket-server.js +304 -0
  129. package/dist/lib/telemetry/index.d.ts +15 -0
  130. package/dist/lib/telemetry/index.js +22 -0
  131. package/dist/lib/telemetry/telemetry-service.d.ts +47 -0
  132. package/dist/lib/telemetry/telemetry-service.js +259 -0
  133. package/dist/lib/utils/streaming-utils.d.ts +67 -0
  134. package/dist/lib/utils/streaming-utils.js +201 -0
  135. package/dist/mcp/contracts/mcpContract.d.ts +118 -0
  136. package/dist/mcp/contracts/mcpContract.js +5 -0
  137. package/dist/mcp/function-calling.js +11 -3
  138. package/dist/mcp/logging.js +5 -0
  139. package/dist/mcp/neurolink-mcp-client.js +2 -1
  140. package/dist/mcp/orchestrator.js +18 -9
  141. package/dist/mcp/registry.d.ts +49 -16
  142. package/dist/mcp/registry.js +80 -6
  143. package/dist/mcp/servers/ai-providers/ai-workflow-tools.d.ts +2 -2
  144. package/dist/mcp/servers/ai-providers/ai-workflow-tools.js +5 -4
  145. package/dist/mcp/tool-integration.js +1 -1
  146. package/dist/mcp/tool-registry.d.ts +55 -34
  147. package/dist/mcp/tool-registry.js +111 -97
  148. package/dist/mcp/unified-mcp.js +6 -1
  149. package/dist/mcp/unified-registry.d.ts +12 -4
  150. package/dist/mcp/unified-registry.js +17 -4
  151. package/dist/neurolink.d.ts +28 -0
  152. package/dist/neurolink.js +48 -4
  153. package/dist/providers/agent-enhanced-provider.d.ts +11 -2
  154. package/dist/providers/agent-enhanced-provider.js +86 -15
  155. package/dist/providers/amazonBedrock.d.ts +9 -1
  156. package/dist/providers/amazonBedrock.js +26 -2
  157. package/dist/providers/analytics-helper.d.ts +53 -0
  158. package/dist/providers/analytics-helper.js +151 -0
  159. package/dist/providers/anthropic.d.ts +11 -1
  160. package/dist/providers/anthropic.js +29 -4
  161. package/dist/providers/azureOpenAI.d.ts +3 -1
  162. package/dist/providers/azureOpenAI.js +29 -4
  163. package/dist/providers/function-calling-provider.d.ts +9 -1
  164. package/dist/providers/function-calling-provider.js +14 -1
  165. package/dist/providers/googleAIStudio.d.ts +15 -1
  166. package/dist/providers/googleAIStudio.js +32 -2
  167. package/dist/providers/googleVertexAI.d.ts +9 -1
  168. package/dist/providers/googleVertexAI.js +31 -2
  169. package/dist/providers/huggingFace.d.ts +3 -1
  170. package/dist/providers/huggingFace.js +26 -3
  171. package/dist/providers/mcp-provider.d.ts +9 -1
  172. package/dist/providers/mcp-provider.js +12 -0
  173. package/dist/providers/mistralAI.d.ts +3 -1
  174. package/dist/providers/mistralAI.js +25 -2
  175. package/dist/providers/ollama.d.ts +3 -1
  176. package/dist/providers/ollama.js +27 -4
  177. package/dist/providers/openAI.d.ts +15 -1
  178. package/dist/providers/openAI.js +33 -2
  179. package/dist/proxy/proxy-fetch.js +8 -7
  180. package/dist/services/streaming/streaming-manager.d.ts +29 -0
  181. package/dist/services/streaming/streaming-manager.js +244 -0
  182. package/dist/services/types.d.ts +155 -0
  183. package/dist/services/types.js +2 -0
  184. package/dist/services/websocket/websocket-server.d.ts +34 -0
  185. package/dist/services/websocket/websocket-server.js +304 -0
  186. package/dist/telemetry/index.d.ts +15 -0
  187. package/dist/telemetry/index.js +22 -0
  188. package/dist/telemetry/telemetry-service.d.ts +47 -0
  189. package/dist/telemetry/telemetry-service.js +261 -0
  190. package/dist/utils/streaming-utils.d.ts +67 -0
  191. package/dist/utils/streaming-utils.js +201 -0
  192. package/package.json +18 -2
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Phase 3: SSE Chat Utilities
3
+ * Type definitions for chat infrastructure
4
+ */
5
+ export interface ChatMessage {
6
+ id: string;
7
+ role: "user" | "assistant" | "system";
8
+ content: string;
9
+ timestamp: number;
10
+ metadata?: {
11
+ provider?: string;
12
+ model?: string;
13
+ tokens?: number;
14
+ duration?: number;
15
+ };
16
+ }
17
+ export interface ChatRequest {
18
+ sessionId: string;
19
+ message: string;
20
+ role?: "user";
21
+ options?: {
22
+ temperature?: number;
23
+ maxTokens?: number;
24
+ systemPrompt?: string;
25
+ streamResponse?: boolean;
26
+ };
27
+ }
28
+ export interface SSEOptions {
29
+ maxConnections?: number;
30
+ heartbeatInterval?: number;
31
+ connectionTimeout?: number;
32
+ enableCors?: boolean;
33
+ corsOrigins?: string[];
34
+ }
35
+ export interface SessionOptions {
36
+ maxHistory?: number;
37
+ persistenceAdapter?: "memory" | "redis" | "file";
38
+ contextWindowSize?: number;
39
+ autoSave?: boolean;
40
+ ttl?: number;
41
+ }
42
+ export interface SSEEvent {
43
+ type: "data" | "error" | "progress" | "complete" | "heartbeat";
44
+ data: any;
45
+ id?: string;
46
+ retry?: number;
47
+ }
48
+ export interface ChatSessionState {
49
+ id: string;
50
+ messages: ChatMessage[];
51
+ createdAt: number;
52
+ lastActivity: number;
53
+ metadata?: Record<string, any>;
54
+ }
55
+ export interface StreamingChatResponse {
56
+ sessionId: string;
57
+ messageId: string;
58
+ stream: ReadableStream;
59
+ response: Response;
60
+ }
61
+ export interface SessionStorage {
62
+ get(sessionId: string): Promise<ChatSessionState | null>;
63
+ set(sessionId: string, state: ChatSessionState): Promise<void>;
64
+ delete(sessionId: string): Promise<void>;
65
+ list(): Promise<string[]>;
66
+ cleanup(maxAge: number): Promise<number>;
67
+ }
68
+ export interface ContextManager {
69
+ addMessage(sessionId: string, message: ChatMessage): Promise<void>;
70
+ getHistory(sessionId: string, limit?: number): Promise<ChatMessage[]>;
71
+ trimContext(sessionId: string, maxTokens: number): Promise<number>;
72
+ estimateTokens(messages: ChatMessage[]): number;
73
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Phase 3: SSE Chat Utilities
3
+ * Type definitions for chat infrastructure
4
+ */
5
+ export {};
@@ -0,0 +1,36 @@
1
+ import { SSEChatHandler } from "./sse-handler.js";
2
+ import type { AIProvider } from "../core/types.js";
3
+ import type { WebSocketOptions, ChatRequest, GroupChatRequest, StreamingChatRequest } from "../services/types.js";
4
+ import type { SSEOptions } from "./types.js";
5
+ export interface WebSocketChatOptions {
6
+ sseOptions?: any;
7
+ wsOptions?: WebSocketOptions;
8
+ enableTypingIndicators?: boolean;
9
+ enablePresenceTracking?: boolean;
10
+ enableMessageSync?: boolean;
11
+ }
12
+ export declare class WebSocketChatHandler extends SSEChatHandler {
13
+ private wsServer;
14
+ private streamingManager;
15
+ protected options: WebSocketChatOptions & Required<SSEOptions>;
16
+ private typingIndicators;
17
+ private presenceTracking;
18
+ constructor(provider: AIProvider, options?: WebSocketChatOptions);
19
+ private setupWebSocketHandlers;
20
+ handleWebSocketChatRequest(connectionId: string, request: ChatRequest): Promise<void>;
21
+ handleGroupChat(roomId: string, request: GroupChatRequest): Promise<void>;
22
+ handleStreamingChat(connectionId: string, request: StreamingChatRequest): Promise<void>;
23
+ enableTypingIndicators(roomId: string): Promise<void>;
24
+ enablePresenceTracking(roomId: string): Promise<void>;
25
+ enableMessageSynchronization(roomId: string): Promise<void>;
26
+ private sendToConnection;
27
+ private sendError;
28
+ private showTypingIndicator;
29
+ private clearTypingIndicator;
30
+ private updatePresence;
31
+ private handleWebSocketChatMessage;
32
+ getConnectionCount(): number;
33
+ getRoomCount(): number;
34
+ getStreamingMetrics(): import("../services/types.js").StreamingMetrics;
35
+ close(): void;
36
+ }
@@ -0,0 +1,262 @@
1
+ import { SSEChatHandler } from "./sse-handler.js";
2
+ import { NeuroLinkWebSocketServer } from "../services/websocket/websocket-server.js";
3
+ import { StreamingManager } from "../services/streaming/streaming-manager.js";
4
+ import { randomUUID } from "crypto";
5
+ export class WebSocketChatHandler extends SSEChatHandler {
6
+ wsServer;
7
+ streamingManager;
8
+ options;
9
+ typingIndicators = new Map();
10
+ presenceTracking = new Map();
11
+ constructor(provider, options = {}) {
12
+ super(provider, options.sseOptions);
13
+ this.options = {
14
+ enableTypingIndicators: true,
15
+ enablePresenceTracking: true,
16
+ enableMessageSync: true,
17
+ maxConnections: 100,
18
+ heartbeatInterval: 30000,
19
+ connectionTimeout: 300000,
20
+ enableCors: true,
21
+ corsOrigins: ["*"],
22
+ ...options,
23
+ };
24
+ this.wsServer = new NeuroLinkWebSocketServer(options.wsOptions);
25
+ this.streamingManager = new StreamingManager();
26
+ this.setupWebSocketHandlers();
27
+ }
28
+ setupWebSocketHandlers() {
29
+ this.wsServer.on("connection", ({ connectionId }) => {
30
+ console.log(`[WebSocket Chat] New connection: ${connectionId}`);
31
+ if (this.options.enablePresenceTracking) {
32
+ this.updatePresence(connectionId, "online");
33
+ }
34
+ });
35
+ this.wsServer.on("disconnection", ({ connectionId }) => {
36
+ console.log(`[WebSocket Chat] Disconnection: ${connectionId}`);
37
+ if (this.options.enablePresenceTracking) {
38
+ this.updatePresence(connectionId, "offline");
39
+ }
40
+ this.clearTypingIndicator(connectionId);
41
+ });
42
+ this.wsServer.on("chat-message", ({ connectionId, message }) => {
43
+ this.handleWebSocketChatMessage(connectionId, message);
44
+ });
45
+ }
46
+ // Enhanced Chat Capabilities
47
+ async handleWebSocketChatRequest(connectionId, request) {
48
+ try {
49
+ if (this.options.enableTypingIndicators) {
50
+ this.showTypingIndicator(connectionId, "assistant");
51
+ }
52
+ // Create streaming session for this chat
53
+ const streamingSession = await this.streamingManager.createStreamingSession({
54
+ provider: this.provider.constructor.name,
55
+ model: "default", // Should get from provider
56
+ streamingMode: "real-time",
57
+ compressionEnabled: true,
58
+ maxChunkSize: 1024,
59
+ bufferSize: 4096,
60
+ latencyTarget: 200,
61
+ });
62
+ // Generate AI response
63
+ const result = await this.provider.generateText({
64
+ prompt: request.prompt,
65
+ temperature: request.options?.temperature,
66
+ maxTokens: request.options?.maxTokens,
67
+ });
68
+ if (!result || !result.text) {
69
+ throw new Error("Invalid AI response");
70
+ }
71
+ // Send response via WebSocket
72
+ const responseMessage = {
73
+ id: randomUUID(),
74
+ type: "ai-response",
75
+ connectionId,
76
+ timestamp: Date.now(),
77
+ data: {
78
+ text: result.text,
79
+ sessionId: request.sessionId,
80
+ metadata: {
81
+ provider: this.provider.constructor.name,
82
+ tokens: result.usage?.totalTokens,
83
+ latency: Date.now() - Date.now(), // Should track actual timing
84
+ },
85
+ },
86
+ };
87
+ this.sendToConnection(connectionId, responseMessage);
88
+ if (this.options.enableTypingIndicators) {
89
+ this.clearTypingIndicator(connectionId);
90
+ }
91
+ await this.streamingManager.terminateStreamingSession(streamingSession.id);
92
+ }
93
+ catch (error) {
94
+ console.error("[WebSocket Chat] Error handling chat request:", error);
95
+ this.sendError(connectionId, "Failed to process chat request");
96
+ }
97
+ }
98
+ async handleGroupChat(roomId, request) {
99
+ try {
100
+ // Process AI request
101
+ const result = await this.provider.generateText({
102
+ prompt: request.prompt,
103
+ temperature: request.options?.temperature,
104
+ maxTokens: request.options?.maxTokens,
105
+ });
106
+ if (!result || !result.text) {
107
+ throw new Error("Invalid AI response");
108
+ }
109
+ // Broadcast to room
110
+ const broadcastMessage = {
111
+ id: randomUUID(),
112
+ type: "ai-response",
113
+ connectionId: "system",
114
+ timestamp: Date.now(),
115
+ data: {
116
+ text: result.text,
117
+ sessionId: request.sessionId,
118
+ userId: request.userId,
119
+ isGroupMessage: true,
120
+ metadata: {
121
+ provider: this.provider.constructor.name,
122
+ tokens: result.usage?.totalTokens,
123
+ },
124
+ },
125
+ };
126
+ this.wsServer.broadcastToRoom(roomId, broadcastMessage);
127
+ }
128
+ catch (error) {
129
+ console.error("[WebSocket Chat] Error handling group chat:", error);
130
+ }
131
+ }
132
+ async handleStreamingChat(connectionId, request) {
133
+ try {
134
+ const streamingOptions = request.streamingOptions || {};
135
+ // Create streaming channel
136
+ const channelId = randomUUID();
137
+ const channel = this.wsServer.createStreamingChannel(connectionId, channelId);
138
+ // Generate response
139
+ const result = await this.provider.generateText({
140
+ prompt: request.prompt,
141
+ ...request.options,
142
+ });
143
+ if (!result || !result.text) {
144
+ throw new Error("Invalid AI response");
145
+ }
146
+ // Send complete response
147
+ const responseMessage = {
148
+ id: randomUUID(),
149
+ type: "ai-response",
150
+ connectionId,
151
+ timestamp: Date.now(),
152
+ data: {
153
+ text: result.text,
154
+ isStreamingComplete: true,
155
+ channelId,
156
+ },
157
+ };
158
+ this.sendToConnection(connectionId, responseMessage);
159
+ }
160
+ catch (error) {
161
+ console.error("[WebSocket Chat] Error handling streaming chat:", error);
162
+ this.sendError(connectionId, "Failed to process streaming chat");
163
+ }
164
+ }
165
+ // Real-time Features
166
+ async enableTypingIndicators(roomId) {
167
+ this.options.enableTypingIndicators = true;
168
+ console.log(`[WebSocket Chat] Enabled typing indicators for room ${roomId}`);
169
+ }
170
+ async enablePresenceTracking(roomId) {
171
+ this.options.enablePresenceTracking = true;
172
+ console.log(`[WebSocket Chat] Enabled presence tracking for room ${roomId}`);
173
+ }
174
+ async enableMessageSynchronization(roomId) {
175
+ this.options.enableMessageSync = true;
176
+ console.log(`[WebSocket Chat] Enabled message sync for room ${roomId}`);
177
+ }
178
+ // Helper methods
179
+ sendToConnection(connectionId, message) {
180
+ // Use the WebSocket server's send method
181
+ const ws = this.wsServer.connections?.get(connectionId);
182
+ if (ws && ws.readyState === 1) {
183
+ // WebSocket.OPEN
184
+ ws.send(JSON.stringify(message));
185
+ }
186
+ }
187
+ sendError(connectionId, errorMessage) {
188
+ const errorMsg = {
189
+ id: randomUUID(),
190
+ type: "error",
191
+ connectionId,
192
+ timestamp: Date.now(),
193
+ data: { error: errorMessage },
194
+ };
195
+ this.sendToConnection(connectionId, errorMsg);
196
+ }
197
+ showTypingIndicator(connectionId, sender) {
198
+ if (!this.options.enableTypingIndicators) {
199
+ return;
200
+ }
201
+ const message = {
202
+ id: randomUUID(),
203
+ type: "system",
204
+ connectionId,
205
+ timestamp: Date.now(),
206
+ data: {
207
+ event: "typing_start",
208
+ sender,
209
+ },
210
+ };
211
+ this.sendToConnection(connectionId, message);
212
+ }
213
+ clearTypingIndicator(connectionId) {
214
+ const timeout = this.typingIndicators.get(connectionId);
215
+ if (timeout) {
216
+ clearTimeout(timeout);
217
+ this.typingIndicators.delete(connectionId);
218
+ }
219
+ }
220
+ updatePresence(connectionId, status) {
221
+ if (!this.options.enablePresenceTracking) {
222
+ return;
223
+ }
224
+ this.presenceTracking.set(connectionId, {
225
+ lastSeen: Date.now(),
226
+ status,
227
+ });
228
+ }
229
+ handleWebSocketChatMessage(connectionId, message) {
230
+ switch (message.data?.event) {
231
+ case "chat_request":
232
+ this.handleWebSocketChatRequest(connectionId, message.data.request);
233
+ break;
234
+ case "join_room":
235
+ this.wsServer.joinRoom(connectionId, message.data.roomId);
236
+ break;
237
+ case "leave_room":
238
+ this.wsServer.leaveRoom(connectionId, message.data.roomId);
239
+ break;
240
+ case "typing_start":
241
+ this.showTypingIndicator(connectionId, message.data.sender || "user");
242
+ break;
243
+ case "typing_stop":
244
+ this.clearTypingIndicator(connectionId);
245
+ break;
246
+ }
247
+ }
248
+ // Public API
249
+ getConnectionCount() {
250
+ return this.wsServer.getConnectionCount();
251
+ }
252
+ getRoomCount() {
253
+ return this.wsServer.getRoomCount();
254
+ }
255
+ getStreamingMetrics() {
256
+ return this.streamingManager.getStreamingMetrics();
257
+ }
258
+ close() {
259
+ this.wsServer.close();
260
+ this.streamingManager.destroy();
261
+ }
262
+ }
@@ -11,6 +11,7 @@ import path from "path";
11
11
  import os from "os";
12
12
  import chalk from "chalk";
13
13
  import { z } from "zod";
14
+ import { CLI_LIMITS } from "../../lib/core/constants.js";
14
15
  // Configuration schema for validation
15
16
  const ConfigSchema = z.object({
16
17
  defaultProvider: z
@@ -55,7 +56,7 @@ const ConfigSchema = z.object({
55
56
  serviceAccountKey: z.string().optional(),
56
57
  clientEmail: z.string().optional(),
57
58
  privateKey: z.string().optional(),
58
- model: z.string().default("gemini-1.5-pro"),
59
+ model: z.string().default("gemini-2.5-pro"),
59
60
  })
60
61
  .optional(),
61
62
  anthropic: z
@@ -75,7 +76,7 @@ const ConfigSchema = z.object({
75
76
  "google-ai": z
76
77
  .object({
77
78
  apiKey: z.string().optional(),
78
- model: z.string().default("gemini-1.5-pro-latest"),
79
+ model: z.string().default("gemini-2.5-pro"),
79
80
  })
80
81
  .optional(),
81
82
  huggingface: z
@@ -104,7 +105,11 @@ const ConfigSchema = z.object({
104
105
  .object({
105
106
  outputFormat: z.enum(["text", "json", "yaml"]).default("text"),
106
107
  temperature: z.number().min(0).max(2).default(0.7),
107
- maxTokens: z.number().min(1).max(4000).default(1000),
108
+ maxTokens: z
109
+ .number()
110
+ .min(CLI_LIMITS.maxTokens.min)
111
+ .max(CLI_LIMITS.maxTokens.max)
112
+ .default(CLI_LIMITS.maxTokens.default),
108
113
  enableLogging: z.boolean().default(false),
109
114
  enableCaching: z.boolean().default(true),
110
115
  cacheStrategy: z.enum(["memory", "file", "redis"]).default("memory"),
@@ -399,8 +404,8 @@ export class ConfigManager {
399
404
  type: "list",
400
405
  name: "model",
401
406
  message: "Default model:",
402
- choices: ["gemini-1.5-pro", "gemini-1.5-flash", "gemini-pro"],
403
- default: "gemini-1.5-pro",
407
+ choices: ["gemini-2.5-pro", "gemini-2.5-flash", "gemini-pro"],
408
+ default: "gemini-2.5-pro",
404
409
  },
405
410
  ]);
406
411
  let authConfig = {};
@@ -536,13 +541,8 @@ export class ConfigManager {
536
541
  type: "list",
537
542
  name: "model",
538
543
  message: "Default model:",
539
- choices: [
540
- "gemini-1.5-pro-latest",
541
- "gemini-2.0-flash-exp",
542
- "gemini-1.5-flash-latest",
543
- "gemini-1.0-pro",
544
- ],
545
- default: "gemini-1.5-pro-latest",
544
+ choices: ["gemini-2.5-pro", "gemini-2.5-flash"],
545
+ default: "gemini-2.5-pro",
546
546
  },
547
547
  ]);
548
548
  this.config.providers["google-ai"] = answers;
@@ -828,10 +828,9 @@ export function addMCPCommands(yargs) {
828
828
  console.log(chalk.green(`\nšŸ“‹ Found ${filteredServers.length} servers:`));
829
829
  console.log(chalk.gray("─".repeat(80)));
830
830
  filteredServers.forEach((server, index) => {
831
- const sourceIcon = getSourceTypeIcon(server.source);
832
- const priorityColor = chalk.gray; // Default color
831
+ const sourceIcon = getSourceTypeIcon(String(server.source || "unknown"));
833
832
  console.log(`${chalk.white(`${index + 1}.`)} ${sourceIcon} ${chalk.cyan(server.metadata.name)}`);
834
- console.log(` ${chalk.gray("Version:")} ${server.metadata.version}`);
833
+ console.log(` ${chalk.gray("Version:")} ${String(server.metadata.version || "unknown")}`);
835
834
  console.log(` ${chalk.gray("Source:")} ${server.source}`);
836
835
  console.log(` ${chalk.gray("Entry:")} ${server.entryPath}`);
837
836
  if (server.metadata.description) {
@@ -843,7 +842,7 @@ export function addMCPCommands(yargs) {
843
842
  }
844
843
  });
845
844
  // Display statistics
846
- const stats = await unifiedRegistry.getStats();
845
+ const stats = await unifiedRegistry.getDetailedStats();
847
846
  console.log(chalk.blue("šŸ“Š Registry Statistics:"));
848
847
  console.log(` ${chalk.gray("Total plugins:")} ${stats.total}`);
849
848
  console.log(` ${chalk.gray("Manual servers:")} ${stats.manual?.servers || 0}`);
@@ -1,9 +1,2 @@
1
1
  #!/usr/bin/env node
2
- /**
3
- * NeuroLink CLI - Enhanced Simplified Approach
4
- *
5
- * Professional CLI experience with minimal maintenance overhead.
6
- * Features: Spinners, colors, batch processing, provider testing, rich help
7
- * Implementation: ~300 lines using simple JS utility functions
8
- */
9
2
  export {};