@juspay/neurolink 9.41.0 → 9.42.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.
- package/CHANGELOG.md +8 -0
- package/README.md +7 -1
- package/dist/auth/anthropicOAuth.d.ts +18 -3
- package/dist/auth/anthropicOAuth.js +149 -4
- package/dist/auth/providers/firebase.js +5 -1
- package/dist/auth/providers/jwt.js +5 -1
- package/dist/auth/providers/workos.js +5 -1
- package/dist/auth/sessionManager.d.ts +1 -1
- package/dist/auth/sessionManager.js +58 -27
- package/dist/browser/neurolink.min.js +354 -334
- package/dist/cli/commands/mcp.d.ts +6 -0
- package/dist/cli/commands/mcp.js +188 -181
- package/dist/cli/commands/proxy.d.ts +2 -1
- package/dist/cli/commands/proxy.js +713 -431
- package/dist/cli/commands/task.js +3 -0
- package/dist/cli/factories/commandFactory.d.ts +2 -0
- package/dist/cli/factories/commandFactory.js +38 -0
- package/dist/cli/parser.js +4 -3
- package/dist/client/aiSdkAdapter.js +3 -0
- package/dist/client/streamingClient.js +30 -10
- package/dist/core/baseProvider.d.ts +6 -1
- package/dist/core/baseProvider.js +208 -230
- package/dist/core/factory.d.ts +3 -0
- package/dist/core/factory.js +138 -188
- package/dist/core/modules/GenerationHandler.js +3 -2
- package/dist/core/redisConversationMemoryManager.js +7 -3
- package/dist/evaluation/BatchEvaluator.js +4 -1
- package/dist/evaluation/hooks/observabilityHooks.js +5 -3
- package/dist/evaluation/pipeline/evaluationPipeline.d.ts +3 -2
- package/dist/evaluation/pipeline/evaluationPipeline.js +24 -9
- package/dist/evaluation/pipeline/strategies/batchStrategy.js +6 -3
- package/dist/evaluation/pipeline/strategies/samplingStrategy.js +18 -10
- package/dist/evaluation/scorers/scorerRegistry.d.ts +3 -0
- package/dist/evaluation/scorers/scorerRegistry.js +353 -282
- package/dist/lib/auth/anthropicOAuth.d.ts +18 -3
- package/dist/lib/auth/anthropicOAuth.js +149 -4
- package/dist/lib/auth/providers/firebase.js +5 -1
- package/dist/lib/auth/providers/jwt.js +5 -1
- package/dist/lib/auth/providers/workos.js +5 -1
- package/dist/lib/auth/sessionManager.d.ts +1 -1
- package/dist/lib/auth/sessionManager.js +58 -27
- package/dist/lib/client/aiSdkAdapter.js +3 -0
- package/dist/lib/client/streamingClient.js +30 -10
- package/dist/lib/core/baseProvider.d.ts +6 -1
- package/dist/lib/core/baseProvider.js +208 -230
- package/dist/lib/core/factory.d.ts +3 -0
- package/dist/lib/core/factory.js +138 -188
- package/dist/lib/core/modules/GenerationHandler.js +3 -2
- package/dist/lib/core/redisConversationMemoryManager.js +7 -3
- package/dist/lib/evaluation/BatchEvaluator.js +4 -1
- package/dist/lib/evaluation/hooks/observabilityHooks.js +5 -3
- package/dist/lib/evaluation/pipeline/evaluationPipeline.d.ts +3 -2
- package/dist/lib/evaluation/pipeline/evaluationPipeline.js +24 -9
- package/dist/lib/evaluation/pipeline/strategies/batchStrategy.js +6 -3
- package/dist/lib/evaluation/pipeline/strategies/samplingStrategy.js +18 -10
- package/dist/lib/evaluation/scorers/scorerRegistry.d.ts +3 -0
- package/dist/lib/evaluation/scorers/scorerRegistry.js +353 -282
- package/dist/lib/mcp/toolRegistry.d.ts +2 -0
- package/dist/lib/mcp/toolRegistry.js +32 -31
- package/dist/lib/neurolink.d.ts +41 -2
- package/dist/lib/neurolink.js +1616 -1681
- package/dist/lib/observability/otelBridge.d.ts +2 -2
- package/dist/lib/observability/otelBridge.js +12 -3
- package/dist/lib/providers/amazonBedrock.js +2 -4
- package/dist/lib/providers/anthropic.d.ts +9 -5
- package/dist/lib/providers/anthropic.js +19 -14
- package/dist/lib/providers/anthropicBaseProvider.d.ts +3 -3
- package/dist/lib/providers/anthropicBaseProvider.js +5 -4
- package/dist/lib/providers/azureOpenai.d.ts +1 -1
- package/dist/lib/providers/azureOpenai.js +5 -4
- package/dist/lib/providers/googleAiStudio.js +30 -6
- package/dist/lib/providers/googleVertex.d.ts +10 -0
- package/dist/lib/providers/googleVertex.js +437 -423
- package/dist/lib/providers/huggingFace.d.ts +3 -3
- package/dist/lib/providers/huggingFace.js +6 -8
- package/dist/lib/providers/litellm.d.ts +1 -0
- package/dist/lib/providers/litellm.js +76 -55
- package/dist/lib/providers/mistral.js +2 -1
- package/dist/lib/providers/ollama.js +93 -23
- package/dist/lib/providers/openAI.d.ts +2 -0
- package/dist/lib/providers/openAI.js +141 -141
- package/dist/lib/providers/openRouter.js +2 -1
- package/dist/lib/providers/openaiCompatible.d.ts +4 -4
- package/dist/lib/providers/openaiCompatible.js +4 -4
- package/dist/lib/proxy/claudeFormat.d.ts +3 -2
- package/dist/lib/proxy/claudeFormat.js +27 -14
- package/dist/lib/proxy/cloaking/plugins/sessionIdentity.d.ts +2 -6
- package/dist/lib/proxy/cloaking/plugins/sessionIdentity.js +9 -33
- package/dist/lib/proxy/modelRouter.js +3 -0
- package/dist/lib/proxy/oauthFetch.d.ts +1 -1
- package/dist/lib/proxy/oauthFetch.js +289 -316
- package/dist/lib/proxy/proxyConfig.js +46 -24
- package/dist/lib/proxy/proxyEnv.d.ts +19 -0
- package/dist/lib/proxy/proxyEnv.js +73 -0
- package/dist/lib/proxy/proxyFetch.js +291 -217
- package/dist/lib/proxy/proxyTracer.d.ts +133 -0
- package/dist/lib/proxy/proxyTracer.js +645 -0
- package/dist/lib/proxy/rawStreamCapture.d.ts +10 -0
- package/dist/lib/proxy/rawStreamCapture.js +83 -0
- package/dist/lib/proxy/requestLogger.d.ts +32 -5
- package/dist/lib/proxy/requestLogger.js +503 -47
- package/dist/lib/proxy/sseInterceptor.d.ts +97 -0
- package/dist/lib/proxy/sseInterceptor.js +427 -0
- package/dist/lib/proxy/usageStats.d.ts +4 -3
- package/dist/lib/proxy/usageStats.js +25 -12
- package/dist/lib/rag/chunkers/MarkdownChunker.js +13 -5
- package/dist/lib/rag/chunking/markdownChunker.js +15 -6
- package/dist/lib/server/routes/claudeProxyRoutes.d.ts +17 -3
- package/dist/lib/server/routes/claudeProxyRoutes.js +3032 -1349
- package/dist/lib/services/server/ai/observability/instrumentation.d.ts +7 -1
- package/dist/lib/services/server/ai/observability/instrumentation.js +337 -161
- package/dist/lib/tasks/backends/bullmqBackend.d.ts +1 -0
- package/dist/lib/tasks/backends/bullmqBackend.js +35 -22
- package/dist/lib/tasks/store/redisTaskStore.d.ts +1 -0
- package/dist/lib/tasks/store/redisTaskStore.js +54 -39
- package/dist/lib/tasks/taskManager.d.ts +5 -0
- package/dist/lib/tasks/taskManager.js +158 -30
- package/dist/lib/telemetry/index.d.ts +2 -1
- package/dist/lib/telemetry/index.js +2 -1
- package/dist/lib/telemetry/telemetryService.d.ts +3 -0
- package/dist/lib/telemetry/telemetryService.js +69 -5
- package/dist/lib/types/cli.d.ts +10 -0
- package/dist/lib/types/proxyTypes.d.ts +160 -5
- package/dist/lib/types/streamTypes.d.ts +25 -3
- package/dist/lib/utils/messageBuilder.js +3 -2
- package/dist/lib/utils/providerHealth.d.ts +19 -0
- package/dist/lib/utils/providerHealth.js +279 -33
- package/dist/lib/utils/providerUtils.js +17 -22
- package/dist/lib/utils/toolChoice.d.ts +4 -0
- package/dist/lib/utils/toolChoice.js +7 -0
- package/dist/mcp/toolRegistry.d.ts +2 -0
- package/dist/mcp/toolRegistry.js +32 -31
- package/dist/neurolink.d.ts +41 -2
- package/dist/neurolink.js +1616 -1681
- package/dist/observability/otelBridge.d.ts +2 -2
- package/dist/observability/otelBridge.js +12 -3
- package/dist/providers/amazonBedrock.js +2 -4
- package/dist/providers/anthropic.d.ts +9 -5
- package/dist/providers/anthropic.js +19 -14
- package/dist/providers/anthropicBaseProvider.d.ts +3 -3
- package/dist/providers/anthropicBaseProvider.js +5 -4
- package/dist/providers/azureOpenai.d.ts +1 -1
- package/dist/providers/azureOpenai.js +5 -4
- package/dist/providers/googleAiStudio.js +30 -6
- package/dist/providers/googleVertex.d.ts +10 -0
- package/dist/providers/googleVertex.js +437 -423
- package/dist/providers/huggingFace.d.ts +3 -3
- package/dist/providers/huggingFace.js +6 -7
- package/dist/providers/litellm.d.ts +1 -0
- package/dist/providers/litellm.js +76 -55
- package/dist/providers/mistral.js +2 -1
- package/dist/providers/ollama.js +93 -23
- package/dist/providers/openAI.d.ts +2 -0
- package/dist/providers/openAI.js +141 -141
- package/dist/providers/openRouter.js +2 -1
- package/dist/providers/openaiCompatible.d.ts +4 -4
- package/dist/providers/openaiCompatible.js +4 -3
- package/dist/proxy/claudeFormat.d.ts +3 -2
- package/dist/proxy/claudeFormat.js +27 -14
- package/dist/proxy/cloaking/plugins/sessionIdentity.d.ts +2 -6
- package/dist/proxy/cloaking/plugins/sessionIdentity.js +9 -33
- package/dist/proxy/modelRouter.js +3 -0
- package/dist/proxy/oauthFetch.d.ts +1 -1
- package/dist/proxy/oauthFetch.js +289 -316
- package/dist/proxy/proxyConfig.js +46 -24
- package/dist/proxy/proxyEnv.d.ts +19 -0
- package/dist/proxy/proxyEnv.js +72 -0
- package/dist/proxy/proxyFetch.js +291 -217
- package/dist/proxy/proxyTracer.d.ts +133 -0
- package/dist/proxy/proxyTracer.js +644 -0
- package/dist/proxy/rawStreamCapture.d.ts +10 -0
- package/dist/proxy/rawStreamCapture.js +82 -0
- package/dist/proxy/requestLogger.d.ts +32 -5
- package/dist/proxy/requestLogger.js +503 -47
- package/dist/proxy/sseInterceptor.d.ts +97 -0
- package/dist/proxy/sseInterceptor.js +426 -0
- package/dist/proxy/usageStats.d.ts +4 -3
- package/dist/proxy/usageStats.js +25 -12
- package/dist/rag/chunkers/MarkdownChunker.js +13 -5
- package/dist/rag/chunking/markdownChunker.js +15 -6
- package/dist/server/routes/claudeProxyRoutes.d.ts +17 -3
- package/dist/server/routes/claudeProxyRoutes.js +3032 -1349
- package/dist/services/server/ai/observability/instrumentation.d.ts +7 -1
- package/dist/services/server/ai/observability/instrumentation.js +337 -161
- package/dist/tasks/backends/bullmqBackend.d.ts +1 -0
- package/dist/tasks/backends/bullmqBackend.js +35 -22
- package/dist/tasks/store/redisTaskStore.d.ts +1 -0
- package/dist/tasks/store/redisTaskStore.js +54 -39
- package/dist/tasks/taskManager.d.ts +5 -0
- package/dist/tasks/taskManager.js +158 -30
- package/dist/telemetry/index.d.ts +2 -1
- package/dist/telemetry/index.js +2 -1
- package/dist/telemetry/telemetryService.d.ts +3 -0
- package/dist/telemetry/telemetryService.js +69 -5
- package/dist/types/cli.d.ts +10 -0
- package/dist/types/proxyTypes.d.ts +160 -5
- package/dist/types/streamTypes.d.ts +25 -3
- package/dist/utils/messageBuilder.js +3 -2
- package/dist/utils/providerHealth.d.ts +19 -0
- package/dist/utils/providerHealth.js +279 -33
- package/dist/utils/providerUtils.js +18 -22
- package/dist/utils/toolChoice.d.ts +4 -0
- package/dist/utils/toolChoice.js +6 -0
- package/docs/assets/dashboards/neurolink-proxy-observability-dashboard.json +6609 -0
- package/docs/changelog.md +252 -0
- package/package.json +19 -2
- package/scripts/observability/check-proxy-telemetry.mjs +235 -0
- package/scripts/observability/docker-compose.proxy-observability.yaml +55 -0
- package/scripts/observability/import-openobserve-dashboard.mjs +240 -0
- package/scripts/observability/manage-local-openobserve.sh +215 -0
- package/scripts/observability/otel-collector.proxy-observability.yaml +78 -0
- 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.
|
|
3
|
+
"version": "9.42.1",
|
|
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,10 +215,15 @@
|
|
|
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",
|
|
209
|
-
"@opentelemetry/exporter-
|
|
221
|
+
"@opentelemetry/exporter-logs-otlp-http": "^0.214.0",
|
|
222
|
+
"@opentelemetry/exporter-metrics-otlp-http": "^0.214.0",
|
|
223
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.214.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",
|
|
@@ -418,6 +434,7 @@
|
|
|
418
434
|
"js-yaml@>=3.0.0 <3.14.2": ">=3.14.2",
|
|
419
435
|
"markdown-it@<14.1.1": ">=14.1.1",
|
|
420
436
|
"ajv@>=8.0.0 <8.18.0": ">=8.18.0",
|
|
437
|
+
"@xmldom/xmldom@<0.8.12": ">=0.8.12",
|
|
421
438
|
"rollup@>=4.0.0 <4.59.0": ">=4.59.0"
|
|
422
439
|
}
|
|
423
440
|
},
|
|
@@ -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
|
+
continue;
|
|
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}
|