vesper-memory 0.5.3 → 0.6.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 (80) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +16 -12
  3. package/config/sqlite-schema.sql +31 -0
  4. package/dist/cli.js +6 -49
  5. package/dist/cli.js.map +1 -1
  6. package/dist/consolidation/pipeline.d.ts +25 -6
  7. package/dist/consolidation/pipeline.d.ts.map +1 -1
  8. package/dist/consolidation/pipeline.js +310 -67
  9. package/dist/consolidation/pipeline.js.map +1 -1
  10. package/dist/memory-layers/semantic-memory.d.ts +8 -3
  11. package/dist/memory-layers/semantic-memory.d.ts.map +1 -1
  12. package/dist/memory-layers/semantic-memory.js +110 -50
  13. package/dist/memory-layers/semantic-memory.js.map +1 -1
  14. package/dist/memory-layers/skill-library.d.ts +9 -9
  15. package/dist/memory-layers/skill-library.d.ts.map +1 -1
  16. package/dist/memory-layers/skill-library.js +85 -56
  17. package/dist/memory-layers/skill-library.js.map +1 -1
  18. package/dist/memory-layers/working-memory.d.ts +2 -2
  19. package/dist/memory-layers/working-memory.d.ts.map +1 -1
  20. package/dist/memory-layers/working-memory.js +57 -47
  21. package/dist/memory-layers/working-memory.js.map +1 -1
  22. package/dist/retrieval/hybrid-search.d.ts.map +1 -1
  23. package/dist/retrieval/hybrid-search.js +10 -5
  24. package/dist/retrieval/hybrid-search.js.map +1 -1
  25. package/dist/retrieval/index-outbox.d.ts +50 -0
  26. package/dist/retrieval/index-outbox.d.ts.map +1 -0
  27. package/dist/retrieval/index-outbox.js +225 -0
  28. package/dist/retrieval/index-outbox.js.map +1 -0
  29. package/dist/retrieval/memory-retriever.d.ts +123 -0
  30. package/dist/retrieval/memory-retriever.d.ts.map +1 -0
  31. package/dist/retrieval/memory-retriever.js +723 -0
  32. package/dist/retrieval/memory-retriever.js.map +1 -0
  33. package/dist/router/smart-router.js +18 -18
  34. package/dist/server-wrapper.js +0 -0
  35. package/dist/server.d.ts +9 -1
  36. package/dist/server.d.ts.map +1 -1
  37. package/dist/server.js +859 -355
  38. package/dist/server.js.map +1 -1
  39. package/dist/utils/claude-mcp-config.d.ts +3 -0
  40. package/dist/utils/claude-mcp-config.d.ts.map +1 -0
  41. package/dist/utils/claude-mcp-config.js +42 -0
  42. package/dist/utils/claude-mcp-config.js.map +1 -0
  43. package/dist/utils/monitoring.d.ts +1 -0
  44. package/dist/utils/monitoring.d.ts.map +1 -1
  45. package/dist/utils/monitoring.js +1 -0
  46. package/dist/utils/monitoring.js.map +1 -1
  47. package/dist/utils/paths.d.ts +13 -1
  48. package/dist/utils/paths.d.ts.map +1 -1
  49. package/dist/utils/paths.js +24 -0
  50. package/dist/utils/paths.js.map +1 -1
  51. package/dist/utils/validation.d.ts +14 -2
  52. package/dist/utils/validation.d.ts.map +1 -1
  53. package/dist/utils/validation.js +64 -48
  54. package/dist/utils/validation.js.map +1 -1
  55. package/docker-compose.yml +3 -3
  56. package/package.json +7 -4
  57. package/scripts/README.md +1 -1
  58. package/scripts/health-check.sh +8 -4
  59. package/scripts/init-qdrant.ts +42 -60
  60. package/scripts/test-mcp-server.sh +2 -2
  61. package/dist/config/rate-limits.d.ts +0 -76
  62. package/dist/config/rate-limits.d.ts.map +0 -1
  63. package/dist/config/rate-limits.js +0 -161
  64. package/dist/config/rate-limits.js.map +0 -1
  65. package/dist/middleware/auth.d.ts +0 -287
  66. package/dist/middleware/auth.d.ts.map +0 -1
  67. package/dist/middleware/auth.js +0 -610
  68. package/dist/middleware/auth.js.map +0 -1
  69. package/dist/monitoring/health.d.ts +0 -241
  70. package/dist/monitoring/health.d.ts.map +0 -1
  71. package/dist/monitoring/health.js +0 -649
  72. package/dist/monitoring/health.js.map +0 -1
  73. package/dist/monitoring/metrics.d.ts +0 -153
  74. package/dist/monitoring/metrics.d.ts.map +0 -1
  75. package/dist/monitoring/metrics.js +0 -349
  76. package/dist/monitoring/metrics.js.map +0 -1
  77. package/dist/security/rate-limit-middleware.d.ts +0 -119
  78. package/dist/security/rate-limit-middleware.d.ts.map +0 -1
  79. package/dist/security/rate-limit-middleware.js +0 -193
  80. package/dist/security/rate-limit-middleware.js.map +0 -1
