vesper-memory 0.4.0 โ†’ 0.5.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 (63) hide show
  1. package/CHANGELOG.md +57 -3
  2. package/LICENSE +59 -0
  3. package/README.md +420 -23
  4. package/config/migrations/001_add_skill_summary.sql +75 -0
  5. package/config/migrations/001_rollback_skill_summary.sql +60 -0
  6. package/config/sqlite-schema.sql +68 -4
  7. package/dist/benchmark/types.d.ts +4 -4
  8. package/dist/cli.js +0 -0
  9. package/dist/consolidation/pipeline.d.ts +6 -1
  10. package/dist/consolidation/pipeline.d.ts.map +1 -1
  11. package/dist/consolidation/pipeline.js +53 -35
  12. package/dist/consolidation/pipeline.js.map +1 -1
  13. package/dist/memory-layers/semantic-memory.d.ts +9 -19
  14. package/dist/memory-layers/semantic-memory.d.ts.map +1 -1
  15. package/dist/memory-layers/semantic-memory.js +31 -54
  16. package/dist/memory-layers/semantic-memory.js.map +1 -1
  17. package/dist/memory-layers/skill-lazy-loading.d.ts +160 -0
  18. package/dist/memory-layers/skill-lazy-loading.d.ts.map +1 -0
  19. package/dist/memory-layers/skill-lazy-loading.js +247 -0
  20. package/dist/memory-layers/skill-lazy-loading.js.map +1 -0
  21. package/dist/memory-layers/skill-library.d.ts +133 -4
  22. package/dist/memory-layers/skill-library.d.ts.map +1 -1
  23. package/dist/memory-layers/skill-library.js +427 -8
  24. package/dist/memory-layers/skill-library.js.map +1 -1
  25. package/dist/memory-layers/working-memory.d.ts +35 -14
  26. package/dist/memory-layers/working-memory.d.ts.map +1 -1
  27. package/dist/memory-layers/working-memory.js +114 -36
  28. package/dist/memory-layers/working-memory.js.map +1 -1
  29. package/dist/retrieval/hybrid-search.d.ts +2 -2
  30. package/dist/retrieval/hybrid-search.d.ts.map +1 -1
  31. package/dist/retrieval/hybrid-search.js +4 -3
  32. package/dist/retrieval/hybrid-search.js.map +1 -1
  33. package/dist/router/smart-router.d.ts +25 -0
  34. package/dist/router/smart-router.d.ts.map +1 -1
  35. package/dist/router/smart-router.js +90 -10
  36. package/dist/router/smart-router.js.map +1 -1
  37. package/dist/scheduler/consolidation-scheduler.d.ts +129 -0
  38. package/dist/scheduler/consolidation-scheduler.d.ts.map +1 -0
  39. package/dist/scheduler/consolidation-scheduler.js +179 -0
  40. package/dist/scheduler/consolidation-scheduler.js.map +1 -0
  41. package/dist/scheduler/index.d.ts +7 -0
  42. package/dist/scheduler/index.d.ts.map +1 -0
  43. package/dist/scheduler/index.js +7 -0
  44. package/dist/scheduler/index.js.map +1 -0
  45. package/dist/server-wrapper.js +0 -0
  46. package/dist/server.js +879 -28
  47. package/dist/server.js.map +1 -1
  48. package/dist/synthesis/conflict-detector.d.ts +4 -6
  49. package/dist/synthesis/conflict-detector.d.ts.map +1 -1
  50. package/dist/synthesis/conflict-detector.js +19 -21
  51. package/dist/synthesis/conflict-detector.js.map +1 -1
  52. package/dist/utils/validation.d.ts +123 -1
  53. package/dist/utils/validation.d.ts.map +1 -1
  54. package/dist/utils/validation.js +146 -7
  55. package/dist/utils/validation.js.map +1 -1
  56. package/docker-compose.yml +6 -6
  57. package/embedding-service/README.md +8 -0
  58. package/package.json +4 -2
  59. package/scripts/FRESH_INSTALL.md +1 -1
  60. package/scripts/ensure-infrastructure.sh +86 -26
  61. package/scripts/health-check.sh +2 -1
  62. package/scripts/stop-infrastructure.sh +23 -0
  63. package/scripts/test-mcp-server.sh +2 -1
