vesper-memory 0.5.2 → 0.5.3

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 (82) hide show
  1. package/README.md +41 -10
  2. package/config/claude-rules/memory-discipline.md +39 -0
  3. package/config/claude-rules/vesper.md +218 -0
  4. package/dist/cli.js +59 -0
  5. package/dist/cli.js.map +1 -1
  6. package/package.json +1 -2
  7. package/dist/cli 2.js +0 -583
  8. package/dist/cli.d 2.ts +0 -8
  9. package/dist/cli.d.ts 2.map +0 -1
  10. package/dist/cli.js 2.map +0 -1
  11. package/dist/config 2/rate-limits.d.ts +0 -76
  12. package/dist/config 2/rate-limits.d.ts.map +0 -1
  13. package/dist/config 2/rate-limits.js +0 -161
  14. package/dist/config 2/rate-limits.js.map +0 -1
  15. package/dist/consolidation 2/pipeline.d.ts +0 -52
  16. package/dist/consolidation 2/pipeline.d.ts.map +0 -1
  17. package/dist/consolidation 2/pipeline.js +0 -193
  18. package/dist/consolidation 2/pipeline.js.map +0 -1
  19. package/dist/embeddings 2/client.d.ts +0 -94
  20. package/dist/embeddings 2/client.d.ts.map +0 -1
  21. package/dist/embeddings 2/client.js +0 -144
  22. package/dist/embeddings 2/client.js.map +0 -1
  23. package/dist/memory-layers 2/semantic-memory.d.ts +0 -33
  24. package/dist/memory-layers 2/semantic-memory.d.ts.map +0 -1
  25. package/dist/memory-layers 2/semantic-memory.js +0 -114
  26. package/dist/memory-layers 2/semantic-memory.js.map +0 -1
  27. package/dist/memory-layers 2/skill-library.d.ts +0 -25
  28. package/dist/memory-layers 2/skill-library.d.ts.map +0 -1
  29. package/dist/memory-layers 2/skill-library.js +0 -54
  30. package/dist/memory-layers 2/skill-library.js.map +0 -1
  31. package/dist/memory-layers 2/working-memory.d.ts +0 -57
  32. package/dist/memory-layers 2/working-memory.d.ts.map +0 -1
  33. package/dist/memory-layers 2/working-memory.js +0 -153
  34. package/dist/memory-layers 2/working-memory.js.map +0 -1
  35. package/dist/middleware 2/auth.d.ts +0 -287
  36. package/dist/middleware 2/auth.d.ts.map +0 -1
  37. package/dist/middleware 2/auth.js +0 -610
  38. package/dist/middleware 2/auth.js.map +0 -1
  39. package/dist/monitoring 2/health.d.ts +0 -241
  40. package/dist/monitoring 2/health.d.ts.map +0 -1
  41. package/dist/monitoring 2/health.js +0 -649
  42. package/dist/monitoring 2/health.js.map +0 -1
  43. package/dist/monitoring 2/metrics.d.ts +0 -153
  44. package/dist/monitoring 2/metrics.d.ts.map +0 -1
  45. package/dist/monitoring 2/metrics.js +0 -349
  46. package/dist/monitoring 2/metrics.js.map +0 -1
  47. package/dist/retrieval 2/hybrid-search.d.ts +0 -186
  48. package/dist/retrieval 2/hybrid-search.d.ts.map +0 -1
  49. package/dist/retrieval 2/hybrid-search.js +0 -327
  50. package/dist/retrieval 2/hybrid-search.js.map +0 -1
  51. package/dist/router 2/smart-router.d.ts +0 -111
  52. package/dist/router 2/smart-router.d.ts.map +0 -1
  53. package/dist/router 2/smart-router.js +0 -383
  54. package/dist/router 2/smart-router.js.map +0 -1
  55. package/dist/security 2/rate-limit-middleware.d.ts +0 -119
  56. package/dist/security 2/rate-limit-middleware.d.ts.map +0 -1
  57. package/dist/security 2/rate-limit-middleware.js +0 -193
  58. package/dist/security 2/rate-limit-middleware.js.map +0 -1
  59. package/dist/server 2.js +0 -861
  60. package/dist/server-wrapper 2.js +0 -170
  61. package/dist/server-wrapper.d 2.ts +0 -12
  62. package/dist/server-wrapper.d.ts 2.map +0 -1
  63. package/dist/server-wrapper.js 2.map +0 -1
  64. package/dist/server.d 2.ts +0 -14
  65. package/dist/server.d.ts 2.map +0 -1
  66. package/dist/server.js 2.map +0 -1
  67. package/dist/synthesis 2/conflict-detector.d.ts +0 -43
  68. package/dist/synthesis 2/conflict-detector.d.ts.map +0 -1
  69. package/dist/synthesis 2/conflict-detector.js +0 -125
  70. package/dist/synthesis 2/conflict-detector.js.map +0 -1
  71. package/dist/utils 2/monitoring.d.ts +0 -25
  72. package/dist/utils 2/monitoring.d.ts.map +0 -1
  73. package/dist/utils 2/monitoring.js +0 -41
  74. package/dist/utils 2/monitoring.js.map +0 -1
  75. package/dist/utils 2/rate-limiter.d.ts +0 -97
  76. package/dist/utils 2/rate-limiter.d.ts.map +0 -1
  77. package/dist/utils 2/rate-limiter.js +0 -166
  78. package/dist/utils 2/rate-limiter.js.map +0 -1
  79. package/dist/utils 2/validation.d.ts +0 -139
  80. package/dist/utils 2/validation.d.ts.map +0 -1
  81. package/dist/utils 2/validation.js +0 -195
  82. package/dist/utils 2/validation.js.map +0 -1
