vesper-memory 0.3.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 (206) hide show
  1. package/.env.example +28 -0
  2. package/CHANGELOG.md +137 -0
  3. package/LICENSE +21 -0
  4. package/README.md +665 -0
  5. package/config/sqlite-schema.sql +413 -0
  6. package/dist/benchmark/index.d.ts +18 -0
  7. package/dist/benchmark/index.d.ts.map +1 -0
  8. package/dist/benchmark/index.js +19 -0
  9. package/dist/benchmark/index.js.map +1 -0
  10. package/dist/benchmark/metrics-collector.d.ts +90 -0
  11. package/dist/benchmark/metrics-collector.d.ts.map +1 -0
  12. package/dist/benchmark/metrics-collector.js +196 -0
  13. package/dist/benchmark/metrics-collector.js.map +1 -0
  14. package/dist/benchmark/report-generator.d.ts +35 -0
  15. package/dist/benchmark/report-generator.d.ts.map +1 -0
  16. package/dist/benchmark/report-generator.js +221 -0
  17. package/dist/benchmark/report-generator.js.map +1 -0
  18. package/dist/benchmark/runner.d.ts +30 -0
  19. package/dist/benchmark/runner.d.ts.map +1 -0
  20. package/dist/benchmark/runner.js +308 -0
  21. package/dist/benchmark/runner.js.map +1 -0
  22. package/dist/benchmark/scenarios/context-recall.d.ts +65 -0
  23. package/dist/benchmark/scenarios/context-recall.d.ts.map +1 -0
  24. package/dist/benchmark/scenarios/context-recall.js +180 -0
  25. package/dist/benchmark/scenarios/context-recall.js.map +1 -0
  26. package/dist/benchmark/scenarios/index.d.ts +34 -0
  27. package/dist/benchmark/scenarios/index.d.ts.map +1 -0
  28. package/dist/benchmark/scenarios/index.js +230 -0
  29. package/dist/benchmark/scenarios/index.js.map +1 -0
  30. package/dist/benchmark/statistics.d.ts +125 -0
  31. package/dist/benchmark/statistics.d.ts.map +1 -0
  32. package/dist/benchmark/statistics.js +520 -0
  33. package/dist/benchmark/statistics.js.map +1 -0
  34. package/dist/benchmark/types.d.ts +458 -0
  35. package/dist/benchmark/types.d.ts.map +1 -0
  36. package/dist/benchmark/types.js +297 -0
  37. package/dist/benchmark/types.js.map +1 -0
  38. package/dist/cli 2.js +583 -0
  39. package/dist/cli.d 2.ts +8 -0
  40. package/dist/cli.d.ts +8 -0
  41. package/dist/cli.d.ts 2.map +1 -0
  42. package/dist/cli.d.ts.map +1 -0
  43. package/dist/cli.js +583 -0
  44. package/dist/cli.js 2.map +1 -0
  45. package/dist/cli.js.map +1 -0
  46. package/dist/config/rate-limits.d.ts +76 -0
  47. package/dist/config/rate-limits.d.ts.map +1 -0
  48. package/dist/config/rate-limits.js +161 -0
  49. package/dist/config/rate-limits.js.map +1 -0
  50. package/dist/config 2/rate-limits.d.ts +76 -0
  51. package/dist/config 2/rate-limits.d.ts.map +1 -0
  52. package/dist/config 2/rate-limits.js +161 -0
  53. package/dist/config 2/rate-limits.js.map +1 -0
  54. package/dist/consolidation/pipeline.d.ts +52 -0
  55. package/dist/consolidation/pipeline.d.ts.map +1 -0
  56. package/dist/consolidation/pipeline.js +193 -0
  57. package/dist/consolidation/pipeline.js.map +1 -0
  58. package/dist/consolidation 2/pipeline.d.ts +52 -0
  59. package/dist/consolidation 2/pipeline.d.ts.map +1 -0
  60. package/dist/consolidation 2/pipeline.js +193 -0
  61. package/dist/consolidation 2/pipeline.js.map +1 -0
  62. package/dist/embeddings/client.d.ts +95 -0
  63. package/dist/embeddings/client.d.ts.map +1 -0
  64. package/dist/embeddings/client.js +162 -0
  65. package/dist/embeddings/client.js.map +1 -0
  66. package/dist/embeddings 2/client.d.ts +94 -0
  67. package/dist/embeddings 2/client.d.ts.map +1 -0
  68. package/dist/embeddings 2/client.js +144 -0
  69. package/dist/embeddings 2/client.js.map +1 -0
  70. package/dist/memory-layers/semantic-memory.d.ts +76 -0
  71. package/dist/memory-layers/semantic-memory.d.ts.map +1 -0
  72. package/dist/memory-layers/semantic-memory.js +231 -0
  73. package/dist/memory-layers/semantic-memory.js.map +1 -0
  74. package/dist/memory-layers/skill-library.d.ts +25 -0
  75. package/dist/memory-layers/skill-library.d.ts.map +1 -0
  76. package/dist/memory-layers/skill-library.js +54 -0
  77. package/dist/memory-layers/skill-library.js.map +1 -0
  78. package/dist/memory-layers/working-memory.d.ts +57 -0
  79. package/dist/memory-layers/working-memory.d.ts.map +1 -0
  80. package/dist/memory-layers/working-memory.js +153 -0
  81. package/dist/memory-layers/working-memory.js.map +1 -0
  82. package/dist/memory-layers 2/semantic-memory.d.ts +33 -0
  83. package/dist/memory-layers 2/semantic-memory.d.ts.map +1 -0
  84. package/dist/memory-layers 2/semantic-memory.js +114 -0
  85. package/dist/memory-layers 2/semantic-memory.js.map +1 -0
  86. package/dist/memory-layers 2/skill-library.d.ts +25 -0
  87. package/dist/memory-layers 2/skill-library.d.ts.map +1 -0
  88. package/dist/memory-layers 2/skill-library.js +54 -0
  89. package/dist/memory-layers 2/skill-library.js.map +1 -0
  90. package/dist/memory-layers 2/working-memory.d.ts +57 -0
  91. package/dist/memory-layers 2/working-memory.d.ts.map +1 -0
  92. package/dist/memory-layers 2/working-memory.js +153 -0
  93. package/dist/memory-layers 2/working-memory.js.map +1 -0
  94. package/dist/middleware/auth.d.ts +287 -0
  95. package/dist/middleware/auth.d.ts.map +1 -0
  96. package/dist/middleware/auth.js +610 -0
  97. package/dist/middleware/auth.js.map +1 -0
  98. package/dist/middleware 2/auth.d.ts +287 -0
  99. package/dist/middleware 2/auth.d.ts.map +1 -0
  100. package/dist/middleware 2/auth.js +610 -0
  101. package/dist/middleware 2/auth.js.map +1 -0
  102. package/dist/monitoring/health.d.ts +241 -0
  103. package/dist/monitoring/health.d.ts.map +1 -0
  104. package/dist/monitoring/health.js +649 -0
  105. package/dist/monitoring/health.js.map +1 -0
  106. package/dist/monitoring/metrics.d.ts +153 -0
  107. package/dist/monitoring/metrics.d.ts.map +1 -0
  108. package/dist/monitoring/metrics.js +349 -0
  109. package/dist/monitoring/metrics.js.map +1 -0
  110. package/dist/monitoring 2/health.d.ts +241 -0
  111. package/dist/monitoring 2/health.d.ts.map +1 -0
  112. package/dist/monitoring 2/health.js +649 -0
  113. package/dist/monitoring 2/health.js.map +1 -0
  114. package/dist/monitoring 2/metrics.d.ts +153 -0
  115. package/dist/monitoring 2/metrics.d.ts.map +1 -0
  116. package/dist/monitoring 2/metrics.js +349 -0
  117. package/dist/monitoring 2/metrics.js.map +1 -0
  118. package/dist/retrieval/hybrid-search.d.ts +186 -0
  119. package/dist/retrieval/hybrid-search.d.ts.map +1 -0
  120. package/dist/retrieval/hybrid-search.js +330 -0
  121. package/dist/retrieval/hybrid-search.js.map +1 -0
  122. package/dist/retrieval 2/hybrid-search.d.ts +186 -0
  123. package/dist/retrieval 2/hybrid-search.d.ts.map +1 -0
  124. package/dist/retrieval 2/hybrid-search.js +327 -0
  125. package/dist/retrieval 2/hybrid-search.js.map +1 -0
  126. package/dist/router/smart-router.d.ts +157 -0
  127. package/dist/router/smart-router.d.ts.map +1 -0
  128. package/dist/router/smart-router.js +524 -0
  129. package/dist/router/smart-router.js.map +1 -0
  130. package/dist/router 2/smart-router.d.ts +111 -0
  131. package/dist/router 2/smart-router.d.ts.map +1 -0
  132. package/dist/router 2/smart-router.js +383 -0
  133. package/dist/router 2/smart-router.js.map +1 -0
  134. package/dist/security/rate-limit-middleware.d.ts +119 -0
  135. package/dist/security/rate-limit-middleware.d.ts.map +1 -0
  136. package/dist/security/rate-limit-middleware.js +193 -0
  137. package/dist/security/rate-limit-middleware.js.map +1 -0
  138. package/dist/security 2/rate-limit-middleware.d.ts +119 -0
  139. package/dist/security 2/rate-limit-middleware.d.ts.map +1 -0
  140. package/dist/security 2/rate-limit-middleware.js +193 -0
  141. package/dist/security 2/rate-limit-middleware.js.map +1 -0
  142. package/dist/server 2.js +861 -0
  143. package/dist/server-wrapper 2.js +170 -0
  144. package/dist/server-wrapper.d 2.ts +12 -0
  145. package/dist/server-wrapper.d.ts +12 -0
  146. package/dist/server-wrapper.d.ts 2.map +1 -0
  147. package/dist/server-wrapper.d.ts.map +1 -0
  148. package/dist/server-wrapper.js +170 -0
  149. package/dist/server-wrapper.js 2.map +1 -0
  150. package/dist/server-wrapper.js.map +1 -0
  151. package/dist/server.d 2.ts +14 -0
  152. package/dist/server.d.ts +14 -0
  153. package/dist/server.d.ts 2.map +1 -0
  154. package/dist/server.d.ts.map +1 -0
  155. package/dist/server.js +656 -0
  156. package/dist/server.js 2.map +1 -0
  157. package/dist/server.js.map +1 -0
  158. package/dist/synthesis/conflict-detector.d.ts +43 -0
  159. package/dist/synthesis/conflict-detector.d.ts.map +1 -0
  160. package/dist/synthesis/conflict-detector.js +125 -0
  161. package/dist/synthesis/conflict-detector.js.map +1 -0
  162. package/dist/synthesis 2/conflict-detector.d.ts +43 -0
  163. package/dist/synthesis 2/conflict-detector.d.ts.map +1 -0
  164. package/dist/synthesis 2/conflict-detector.js +125 -0
  165. package/dist/synthesis 2/conflict-detector.js.map +1 -0
  166. package/dist/utils/monitoring.d.ts +25 -0
  167. package/dist/utils/monitoring.d.ts.map +1 -0
  168. package/dist/utils/monitoring.js +41 -0
  169. package/dist/utils/monitoring.js.map +1 -0
  170. package/dist/utils/rate-limiter.d.ts +97 -0
  171. package/dist/utils/rate-limiter.d.ts.map +1 -0
  172. package/dist/utils/rate-limiter.js +166 -0
  173. package/dist/utils/rate-limiter.js.map +1 -0
  174. package/dist/utils/validation.d.ts +139 -0
  175. package/dist/utils/validation.d.ts.map +1 -0
  176. package/dist/utils/validation.js +195 -0
  177. package/dist/utils/validation.js.map +1 -0
  178. package/dist/utils 2/monitoring.d.ts +25 -0
  179. package/dist/utils 2/monitoring.d.ts.map +1 -0
  180. package/dist/utils 2/monitoring.js +41 -0
  181. package/dist/utils 2/monitoring.js.map +1 -0
  182. package/dist/utils 2/rate-limiter.d.ts +97 -0
  183. package/dist/utils 2/rate-limiter.d.ts.map +1 -0
  184. package/dist/utils 2/rate-limiter.js +166 -0
  185. package/dist/utils 2/rate-limiter.js.map +1 -0
  186. package/dist/utils 2/validation.d.ts +139 -0
  187. package/dist/utils 2/validation.d.ts.map +1 -0
  188. package/dist/utils 2/validation.js +195 -0
  189. package/dist/utils 2/validation.js.map +1 -0
  190. package/docker-compose.yml +65 -0
  191. package/embedding-service/Dockerfile +29 -0
  192. package/embedding-service/README.md +68 -0
  193. package/embedding-service/requirements.txt +6 -0
  194. package/embedding-service/server.py +110 -0
  195. package/package.json +92 -0
  196. package/scripts/FRESH_INSTALL.md +280 -0
  197. package/scripts/README.md +101 -0
  198. package/scripts/ensure-infrastructure.sh +38 -0
  199. package/scripts/fresh-install-auto.sh +96 -0
  200. package/scripts/fresh-install.sh +167 -0
  201. package/scripts/health-check.sh +72 -0
  202. package/scripts/init-qdrant.ts +201 -0
  203. package/scripts/postinstall.js +94 -0
  204. package/scripts/run-accuracy-benchmark.ts +1237 -0
  205. package/scripts/run-real-benchmark.ts +581 -0
  206. package/scripts/test-mcp-server.sh +38 -0