@@ -14,6 +14,30 @@
14
14
  import { z } from 'zod';
15
15
  import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
16
16
  // ============================================================================
17
+ // Reusable Schemas
18
+ // ============================================================================
19
+ /**
20
+ * Namespace schema for multi-agent isolation
21
+ *
22
+ * Alphanumeric with hyphens/underscores, defaults to "default".
23
+ * Used across all tools to scope memory operations.
24
+ */
25
+ export const NamespaceSchema = z.string()
26
+ .regex(/^[a-zA-Z][a-zA-Z0-9_-]*$/, "Namespace must start with a letter and contain only alphanumeric characters, underscores, or hyphens")
27
+ .min(1, "Namespace cannot be empty")
28
+ .max(100, "Namespace cannot exceed 100 characters")
29
+ .default("default");
30
+ /**
31
+ * Memory type enum including decision type for v0.5.0
32
+ */
33
+ export const MemoryTypeEnum = z.enum(["episodic", "semantic", "procedural", "decision"], {
34
+ message: "Invalid memory type. Must be episodic, semantic, procedural, or decision"
35
+ });
36
+ /**
37
+ * Memory type enum for filtering (retrieve/list operations)
38
+ */
39
+ export const MemoryTypeFilterEnum = z.enum(["episodic", "semantic", "procedural", "decision"]);
40
+ // ============================================================================
17
41
  // MCP Tool Input Schemas
18
42
  // ============================================================================
19
43
  /**
@@ -21,20 +45,24 @@ import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
21
45
  *
22
46
  * Enforces:
23
47
  * - Content between 1 and 100,000 characters (100KB limit)
24
- * - Memory type must be one of: episodic, semantic, procedural
48
+ * - Memory type must be one of: episodic, semantic, procedural, decision
25
49
  * - Metadata object optional, max 50 keys
50
+ * - Namespace for multi-agent isolation
51
+ * - Agent attribution fields (agent_id, agent_role, task_id)
26
52
  */
27
53
  export const StoreMemoryInputSchema = z.object({
28
54
  content: z.string()
29
55
  .min(1, "Content cannot be empty")
30
56
  .max(100000, "Content exceeds 100KB limit"),
31
- memory_type: z.enum(["episodic", "semantic", "procedural"], {
32
- message: "Invalid memory type. Must be episodic, semantic, or procedural"
33
- }),
57
+ memory_type: MemoryTypeEnum,
34
58
  metadata: z.record(z.string(), z.unknown())
35
59
  .optional()
36
60
  .refine((val) => !val || Object.keys(val).length <= 50, "Metadata cannot exceed 50 keys")
37
61
  .refine((val) => !val || JSON.stringify(val).length <= 10000, "Metadata size exceeds 10KB limit"),
62
+ namespace: NamespaceSchema.optional().default("default"),
63
+ agent_id: z.string().max(255).optional(),
64
+ agent_role: z.string().max(255).optional(),
65
+ task_id: z.string().max(255).optional(),
38
66
  });
39
67
  /**
40
68
  * Schema for retrieve_memory tool input
@@ -43,12 +71,14 @@ export const StoreMemoryInputSchema = z.object({
43
71
  * - Query between 1 and 10,000 characters (10KB limit)
44
72
  * - Memory types array max 10 items
45
73
  * - Max results between 1 and 100
74
+ * - Namespace for multi-agent isolation
75
+ * - Agent/task filtering
46
76
  */
