stellar-memory 0.8.4 → 1.0.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.
Files changed (140) hide show
  1. package/dist/api/routes/memories.js +5 -4
  2. package/dist/api/routes/memories.js.map +1 -1
  3. package/dist/api/websocket.d.ts +0 -6
  4. package/dist/api/websocket.js +1 -1
  5. package/dist/api/websocket.js.map +1 -1
  6. package/dist/engine/analytics.js +4 -33
  7. package/dist/engine/analytics.js.map +1 -1
  8. package/dist/engine/conflict.js +2 -4
  9. package/dist/engine/conflict.js.map +1 -1
  10. package/dist/engine/consolidation.js +3 -21
  11. package/dist/engine/consolidation.js.map +1 -1
  12. package/dist/engine/constellation.js +6 -14
  13. package/dist/engine/constellation.js.map +1 -1
  14. package/dist/engine/corona.js +3 -1
  15. package/dist/engine/corona.js.map +1 -1
  16. package/dist/engine/embedding.js.map +1 -1
  17. package/dist/engine/multiproject.js +6 -73
  18. package/dist/engine/multiproject.js.map +1 -1
  19. package/dist/engine/observation.d.ts +1 -42
  20. package/dist/engine/observation.js +4 -23
  21. package/dist/engine/observation.js.map +1 -1
  22. package/dist/engine/orbit.js +50 -11
  23. package/dist/engine/orbit.js.map +1 -1
  24. package/dist/engine/planet.d.ts +3 -0
  25. package/dist/engine/planet.js +16 -11
  26. package/dist/engine/planet.js.map +1 -1
  27. package/dist/engine/procedural.d.ts +0 -13
  28. package/dist/engine/procedural.js +2 -47
  29. package/dist/engine/procedural.js.map +1 -1
  30. package/dist/engine/services/commit-service.d.ts +29 -0
  31. package/dist/engine/services/commit-service.js +35 -0
  32. package/dist/engine/services/commit-service.js.map +1 -0
  33. package/dist/engine/services/index.d.ts +4 -0
  34. package/dist/engine/services/index.js +4 -0
  35. package/dist/engine/services/index.js.map +1 -0
  36. package/dist/engine/services/memory-service.d.ts +48 -0
  37. package/dist/engine/services/memory-service.js +85 -0
  38. package/dist/engine/services/memory-service.js.map +1 -0
  39. package/dist/engine/services/recall-service.d.ts +31 -0
  40. package/dist/engine/services/recall-service.js +35 -0
  41. package/dist/engine/services/recall-service.js.map +1 -0
  42. package/dist/engine/sun.d.ts +9 -5
  43. package/dist/engine/sun.js +111 -12
  44. package/dist/engine/sun.js.map +1 -1
  45. package/dist/engine/temporal.js +8 -67
  46. package/dist/engine/temporal.js.map +1 -1
  47. package/dist/engine/types.d.ts +0 -15
  48. package/dist/engine/types.js +0 -7
  49. package/dist/engine/types.js.map +1 -1
  50. package/dist/mcp/server.js +88 -123
  51. package/dist/mcp/server.js.map +1 -1
  52. package/dist/mcp/tools/analytics-handlers.d.ts +20 -0
  53. package/dist/mcp/tools/analytics-handlers.js +292 -0
  54. package/dist/mcp/tools/analytics-handlers.js.map +1 -0
  55. package/dist/mcp/tools/graph-handlers.d.ts +20 -0
  56. package/dist/mcp/tools/graph-handlers.js +126 -0
  57. package/dist/mcp/tools/graph-handlers.js.map +1 -0
  58. package/dist/mcp/tools/memory-handlers.d.ts +27 -0
  59. package/dist/mcp/tools/memory-handlers.js +177 -0
  60. package/dist/mcp/tools/memory-handlers.js.map +1 -0
  61. package/dist/mcp/tools/memory-tools.d.ts +19 -117
  62. package/dist/mcp/tools/memory-tools.js +19 -1049
  63. package/dist/mcp/tools/memory-tools.js.map +1 -1
  64. package/dist/mcp/tools/observation-handlers.d.ts +15 -0
  65. package/dist/mcp/tools/observation-handlers.js +74 -0
  66. package/dist/mcp/tools/observation-handlers.js.map +1 -0
  67. package/dist/mcp/tools/shared.d.ts +36 -0
  68. package/dist/mcp/tools/shared.js +71 -0
  69. package/dist/mcp/tools/shared.js.map +1 -0
  70. package/dist/mcp/tools/sun-handler.d.ts +12 -0
  71. package/dist/mcp/tools/sun-handler.js +35 -0
  72. package/dist/mcp/tools/sun-handler.js.map +1 -0
  73. package/dist/mcp/tools/system-handlers.d.ts +27 -0
  74. package/dist/mcp/tools/system-handlers.js +259 -0
  75. package/dist/mcp/tools/system-handlers.js.map +1 -0
  76. package/dist/mcp/tools/temporal-handlers.d.ts +15 -0
  77. package/dist/mcp/tools/temporal-handlers.js +82 -0
  78. package/dist/mcp/tools/temporal-handlers.js.map +1 -0
  79. package/dist/scanner/local/filesystem.d.ts +0 -2
  80. package/dist/scanner/local/filesystem.js +1 -5
  81. package/dist/scanner/local/filesystem.js.map +1 -1
  82. package/dist/scanner/local/git.d.ts +0 -5
  83. package/dist/scanner/local/git.js +1 -1
  84. package/dist/scanner/local/git.js.map +1 -1
  85. package/dist/scanner/metadata-scanner.d.ts +3 -14
  86. package/dist/scanner/metadata-scanner.js +10 -10
  87. package/dist/scanner/metadata-scanner.js.map +1 -1
  88. package/dist/service/scheduler.js +32 -13
  89. package/dist/service/scheduler.js.map +1 -1
  90. package/dist/storage/database.js +81 -2
  91. package/dist/storage/database.js.map +1 -1
  92. package/dist/storage/queries/analytics-queries.d.ts +59 -0
  93. package/dist/storage/queries/analytics-queries.js +265 -0
  94. package/dist/storage/queries/analytics-queries.js.map +1 -0
  95. package/dist/storage/queries/conflict-queries.d.ts +16 -0
  96. package/dist/storage/queries/conflict-queries.js +56 -0
  97. package/dist/storage/queries/conflict-queries.js.map +1 -0
  98. package/dist/storage/queries/constellation-queries.d.ts +18 -0
  99. package/dist/storage/queries/constellation-queries.js +101 -0
  100. package/dist/storage/queries/constellation-queries.js.map +1 -0
  101. package/dist/storage/queries/datasource-queries.d.ts +9 -0
  102. package/dist/storage/queries/datasource-queries.js +53 -0
  103. package/dist/storage/queries/datasource-queries.js.map +1 -0
  104. package/dist/storage/queries/memory-queries.d.ts +53 -0
  105. package/dist/storage/queries/memory-queries.js +415 -0
  106. package/dist/storage/queries/memory-queries.js.map +1 -0
  107. package/dist/storage/queries/observation-queries.d.ts +7 -0
  108. package/dist/storage/queries/observation-queries.js +23 -0
  109. package/dist/storage/queries/observation-queries.js.map +1 -0
  110. package/dist/storage/queries/orbit-queries.d.ts +7 -0
  111. package/dist/storage/queries/orbit-queries.js +23 -0
  112. package/dist/storage/queries/orbit-queries.js.map +1 -0
  113. package/dist/storage/queries/shared.d.ts +106 -0
  114. package/dist/storage/queries/shared.js +120 -0
  115. package/dist/storage/queries/shared.js.map +1 -0
  116. package/dist/storage/queries/sun-queries.d.ts +9 -0
  117. package/dist/storage/queries/sun-queries.js +43 -0
  118. package/dist/storage/queries/sun-queries.js.map +1 -0
  119. package/dist/storage/queries/temporal-queries.d.ts +32 -0
  120. package/dist/storage/queries/temporal-queries.js +112 -0
  121. package/dist/storage/queries/temporal-queries.js.map +1 -0
  122. package/dist/storage/queries.d.ts +15 -84
  123. package/dist/storage/queries.js +15 -896
  124. package/dist/storage/queries.js.map +1 -1
  125. package/dist/storage/vec.d.ts +5 -1
  126. package/dist/storage/vec.js +48 -24
  127. package/dist/storage/vec.js.map +1 -1
  128. package/dist/utils/config.d.ts +0 -1
  129. package/dist/utils/config.js +1 -1
  130. package/dist/utils/config.js.map +1 -1
  131. package/dist/utils/logger.d.ts +0 -2
  132. package/dist/utils/logger.js +0 -2
  133. package/dist/utils/logger.js.map +1 -1
  134. package/dist/utils/stopwords.d.ts +6 -0
  135. package/dist/utils/stopwords.js +22 -0
  136. package/dist/utils/stopwords.js.map +1 -0
  137. package/dist/utils/tokenizer.d.ts +2 -1
  138. package/dist/utils/tokenizer.js +7 -5
  139. package/dist/utils/tokenizer.js.map +1 -1
  140. package/package.json +79 -78
