vesper-memory 0.4.0 → 0.5.1
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 +57 -3
- package/LICENSE +59 -0
- package/README.md +420 -23
- package/config/migrations/001_add_skill_summary.sql +75 -0
- package/config/migrations/001_rollback_skill_summary.sql +60 -0
- package/config/sqlite-schema.sql +68 -4
- package/dist/benchmark/types.d.ts +4 -4
- package/dist/cli.js +0 -0
- package/dist/consolidation/pipeline.d.ts +6 -1
- package/dist/consolidation/pipeline.d.ts.map +1 -1
- package/dist/consolidation/pipeline.js +53 -35
- package/dist/consolidation/pipeline.js.map +1 -1
- package/dist/memory-layers/semantic-memory.d.ts +9 -19
- package/dist/memory-layers/semantic-memory.d.ts.map +1 -1
- package/dist/memory-layers/semantic-memory.js +31 -54
- package/dist/memory-layers/semantic-memory.js.map +1 -1
- package/dist/memory-layers/skill-lazy-loading.d.ts +160 -0
- package/dist/memory-layers/skill-lazy-loading.d.ts.map +1 -0
- package/dist/memory-layers/skill-lazy-loading.js +247 -0
- package/dist/memory-layers/skill-lazy-loading.js.map +1 -0
- package/dist/memory-layers/skill-library.d.ts +133 -4
- package/dist/memory-layers/skill-library.d.ts.map +1 -1
- package/dist/memory-layers/skill-library.js +427 -8
- package/dist/memory-layers/skill-library.js.map +1 -1
- package/dist/memory-layers/working-memory.d.ts +35 -14
- package/dist/memory-layers/working-memory.d.ts.map +1 -1
- package/dist/memory-layers/working-memory.js +114 -36
- package/dist/memory-layers/working-memory.js.map +1 -1
- package/dist/retrieval/hybrid-search.d.ts +2 -2
- package/dist/retrieval/hybrid-search.d.ts.map +1 -1
- package/dist/retrieval/hybrid-search.js +4 -3
- package/dist/retrieval/hybrid-search.js.map +1 -1
- package/dist/router/smart-router.d.ts +25 -0
- package/dist/router/smart-router.d.ts.map +1 -1
- package/dist/router/smart-router.js +90 -10
- package/dist/router/smart-router.js.map +1 -1
- package/dist/scheduler/consolidation-scheduler.d.ts +129 -0
- package/dist/scheduler/consolidation-scheduler.d.ts.map +1 -0
- package/dist/scheduler/consolidation-scheduler.js +179 -0
- package/dist/scheduler/consolidation-scheduler.js.map +1 -0
- package/dist/scheduler/index.d.ts +7 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +7 -0
- package/dist/scheduler/index.js.map +1 -0
- package/dist/server-wrapper.js +0 -0
- package/dist/server.js +879 -28
- package/dist/server.js.map +1 -1
- package/dist/synthesis/conflict-detector.d.ts +4 -6
- package/dist/synthesis/conflict-detector.d.ts.map +1 -1
- package/dist/synthesis/conflict-detector.js +19 -21
- package/dist/synthesis/conflict-detector.js.map +1 -1
- package/dist/utils/validation.d.ts +123 -1
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +146 -7
- package/dist/utils/validation.js.map +1 -1
- package/docker-compose.yml +6 -6
- package/embedding-service/README.md +8 -0
- package/package.json +5 -2
- package/scripts/FRESH_INSTALL.md +1 -1
- package/scripts/ensure-infrastructure.sh +86 -26
- package/scripts/health-check.sh +2 -1
- package/scripts/stop-infrastructure.sh +23 -0
- package/scripts/test-mcp-server.sh +2 -1
|
@@ -2,23 +2,35 @@
|
|
|
2
2
|
* Skill Library - v3.0 Voyager-Style Implementation
|
|
3
3
|
*
|
|
4
4
|
* Procedural memory: reusable patterns learned from conversations.
|
|
5
|
+
* Includes RelationalSkillLibrary for geometric embeddings and analogical reasoning.
|
|
6
|
+
* Enhanced with lazy loading support for token efficiency.
|
|
5
7
|
*/
|
|
8
|
+
import { LazyLoadingSkillLibrary } from './skill-lazy-loading.js';
|
|
6
9
|
export class SkillLibrary {
|
|
7
10
|
db;
|
|
11
|
+
lazyLoader;
|
|
8
12
|
constructor(db) {
|
|
9
13
|
this.db = db;
|
|
14
|
+
this.lazyLoader = new LazyLoadingSkillLibrary(db);
|
|
10
15
|
}
|
|
11
|
-
addSkill(skill) {
|
|
16
|
+
addSkill(skill, namespace = 'default') {
|
|
12
17
|
const id = 'skill_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
|
|
18
|
+
// Generate summary from description (first sentence or 100 chars)
|
|
19
|
+
const summary = skill.description.length <= 100
|
|
20
|
+
? skill.description
|
|
21
|
+
: skill.description.substring(0, 97) + '...';
|
|
13
22
|
this.db.prepare(`
|
|
14
|
-
INSERT INTO skills (
|
|
15
|
-
|
|
16
|
-
|
|
23
|
+
INSERT INTO skills (
|
|
24
|
+
id, name, description, summary, category, triggers,
|
|
25
|
+
success_count, failure_count, avg_user_satisfaction, is_archived, namespace
|
|
26
|
+
)
|
|
27
|
+
VALUES (?, ?, ?, ?, ?, ?, 0, 0, 0.5, 0, ?)
|
|
28
|
+
`).run(id, skill.name, skill.description, summary, skill.category, JSON.stringify(skill.triggers), namespace);
|
|
17
29
|
return id;
|
|
18
30
|
}
|
|
19
|
-
search(query, limit = 5) {
|
|
31
|
+
search(query, limit = 5, namespace = 'default') {
|
|
20
32
|
const queryLower = query.toLowerCase();
|
|
21
|
-
const skills = this.db.prepare('SELECT * FROM skills ORDER BY avg_user_satisfaction DESC, success_count DESC').all();
|
|
33
|
+
const skills = this.db.prepare('SELECT * FROM skills WHERE namespace = ? ORDER BY avg_user_satisfaction DESC, success_count DESC').all(namespace);
|
|
22
34
|
const scored = skills
|
|
23
35
|
.map(skill => {
|
|
24
36
|
const triggers = JSON.parse(skill.triggers || '[]');
|
|
@@ -40,15 +52,422 @@ export class SkillLibrary {
|
|
|
40
52
|
.sort((a, b) => b.score - a.score);
|
|
41
53
|
return scored.slice(0, limit);
|
|
42
54
|
}
|
|
43
|
-
recordSuccess(skillId, satisfaction) {
|
|
55
|
+
recordSuccess(skillId, satisfaction, _namespace = 'default') {
|
|
44
56
|
const skill = this.db.prepare('SELECT * FROM skills WHERE id = ?').get(skillId);
|
|
45
57
|
if (skill) {
|
|
46
58
|
const newAvg = (skill.avg_user_satisfaction * skill.success_count + satisfaction) / (skill.success_count + 1);
|
|
47
59
|
this.db.prepare('UPDATE skills SET success_count = success_count + 1, avg_user_satisfaction = ? WHERE id = ?').run(newAvg, skillId);
|
|
48
60
|
}
|
|
49
61
|
}
|
|
50
|
-
recordFailure(skillId) {
|
|
62
|
+
recordFailure(skillId, _namespace = 'default') {
|
|
51
63
|
this.db.prepare('UPDATE skills SET failure_count = failure_count + 1 WHERE id = ?').run(skillId);
|
|
52
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Get database instance for subclasses
|
|
67
|
+
*/
|
|
68
|
+
getDb() {
|
|
69
|
+
return this.db;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Get skill summaries for lazy loading context injection
|
|
73
|
+
*
|
|
74
|
+
* Returns lightweight summaries (~50 tokens each) instead of full skills.
|
|
75
|
+
* This reduces token usage by 80-90% for skill-related context.
|
|
76
|
+
*
|
|
77
|
+
* @param limit - Maximum number of summaries (default: 20)
|
|
78
|
+
* @param category - Optional category filter
|
|
79
|
+
* @returns Array of SkillSummary objects
|
|
80
|
+
*/
|
|
81
|
+
getSummaries(limit = 20, category, namespace = 'default') {
|
|
82
|
+
return this.lazyLoader.getSummaries(limit, category, namespace);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Load full skill implementation on-demand
|
|
86
|
+
*
|
|
87
|
+
* Used when a skill is explicitly invoked and full details are needed.
|
|
88
|
+
* Results should be cached in working memory to avoid repeated loads.
|
|
89
|
+
*
|
|
90
|
+
* @param skillId - The skill ID to load
|
|
91
|
+
* @returns FullSkill object or null if not found
|
|
92
|
+
*/
|
|
93
|
+
loadFull(skillId, _namespace = 'default') {
|
|
94
|
+
const fullSkill = this.lazyLoader.loadFull(skillId);
|
|
95
|
+
// Update last_used timestamp when loading a skill
|
|
96
|
+
if (fullSkill) {
|
|
97
|
+
this.db.prepare(`
|
|
98
|
+
UPDATE skills
|
|
99
|
+
SET last_used = CURRENT_TIMESTAMP
|
|
100
|
+
WHERE id = ?
|
|
101
|
+
`).run(skillId);
|
|
102
|
+
}
|
|
103
|
+
return fullSkill;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Detect if a query is attempting to invoke a specific skill
|
|
107
|
+
*
|
|
108
|
+
* Uses pattern matching to identify skill invocations.
|
|
109
|
+
*
|
|
110
|
+
* @param query - The user query
|
|
111
|
+
* @returns InvocationDetection result with skill ID if detected
|
|
112
|
+
*/
|
|
113
|
+
detectInvocation(query, namespace = 'default') {
|
|
114
|
+
const summaries = this.getSummaries(100, undefined, namespace); // Get all summaries for matching
|
|
115
|
+
return this.lazyLoader.detectInvocation(query, summaries);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Update last_used timestamp for a skill
|
|
119
|
+
*
|
|
120
|
+
* Called when a skill is successfully executed.
|
|
121
|
+
*
|
|
122
|
+
* @param skillId - The skill ID
|
|
123
|
+
*/
|
|
124
|
+
updateLastUsed(skillId) {
|
|
125
|
+
this.db.prepare(`
|
|
126
|
+
UPDATE skills
|
|
127
|
+
SET last_used = CURRENT_TIMESTAMP
|
|
128
|
+
WHERE id = ?
|
|
129
|
+
`).run(skillId);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* RelationalSkillLibrary - Extended skill library with geometric embeddings
|
|
134
|
+
* and analogical reasoning capabilities.
|
|
135
|
+
*
|
|
136
|
+
* Features:
|
|
137
|
+
* - Skill embeddings for semantic similarity search
|
|
138
|
+
* - Co-occurrence tracking between skills
|
|
139
|
+
* - Relational vectors for analogical reasoning
|
|
140
|
+
* - Hybrid search combining trigger-based and embedding-based results
|
|
141
|
+
*/
|
|
142
|
+
export class RelationalSkillLibrary extends SkillLibrary {
|
|
143
|
+
embeddingClient;
|
|
144
|
+
constructor(db, embeddingClient) {
|
|
145
|
+
super(db);
|
|
146
|
+
this.embeddingClient = embeddingClient;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Construct pattern text from skill properties for embedding generation.
|
|
150
|
+
* Combines name, description, category, and triggers into a single text
|
|
151
|
+
* that captures the skill's semantic meaning.
|
|
152
|
+
*/
|
|
153
|
+
constructPatternText(skill) {
|
|
154
|
+
const parts = [];
|
|
155
|
+
parts.push(`Skill: ${skill.name}`);
|
|
156
|
+
parts.push(`Description: ${skill.description}`);
|
|
157
|
+
parts.push(`Category: ${skill.category}`);
|
|
158
|
+
if (skill.triggers && skill.triggers.length > 0) {
|
|
159
|
+
parts.push(`Triggers: ${skill.triggers.join(', ')}`);
|
|
160
|
+
}
|
|
161
|
+
return parts.join('. ');
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Add a skill with automatic embedding generation.
|
|
165
|
+
* Falls back to adding without embedding if embedding service unavailable.
|
|
166
|
+
*/
|
|
167
|
+
async addSkillWithEmbedding(skill) {
|
|
168
|
+
const id = 'skill_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
|
|
169
|
+
const db = this.getDb();
|
|
170
|
+
let embeddingBuffer = null;
|
|
171
|
+
// Try to generate embedding
|
|
172
|
+
if (this.embeddingClient) {
|
|
173
|
+
try {
|
|
174
|
+
const patternText = this.constructPatternText(skill);
|
|
175
|
+
const embedding = await this.embeddingClient.embed(patternText);
|
|
176
|
+
embeddingBuffer = Buffer.from(new Float32Array(embedding).buffer);
|
|
177
|
+
}
|
|
178
|
+
catch (err) {
|
|
179
|
+
console.error('[SkillLibrary] Failed to generate embedding:', err instanceof Error ? err.message : String(err));
|
|
180
|
+
// Continue without embedding
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
db.prepare(`
|
|
184
|
+
INSERT INTO skills (id, name, description, category, triggers, embedding, success_count, failure_count, avg_user_satisfaction)
|
|
185
|
+
VALUES (?, ?, ?, ?, ?, ?, 0, 0, 0.5)
|
|
186
|
+
`).run(id, skill.name, skill.description, skill.category, JSON.stringify(skill.triggers), embeddingBuffer);
|
|
187
|
+
return id;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Generate embeddings for all skills that don't have one.
|
|
191
|
+
* Useful for migrating existing skills or after embedding service comes back online.
|
|
192
|
+
*/
|
|
193
|
+
async generateMissingEmbeddings() {
|
|
194
|
+
if (!this.embeddingClient) {
|
|
195
|
+
return 0;
|
|
196
|
+
}
|
|
197
|
+
const db = this.getDb();
|
|
198
|
+
// Get skills without embeddings
|
|
199
|
+
const skills = db.prepare('SELECT id, name, description, category, triggers FROM skills WHERE embedding IS NULL').all();
|
|
200
|
+
if (skills.length === 0) {
|
|
201
|
+
return 0;
|
|
202
|
+
}
|
|
203
|
+
// Construct pattern texts
|
|
204
|
+
const patternTexts = skills.map(skill => this.constructPatternText({
|
|
205
|
+
name: skill.name,
|
|
206
|
+
description: skill.description,
|
|
207
|
+
category: skill.category,
|
|
208
|
+
triggers: JSON.parse(skill.triggers || '[]'),
|
|
209
|
+
}));
|
|
210
|
+
// Generate embeddings in batch
|
|
211
|
+
const response = await this.embeddingClient.embedBatch(patternTexts);
|
|
212
|
+
// Update skills with embeddings
|
|
213
|
+
const updateStmt = db.prepare('UPDATE skills SET embedding = ? WHERE id = ?');
|
|
214
|
+
for (let i = 0; i < skills.length; i++) {
|
|
215
|
+
const embeddingBuffer = Buffer.from(new Float32Array(response.embeddings[i]).buffer);
|
|
216
|
+
updateStmt.run(embeddingBuffer, skills[i].id);
|
|
217
|
+
}
|
|
218
|
+
return skills.length;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Calculate cosine similarity between two embedding vectors.
|
|
222
|
+
* Returns value between -1 and 1, where 1 is identical.
|
|
223
|
+
*/
|
|
224
|
+
cosineSimilarity(a, b) {
|
|
225
|
+
if (a.length !== b.length) {
|
|
226
|
+
throw new Error('Embedding vectors must have same length');
|
|
227
|
+
}
|
|
228
|
+
let dotProduct = 0;
|
|
229
|
+
let magnitudeA = 0;
|
|
230
|
+
let magnitudeB = 0;
|
|
231
|
+
for (let i = 0; i < a.length; i++) {
|
|
232
|
+
dotProduct += a[i] * b[i];
|
|
233
|
+
magnitudeA += a[i] * a[i];
|
|
234
|
+
magnitudeB += b[i] * b[i];
|
|
235
|
+
}
|
|
236
|
+
magnitudeA = Math.sqrt(magnitudeA);
|
|
237
|
+
magnitudeB = Math.sqrt(magnitudeB);
|
|
238
|
+
// Handle zero vector case
|
|
239
|
+
if (magnitudeA === 0 || magnitudeB === 0) {
|
|
240
|
+
return 0;
|
|
241
|
+
}
|
|
242
|
+
return dotProduct / (magnitudeA * magnitudeB);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Search skills by embedding similarity (geometric search).
|
|
246
|
+
* Uses cosine similarity to find semantically similar skills.
|
|
247
|
+
*/
|
|
248
|
+
async searchByEmbedding(query, limit = 5) {
|
|
249
|
+
if (!this.embeddingClient) {
|
|
250
|
+
return [];
|
|
251
|
+
}
|
|
252
|
+
const db = this.getDb();
|
|
253
|
+
// Generate query embedding
|
|
254
|
+
const queryEmbedding = await this.embeddingClient.embed(query);
|
|
255
|
+
// Get all skills with embeddings
|
|
256
|
+
const skills = db.prepare('SELECT * FROM skills WHERE embedding IS NOT NULL').all();
|
|
257
|
+
// Calculate similarity for each skill
|
|
258
|
+
const scoredSkills = skills.map(skill => {
|
|
259
|
+
const embeddingBuffer = skill.embedding;
|
|
260
|
+
const expectedBytes = 1024 * 4; // 1024 dimensions * 4 bytes per float32
|
|
261
|
+
if (embeddingBuffer.byteLength !== expectedBytes) {
|
|
262
|
+
throw new Error(`Invalid embedding size: expected ${expectedBytes} bytes, got ${embeddingBuffer.byteLength}`);
|
|
263
|
+
}
|
|
264
|
+
const embedding = new Float32Array(embeddingBuffer.buffer, embeddingBuffer.byteOffset, 1024);
|
|
265
|
+
const embeddingArray = Array.from(embedding);
|
|
266
|
+
const similarity = this.cosineSimilarity(queryEmbedding, embeddingArray);
|
|
267
|
+
return {
|
|
268
|
+
id: skill.id,
|
|
269
|
+
name: skill.name,
|
|
270
|
+
description: skill.description,
|
|
271
|
+
category: skill.category,
|
|
272
|
+
triggers: JSON.parse(skill.triggers || '[]'),
|
|
273
|
+
successCount: skill.success_count,
|
|
274
|
+
failureCount: skill.failure_count,
|
|
275
|
+
avgSatisfaction: skill.avg_user_satisfaction,
|
|
276
|
+
similarity,
|
|
277
|
+
};
|
|
278
|
+
});
|
|
279
|
+
// Sort by similarity (descending) and return top results
|
|
280
|
+
return scoredSkills
|
|
281
|
+
.sort((a, b) => (b.similarity || 0) - (a.similarity || 0))
|
|
282
|
+
.slice(0, limit);
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Hybrid search combining trigger-based and embedding-based search.
|
|
286
|
+
* Uses Reciprocal Rank Fusion (RRF) with k=60 to combine results.
|
|
287
|
+
*/
|
|
288
|
+
async hybridSearch(query, limit = 5) {
|
|
289
|
+
// Get trigger-based results
|
|
290
|
+
const triggerResults = this.search(query, limit * 2);
|
|
291
|
+
// Get embedding-based results (if available)
|
|
292
|
+
let embeddingResults = [];
|
|
293
|
+
if (this.embeddingClient) {
|
|
294
|
+
try {
|
|
295
|
+
embeddingResults = await this.searchByEmbedding(query, limit * 2);
|
|
296
|
+
}
|
|
297
|
+
catch {
|
|
298
|
+
// Fall back to trigger-only search
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
// If no embedding results, return trigger results
|
|
302
|
+
if (embeddingResults.length === 0) {
|
|
303
|
+
return triggerResults.map(skill => ({
|
|
304
|
+
...skill,
|
|
305
|
+
fusedScore: 1 / (60 + 1), // RRF score for single list
|
|
306
|
+
}));
|
|
307
|
+
}
|
|
308
|
+
// Combine using RRF (k=60)
|
|
309
|
+
const k = 60;
|
|
310
|
+
const fusedScores = new Map();
|
|
311
|
+
// Add trigger results with RRF scores
|
|
312
|
+
triggerResults.forEach((skill, rank) => {
|
|
313
|
+
const rrfScore = 1 / (k + rank + 1);
|
|
314
|
+
fusedScores.set(skill.id, { skill, score: rrfScore });
|
|
315
|
+
});
|
|
316
|
+
// Add embedding results with RRF scores
|
|
317
|
+
embeddingResults.forEach((skill, rank) => {
|
|
318
|
+
const rrfScore = 1 / (k + rank + 1);
|
|
319
|
+
const existing = fusedScores.get(skill.id);
|
|
320
|
+
if (existing) {
|
|
321
|
+
existing.score += rrfScore;
|
|
322
|
+
// Keep the one with similarity score if available
|
|
323
|
+
if (skill.similarity !== undefined) {
|
|
324
|
+
existing.skill = skill;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
fusedScores.set(skill.id, { skill, score: rrfScore });
|
|
329
|
+
}
|
|
330
|
+
});
|
|
331
|
+
// Sort by fused score and return
|
|
332
|
+
return Array.from(fusedScores.values())
|
|
333
|
+
.sort((a, b) => b.score - a.score)
|
|
334
|
+
.slice(0, limit)
|
|
335
|
+
.map(({ skill, score }) => ({
|
|
336
|
+
...skill,
|
|
337
|
+
fusedScore: score,
|
|
338
|
+
}));
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Record co-occurrence between two skills.
|
|
342
|
+
* Used to track which skills are often used together.
|
|
343
|
+
* Normalizes skill pair order for consistency.
|
|
344
|
+
*/
|
|
345
|
+
async recordCoOccurrence(skillId1, skillId2) {
|
|
346
|
+
const db = this.getDb();
|
|
347
|
+
// Normalize order (smaller ID first)
|
|
348
|
+
const [id1, id2] = skillId1 < skillId2 ? [skillId1, skillId2] : [skillId2, skillId1];
|
|
349
|
+
// Use UPSERT to avoid TOCTOU race condition
|
|
350
|
+
const relId = 'rel_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);
|
|
351
|
+
db.prepare(`
|
|
352
|
+
INSERT INTO skill_relationships (id, skill_id_1, skill_id_2, relationship_type, co_occurrence_count, created_at, last_updated)
|
|
353
|
+
VALUES (?, ?, ?, 'co_occurred', 1, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
|
|
354
|
+
ON CONFLICT(skill_id_1, skill_id_2, relationship_type)
|
|
355
|
+
DO UPDATE SET
|
|
356
|
+
co_occurrence_count = co_occurrence_count + 1,
|
|
357
|
+
last_updated = CURRENT_TIMESTAMP
|
|
358
|
+
`).run(relId, id1, id2);
|
|
359
|
+
}
|
|
360
|
+
/**
|
|
361
|
+
* Compute relational vectors for skill relationships that meet the threshold.
|
|
362
|
+
* Relational vector = embedding(skill2) - embedding(skill1)
|
|
363
|
+
* Used for analogical reasoning.
|
|
364
|
+
*/
|
|
365
|
+
async computeRelationalVectors(minCoOccurrenceCount = 2) {
|
|
366
|
+
const db = this.getDb();
|
|
367
|
+
// Get relationships that need relational vectors
|
|
368
|
+
const relationships = db.prepare(`
|
|
369
|
+
SELECT sr.*, s1.embedding as emb1, s2.embedding as emb2
|
|
370
|
+
FROM skill_relationships sr
|
|
371
|
+
JOIN skills s1 ON sr.skill_id_1 = s1.id
|
|
372
|
+
JOIN skills s2 ON sr.skill_id_2 = s2.id
|
|
373
|
+
WHERE sr.co_occurrence_count >= ?
|
|
374
|
+
AND sr.relational_vector IS NULL
|
|
375
|
+
AND s1.embedding IS NOT NULL
|
|
376
|
+
AND s2.embedding IS NOT NULL
|
|
377
|
+
`).all(minCoOccurrenceCount);
|
|
378
|
+
let computed = 0;
|
|
379
|
+
for (const rel of relationships) {
|
|
380
|
+
// Get embeddings
|
|
381
|
+
const expectedBytes = 1024 * 4; // 1024 dimensions * 4 bytes per float32
|
|
382
|
+
if (rel.emb1.byteLength !== expectedBytes) {
|
|
383
|
+
throw new Error(`Invalid embedding size for emb1: expected ${expectedBytes} bytes, got ${rel.emb1.byteLength}`);
|
|
384
|
+
}
|
|
385
|
+
if (rel.emb2.byteLength !== expectedBytes) {
|
|
386
|
+
throw new Error(`Invalid embedding size for emb2: expected ${expectedBytes} bytes, got ${rel.emb2.byteLength}`);
|
|
387
|
+
}
|
|
388
|
+
const emb1 = new Float32Array(rel.emb1.buffer, rel.emb1.byteOffset, 1024);
|
|
389
|
+
const emb2 = new Float32Array(rel.emb2.buffer, rel.emb2.byteOffset, 1024);
|
|
390
|
+
// Compute relational vector (difference)
|
|
391
|
+
const relationalVector = new Float32Array(1024);
|
|
392
|
+
for (let i = 0; i < 1024; i++) {
|
|
393
|
+
relationalVector[i] = emb2[i] - emb1[i];
|
|
394
|
+
}
|
|
395
|
+
// Store relational vector
|
|
396
|
+
const vectorBuffer = Buffer.from(relationalVector.buffer);
|
|
397
|
+
db.prepare('UPDATE skill_relationships SET relational_vector = ? WHERE id = ?')
|
|
398
|
+
.run(vectorBuffer, rel.id);
|
|
399
|
+
computed++;
|
|
400
|
+
}
|
|
401
|
+
return computed;
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* Find analogous skills using relational vectors.
|
|
405
|
+
* Query: "What is to sourceB as targetA is to sourceA?"
|
|
406
|
+
*
|
|
407
|
+
* Uses the relationship between sourceA and targetA to find
|
|
408
|
+
* a similar relationship starting from sourceB.
|
|
409
|
+
*/
|
|
410
|
+
async analogicalSearch(sourceA, targetA, sourceB, limit = 5) {
|
|
411
|
+
const db = this.getDb();
|
|
412
|
+
// Get embeddings for source skills
|
|
413
|
+
const skillA = db.prepare('SELECT embedding FROM skills WHERE id = ?').get(sourceA);
|
|
414
|
+
const skillTargetA = db.prepare('SELECT embedding FROM skills WHERE id = ?').get(targetA);
|
|
415
|
+
const skillB = db.prepare('SELECT embedding FROM skills WHERE id = ?').get(sourceB);
|
|
416
|
+
if (!skillA?.embedding || !skillTargetA?.embedding || !skillB?.embedding) {
|
|
417
|
+
return [];
|
|
418
|
+
}
|
|
419
|
+
// Get relational vector between sourceA and targetA
|
|
420
|
+
const [id1, id2] = sourceA < targetA ? [sourceA, targetA] : [targetA, sourceA];
|
|
421
|
+
const relationship = db.prepare(`
|
|
422
|
+
SELECT relational_vector FROM skill_relationships
|
|
423
|
+
WHERE (skill_id_1 = ? AND skill_id_2 = ?) OR (skill_id_1 = ? AND skill_id_2 = ?)
|
|
424
|
+
`).get(id1, id2, id2, id1);
|
|
425
|
+
if (!relationship?.relational_vector) {
|
|
426
|
+
return [];
|
|
427
|
+
}
|
|
428
|
+
// Extract relational vector
|
|
429
|
+
const expectedBytes = 1024 * 4; // 1024 dimensions * 4 bytes per float32
|
|
430
|
+
if (relationship.relational_vector.byteLength !== expectedBytes) {
|
|
431
|
+
throw new Error(`Invalid relational vector size: expected ${expectedBytes} bytes, got ${relationship.relational_vector.byteLength}`);
|
|
432
|
+
}
|
|
433
|
+
const relVector = new Float32Array(relationship.relational_vector.buffer, relationship.relational_vector.byteOffset, 1024);
|
|
434
|
+
// Extract sourceB embedding
|
|
435
|
+
if (skillB.embedding.byteLength !== expectedBytes) {
|
|
436
|
+
throw new Error(`Invalid embedding size for skillB: expected ${expectedBytes} bytes, got ${skillB.embedding.byteLength}`);
|
|
437
|
+
}
|
|
438
|
+
const embB = new Float32Array(skillB.embedding.buffer, skillB.embedding.byteOffset, 1024);
|
|
439
|
+
// Compute expected target embedding: embB + relVector
|
|
440
|
+
const expectedTarget = new Float32Array(1024);
|
|
441
|
+
for (let i = 0; i < 1024; i++) {
|
|
442
|
+
expectedTarget[i] = embB[i] + relVector[i];
|
|
443
|
+
}
|
|
444
|
+
const expectedTargetArray = Array.from(expectedTarget);
|
|
445
|
+
// Find skills closest to expected target
|
|
446
|
+
const skills = db.prepare('SELECT * FROM skills WHERE embedding IS NOT NULL AND id != ?').all(sourceB);
|
|
447
|
+
const scoredSkills = skills.map(skill => {
|
|
448
|
+
const embeddingBuffer = skill.embedding;
|
|
449
|
+
const expectedBytes = 1024 * 4; // 1024 dimensions * 4 bytes per float32
|
|
450
|
+
if (embeddingBuffer.byteLength !== expectedBytes) {
|
|
451
|
+
throw new Error(`Invalid embedding size: expected ${expectedBytes} bytes, got ${embeddingBuffer.byteLength}`);
|
|
452
|
+
}
|
|
453
|
+
const embedding = new Float32Array(embeddingBuffer.buffer, embeddingBuffer.byteOffset, 1024);
|
|
454
|
+
const embeddingArray = Array.from(embedding);
|
|
455
|
+
const analogyScore = this.cosineSimilarity(expectedTargetArray, embeddingArray);
|
|
456
|
+
return {
|
|
457
|
+
id: skill.id,
|
|
458
|
+
name: skill.name,
|
|
459
|
+
description: skill.description,
|
|
460
|
+
category: skill.category,
|
|
461
|
+
triggers: JSON.parse(skill.triggers || '[]'),
|
|
462
|
+
successCount: skill.success_count,
|
|
463
|
+
failureCount: skill.failure_count,
|
|
464
|
+
avgSatisfaction: skill.avg_user_satisfaction,
|
|
465
|
+
analogyScore,
|
|
466
|
+
};
|
|
467
|
+
});
|
|
468
|
+
return scoredSkills
|
|
469
|
+
.sort((a, b) => (b.analogyScore || 0) - (a.analogyScore || 0))
|
|
470
|
+
.slice(0, limit);
|
|
471
|
+
}
|
|
53
472
|
}
|
|
54
473
|
//# sourceMappingURL=skill-library.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-library.js","sourceRoot":"","sources":["../../src/memory-layers/skill-library.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"skill-library.js","sourceRoot":"","sources":["../../src/memory-layers/skill-library.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Redis-based cache for last 5 conversations with 7-day TTL.
|
|
5
5
|
* Simple but effective - instant recall for recent context.
|
|
6
|
+
*
|
|
7
|
+
* Enhanced with skill caching for lazy loading support.
|
|
8
|
+
* v0.5.0: Added namespace parameter for multi-agent isolation.
|
|
6
9
|
*/
|
|
7
10
|
import { Redis } from 'ioredis';
|
|
11
|
+
import type { FullSkill, CachedSkill } from './skill-lazy-loading.js';
|
|
8
12
|
export interface WorkingMemory {
|
|
9
13
|
conversationId: string;
|
|
10
14
|
timestamp: Date;
|
|
@@ -19,39 +23,56 @@ export declare class WorkingMemoryLayer {
|
|
|
19
23
|
private readonly MAX_CONVERSATIONS;
|
|
20
24
|
private readonly TTL_DAYS;
|
|
21
25
|
constructor(redis: Redis, maxConversations?: number);
|
|
22
|
-
store(memory: WorkingMemory): Promise<void>;
|
|
23
|
-
search(query: string, limit?: number): Promise<Array<{
|
|
26
|
+
store(memory: WorkingMemory, namespace?: string): Promise<void>;
|
|
27
|
+
search(query: string, limit?: number, namespace?: string): Promise<Array<{
|
|
24
28
|
memory: WorkingMemory;
|
|
25
29
|
similarity: number;
|
|
26
30
|
}>>;
|
|
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<{
|
|
31
|
+
getRecent(limit?: number, namespace?: string): Promise<WorkingMemory[]>;
|
|
32
|
+
getAll(limit?: number, namespace?: string): Promise<WorkingMemory[]>;
|
|
33
|
+
get(conversationId: string, namespace?: string): Promise<WorkingMemory | null>;
|
|
34
|
+
delete(conversationId: string, namespace?: string): Promise<void>;
|
|
35
|
+
searchByEntities(entities: string[], limit?: number, namespace?: string): Promise<Array<{
|
|
32
36
|
memory: WorkingMemory;
|
|
33
37
|
similarity: number;
|
|
34
38
|
matchedEntities: string[];
|
|
35
39
|
}>>;
|
|
36
|
-
searchByTopics(topics: string[], limit?: number): Promise<Array<{
|
|
40
|
+
searchByTopics(topics: string[], limit?: number, namespace?: string): Promise<Array<{
|
|
37
41
|
memory: WorkingMemory;
|
|
38
42
|
similarity: number;
|
|
39
43
|
matchedTopics: string[];
|
|
40
44
|
}>>;
|
|
41
|
-
getStats(): Promise<{
|
|
45
|
+
getStats(namespace?: string): Promise<{
|
|
42
46
|
totalConversations: number;
|
|
43
47
|
oldestConversation: Date | null;
|
|
44
48
|
newestConversation: Date | null;
|
|
45
49
|
totalTextSize: number;
|
|
46
50
|
}>;
|
|
47
51
|
/**
|
|
48
|
-
* Clear all working memory entries
|
|
52
|
+
* Clear all working memory entries for a namespace
|
|
49
53
|
*
|
|
50
54
|
* 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
|
*/
|
|
55
|
-
clear(): Promise<void>;
|
|
56
|
+
clear(namespace?: string): Promise<void>;
|
|
57
|
+
/**
|
|
58
|
+
* Cache a loaded skill in working memory
|
|
59
|
+
*/
|
|
60
|
+
cacheSkill(skill: FullSkill, ttl?: number, namespace?: string): Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* Get a cached skill from working memory
|
|
63
|
+
*/
|
|
64
|
+
getCachedSkill(skillId: string, namespace?: string): Promise<CachedSkill | null>;
|
|
65
|
+
/**
|
|
66
|
+
* Invalidate a cached skill
|
|
67
|
+
*/
|
|
68
|
+
invalidateSkillCache(skillId: string, namespace?: string): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Get all cached skill IDs
|
|
71
|
+
*/
|
|
72
|
+
getCachedSkillIds(namespace?: string): Promise<string[]>;
|
|
73
|
+
/**
|
|
74
|
+
* Clear all cached skills for a namespace
|
|
75
|
+
*/
|
|
76
|
+
clearSkillCache(namespace?: string): Promise<void>;
|
|
56
77
|
}
|
|
57
78
|
//# sourceMappingURL=working-memory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"working-memory.d.ts","sourceRoot":"","sources":["../../src/memory-layers/working-memory.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"working-memory.d.ts","sourceRoot":"","sources":["../../src/memory-layers/working-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtE,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,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB1E,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAyBtI,SAAS,CAAC,KAAK,GAAE,MAAU,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAarF,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAI/E,GAAG,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAKzF,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5E,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,MAAU,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAuBhL,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,GAAE,MAAU,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,EAAE,aAAa,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IAuB1K,QAAQ,CAAC,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC;QACrD,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;IA8BF;;;;OAIG;IACG,KAAK,CAAC,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBzD;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,GAAE,MAAa,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAapG;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAwBjG;;OAEG;IACG,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAMzF;;OAEG;IACG,iBAAiB,CAAC,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAsBzE;;OAEG;IACG,eAAe,CAAC,SAAS,GAAE,MAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;CAmBpE"}
|