47
77
  export const RetrieveMemoryInputSchema = z.object({
48
78
  query: z.string()
49
79
  .min(1, "Query cannot be empty")
50
80
  .max(10000, "Query exceeds 10KB limit"),
51
- memory_types: z.array(z.enum(["episodic", "semantic", "procedural"]))
81
+ memory_types: z.array(MemoryTypeFilterEnum)
52
82
  .max(10, "Cannot filter by more than 10 memory types")
53
83
  .optional(),
54
84
  max_results: z.number()
@@ -59,6 +89,10 @@ export const RetrieveMemoryInputSchema = z.object({
59
89
  .default(5),
60
90
  routing_strategy: z.enum(["fast_path", "semantic", "full_text", "graph"])
61
91
  .optional(),
92
+ namespace: NamespaceSchema.optional().default("default"),
93
+ agent_id: z.string().max(255).optional(),
94
+ task_id: z.string().max(255).optional(),
95
+ exclude_agent: z.string().max(255).optional(),
62
96
  });
63
97
  /**
64
98
  * Schema for list_recent tool input
@@ -70,8 +104,8 @@ export const ListRecentInputSchema = z.object({
70
104
  .max(100, "limit cannot exceed 100")
71
105
  .optional()
72
106
  .default(5),
73
- memory_type: z.enum(["episodic", "semantic", "procedural"])
74
- .optional(),
107
+ memory_type: MemoryTypeFilterEnum.optional(),
108
+ namespace: NamespaceSchema.optional().default("default"),
75
109
  });
76
110
  /**
77
111
  * Schema for get_stats tool input
@@ -80,6 +114,111 @@ export const GetStatsInputSchema = z.object({
80
114
  detailed: z.boolean()
81
115
  .optional()
82
116
  .default(false),
117
+ namespace: NamespaceSchema.optional().default("default"),
118
+ });
119
+ /**
120
+ * Schema for record_skill_outcome tool input
121
+ *
122
+ * Records success or failure feedback for a skill execution.
123
+ * Used to improve skill ranking over time.
124
+ *
125
+ * Enforces:
126
+ * - skill_id is required
127
+ * - outcome must be 'success' or 'failure'
128
+ * - satisfaction is required for success (0-1 range)
129
+ */
130
+ export const RecordSkillOutcomeInputSchema = z.object({
131
+ skill_id: z.string()
132
+ .min(1, "skill_id cannot be empty"),
133
+ outcome: z.enum(["success", "failure"], {
134
+ message: "outcome must be 'success' or 'failure'"
135
+ }),
136
+ satisfaction: z.number()
137
+ .min(0, "satisfaction must be at least 0")
138
+ .max(1, "satisfaction cannot exceed 1")
139
+ .optional(),
140
+ namespace: NamespaceSchema.optional().default("default"),
141
+ }).refine((data) => {
142
+ // satisfaction is required for success outcome
143
+ if (data.outcome === 'success' && data.satisfaction === undefined) {
144
+ return false;
145
+ }
146
+ return true;
147
+ }, {
148
+ message: "satisfaction is required when outcome is 'success'",
149
+ path: ["satisfaction"]
150
+ });
151
+ /**
152
+ * Schema for load_skill tool input
153
+ *
154
+ * Loads full skill implementation on-demand for execution.
155
+ * Part of lazy loading system to reduce token usage.
156
+ *
157
+ * Enforces:
158
+ * - skill_id is required and non-empty
159
+ * - skill_id must match expected format (skill_*)
160
+ */
161
+ export const LoadSkillInputSchema = z.object({
162
+ skill_id: z.string()
163
+ .min(1, "skill_id cannot be empty")
164
+ .max(255, "skill_id cannot exceed 255 characters")
165
+ .regex(/^skill_[a-z0-9_]+$/i, "Invalid skill_id format (must be skill_*)"),
166
+ namespace: NamespaceSchema.optional().default("default"),
167
+ });
168
+ // ============================================================================
169
+ // New Tool Schemas for v0.5.0
170
+ // ============================================================================
171
+ /**
172
+ * Schema for share_context tool input
173
+ *
174
+ * Shares context (memories, skills, entities) from one namespace to another.
175
+ * Used for agent handoffs and context sharing in multi-agent workflows.
176
+ */
177
+ export const ShareContextInputSchema = z.object({
178
+ source_namespace: NamespaceSchema,
179
+ target_namespace: NamespaceSchema,
180
+ task_id: z.string().max(255).optional(),
181
+ query: z.string()
182
+ .min(1, "Query cannot be empty")
183
+ .max(10000, "Query exceeds 10KB limit")
184
+ .optional(),
185
+ max_items: z.number()
186
+ .int()
187
+ .min(1)
188
+ .max(50)
189
+ .optional()
190
+ .default(10),
191
+ include_skills: z.boolean().optional().default(false),
192
+ include_entities: z.boolean().optional().default(true),
193
+ });
194
+ /**
195
+ * Schema for store_decision tool input
196
+ *
197
+ * Stores a decision with reduced decay factor and automatic conflict detection.
198
+ * Decisions are stored as memory_type='decision' with decay_factor: 0.25.
199
+ */
200
+ export const StoreDecisionInputSchema = z.object({
201
+ content: z.string()
202
+ .min(1, "Content cannot be empty")
203
+ .max(100000, "Content exceeds 100KB limit"),
204
+ namespace: NamespaceSchema.optional().default("default"),
205
+ agent_id: z.string().max(255).optional(),
206
+ agent_role: z.string().max(255).optional(),
207
+ task_id: z.string().max(255).optional(),
208
+ supersedes: z.string().max(255).optional(),
209
+ metadata: z.record(z.string(), z.unknown())
210
+ .optional()
211
+ .refine((val) => !val || Object.keys(val).length <= 50, "Metadata cannot exceed 50 keys"),
212
+ });
213
+ /**
214
+ * Schema for list_namespaces tool input
215
+ */
216
+ export const ListNamespacesInputSchema = z.object({});
217
+ /**
218
+ * Schema for namespace_stats tool input
219
+ */
220
+ export const NamespaceStatsInputSchema = z.object({
221
+ namespace: NamespaceSchema,
83
222
  });
84
223
  // ============================================================================
85
224
  // Internal Data Type Schemas
@@ -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,yBAAyB;AACzB,+EAA+E;AAE/E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;SAChB,GAAG,CAAC,CAAC,EAAE,yBAAyB,CAAC;SACjC,GAAG,CAAC,MAAM,EAAE,6BAA6B,CAAC;IAE7C,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE;QAC1D,OAAO,EAAE,gEAAgE;KAC1E,CAAC;IAEF,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;SACxC,QAAQ,EAAE;SACV,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,EAAE,gCAAgC,CAAC;SACxF,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,KAAK,EAAE,kCAAkC,CAAC;CACpG,CAAC,CAAC;AAIH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;SACd,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC;SAC/B,GAAG,CAAC,KAAK,EAAE,0BAA0B,CAAC;IAEzC,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,CAAC;SAClE,GAAG,CAAC,EAAE,EAAE,4CAA4C,CAAC;SACrD,QAAQ,EAAE;IAEb,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;SACpB,GAAG,CAAC,gCAAgC,CAAC;SACrC,GAAG,CAAC,CAAC,EAAE,gCAAgC,CAAC;SACxC,GAAG,CAAC,GAAG,EAAE,+BAA+B,CAAC;SACzC,QAAQ,EAAE;SACV,OAAO,CAAC,CAAC,CAAC;IAEb,gBAAgB,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;SACtE,QAAQ,EAAE;CACd,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;SACd,GAAG,CAAC,0BAA0B,CAAC;SAC/B,GAAG,CAAC,CAAC,EAAE,0BAA0B,CAAC;SAClC,GAAG,CAAC,GAAG,EAAE,yBAAyB,CAAC;SACnC,QAAQ,EAAE;SACV,OAAO,CAAC,CAAC,CAAC;IAEb,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;SACxD,QAAQ,EAAE;CACd,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;SAClB,QAAQ,EAAE;SACV,OAAO,CAAC,KAAK,CAAC;CAClB,CAAC,CAAC;AAIH,+EAA+E;AAC/E,6BAA6B;AAC7B,+EAA+E;AAE/E;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC5C,MAAM,CACL,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAC3C,EAAE,OAAO,EAAE,wCAAwC,EAAE,CACtD,CAAC;AAEJ;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,EAAE;KAC3C,GAAG,CAAC,CAAC,EAAE,iCAAiC,CAAC;KACzC,GAAG,CAAC,GAAG,EAAE,8CAA8C,CAAC;KACxD,KAAK,CACJ,0BAA0B,EAC1B,4GAA4G,CAC7G,CAAC;AAEJ;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,EAAE;KACnC,GAAG,CAAC,CAAC,EAAE,yBAAyB,CAAC;KACjC,GAAG,CAAC,GAAG,EAAE,sCAAsC,CAAC;KAChD,KAAK,CACJ,kBAAkB,EAClB,+DAA+D,CAChE,CAAC;AAEJ,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAI,MAAsB,EAAE,KAAc;IACrE,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAEvC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5F,MAAM,IAAI,QAAQ,CAChB,SAAS,CAAC,aAAa,EACvB,sBAAsB,MAAM,EAAE,CAC/B,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,cAAc,CAAC,MAAgB,EAAE,YAAoB;IACnE,kBAAkB;IAClB,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,uCAAuC,YAAY,SAAS,MAAM,CAAC,MAAM,EAAE,CAC5E,CAAC;IACJ,CAAC;IAED,wCAAwC;IACxC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CACb,kDAAkD,CACnD,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAEpD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,4BAA4B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,oBAAoB;IACpB,IAAI,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEzC,kBAAkB;IAClB,SAAS,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAE7B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAE9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
@@ -2,9 +2,9 @@ services:
2
2
  # Vector Database for embeddings and semantic search
3
3
  qdrant:
4
4
  image: qdrant/qdrant:v1.7.4
5
- container_name: vesper-qdrant
5
+ container_name: ${VESPER_PREFIX:-vesper}-qdrant
6
6
  ports:
7
- - "6333:6333"
7
+ - "${QDRANT_PORT:-6333}:6333"
8
8
  volumes:
9
9
  - ${VESPER_HOME:-~/.vesper}/docker-data/qdrant:/qdrant/storage
10
10
  restart: unless-stopped
@@ -20,9 +20,9 @@ services:
20
20
  # Cache layer and working memory
21
21
  redis:
22
22
  image: redis:7-alpine
23
- container_name: vesper-redis
23
+ container_name: ${VESPER_PREFIX:-vesper}-redis
24
24
  ports:
25
- - "6379:6379"
25
+ - "${REDIS_PORT:-6379}:6379"
26
26
  volumes:
27
27
  - ${VESPER_HOME:-~/.vesper}/docker-data/redis:/data
28
28
  command: redis-server --appendonly yes
@@ -41,9 +41,9 @@ services:
41
41
  build:
42
42
  context: ./embedding-service
43
43
  dockerfile: Dockerfile
44
- container_name: vesper-embedding
44
+ container_name: ${VESPER_PREFIX:-vesper}-embedding
45
45
  ports:
46
- - "8000:8000"
46
+ - "${EMBEDDING_PORT:-8000}:8000"
47
47
  restart: unless-stopped
48
48
  networks:
49
49
  - vesper-network
@@ -66,3 +66,11 @@ async function getEmbedding(text: string): Promise<number[]> {
66
66
  - **Dimensions**: 1024
67
67
  - **Throughput**: ~100-200 embeddings/sec (CPU), ~1000+/sec (GPU)
68
68
  - **Latency**: ~10-50ms per text (CPU), ~1-5ms (GPU)
69
+
70
+ ## Credits
71
+
72
+ This service uses [BAAI/bge-large-en-v1.5](https://huggingface.co/BAAI/bge-large-en-v1.5), an open-source embedding model developed by the Beijing Academy of Artificial Intelligence (BAAI).
73
+
74
+ **Model Repository**: [FlagEmbedding](https://github.com/FlagOpen/FlagEmbedding)
75
+
76
+ BGE (BAAI General Embedding) models are trained using RetroMAE and contrastive learning on large-scale pairs data, achieving state-of-the-art performance on semantic retrieval tasks.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vesper-memory",
3
- "version": "0.4.0",
3
+ "version": "0.5.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": {
@@ -47,7 +47,7 @@
47
47
  "url": "https://github.com/fitz2882/vesper-memory.git"
48
48
  },
49
49
  "bugs": {
50
- "url": "https://github.com/fitz2882/vesper/issues"
50
+ "url": "https://github.com/fitz2882/vesper-memory/issues"
51
51
  },
52
52
  "homepage": "https://github.com/fitz2882/vesper-memory#readme",
53
53
  "license": "MIT",
@@ -55,6 +55,8 @@
55
55
  "postinstall": "node scripts/postinstall.js",
56
56
  "dev": "node --loader ts-node/esm src/server.ts",
57
57
  "build": "tsc",
58
+ "build:global": "npm run build && npm install -g .",
59
+ "reinstall": "npm install -g .",
58
60
  "test": "vitest",
59
61
  "test:ui": "vitest --ui",
60
62
  "benchmark": "vitest run tests/benchmarks/memory-performance.test.ts",
@@ -277,4 +277,4 @@ If you encounter issues:
277
277
  1. Check the troubleshooting section above
278
278
  2. Review logs: `docker-compose logs -f`
279
279
  3. Check Docker status: `make status`
280
- 4. File an issue: https://github.com/fitz2882/vesper/issues
280
+ 4. File an issue: https://github.com/fitz2882/vesper-memory/issues
@@ -1,42 +1,102 @@
1
1
  #!/bin/bash
2
- # Ensures Docker services are running for Memory MCP server
2
+ # Ensures Docker services are running for enabled Vesper MCP servers
3
+ # Starts services for vesper-personal and/or vesper-dev based on MCP config
3
4
 
4
5
  # Dynamically determine installation directory
5
6
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
6
7
  PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
7
8
  cd "$PROJECT_DIR" || exit 1
8
9
 
9
- # Set VESPER_HOME for user-level storage (default: ~/.vesper)
10
- # This is exported so docker-compose can use it for volume mounts
11
- export VESPER_HOME="${VESPER_HOME:-$HOME/.vesper}"
12
-
13
- # Create required directories before Docker starts
14
- # Docker will fail to mount volumes if these directories don't exist
15
- mkdir -p "$VESPER_HOME/data"
16
- mkdir -p "$VESPER_HOME/docker-data/qdrant"
17
- mkdir -p "$VESPER_HOME/docker-data/redis"
18
- mkdir -p "$VESPER_HOME/logs"
19
-
20
10
  # Check if Docker is running
21
11
  if ! docker info >/dev/null 2>&1; then
22
12
  echo "โš ๏ธ Docker is not running. Please start Docker Desktop."
23
13
  exit 0 # Exit gracefully - don't block Claude startup
24
14
  fi
25
15
 
26
- # Check if core services are healthy using docker ps directly
27
- REDIS_HEALTHY=$(docker ps --filter "name=vesper-redis" --filter "health=healthy" --format "{{.Names}}" | wc -l | tr -d ' ')
28
- QDRANT_HEALTHY=$(docker ps --filter "name=vesper-qdrant" --filter "health=healthy" --format "{{.Names}}" | wc -l | tr -d ' ')
29
- EMBEDDING_HEALTHY=$(docker ps --filter "name=vesper-embedding" --filter "health=healthy" --format "{{.Names}}" | wc -l | tr -d ' ')
30
-
31
- if [ "$REDIS_HEALTHY" = "0" ] || [ "$QDRANT_HEALTHY" = "0" ] || [ "$EMBEDDING_HEALTHY" = "0" ]; then
32
- echo "๐Ÿš€ Starting Memory infrastructure..."
33
- # Use --no-recreate to avoid conflicts with existing containers
34
- # Suppress bcrypt hash variable warnings from .env file
35
- docker-compose up -d --no-recreate 2>&1 | grep -v "is not set. Defaulting" | grep -v "level=warning" || true
36
- sleep 3 # Give services time to initialize
37
- echo "โœ… Memory infrastructure started"
38
- else
39
- echo "โœ… Memory infrastructure already running"
16
+ # Detect which MCP servers are configured
17
+ # Check local project config first, then fall back to global config
18
+ LOCAL_MCP_CONFIG="$PROJECT_DIR/.claude/mcp_config.json"
19
+ GLOBAL_MCP_CONFIG="$HOME/.claude/mcp_config.json"
20
+
21
+ START_PERSONAL=false
22
+ START_DEV=false
23
+
24
+ # Use local config if it exists, otherwise use global
25
+ if [ -f "$LOCAL_MCP_CONFIG" ]; then
26
+ MCP_CONFIG="$LOCAL_MCP_CONFIG"
27
+ echo "Using local MCP config: $LOCAL_MCP_CONFIG"
28
+ elif [ -f "$GLOBAL_MCP_CONFIG" ]; then
29
+ MCP_CONFIG="$GLOBAL_MCP_CONFIG"
30
+ echo "Using global MCP config: $GLOBAL_MCP_CONFIG"
31
+ fi
32
+
33
+ if [ -f "$MCP_CONFIG" ]; then
34
+ if grep -q '"vesper-personal"' "$MCP_CONFIG"; then
35
+ START_PERSONAL=true
36
+ fi
37
+ if grep -q '"vesper-dev"' "$MCP_CONFIG"; then
38
+ START_DEV=true
39
+ fi
40
+ fi
41
+
42
+ # Function to start services for a specific instance
43
+ start_instance() {
44
+ local PROJECT_NAME=$1
45
+ local INSTANCE=$2
46
+ local VESPER_HOME=$3
47
+ local REDIS_PORT=$4
48
+ local QDRANT_PORT=$5
49
+ local EMBEDDING_PORT=$6
50
+
51
+ # Create required directories
52
+ mkdir -p "$VESPER_HOME/data"
53
+ mkdir -p "$VESPER_HOME/docker-data/qdrant"
54
+ mkdir -p "$VESPER_HOME/docker-data/redis"
55
+ mkdir -p "$VESPER_HOME/logs"
56
+
57
+ # Check if services are already healthy
58
+ local REDIS_HEALTHY=$(docker ps --filter "name=${INSTANCE}-redis" --filter "health=healthy" --format "{{.Names}}" | wc -l | tr -d ' ')
59
+ local QDRANT_HEALTHY=$(docker ps --filter "name=${INSTANCE}-qdrant" --filter "health=healthy" --format "{{.Names}}" | wc -l | tr -d ' ')
60
+ local EMBEDDING_HEALTHY=$(docker ps --filter "name=${INSTANCE}-embedding" --filter "health=healthy" --format "{{.Names}}" | wc -l | tr -d ' ')
61
+
62
+ if [ "$REDIS_HEALTHY" = "0" ] || [ "$QDRANT_HEALTHY" = "0" ] || [ "$EMBEDDING_HEALTHY" = "0" ]; then
63
+ echo "๐Ÿš€ Starting $INSTANCE infrastructure..."
64
+
65
+ # Export environment variables for docker-compose
66
+ export VESPER_PREFIX="$INSTANCE"
67
+ export VESPER_HOME="$VESPER_HOME"
68
+ export REDIS_PORT="$REDIS_PORT"
69
+ export QDRANT_PORT="$QDRANT_PORT"
70
+ export EMBEDDING_PORT="$EMBEDDING_PORT"
71
+
72
+ # Try to start existing containers first (fast path)
73
+ docker-compose -p "$PROJECT_NAME" start 2>/dev/null
74
+
75
+ # If that failed (no containers exist), create them
76
+ if [ $? -ne 0 ]; then
77
+ docker-compose -p "$PROJECT_NAME" up -d 2>&1 | grep -v "is not set. Defaulting" | grep -v "level=warning" | grep -v "internal" || true
78
+ fi
79
+
80
+ echo "โœ… $INSTANCE infrastructure started"
81
+ else
82
+ echo "โœ… $INSTANCE infrastructure already running"
83
+ fi
84
+ }
85
+
86
+ # Start vesper-personal if configured
87
+ if [ "$START_PERSONAL" = true ]; then
88
+ start_instance "vesper-personal" "vesper" "$HOME/.vesper" "6379" "6333" "8000"
89
+ fi
90
+
91
+ # Start vesper-dev if configured
92
+ if [ "$START_DEV" = true ]; then
93
+ start_instance "vesper-dev" "vesper-dev" "$HOME/.vesper-dev" "6380" "6334" "8001"
94
+ fi
95
+
96
+ # If neither configured, default to vesper-personal
97
+ if [ "$START_PERSONAL" = false ] && [ "$START_DEV" = false ]; then
98
+ echo "โ„น๏ธ No Vesper MCP servers found in config, starting vesper-personal by default"
99
+ start_instance "vesper-personal" "vesper" "$HOME/.vesper" "6379" "6333" "8000"
40
100
  fi
41
101
 
42
102
  # Verify build artifacts exist
@@ -3,7 +3,8 @@
3
3
 
4
4
  set -e
5
5
 
6
- PROJECT_DIR="/Users/fitzy/Documents/MemoryProject"
6
+ # Dynamically detect project directory (script is in PROJECT_DIR/scripts/)
7
+ PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
7
8
 
8
9
  echo "๐Ÿ” Memory System Health Check"
9
10
  echo "=============================="
@@ -0,0 +1,23 @@
1
+ #!/bin/bash
2
+ # Stops Docker services for Vesper MCP servers when Claude Code quits
3
+
4
+ echo "๐Ÿ›‘ Stopping Vesper infrastructure..."
5
+
6
+ # Stop vesper-personal containers (exclude vesper-dev)
7
+ PERSONAL_CONTAINERS=$(docker ps --filter "name=vesper-redis" --filter "name=vesper-qdrant" --filter "name=vesper-embedding" --format "{{.Names}}" | grep -v "vesper-dev")
8
+ if [ -n "$PERSONAL_CONTAINERS" ]; then
9
+ echo "Stopping vesper-personal services..."
10
+ echo "$PERSONAL_CONTAINERS" | xargs docker stop > /dev/null 2>&1
11
+ echo "โœ… vesper-personal services stopped"
12
+ fi
13
+
14
+ # Stop vesper-dev containers
15
+ DEV_CONTAINERS=$(docker ps --filter "name=vesper-dev" --format "{{.Names}}")
16
+ if [ -n "$DEV_CONTAINERS" ]; then
17
+ echo "Stopping vesper-dev services..."
18
+ echo "$DEV_CONTAINERS" | xargs docker stop > /dev/null 2>&1
19
+ echo "โœ… vesper-dev services stopped"
20
+ fi
21
+
22
+ echo "โœ… Vesper infrastructure stopped"
23
+ exit 0
@@ -3,7 +3,8 @@
3
3
 
4
4
  set -e
5
5
 
6
- PROJECT_DIR="/Users/fitzy/Documents/MemoryProject"
6
+ # Dynamically detect project directory (script is in PROJECT_DIR/scripts/)
7
+ PROJECT_DIR="$(cd "$(dirname "$0")/.." && pwd)"
7
8
  cd "$PROJECT_DIR"
8
9
 
9
10
  echo "๐Ÿงช Testing MCP Server Startup..."