@juspay/neurolink 9.40.0 → 9.42.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 (224) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +7 -1
  3. package/dist/auth/anthropicOAuth.d.ts +18 -3
  4. package/dist/auth/anthropicOAuth.js +137 -4
  5. package/dist/auth/providers/firebase.js +5 -1
  6. package/dist/auth/providers/jwt.js +5 -1
  7. package/dist/auth/providers/workos.js +5 -1
  8. package/dist/auth/sessionManager.d.ts +1 -1
  9. package/dist/auth/sessionManager.js +58 -27
  10. package/dist/browser/neurolink.min.js +471 -445
  11. package/dist/cli/commands/mcp.js +3 -0
  12. package/dist/cli/commands/proxy.d.ts +2 -1
  13. package/dist/cli/commands/proxy.js +279 -16
  14. package/dist/cli/commands/task.d.ts +56 -0
  15. package/dist/cli/commands/task.js +838 -0
  16. package/dist/cli/factories/commandFactory.d.ts +2 -0
  17. package/dist/cli/factories/commandFactory.js +38 -0
  18. package/dist/cli/parser.js +8 -4
  19. package/dist/client/aiSdkAdapter.js +3 -0
  20. package/dist/client/streamingClient.js +30 -10
  21. package/dist/core/modules/GenerationHandler.js +3 -2
  22. package/dist/core/redisConversationMemoryManager.js +7 -3
  23. package/dist/evaluation/BatchEvaluator.js +4 -1
  24. package/dist/evaluation/hooks/observabilityHooks.js +5 -3
  25. package/dist/evaluation/pipeline/evaluationPipeline.d.ts +3 -2
  26. package/dist/evaluation/pipeline/evaluationPipeline.js +20 -8
  27. package/dist/evaluation/pipeline/strategies/batchStrategy.js +6 -3
  28. package/dist/evaluation/pipeline/strategies/samplingStrategy.js +18 -10
  29. package/dist/lib/auth/anthropicOAuth.d.ts +18 -3
  30. package/dist/lib/auth/anthropicOAuth.js +137 -4
  31. package/dist/lib/auth/providers/firebase.js +5 -1
  32. package/dist/lib/auth/providers/jwt.js +5 -1
  33. package/dist/lib/auth/providers/workos.js +5 -1
  34. package/dist/lib/auth/sessionManager.d.ts +1 -1
  35. package/dist/lib/auth/sessionManager.js +58 -27
  36. package/dist/lib/client/aiSdkAdapter.js +3 -0
  37. package/dist/lib/client/streamingClient.js +30 -10
  38. package/dist/lib/core/modules/GenerationHandler.js +3 -2
  39. package/dist/lib/core/redisConversationMemoryManager.js +7 -3
  40. package/dist/lib/evaluation/BatchEvaluator.js +4 -1
  41. package/dist/lib/evaluation/hooks/observabilityHooks.js +5 -3
  42. package/dist/lib/evaluation/pipeline/evaluationPipeline.d.ts +3 -2
  43. package/dist/lib/evaluation/pipeline/evaluationPipeline.js +20 -8
  44. package/dist/lib/evaluation/pipeline/strategies/batchStrategy.js +6 -3
  45. package/dist/lib/evaluation/pipeline/strategies/samplingStrategy.js +18 -10
  46. package/dist/lib/neurolink.d.ts +18 -1
  47. package/dist/lib/neurolink.js +367 -484
  48. package/dist/lib/observability/otelBridge.d.ts +2 -2
  49. package/dist/lib/observability/otelBridge.js +12 -3
  50. package/dist/lib/providers/amazonBedrock.js +2 -4
  51. package/dist/lib/providers/anthropic.d.ts +9 -5
  52. package/dist/lib/providers/anthropic.js +19 -14
  53. package/dist/lib/providers/anthropicBaseProvider.d.ts +3 -3
  54. package/dist/lib/providers/anthropicBaseProvider.js +5 -4
  55. package/dist/lib/providers/azureOpenai.d.ts +1 -1
  56. package/dist/lib/providers/azureOpenai.js +5 -4
  57. package/dist/lib/providers/googleAiStudio.js +30 -1
  58. package/dist/lib/providers/googleVertex.js +28 -6
  59. package/dist/lib/providers/huggingFace.d.ts +3 -3
  60. package/dist/lib/providers/huggingFace.js +6 -8
  61. package/dist/lib/providers/litellm.js +41 -29
  62. package/dist/lib/providers/mistral.js +2 -1
  63. package/dist/lib/providers/ollama.js +80 -23
  64. package/dist/lib/providers/openAI.js +3 -2
  65. package/dist/lib/providers/openRouter.js +2 -1
  66. package/dist/lib/providers/openaiCompatible.d.ts +4 -4
  67. package/dist/lib/providers/openaiCompatible.js +4 -4
  68. package/dist/lib/proxy/claudeFormat.d.ts +3 -2
  69. package/dist/lib/proxy/claudeFormat.js +25 -20
  70. package/dist/lib/proxy/cloaking/plugins/sessionIdentity.d.ts +2 -6
  71. package/dist/lib/proxy/cloaking/plugins/sessionIdentity.js +9 -33
  72. package/dist/lib/proxy/modelRouter.js +3 -0
  73. package/dist/lib/proxy/oauthFetch.d.ts +1 -1
  74. package/dist/lib/proxy/oauthFetch.js +65 -72
  75. package/dist/lib/proxy/proxyConfig.js +44 -24
  76. package/dist/lib/proxy/proxyEnv.d.ts +19 -0
  77. package/dist/lib/proxy/proxyEnv.js +73 -0
  78. package/dist/lib/proxy/proxyFetch.js +50 -4
  79. package/dist/lib/proxy/proxyTracer.d.ts +133 -0
  80. package/dist/lib/proxy/proxyTracer.js +645 -0
  81. package/dist/lib/proxy/rawStreamCapture.d.ts +10 -0
  82. package/dist/lib/proxy/rawStreamCapture.js +83 -0
  83. package/dist/lib/proxy/requestLogger.d.ts +32 -5
  84. package/dist/lib/proxy/requestLogger.js +406 -37
  85. package/dist/lib/proxy/sseInterceptor.d.ts +97 -0
  86. package/dist/lib/proxy/sseInterceptor.js +402 -0
  87. package/dist/lib/proxy/usageStats.d.ts +4 -3
  88. package/dist/lib/proxy/usageStats.js +25 -12
  89. package/dist/lib/rag/chunkers/MarkdownChunker.js +13 -5
  90. package/dist/lib/rag/chunking/markdownChunker.js +15 -6
  91. package/dist/lib/server/routes/claudeProxyRoutes.d.ts +7 -2
  92. package/dist/lib/server/routes/claudeProxyRoutes.js +1737 -508
  93. package/dist/lib/services/server/ai/observability/instrumentation.d.ts +7 -1
  94. package/dist/lib/services/server/ai/observability/instrumentation.js +240 -40
  95. package/dist/lib/tasks/backends/bullmqBackend.d.ts +33 -0
  96. package/dist/lib/tasks/backends/bullmqBackend.js +196 -0
  97. package/dist/lib/tasks/backends/nodeTimeoutBackend.d.ts +27 -0
  98. package/dist/lib/tasks/backends/nodeTimeoutBackend.js +141 -0
  99. package/dist/lib/tasks/backends/taskBackendRegistry.d.ts +31 -0
  100. package/dist/lib/tasks/backends/taskBackendRegistry.js +66 -0
  101. package/dist/lib/tasks/errors.d.ts +31 -0
  102. package/dist/lib/tasks/errors.js +18 -0
  103. package/dist/lib/tasks/store/fileTaskStore.d.ts +43 -0
  104. package/dist/lib/tasks/store/fileTaskStore.js +179 -0
  105. package/dist/lib/tasks/store/redisTaskStore.d.ts +43 -0
  106. package/dist/lib/tasks/store/redisTaskStore.js +197 -0
  107. package/dist/lib/tasks/taskExecutor.d.ts +21 -0
  108. package/dist/lib/tasks/taskExecutor.js +166 -0
  109. package/dist/lib/tasks/taskManager.d.ts +63 -0
  110. package/dist/lib/tasks/taskManager.js +426 -0
  111. package/dist/lib/tasks/tools/taskTools.d.ts +135 -0
  112. package/dist/lib/tasks/tools/taskTools.js +274 -0
  113. package/dist/lib/telemetry/index.d.ts +2 -1
  114. package/dist/lib/telemetry/index.js +2 -1
  115. package/dist/lib/telemetry/telemetryService.d.ts +3 -0
  116. package/dist/lib/telemetry/telemetryService.js +65 -5
  117. package/dist/lib/types/cli.d.ts +10 -0
  118. package/dist/lib/types/configTypes.d.ts +3 -0
  119. package/dist/lib/types/generateTypes.d.ts +13 -0
  120. package/dist/lib/types/index.d.ts +1 -0
  121. package/dist/lib/types/proxyTypes.d.ts +37 -5
  122. package/dist/lib/types/streamTypes.d.ts +25 -3
  123. package/dist/lib/types/taskTypes.d.ts +275 -0
  124. package/dist/lib/types/taskTypes.js +37 -0
  125. package/dist/lib/utils/messageBuilder.js +3 -2
  126. package/dist/lib/utils/providerHealth.d.ts +18 -0
  127. package/dist/lib/utils/providerHealth.js +240 -9
  128. package/dist/lib/utils/providerUtils.js +14 -8
  129. package/dist/lib/utils/toolChoice.d.ts +4 -0
  130. package/dist/lib/utils/toolChoice.js +7 -0
  131. package/dist/neurolink.d.ts +18 -1
  132. package/dist/neurolink.js +367 -484
  133. package/dist/observability/otelBridge.d.ts +2 -2
  134. package/dist/observability/otelBridge.js +12 -3
  135. package/dist/providers/amazonBedrock.js +2 -4
  136. package/dist/providers/anthropic.d.ts +9 -5
  137. package/dist/providers/anthropic.js +19 -14
  138. package/dist/providers/anthropicBaseProvider.d.ts +3 -3
  139. package/dist/providers/anthropicBaseProvider.js +5 -4
  140. package/dist/providers/azureOpenai.d.ts +1 -1
  141. package/dist/providers/azureOpenai.js +5 -4
  142. package/dist/providers/googleAiStudio.js +30 -1
  143. package/dist/providers/googleVertex.js +28 -6
  144. package/dist/providers/huggingFace.d.ts +3 -3
  145. package/dist/providers/huggingFace.js +6 -7
  146. package/dist/providers/litellm.js +41 -29
  147. package/dist/providers/mistral.js +2 -1
  148. package/dist/providers/ollama.js +80 -23
  149. package/dist/providers/openAI.js +3 -2
  150. package/dist/providers/openRouter.js +2 -1
  151. package/dist/providers/openaiCompatible.d.ts +4 -4
  152. package/dist/providers/openaiCompatible.js +4 -3
  153. package/dist/proxy/claudeFormat.d.ts +3 -2
  154. package/dist/proxy/claudeFormat.js +25 -20
  155. package/dist/proxy/cloaking/plugins/sessionIdentity.d.ts +2 -6
  156. package/dist/proxy/cloaking/plugins/sessionIdentity.js +9 -33
  157. package/dist/proxy/modelRouter.js +3 -0
  158. package/dist/proxy/oauthFetch.d.ts +1 -1
  159. package/dist/proxy/oauthFetch.js +65 -72
  160. package/dist/proxy/proxyConfig.js +44 -24
  161. package/dist/proxy/proxyEnv.d.ts +19 -0
  162. package/dist/proxy/proxyEnv.js +72 -0
  163. package/dist/proxy/proxyFetch.js +50 -4
  164. package/dist/proxy/proxyTracer.d.ts +133 -0
  165. package/dist/proxy/proxyTracer.js +644 -0
  166. package/dist/proxy/rawStreamCapture.d.ts +10 -0
  167. package/dist/proxy/rawStreamCapture.js +82 -0
  168. package/dist/proxy/requestLogger.d.ts +32 -5
  169. package/dist/proxy/requestLogger.js +406 -37
  170. package/dist/proxy/sseInterceptor.d.ts +97 -0
  171. package/dist/proxy/sseInterceptor.js +401 -0
  172. package/dist/proxy/usageStats.d.ts +4 -3
  173. package/dist/proxy/usageStats.js +25 -12
  174. package/dist/rag/chunkers/MarkdownChunker.js +13 -5
  175. package/dist/rag/chunking/markdownChunker.js +15 -6
  176. package/dist/server/routes/claudeProxyRoutes.d.ts +7 -2
  177. package/dist/server/routes/claudeProxyRoutes.js +1737 -508
  178. package/dist/services/server/ai/observability/instrumentation.d.ts +7 -1
  179. package/dist/services/server/ai/observability/instrumentation.js +240 -40
  180. package/dist/tasks/backends/bullmqBackend.d.ts +33 -0
  181. package/dist/tasks/backends/bullmqBackend.js +195 -0
  182. package/dist/tasks/backends/nodeTimeoutBackend.d.ts +27 -0
  183. package/dist/tasks/backends/nodeTimeoutBackend.js +140 -0
  184. package/dist/tasks/backends/taskBackendRegistry.d.ts +31 -0
  185. package/dist/tasks/backends/taskBackendRegistry.js +65 -0
  186. package/dist/tasks/errors.d.ts +31 -0
  187. package/dist/tasks/errors.js +17 -0
  188. package/dist/tasks/store/fileTaskStore.d.ts +43 -0
  189. package/dist/tasks/store/fileTaskStore.js +178 -0
  190. package/dist/tasks/store/redisTaskStore.d.ts +43 -0
  191. package/dist/tasks/store/redisTaskStore.js +196 -0
  192. package/dist/tasks/taskExecutor.d.ts +21 -0
  193. package/dist/tasks/taskExecutor.js +165 -0
  194. package/dist/tasks/taskManager.d.ts +63 -0
  195. package/dist/tasks/taskManager.js +425 -0
  196. package/dist/tasks/tools/taskTools.d.ts +135 -0
  197. package/dist/tasks/tools/taskTools.js +273 -0
  198. package/dist/telemetry/index.d.ts +2 -1
  199. package/dist/telemetry/index.js +2 -1
  200. package/dist/telemetry/telemetryService.d.ts +3 -0
  201. package/dist/telemetry/telemetryService.js +65 -5
  202. package/dist/types/cli.d.ts +10 -0
  203. package/dist/types/configTypes.d.ts +3 -0
  204. package/dist/types/generateTypes.d.ts +13 -0
  205. package/dist/types/index.d.ts +1 -0
  206. package/dist/types/proxyTypes.d.ts +37 -5
  207. package/dist/types/streamTypes.d.ts +25 -3
  208. package/dist/types/taskTypes.d.ts +275 -0
  209. package/dist/types/taskTypes.js +36 -0
  210. package/dist/utils/messageBuilder.js +3 -2
  211. package/dist/utils/providerHealth.d.ts +18 -0
  212. package/dist/utils/providerHealth.js +240 -9
  213. package/dist/utils/providerUtils.js +14 -8
  214. package/dist/utils/toolChoice.d.ts +4 -0
  215. package/dist/utils/toolChoice.js +6 -0
  216. package/docs/assets/dashboards/neurolink-proxy-observability-dashboard.json +6609 -0
  217. package/docs/changelog.md +252 -0
  218. package/package.json +19 -1
  219. package/scripts/observability/check-proxy-telemetry.mjs +235 -0
  220. package/scripts/observability/docker-compose.proxy-observability.yaml +55 -0
  221. package/scripts/observability/import-openobserve-dashboard.mjs +240 -0
  222. package/scripts/observability/manage-local-openobserve.sh +184 -0
  223. package/scripts/observability/otel-collector.proxy-observability.yaml +78 -0
  224. package/scripts/observability/proxy-observability.env.example +23 -0