@@ -0,0 +1,415 @@
1
+ /**
2
+ * storage/queries/memory-queries.ts — Memory CRUD and search operations
3
+ */
4
+ import { randomUUID } from 'node:crypto';
5
+ import { getDatabase } from '../database.js';
6
+ import { ORBIT_ZONES } from '../../engine/types.js';
7
+ import { filterActiveMemories } from '../../engine/validity.js';
8
+ import { asRawMemory, deserializeMemory, escapeFtsQuery, } from './shared.js';
9
+ // ---------------------------------------------------------------------------
10
+ // Memory CRUD
11
+ // ---------------------------------------------------------------------------
12
+ export function insertMemory(memory) {
13
+ const db = getDatabase();
14
+ const now = new Date().toISOString();
15
+ const id = memory.id ?? randomUUID();
16
+ const project = memory.project ?? 'default';
17
+ const content = memory.content ?? '';
18
+ const summary = memory.summary ?? '';
19
+ const type = memory.type ?? 'observation';
20
+ const tags = JSON.stringify(memory.tags ?? []);
21
+ const distance = memory.distance ?? 5.0;
22
+ const importance = memory.importance ?? 0.5;
23
+ const velocity = memory.velocity ?? 0.0;
24
+ const impact = memory.impact ?? 0.5;
25
+ const access_count = memory.access_count ?? 0;
26
+ const last_accessed_at = memory.last_accessed_at ?? null;
27
+ const metadata = JSON.stringify(memory.metadata ?? {});
28
+ const source = memory.source ?? 'manual';
29
+ const source_path = memory.source_path ?? null;
30
+ const source_hash = memory.source_hash ?? null;
31
+ const content_hash = memory.content_hash ?? null;
32
+ const created_at = memory.created_at ?? now;
33
+ const updated_at = memory.updated_at ?? now;
34
+ const deleted_at = memory.deleted_at ?? null;
35
+ const valid_from = memory.valid_from ?? null;
36
+ const valid_until = memory.valid_until ?? null;
37
+ const superseded_by = memory.superseded_by ?? null;
38
+ const consolidated_into = memory.consolidated_into ?? null;
39
+ const quality_score = memory.quality_score ?? null;
40
+ const is_universal = memory.is_universal ? 1 : 0;
41
+ db.prepare(`
42
+ INSERT INTO memories (
43
+ id, project, content, summary, type, tags,
44
+ distance, importance, velocity, impact,
45
+ access_count, last_accessed_at, metadata,
46
+ source, source_path, source_hash, content_hash,
47
+ created_at, updated_at, deleted_at,
48
+ valid_from, valid_until, superseded_by,
49
+ consolidated_into, quality_score, is_universal
50
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
51
+ `).run(id, project, content, summary, type, tags, distance, importance, velocity, impact, access_count, last_accessed_at, metadata, source, source_path, source_hash, content_hash, created_at, updated_at, deleted_at, valid_from, valid_until, superseded_by, consolidated_into, quality_score, is_universal);
52
+ return {
53
+ id, project, content, summary,
54
+ type: type,
55
+ tags: memory.tags ?? [],
56
+ distance, importance, velocity, impact,
57
+ access_count, last_accessed_at, metadata: memory.metadata ?? {},
58
+ source, source_path, source_hash, content_hash,
59
+ created_at, updated_at, deleted_at,
60
+ valid_from: valid_from ?? undefined,
61
+ valid_until: valid_until ?? undefined,
62
+ superseded_by: superseded_by ?? undefined,
63
+ consolidated_into: consolidated_into ?? undefined,
64
+ quality_score: quality_score ?? undefined,
65
+ is_universal: Boolean(is_universal),
66
+ };
67
+ }
68
+ export function getMemoryById(id) {
69
+ const db = getDatabase();
70
+ const row = db.prepare(`SELECT * FROM memories WHERE id = ?`).get(id);
71
+ return row ? deserializeMemory(asRawMemory(row)) : null;
72
+ }
73
+ export function getMemoryByIds(ids) {
74
+ if (ids.length === 0)
75
+ return [];
76
+ const db = getDatabase();
77
+ const placeholders = ids.map(() => '?').join(', ');
78
+ const rows = db.prepare(`
79
+ SELECT * FROM memories
80
+ WHERE id IN (${placeholders})
81
+ AND deleted_at IS NULL
82
+ `).all(...ids);
83
+ return filterActiveMemories(rows.map((r) => deserializeMemory(asRawMemory(r))));
84
+ }
85
+ export function getMemoriesByProject(project, includeDeleted = false) {
86
+ const db = getDatabase();
87
+ const sql = includeDeleted
88
+ ? `SELECT * FROM memories WHERE project = ? ORDER BY distance ASC`
89
+ : `SELECT * FROM memories WHERE project = ? AND deleted_at IS NULL ORDER BY distance ASC`;
90
+ const rows = db.prepare(sql).all(project);
91
+ return filterActiveMemories(rows.map((r) => deserializeMemory(asRawMemory(r))));
92
+ }
93
+ export function getRecentMemories(project, hoursAgo = 3) {
94
+ const db = getDatabase();
95
+ const cutoff = new Date(Date.now() - hoursAgo * 60 * 60 * 1000).toISOString();
96
+ const rows = db.prepare(`
97
+ SELECT * FROM memories
98
+ WHERE project = ?
99
+ AND deleted_at IS NULL
100
+ AND created_at > ?
101
+ ORDER BY created_at DESC
102
+ `).all(project, cutoff);
103
+ return filterActiveMemories(rows.map((r) => deserializeMemory(asRawMemory(r))));
104
+ }
105
+ export function getMemoriesInZone(project, zone) {
106
+ const db = getDatabase();
107
+ const { min, max } = ORBIT_ZONES[zone];
108
+ const rows = db.prepare(`
109
+ SELECT * FROM memories
110
+ WHERE project = ?
111
+ AND deleted_at IS NULL
112
+ AND distance >= ?
113
+ AND distance < ?
114
+ ORDER BY distance ASC
115
+ `).all(project, min, max);
116
+ return filterActiveMemories(rows.map((r) => deserializeMemory(asRawMemory(r))));
117
+ }
118
+ export function getNearestMemories(project, limit) {
119
+ const db = getDatabase();
120
+ const rows = db.prepare(`
121
+ SELECT * FROM memories
122
+ WHERE project = ? AND deleted_at IS NULL
123
+ ORDER BY distance ASC
124
+ LIMIT ?
125
+ `).all(project, limit);
126
+ return rows.map((r) => deserializeMemory(asRawMemory(r)));
127
+ }
128
+ export function updateMemoryOrbit(id, distance, importance, velocity) {
129
+ const db = getDatabase();
130
+ const now = new Date().toISOString();
131
+ db.prepare(`
132
+ UPDATE memories
133
+ SET distance = ?, importance = ?, velocity = ?, updated_at = ?
134
+ WHERE id = ?
135
+ `).run(distance, importance, velocity, now, id);
136
+ }
137
+ export function updateMemoryAccess(id) {
138
+ const db = getDatabase();
139
+ const now = new Date().toISOString();
140
+ db.prepare(`
141
+ UPDATE memories
142
+ SET access_count = access_count + 1,
143
+ last_accessed_at = ?,
144
+ updated_at = ?
145
+ WHERE id = ?
146
+ `).run(now, now, id);
147
+ }
148
+ export function softDeleteMemory(id) {
149
+ const db = getDatabase();
150
+ const now = new Date().toISOString();
151
+ db.prepare(`
152
+ UPDATE memories
153
+ SET deleted_at = ?, updated_at = ?
154
+ WHERE id = ?
155
+ `).run(now, now, id);
156
+ }
157
+ export function updateMemoryContent(id, content) {
158
+ const db = getDatabase();
159
+ const now = new Date().toISOString();
160
+ db.prepare(`
161
+ UPDATE memories SET content = ?, updated_at = ? WHERE id = ?
162
+ `).run(content, now, id);
163
+ }
164
+ export function updateQualityScore(memoryId, score) {
165
+ const db = getDatabase();
166
+ const now = new Date().toISOString();
167
+ db.prepare(`
168
+ UPDATE memories SET quality_score = ?, updated_at = ? WHERE id = ?
169
+ `).run(score, now, memoryId);
170
+ }
171
+ // ---------------------------------------------------------------------------
172
+ // Source-path deduplication
173
+ // ---------------------------------------------------------------------------
174
+ export function memoryExistsForSource(sourcePath, sourceHash) {
175
+ const db = getDatabase();
176
+ const row = db.prepare(`
177
+ SELECT id FROM memories
178
+ WHERE source_path = ? AND source_hash = ? AND deleted_at IS NULL
179
+ LIMIT 1
180
+ `).get(sourcePath, sourceHash);
181
+ return row !== undefined;
182
+ }
183
+ export function getMemoryBySourcePath(sourcePath) {
184
+ const db = getDatabase();
185
+ const row = db.prepare(`
186
+ SELECT * FROM memories
187
+ WHERE source_path = ? AND deleted_at IS NULL
188
+ LIMIT 1
189
+ `).get(sourcePath);
190
+ return row ? deserializeMemory(asRawMemory(row)) : null;
191
+ }
192
+ export function getMemoryByContentHash(project, contentHash) {
193
+ const db = getDatabase();
194
+ const row = db.prepare(`
195
+ SELECT * FROM memories
196
+ WHERE project = ? AND content_hash = ? AND deleted_at IS NULL
197
+ LIMIT 1
198
+ `).get(project, contentHash);
199
+ return row ? deserializeMemory(asRawMemory(row)) : null;
200
+ }
201
+ // ---------------------------------------------------------------------------
202
+ // Full-text search (FTS5)
203
+ // ---------------------------------------------------------------------------
204
+ export function searchMemories(project, query, limit = 20) {
205
+ const db = getDatabase();
206
+ const escapedQuery = escapeFtsQuery(query);
207
+ const rows = db.prepare(`
208
+ SELECT m.*
209
+ FROM memories m
210
+ JOIN memories_fts fts ON m.rowid = fts.rowid
211
+ WHERE memories_fts MATCH ?
212
+ AND m.project = ?
213
+ AND m.deleted_at IS NULL
214
+ AND m.superseded_by IS NULL
215
+ AND (m.valid_from IS NULL OR m.valid_from <= datetime('now'))
216
+ AND (m.valid_until IS NULL OR m.valid_until > datetime('now'))
217
+ ORDER BY rank
218
+ LIMIT ?
219
+ `).all(escapedQuery, project, limit);
220
+ return filterActiveMemories(rows.map((r) => deserializeMemory(asRawMemory(r))));
221
+ }
222
+ export function searchMemoriesInRange(project, query, minDistance, maxDistance, limit) {
223
+ const db = getDatabase();
224
+ const escapedQuery = escapeFtsQuery(query);
225
+ const rows = db.prepare(`
226
+ SELECT m.*
227
+ FROM memories m
228
+ JOIN memories_fts fts ON m.rowid = fts.rowid
229
+ WHERE memories_fts MATCH ?
230
+ AND m.project = ?
231
+ AND m.deleted_at IS NULL
232
+ AND m.superseded_by IS NULL
233
+ AND (m.valid_from IS NULL OR m.valid_from <= datetime('now'))
234
+ AND (m.valid_until IS NULL OR m.valid_until > datetime('now'))
235
+ AND m.distance >= ?
236
+ AND m.distance < ?
237
+ ORDER BY rank
238
+ LIMIT ?
239
+ `).all(escapedQuery, project, minDistance, maxDistance, limit);
240
+ return filterActiveMemories(rows.map((r) => deserializeMemory(asRawMemory(r))));
241
+ }
242
+ // ---------------------------------------------------------------------------
243
+ // Consolidation queries
244
+ // ---------------------------------------------------------------------------
245
+ export function consolidateMemories(sourceIds, targetId) {
246
+ if (sourceIds.length === 0)
247
+ return;
248
+ const db = getDatabase();
249
+ const now = new Date().toISOString();
250
+ const placeholders = sourceIds.map(() => '?').join(', ');
251
+ db.prepare(`
252
+ UPDATE memories
253
+ SET consolidated_into = ?, updated_at = ?
254
+ WHERE id IN (${placeholders})
255
+ `).run(targetId, now, ...sourceIds);
256
+ }
257
+ export function getConsolidationHistory(memoryId) {
258
+ const db = getDatabase();
259
+ const rows = db.prepare(`
260
+ SELECT * FROM memories
261
+ WHERE consolidated_into = ?
262
+ ORDER BY created_at ASC
263
+ `).all(memoryId);
264
+ return rows.map((r) => deserializeMemory(asRawMemory(r)));
265
+ }
266
+ // ---------------------------------------------------------------------------
267
+ // Multi-project queries
268
+ // ---------------------------------------------------------------------------
269
+ export function getUniversalMemories(limit = 50) {
270
+ const db = getDatabase();
271
+ const rows = db.prepare(`
272
+ SELECT * FROM memories
273
+ WHERE is_universal = 1 AND deleted_at IS NULL
274
+ ORDER BY importance DESC
275
+ LIMIT ?
276
+ `).all(limit);
277
+ return rows.map((r) => deserializeMemory(asRawMemory(r)));
278
+ }
279
+ export function setUniversal(memoryId, isUniversal) {
280
+ const db = getDatabase();
281
+ const now = new Date().toISOString();
282
+ db.prepare(`
283
+ UPDATE memories SET is_universal = ?, updated_at = ? WHERE id = ?
284
+ `).run(isUniversal ? 1 : 0, now, memoryId);
285
+ }
286
+ export function listProjects() {
287
+ const db = getDatabase();
288
+ const rows = db.prepare(`
289
+ SELECT project, COUNT(*) as count
290
+ FROM memories
291
+ WHERE deleted_at IS NULL
292
+ GROUP BY project
293
+ ORDER BY count DESC
294
+ `).all();
295
+ return rows.map((r) => {
296
+ const row = r;
297
+ return { project: row.project, count: row.count };
298
+ });
299
+ }
300
+ // ---------------------------------------------------------------------------
301
+ // Stored embedding lookup (used by orbit.ts and consolidation.ts)
302
+ // ---------------------------------------------------------------------------
303
+ export function getStoredEmbeddingForMemory(memoryId) {
304
+ try {
305
+ const db = getDatabase();
306
+ const row = db.prepare(`SELECT me.embedding
307
+ FROM memory_embeddings me
308
+ JOIN memory_embedding_map mm ON mm.vec_rowid = me.rowid
309
+ WHERE mm.memory_id = ?`).get(memoryId);
310
+ if (!row?.embedding)
311
+ return null;
312
+ return new Float32Array(row.embedding.buffer, row.embedding.byteOffset, row.embedding.byteLength / 4);
313
+ }
314
+ catch {
315
+ return null;
316
+ }
317
+ }
318
+ /**
319
+ * Get the embedding of the highest-importance memory in a project.
320
+ * Used by orbit.ts to compute sun-context relevance via hybridRelevance.
321
+ */
322
+ export function getTopProjectEmbedding(project) {
323
+ try {
324
+ const db = getDatabase();
325
+ const sunRow = db.prepare(`SELECT e.embedding
326
+ FROM memory_embeddings e
327
+ JOIN memory_embedding_map map ON map.vec_rowid = e.rowid
328
+ JOIN memories m ON m.id = map.memory_id
329
+ WHERE m.project = ? AND m.deleted_at IS NULL
330
+ ORDER BY m.importance DESC LIMIT 1`).get(project);
331
+ if (!sunRow?.embedding)
332
+ return null;
333
+ return new Float32Array(sunRow.embedding.buffer, sunRow.embedding.byteOffset, sunRow.embedding.byteLength / 4);
334
+ }
335
+ catch {
336
+ return null;
337
+ }
338
+ }
339
+ // ---------------------------------------------------------------------------
340
+ // Project listing
341
+ // ---------------------------------------------------------------------------
342
+ /**
343
+ * Return the list of distinct project names that have at least one non-deleted memory.
344
+ */
345
+ export function getAllProjects() {
346
+ const db = getDatabase();
347
+ const rows = db.prepare('SELECT DISTINCT project FROM memories WHERE deleted_at IS NULL').all();
348
+ return rows.map((r) => r.project);
349
+ }
350
+ // ---------------------------------------------------------------------------
351
+ // Hard-delete (purge) and curation
352
+ // ---------------------------------------------------------------------------
353
+ /**
354
+ * Permanently remove soft-deleted memories older than the given number of days.
355
+ * Also cleans up related embeddings, constellation edges, and orbit log entries.
356
+ */
357
+ export function purgeDeletedMemories(project, olderThanDays = 30) {
358
+ const db = getDatabase();
359
+ const cutoff = new Date(Date.now() - olderThanDays * 24 * 60 * 60 * 1000).toISOString();
360
+ const rawIds = db.prepare(`
361
+ SELECT id FROM memories
362
+ WHERE project = ? AND deleted_at IS NOT NULL AND deleted_at < ?
363
+ `).all(project, cutoff);
364
+ if (rawIds.length === 0)
365
+ return 0;
366
+ const ids = rawIds.map((r) => r.id);
367
+ const placeholders = ids.map(() => '?').join(', ');
368
+ db.prepare(`DELETE FROM constellation_edges WHERE source_id IN (${placeholders}) OR target_id IN (${placeholders})`).run(...ids, ...ids);
369
+ db.prepare(`DELETE FROM orbit_log WHERE memory_id IN (${placeholders})`).run(...ids);
370
+ const mapRows = db.prepare(`SELECT vec_rowid FROM memory_embedding_map WHERE memory_id IN (${placeholders})`).all(...ids);
371
+ if (mapRows.length > 0) {
372
+ const vecRowids = mapRows.map((r) => r.vec_rowid);
373
+ const vecPlaceholders = vecRowids.map(() => '?').join(', ');
374
+ try {
375
+ db.prepare(`DELETE FROM memory_embeddings WHERE rowid IN (${vecPlaceholders})`).run(...vecRowids);
376
+ }
377
+ catch { /* sqlite-vec may be unavailable */ }
378
+ }
379
+ db.prepare(`DELETE FROM memory_embedding_map WHERE memory_id IN (${placeholders})`).run(...ids);
380
+ db.prepare(`DELETE FROM memories WHERE id IN (${placeholders})`).run(...ids);
381
+ return ids.length;
382
+ }
383
+ /**
384
+ * Soft-delete noisy or superseded memories.
385
+ * Returns count and breakdown by reason.
386
+ */
387
+ export function curateMemories(project) {
388
+ const db = getDatabase();
389
+ const now = new Date().toISOString();
390
+ const reasons = {};
391
+ const lowQuality = db.prepare(`
392
+ UPDATE memories SET deleted_at = ?
393
+ WHERE project = ? AND deleted_at IS NULL
394
+ AND quality_score < 0.3 AND access_count = 0
395
+ AND created_at < datetime('now', '-14 days')
396
+ `).run(now, project);
397
+ reasons['low_quality_unaccessed'] = Number(lowQuality.changes);
398
+ const superseded = db.prepare(`
399
+ UPDATE memories SET deleted_at = ?
400
+ WHERE project = ? AND deleted_at IS NULL
401
+ AND superseded_by IS NOT NULL
402
+ AND updated_at < datetime('now', '-7 days')
403
+ `).run(now, project);
404
+ reasons['superseded'] = Number(superseded.changes);
405
+ const consolidated = db.prepare(`
406
+ UPDATE memories SET deleted_at = ?
407
+ WHERE project = ? AND deleted_at IS NULL
408
+ AND consolidated_into IS NOT NULL
409
+ AND updated_at < datetime('now', '-7 days')
410
+ `).run(now, project);
411
+ reasons['consolidated_sources'] = Number(consolidated.changes);
412
+ const total = Object.values(reasons).reduce((a, b) => a + b, 0);
413
+ return { deleted: total, reasons };
414
+ }
415
+ //# sourceMappingURL=memory-queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-queries.js","sourceRoot":"","sources":["../../../src/storage/queries/memory-queries.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * storage/queries/observation-queries.ts — Observation log operations
3
+ */
4
+ import type { ObservationEntry } from '../../engine/types.js';
5
+ export declare function createObservation(entry: ObservationEntry): void;
6
+ export declare function getObservations(project: string, limit?: number): ObservationEntry[];
7
+ //# sourceMappingURL=observation-queries.d.ts.map
@@ -0,0 +1,23 @@
1
+ /**
2
+ * storage/queries/observation-queries.ts — Observation log operations
3
+ */
4
+ import { getDatabase } from '../database.js';
5
+ import { deserializeObservation } from './shared.js';
6
+ export function createObservation(entry) {
7
+ const db = getDatabase();
8
+ db.prepare(`
9
+ INSERT INTO observation_log (id, content, extracted_memories, source, project, created_at)
10
+ VALUES (?, ?, ?, ?, ?, ?)
11
+ `).run(entry.id, entry.content, JSON.stringify(entry.extracted_memories), entry.source, entry.project, entry.created_at);
12
+ }
13
+ export function getObservations(project, limit = 20) {
14
+ const db = getDatabase();
15
+ const rows = db.prepare(`
16
+ SELECT * FROM observation_log
17
+ WHERE project = ?
18
+ ORDER BY created_at DESC
19
+ LIMIT ?
20
+ `).all(project, limit);
21
+ return rows.map((r) => deserializeObservation(r));
22
+ }
23
+ //# sourceMappingURL=observation-queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation-queries.js","sourceRoot":"","sources":["../../../src/storage/queries/observation-queries.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAqB,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,UAAU,iBAAiB,CAAC,KAAuB;IACvD,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACzB,EAAE,CAAC,OAAO,CAAC;;;GAGV,CAAC,CAAC,GAAG,CACJ,KAAK,CAAC,EAAE,EACR,KAAK,CAAC,OAAO,EACb,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,kBAAkB,CAAC,EACxC,KAAK,CAAC,MAAM,EACZ,KAAK,CAAC,OAAO,EACb,KAAK,CAAC,UAAU,CACjB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,KAAK,GAAG,EAAE;IACzD,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC;;;;;GAKvB,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAc,CAAC;IACpC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAsB,CAAC,CAAC,CAAC;AACzE,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * storage/queries/orbit-queries.ts — Orbit log operations
3
+ */
4
+ import type { OrbitChange } from '../../engine/types.js';
5
+ export declare function insertOrbitLog(change: OrbitChange): void;
6
+ export declare function cleanupOrbitLog(retentionDays?: number): number;
7
+ //# sourceMappingURL=orbit-queries.d.ts.map
@@ -0,0 +1,23 @@
1
+ /**
2
+ * storage/queries/orbit-queries.ts — Orbit log operations
3
+ */
4
+ import { getDatabase } from '../database.js';
5
+ export function insertOrbitLog(change) {
6
+ const db = getDatabase();
7
+ const now = new Date().toISOString();
8
+ db.prepare(`
9
+ INSERT INTO orbit_log (
10
+ memory_id, project,
11
+ old_distance, new_distance,
12
+ old_importance, new_importance,
13
+ trigger, created_at
14
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
15
+ `).run(change.memory_id, change.project, change.old_distance, change.new_distance, change.old_importance, change.new_importance, change.trigger, now);
16
+ }
17
+ export function cleanupOrbitLog(retentionDays = 90) {
18
+ const db = getDatabase();
19
+ const cutoff = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1000).toISOString();
20
+ const result = db.prepare('DELETE FROM orbit_log WHERE created_at < ?').run(cutoff);
21
+ return Number(result.changes);
22
+ }
23
+ //# sourceMappingURL=orbit-queries.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orbit-queries.js","sourceRoot":"","sources":["../../../src/storage/queries/orbit-queries.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,MAAM,UAAU,cAAc,CAAC,MAAmB;IAChD,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErC,EAAE,CAAC,OAAO,CAAC;;;;;;;GAOV,CAAC,CAAC,GAAG,CACJ,MAAM,CAAC,SAAS,EAChB,MAAM,CAAC,OAAO,EACd,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,cAAc,EACrB,MAAM,CAAC,OAAO,EACd,GAAG,CACJ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,gBAAwB,EAAE;IACxD,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACxF,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACpF,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * storage/queries/shared.ts — Raw DB row shapes, cast helpers, and deserializers
3
+ *
4
+ * These are internal to the queries layer. Nothing outside storage/ should
5
+ * import from this file directly.
6
+ */
7
+ import type { Memory, SunState, ConstellationEdge, MemoryConflict, ObservationEntry } from '../../engine/types.js';
8
+ import type { DataSource } from '../../scanner/types.js';
9
+ export interface RawMemoryRow {
10
+ id: string;
11
+ project: string;
12
+ content: string;
13
+ summary: string;
14
+ type: string;
15
+ tags: string;
16
+ distance: number;
17
+ importance: number;
18
+ velocity: number;
19
+ impact: number;
20
+ access_count: number;
21
+ last_accessed_at: string | null;
22
+ metadata: string;
23
+ source: string | null;
24
+ source_path: string | null;
25
+ source_hash: string | null;
26
+ content_hash: string | null;
27
+ created_at: string;
28
+ updated_at: string;
29
+ deleted_at: string | null;
30
+ valid_from: string | null;
31
+ valid_until: string | null;
32
+ superseded_by: string | null;
33
+ consolidated_into: string | null;
34
+ quality_score: number | null;
35
+ is_universal: number | null;
36
+ }
37
+ export interface RawConstellationEdgeRow {
38
+ id: string;
39
+ source_id: string;
40
+ target_id: string;
41
+ relation: string;
42
+ weight: number;
43
+ project: string;
44
+ metadata: string;
45
+ created_at: string;
46
+ }
47
+ export interface RawConflictRow {
48
+ id: string;
49
+ memory_id: string;
50
+ conflicting_memory_id: string;
51
+ severity: string;
52
+ description: string;
53
+ status: string;
54
+ resolution: string | null;
55
+ project: string;
56
+ created_at: string;
57
+ resolved_at: string | null;
58
+ }
59
+ export interface RawObservationRow {
60
+ id: string;
61
+ content: string;
62
+ extracted_memories: string;
63
+ source: string;
64
+ project: string;
65
+ created_at: string;
66
+ }
67
+ export interface RawDataSourceRow {
68
+ id: string;
69
+ path: string;
70
+ type: string;
71
+ status: string;
72
+ last_scanned_at: string | null;
73
+ file_count: number;
74
+ total_size: number;
75
+ config: string;
76
+ created_at: string;
77
+ updated_at: string;
78
+ }
79
+ export interface RawSunStateRow {
80
+ project: string;
81
+ content: string;
82
+ current_work: string;
83
+ recent_decisions: string;
84
+ next_steps: string;
85
+ active_errors: string;
86
+ project_context: string;
87
+ token_count: number;
88
+ last_commit_at: string | null;
89
+ updated_at: string;
90
+ }
91
+ export declare function asRawMemory(row: unknown): RawMemoryRow;
92
+ export declare function asRawSunState(row: unknown): RawSunStateRow;
93
+ export declare function asRawDataSource(row: unknown): RawDataSourceRow;
94
+ export declare function deserializeMemory(row: RawMemoryRow): Memory;
95
+ export declare function deserializeConstellationEdge(row: RawConstellationEdgeRow): ConstellationEdge;
96
+ export declare function deserializeConflict(row: RawConflictRow): MemoryConflict;
97
+ export declare function deserializeObservation(row: RawObservationRow): ObservationEntry;
98
+ export declare function deserializeDataSource(row: RawDataSourceRow): DataSource;
99
+ export declare function deserializeSunState(row: RawSunStateRow): SunState;
100
+ export declare function parseJsonArray(value: string | null | undefined): string[];
101
+ export declare function parseJsonObject(value: string | null | undefined): Record<string, unknown>;
102
+ /**
103
+ * Escape a user-supplied string for use in an FTS5 MATCH clause.
104
+ */
105
+ export declare function escapeFtsQuery(query: string): string;
106
+ //# sourceMappingURL=shared.d.ts.map