vesper-memory 0.5.4 → 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.
- package/CHANGELOG.md +22 -0
- package/README.md +6 -6
- package/config/sqlite-schema.sql +31 -0
- package/dist/cli.js +6 -49
- package/dist/cli.js.map +1 -1
- package/dist/consolidation/pipeline.d.ts +25 -6
- package/dist/consolidation/pipeline.d.ts.map +1 -1
- package/dist/consolidation/pipeline.js +310 -67
- package/dist/consolidation/pipeline.js.map +1 -1
- package/dist/memory-layers/semantic-memory.d.ts +8 -3
- package/dist/memory-layers/semantic-memory.d.ts.map +1 -1
- package/dist/memory-layers/semantic-memory.js +110 -50
- package/dist/memory-layers/semantic-memory.js.map +1 -1
- package/dist/memory-layers/skill-library.d.ts +9 -9
- package/dist/memory-layers/skill-library.d.ts.map +1 -1
- package/dist/memory-layers/skill-library.js +85 -56
- package/dist/memory-layers/skill-library.js.map +1 -1
- package/dist/memory-layers/working-memory.d.ts +2 -2
- package/dist/memory-layers/working-memory.d.ts.map +1 -1
- package/dist/memory-layers/working-memory.js +57 -47
- package/dist/memory-layers/working-memory.js.map +1 -1
- package/dist/retrieval/hybrid-search.d.ts.map +1 -1
- package/dist/retrieval/hybrid-search.js +10 -5
- package/dist/retrieval/hybrid-search.js.map +1 -1
- package/dist/retrieval/index-outbox.d.ts +50 -0
- package/dist/retrieval/index-outbox.d.ts.map +1 -0
- package/dist/retrieval/index-outbox.js +225 -0
- package/dist/retrieval/index-outbox.js.map +1 -0
- package/dist/retrieval/memory-retriever.d.ts +123 -0
- package/dist/retrieval/memory-retriever.d.ts.map +1 -0
- package/dist/retrieval/memory-retriever.js +723 -0
- package/dist/retrieval/memory-retriever.js.map +1 -0
- package/dist/router/smart-router.js +18 -18
- package/dist/server-wrapper.js +0 -0
- package/dist/server.d.ts +9 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +859 -355
- package/dist/server.js.map +1 -1
- package/dist/utils/claude-mcp-config.d.ts +3 -0
- package/dist/utils/claude-mcp-config.d.ts.map +1 -0
- package/dist/utils/claude-mcp-config.js +42 -0
- package/dist/utils/claude-mcp-config.js.map +1 -0
- package/dist/utils/monitoring.d.ts +1 -0
- package/dist/utils/monitoring.d.ts.map +1 -1
- package/dist/utils/monitoring.js +1 -0
- package/dist/utils/monitoring.js.map +1 -1
- package/dist/utils/paths.d.ts +13 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +24 -0
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/validation.d.ts +14 -2
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +64 -48
- package/dist/utils/validation.js.map +1 -1
- package/docker-compose.yml +3 -3
- package/package.json +7 -4
- package/scripts/README.md +1 -1
- package/scripts/health-check.sh +8 -4
- package/scripts/init-qdrant.ts +42 -60
- package/scripts/test-mcp-server.sh +2 -2
- package/dist/config/rate-limits.d.ts +0 -76
- package/dist/config/rate-limits.d.ts.map +0 -1
- package/dist/config/rate-limits.js +0 -161
- package/dist/config/rate-limits.js.map +0 -1
- package/dist/middleware/auth.d.ts +0 -287
- package/dist/middleware/auth.d.ts.map +0 -1
- package/dist/middleware/auth.js +0 -610
- package/dist/middleware/auth.js.map +0 -1
- package/dist/monitoring/health.d.ts +0 -241
- package/dist/monitoring/health.d.ts.map +0 -1
- package/dist/monitoring/health.js +0 -649
- package/dist/monitoring/health.js.map +0 -1
- package/dist/monitoring/metrics.d.ts +0 -153
- package/dist/monitoring/metrics.d.ts.map +0 -1
- package/dist/monitoring/metrics.js +0 -349
- package/dist/monitoring/metrics.js.map +0 -1
- package/dist/security/rate-limit-middleware.d.ts +0 -119
- package/dist/security/rate-limit-middleware.d.ts.map +0 -1
- package/dist/security/rate-limit-middleware.js +0 -193
- package/dist/security/rate-limit-middleware.js.map +0 -1
|
@@ -1,193 +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 { createRateLimiter, } from "../utils/rate-limiter.js";
|
|
14
|
-
import { getTierLimits, } from "../config/rate-limits.js";
|
|
15
|
-
/**
|
|
16
|
-
* Rate limit error for 429 responses
|
|
17
|
-
*/
|
|
18
|
-
export class RateLimitError extends Error {
|
|
19
|
-
statusCode;
|
|
20
|
-
retryAfter;
|
|
21
|
-
constructor(message, statusCode, retryAfter) {
|
|
22
|
-
super(message);
|
|
23
|
-
this.name = "RateLimitError";
|
|
24
|
-
this.statusCode = statusCode;
|
|
25
|
-
this.retryAfter = retryAfter;
|
|
26
|
-
// Maintain proper stack trace for where our error was thrown
|
|
27
|
-
if (Error.captureStackTrace) {
|
|
28
|
-
Error.captureStackTrace(this, RateLimitError);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Rate Limit Middleware
|
|
34
|
-
*
|
|
35
|
-
* Wraps the RateLimiter class and provides:
|
|
36
|
-
* - Standard HTTP headers
|
|
37
|
-
* - Fail-closed behavior
|
|
38
|
-
* - Error handling for 429 responses
|
|
39
|
-
*/
|
|
40
|
-
export class RateLimitMiddleware {
|
|
41
|
-
redis;
|
|
42
|
-
rateLimiter = null;
|
|
43
|
-
options;
|
|
44
|
-
inMemoryLimits = new Map();
|
|
45
|
-
constructor(redis, options) {
|
|
46
|
-
this.redis = redis;
|
|
47
|
-
this.options = options;
|
|
48
|
-
// Build rate limit config from tier and custom limits
|
|
49
|
-
const config = this.buildConfig();
|
|
50
|
-
try {
|
|
51
|
-
this.rateLimiter = createRateLimiter(redis, config);
|
|
52
|
-
}
|
|
53
|
-
catch {
|
|
54
|
-
// Redis not available during construction - will handle in checkRateLimit
|
|
55
|
-
this.rateLimiter = null;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Build rate limit configuration from options
|
|
60
|
-
*/
|
|
61
|
-
buildConfig() {
|
|
62
|
-
const tierLimits = getTierLimits(this.options.tier);
|
|
63
|
-
if (!this.options.customLimits) {
|
|
64
|
-
return tierLimits;
|
|
65
|
-
}
|
|
66
|
-
// Merge custom limits with tier defaults
|
|
67
|
-
const merged = { ...tierLimits };
|
|
68
|
-
for (const [operation, customConfig] of Object.entries(this.options.customLimits)) {
|
|
69
|
-
merged[operation] = customConfig;
|
|
70
|
-
}
|
|
71
|
-
return merged;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Check rate limit for a request
|
|
75
|
-
*
|
|
76
|
-
* @param userId - User identifier
|
|
77
|
-
* @param operation - MCP tool name
|
|
78
|
-
* @returns Rate limit check result
|
|
79
|
-
* @throws RateLimitError if rate limited or Redis unavailable (fail-closed)
|
|
80
|
-
*/
|
|
81
|
-
async checkRateLimit(userId, operation) {
|
|
82
|
-
try {
|
|
83
|
-
// Try Redis-based rate limiting
|
|
84
|
-
return await this.checkRateLimitRedis(userId, operation);
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
console.error("[WARN] Rate limiter Redis error:", error instanceof Error ? error.message : String(error));
|
|
88
|
-
if (this.options.failOpen) {
|
|
89
|
-
// FAIL OPEN: Allow request but log warning
|
|
90
|
-
console.warn("[SECURITY] Rate limiting bypassed due to Redis failure");
|
|
91
|
-
return this.createBypassResult();
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
// FAIL CLOSED: Deny request (recommended for security)
|
|
95
|
-
console.error("[SECURITY] Rate limiting enforced - request denied");
|
|
96
|
-
throw new RateLimitError("Service temporarily unavailable. Please try again in a few minutes.", 503, 30);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Check rate limit using Redis
|
|
102
|
-
*/
|
|
103
|
-
async checkRateLimitRedis(userId, operation) {
|
|
104
|
-
// Ensure Redis is connected
|
|
105
|
-
if (this.redis.status !== "ready") {
|
|
106
|
-
// Try to connect
|
|
107
|
-
try {
|
|
108
|
-
await this.redis.connect();
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
throw new Error("Redis connection failed");
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
if (!this.rateLimiter) {
|
|
115
|
-
// Reinitialize rate limiter
|
|
116
|
-
const config = this.buildConfig();
|
|
117
|
-
this.rateLimiter = createRateLimiter(this.redis, config);
|
|
118
|
-
}
|
|
119
|
-
// Check rate limit
|
|
120
|
-
const result = await this.rateLimiter.checkLimit(userId, operation);
|
|
121
|
-
// Calculate reset timestamp (Unix seconds)
|
|
122
|
-
const resetAt = Math.floor(Date.now() / 1000) + result.resetIn;
|
|
123
|
-
// Build headers
|
|
124
|
-
const headers = {
|
|
125
|
-
"X-RateLimit-Limit": String(result.limit),
|
|
126
|
-
"X-RateLimit-Remaining": String(result.remaining),
|
|
127
|
-
"X-RateLimit-Reset": String(resetAt),
|
|
128
|
-
};
|
|
129
|
-
// Add Retry-After header if rate limited
|
|
130
|
-
if (!result.allowed) {
|
|
131
|
-
headers["Retry-After"] = String(result.resetIn);
|
|
132
|
-
}
|
|
133
|
-
return {
|
|
134
|
-
allowed: result.allowed,
|
|
135
|
-
remaining: result.remaining,
|
|
136
|
-
resetAt,
|
|
137
|
-
headers,
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
/**
|
|
141
|
-
* Create bypass result for fail-open mode
|
|
142
|
-
*/
|
|
143
|
-
createBypassResult() {
|
|
144
|
-
return {
|
|
145
|
-
allowed: true,
|
|
146
|
-
remaining: -1,
|
|
147
|
-
resetAt: 0,
|
|
148
|
-
headers: {
|
|
149
|
-
"X-RateLimit-Limit": "-1",
|
|
150
|
-
"X-RateLimit-Remaining": "-1",
|
|
151
|
-
"X-RateLimit-Reset": "0",
|
|
152
|
-
"X-RateLimit-Bypass": "true",
|
|
153
|
-
},
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Get current configuration
|
|
158
|
-
*/
|
|
159
|
-
getConfig() {
|
|
160
|
-
return this.buildConfig();
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Update tier
|
|
164
|
-
*/
|
|
165
|
-
setTier(tier) {
|
|
166
|
-
this.options.tier = tier;
|
|
167
|
-
// Reinitialize rate limiter with new tier
|
|
168
|
-
const config = this.buildConfig();
|
|
169
|
-
if (this.redis.status === "ready") {
|
|
170
|
-
this.rateLimiter = createRateLimiter(this.redis, config);
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Factory function to create rate limit middleware
|
|
176
|
-
*
|
|
177
|
-
* @param redis - Redis client
|
|
178
|
-
* @param options - Middleware options
|
|
179
|
-
*/
|
|
180
|
-
export function createRateLimitMiddleware(redis, options) {
|
|
181
|
-
return new RateLimitMiddleware(redis, options);
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Format rate limit error for MCP response
|
|
185
|
-
*/
|
|
186
|
-
export function formatRateLimitError(error, operation) {
|
|
187
|
-
return {
|
|
188
|
-
error: error.message,
|
|
189
|
-
retryAfter: error.retryAfter,
|
|
190
|
-
operation,
|
|
191
|
-
};
|
|
192
|
-
}
|
|
193
|
-
//# sourceMappingURL=rate-limit-middleware.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limit-middleware.js","sourceRoot":"","sources":["../../src/security/rate-limit-middleware.ts"],"names":[],"mappings":"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"}
|