@traqr/memory 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +135 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +38 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/auth.d.ts +18 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +31 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/auto-derive.d.ts +35 -0
- package/dist/lib/auto-derive.js +261 -0
- package/dist/lib/auto-derive.js.map +1 -0
- package/dist/lib/borderline.d.ts +26 -0
- package/dist/lib/borderline.js +121 -0
- package/dist/lib/borderline.js.map +1 -0
- package/dist/lib/client.d.ts +28 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +60 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/context.d.ts +38 -0
- package/dist/lib/context.d.ts.map +1 -0
- package/dist/lib/context.js +334 -0
- package/dist/lib/context.js.map +1 -0
- package/dist/lib/embeddings.d.ts +60 -0
- package/dist/lib/embeddings.d.ts.map +1 -0
- package/dist/lib/embeddings.js +229 -0
- package/dist/lib/embeddings.js.map +1 -0
- package/dist/lib/entity-pipeline.d.ts +23 -0
- package/dist/lib/entity-pipeline.js +151 -0
- package/dist/lib/entity-pipeline.js.map +1 -0
- package/dist/lib/formatting.d.ts +13 -0
- package/dist/lib/formatting.d.ts.map +1 -0
- package/dist/lib/formatting.js +60 -0
- package/dist/lib/formatting.js.map +1 -0
- package/dist/lib/learning-extractor.d.ts +144 -0
- package/dist/lib/learning-extractor.d.ts.map +1 -0
- package/dist/lib/learning-extractor.js +921 -0
- package/dist/lib/learning-extractor.js.map +1 -0
- package/dist/lib/lifecycle.d.ts +45 -0
- package/dist/lib/lifecycle.js +84 -0
- package/dist/lib/lifecycle.js.map +1 -0
- package/dist/lib/memory.d.ts +128 -0
- package/dist/lib/memory.d.ts.map +1 -0
- package/dist/lib/memory.js +590 -0
- package/dist/lib/memory.js.map +1 -0
- package/dist/lib/quality-gate.d.ts +32 -0
- package/dist/lib/quality-gate.js +158 -0
- package/dist/lib/quality-gate.js.map +1 -0
- package/dist/lib/quality-gate.test.d.ts +7 -0
- package/dist/lib/quality-gate.test.js +75 -0
- package/dist/lib/quality-gate.test.js.map +1 -0
- package/dist/lib/rerank.d.ts +22 -0
- package/dist/lib/rerank.js +61 -0
- package/dist/lib/rerank.js.map +1 -0
- package/dist/lib/retrieval.d.ts +75 -0
- package/dist/lib/retrieval.js +380 -0
- package/dist/lib/retrieval.js.map +1 -0
- package/dist/migrate.d.ts +17 -0
- package/dist/migrate.d.ts.map +1 -0
- package/dist/migrate.js +81 -0
- package/dist/migrate.js.map +1 -0
- package/dist/routes/analyze-codebase.d.ts +9 -0
- package/dist/routes/analyze-codebase.d.ts.map +1 -0
- package/dist/routes/analyze-codebase.js +70 -0
- package/dist/routes/analyze-codebase.js.map +1 -0
- package/dist/routes/analyze-voice.d.ts +9 -0
- package/dist/routes/analyze-voice.d.ts.map +1 -0
- package/dist/routes/analyze-voice.js +63 -0
- package/dist/routes/analyze-voice.js.map +1 -0
- package/dist/routes/assemble-context.d.ts +9 -0
- package/dist/routes/assemble-context.d.ts.map +1 -0
- package/dist/routes/assemble-context.js +68 -0
- package/dist/routes/assemble-context.js.map +1 -0
- package/dist/routes/bootstrap.d.ts +12 -0
- package/dist/routes/bootstrap.d.ts.map +1 -0
- package/dist/routes/bootstrap.js +102 -0
- package/dist/routes/bootstrap.js.map +1 -0
- package/dist/routes/browse.d.ts +11 -0
- package/dist/routes/browse.js +85 -0
- package/dist/routes/browse.js.map +1 -0
- package/dist/routes/capture-thought.d.ts +13 -0
- package/dist/routes/capture-thought.d.ts.map +1 -0
- package/dist/routes/capture-thought.js +178 -0
- package/dist/routes/capture-thought.js.map +1 -0
- package/dist/routes/capture.d.ts +13 -0
- package/dist/routes/capture.d.ts.map +1 -0
- package/dist/routes/capture.js +86 -0
- package/dist/routes/capture.js.map +1 -0
- package/dist/routes/cite.d.ts +9 -0
- package/dist/routes/cite.d.ts.map +1 -0
- package/dist/routes/cite.js +49 -0
- package/dist/routes/cite.js.map +1 -0
- package/dist/routes/crud.d.ts +11 -0
- package/dist/routes/crud.d.ts.map +1 -0
- package/dist/routes/crud.js +176 -0
- package/dist/routes/crud.js.map +1 -0
- package/dist/routes/dashboard.d.ts +9 -0
- package/dist/routes/dashboard.d.ts.map +1 -0
- package/dist/routes/dashboard.js +85 -0
- package/dist/routes/dashboard.js.map +1 -0
- package/dist/routes/entity-cron.d.ts +8 -0
- package/dist/routes/entity-cron.js +31 -0
- package/dist/routes/entity-cron.js.map +1 -0
- package/dist/routes/export.d.ts +8 -0
- package/dist/routes/export.d.ts.map +1 -0
- package/dist/routes/export.js +69 -0
- package/dist/routes/export.js.map +1 -0
- package/dist/routes/extract-pr-learnings.d.ts +12 -0
- package/dist/routes/extract-pr-learnings.d.ts.map +1 -0
- package/dist/routes/extract-pr-learnings.js +127 -0
- package/dist/routes/extract-pr-learnings.js.map +1 -0
- package/dist/routes/forget-cron.d.ts +9 -0
- package/dist/routes/forget-cron.js +30 -0
- package/dist/routes/forget-cron.js.map +1 -0
- package/dist/routes/learnings.d.ts +9 -0
- package/dist/routes/learnings.d.ts.map +1 -0
- package/dist/routes/learnings.js +237 -0
- package/dist/routes/learnings.js.map +1 -0
- package/dist/routes/pulse.d.ts +9 -0
- package/dist/routes/pulse.d.ts.map +1 -0
- package/dist/routes/pulse.js +133 -0
- package/dist/routes/pulse.js.map +1 -0
- package/dist/routes/search.d.ts +8 -0
- package/dist/routes/search.d.ts.map +1 -0
- package/dist/routes/search.js +107 -0
- package/dist/routes/search.js.map +1 -0
- package/dist/routes/store.d.ts +8 -0
- package/dist/routes/store.d.ts.map +1 -0
- package/dist/routes/store.js +89 -0
- package/dist/routes/store.js.map +1 -0
- package/dist/routes/sync.d.ts +12 -0
- package/dist/routes/sync.d.ts.map +1 -0
- package/dist/routes/sync.js +83 -0
- package/dist/routes/sync.js.map +1 -0
- package/dist/routes/voice-profile.d.ts +9 -0
- package/dist/routes/voice-profile.d.ts.map +1 -0
- package/dist/routes/voice-profile.js +124 -0
- package/dist/routes/voice-profile.js.map +1 -0
- package/dist/server.d.ts +37 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +99 -0
- package/dist/server.js.map +1 -0
- package/dist/vectordb/index.d.ts +17 -0
- package/dist/vectordb/index.d.ts.map +1 -0
- package/dist/vectordb/index.js +39 -0
- package/dist/vectordb/index.js.map +1 -0
- package/dist/vectordb/supabase.d.ts +62 -0
- package/dist/vectordb/supabase.d.ts.map +1 -0
- package/dist/vectordb/supabase.js +711 -0
- package/dist/vectordb/supabase.js.map +1 -0
- package/dist/vectordb/types.d.ts +217 -0
- package/dist/vectordb/types.d.ts.map +1 -0
- package/dist/vectordb/types.js +28 -0
- package/dist/vectordb/types.js.map +1 -0
- package/package.json +49 -0
- package/setup.sql +1037 -0
|
@@ -0,0 +1,590 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* High-Level Memory Operations
|
|
3
|
+
*
|
|
4
|
+
* Application-level interface for the memory system.
|
|
5
|
+
* Wraps the vectordb abstraction with convenience functions.
|
|
6
|
+
*/
|
|
7
|
+
import { getVectorDB } from '../vectordb/index.js';
|
|
8
|
+
import { SupabaseVectorProvider } from '../vectordb/supabase.js';
|
|
9
|
+
import { getMemoryClient } from './client.js';
|
|
10
|
+
import { CATEGORY_EMOJI } from './formatting.js';
|
|
11
|
+
import { generateEmbedding, formatEmbeddingForPgVector, checkEmbeddingHealth } from './embeddings.js';
|
|
12
|
+
import { borderlineDecision } from './borderline.js';
|
|
13
|
+
import { processEntitiesForMemory } from './entity-pipeline.js';
|
|
14
|
+
import { getUserId } from './client.js';
|
|
15
|
+
// ============================================================
|
|
16
|
+
// CORE OPERATIONS
|
|
17
|
+
// ============================================================
|
|
18
|
+
export async function storeMemory(input) {
|
|
19
|
+
const db = getVectorDB();
|
|
20
|
+
return db.store(input);
|
|
21
|
+
}
|
|
22
|
+
export async function createRelationship(sourceId, targetId, edgeType, confidence = 1.0, metadata = {}) {
|
|
23
|
+
try {
|
|
24
|
+
const client = getMemoryClient();
|
|
25
|
+
const { data, error } = await client.from('memory_relationships')
|
|
26
|
+
.insert({
|
|
27
|
+
source_memory_id: sourceId,
|
|
28
|
+
target_memory_id: targetId,
|
|
29
|
+
edge_type: edgeType,
|
|
30
|
+
confidence,
|
|
31
|
+
metadata,
|
|
32
|
+
})
|
|
33
|
+
.select('id')
|
|
34
|
+
.single();
|
|
35
|
+
if (error) {
|
|
36
|
+
console.warn('[memory] Failed to create relationship:', error.message);
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
return data.id;
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
console.warn('[memory] Relationship creation error:', err);
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** Invalidate a fact — sets invalid_at, is_latest=false */
|
|
47
|
+
export async function invalidateMemory(id) {
|
|
48
|
+
const db = getVectorDB();
|
|
49
|
+
if (db instanceof SupabaseVectorProvider) {
|
|
50
|
+
await db.invalidate(id);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** Supersede a preference — sets is_latest=false (keeps valid_at) */
|
|
54
|
+
export async function supersedeMemory(id) {
|
|
55
|
+
const db = getVectorDB();
|
|
56
|
+
if (db instanceof SupabaseVectorProvider) {
|
|
57
|
+
await db.supersede(id);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function classifyZone(similarity, opts = {}) {
|
|
61
|
+
const noopThreshold = opts.noopThreshold ?? 0.90;
|
|
62
|
+
const addThreshold = opts.addThreshold ?? 0.60;
|
|
63
|
+
if (similarity >= noopThreshold)
|
|
64
|
+
return 'noop';
|
|
65
|
+
if (similarity < addThreshold)
|
|
66
|
+
return 'add';
|
|
67
|
+
return 'borderline';
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 3-zone cosine triage — replaces storeWithDedup.
|
|
71
|
+
*
|
|
72
|
+
* Zone 1 (>=0.90): NOOP — memory exists, optionally update metadata
|
|
73
|
+
* Zone 2 (<0.60): ADD — genuinely new, store it
|
|
74
|
+
* Zone 3 (0.60-0.90): BORDERLINE — heuristic (LLM in I-M8)
|
|
75
|
+
*/
|
|
76
|
+
export async function triageAndStore(input, options = {}) {
|
|
77
|
+
// Generate embedding ONCE — reuse for search and store
|
|
78
|
+
let embeddingStr;
|
|
79
|
+
try {
|
|
80
|
+
const embeddingResult = await generateEmbedding(input.content);
|
|
81
|
+
embeddingStr = formatEmbeddingForPgVector(embeddingResult.embedding);
|
|
82
|
+
}
|
|
83
|
+
catch (err) {
|
|
84
|
+
console.warn('[triage] Embedding generation failed, storing without triage:', err);
|
|
85
|
+
const memory = await storeMemory(input);
|
|
86
|
+
return { memory, zone: 'add', action: 'stored', similarity: 0, deduplicated: false, merged: false };
|
|
87
|
+
}
|
|
88
|
+
// Search with low threshold to catch borderline matches
|
|
89
|
+
let existing = [];
|
|
90
|
+
try {
|
|
91
|
+
existing = await searchMemories(input.content, {
|
|
92
|
+
limit: 3,
|
|
93
|
+
category: input.category,
|
|
94
|
+
similarityThreshold: 0.30,
|
|
95
|
+
precomputedEmbedding: embeddingStr,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
catch (err) {
|
|
99
|
+
console.warn('[triage] Search failed, storing without triage:', err);
|
|
100
|
+
const memory = await storeMemory({ ...input, precomputedEmbedding: embeddingStr });
|
|
101
|
+
return { memory, zone: 'add', action: 'stored', similarity: 0, deduplicated: false, merged: false };
|
|
102
|
+
}
|
|
103
|
+
// No matches — Zone 2: ADD
|
|
104
|
+
if (existing.length === 0) {
|
|
105
|
+
const memory = await storeMemory({ ...input, precomputedEmbedding: embeddingStr });
|
|
106
|
+
return { memory, zone: 'add', action: 'stored', similarity: 0, deduplicated: false, merged: false };
|
|
107
|
+
}
|
|
108
|
+
const best = existing[0];
|
|
109
|
+
const similarity = best.similarity;
|
|
110
|
+
const zone = classifyZone(similarity, options);
|
|
111
|
+
// Zone 1: NOOP — near-duplicate
|
|
112
|
+
if (zone === 'noop') {
|
|
113
|
+
// Merge metadata if different (additive tags)
|
|
114
|
+
const newTags = (input.tags || []).filter(t => !best.tags.includes(t));
|
|
115
|
+
if (newTags.length > 0) {
|
|
116
|
+
const updated = await updateMemory(best.id, {
|
|
117
|
+
tags: [...best.tags, ...newTags],
|
|
118
|
+
changeReason: 'Triage zone 1: metadata merge from near-duplicate',
|
|
119
|
+
});
|
|
120
|
+
return {
|
|
121
|
+
memory: updated, zone: 'noop', action: 'metadata_updated', similarity,
|
|
122
|
+
matchedMemoryId: best.id, deduplicated: true, merged: false, existingId: best.id,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
const validated = await validateMemory(best.id);
|
|
126
|
+
return {
|
|
127
|
+
memory: validated, zone: 'noop', action: 'skipped', similarity,
|
|
128
|
+
matchedMemoryId: best.id, deduplicated: true, merged: false, existingId: best.id,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
// Zone 2: ADD — genuinely new
|
|
132
|
+
if (zone === 'add') {
|
|
133
|
+
const memory = await storeMemory({ ...input, precomputedEmbedding: embeddingStr });
|
|
134
|
+
return { memory, zone: 'add', action: 'stored', similarity, deduplicated: false, merged: false };
|
|
135
|
+
}
|
|
136
|
+
// Zone 3: BORDERLINE — LLM decision with heuristic fallback
|
|
137
|
+
const memType = input.memoryType || best.memoryType || 'pattern';
|
|
138
|
+
// Build UUID-masked memory list for LLM
|
|
139
|
+
const LABELS = ['MEMORY_A', 'MEMORY_B', 'MEMORY_C'];
|
|
140
|
+
const maskedMemories = existing.slice(0, 3).map((m, i) => ({
|
|
141
|
+
label: LABELS[i],
|
|
142
|
+
content: m.content,
|
|
143
|
+
memoryType: m.memoryType,
|
|
144
|
+
}));
|
|
145
|
+
const labelToId = new Map(existing.slice(0, 3).map((m, i) => [LABELS[i], m.id]));
|
|
146
|
+
// Try LLM decision, fall back to heuristic on any failure
|
|
147
|
+
const decision = await borderlineDecision(input.content, maskedMemories, memType);
|
|
148
|
+
if (decision) {
|
|
149
|
+
// LLM decided — execute the action
|
|
150
|
+
const targetId = decision.target ? labelToId.get(decision.target) || best.id : best.id;
|
|
151
|
+
if (decision.action === 'update') {
|
|
152
|
+
// Store new + type-aware invalidation of target
|
|
153
|
+
const memory = await storeMemory({ ...input, precomputedEmbedding: embeddingStr });
|
|
154
|
+
if (memType === 'fact') {
|
|
155
|
+
await invalidateMemory(targetId);
|
|
156
|
+
}
|
|
157
|
+
else if (memType === 'preference') {
|
|
158
|
+
await supersedeMemory(targetId);
|
|
159
|
+
}
|
|
160
|
+
const relId = await createRelationship(memory.id, targetId, 'updates', similarity);
|
|
161
|
+
return {
|
|
162
|
+
memory, zone: 'borderline', action: 'extended', similarity,
|
|
163
|
+
matchedMemoryId: targetId, relationshipId: relId ?? undefined,
|
|
164
|
+
deduplicated: false, merged: true, existingId: targetId,
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
if (decision.action === 'noop') {
|
|
168
|
+
// Existing covers it — merge metadata, validate
|
|
169
|
+
const newTags = (input.tags || []).filter(t => !best.tags.includes(t));
|
|
170
|
+
if (newTags.length > 0) {
|
|
171
|
+
await updateMemory(best.id, {
|
|
172
|
+
tags: [...best.tags, ...newTags],
|
|
173
|
+
changeReason: `Triage zone 3 (LLM): ${decision.reasoning}`,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
const validated = await validateMemory(best.id);
|
|
177
|
+
return {
|
|
178
|
+
memory: validated, zone: 'borderline', action: 'metadata_updated', similarity,
|
|
179
|
+
matchedMemoryId: best.id, deduplicated: true, merged: false, existingId: best.id,
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
// decision.action === 'add' — store alongside with 'related' edge
|
|
183
|
+
const memory = await storeMemory({ ...input, precomputedEmbedding: embeddingStr });
|
|
184
|
+
const relId = await createRelationship(memory.id, best.id, 'related', similarity);
|
|
185
|
+
return {
|
|
186
|
+
memory, zone: 'borderline', action: 'related', similarity,
|
|
187
|
+
matchedMemoryId: best.id, relationshipId: relId ?? undefined,
|
|
188
|
+
deduplicated: false, merged: false, existingId: best.id,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
// Fallback: I-M6 length heuristic (LLM failed or unavailable)
|
|
192
|
+
const newLen = input.content.length;
|
|
193
|
+
const oldLen = best.content.length;
|
|
194
|
+
if (newLen > oldLen * 1.2) {
|
|
195
|
+
const memory = await storeMemory({ ...input, precomputedEmbedding: embeddingStr });
|
|
196
|
+
if (memType === 'fact')
|
|
197
|
+
await invalidateMemory(best.id);
|
|
198
|
+
else if (memType === 'preference')
|
|
199
|
+
await supersedeMemory(best.id);
|
|
200
|
+
const edgeType = memType === 'pattern' ? 'extends' : 'updates';
|
|
201
|
+
const relId = await createRelationship(memory.id, best.id, edgeType, similarity);
|
|
202
|
+
return {
|
|
203
|
+
memory, zone: 'borderline', action: 'extended', similarity,
|
|
204
|
+
matchedMemoryId: best.id, relationshipId: relId ?? undefined,
|
|
205
|
+
deduplicated: false, merged: true, existingId: best.id,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
if (oldLen > newLen * 1.2) {
|
|
209
|
+
const newTags = (input.tags || []).filter(t => !best.tags.includes(t));
|
|
210
|
+
if (newTags.length > 0) {
|
|
211
|
+
await updateMemory(best.id, {
|
|
212
|
+
tags: [...best.tags, ...newTags],
|
|
213
|
+
changeReason: 'Triage zone 3 (heuristic fallback): metadata merge',
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
const validated = await validateMemory(best.id);
|
|
217
|
+
return {
|
|
218
|
+
memory: validated, zone: 'borderline', action: 'metadata_updated', similarity,
|
|
219
|
+
matchedMemoryId: best.id, deduplicated: true, merged: false, existingId: best.id,
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
const memory = await storeMemory({ ...input, precomputedEmbedding: embeddingStr });
|
|
223
|
+
const relId = await createRelationship(memory.id, best.id, 'related', similarity);
|
|
224
|
+
return {
|
|
225
|
+
memory, zone: 'borderline', action: 'related', similarity,
|
|
226
|
+
matchedMemoryId: best.id, relationshipId: relId ?? undefined,
|
|
227
|
+
deduplicated: false, merged: false, existingId: best.id,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/** Backward-compatible alias for triageAndStore */
|
|
231
|
+
export async function storeWithDedup(input, _dedupThreshold = 0.75) {
|
|
232
|
+
const result = await triageAndStore(input);
|
|
233
|
+
// Fire-and-forget: async entity extraction on stored memories (not NOOP)
|
|
234
|
+
if (result.zone !== 'noop') {
|
|
235
|
+
processEntitiesForMemory(result.memory.id, input.content, getUserId())
|
|
236
|
+
.then((r) => {
|
|
237
|
+
if (r.created > 0 || r.linked > 0) {
|
|
238
|
+
console.log(`[entity] ${result.memory.id.slice(0, 6)}: ${r.candidates} candidates, ${r.created} created, ${r.merged} merged, ${r.linked} linked`);
|
|
239
|
+
}
|
|
240
|
+
})
|
|
241
|
+
.catch((err) => console.warn('[entity] Extraction failed:', err instanceof Error ? err.message : err));
|
|
242
|
+
}
|
|
243
|
+
return result;
|
|
244
|
+
}
|
|
245
|
+
export async function searchMemories(query, options = {}) {
|
|
246
|
+
const db = getVectorDB();
|
|
247
|
+
return db.search(query, options);
|
|
248
|
+
}
|
|
249
|
+
export async function getMemory(id) {
|
|
250
|
+
const db = getVectorDB();
|
|
251
|
+
return db.getById(id);
|
|
252
|
+
}
|
|
253
|
+
export async function updateMemory(id, updates) {
|
|
254
|
+
const db = getVectorDB();
|
|
255
|
+
return db.update(id, updates);
|
|
256
|
+
}
|
|
257
|
+
export async function deleteMemory(id) {
|
|
258
|
+
const db = getVectorDB();
|
|
259
|
+
return db.delete(id);
|
|
260
|
+
}
|
|
261
|
+
export async function validateMemory(id) {
|
|
262
|
+
const db = getVectorDB();
|
|
263
|
+
return db.validate(id);
|
|
264
|
+
}
|
|
265
|
+
export async function archiveMemory(id, reason) {
|
|
266
|
+
const db = getVectorDB();
|
|
267
|
+
return db.archive(id, reason);
|
|
268
|
+
}
|
|
269
|
+
export async function unarchiveMemory(id) {
|
|
270
|
+
const db = getVectorDB();
|
|
271
|
+
return db.unarchive(id);
|
|
272
|
+
}
|
|
273
|
+
// ============================================================
|
|
274
|
+
// BULK OPERATIONS
|
|
275
|
+
// ============================================================
|
|
276
|
+
export async function exportAllMemories(domainId) {
|
|
277
|
+
const db = getVectorDB();
|
|
278
|
+
return db.exportAll(domainId);
|
|
279
|
+
}
|
|
280
|
+
export async function importMemories(memories, domainId) {
|
|
281
|
+
const db = getVectorDB();
|
|
282
|
+
const domain = domainId || (await db.getDefaultDomain()).id;
|
|
283
|
+
return db.importBulk(memories, domain);
|
|
284
|
+
}
|
|
285
|
+
// ============================================================
|
|
286
|
+
// CONVENIENCE FUNCTIONS
|
|
287
|
+
// ============================================================
|
|
288
|
+
export async function remember(content, category = 'insight', tags = []) {
|
|
289
|
+
return storeMemory({
|
|
290
|
+
content,
|
|
291
|
+
category,
|
|
292
|
+
tags,
|
|
293
|
+
sourceType: 'manual',
|
|
294
|
+
confidence: 1.0,
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
export async function recall(query, limit = 5) {
|
|
298
|
+
return searchMemories(query, { limit });
|
|
299
|
+
}
|
|
300
|
+
// ============================================================
|
|
301
|
+
// HEALTH & STATUS
|
|
302
|
+
// ============================================================
|
|
303
|
+
export async function isMemoryHealthy() {
|
|
304
|
+
try {
|
|
305
|
+
const db = getVectorDB();
|
|
306
|
+
return await db.ping();
|
|
307
|
+
}
|
|
308
|
+
catch {
|
|
309
|
+
return false;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
export async function getMemoryStats() {
|
|
313
|
+
const db = getVectorDB();
|
|
314
|
+
const all = await db.exportAll();
|
|
315
|
+
const stats = {
|
|
316
|
+
total: all.length,
|
|
317
|
+
byCategory: {},
|
|
318
|
+
archived: 0,
|
|
319
|
+
};
|
|
320
|
+
for (const memory of all) {
|
|
321
|
+
const cat = memory.category || 'uncategorized';
|
|
322
|
+
stats.byCategory[cat] = (stats.byCategory[cat] || 0) + 1;
|
|
323
|
+
if (memory.isArchived) {
|
|
324
|
+
stats.archived++;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
return stats;
|
|
328
|
+
}
|
|
329
|
+
export async function verifyRoundTrip() {
|
|
330
|
+
const testContent = `Verification test at ${new Date().toISOString()}`;
|
|
331
|
+
const result = {
|
|
332
|
+
success: false,
|
|
333
|
+
steps: {
|
|
334
|
+
store: { success: false, latencyMs: 0 },
|
|
335
|
+
search: { success: false, found: false, latencyMs: 0 },
|
|
336
|
+
retrieve: { success: false, contentMatches: false, latencyMs: 0 },
|
|
337
|
+
cleanup: { success: false, latencyMs: 0 },
|
|
338
|
+
},
|
|
339
|
+
totalLatencyMs: 0,
|
|
340
|
+
};
|
|
341
|
+
const totalStart = Date.now();
|
|
342
|
+
let storedMemory = null;
|
|
343
|
+
try {
|
|
344
|
+
const storeStart = Date.now();
|
|
345
|
+
try {
|
|
346
|
+
storedMemory = await storeMemory({
|
|
347
|
+
content: testContent,
|
|
348
|
+
category: 'insight',
|
|
349
|
+
tags: ['test', 'verification', 'round-trip'],
|
|
350
|
+
sourceType: 'manual',
|
|
351
|
+
sourceRef: 'verifyRoundTrip()',
|
|
352
|
+
confidence: 1.0,
|
|
353
|
+
});
|
|
354
|
+
result.steps.store = {
|
|
355
|
+
success: true,
|
|
356
|
+
memoryId: storedMemory.id,
|
|
357
|
+
latencyMs: Date.now() - storeStart,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
result.steps.store = {
|
|
362
|
+
success: false,
|
|
363
|
+
latencyMs: Date.now() - storeStart,
|
|
364
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
365
|
+
};
|
|
366
|
+
result.totalLatencyMs = Date.now() - totalStart;
|
|
367
|
+
result.error = 'Failed at STORE step';
|
|
368
|
+
return result;
|
|
369
|
+
}
|
|
370
|
+
const searchStart = Date.now();
|
|
371
|
+
try {
|
|
372
|
+
const searchResults = await searchMemories('verification test round-trip', { limit: 5 });
|
|
373
|
+
const found = searchResults.some(r => r.id === storedMemory.id);
|
|
374
|
+
const matchingResult = searchResults.find(r => r.id === storedMemory.id);
|
|
375
|
+
result.steps.search = {
|
|
376
|
+
success: true,
|
|
377
|
+
found,
|
|
378
|
+
relevanceScore: matchingResult?.relevanceScore,
|
|
379
|
+
latencyMs: Date.now() - searchStart,
|
|
380
|
+
};
|
|
381
|
+
if (!found) {
|
|
382
|
+
result.steps.search.error = 'Memory stored but not found via search';
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
catch (error) {
|
|
386
|
+
result.steps.search = {
|
|
387
|
+
success: false,
|
|
388
|
+
found: false,
|
|
389
|
+
latencyMs: Date.now() - searchStart,
|
|
390
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
const retrieveStart = Date.now();
|
|
394
|
+
try {
|
|
395
|
+
const retrieved = await getMemory(storedMemory.id);
|
|
396
|
+
const contentMatches = retrieved?.content === testContent;
|
|
397
|
+
result.steps.retrieve = {
|
|
398
|
+
success: !!retrieved,
|
|
399
|
+
contentMatches,
|
|
400
|
+
latencyMs: Date.now() - retrieveStart,
|
|
401
|
+
};
|
|
402
|
+
if (!contentMatches) {
|
|
403
|
+
result.steps.retrieve.error = 'Content mismatch on retrieval';
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
catch (error) {
|
|
407
|
+
result.steps.retrieve = {
|
|
408
|
+
success: false,
|
|
409
|
+
contentMatches: false,
|
|
410
|
+
latencyMs: Date.now() - retrieveStart,
|
|
411
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
const cleanupStart = Date.now();
|
|
415
|
+
try {
|
|
416
|
+
await archiveMemory(storedMemory.id, 'Test memory - verifyRoundTrip cleanup');
|
|
417
|
+
result.steps.cleanup = {
|
|
418
|
+
success: true,
|
|
419
|
+
latencyMs: Date.now() - cleanupStart,
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
catch (error) {
|
|
423
|
+
result.steps.cleanup = {
|
|
424
|
+
success: false,
|
|
425
|
+
latencyMs: Date.now() - cleanupStart,
|
|
426
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
result.totalLatencyMs = Date.now() - totalStart;
|
|
430
|
+
result.success =
|
|
431
|
+
result.steps.store.success &&
|
|
432
|
+
result.steps.search.success &&
|
|
433
|
+
result.steps.search.found &&
|
|
434
|
+
result.steps.retrieve.success &&
|
|
435
|
+
result.steps.retrieve.contentMatches &&
|
|
436
|
+
result.steps.cleanup.success;
|
|
437
|
+
if (!result.success) {
|
|
438
|
+
const failedSteps = Object.entries(result.steps)
|
|
439
|
+
.filter(([, step]) => !step.success)
|
|
440
|
+
.map(([name]) => name);
|
|
441
|
+
result.error = `Failed steps: ${failedSteps.join(', ')}`;
|
|
442
|
+
}
|
|
443
|
+
return result;
|
|
444
|
+
}
|
|
445
|
+
catch (error) {
|
|
446
|
+
result.totalLatencyMs = Date.now() - totalStart;
|
|
447
|
+
result.error = error instanceof Error ? error.message : 'Unknown error';
|
|
448
|
+
return result;
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
export async function getDetailedStats() {
|
|
452
|
+
const db = getVectorDB();
|
|
453
|
+
const all = await db.exportAll();
|
|
454
|
+
const now = Date.now();
|
|
455
|
+
const day = 24 * 60 * 60 * 1000;
|
|
456
|
+
const stats = {
|
|
457
|
+
total: all.length,
|
|
458
|
+
active: 0,
|
|
459
|
+
archived: 0,
|
|
460
|
+
byCategory: {},
|
|
461
|
+
bySource: {},
|
|
462
|
+
byTag: {},
|
|
463
|
+
recentCount: { last24h: 0, last7d: 0, last30d: 0 },
|
|
464
|
+
};
|
|
465
|
+
let oldest = null;
|
|
466
|
+
let newest = null;
|
|
467
|
+
for (const memory of all) {
|
|
468
|
+
if (memory.isArchived) {
|
|
469
|
+
stats.archived++;
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
stats.active++;
|
|
473
|
+
}
|
|
474
|
+
const cat = memory.category || 'uncategorized';
|
|
475
|
+
stats.byCategory[cat] = (stats.byCategory[cat] || 0) + 1;
|
|
476
|
+
const source = memory.sourceType || 'unknown';
|
|
477
|
+
stats.bySource[source] = (stats.bySource[source] || 0) + 1;
|
|
478
|
+
for (const tag of memory.tags || []) {
|
|
479
|
+
stats.byTag[tag] = (stats.byTag[tag] || 0) + 1;
|
|
480
|
+
}
|
|
481
|
+
const createdAt = new Date(memory.createdAt).getTime();
|
|
482
|
+
if (now - createdAt < day)
|
|
483
|
+
stats.recentCount.last24h++;
|
|
484
|
+
if (now - createdAt < 7 * day)
|
|
485
|
+
stats.recentCount.last7d++;
|
|
486
|
+
if (now - createdAt < 30 * day)
|
|
487
|
+
stats.recentCount.last30d++;
|
|
488
|
+
if (!oldest || new Date(memory.createdAt) < new Date(oldest.createdAt)) {
|
|
489
|
+
oldest = memory;
|
|
490
|
+
}
|
|
491
|
+
if (!newest || new Date(memory.createdAt) > new Date(newest.createdAt)) {
|
|
492
|
+
newest = memory;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
if (oldest) {
|
|
496
|
+
stats.oldestMemory = { id: oldest.id, createdAt: oldest.createdAt };
|
|
497
|
+
}
|
|
498
|
+
if (newest) {
|
|
499
|
+
stats.newestMemory = { id: newest.id, createdAt: newest.createdAt };
|
|
500
|
+
}
|
|
501
|
+
return stats;
|
|
502
|
+
}
|
|
503
|
+
export async function getSystemHealth() {
|
|
504
|
+
const result = {
|
|
505
|
+
overall: 'healthy',
|
|
506
|
+
database: { status: 'healthy' },
|
|
507
|
+
embeddings: { status: 'healthy', canStore: true, canSearch: true },
|
|
508
|
+
memoryCount: 0,
|
|
509
|
+
degradedReasons: [],
|
|
510
|
+
};
|
|
511
|
+
const dbStart = Date.now();
|
|
512
|
+
try {
|
|
513
|
+
const healthy = await isMemoryHealthy();
|
|
514
|
+
result.database = {
|
|
515
|
+
status: healthy ? 'healthy' : 'failed',
|
|
516
|
+
latencyMs: Date.now() - dbStart,
|
|
517
|
+
};
|
|
518
|
+
if (!healthy) {
|
|
519
|
+
result.degradedReasons.push('Database connection failed');
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
catch (error) {
|
|
523
|
+
result.database = {
|
|
524
|
+
status: 'failed',
|
|
525
|
+
latencyMs: Date.now() - dbStart,
|
|
526
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
527
|
+
};
|
|
528
|
+
result.degradedReasons.push('Database error');
|
|
529
|
+
}
|
|
530
|
+
try {
|
|
531
|
+
result.embeddings = await checkEmbeddingHealth();
|
|
532
|
+
if (result.embeddings.status !== 'healthy') {
|
|
533
|
+
result.degradedReasons.push(result.embeddings.reason || 'Embedding service issue');
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
catch (error) {
|
|
537
|
+
result.embeddings = {
|
|
538
|
+
status: 'failed',
|
|
539
|
+
canStore: false,
|
|
540
|
+
canSearch: false,
|
|
541
|
+
reason: error instanceof Error ? error.message : 'Unknown error',
|
|
542
|
+
};
|
|
543
|
+
result.degradedReasons.push('Embedding service error');
|
|
544
|
+
}
|
|
545
|
+
try {
|
|
546
|
+
const stats = await getMemoryStats();
|
|
547
|
+
result.memoryCount = stats.total;
|
|
548
|
+
}
|
|
549
|
+
catch {
|
|
550
|
+
// Non-critical
|
|
551
|
+
}
|
|
552
|
+
if (result.database.status === 'failed' || result.embeddings.status === 'failed') {
|
|
553
|
+
result.overall = 'failed';
|
|
554
|
+
}
|
|
555
|
+
else if (result.embeddings.status === 'degraded' || result.degradedReasons.length > 0) {
|
|
556
|
+
result.overall = 'degraded';
|
|
557
|
+
}
|
|
558
|
+
return result;
|
|
559
|
+
}
|
|
560
|
+
// ============================================================
|
|
561
|
+
// FORMATTING HELPERS
|
|
562
|
+
// ============================================================
|
|
563
|
+
export function formatMemory(memory) {
|
|
564
|
+
const lines = [];
|
|
565
|
+
const emoji = CATEGORY_EMOJI[memory.category || ''] || '\ud83d\udcdd';
|
|
566
|
+
lines.push(`${emoji} **${memory.category || 'Memory'}**`);
|
|
567
|
+
lines.push(memory.content);
|
|
568
|
+
if (memory.tags.length > 0) {
|
|
569
|
+
lines.push(`Tags: ${memory.tags.map(t => `\`${t}\``).join(' ')}`);
|
|
570
|
+
}
|
|
571
|
+
if (memory.sourceRef) {
|
|
572
|
+
lines.push(`Source: ${memory.sourceRef}`);
|
|
573
|
+
}
|
|
574
|
+
if ('relevanceScore' in memory) {
|
|
575
|
+
const pct = Math.round(memory.relevanceScore * 100);
|
|
576
|
+
lines.push(`Relevance: ${pct}%`);
|
|
577
|
+
}
|
|
578
|
+
return lines.join('\n');
|
|
579
|
+
}
|
|
580
|
+
export function formatSearchResults(results) {
|
|
581
|
+
if (results.length === 0) {
|
|
582
|
+
return 'No matching memories found.';
|
|
583
|
+
}
|
|
584
|
+
const formatted = results.map((r, i) => {
|
|
585
|
+
const pct = Math.round(r.relevanceScore * 100);
|
|
586
|
+
return `**${i + 1}.** [${pct}%] ${r.content.slice(0, 100)}${r.content.length > 100 ? '...' : ''}`;
|
|
587
|
+
});
|
|
588
|
+
return formatted.join('\n\n');
|
|
589
|
+
}
|
|
590
|
+
//# sourceMappingURL=memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.js","sourceRoot":"","sources":["../../src/lib/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Quality Gate v2 — Domain-Agnostic Memory Validation
|
|
3
|
+
*
|
|
4
|
+
* Three-layer architecture:
|
|
5
|
+
* Layer 1: Universal rejection (42 banned phrase regexes)
|
|
6
|
+
* Layer 2: Universal specificity (16 domain-agnostic markers)
|
|
7
|
+
* Layer 3: Code-specific boost (6 additive code markers)
|
|
8
|
+
*
|
|
9
|
+
* Three gate modes:
|
|
10
|
+
* - Strict gate: LLM extraction pipeline (≥3 markers, ≥80 chars, confidence ≥0.85)
|
|
11
|
+
* - Ingestion gate: MCP tools / agent writes (≥2 markers, ≥30 chars)
|
|
12
|
+
* - Light gate: Life Import bulk (≥20 chars, banned phrases only)
|
|
13
|
+
*
|
|
14
|
+
* ADR: [[MCP Redesign — Quality Gate v2]]
|
|
15
|
+
*/
|
|
16
|
+
export declare const BANNED_PHRASES: RegExp[];
|
|
17
|
+
export declare const UNIVERSAL_SPECIFICITY_MARKERS: RegExp[];
|
|
18
|
+
export declare const CODE_SPECIFICITY_MARKERS: RegExp[];
|
|
19
|
+
export declare const SPECIFICITY_MARKERS: RegExp[];
|
|
20
|
+
export declare const FLUFF_PATTERNS: RegExp[];
|
|
21
|
+
export interface QualityGateResult {
|
|
22
|
+
passes: boolean;
|
|
23
|
+
reason?: string;
|
|
24
|
+
}
|
|
25
|
+
interface LearningLike {
|
|
26
|
+
content: string;
|
|
27
|
+
confidence: number;
|
|
28
|
+
}
|
|
29
|
+
export declare function passesQualityGate(learning: LearningLike): boolean;
|
|
30
|
+
export declare function passesIngestionGate(content: string): QualityGateResult;
|
|
31
|
+
export declare function passesLightGate(content: string): QualityGateResult;
|
|
32
|
+
export {};
|