@@ -1,153 +0,0 @@
1
- /**
2
- * Prometheus Metrics Collector
3
- *
4
- * Provides comprehensive metrics collection for the Vesper server:
5
- * - Request counters (per tool, per status)
6
- * - Latency histograms (P50, P95, P99)
7
- * - Error rate gauges
8
- * - Active connections gauge
9
- * - Auth success/failure counters
10
- * - Cache hit rate tracking
11
- *
12
- * Performance target: <5ms overhead per metric collection
13
- */
14
- import { Registry } from "prom-client";
15
- /**
16
- * Configuration for the metrics collector
17
- */
18
- export interface MetricsConfig {
19
- /** Prefix for all metric names (default: "mcp") */
20
- prefix?: string;
21
- /** Default labels applied to all metrics */
22
- defaultLabels?: Record<string, string>;
23
- /** Whether to collect default Node.js metrics */
24
- collectDefaultMetrics?: boolean;
25
- /** Whether authentication is required for metrics endpoint */
26
- requireAuth?: boolean;
27
- /** Authentication token for metrics endpoint (when requireAuth is true) */
28
- authToken?: string;
29
- }
30
- /**
31
- * Options for retrieving metrics
32
- */
33
- export interface GetMetricsOptions {
34
- /** Authentication token (required when requireAuth is true) */
35
- authToken?: string;
36
- }
37
- /**
38
- * MetricsCollector class for Prometheus metrics
39
- */
40
- export declare class MetricsCollector {
41
- private registry;
42
- private config;
43
- private requestsTotal;
44
- private errorsTotal;
45
- private authAttemptsTotal;
46
- private rateLimitHitsTotal;
47
- private consolidationFailuresTotal;
48
- private requestDuration;
49
- private dbQueryDuration;
50
- private activeConnections;
51
- private cacheHitRate;
52
- private certExpiryDays;
53
- constructor(config?: MetricsConfig);
54
- /**
55
- * Get the Prometheus registry
56
- */
57
- getRegistry(): Registry;
58
- /**
59
- * Increment request counter
60
- */
61
- incrementRequests(tool: string, status: "success" | "error"): void;
62
- /**
63
- * Increment error counter
64
- */
65
- incrementErrors(type: string): void;
66
- /**
67
- * Increment authentication attempts counter
68
- */
69
- incrementAuthAttempts(status: "success" | "failed"): void;
70
- /**
71
- * Increment rate limit hits counter
72
- */
73
- incrementRateLimitHits(userId: string, operation: string): void;
74
- /**
75
- * Increment consolidation failures counter
76
- */
77
- incrementConsolidationFailures(): void;
78
- /**
79
- * Record request latency
80
- */
81
- recordLatency(tool: string, durationSeconds: number): void;
82
- /**
83
- * Record database query latency
84
- */
85
- recordDbLatency(db: string, operation: string, durationSeconds: number): void;
86
- /**
87
- * Set active connections gauge
88
- */
89
- setActiveConnections(count: number): void;
90
- /**
91
- * Set cache hit rate gauge
92
- */
93
- setCacheHitRate(rate: number): void;
94
- /**
95
- * Set certificate expiry days gauge
96
- */
97
- setCertExpiryDays(days: number): void;
98
- /**
99
- * Get metrics in Prometheus text format
100
- */
101
- getMetricsText(options?: GetMetricsOptions): Promise<string>;
102
- /**
103
- * Get metrics as JSON array
104
- */
105
- getMetricsJson(options?: GetMetricsOptions): Promise<unknown[]>;
106
- /**
107
- * Get current error rate (errors / total requests)
108
- */
109
- getErrorRate(): Promise<number>;
110
- /**
111
- * Get authentication failure count
112
- */
113
- getAuthFailureCount(): Promise<number>;
114
- /**
115
- * Get P95 latency for a specific tool
116
- * Note: This is an approximation based on histogram buckets
117
- */
118
- getP95Latency(tool: string): Promise<number>;
119
- /**
120
- * Reset all metrics (useful for testing)
121
- */
122
- reset(): Promise<void>;
123
- /**
124
- * Validate authentication for metrics access
125
- */
126
- private validateAuth;
127
- }
128
- /**
129
- * Create a new MetricsCollector instance
130
- */
131
- export declare function createMetricsCollector(config?: MetricsConfig): MetricsCollector;
132
- /**
133
- * Get or create the global metrics collector
134
- */
135
- export declare function getGlobalMetrics(config?: MetricsConfig): MetricsCollector;
136
- /**
137
- * Timer helper for measuring operation duration
138
- */
139
- export declare class MetricsTimer {
140
- private startTime;
141
- private collector;
142
- private tool;
143
- constructor(collector: MetricsCollector, tool: string);
144
- /**
145
- * End the timer and record the duration
146
- */
147
- end(status?: "success" | "error"): number;
148
- }
149
- /**
150
- * Create a timer for measuring operation duration
151
- */
152
- export declare function startTimer(collector: MetricsCollector, tool: string): MetricsTimer;
153
- //# sourceMappingURL=metrics.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../src/monitoring/metrics.ts"],"names":[],"mappings":"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"}
@@ -1,349 +0,0 @@
1
- /**
2
- * Prometheus Metrics Collector
3
- *
4
- * Provides comprehensive metrics collection for the Vesper server:
5
- * - Request counters (per tool, per status)
6
- * - Latency histograms (P50, P95, P99)
7
- * - Error rate gauges
8
- * - Active connections gauge
9
- * - Auth success/failure counters
10
- * - Cache hit rate tracking
11
- *
12
- * Performance target: <5ms overhead per metric collection
13
- */
14
- import { Counter, Histogram, Gauge, Registry, collectDefaultMetrics, } from "prom-client";
15
- /**
16
- * MetricsCollector class for Prometheus metrics
17
- */
18
- export class MetricsCollector {
19
- registry;
20
- config;
21
- // Counter metrics
22
- requestsTotal;
23
- errorsTotal;
24
- authAttemptsTotal;
25
- rateLimitHitsTotal;
26
- consolidationFailuresTotal;
27
- // Histogram metrics
28
- requestDuration;
29
- dbQueryDuration;
30
- // Gauge metrics
31
- activeConnections;
32
- cacheHitRate;
33
- certExpiryDays;
34
- constructor(config = {}) {
35
- this.config = {
36
- prefix: config.prefix || "mcp",
37
- defaultLabels: config.defaultLabels || {},
38
- collectDefaultMetrics: config.collectDefaultMetrics ?? false,
39
- requireAuth: config.requireAuth ?? false,
40
- authToken: config.authToken,
41
- };
42
- // Create a new registry for this collector
43
- this.registry = new Registry();
44
- // Set default labels
45
- if (Object.keys(this.config.defaultLabels).length > 0) {
46
- this.registry.setDefaultLabels(this.config.defaultLabels);
47
- }
48
- // Initialize counter metrics
49
- this.requestsTotal = new Counter({
50
- name: `${this.config.prefix}_requests_total`,
51
- help: "Total number of MCP tool requests",
52
- labelNames: ["tool", "status"],
53
- registers: [this.registry],
54
- });
55
- this.errorsTotal = new Counter({
56
- name: `${this.config.prefix}_errors_total`,
57
- help: "Total number of errors by type",
58
- labelNames: ["type"],
59
- registers: [this.registry],
60
- });
61
- this.authAttemptsTotal = new Counter({
62
- name: `${this.config.prefix}_auth_attempts_total`,
63
- help: "Total authentication attempts",
64
- labelNames: ["status"],
65
- registers: [this.registry],
66
- });
67
- this.rateLimitHitsTotal = new Counter({
68
- name: `${this.config.prefix}_rate_limit_hits_total`,
69
- help: "Total rate limit violations",
70
- labelNames: ["user_id", "operation"],
71
- registers: [this.registry],
72
- });
73
- this.consolidationFailuresTotal = new Counter({
74
- name: `${this.config.prefix}_consolidation_failures_total`,
75
- help: "Total consolidation pipeline failures",
76
- registers: [this.registry],
77
- });
78
- // Initialize histogram metrics with appropriate buckets
79
- this.requestDuration = new Histogram({
80
- name: `${this.config.prefix}_request_duration_seconds`,
81
- help: "Request duration in seconds",
82
- labelNames: ["tool"],
83
- // Buckets optimized for <200ms P95 latency target
84
- buckets: [0.01, 0.02, 0.05, 0.1, 0.15, 0.2, 0.3, 0.5, 1, 2, 5],
85
- registers: [this.registry],
86
- });
87
- this.dbQueryDuration = new Histogram({
88
- name: `${this.config.prefix}_db_query_duration_seconds`,
89
- help: "Database query duration in seconds",
90
- labelNames: ["db", "operation"],
91
- buckets: [0.001, 0.002, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5],
92
- registers: [this.registry],
93
- });
94
- // Initialize gauge metrics
95
- this.activeConnections = new Gauge({
96
- name: `${this.config.prefix}_active_connections`,
97
- help: "Number of active connections",
98
- registers: [this.registry],
99
- });
100
- this.cacheHitRate = new Gauge({
101
- name: `${this.config.prefix}_cache_hit_rate`,
102
- help: "Cache hit rate (0.0 to 1.0)",
103
- registers: [this.registry],
104
- });
105
- this.certExpiryDays = new Gauge({
106
- name: `${this.config.prefix}_cert_expiry_days`,
107
- help: "Days until certificate expiration",
108
- registers: [this.registry],
109
- });
110
- // Optionally collect default Node.js metrics
111
- if (this.config.collectDefaultMetrics) {
112
- collectDefaultMetrics({ register: this.registry });
113
- }
114
- }
115
- /**
116
- * Get the Prometheus registry
117
- */
118
- getRegistry() {
119
- return this.registry;
120
- }
121
- /**
122
- * Increment request counter
123
- */
124
- incrementRequests(tool, status) {
125
- this.requestsTotal.inc({ tool, status });
126
- }
127
- /**
128
- * Increment error counter
129
- */
130
- incrementErrors(type) {
131
- this.errorsTotal.inc({ type });
132
- }
133
- /**
134
- * Increment authentication attempts counter
135
- */
136
- incrementAuthAttempts(status) {
137
- this.authAttemptsTotal.inc({ status });
138
- }
139
- /**
140
- * Increment rate limit hits counter
141
- */
142
- incrementRateLimitHits(userId, operation) {
143
- // Sanitize user_id to avoid high cardinality issues
144
- const sanitizedUserId = userId.substring(0, 32);
145
- this.rateLimitHitsTotal.inc({ user_id: sanitizedUserId, operation });
146
- }
147
- /**
148
- * Increment consolidation failures counter
149
- */
150
- incrementConsolidationFailures() {
151
- this.consolidationFailuresTotal.inc();
152
- }
153
- /**
154
- * Record request latency
155
- */
156
- recordLatency(tool, durationSeconds) {
157
- this.requestDuration.observe({ tool }, durationSeconds);
158
- }
159
- /**
160
- * Record database query latency
161
- */
162
- recordDbLatency(db, operation, durationSeconds) {
163
- this.dbQueryDuration.observe({ db, operation }, durationSeconds);
164
- }
165
- /**
166
- * Set active connections gauge
167
- */
168
- setActiveConnections(count) {
169
- this.activeConnections.set(count);
170
- }
171
- /**
172
- * Set cache hit rate gauge
173
- */
174
- setCacheHitRate(rate) {
175
- this.cacheHitRate.set(rate);
176
- }
177
- /**
178
- * Set certificate expiry days gauge
179
- */
180
- setCertExpiryDays(days) {
181
- this.certExpiryDays.set(days);
182
- }
183
- /**
184
- * Get metrics in Prometheus text format
185
- */
186
- async getMetricsText(options = {}) {
187
- this.validateAuth(options.authToken);
188
- return await this.registry.metrics();
189
- }
190
- /**
191
- * Get metrics as JSON array
192
- */
193
- async getMetricsJson(options = {}) {
194
- this.validateAuth(options.authToken);
195
- return await this.registry.getMetricsAsJSON();
196
- }
197
- /**
198
- * Get current error rate (errors / total requests)
199
- */
200
- async getErrorRate() {
201
- const metrics = await this.registry.getMetricsAsJSON();
202
- // Find request metrics
203
- const requestMetric = metrics.find((m) => m.name === `${this.config.prefix}_requests_total`);
204
- if (!requestMetric || !("values" in requestMetric)) {
205
- return 0;
206
- }
207
- const values = requestMetric.values;
208
- let successCount = 0;
209
- let errorCount = 0;
210
- for (const v of values) {
211
- if (v.labels.status === "success") {
212
- successCount += v.value;
213
- }
214
- else if (v.labels.status === "error") {
215
- errorCount += v.value;
216
- }
217
- }
218
- const total = successCount + errorCount;
219
- return total > 0 ? errorCount / total : 0;
220
- }
221
- /**
222
- * Get authentication failure count
223
- */
224
- async getAuthFailureCount() {
225
- const metrics = await this.registry.getMetricsAsJSON();
226
- const authMetric = metrics.find((m) => m.name === `${this.config.prefix}_auth_attempts_total`);
227
- if (!authMetric || !("values" in authMetric)) {
228
- return 0;
229
- }
230
- const values = authMetric.values;
231
- let failureCount = 0;
232
- for (const v of values) {
233
- if (v.labels.status === "failed") {
234
- failureCount += v.value;
235
- }
236
- }
237
- return failureCount;
238
- }
239
- /**
240
- * Get P95 latency for a specific tool
241
- * Note: This is an approximation based on histogram buckets
242
- */
243
- async getP95Latency(tool) {
244
- const metrics = await this.registry.getMetricsAsJSON();
245
- const durationMetric = metrics.find((m) => m.name === `${this.config.prefix}_request_duration_seconds`);
246
- if (!durationMetric || !("values" in durationMetric)) {
247
- return 0;
248
- }
249
- const values = durationMetric.values;
250
- // Filter to this tool's histogram buckets (buckets have 'le' label)
251
- const toolBuckets = values.filter((v) => v.labels.tool === tool && v.labels.le !== undefined);
252
- if (toolBuckets.length === 0) {
253
- return 0;
254
- }
255
- // Get total count from +Inf bucket (contains all observations)
256
- const infBucket = toolBuckets.find((b) => b.labels.le === "+Inf");
257
- const totalCount = infBucket?.value || 0;
258
- if (totalCount === 0) {
259
- return 0;
260
- }
261
- // Find P95 bucket (95th percentile)
262
- const p95Target = totalCount * 0.95;
263
- // Sort buckets by le (upper bound), excluding +Inf
264
- const sortedBuckets = toolBuckets
265
- .filter((b) => b.labels.le !== "+Inf")
266
- .sort((a, b) => parseFloat(a.labels.le) - parseFloat(b.labels.le));
267
- for (const bucket of sortedBuckets) {
268
- if (bucket.value >= p95Target) {
269
- return parseFloat(bucket.labels.le);
270
- }
271
- }
272
- // If no bucket found, return the highest bucket boundary
273
- if (sortedBuckets.length > 0) {
274
- return parseFloat(sortedBuckets[sortedBuckets.length - 1].labels.le);
275
- }
276
- return 0;
277
- }
278
- /**
279
- * Reset all metrics (useful for testing)
280
- */
281
- async reset() {
282
- this.registry.resetMetrics();
283
- }
284
- /**
285
- * Validate authentication for metrics access
286
- */
287
- validateAuth(providedToken) {
288
- if (!this.config.requireAuth) {
289
- return;
290
- }
291
- if (!providedToken) {
292
- throw new Error("Authentication required for metrics endpoint");
293
- }
294
- if (!this.config.authToken) {
295
- throw new Error("Metrics authentication not configured");
296
- }
297
- if (providedToken !== this.config.authToken) {
298
- throw new Error("Invalid authentication token");
299
- }
300
- }
301
- }
302
- /**
303
- * Create a new MetricsCollector instance
304
- */
305
- export function createMetricsCollector(config = {}) {
306
- return new MetricsCollector(config);
307
- }
308
- /**
309
- * Singleton instance for global metrics collection
310
- */
311
- let globalCollector = null;
312
- /**
313
- * Get or create the global metrics collector
314
- */
315
- export function getGlobalMetrics(config) {
316
- if (!globalCollector) {
317
- globalCollector = createMetricsCollector(config);
318
- }
319
- return globalCollector;
320
- }
321
- /**
322
- * Timer helper for measuring operation duration
323
- */
324
- export class MetricsTimer {
325
- startTime;
326
- collector;
327
- tool;
328
- constructor(collector, tool) {
329
- this.collector = collector;
330
- this.tool = tool;
331
- this.startTime = performance.now();
332
- }
333
- /**
334
- * End the timer and record the duration
335
- */
336
- end(status = "success") {
337
- const duration = (performance.now() - this.startTime) / 1000;
338
- this.collector.recordLatency(this.tool, duration);
339
- this.collector.incrementRequests(this.tool, status);
340
- return duration;
341
- }
342
- }
343
- /**
344
- * Create a timer for measuring operation duration
345
- */
346
- export function startTimer(collector, tool) {
347
- return new MetricsTimer(collector, tool);
348
- }
349
- //# sourceMappingURL=metrics.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/monitoring/metrics.ts"],"names":[],"mappings":"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"}
@@ -1,119 +0,0 @@
1
- /**
2
- * Rate Limit Middleware
3
- *
4
- * Integrates rate limiting into the MCP server.
5
- * Implements SEC-HIGH-001 and SEC-HIGH-002 from security audit.
6
- *
7
- * Security Features:
8
- * - Fail-closed behavior when Redis unavailable (SEC-HIGH-002)
9
- * - Tier-based rate limits
10
- * - Standard rate limit headers
11
- * - 429 error responses with Retry-After
12
- */
13
- import { Redis } from "ioredis";
14
- import { RateLimitConfig } from "../utils/rate-limiter.js";
15
- import { TierName } from "../config/rate-limits.js";
16
- /**
17
- * Rate limit headers to include in responses
18
- */
19
- export interface RateLimitHeaders {
20
- "X-RateLimit-Limit": string;
21
- "X-RateLimit-Remaining": string;
22
- "X-RateLimit-Reset": string;
23
- "Retry-After"?: string;
24
- "X-RateLimit-Bypass"?: string;
25
- }
26
- /**
27
- * Result from rate limit check
28
- */
29
- export interface RateLimitCheckResult {
30
- /** Whether the request is allowed */
31
- allowed: boolean;
32
- /** Remaining requests in current window */
33
- remaining: number;
34
- /** Unix timestamp when limit resets */
35
- resetAt: number;
36
- /** Rate limit headers to include in response */
37
- headers: RateLimitHeaders;
38
- }
39
- /**
40
- * Rate limit error for 429 responses
41
- */
42
- export declare class RateLimitError extends Error {
43
- readonly statusCode: number;
44
- readonly retryAfter: number;
45
- constructor(message: string, statusCode: number, retryAfter: number);
46
- }
47
- /**
48
- * Middleware options
49
- */
50
- export interface RateLimitMiddlewareOptions {
51
- /** Whether to allow requests when Redis is unavailable */
52
- failOpen: boolean;
53
- /** Rate limit tier to apply */
54
- tier: TierName;
55
- /** Custom limits that override tier defaults */
56
- customLimits?: Record<string, RateLimitConfig>;
57
- /** Emergency limit for in-memory fallback */
58
- emergencyLimit?: number;
59
- }
60
- /**
61
- * Rate Limit Middleware
62
- *
63
- * Wraps the RateLimiter class and provides:
64
- * - Standard HTTP headers
65
- * - Fail-closed behavior
66
- * - Error handling for 429 responses
67
- */
68
- export declare class RateLimitMiddleware {
69
- private redis;
70
- private rateLimiter;
71
- private options;
72
- private inMemoryLimits;
73
- constructor(redis: Redis, options: RateLimitMiddlewareOptions);
74
- /**
75
- * Build rate limit configuration from options
76
- */
77
- private buildConfig;
78
- /**
79
- * Check rate limit for a request
80
- *
81
- * @param userId - User identifier
82
- * @param operation - MCP tool name
83
- * @returns Rate limit check result
84
- * @throws RateLimitError if rate limited or Redis unavailable (fail-closed)
85
- */
86
- checkRateLimit(userId: string, operation: string): Promise<RateLimitCheckResult>;
87
- /**
88
- * Check rate limit using Redis
89
- */
90
- private checkRateLimitRedis;
91
- /**
92
- * Create bypass result for fail-open mode
93
- */
94
- private createBypassResult;
95
- /**
96
- * Get current configuration
97
- */
98
- getConfig(): Record<string, RateLimitConfig>;
99
- /**
100
- * Update tier
101
- */
102
- setTier(tier: TierName): void;
103
- }
104
- /**
105
- * Factory function to create rate limit middleware
106
- *
107
- * @param redis - Redis client
108
- * @param options - Middleware options
109
- */
110
- export declare function createRateLimitMiddleware(redis: Redis, options: RateLimitMiddlewareOptions): RateLimitMiddleware;
111
- /**
112
- * Format rate limit error for MCP response
113
- */
114
- export declare function formatRateLimitError(error: RateLimitError, operation: string): {
115
- error: string;
116
- retryAfter: number;
117
- operation: string;
118
- };
119
- //# sourceMappingURL=rate-limit-middleware.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rate-limit-middleware.d.ts","sourceRoot":"","sources":["../../src/security/rate-limit-middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAGL,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,QAAQ,EAET,MAAM,0BAA0B,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,uBAAuB,EAAE,MAAM,CAAC;IAChC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,qCAAqC;IACrC,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,OAAO,EAAE,gBAAgB,CAAC;CAC3B;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;IACvC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,UAAU,EAAE,MAAM,CAAC;gBAEvB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;CAWpE;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,0DAA0D;IAC1D,QAAQ,EAAE,OAAO,CAAC;IAClB,+BAA+B;IAC/B,IAAI,EAAE,QAAQ,CAAC;IACf,gDAAgD;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC/C,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,WAAW,CAA4B;IAC/C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,cAAc,CACV;gBAEA,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,0BAA0B;IAe7D;;OAEG;IACH,OAAO,CAAC,WAAW;IAmBnB;;;;;;;OAOG;IACG,cAAc,CAClB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,oBAAoB,CAAC;IA0BhC;;OAEG;YACW,mBAAmB;IA8CjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;OAEG;IACH,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAI5C;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;CAQ9B;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,0BAA0B,GAClC,mBAAmB,CAErB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,cAAc,EACrB,SAAS,EAAE,MAAM,GAChB;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAM1D"}