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.
- package/CHANGELOG.md +22 -0
- package/README.md +16 -12
- 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
package/dist/utils/validation.js
CHANGED
|
@@ -11,8 +11,8 @@
|
|
|
11
11
|
* - Vector value validation (NaN/Infinity prevention)
|
|
12
12
|
* - Collection name sanitization (injection prevention)
|
|
13
13
|
*/
|
|
14
|
-
import { z } from
|
|
15
|
-
import { McpError, ErrorCode } from
|
|
14
|
+
import { z } from "zod";
|
|
15
|
+
import { McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
|
|
16
16
|
// ============================================================================
|
|
17
17
|
// Reusable Schemas
|
|
18
18
|
// ============================================================================
|
|
@@ -22,7 +22,8 @@ import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
|
|
|
22
22
|
* Alphanumeric with hyphens/underscores, defaults to "default".
|
|
23
23
|
* Used across all tools to scope memory operations.
|
|
24
24
|
*/
|
|
25
|
-
export const NamespaceSchema = z
|
|
25
|
+
export const NamespaceSchema = z
|
|
26
|
+
.string()
|
|
26
27
|
.regex(/^[a-zA-Z][a-zA-Z0-9_-]*$/, "Namespace must start with a letter and contain only alphanumeric characters, underscores, or hyphens")
|
|
27
28
|
.min(1, "Namespace cannot be empty")
|
|
28
29
|
.max(100, "Namespace cannot exceed 100 characters")
|
|
@@ -31,12 +32,16 @@ export const NamespaceSchema = z.string()
|
|
|
31
32
|
* Memory type enum including decision type for v0.5.0
|
|
32
33
|
*/
|
|
33
34
|
export const MemoryTypeEnum = z.enum(["episodic", "semantic", "procedural", "decision"], {
|
|
34
|
-
message: "Invalid memory type. Must be episodic, semantic, procedural, or decision"
|
|
35
|
+
message: "Invalid memory type. Must be episodic, semantic, procedural, or decision",
|
|
35
36
|
});
|
|
36
37
|
/**
|
|
37
38
|
* Memory type enum for filtering (retrieve/list operations)
|
|
38
39
|
*/
|
|
39
40
|
export const MemoryTypeFilterEnum = z.enum(["episodic", "semantic", "procedural", "decision"]);
|
|
41
|
+
export const TimestampInputSchema = z.union([
|
|
42
|
+
z.number().int().nonnegative(),
|
|
43
|
+
z.string().datetime({ offset: true }),
|
|
44
|
+
]);
|
|
40
45
|
// ============================================================================
|
|
41
46
|
// MCP Tool Input Schemas
|
|
42
47
|
// ============================================================================
|
|
@@ -51,11 +56,10 @@ export const MemoryTypeFilterEnum = z.enum(["episodic", "semantic", "procedural"
|
|
|
51
56
|
* - Agent attribution fields (agent_id, agent_role, task_id)
|
|
52
57
|
*/
|
|
53
58
|
export const StoreMemoryInputSchema = z.object({
|
|
54
|
-
content: z.string()
|
|
55
|
-
.min(1, "Content cannot be empty")
|
|
56
|
-
.max(100000, "Content exceeds 100KB limit"),
|
|
59
|
+
content: z.string().min(1, "Content cannot be empty").max(100000, "Content exceeds 100KB limit"),
|
|
57
60
|
memory_type: MemoryTypeEnum,
|
|
58
|
-
metadata: z
|
|
61
|
+
metadata: z
|
|
62
|
+
.record(z.string(), z.unknown())
|
|
59
63
|
.optional()
|
|
60
64
|
.refine((val) => !val || Object.keys(val).length <= 50, "Metadata cannot exceed 50 keys")
|
|
61
65
|
.refine((val) => !val || JSON.stringify(val).length <= 10000, "Metadata size exceeds 10KB limit"),
|
|
@@ -63,6 +67,10 @@ export const StoreMemoryInputSchema = z.object({
|
|
|
63
67
|
agent_id: z.string().max(255).optional(),
|
|
64
68
|
agent_role: z.string().max(255).optional(),
|
|
65
69
|
task_id: z.string().max(255).optional(),
|
|
70
|
+
importance: z.number().min(0).max(1).optional().default(0.5),
|
|
71
|
+
valid_from: TimestampInputSchema.optional(),
|
|
72
|
+
valid_until: TimestampInputSchema.optional(),
|
|
73
|
+
expired_at: TimestampInputSchema.optional(),
|
|
66
74
|
});
|
|
67
75
|
/**
|
|
68
76
|
* Schema for retrieve_memory tool input
|
|
@@ -75,30 +83,34 @@ export const StoreMemoryInputSchema = z.object({
|
|
|
75
83
|
* - Agent/task filtering
|
|
76
84
|
*/
|
|
77
85
|
export const RetrieveMemoryInputSchema = z.object({
|
|
78
|
-
query: z.string()
|
|
79
|
-
|
|
80
|
-
.
|
|
81
|
-
memory_types: z.array(MemoryTypeFilterEnum)
|
|
86
|
+
query: z.string().min(1, "Query cannot be empty").max(10000, "Query exceeds 10KB limit"),
|
|
87
|
+
memory_types: z
|
|
88
|
+
.array(MemoryTypeFilterEnum)
|
|
82
89
|
.max(10, "Cannot filter by more than 10 memory types")
|
|
83
90
|
.optional(),
|
|
84
|
-
max_results: z
|
|
91
|
+
max_results: z
|
|
92
|
+
.number()
|
|
85
93
|
.int("max_results must be an integer")
|
|
86
94
|
.min(1, "max_results must be at least 1")
|
|
87
95
|
.max(100, "max_results cannot exceed 100")
|
|
88
96
|
.optional()
|
|
89
97
|
.default(5),
|
|
90
|
-
routing_strategy: z.enum(["fast_path", "semantic", "full_text", "graph"])
|
|
91
|
-
.optional(),
|
|
98
|
+
routing_strategy: z.enum(["fast_path", "semantic", "full_text", "hybrid", "graph"]).optional(),
|
|
92
99
|
namespace: NamespaceSchema.optional().default("default"),
|
|
93
100
|
agent_id: z.string().max(255).optional(),
|
|
94
101
|
task_id: z.string().max(255).optional(),
|
|
95
102
|
exclude_agent: z.string().max(255).optional(),
|
|
103
|
+
include_superseded: z.boolean().optional().default(false),
|
|
104
|
+
include_archived: z.boolean().optional().default(false),
|
|
105
|
+
as_of: TimestampInputSchema.optional(),
|
|
106
|
+
explain: z.boolean().optional().default(false),
|
|
96
107
|
});
|
|
97
108
|
/**
|
|
98
109
|
* Schema for list_recent tool input
|
|
99
110
|
*/
|
|
100
111
|
export const ListRecentInputSchema = z.object({
|
|
101
|
-
limit: z
|
|
112
|
+
limit: z
|
|
113
|
+
.number()
|
|
102
114
|
.int("limit must be an integer")
|
|
103
115
|
.min(1, "limit must be at least 1")
|
|
104
116
|
.max(100, "limit cannot exceed 100")
|
|
@@ -111,9 +123,7 @@ export const ListRecentInputSchema = z.object({
|
|
|
111
123
|
* Schema for get_stats tool input
|
|
112
124
|
*/
|
|
113
125
|
export const GetStatsInputSchema = z.object({
|
|
114
|
-
detailed: z.boolean()
|
|
115
|
-
.optional()
|
|
116
|
-
.default(false),
|
|
126
|
+
detailed: z.boolean().optional().default(false),
|
|
117
127
|
namespace: NamespaceSchema.optional().default("default"),
|
|
118
128
|
});
|
|
119
129
|
/**
|
|
@@ -127,26 +137,28 @@ export const GetStatsInputSchema = z.object({
|
|
|
127
137
|
* - outcome must be 'success' or 'failure'
|
|
128
138
|
* - satisfaction is required for success (0-1 range)
|
|
129
139
|
*/
|
|
130
|
-
export const RecordSkillOutcomeInputSchema = z
|
|
131
|
-
|
|
132
|
-
|
|
140
|
+
export const RecordSkillOutcomeInputSchema = z
|
|
141
|
+
.object({
|
|
142
|
+
skill_id: z.string().min(1, "skill_id cannot be empty"),
|
|
133
143
|
outcome: z.enum(["success", "failure"], {
|
|
134
|
-
message: "outcome must be 'success' or 'failure'"
|
|
144
|
+
message: "outcome must be 'success' or 'failure'",
|
|
135
145
|
}),
|
|
136
|
-
satisfaction: z
|
|
146
|
+
satisfaction: z
|
|
147
|
+
.number()
|
|
137
148
|
.min(0, "satisfaction must be at least 0")
|
|
138
149
|
.max(1, "satisfaction cannot exceed 1")
|
|
139
150
|
.optional(),
|
|
140
151
|
namespace: NamespaceSchema.optional().default("default"),
|
|
141
|
-
})
|
|
152
|
+
})
|
|
153
|
+
.refine((data) => {
|
|
142
154
|
// satisfaction is required for success outcome
|
|
143
|
-
if (data.outcome ===
|
|
155
|
+
if (data.outcome === "success" && data.satisfaction === undefined) {
|
|
144
156
|
return false;
|
|
145
157
|
}
|
|
146
158
|
return true;
|
|
147
159
|
}, {
|
|
148
160
|
message: "satisfaction is required when outcome is 'success'",
|
|
149
|
-
path: ["satisfaction"]
|
|
161
|
+
path: ["satisfaction"],
|
|
150
162
|
});
|
|
151
163
|
/**
|
|
152
164
|
* Schema for load_skill tool input
|
|
@@ -159,7 +171,8 @@ export const RecordSkillOutcomeInputSchema = z.object({
|
|
|
159
171
|
* - skill_id must match expected format (skill_*)
|
|
160
172
|
*/
|
|
161
173
|
export const LoadSkillInputSchema = z.object({
|
|
162
|
-
skill_id: z
|
|
174
|
+
skill_id: z
|
|
175
|
+
.string()
|
|
163
176
|
.min(1, "skill_id cannot be empty")
|
|
164
177
|
.max(255, "skill_id cannot exceed 255 characters")
|
|
165
178
|
.regex(/^skill_[a-z0-9_]+$/i, "Invalid skill_id format (must be skill_*)"),
|
|
@@ -173,7 +186,8 @@ export const LoadSkillInputSchema = z.object({
|
|
|
173
186
|
* - Namespace for multi-agent isolation
|
|
174
187
|
*/
|
|
175
188
|
export const DeleteMemoryInputSchema = z.object({
|
|
176
|
-
memory_id: z
|
|
189
|
+
memory_id: z
|
|
190
|
+
.string()
|
|
177
191
|
.min(1, "memory_id cannot be empty")
|
|
178
192
|
.max(255, "memory_id cannot exceed 255 characters"),
|
|
179
193
|
namespace: NamespaceSchema.optional().default("default"),
|
|
@@ -191,35 +205,32 @@ export const ShareContextInputSchema = z.object({
|
|
|
191
205
|
source_namespace: NamespaceSchema,
|
|
192
206
|
target_namespace: NamespaceSchema,
|
|
193
207
|
task_id: z.string().max(255).optional(),
|
|
194
|
-
query: z
|
|
208
|
+
query: z
|
|
209
|
+
.string()
|
|
195
210
|
.min(1, "Query cannot be empty")
|
|
196
211
|
.max(10000, "Query exceeds 10KB limit")
|
|
197
212
|
.optional(),
|
|
198
|
-
max_items: z.number()
|
|
199
|
-
.int()
|
|
200
|
-
.min(1)
|
|
201
|
-
.max(50)
|
|
202
|
-
.optional()
|
|
203
|
-
.default(10),
|
|
213
|
+
max_items: z.number().int().min(1).max(50).optional().default(10),
|
|
204
214
|
include_skills: z.boolean().optional().default(false),
|
|
205
215
|
include_entities: z.boolean().optional().default(true),
|
|
206
216
|
});
|
|
207
217
|
/**
|
|
208
218
|
* Schema for store_decision tool input
|
|
209
219
|
*
|
|
210
|
-
* Stores a decision with reduced decay
|
|
220
|
+
* Stores a decision with reduced decay and explicit validity/supersession.
|
|
211
221
|
* Decisions are stored as memory_type='decision' with decay_factor: 0.25.
|
|
212
222
|
*/
|
|
213
223
|
export const StoreDecisionInputSchema = z.object({
|
|
214
|
-
content: z.string()
|
|
215
|
-
.min(1, "Content cannot be empty")
|
|
216
|
-
.max(100000, "Content exceeds 100KB limit"),
|
|
224
|
+
content: z.string().min(1, "Content cannot be empty").max(100000, "Content exceeds 100KB limit"),
|
|
217
225
|
namespace: NamespaceSchema.optional().default("default"),
|
|
218
226
|
agent_id: z.string().max(255).optional(),
|
|
219
227
|
agent_role: z.string().max(255).optional(),
|
|
220
228
|
task_id: z.string().max(255).optional(),
|
|
221
229
|
supersedes: z.string().max(255).optional(),
|
|
222
|
-
|
|
230
|
+
valid_from: TimestampInputSchema.optional(),
|
|
231
|
+
valid_until: TimestampInputSchema.optional(),
|
|
232
|
+
metadata: z
|
|
233
|
+
.record(z.string(), z.unknown())
|
|
223
234
|
.optional()
|
|
224
235
|
.refine((val) => !val || Object.keys(val).length <= 50, "Metadata cannot exceed 50 keys"),
|
|
225
236
|
});
|
|
@@ -244,8 +255,11 @@ export const NamespaceStatsInputSchema = z.object({
|
|
|
244
255
|
*
|
|
245
256
|
* Security: SEC-005 fix
|
|
246
257
|
*/
|
|
247
|
-
export const VectorSchema = z
|
|
248
|
-
.
|
|
258
|
+
export const VectorSchema = z
|
|
259
|
+
.array(z.number())
|
|
260
|
+
.refine((arr) => arr.every((v) => Number.isFinite(v)), {
|
|
261
|
+
message: "Vector contains NaN or Infinity values",
|
|
262
|
+
});
|
|
249
263
|
/**
|
|
250
264
|
* Collection name validation schema
|
|
251
265
|
*
|
|
@@ -254,14 +268,16 @@ export const VectorSchema = z.array(z.number())
|
|
|
254
268
|
*
|
|
255
269
|
* Security: SEC-012 fix
|
|
256
270
|
*/
|
|
257
|
-
export const CollectionNameSchema = z
|
|
271
|
+
export const CollectionNameSchema = z
|
|
272
|
+
.string()
|
|
258
273
|
.min(1, "Collection name cannot be empty")
|
|
259
274
|
.max(255, "Collection name cannot exceed 255 characters")
|
|
260
275
|
.regex(/^[a-zA-Z][a-zA-Z0-9_-]*$/, "Collection name must start with a letter and contain only alphanumeric characters, underscores, or hyphens");
|
|
261
276
|
/**
|
|
262
277
|
* User ID schema (for rate limiting)
|
|
263
278
|
*/
|
|
264
|
-
export const UserIdSchema = z
|
|
279
|
+
export const UserIdSchema = z
|
|
280
|
+
.string()
|
|
265
281
|
.min(1, "User ID cannot be empty")
|
|
266
282
|
.max(255, "User ID cannot exceed 255 characters")
|
|
267
283
|
.regex(/^[a-zA-Z0-9_-]+$/, "User ID must be alphanumeric with underscores or hyphens only");
|
|
@@ -279,7 +295,7 @@ export const UserIdSchema = z.string()
|
|
|
279
295
|
export function validateInput(schema, input) {
|
|
280
296
|
const result = schema.safeParse(input);
|
|
281
297
|
if (!result.success) {
|
|
282
|
-
const errors = result.error.issues.map(e => `${e.path.join(
|
|
298
|
+
const errors = result.error.issues.map((e) => `${e.path.join(".")}: ${e.message}`).join(", ");
|
|
283
299
|
throw new McpError(ErrorCode.InvalidParams, `Validation failed: ${errors}`);
|
|
284
300
|
}
|
|
285
301
|
return result.data;
|
|
@@ -298,7 +314,7 @@ export function validateVector(vector, expectedSize) {
|
|
|
298
314
|
throw new Error(`Vector dimension mismatch: expected ${expectedSize}, got ${vector.length}`);
|
|
299
315
|
}
|
|
300
316
|
// Value validation (NaN/Infinity check)
|
|
301
|
-
if (!vector.every(v => Number.isFinite(v))) {
|
|
317
|
+
if (!vector.every((v) => Number.isFinite(v))) {
|
|
302
318
|
throw new Error("Vector contains invalid values (NaN or Infinity)");
|
|
303
319
|
}
|
|
304
320
|
}
|
|
@@ -325,7 +341,7 @@ export function sanitizeCollectionName(name) {
|
|
|
325
341
|
*/
|
|
326
342
|
export function sanitizeString(input) {
|
|
327
343
|
// Remove null bytes
|
|
328
|
-
let sanitized = input.replace(/\0/g,
|
|
344
|
+
let sanitized = input.replace(/\0/g, "");
|
|
329
345
|
// Trim whitespace
|
|
330
346
|
sanitized = sanitized.trim();
|
|
331
347
|
return sanitized;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAEzE,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|
package/docker-compose.yml
CHANGED
|
@@ -4,7 +4,7 @@ services:
|
|
|
4
4
|
image: qdrant/qdrant:v1.7.4
|
|
5
5
|
container_name: ${VESPER_PREFIX:-vesper}-qdrant
|
|
6
6
|
ports:
|
|
7
|
-
- "
|
|
7
|
+
- "127.0.0.1:${QDRANT_PORT:-6333}:6333"
|
|
8
8
|
volumes:
|
|
9
9
|
- ${VESPER_HOME:-~/.vesper}/docker-data/qdrant:/qdrant/storage
|
|
10
10
|
restart: unless-stopped
|
|
@@ -22,7 +22,7 @@ services:
|
|
|
22
22
|
image: redis:7-alpine
|
|
23
23
|
container_name: ${VESPER_PREFIX:-vesper}-redis
|
|
24
24
|
ports:
|
|
25
|
-
- "
|
|
25
|
+
- "127.0.0.1:${REDIS_PORT:-6379}:6379"
|
|
26
26
|
volumes:
|
|
27
27
|
- ${VESPER_HOME:-~/.vesper}/docker-data/redis:/data
|
|
28
28
|
command: redis-server --appendonly yes
|
|
@@ -43,7 +43,7 @@ services:
|
|
|
43
43
|
dockerfile: Dockerfile
|
|
44
44
|
container_name: ${VESPER_PREFIX:-vesper}-embedding
|
|
45
45
|
ports:
|
|
46
|
-
- "
|
|
46
|
+
- "127.0.0.1:${EMBEDDING_PORT:-8000}:8000"
|
|
47
47
|
restart: unless-stopped
|
|
48
48
|
networks:
|
|
49
49
|
- vesper-network
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vesper-memory",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "AI memory system for Claude Code - Three-layer architecture with semantic search, knowledge graphs, and intelligent retrieval",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
"main": "dist/server.js",
|
|
10
10
|
"bin": {
|
|
11
11
|
"vesper": "dist/cli.js",
|
|
12
|
+
"vesper-memory": "dist/cli.js",
|
|
12
13
|
"vesper-server": "dist/server-wrapper.js"
|
|
13
14
|
},
|
|
14
15
|
"files": [
|
|
@@ -54,7 +55,8 @@
|
|
|
54
55
|
"scripts": {
|
|
55
56
|
"postinstall": "node scripts/postinstall.js",
|
|
56
57
|
"dev": "node --loader ts-node/esm src/server.ts",
|
|
57
|
-
"
|
|
58
|
+
"clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true })\"",
|
|
59
|
+
"build": "npm run clean && tsc",
|
|
58
60
|
"build:global": "npm run build && npm install -g .",
|
|
59
61
|
"reinstall": "npm install -g .",
|
|
60
62
|
"test": "vitest",
|
|
@@ -64,7 +66,7 @@
|
|
|
64
66
|
"benchmark:unit": "vitest run tests/benchmark/statistics.test.ts tests/benchmark/types.test.ts tests/benchmark/metrics-collector.test.ts",
|
|
65
67
|
"benchmark:real": "npx tsx scripts/run-real-benchmark.ts",
|
|
66
68
|
"benchmark:accuracy": "npx tsx scripts/run-accuracy-benchmark.ts",
|
|
67
|
-
"lint": "eslint src tests
|
|
69
|
+
"lint": "eslint src tests",
|
|
68
70
|
"format": "prettier --write \"src/**/*.ts\" \"tests/**/*.ts\"",
|
|
69
71
|
"init:qdrant": "npx tsx scripts/init-qdrant.ts",
|
|
70
72
|
"fresh-install": "./scripts/fresh-install.sh",
|
|
@@ -73,7 +75,7 @@
|
|
|
73
75
|
"dependencies": {
|
|
74
76
|
"@modelcontextprotocol/sdk": "^1.25.3",
|
|
75
77
|
"@qdrant/js-client-rest": "^1.16.2",
|
|
76
|
-
"better-sqlite3": "^
|
|
78
|
+
"better-sqlite3": "^12.11.1",
|
|
77
79
|
"ioredis": "^5.3.2",
|
|
78
80
|
"lru-cache": "^10.4.3",
|
|
79
81
|
"zod": "^4.3.6"
|
|
@@ -87,6 +89,7 @@
|
|
|
87
89
|
"dotenv": "^17.2.3",
|
|
88
90
|
"eslint": "^9.39.2",
|
|
89
91
|
"prettier": "^3.1.1",
|
|
92
|
+
"tsx": "^4.23.4",
|
|
90
93
|
"ts-node": "^10.9.2",
|
|
91
94
|
"typescript": "^5.3.3",
|
|
92
95
|
"vitest": "^4.0.18",
|
package/scripts/README.md
CHANGED
package/scripts/health-check.sh
CHANGED
|
@@ -19,8 +19,12 @@ fi
|
|
|
19
19
|
|
|
20
20
|
# Check Redis
|
|
21
21
|
if docker-compose -f "$PROJECT_DIR/docker-compose.yml" ps redis | grep -q "Up"; then
|
|
22
|
-
|
|
23
|
-
if
|
|
22
|
+
redis_auth=()
|
|
23
|
+
if [ -n "${REDIS_PASSWORD:-}" ]; then
|
|
24
|
+
export REDISCLI_AUTH="$REDIS_PASSWORD"
|
|
25
|
+
redis_auth=(-e REDISCLI_AUTH)
|
|
26
|
+
fi
|
|
27
|
+
if docker exec "${redis_auth[@]}" memory-redis redis-cli ping 2>/dev/null | grep -q "PONG"; then
|
|
24
28
|
echo "✅ Redis: Running and responsive"
|
|
25
29
|
else
|
|
26
30
|
echo "⚠️ Redis: Running but not responsive"
|
|
@@ -59,8 +63,8 @@ else
|
|
|
59
63
|
fi
|
|
60
64
|
|
|
61
65
|
# Check MCP config
|
|
62
|
-
if [ -f "
|
|
63
|
-
if grep -q "memory" "
|
|
66
|
+
if [ -f "$HOME/.claude/mcp_config.json" ]; then
|
|
67
|
+
if grep -q "memory" "$HOME/.claude/mcp_config.json"; then
|
|
64
68
|
echo "✅ MCP Config: Memory server configured"
|
|
65
69
|
else
|
|
66
70
|
echo "⚠️ MCP Config: Memory server not configured"
|
package/scripts/init-qdrant.ts
CHANGED
|
@@ -45,8 +45,15 @@ async function initializeQdrant(): Promise<InitResult> {
|
|
|
45
45
|
console.log(` API Key: ${QDRANT_API_KEY ? "configured" : "not configured"}`);
|
|
46
46
|
|
|
47
47
|
// Create client with optional API key
|
|
48
|
-
const clientConfig: {
|
|
48
|
+
const clientConfig: {
|
|
49
|
+
url: string;
|
|
50
|
+
apiKey?: string;
|
|
51
|
+
checkCompatibility: boolean;
|
|
52
|
+
} = {
|
|
49
53
|
url: QDRANT_URL,
|
|
54
|
+
// Vesper's pinned server can be older than the generated REST client. The
|
|
55
|
+
// APIs used by this initializer are covered by integration tests.
|
|
56
|
+
checkCompatibility: false,
|
|
50
57
|
};
|
|
51
58
|
|
|
52
59
|
if (QDRANT_API_KEY) {
|
|
@@ -67,9 +74,7 @@ async function initializeQdrant(): Promise<InitResult> {
|
|
|
67
74
|
// Check if collection already exists
|
|
68
75
|
console.log("\nChecking existing collections...");
|
|
69
76
|
const collections = await client.getCollections();
|
|
70
|
-
const existingCollection = collections.collections.find(
|
|
71
|
-
(c) => c.name === COLLECTION_NAME
|
|
72
|
-
);
|
|
77
|
+
const existingCollection = collections.collections.find((c) => c.name === COLLECTION_NAME);
|
|
73
78
|
|
|
74
79
|
if (existingCollection) {
|
|
75
80
|
// Verify configuration matches
|
|
@@ -81,71 +86,49 @@ async function initializeQdrant(): Promise<InitResult> {
|
|
|
81
86
|
console.warn(
|
|
82
87
|
` WARNING: Existing collection has different vector size: ${vectorConfig.size}`
|
|
83
88
|
);
|
|
84
|
-
console.warn(
|
|
85
|
-
` Expected: ${VECTOR_SIZE}. You may need to recreate the collection.`
|
|
86
|
-
);
|
|
89
|
+
console.warn(` Expected: ${VECTOR_SIZE}. You may need to recreate the collection.`);
|
|
87
90
|
} else {
|
|
88
91
|
console.log(
|
|
89
92
|
` Collection '${COLLECTION_NAME}' already exists with correct configuration`
|
|
90
93
|
);
|
|
91
94
|
}
|
|
92
95
|
}
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
96
|
+
} else {
|
|
97
|
+
// Create new collection
|
|
98
|
+
console.log(`\nCreating collection '${COLLECTION_NAME}'...`);
|
|
99
|
+
await client.createCollection(COLLECTION_NAME, {
|
|
100
|
+
vectors: {
|
|
101
|
+
size: VECTOR_SIZE,
|
|
102
|
+
distance: "Cosine",
|
|
103
|
+
},
|
|
104
|
+
// Optimize for memory retrieval workload
|
|
105
|
+
optimizers_config: {
|
|
106
|
+
default_segment_number: 2,
|
|
107
|
+
indexing_threshold: 10000,
|
|
108
|
+
},
|
|
109
|
+
// Enable write-ahead logging for durability
|
|
110
|
+
wal_config: {
|
|
111
|
+
wal_capacity_mb: 32,
|
|
112
|
+
wal_segments_ahead: 0,
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
console.log(` Collection created successfully`);
|
|
100
117
|
}
|
|
101
118
|
|
|
102
|
-
// Create new collection
|
|
103
|
-
console.log(`\nCreating collection '${COLLECTION_NAME}'...`);
|
|
104
|
-
await client.createCollection(COLLECTION_NAME, {
|
|
105
|
-
vectors: {
|
|
106
|
-
size: VECTOR_SIZE,
|
|
107
|
-
distance: "Cosine",
|
|
108
|
-
},
|
|
109
|
-
// Optimize for memory retrieval workload
|
|
110
|
-
optimizers_config: {
|
|
111
|
-
default_segment_number: 2,
|
|
112
|
-
indexing_threshold: 10000,
|
|
113
|
-
},
|
|
114
|
-
// Enable write-ahead logging for durability
|
|
115
|
-
wal_config: {
|
|
116
|
-
wal_capacity_mb: 32,
|
|
117
|
-
wal_segments_ahead: 0,
|
|
118
|
-
},
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
console.log(` Collection created successfully`);
|
|
122
|
-
|
|
123
119
|
// Create payload indexes for common query patterns
|
|
124
120
|
console.log("\nCreating payload indexes...");
|
|
125
121
|
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
wait: true, // Wait for index creation to complete
|
|
137
|
-
field_name: "source",
|
|
138
|
-
field_schema: "keyword",
|
|
139
|
-
});
|
|
140
|
-
console.log(" Created index: source (keyword)");
|
|
141
|
-
|
|
142
|
-
// Index for filtering by type
|
|
143
|
-
await client.createPayloadIndex(COLLECTION_NAME, {
|
|
144
|
-
wait: true, // Wait for index creation to complete
|
|
145
|
-
field_name: "type",
|
|
146
|
-
field_schema: "keyword",
|
|
147
|
-
});
|
|
148
|
-
console.log(" Created index: type (keyword)");
|
|
122
|
+
// Match the fields used by MemoryRetriever's dense candidate filter. All
|
|
123
|
+
// authorization is still repeated against canonical SQLite rows.
|
|
124
|
+
for (const fieldName of ["namespace", "memory_type", "agent_id", "task_id"]) {
|
|
125
|
+
await client.createPayloadIndex(COLLECTION_NAME, {
|
|
126
|
+
wait: true,
|
|
127
|
+
field_name: fieldName,
|
|
128
|
+
field_schema: "keyword",
|
|
129
|
+
});
|
|
130
|
+
console.log(` Ensured index: ${fieldName} (keyword)`);
|
|
131
|
+
}
|
|
149
132
|
|
|
150
133
|
// Verify collection was created
|
|
151
134
|
const verifyInfo = await client.getCollection(COLLECTION_NAME);
|
|
@@ -161,8 +144,7 @@ async function initializeQdrant(): Promise<InitResult> {
|
|
|
161
144
|
vectorSize: VECTOR_SIZE,
|
|
162
145
|
};
|
|
163
146
|
} catch (error) {
|
|
164
|
-
const errorMessage =
|
|
165
|
-
error instanceof Error ? error.message : String(error);
|
|
147
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
166
148
|
console.error(`\nError initializing Qdrant: ${errorMessage}`);
|
|
167
149
|
|
|
168
150
|
return {
|
|
@@ -13,9 +13,9 @@ echo "================================"
|
|
|
13
13
|
# Source environment variables
|
|
14
14
|
export REDIS_HOST=localhost
|
|
15
15
|
export REDIS_PORT=6379
|
|
16
|
-
|
|
16
|
+
# REDIS_PASSWORD is inherited from the operator environment; no repository default.
|
|
17
17
|
export QDRANT_URL="http://localhost:6333"
|
|
18
|
-
|
|
18
|
+
# QDRANT_API_KEY is inherited from the operator environment; no repository default.
|
|
19
19
|
export SQLITE_DB="$PROJECT_DIR/data/memory.db"
|
|
20
20
|
export NODE_ENV=production
|
|
21
21
|
|