@@ -0,0 +1,231 @@
1
+ /**
2
+ * Semantic Memory Layer - v3.0 Implementation
3
+ *
4
+ * SQLite knowledge graph with HippoRAG Personalized PageRank.
5
+ */
6
+ export class SemanticMemoryLayer {
7
+ db;
8
+ constructor(db) {
9
+ this.db = db;
10
+ }
11
+ upsertEntity(entity) {
12
+ if (!entity.name || entity.name.trim() === '') {
13
+ throw new Error('Entity name cannot be empty');
14
+ }
15
+ const existing = this.db.prepare('SELECT * FROM entities WHERE name = ? AND type = ?').get(entity.name, entity.type);
16
+ if (existing) {
17
+ this.db.prepare('UPDATE entities SET last_accessed = ?, access_count = access_count + 1 WHERE id = ?').run(new Date().toISOString(), existing.id);
18
+ return existing;
19
+ }
20
+ const id = 'entity_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
21
+ const now = new Date().toISOString();
22
+ this.db.prepare(`
23
+ INSERT INTO entities (id, name, type, description, confidence, created_at, last_accessed, access_count)
24
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
25
+ `).run(id, entity.name, entity.type, entity.description || null, entity.confidence || 1.0, now, now, 1);
26
+ return {
27
+ id,
28
+ name: entity.name,
29
+ type: entity.type,
30
+ description: entity.description,
31
+ confidence: entity.confidence || 1.0
32
+ };
33
+ }
34
+ getEntity(name) {
35
+ const result = this.db.prepare('SELECT * FROM entities WHERE name = ? ORDER BY confidence DESC LIMIT 1').get(name);
36
+ if (result) {
37
+ this.db.prepare('UPDATE entities SET last_accessed = ?, access_count = access_count + 1 WHERE id = ?').run(new Date().toISOString(), result.id);
38
+ }
39
+ return result || null;
40
+ }
41
+ upsertRelationship(rel) {
42
+ const existing = this.db.prepare('SELECT * FROM relationships WHERE source_id = ? AND target_id = ? AND relation_type = ?').get(rel.sourceId, rel.targetId, rel.relationType);
43
+ const now = new Date().toISOString();
44
+ if (existing) {
45
+ const newStrength = Math.min(1.0, existing.strength + 0.2);
46
+ this.db.prepare('UPDATE relationships SET strength = ?, last_reinforced = ? WHERE id = ?').run(newStrength, now, existing.id);
47
+ return;
48
+ }
49
+ const id = 'rel_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
50
+ this.db.prepare(`
51
+ INSERT INTO relationships (id, source_id, target_id, relation_type, strength, evidence, created_at, last_reinforced)
52
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
53
+ `).run(id, rel.sourceId, rel.targetId, rel.relationType, rel.strength || 0.8, '[]', now, now);
54
+ }
55
+ personalizedPageRank(entityId, depth = 3) {
56
+ const visited = new Set();
57
+ const results = [];
58
+ let currentLayer = [{ entityId, score: 1.0 }];
59
+ for (let d = 0; d < depth && currentLayer.length > 0; d++) {
60
+ const nextLayer = [];
61
+ for (const node of currentLayer) {
62
+ if (visited.has(node.entityId))
63
+ continue;
64
+ visited.add(node.entityId);
65
+ const entity = this.db.prepare('SELECT * FROM entities WHERE id = ?').get(node.entityId);
66
+ if (entity)
67
+ results.push({ ...entity, relevanceScore: node.score });
68
+ const rels = this.db.prepare('SELECT * FROM relationships WHERE source_id = ? OR target_id = ?').all(node.entityId, node.entityId);
69
+ for (const rel of rels) {
70
+ const nextId = rel.source_id === node.entityId ? rel.target_id : rel.source_id;
71
+ const score = node.score * rel.strength * 0.7;
72
+ if (!visited.has(nextId) && score > 0.1) {
73
+ nextLayer.push({ entityId: nextId, score });
74
+ }
75
+ }
76
+ }
77
+ currentLayer = nextLayer;
78
+ }
79
+ return results.sort((a, b) => b.relevanceScore - a.relevanceScore);
80
+ }
81
+ /**
82
+ * Enhanced Personalized PageRank with fact retrieval for multi-hop reasoning.
83
+ *
84
+ * Returns both entities AND their associated facts along the traversal path,
85
+ * enabling multi-hop query answering (e.g., "What protocol does Vesper follow?"
86
+ * can chain Vesper -> MCP -> "Model Context Protocol").
87
+ *
88
+ * @param entityId - Starting entity ID for traversal
89
+ * @param depth - Maximum hops to traverse (default: 3 for multi-hop queries)
90
+ * @returns PageRankWithFactsResult containing entities, facts, paths, and chains
91
+ */
92
+ personalizedPageRankWithFacts(entityId, depth = 3) {
93
+ const visited = new Set();
94
+ const entities = [];
95
+ const allFacts = [];
96
+ const paths = [];
97
+ const chains = [];
98
+ // Track paths for explainability: entityId -> { path: string[], hops: number }
99
+ const pathTracker = new Map();
100
+ // BFS with score propagation
101
+ let currentLayer = [{
102
+ entityId,
103
+ score: 1.0,
104
+ path: [entityId],
105
+ depth: 0,
106
+ lastRelationType: 'start'
107
+ }];
108
+ // Check if starting entity exists
109
+ const startEntity = this.db.prepare('SELECT * FROM entities WHERE id = ?').get(entityId);
110
+ if (!startEntity) {
111
+ return { entities: [], facts: [], paths: [], chains: [] };
112
+ }
113
+ for (let d = 0; d <= depth && currentLayer.length > 0; d++) {
114
+ const nextLayer = [];
115
+ for (const node of currentLayer) {
116
+ if (visited.has(node.entityId))
117
+ continue;
118
+ visited.add(node.entityId);
119
+ // Get entity
120
+ const entity = this.db.prepare('SELECT * FROM entities WHERE id = ?').get(node.entityId);
121
+ if (entity) {
122
+ entities.push({ ...entity, relevanceScore: node.score });
123
+ // Get facts for this entity (valid facts only)
124
+ const entityFacts = this.db.prepare(`
125
+ SELECT * FROM facts
126
+ WHERE entity_id = ?
127
+ AND (valid_until IS NULL OR valid_until > datetime('now'))
128
+ ORDER BY confidence DESC
129
+ `).all(node.entityId);
130
+ allFacts.push(...entityFacts);
131
+ // Track path if not the starting node
132
+ if (node.depth > 0) {
133
+ pathTracker.set(node.entityId, {
134
+ path: node.path,
135
+ hops: node.depth,
136
+ relationType: node.lastRelationType
137
+ });
138
+ paths.push({
139
+ sourceId: entityId,
140
+ targetId: node.entityId,
141
+ hops: node.depth,
142
+ path: node.path,
143
+ relationType: node.lastRelationType
144
+ });
145
+ // Build chain info for inference
146
+ if (node.path.length > 2) {
147
+ const intermediaryIds = node.path.slice(1, -1);
148
+ const intermediaryNames = [];
149
+ for (const interId of intermediaryIds) {
150
+ const interEntity = this.db.prepare('SELECT name FROM entities WHERE id = ?').get(interId);
151
+ if (interEntity) {
152
+ intermediaryNames.push(interEntity.name);
153
+ }
154
+ }
155
+ chains.push({
156
+ targetId: node.entityId,
157
+ targetName: entity.name,
158
+ intermediaries: intermediaryNames,
159
+ totalScore: node.score
160
+ });
161
+ }
162
+ }
163
+ }
164
+ // Continue only if we have more depth to traverse
165
+ if (d < depth) {
166
+ const rels = this.db.prepare('SELECT * FROM relationships WHERE source_id = ? OR target_id = ?').all(node.entityId, node.entityId);
167
+ for (const rel of rels) {
168
+ const nextId = rel.source_id === node.entityId ? rel.target_id : rel.source_id;
169
+ const score = node.score * rel.strength * 0.7;
170
+ // Lower threshold for multi-hop to ensure we reach deeper nodes
171
+ if (!visited.has(nextId) && score > 0.05) {
172
+ nextLayer.push({
173
+ entityId: nextId,
174
+ score,
175
+ path: [...node.path, nextId],
176
+ depth: node.depth + 1,
177
+ lastRelationType: rel.relation_type
178
+ });
179
+ }
180
+ }
181
+ }
182
+ }
183
+ currentLayer = nextLayer;
184
+ }
185
+ // Sort entities by relevance score
186
+ entities.sort((a, b) => b.relevanceScore - a.relevanceScore);
187
+ // Sort facts by confidence
188
+ allFacts.sort((a, b) => b.confidence - a.confidence);
189
+ // Deduplicate facts (same fact might be reached via different paths)
190
+ const uniqueFacts = allFacts.filter((fact, index, self) => index === self.findIndex(f => f.id === fact.id));
191
+ return {
192
+ entities,
193
+ facts: uniqueFacts,
194
+ paths,
195
+ chains: chains.length > 0 ? chains : undefined
196
+ };
197
+ }
198
+ applyTemporalDecay() {
199
+ const relationships = this.db.prepare('SELECT * FROM relationships').all();
200
+ let updated = 0;
201
+ for (const rel of relationships) {
202
+ const daysSince = (Date.now() - new Date(rel.last_reinforced).getTime()) / (1000 * 60 * 60 * 24);
203
+ const newStrength = rel.strength * Math.exp(-daysSince / 30);
204
+ // Just update strength, pruning happens later in consolidation
205
+ this.db.prepare('UPDATE relationships SET strength = ? WHERE id = ?').run(newStrength, rel.id);
206
+ updated++;
207
+ }
208
+ return updated;
209
+ }
210
+ getPreferences(domain) {
211
+ if (domain) {
212
+ return this.db.prepare('SELECT * FROM entities WHERE type = ? AND (name LIKE ? OR description LIKE ?)').all('preference', `%${domain}%`, `%${domain}%`);
213
+ }
214
+ return this.db.prepare('SELECT * FROM entities WHERE type = ?').all('preference');
215
+ }
216
+ getByTimeRange(start, end) {
217
+ let query = 'SELECT * FROM entities WHERE 1=1';
218
+ const params = [];
219
+ if (start) {
220
+ query += ' AND created_at >= ?';
221
+ params.push(start.toISOString());
222
+ }
223
+ if (end) {
224
+ query += ' AND created_at <= ?';
225
+ params.push(end.toISOString());
226
+ }
227
+ query += ' ORDER BY created_at DESC LIMIT 20';
228
+ return this.db.prepare(query).all(...params);
229
+ }
230
+ }
231
+ //# sourceMappingURL=semantic-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-memory.js","sourceRoot":"","sources":["../../src/memory-layers/semantic-memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Skill Library - v3.0 Voyager-Style Implementation
3
+ *
4
+ * Procedural memory: reusable patterns learned from conversations.
5
+ */
6
+ import Database from 'better-sqlite3';
7
+ export interface Skill {
8
+ id: string;
9
+ name: string;
10
+ description: string;
11
+ category: string;
12
+ triggers: string[];
13
+ successCount: number;
14
+ failureCount: number;
15
+ avgSatisfaction: number;
16
+ }
17
+ export declare class SkillLibrary {
18
+ private db;
19
+ constructor(db: Database.Database);
20
+ addSkill(skill: Omit<Skill, 'id' | 'successCount' | 'failureCount' | 'avgSatisfaction'>): string;
21
+ search(query: string, limit?: number): Skill[];
22
+ recordSuccess(skillId: string, satisfaction: number): void;
23
+ recordFailure(skillId: string): void;
24
+ }
25
+ //# sourceMappingURL=skill-library.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-library.d.ts","sourceRoot":"","sources":["../../src/memory-layers/skill-library.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,EAAE,CAAoB;gBAElB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,cAAc,GAAG,cAAc,GAAG,iBAAiB,CAAC,GAAG,MAAM;IAiBhG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,KAAK,EAAE;IAkCjD,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAY1D,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAGrC"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Skill Library - v3.0 Voyager-Style Implementation
3
+ *
4
+ * Procedural memory: reusable patterns learned from conversations.
5
+ */
6
+ export class SkillLibrary {
7
+ db;
8
+ constructor(db) {
9
+ this.db = db;
10
+ }
11
+ addSkill(skill) {
12
+ const id = 'skill_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
13
+ this.db.prepare(`
14
+ INSERT INTO skills (id, name, description, category, triggers, success_count, failure_count, avg_user_satisfaction)
15
+ VALUES (?, ?, ?, ?, ?, 0, 0, 0.5)
16
+ `).run(id, skill.name, skill.description, skill.category, JSON.stringify(skill.triggers));
17
+ return id;
18
+ }
19
+ search(query, limit = 5) {
20
+ const queryLower = query.toLowerCase();
21
+ const skills = this.db.prepare('SELECT * FROM skills ORDER BY avg_user_satisfaction DESC, success_count DESC').all();
22
+ const scored = skills
23
+ .map(skill => {
24
+ const triggers = JSON.parse(skill.triggers || '[]');
25
+ const matchScore = triggers.some((t) => queryLower.includes(t.toLowerCase()) || t.toLowerCase().includes(queryLower)) ? 1 : 0;
26
+ const nameMatch = skill.name.toLowerCase().includes(queryLower) ? 0.5 : 0;
27
+ return {
28
+ id: skill.id,
29
+ name: skill.name,
30
+ description: skill.description,
31
+ category: skill.category,
32
+ triggers,
33
+ successCount: skill.success_count,
34
+ failureCount: skill.failure_count,
35
+ avgSatisfaction: skill.avg_user_satisfaction,
36
+ score: matchScore + nameMatch
37
+ };
38
+ })
39
+ .filter(s => s.score > 0)
40
+ .sort((a, b) => b.score - a.score);
41
+ return scored.slice(0, limit);
42
+ }
43
+ recordSuccess(skillId, satisfaction) {
44
+ const skill = this.db.prepare('SELECT * FROM skills WHERE id = ?').get(skillId);
45
+ if (skill) {
46
+ const newAvg = (skill.avg_user_satisfaction * skill.success_count + satisfaction) / (skill.success_count + 1);
47
+ this.db.prepare('UPDATE skills SET success_count = success_count + 1, avg_user_satisfaction = ? WHERE id = ?').run(newAvg, skillId);
48
+ }
49
+ }
50
+ recordFailure(skillId) {
51
+ this.db.prepare('UPDATE skills SET failure_count = failure_count + 1 WHERE id = ?').run(skillId);
52
+ }
53
+ }
54
+ //# sourceMappingURL=skill-library.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-library.js","sourceRoot":"","sources":["../../src/memory-layers/skill-library.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Working Memory Layer - v3.0 Implementation
3
+ *
4
+ * Redis-based cache for last 5 conversations with 7-day TTL.
5
+ * Simple but effective - instant recall for recent context.
6
+ */
7
+ import { Redis } from 'ioredis';
8
+ export interface WorkingMemory {
9
+ conversationId: string;
10
+ timestamp: Date;
11
+ fullText: string;
12
+ embedding?: number[];
13
+ keyEntities: string[];
14
+ topics: string[];
15
+ userIntent: string;
16
+ }
17
+ export declare class WorkingMemoryLayer {
18
+ private redis;
19
+ private readonly MAX_CONVERSATIONS;
20
+ private readonly TTL_DAYS;
21
+ constructor(redis: Redis, maxConversations?: number);
22
+ store(memory: WorkingMemory): Promise<void>;
23
+ search(query: string, limit?: number): Promise<Array<{
24
+ memory: WorkingMemory;
25
+ similarity: number;
26
+ }>>;
27
+ getRecent(limit?: number): Promise<WorkingMemory[]>;
28
+ getAll(limit?: number): Promise<WorkingMemory[]>;
29
+ get(conversationId: string): Promise<WorkingMemory | null>;
30
+ delete(conversationId: string): Promise<void>;
31
+ searchByEntities(entities: string[], limit?: number): Promise<Array<{
32
+ memory: WorkingMemory;
33
+ similarity: number;
34
+ matchedEntities: string[];
35
+ }>>;
36
+ searchByTopics(topics: string[], limit?: number): Promise<Array<{
37
+ memory: WorkingMemory;
38
+ similarity: number;
39
+ matchedTopics: string[];
40
+ }>>;
41
+ getStats(): Promise<{
42
+ totalConversations: number;
43
+ oldestConversation: Date | null;
44
+ newestConversation: Date | null;
45
+ totalTextSize: number;
46
+ }>;
47
+ /**
48
+ * Clear all working memory entries
49
+ *
50
+ * Uses SCAN instead of KEYS to avoid blocking Redis server.
51
+ * Deletes keys in batches to prevent memory exhaustion.
52
+ *
53
+ * Security: Prevents DoS attacks on Redis
54
+ */
55
+ clear(): Promise<void>;
56
+ }
57
+ //# sourceMappingURL=working-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-memory.d.ts","sourceRoot":"","sources":["../../src/memory-layers/working-memory.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,WAAW,aAAa;IAC5B,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,IAAI,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAK;gBAElB,KAAK,EAAE,KAAK,EAAE,gBAAgB,GAAE,MAAU;IAKhD,KAAK,CAAC,MAAM,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAwBvG,SAAS,CAAC,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAYtD,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAIhD,GAAG,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAK1D,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAsBjJ,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,MAAU,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAsB3I,QAAQ,IAAI,OAAO,CAAC;QACxB,kBAAkB,EAAE,MAAM,CAAC;QAC3B,kBAAkB,EAAE,IAAI,GAAG,IAAI,CAAC;QAChC,kBAAkB,EAAE,IAAI,GAAG,IAAI,CAAC;QAChC,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IA6BF;;;;;;;OAOG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAwB7B"}
@@ -0,0 +1,153 @@
1
+ /**
2
+ * Working Memory Layer - v3.0 Implementation
3
+ *
4
+ * Redis-based cache for last 5 conversations with 7-day TTL.
5
+ * Simple but effective - instant recall for recent context.
6
+ */
7
+ export class WorkingMemoryLayer {
8
+ redis;
9
+ MAX_CONVERSATIONS;
10
+ TTL_DAYS = 7;
11
+ constructor(redis, maxConversations = 5) {
12
+ this.redis = redis;
13
+ this.MAX_CONVERSATIONS = maxConversations;
14
+ }
15
+ async store(memory) {
16
+ const key = `working:${memory.conversationId}`;
17
+ const ttl = this.TTL_DAYS * 24 * 60 * 60;
18
+ await this.redis.setex(key, ttl, JSON.stringify(memory));
19
+ await this.redis.lpush('working:recent', memory.conversationId);
20
+ // Get IDs that will be evicted (beyond MAX_CONVERSATIONS)
21
+ const allIds = await this.redis.lrange('working:recent', 0, -1);
22
+ const toEvict = allIds.slice(this.MAX_CONVERSATIONS);
23
+ await this.redis.ltrim('working:recent', 0, this.MAX_CONVERSATIONS - 1);
24
+ // Delete evicted conversation data
25
+ for (const id of toEvict) {
26
+ await this.redis.del(`working:${id}`);
27
+ }
28
+ }
29
+ async search(query, limit = 3) {
30
+ const recentIds = await this.redis.lrange('working:recent', 0, this.MAX_CONVERSATIONS - 1);
31
+ const results = [];
32
+ const queryLower = query.toLowerCase();
33
+ const queryWords = queryLower.split(/\s+/);
34
+ for (const id of recentIds) {
35
+ const data = await this.redis.get(`working:${id}`);
36
+ if (!data)
37
+ continue;
38
+ const memory = JSON.parse(data);
39
+ const textLower = memory.fullText.toLowerCase();
40
+ const matchCount = queryWords.filter(word => textLower.includes(word)).length;
41
+ const similarity = matchCount / queryWords.length;
42
+ if (similarity > 0.3) {
43
+ results.push({ memory, similarity });
44
+ }
45
+ }
46
+ return results.sort((a, b) => b.similarity - a.similarity).slice(0, limit);
47
+ }
48
+ async getRecent(limit = 5) {
49
+ const recentIds = await this.redis.lrange('working:recent', 0, limit - 1);
50
+ const memories = [];
51
+ for (const id of recentIds) {
52
+ const data = await this.redis.get(`working:${id}`);
53
+ if (data)
54
+ memories.push(JSON.parse(data));
55
+ }
56
+ return memories;
57
+ }
58
+ async getAll(limit) {
59
+ return this.getRecent(limit || this.MAX_CONVERSATIONS);
60
+ }
61
+ async get(conversationId) {
62
+ const data = await this.redis.get(`working:${conversationId}`);
63
+ return data ? JSON.parse(data) : null;
64
+ }
65
+ async delete(conversationId) {
66
+ await this.redis.del(`working:${conversationId}`);
67
+ await this.redis.lrem('working:recent', 1, conversationId);
68
+ }
69
+ async searchByEntities(entities, limit = 3) {
70
+ const recentIds = await this.redis.lrange('working:recent', 0, this.MAX_CONVERSATIONS - 1);
71
+ const results = [];
72
+ for (const id of recentIds) {
73
+ const data = await this.redis.get(`working:${id}`);
74
+ if (!data)
75
+ continue;
76
+ const memory = JSON.parse(data);
77
+ const matchedEntities = entities.filter(entity => memory.keyEntities.some(ke => ke.toLowerCase() === entity.toLowerCase()));
78
+ const similarity = matchedEntities.length / entities.length;
79
+ if (similarity > 0) {
80
+ results.push({ memory, similarity, matchedEntities });
81
+ }
82
+ }
83
+ return results.sort((a, b) => b.similarity - a.similarity).slice(0, limit);
84
+ }
85
+ async searchByTopics(topics, limit = 3) {
86
+ const recentIds = await this.redis.lrange('working:recent', 0, this.MAX_CONVERSATIONS - 1);
87
+ const results = [];
88
+ for (const id of recentIds) {
89
+ const data = await this.redis.get(`working:${id}`);
90
+ if (!data)
91
+ continue;
92
+ const memory = JSON.parse(data);
93
+ const matchedTopics = topics.filter(topic => memory.topics.some(t => t.toLowerCase() === topic.toLowerCase()));
94
+ const similarity = matchedTopics.length / topics.length;
95
+ if (similarity > 0) {
96
+ results.push({ memory, similarity, matchedTopics });
97
+ }
98
+ }
99
+ return results.sort((a, b) => b.similarity - a.similarity).slice(0, limit);
100
+ }
101
+ async getStats() {
102
+ const recentIds = await this.redis.lrange('working:recent', 0, this.MAX_CONVERSATIONS - 1);
103
+ const memories = [];
104
+ for (const id of recentIds) {
105
+ const data = await this.redis.get(`working:${id}`);
106
+ if (data)
107
+ memories.push(JSON.parse(data));
108
+ }
109
+ if (memories.length === 0) {
110
+ return {
111
+ totalConversations: 0,
112
+ oldestConversation: null,
113
+ newestConversation: null,
114
+ totalTextSize: 0
115
+ };
116
+ }
117
+ const timestamps = memories.map(m => new Date(m.timestamp));
118
+ const totalTextSize = memories.reduce((sum, m) => sum + m.fullText.length, 0);
119
+ return {
120
+ totalConversations: memories.length,
121
+ oldestConversation: new Date(Math.min(...timestamps.map(d => d.getTime()))),
122
+ newestConversation: new Date(Math.max(...timestamps.map(d => d.getTime()))),
123
+ totalTextSize
124
+ };
125
+ }
126
+ /**
127
+ * Clear all working memory entries
128
+ *
129
+ * Uses SCAN instead of KEYS to avoid blocking Redis server.
130
+ * Deletes keys in batches to prevent memory exhaustion.
131
+ *
132
+ * Security: Prevents DoS attacks on Redis
133
+ */
134
+ async clear() {
135
+ let cursor = '0';
136
+ const keysToDelete = [];
137
+ // Use SCAN to iterate through keys without blocking
138
+ do {
139
+ const [nextCursor, keys] = await this.redis.scan(cursor, 'MATCH', 'working:*', 'COUNT', 100);
140
+ cursor = nextCursor;
141
+ keysToDelete.push(...keys);
142
+ } while (cursor !== '0');
143
+ // Delete in batches to avoid memory issues
144
+ const BATCH_SIZE = 100;
145
+ for (let i = 0; i < keysToDelete.length; i += BATCH_SIZE) {
146
+ const batch = keysToDelete.slice(i, i + BATCH_SIZE);
147
+ if (batch.length > 0) {
148
+ await this.redis.del(...batch);
149
+ }
150
+ }
151
+ }
152
+ }
153
+ //# sourceMappingURL=working-memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"working-memory.js","sourceRoot":"","sources":["../../src/memory-layers/working-memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Semantic Memory Layer - v3.0 Implementation
3
+ *
4
+ * SQLite knowledge graph with HippoRAG Personalized PageRank.
5
+ */
6
+ import Database from 'better-sqlite3';
7
+ export interface Entity {
8
+ id: string;
9
+ name: string;
10
+ type: 'person' | 'project' | 'concept' | 'preference';
11
+ description?: string;
12
+ confidence: number;
13
+ }
14
+ export declare class SemanticMemoryLayer {
15
+ private db;
16
+ constructor(db: Database.Database);
17
+ upsertEntity(entity: Partial<Entity> & {
18
+ name: string;
19
+ type: string;
20
+ }): Entity;
21
+ getEntity(name: string): any | null;
22
+ upsertRelationship(rel: {
23
+ sourceId: string;
24
+ targetId: string;
25
+ relationType: string;
26
+ strength?: number;
27
+ }): void;
28
+ personalizedPageRank(entityId: string, depth?: number): any[];
29
+ applyTemporalDecay(): number;
30
+ getPreferences(domain?: string): any[];
31
+ getByTimeRange(start?: Date, end?: Date): any[];
32
+ }
33
+ //# sourceMappingURL=semantic-memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semantic-memory.d.ts","sourceRoot":"","sources":["../../src/memory-layers/semantic-memory.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,QAAQ,MAAM,gBAAgB,CAAC;AAEtC,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,EAAE,CAAoB;gBAElB,EAAE,EAAE,QAAQ,CAAC,QAAQ;IAIjC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM;IAiC9E,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI;IAcnC,kBAAkB,CAAC,GAAG,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAuB9G,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,GAAG,EAAE;IAmChE,kBAAkB,IAAI,MAAM;IAgB5B,cAAc,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG,EAAE;IAStC,cAAc,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG,GAAG,EAAE;CAgBhD"}