@@ -0,0 +1,252 @@
1
+ # Changelog
2
+
3
+ All notable changes to NeuroLink are documented in this changelog.
4
+
5
+ For the complete and most up-to-date changelog, please visit:
6
+ **[CHANGELOG.md](https://github.com/juspay/neurolink/blob/release/CHANGELOG.md)** in the GitHub repository.
7
+
8
+ ---
9
+
10
+ ## Latest Releases
11
+
12
+ ### v9.14.0 (Current Release - February 28, 2026)
13
+
14
+ **Features:**
15
+
16
+ - **(providers):** Add Claude Subscription Support with OAuth 2.0 PKCE authentication for Claude Pro/Max subscriptions
17
+
18
+ **What's New:**
19
+
20
+ - **OAuth 2.0 with PKCE authentication** for Claude Pro, Max, and Team subscription users, enabling API access without separate API keys
21
+ - **Automatic token refresh** before every `generate()` and `stream()` call, ensuring uninterrupted sessions
22
+ - **Model tier access enforcement** with six subscription tiers: `free`, `pro`, `max`, `max_5`, `max_20`, and `api`, restricting model access based on the user's plan
23
+ - **New `auth` CLI command** with four subcommands: `login` (browser-based OAuth flow), `status` (display current authentication state), `refresh` (manually refresh tokens), and `logout` (revoke and clear credentials)
24
+ - **Secure token storage** at `~/.neurolink/anthropic-credentials.json` with filesystem-level permissions
25
+ - **Beta feature support** for `claude-code`, `interleaved-thinking`, and `fine-grained-tool-streaming` via Anthropic beta headers
26
+ - **99 integration tests** covering authentication flows, token lifecycle, tier enforcement, and CLI command behavior
27
+
28
+ ---
29
+
30
+ ### v8.26.1 (December 31, 2025)
31
+
32
+ **Bug Fixes:**
33
+
34
+ - **(providers):** Resolve Gemini 3 issues, add utilities, improve tests ([270ef6f](https://github.com/juspay/neurolink/commit/270ef6f225e7861846cf359f2d81edae38592053))
35
+
36
+ **What's New:**
37
+
38
+ - Enhanced Gemini 3 provider stability
39
+ - Improved test coverage for Google AI providers
40
+ - Added new provider utility functions
41
+
42
+ ---
43
+
44
+ ### v8.26.0 (December 30, 2025)
45
+
46
+ **Features:**
47
+
48
+ - **(types):** Add video output types (VIDEO-GEN-001) ([1b1b5c2](https://github.com/juspay/neurolink/commit/1b1b5c23d0bdacb9d3120797b1f7984d7e0cc48c))
49
+
50
+ **What's New:**
51
+
52
+ - Video generation type support
53
+ - Enhanced multimodal capabilities
54
+ - New type definitions for video outputs
55
+
56
+ ---
57
+
58
+ ### v8.25.0 (December 30, 2025)
59
+
60
+ **Features:**
61
+
62
+ - **(observability):** Add support for custom metadata in Context ([b175249](https://github.com/juspay/neurolink/commit/b175249c61357b0e6d127932bd7824d0bfe6f2ed))
63
+
64
+ **What's New:**
65
+
66
+ - Custom metadata support for observability
67
+ - Enhanced context tracking capabilities
68
+ - Improved telemetry integration
69
+
70
+ ---
71
+
72
+ ## Recent Notable Releases
73
+
74
+ ### v8.24.0 - OpenRouter Integration
75
+
76
+ - Added OpenRouter provider with 300+ model support
77
+ - Enhanced provider ecosystem
78
+ - Expanded model availability
79
+
80
+ ### v8.23.0 - CSV Enhancements
81
+
82
+ - Added file extension field to CSV metadata
83
+ - Improved CSV processing capabilities
84
+
85
+ ### v8.22.0 - CI/CD Improvements
86
+
87
+ - Added ffmpeg installation and verification to CI/CD pipeline
88
+ - Enhanced multimedia processing support
89
+
90
+ ### v8.21.0 - Office Documents
91
+
92
+ - Added office document type definitions
93
+ - Comprehensive document handling tests
94
+ - Enhanced multimodal support
95
+
96
+ ### v8.20.0 - Memory Improvements
97
+
98
+ - Implemented token-based summarization
99
+ - Enhanced conversation memory management
100
+ - Optimized context handling
101
+
102
+ ### v8.19.0 - TTS Integration
103
+
104
+ - Integrated Text-to-Speech (TTS) into BaseProvider.generate()
105
+ - Enhanced audio generation capabilities
106
+ - Google TTS handler improvements
107
+
108
+ ---
109
+
110
+ ## Version Support Policy
111
+
112
+ | Version | Status | Support Level | End of Life |
113
+ | ------- | ----------- | -------------------------------------------------------- | ------------ |
114
+ | **8.x** | **Active** | Full support - Security updates, bug fixes, new features | - |
115
+ | 7.x | Maintenance | Security updates and critical bug fixes only | June 1, 2026 |
116
+ | 6.x | End of Life | No support | June 1, 2025 |
117
+
118
+ **Support Levels Explained:**
119
+
120
+ - **Active**: Full support including new features, enhancements, bug fixes, and security updates
121
+ - **Maintenance**: Security patches and critical bug fixes only, no new features
122
+ - **End of Life**: No updates or support, upgrade recommended
123
+
124
+ ---
125
+
126
+ ## Upgrade Guides
127
+
128
+ Migrating between major versions? Check out our comprehensive upgrade guides:
129
+
130
+ ### Major Version Upgrades
131
+
132
+ - **v8 to v9 Migration Guide**
133
+
134
+ > This guide is planned for a future release.
135
+
136
+ - **v7 to v8 Migration Guide**
137
+
138
+ > This guide is planned for a future release.
139
+
140
+ - **v6 to v7 Migration Guide**
141
+ > This guide is planned for a future release.
142
+
143
+ ### Migrating from Other SDKs
144
+
145
+ Already using another AI SDK? We have migration guides:
146
+
147
+ - **[From LangChain](guides/migration/from-langchain.md)**
148
+ - Feature comparison
149
+ - API mapping
150
+ - Tool/chain equivalents
151
+
152
+ - **[From Vercel AI SDK](guides/migration/from-vercel-ai-sdk.md)**
153
+ - Provider migration
154
+ - Streaming API changes
155
+ - UI integration patterns
156
+
157
+ ---
158
+
159
+ ## Release Highlights by Feature Area
160
+
161
+ ### Providers (v8.20.0 - v9.14.0)
162
+
163
+ - **v9.14.0**: Claude Subscription Support with OAuth 2.0 PKCE authentication
164
+ - **v8.26.1**: Gemini 3 stability improvements
165
+ - **v8.24.0**: OpenRouter provider (300+ models)
166
+ - **v8.20.0**: Enhanced provider error handling
167
+
168
+ ### Multimodal (v8.19.0 - v8.26.0)
169
+
170
+ - **v8.26.0**: Video output types
171
+ - **v8.23.0**: CSV metadata enhancements
172
+ - **v8.21.0**: Office document support
173
+ - **v8.19.0**: TTS integration
174
+
175
+ ### Memory & Context (v8.20.0 - v8.25.0)
176
+
177
+ - **v8.25.0**: Custom metadata in Context
178
+ - **v8.20.0**: Token-based summarization
179
+
180
+ ### Developer Experience (v8.22.0 - v8.23.1)
181
+
182
+ - **v8.23.1**: Blocked tool support
183
+ - **v8.22.0**: Enhanced CI/CD pipeline
184
+
185
+ ---
186
+
187
+ ## Breaking Changes Summary
188
+
189
+ ### v8.x Series
190
+
191
+ No major breaking changes in v8.x patch releases. All releases are backward compatible within the 8.x major version.
192
+
193
+ ### Future Breaking Changes
194
+
195
+ Breaking changes are only introduced in major version updates (e.g., v9.0.0). We follow [Semantic Versioning](https://semver.org/):
196
+
197
+ - **Major (x.0.0)**: Breaking changes
198
+ - **Minor (8.x.0)**: New features, backward compatible
199
+ - **Patch (8.26.x)**: Bug fixes, backward compatible
200
+
201
+ ---
202
+
203
+ ## Release Schedule
204
+
205
+ NeuroLink follows a continuous release schedule:
206
+
207
+ - **Patch Releases**: As needed for bug fixes and minor improvements
208
+ - **Minor Releases**: Every 1-2 weeks for new features
209
+ - **Major Releases**: Annually or when significant architecture changes are needed
210
+
211
+ ### Release Notifications
212
+
213
+ Stay updated with new releases:
214
+
215
+ 1. **GitHub Releases**: Watch the [NeuroLink repository](https://github.com/juspay/neurolink) for release notifications
216
+ 2. **NPM**: Follow [@juspay/neurolink](https://www.npmjs.com/package/@juspay/neurolink) on npm
217
+ 3. **Changelog**: Monitor this page or the [full CHANGELOG.md](https://github.com/juspay/neurolink/blob/release/CHANGELOG.md)
218
+ 4. **GitHub Discussions**: Join discussions for release announcements
219
+
220
+ ---
221
+
222
+ ## Contribution to Changelog
223
+
224
+ Found a bug or want to contribute? Here's how:
225
+
226
+ 1. **Report Issues**: [GitHub Issues](https://github.com/juspay/neurolink/issues)
227
+ 2. **Submit PRs**: [Contributing Guide](contributing.md)
228
+ 3. **Discuss Features**: [GitHub Discussions](https://github.com/juspay/neurolink/discussions)
229
+
230
+ All contributions are automatically included in the changelog via our automated release process using semantic-release.
231
+
232
+ ---
233
+
234
+ ## Historical Releases
235
+
236
+ For a complete history of all releases including detailed commit information, see:
237
+
238
+ **[Complete CHANGELOG.md](https://github.com/juspay/neurolink/blob/release/CHANGELOG.md)**
239
+
240
+ ---
241
+
242
+ ## Related Documentation
243
+
244
+ - **[Installation Guide](getting-started/installation.md)** - Install the latest version
245
+ - **[Quick Start](getting-started/quick-start.md)** - Get up and running quickly
246
+ - **[Migration Guides](guides/migration-guide.md)** - Upgrade from older versions
247
+ - **Breaking Changes** - Detailed breaking changes documentation is planned for a future release
248
+
249
+ ---
250
+
251
+ **Last Updated:** February 28, 2026
252
+ **Current Version:** v9.14.0
package/package.json CHANGED
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "name": "@juspay/neurolink",
3
- "version": "9.40.0",
3
+ "version": "9.42.0",
4
+ "packageManager": "pnpm@10.15.1",
4
5
  "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 13 providers: OpenAI, Anthropic, Google AI, AWS Bedrock, Azure, Hugging Face, Ollama, and Mistral AI.",
5
6
  "author": {
6
7
  "name": "Juspay Technologies",
@@ -100,6 +101,14 @@
100
101
  "docs:build": "pnpm --filter ./docs-site build",
101
102
  "docs:serve": "pnpm --filter ./docs-site serve",
102
103
  "docs:clear": "pnpm --filter ./docs-site clear",
104
+ "// Proxy Observability (Local OpenObserve)": "",
105
+ "proxy:observability:setup": "bash scripts/observability/manage-local-openobserve.sh setup",
106
+ "proxy:observability:up": "bash scripts/observability/manage-local-openobserve.sh up",
107
+ "proxy:observability:down": "bash scripts/observability/manage-local-openobserve.sh down",
108
+ "proxy:observability:logs": "bash scripts/observability/manage-local-openobserve.sh logs",
109
+ "proxy:observability:status": "bash scripts/observability/manage-local-openobserve.sh status",
110
+ "proxy:observability:doctor": "node scripts/observability/check-proxy-telemetry.mjs",
111
+ "proxy:observability:import-dashboard": "bash scripts/observability/manage-local-openobserve.sh import-dashboard",
103
112
  "// Development & Monitoring": "",
104
113
  "dev:health": "tsx tools/development/healthMonitor.ts",
105
114
  "dev:demo": "concurrently \"pnpm run dev\" \"node neurolink-demo/complete-enhanced-server.js\"",
@@ -132,9 +141,11 @@
132
141
  "!dist/**/*.test.*",
133
142
  "!dist/**/*.spec.*",
134
143
  "!dist/**/*.map",
144
+ "docs/assets/dashboards/*.json",
135
145
  "docs-site/mcp-server/*.js",
136
146
  "docs-site/mcp-server/*.d.ts",
137
147
  "docs-site/static/search-index.json",
148
+ "scripts/observability/*",
138
149
  "README.md",
139
150
  "CHANGELOG.md",
140
151
  "LICENSE"
@@ -204,14 +215,21 @@
204
215
  "@langfuse/otel": "^5.0.1",
205
216
  "@modelcontextprotocol/sdk": "^1.27.1",
206
217
  "@openrouter/ai-sdk-provider": "^2.2.3",
218
+ "@opentelemetry/api-logs": "^0.214.0",
207
219
  "@opentelemetry/context-async-hooks": "^2.6.1",
208
220
  "@opentelemetry/core": "^2.6.0",
221
+ "@opentelemetry/exporter-logs-otlp-http": "^0.214.0",
222
+ "@opentelemetry/exporter-metrics-otlp-http": "^0.214.0",
209
223
  "@opentelemetry/exporter-trace-otlp-http": "^0.213.0",
210
224
  "@opentelemetry/resources": "^2.6.0",
225
+ "@opentelemetry/sdk-logs": "^0.214.0",
226
+ "@opentelemetry/sdk-metrics": "^2.6.1",
211
227
  "@opentelemetry/sdk-trace-base": "^2.6.0",
212
228
  "@opentelemetry/semantic-conventions": "^1.40.0",
213
229
  "adm-zip": "^0.5.16",
214
230
  "ai": "^6.0.134",
231
+ "bullmq": "^5.52.2",
232
+ "croner": "^9.1.0",
215
233
  "chalk": "^5.6.2",
216
234
  "csv-parser": "^3.2.0",
217
235
  "dotenv": "^17.3.1",
@@ -0,0 +1,235 @@
1
+ #!/usr/bin/env node
2
+
3
+ import { Buffer } from "node:buffer";
4
+ import { promises as fs } from "node:fs";
5
+ import { homedir } from "node:os";
6
+ import { join } from "node:path";
7
+
8
+ const DEFAULT_OPENOBSERVE_URL = "http://localhost:5080";
9
+ const DEFAULT_OPENOBSERVE_ORG = "default";
10
+ const DEFAULT_OPENOBSERVE_USER = "root@example.com";
11
+ const DEFAULT_OPENOBSERVE_PASSWORD = "Complexpass#123";
12
+ const DEFAULT_MAX_LAG_SECONDS = 900;
13
+ const STREAMS_TO_CHECK = [
14
+ {
15
+ type: "logs",
16
+ name: "neurolink_proxy",
17
+ label: "OpenObserve logs",
18
+ },
19
+ {
20
+ type: "traces",
21
+ name: "neurolink_proxy",
22
+ label: "OpenObserve traces",
23
+ },
24
+ {
25
+ type: "metrics",
26
+ name: "proxy_requests_total",
27
+ label: "OpenObserve proxy metrics",
28
+ },
29
+ ];
30
+
31
+ function getAuthHeader() {
32
+ if (process.env.NEUROLINK_OPENOBSERVE_BASIC_AUTH) {
33
+ return process.env.NEUROLINK_OPENOBSERVE_BASIC_AUTH;
34
+ }
35
+
36
+ const user =
37
+ process.env.NEUROLINK_OPENOBSERVE_USER || DEFAULT_OPENOBSERVE_USER;
38
+ const password =
39
+ process.env.NEUROLINK_OPENOBSERVE_PASSWORD || DEFAULT_OPENOBSERVE_PASSWORD;
40
+
41
+ return `Basic ${Buffer.from(`${user}:${password}`).toString("base64")}`;
42
+ }
43
+
44
+ function formatDate(micros) {
45
+ return new Date(Math.floor(micros / 1000)).toISOString();
46
+ }
47
+
48
+ function formatAgeSeconds(seconds) {
49
+ if (!Number.isFinite(seconds) || seconds < 0) {
50
+ return "n/a";
51
+ }
52
+ if (seconds < 60) {
53
+ return `${Math.round(seconds)}s`;
54
+ }
55
+ const minutes = seconds / 60;
56
+ if (minutes < 60) {
57
+ return `${Math.round(minutes)}m`;
58
+ }
59
+ const hours = minutes / 60;
60
+ return `${hours.toFixed(1)}h`;
61
+ }
62
+
63
+ function summarizeLag(ageSeconds, thresholdSeconds) {
64
+ if (!Number.isFinite(ageSeconds)) {
65
+ return "missing";
66
+ }
67
+ return ageSeconds <= thresholdSeconds ? "fresh" : "stale";
68
+ }
69
+
70
+ async function fetchStreams(type) {
71
+ const url = new URL(
72
+ `/api/${process.env.NEUROLINK_OPENOBSERVE_ORG || DEFAULT_OPENOBSERVE_ORG}/streams?type=${type}`,
73
+ process.env.NEUROLINK_OPENOBSERVE_URL || DEFAULT_OPENOBSERVE_URL,
74
+ );
75
+
76
+ const response = await fetch(url, {
77
+ headers: {
78
+ Authorization: getAuthHeader(),
79
+ },
80
+ });
81
+
82
+ if (!response.ok) {
83
+ throw new Error(
84
+ `Failed to fetch ${type} streams: ${response.status} ${response.statusText}`,
85
+ );
86
+ }
87
+
88
+ const body = await response.json();
89
+ return body.list || [];
90
+ }
91
+
92
+ async function readLatestLocalSummary() {
93
+ const logsDir = join(homedir(), ".neurolink", "logs");
94
+ let entries;
95
+ try {
96
+ entries = await fs.readdir(logsDir);
97
+ } catch (err) {
98
+ if (err.code === "ENOENT") {
99
+ return null; // No log directory yet — fresh setup
100
+ }
101
+ throw err;
102
+ }
103
+ const files = entries
104
+ .filter((name) => /^proxy-\d{4}-\d{2}-\d{2}\.jsonl$/.test(name))
105
+ .sort()
106
+ .reverse();
107
+
108
+ for (const name of files) {
109
+ const path = join(logsDir, name);
110
+ let handle;
111
+ try {
112
+ handle = await fs.open(path, "r");
113
+ } catch (err) {
114
+ if (err.code === "ENOENT") {
115
+ return null;
116
+ }
117
+ throw err;
118
+ }
119
+ try {
120
+ const stats = await handle.stat();
121
+ const chunkSize = Math.min(stats.size, 64 * 1024);
122
+ const buffer = Buffer.alloc(chunkSize);
123
+ await handle.read(buffer, 0, chunkSize, stats.size - chunkSize);
124
+ const lines = buffer
125
+ .toString("utf8")
126
+ .split("\n")
127
+ .map((line) => line.trim())
128
+ .filter(Boolean);
129
+ for (let i = lines.length - 1; i >= 0; i -= 1) {
130
+ try {
131
+ return JSON.parse(lines[i]);
132
+ } catch {
133
+ // ignore malformed tail line
134
+ }
135
+ }
136
+ } finally {
137
+ await handle.close();
138
+ }
139
+ }
140
+
141
+ return null;
142
+ }
143
+
144
+ async function main() {
145
+ const thresholdSeconds = Number(
146
+ process.env.NEUROLINK_PROXY_TELEMETRY_MAX_LAG_SEC ||
147
+ DEFAULT_MAX_LAG_SECONDS,
148
+ );
149
+ const nowMicros = Date.now() * 1000;
150
+
151
+ const groupedStreams = Object.fromEntries(
152
+ await Promise.all(
153
+ [...new Set(STREAMS_TO_CHECK.map((stream) => stream.type))].map(
154
+ async (type) => [type, await fetchStreams(type)],
155
+ ),
156
+ ),
157
+ );
158
+
159
+ const localSummary = await readLatestLocalSummary();
160
+ const localSummaryMicros = localSummary?.timestamp
161
+ ? new Date(localSummary.timestamp).getTime() * 1000
162
+ : null;
163
+
164
+ console.log("NeuroLink Proxy Telemetry Doctor");
165
+ console.log("================================");
166
+ console.log(
167
+ `OpenObserve: ${process.env.NEUROLINK_OPENOBSERVE_URL || DEFAULT_OPENOBSERVE_URL}`,
168
+ );
169
+ console.log(`Lag threshold: ${thresholdSeconds}s`);
170
+ console.log("");
171
+
172
+ let hasProblem = false;
173
+
174
+ for (const stream of STREAMS_TO_CHECK) {
175
+ const item = groupedStreams[stream.type]?.find(
176
+ (entry) => entry.name === stream.name,
177
+ );
178
+ const latestMicros = item?.stats?.doc_time_max ?? null;
179
+ const ageSeconds = latestMicros
180
+ ? Math.max(0, (nowMicros - latestMicros) / 1_000_000)
181
+ : Number.NaN;
182
+ const status = summarizeLag(ageSeconds, thresholdSeconds);
183
+ if (status !== "fresh") {
184
+ hasProblem = true;
185
+ }
186
+
187
+ console.log(`${stream.label}: ${status}`);
188
+ console.log(` stream: ${stream.name}`);
189
+ console.log(` latest: ${latestMicros ? formatDate(latestMicros) : "missing"}`);
190
+ console.log(` age: ${formatAgeSeconds(ageSeconds)}`);
191
+ console.log(` docs: ${item?.stats?.doc_num ?? 0}`);
192
+ }
193
+
194
+ console.log("");
195
+ console.log("Local proxy summary log:");
196
+ if (!localSummary || !localSummaryMicros) {
197
+ console.log(" missing");
198
+ hasProblem = true;
199
+ } else {
200
+ const ageSeconds = Math.max(0, (nowMicros - localSummaryMicros) / 1_000_000);
201
+ console.log(` latest: ${localSummary.timestamp}`);
202
+ console.log(` age: ${formatAgeSeconds(ageSeconds)}`);
203
+ console.log(` requestId: ${localSummary.requestId}`);
204
+ console.log(` status: ${localSummary.responseStatus}`);
205
+ console.log(` accountType: ${localSummary.accountType}`);
206
+ }
207
+
208
+ if (localSummaryMicros) {
209
+ console.log("");
210
+ console.log("Lag vs local summary:");
211
+ for (const stream of STREAMS_TO_CHECK) {
212
+ const item = groupedStreams[stream.type]?.find(
213
+ (entry) => entry.name === stream.name,
214
+ );
215
+ const latestMicros = item?.stats?.doc_time_max ?? null;
216
+ const deltaSeconds = latestMicros
217
+ ? Math.abs(localSummaryMicros - latestMicros) / 1_000_000
218
+ : Number.NaN;
219
+ const status = summarizeLag(deltaSeconds, thresholdSeconds);
220
+ if (status !== "fresh") {
221
+ hasProblem = true;
222
+ }
223
+ console.log(` ${stream.name}: ${status} (${formatAgeSeconds(deltaSeconds)})`);
224
+ }
225
+ }
226
+
227
+ if (hasProblem) {
228
+ process.exitCode = 1;
229
+ }
230
+ }
231
+
232
+ main().catch((error) => {
233
+ console.error(error instanceof Error ? error.message : String(error));
234
+ process.exitCode = 1;
235
+ });
@@ -0,0 +1,55 @@
1
+ # Local OpenObserve stack for NeuroLink proxy observability.
2
+ #
3
+ # Architecture:
4
+ # NeuroLink proxy -> OTEL collector -> OpenObserve
5
+ #
6
+ # Override defaults by exporting env vars or by copying
7
+ # scripts/observability/proxy-observability.env.example to
8
+ # scripts/observability/proxy-observability.env and using the helper script.
9
+
10
+ services:
11
+ otel-collector:
12
+ image: otel/opentelemetry-collector-contrib:latest
13
+ restart: unless-stopped
14
+ command: ["--config=/etc/otelcol/config.yaml"]
15
+ environment:
16
+ NEUROLINK_OPENOBSERVE_OTLP_ENDPOINT: ${NEUROLINK_OPENOBSERVE_OTLP_ENDPOINT:-http://openobserve:5080/api/default}
17
+ NEUROLINK_OPENOBSERVE_BASIC_AUTH: ${NEUROLINK_OPENOBSERVE_BASIC_AUTH:-Basic cm9vdEBleGFtcGxlLmNvbTpDb21wbGV4cGFzcyMxMjM=}
18
+ NEUROLINK_PROXY_STREAM_HEADER: ${NEUROLINK_PROXY_STREAM_HEADER:-neurolink-proxy}
19
+ volumes:
20
+ - ./otel-collector.proxy-observability.yaml:/etc/otelcol/config.yaml:ro
21
+ ports:
22
+ - "${NEUROLINK_OTLP_GRPC_PORT:-14317}:4317"
23
+ - "${NEUROLINK_OTLP_HTTP_PORT:-14318}:4318"
24
+ - "${NEUROLINK_OTEL_HEALTH_PORT:-14333}:13133"
25
+ - "${NEUROLINK_OTEL_METRICS_PORT:-18888}:8888"
26
+ - "${NEUROLINK_OTEL_PPROF_PORT:-11777}:1777"
27
+ depends_on:
28
+ - openobserve
29
+ networks:
30
+ - proxy-observability
31
+
32
+ openobserve:
33
+ image: public.ecr.aws/zinclabs/openobserve:latest
34
+ restart: unless-stopped
35
+ ports:
36
+ - "${NEUROLINK_OPENOBSERVE_HTTP_PORT:-5080}:5080"
37
+ - "${NEUROLINK_OPENOBSERVE_GRPC_PORT:-5081}:5081"
38
+ environment:
39
+ ZO_ROOT_USER_EMAIL: ${NEUROLINK_OPENOBSERVE_USER:-root@example.com}
40
+ ZO_ROOT_USER_PASSWORD: ${NEUROLINK_OPENOBSERVE_PASSWORD:-Complexpass#123}
41
+ ZO_DATA_DIR: /data
42
+ RUST_LOG: ${NEUROLINK_OPENOBSERVE_LOG_LEVEL:-info}
43
+ ZO_INGEST_ALLOWED_UPTO: ${NEUROLINK_OPENOBSERVE_INGEST_HOURS:-720}
44
+ volumes:
45
+ - openobserve-data:/data
46
+ networks:
47
+ - proxy-observability
48
+
49
+ networks:
50
+ proxy-observability:
51
+ driver: bridge
52
+
53
+ volumes:
54
+ openobserve-data:
55
+ name: ${NEUROLINK_OPENOBSERVE_VOLUME_NAME:-neurolink-openobserve-data}