@@ -1,287 +0,0 @@
1
- /**
2
- * MCP Authentication Middleware
3
- *
4
- * Implements API key authentication for MCP tools with:
5
- * - Bearer token authentication
6
- * - bcrypt password hashing
7
- * - Key expiration
8
- * - IP allowlisting
9
- * - Scope-based authorization
10
- * - Audit logging
11
- *
12
- * Security Features:
13
- * - Constant-time comparison via bcrypt
14
- * - No plaintext key storage
15
- * - Gradual rollout support (AUTH_ENABLED env var)
16
- * - Rate limit tier enforcement
17
- */
18
- /** API key format prefix */
19
- export declare const API_KEY_PREFIX = "mem_v1_";
20
- /** Number of random bytes for key generation (30 bytes = 40 chars base64url) */
21
- export declare const API_KEY_BYTES = 30;
22
- /** bcrypt work factor (12 = ~250ms on modern hardware) */
23
- export declare const BCRYPT_ROUNDS = 12;
24
- /** Default key expiration in days */
25
- export declare const DEFAULT_KEY_EXPIRATION_DAYS = 90;
26
- /** Maximum allowed key expiration in days */
27
- export declare const MAX_KEY_EXPIRATION_DAYS = 365;
28
- /** Maximum grace period for key rotation in hours */
29
- export declare const MAX_GRACE_PERIOD_HOURS = 168;
30
- /** Valid scopes for API keys */
31
- export declare const VALID_SCOPES: readonly ["store_memory", "retrieve_memory", "list_recent", "get_stats", "*"];
32
- export type ValidScope = (typeof VALID_SCOPES)[number];
33
- /** Result of API key generation */
34
- export interface GeneratedApiKey {
35
- fullKey: string;
36
- keyPrefix: string;
37
- keyHash: string;
38
- }
39
- /** API key record from database */
40
- export interface ApiKeyRecord {
41
- id: string;
42
- userId: string;
43
- keyHash: string;
44
- scopes: string[];
45
- tier: string;
46
- expiresAt: Date | null;
47
- ipAllowlist: string[] | null;
48
- revokedAt: Date | null;
49
- lastUsedAt: Date | null;
50
- }
51
- /** Authentication result */
52
- export interface AuthResult {
53
- authenticated: boolean;
54
- userId: string;
55
- keyId: string;
56
- tier: string;
57
- scopes: string[];
58
- }
59
- /** Audit log actions */
60
- export declare enum AuditAction {
61
- AUTHENTICATE = "authenticate",
62
- RATE_LIMITED = "rate_limited",
63
- REVOKED = "revoked",
64
- ROTATED = "rotated",
65
- CREATED = "created",
66
- SCOPE_DENIED = "scope_denied",
67
- IP_DENIED = "ip_denied",
68
- EXPIRED = "expired"
69
- }
70
- /** Audit log entry */
71
- export interface AuditEntry {
72
- apiKeyId: string | null;
73
- action: AuditAction;
74
- success: boolean;
75
- ipAddress: string | null;
76
- userAgent?: string;
77
- requestPath?: string;
78
- failureReason?: string;
79
- metadata?: Record<string, unknown>;
80
- createdAt: Date;
81
- }
82
- /** Key rotation result */
83
- export interface RotationResult {
84
- newKey: GeneratedApiKey;
85
- gracePeriodHours: number;
86
- oldKeyValidUntil: Date;
87
- }
88
- /** Request context for authentication */
89
- export interface AuthRequest {
90
- apiKey: string | undefined;
91
- ip: string;
92
- toolName: string;
93
- userAgent?: string;
94
- }
95
- /** Database interface for auth operations */
96
- export interface AuthDatabase {
97
- getApiKey(prefix: string): Promise<ApiKeyRecord | null>;
98
- updateLastUsed(keyId: string): Promise<void>;
99
- createAuditEntry(entry: AuditEntry): Promise<void>;
100
- }
101
- /** Rate limits per tier */
102
- export interface TierRateLimits {
103
- store_memory: number;
104
- retrieve_memory: number;
105
- list_recent: number;
106
- get_stats: number;
107
- }
108
- /**
109
- * Generate a new API key with cryptographically secure random bytes
110
- *
111
- * @returns Generated key with full key, prefix, and hash
112
- */
113
- export declare function generateApiKey(): Promise<GeneratedApiKey>;
114
- /**
115
- * Verify an API key against its stored hash
116
- *
117
- * Uses bcrypt.compare for constant-time comparison
118
- *
119
- * @param providedKey - The API key provided by the client
120
- * @param storedHash - The bcrypt hash stored in the database
121
- * @returns true if key is valid
122
- */
123
- export declare function verifyApiKey(providedKey: string, storedHash: string): Promise<boolean>;
124
- /**
125
- * Validate API key format without database lookup
126
- *
127
- * @param key - API key to validate
128
- * @returns true if format is valid
129
- */
130
- export declare function validateApiKeyFormat(key: string): boolean;
131
- /**
132
- * Extract the prefix from an API key for database lookup
133
- *
134
- * @param key - Full API key
135
- * @returns 8-character prefix or null if invalid
136
- */
137
- export declare function extractKeyPrefix(key: string): string | null;
138
- /**
139
- * Check if an API key is expired
140
- *
141
- * @param expiresAt - Expiration date (null means never expires)
142
- * @returns true if key is expired
143
- */
144
- export declare function isKeyExpired(expiresAt: Date | null): boolean;
145
- /**
146
- * Calculate default expiration date (90 days from now)
147
- *
148
- * @returns Expiration date
149
- */
150
- export declare function calculateDefaultExpiration(): Date;
151
- /**
152
- * Calculate expiration date with custom days (capped at max)
153
- *
154
- * @param days - Number of days until expiration
155
- * @returns Expiration date
156
- */
157
- export declare function calculateExpiration(days: number): Date;
158
- /**
159
- * Get expiration days from environment or default
160
- *
161
- * @returns Number of days for key expiration
162
- */
163
- export declare function getExpirationDays(): number;
164
- /**
165
- * Check if an IP address is in the allowlist
166
- *
167
- * Supports both individual IPs and CIDR notation
168
- *
169
- * @param ip - Client IP address
170
- * @param allowlist - Array of allowed IPs/CIDRs (empty or null allows all)
171
- * @returns true if IP is allowed
172
- */
173
- export declare function isIpAllowed(ip: string, allowlist: string[] | null | undefined): boolean;
174
- /**
175
- * Check if user has required scope
176
- *
177
- * @param userScopes - Scopes granted to user
178
- * @param requiredScope - Scope required for operation
179
- * @returns true if user has scope
180
- */
181
- export declare function hasScope(userScopes: string[] | null | undefined, requiredScope: string): boolean;
182
- /**
183
- * Rotate an API key with optional grace period
184
- *
185
- * @param oldKeyHash - Hash of the old key (unused, for signature compatibility)
186
- * @param gracePeriodHours - Hours to allow old key (0 = immediate revocation)
187
- * @returns New key and grace period info
188
- */
189
- export declare function rotateApiKey(_oldKeyHash: string, gracePeriodHours: number): Promise<RotationResult>;
190
- /**
191
- * Create an audit log entry
192
- *
193
- * @param params - Audit entry parameters
194
- * @returns Audit entry object
195
- */
196
- export declare function createAuditEntry(params: {
197
- apiKeyId: string | null;
198
- action: AuditAction;
199
- success: boolean;
200
- ipAddress: string | null;
201
- userAgent?: string;
202
- requestPath?: string;
203
- failureReason?: string;
204
- metadata?: Record<string, unknown>;
205
- }): AuditEntry;
206
- /**
207
- * Hash an API key for audit logging (never log full key)
208
- *
209
- * @param key - Full API key
210
- * @returns Truncated SHA-256 hash for identification
211
- */
212
- export declare function hashForAudit(key: string): string;
213
- /**
214
- * Authenticate an MCP request
215
- *
216
- * @param request - Request context
217
- * @param db - Database interface
218
- * @returns Authentication result
219
- * @throws Error if authentication fails
220
- */
221
- export declare function authenticateRequest(request: AuthRequest, db: AuthDatabase): Promise<AuthResult>;
222
- /**
223
- * Check if authentication is enabled
224
- *
225
- * @returns true if AUTH_ENABLED=true
226
- */
227
- export declare function isAuthEnabled(): boolean;
228
- /**
229
- * Get rate limits for a tier
230
- *
231
- * @param tier - Rate limit tier
232
- * @returns Rate limits for the tier
233
- */
234
- export declare function getRateLimitsForTier(tier: string): TierRateLimits;
235
- /**
236
- * Create an in-memory cache for auth results
237
- *
238
- * @param options - Cache configuration
239
- * @returns Cache object with get/set methods
240
- */
241
- export declare function createAuthCache(options: {
242
- maxSize: number;
243
- ttlSeconds: number;
244
- }): {
245
- get(keyId: string): {
246
- userId: string;
247
- tier: string;
248
- } | null;
249
- set(keyId: string, value: {
250
- userId: string;
251
- tier: string;
252
- }): void;
253
- /**
254
- * Invalidate a specific key from the cache
255
- * HIGH-002: Used to immediately invalidate revoked/rotated keys
256
- *
257
- * @param keyId - The key ID (prefix) to invalidate
258
- * @returns true if key was in cache, false otherwise
259
- */
260
- invalidate(keyId: string): boolean;
261
- clear(): void;
262
- size(): number;
263
- };
264
- /**
265
- * Type for cache invalidation callback
266
- */
267
- export type AuthCache = ReturnType<typeof createAuthCache>;
268
- /**
269
- * Revoke an API key and invalidate it from cache
270
- * HIGH-002: Ensures revoked keys cannot be used even if cached
271
- *
272
- * @param keyPrefix - The key prefix to revoke
273
- * @param cache - The auth cache instance
274
- * @param reason - Reason for revocation (for audit logging)
275
- * @returns true if key was invalidated from cache
276
- */
277
- export declare function revokeApiKey(keyPrefix: string, cache: AuthCache, reason?: string): boolean;
278
- /**
279
- * Invalidate a rotated API key from cache
280
- * HIGH-002: Ensures old keys cannot be used during rotation
281
- *
282
- * @param oldKeyPrefix - The old key prefix being rotated
283
- * @param cache - The auth cache instance
284
- * @returns true if old key was invalidated from cache
285
- */
286
- export declare function invalidateRotatedKey(oldKeyPrefix: string, cache: AuthCache): boolean;
287
- //# sourceMappingURL=auth.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"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"}