@devflow-tools/memory-engine 0.16.2 → 0.16.3

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 (44) hide show
  1. package/dist/embedding-provider.d.ts +2 -0
  2. package/dist/embedding-provider.d.ts.map +1 -1
  3. package/dist/embedding-provider.js +15 -0
  4. package/dist/embedding-provider.js.map +1 -1
  5. package/dist/hybrid-search.d.ts +9 -0
  6. package/dist/hybrid-search.d.ts.map +1 -1
  7. package/dist/hybrid-search.js +97 -19
  8. package/dist/hybrid-search.js.map +1 -1
  9. package/dist/index.d.ts +2 -0
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +1 -0
  12. package/dist/index.js.map +1 -1
  13. package/dist/lease-store.d.ts +8 -0
  14. package/dist/lease-store.d.ts.map +1 -1
  15. package/dist/lease-store.js +20 -0
  16. package/dist/lease-store.js.map +1 -1
  17. package/dist/memory-engine.d.ts.map +1 -1
  18. package/dist/memory-engine.js +81 -10
  19. package/dist/memory-engine.js.map +1 -1
  20. package/dist/memory-gate.d.ts +1 -1
  21. package/dist/memory-gate.d.ts.map +1 -1
  22. package/dist/memory-gate.js +51 -15
  23. package/dist/memory-gate.js.map +1 -1
  24. package/dist/memory-maintenance.d.ts +123 -0
  25. package/dist/memory-maintenance.d.ts.map +1 -0
  26. package/dist/memory-maintenance.js +594 -0
  27. package/dist/memory-maintenance.js.map +1 -0
  28. package/dist/memory-store.d.ts +81 -0
  29. package/dist/memory-store.d.ts.map +1 -1
  30. package/dist/memory-store.js +342 -27
  31. package/dist/memory-store.js.map +1 -1
  32. package/dist/migrations/v3-to-v4.d.ts +3 -0
  33. package/dist/migrations/v3-to-v4.d.ts.map +1 -0
  34. package/dist/migrations/v3-to-v4.js +93 -0
  35. package/dist/migrations/v3-to-v4.js.map +1 -0
  36. package/dist/observation-quality.d.ts +39 -0
  37. package/dist/observation-quality.d.ts.map +1 -0
  38. package/dist/observation-quality.js +190 -0
  39. package/dist/observation-quality.js.map +1 -0
  40. package/dist/session-summarizer.d.ts +1 -1
  41. package/dist/session-summarizer.d.ts.map +1 -1
  42. package/dist/session-summarizer.js +3 -0
  43. package/dist/session-summarizer.js.map +1 -1
  44. package/package.json +4 -4
@@ -0,0 +1,594 @@
1
+ import Database from 'better-sqlite3';
2
+ import { createHash, randomUUID } from 'node:crypto';
3
+ import { existsSync, mkdirSync } from 'node:fs';
4
+ import { dirname, join } from 'node:path';
5
+ import { assertEmbeddingBatch, EmbeddingProvider } from './embedding-provider.js';
6
+ import { LeaseStore } from './lease-store.js';
7
+ import { MemoryStore } from './memory-store.js';
8
+ import { evaluateStoredObservationQuality, normalizeClusterText, observationClusterKey, } from './observation-quality.js';
9
+ export const MEMORY_MAINTENANCE_ACTIONS = [
10
+ 'dedupe-events',
11
+ 'quarantine-observations',
12
+ 'backfill-vectors',
13
+ 'release-stale-leases',
14
+ 'reprocess-pending',
15
+ ];
16
+ const BACKFILL_CHECKPOINT = 'observation-vector-backfill';
17
+ const PENDING_WARN_MS = 24 * 60 * 60 * 1000;
18
+ const DUPLICATE_RATE_WARN = 0.01;
19
+ const VECTOR_COVERAGE_WARN = 0.95;
20
+ const RETRIEVAL_DUPLICATE_WARN = 0.1;
21
+ const AUTOMATIC_QUARANTINE_REASONS = new Set([
22
+ 'operational_noise',
23
+ 'repeated_fallback',
24
+ 'generic_claim',
25
+ ]);
26
+ export class MemoryMaintenance {
27
+ projectRoot;
28
+ embedder;
29
+ databasePath;
30
+ constructor(projectRoot, embedder = new EmbeddingProvider()) {
31
+ this.projectRoot = projectRoot;
32
+ this.embedder = embedder;
33
+ this.databasePath = join(projectRoot, '.devflow', 'memory', 'memories.db');
34
+ }
35
+ diagnose(options = {}) {
36
+ return inspectDatabase(this.databasePath, options.duplicateWindowMs ?? 5_000).diagnostics;
37
+ }
38
+ async run(options = {}) {
39
+ if (options.apply && options.dryRun) {
40
+ throw new Error('Memory maintenance accepts either dry-run or apply mode, not both');
41
+ }
42
+ const actions = normalizeActions(options.actions);
43
+ const apply = options.apply === true;
44
+ const generatedAt = Date.now();
45
+ const id = `maint:${generatedAt}:${randomUUID().slice(0, 8)}`;
46
+ const duplicateWindowMs = options.duplicateWindowMs ?? 5_000;
47
+ const beforeInspection = inspectDatabase(this.databasePath, duplicateWindowMs);
48
+ const manifest = {
49
+ id,
50
+ schemaVersion: 1,
51
+ projectRoot: this.projectRoot,
52
+ databasePath: this.databasePath,
53
+ mode: apply ? 'apply' : 'dry-run',
54
+ generatedAt,
55
+ actions,
56
+ before: beforeInspection.diagnostics,
57
+ after: beforeInspection.diagnostics,
58
+ findings: {
59
+ duplicateEventGroups: actions.includes('dedupe-events')
60
+ ? beforeInspection.duplicateGroups
61
+ : [],
62
+ observationQuarantine: actions.includes('quarantine-observations')
63
+ ? beforeInspection.quarantineCandidates
64
+ : [],
65
+ missingVectorIds: actions.includes('backfill-vectors')
66
+ ? beforeInspection.missingVectorIds
67
+ : [],
68
+ staleLeaseIds: actions.includes('release-stale-leases')
69
+ ? beforeInspection.staleLeaseIds
70
+ : [],
71
+ reprocessEventIds: actions.includes('reprocess-pending')
72
+ ? beforeInspection.reprocessEventIds
73
+ : [],
74
+ },
75
+ changes: {
76
+ duplicateEventsDeleted: 0,
77
+ duplicateGroupsQuarantined: 0,
78
+ observationReferencesRewritten: 0,
79
+ observationsQuarantined: 0,
80
+ vectorsBackfilled: 0,
81
+ staleLeasesReleased: 0,
82
+ eventsRequeued: 0,
83
+ },
84
+ errors: [],
85
+ };
86
+ if (!apply || !existsSync(this.databasePath))
87
+ return manifest;
88
+ manifest.backupPath = await backupDatabase(this.databasePath, this.projectRoot, generatedAt);
89
+ const store = new MemoryStore(this.projectRoot);
90
+ const leases = new LeaseStore(getStoreDatabase(store));
91
+ store.setLeaseStore(leases);
92
+ try {
93
+ if (actions.includes('dedupe-events')) {
94
+ for (const group of beforeInspection.duplicateGroups) {
95
+ try {
96
+ if (group.ambiguous) {
97
+ manifest.changes.duplicateGroupsQuarantined += store.quarantineDuplicateEvents(group.groupKey, group.eventIds, group.reason ?? 'ambiguous_duplicate_group') > 0 ? 1 : 0;
98
+ continue;
99
+ }
100
+ const result = store.deduplicateEvents(group.canonicalId, group.duplicateIds, id);
101
+ manifest.changes.duplicateEventsDeleted += result.deleted;
102
+ manifest.changes.observationReferencesRewritten += result.observationsRewritten;
103
+ }
104
+ catch (error) {
105
+ store.quarantineDuplicateEvents(group.groupKey, group.eventIds, 'dedupe_apply_conflict');
106
+ manifest.changes.duplicateGroupsQuarantined += 1;
107
+ manifest.errors.push({ action: 'dedupe-events', message: errorMessage(error) });
108
+ }
109
+ }
110
+ }
111
+ if (actions.includes('quarantine-observations')) {
112
+ const candidates = new Map(beforeInspection.quarantineCandidates.map(candidate => [candidate.id, candidate.reason]));
113
+ const events = store.listAllEvents();
114
+ for (const observation of store.listObservations({ qualityStatus: 'accepted' })) {
115
+ const reason = candidates.get(observation.id);
116
+ if (!reason || !AUTOMATIC_QUARANTINE_REASONS.has(reason))
117
+ continue;
118
+ const quality = evaluateStoredObservationQuality(observation, events);
119
+ if (quality.status !== 'quarantined' || quality.reason !== reason)
120
+ continue;
121
+ if (store.quarantineObservation(observation.id, reason, quality.details)) {
122
+ manifest.changes.observationsQuarantined += 1;
123
+ }
124
+ }
125
+ }
126
+ if (actions.includes('release-stale-leases')) {
127
+ manifest.changes.staleLeasesReleased = leases.expireOverdueLeases();
128
+ }
129
+ if (actions.includes('reprocess-pending')) {
130
+ manifest.changes.eventsRequeued = store.requeueProcessedEventsWithoutAcceptedEvidence();
131
+ }
132
+ if (actions.includes('backfill-vectors')) {
133
+ try {
134
+ const result = await backfillObservationVectors(store, this.embedder, {
135
+ batchSize: options.batchSize,
136
+ });
137
+ manifest.changes.vectorsBackfilled = result.processed;
138
+ manifest.checkpoint = result.lastId;
139
+ }
140
+ catch (error) {
141
+ manifest.providerError = errorMessage(error);
142
+ manifest.errors.push({ action: 'backfill-vectors', message: manifest.providerError });
143
+ manifest.checkpoint = store.getMaintenanceCheckpoint(BACKFILL_CHECKPOINT)?.cursor ?? undefined;
144
+ }
145
+ }
146
+ manifest.after = inspectDatabase(this.databasePath, duplicateWindowMs).diagnostics;
147
+ store.recordMaintenanceRun({
148
+ id,
149
+ mode: 'apply',
150
+ actions,
151
+ manifest: manifest,
152
+ createdAt: generatedAt,
153
+ });
154
+ }
155
+ finally {
156
+ store.close();
157
+ }
158
+ return manifest;
159
+ }
160
+ }
161
+ export async function runMemoryMaintenance(options) {
162
+ const maintenance = new MemoryMaintenance(options.projectRoot, options.embedder ?? new EmbeddingProvider());
163
+ return maintenance.run(options);
164
+ }
165
+ export async function backfillObservationVectors(store, embedder, options = {}) {
166
+ const warmed = await embedder.warmup();
167
+ if (!warmed)
168
+ throw new Error(embedder.getLastError() ?? 'Observation embedding warmup failed');
169
+ const batchSize = Math.max(1, Math.floor(options.batchSize ?? 32));
170
+ let processed = 0;
171
+ let lastId = store.getMaintenanceCheckpoint(BACKFILL_CHECKPOINT)?.cursor ?? undefined;
172
+ let wrapped = false;
173
+ while (true) {
174
+ let rows = store.listObservationsMissingEmbedding(batchSize, lastId);
175
+ if (rows.length === 0 && lastId && !wrapped) {
176
+ store.clearMaintenanceCheckpoint(BACKFILL_CHECKPOINT);
177
+ lastId = undefined;
178
+ wrapped = true;
179
+ rows = store.listObservationsMissingEmbedding(batchSize);
180
+ }
181
+ if (rows.length === 0)
182
+ break;
183
+ const embeddings = await embedder.embedBatch(rows.map(row => `${row.title}\n${row.narrative}`));
184
+ assertEmbeddingBatch(embeddings, rows.length);
185
+ lastId = rows.at(-1).id;
186
+ store.commitObservationEmbeddingBatch(rows.map((row, index) => ({ id: row.id, embedding: embeddings[index] })), {
187
+ action: BACKFILL_CHECKPOINT,
188
+ cursor: lastId,
189
+ details: { processed: processed + rows.length, batchSize },
190
+ });
191
+ processed += rows.length;
192
+ const coverage = store.countObservationVectors();
193
+ options.onProgress?.({ processed, remaining: coverage.missing, lastId });
194
+ }
195
+ store.clearMaintenanceCheckpoint(BACKFILL_CHECKPOINT);
196
+ return { processed, remaining: store.countObservationVectors().missing, lastId };
197
+ }
198
+ function inspectDatabase(databasePath, duplicateWindowMs) {
199
+ if (!existsSync(databasePath))
200
+ return emptyInspection();
201
+ const db = new Database(databasePath, { readonly: true, fileMustExist: true });
202
+ try {
203
+ const eventColumns = tableColumns(db, 'session_events');
204
+ const observationColumns = tableColumns(db, 'observations');
205
+ const events = tableExists(db, 'session_events')
206
+ ? db.prepare('SELECT * FROM session_events ORDER BY created_at ASC, id ASC').all()
207
+ .map(event => ({
208
+ ...event,
209
+ maintenance_status: eventColumns.has('maintenance_status')
210
+ ? event.maintenance_status
211
+ : 'active',
212
+ quarantine_reason: eventColumns.has('quarantine_reason')
213
+ ? event.quarantine_reason
214
+ : null,
215
+ }))
216
+ : [];
217
+ const observations = tableExists(db, 'observations')
218
+ ? db.prepare('SELECT * FROM observations ORDER BY timestamp ASC, id ASC').all()
219
+ .map(observation => ({
220
+ ...observation,
221
+ quality_status: observationColumns.has('quality_status')
222
+ ? observation.quality_status
223
+ : 'accepted',
224
+ quarantine_reason: observationColumns.has('quarantine_reason')
225
+ ? observation.quarantine_reason
226
+ : null,
227
+ quality_details: observationColumns.has('quality_details')
228
+ ? observation.quality_details
229
+ : null,
230
+ quarantined_at: observationColumns.has('quarantined_at')
231
+ ? observation.quarantined_at
232
+ : null,
233
+ resolution_state: observationColumns.has('resolution_state')
234
+ ? observation.resolution_state
235
+ : 'current',
236
+ superseded_by_observation: observationColumns.has('superseded_by_observation')
237
+ ? observation.superseded_by_observation
238
+ : null,
239
+ failure_category: observationColumns.has('failure_category')
240
+ ? observation.failure_category
241
+ : null,
242
+ }))
243
+ : [];
244
+ const leases = readLeases(db);
245
+ const now = Date.now();
246
+ const pendingLeases = leases.filter(lease => lease.status === 'pending');
247
+ const pendingLeaseEventIds = new Set(pendingLeases.flatMap(lease => lease.eventIds));
248
+ const malformedObservationEvidence = new Set(observations
249
+ .filter(observation => !isStringArrayJson(observation.source_event_ids))
250
+ .map(observation => observation.id));
251
+ const duplicateGroups = findDuplicateEventGroups(events, pendingLeaseEventIds, observations, malformedObservationEvidence, duplicateWindowMs);
252
+ const quarantineCandidates = observations
253
+ .filter(observation => observation.quality_status !== 'quarantined')
254
+ .map(observation => ({ observation, quality: evaluateStoredObservationQuality(observation, events) }))
255
+ .filter(result => result.quality.status === 'quarantined'
256
+ && result.quality.reason
257
+ && AUTOMATIC_QUARANTINE_REASONS.has(result.quality.reason))
258
+ .map(result => ({ id: result.observation.id, reason: result.quality.reason }));
259
+ const eligible = observations.filter(observation => observation.quality_status !== 'quarantined'
260
+ && observation.resolution_state !== 'superseded');
261
+ const missingVectorIds = eligible.filter(observation => observation.embedding === null).map(row => row.id);
262
+ const staleLeases = pendingLeases.filter(lease => lease.expiresAt <= now);
263
+ const acceptedEvidence = new Set(observations
264
+ .filter(observation => observation.quality_status !== 'quarantined'
265
+ && observation.resolution_state !== 'superseded')
266
+ .flatMap(observation => parseStringArray(observation.source_event_ids)));
267
+ const discardedEventIds = tableExists(db, 'event_processing_audit')
268
+ ? new Set(db.prepare("SELECT DISTINCT event_id FROM event_processing_audit WHERE disposition = 'discarded'").all().map(row => row.event_id))
269
+ : new Set();
270
+ const reprocessEventIds = events
271
+ .filter(event => event.processed === 1
272
+ && !acceptedEvidence.has(event.id)
273
+ && !discardedEventIds.has(event.id))
274
+ .map(event => event.id);
275
+ const pendingEvents = events.filter(event => event.processed === 0);
276
+ const duplicateRows = duplicateGroups.reduce((count, group) => count + group.duplicateIds.length, 0);
277
+ const clusterKeys = eligible.map(observation => observationClusterKey({
278
+ type: observation.type,
279
+ title: observation.title,
280
+ narrative: observation.narrative,
281
+ facts: parseStringArray(observation.facts),
282
+ }));
283
+ const duplicateRatio = clusterKeys.length === 0
284
+ ? 0
285
+ : (clusterKeys.length - new Set(clusterKeys).size) / clusterKeys.length;
286
+ const vectorCount = eligible.filter(observation => observation.embedding !== null).length;
287
+ const coverage = eligible.length === 0 ? 1 : vectorCount / eligible.length;
288
+ const accessLogLast7Days = countRecentAccess(db, now - 7 * 86_400_000);
289
+ const duplicateRate = events.length === 0 ? 0 : duplicateRows / events.length;
290
+ const oldestPendingAgeMs = pendingEvents.length === 0
291
+ ? 0
292
+ : Math.max(0, now - Math.min(...pendingEvents.map(event => event.created_at)));
293
+ const oldestLeaseAgeMs = pendingLeases.length === 0
294
+ ? 0
295
+ : Math.max(0, now - Math.min(...pendingLeases.map(lease => lease.createdAt)));
296
+ const oldestStaleAgeMs = staleLeases.length === 0
297
+ ? 0
298
+ : Math.max(...staleLeases.map(lease => Math.max(0, now - lease.expiresAt)));
299
+ const hasRetrievableMemory = eligible.length > 0 || countRows(db, 'memories') > 0;
300
+ const diagnostics = {
301
+ pendingEvents: {
302
+ count: pendingEvents.length,
303
+ oldestAgeMs: oldestPendingAgeMs,
304
+ unleased: pendingEvents.filter(event => !pendingLeaseEventIds.has(event.id)).length,
305
+ },
306
+ leases: {
307
+ pending: pendingLeases.length,
308
+ stale: staleLeases.length,
309
+ oldestPendingAgeMs: oldestLeaseAgeMs,
310
+ oldestStaleAgeMs,
311
+ },
312
+ duplicates: {
313
+ groups: duplicateGroups.length,
314
+ rows: duplicateRows,
315
+ rate: round(duplicateRate),
316
+ ambiguousGroups: duplicateGroups.filter(group => group.ambiguous).length,
317
+ },
318
+ observationVectors: {
319
+ observations: observations.length,
320
+ eligible: eligible.length,
321
+ vectors: vectorCount,
322
+ missing: missingVectorIds.length,
323
+ quarantined: observations.length - eligible.length,
324
+ coverage: round(coverage),
325
+ },
326
+ retrieval: {
327
+ duplicateRatio: round(duplicateRatio),
328
+ accessLogLast7Days,
329
+ },
330
+ thresholds: {
331
+ pendingAge: oldestPendingAgeMs > PENDING_WARN_MS ? 'warn' : 'ok',
332
+ staleLeases: staleLeases.length > 0 ? 'warn' : 'ok',
333
+ duplicateRate: duplicateRate > DUPLICATE_RATE_WARN ? 'warn' : 'ok',
334
+ vectorCoverage: coverage < VECTOR_COVERAGE_WARN ? 'warn' : 'ok',
335
+ retrievalDuplicateRatio: duplicateRatio > RETRIEVAL_DUPLICATE_WARN ? 'warn' : 'ok',
336
+ accessLogActivity: hasRetrievableMemory && accessLogLast7Days === 0 ? 'warn' : 'ok',
337
+ },
338
+ };
339
+ return {
340
+ events,
341
+ observations,
342
+ leases,
343
+ pendingLeaseEventIds,
344
+ malformedObservationEvidence,
345
+ duplicateGroups,
346
+ quarantineCandidates,
347
+ missingVectorIds,
348
+ staleLeaseIds: staleLeases.map(lease => lease.batchId),
349
+ reprocessEventIds,
350
+ diagnostics,
351
+ };
352
+ }
353
+ finally {
354
+ db.close();
355
+ }
356
+ }
357
+ function findDuplicateEventGroups(events, pendingLeaseEventIds, observations, malformedObservationEvidence, windowMs) {
358
+ const byFingerprint = new Map();
359
+ for (const event of events) {
360
+ const payload = normalizePayload(event.payload);
361
+ const command = normalizeClusterText(event.command ?? '');
362
+ const content = `${command}|${payload}`;
363
+ if (content === '|')
364
+ continue;
365
+ const fingerprint = createHash('sha256')
366
+ .update(`${event.session_id}|${event.tool.toLocaleLowerCase('en-US')}|${content}`)
367
+ .digest('hex');
368
+ const rows = byFingerprint.get(fingerprint) ?? [];
369
+ rows.push(event);
370
+ byFingerprint.set(fingerprint, rows);
371
+ }
372
+ const groups = [];
373
+ for (const [fingerprint, rows] of byFingerprint) {
374
+ rows.sort((left, right) => left.created_at - right.created_at || left.id.localeCompare(right.id));
375
+ let candidate = [];
376
+ const flush = () => {
377
+ if (candidate.length < 2) {
378
+ candidate = [];
379
+ return;
380
+ }
381
+ const eventIds = candidate.map(event => event.id);
382
+ const canonical = chooseCanonicalEvent(candidate);
383
+ const outcomeKeys = new Set(candidate.map(event => JSON.stringify([
384
+ event.exit_code,
385
+ normalizeClusterText(event.stderr ?? ''),
386
+ event.kind,
387
+ ])));
388
+ const hasPendingLease = eventIds.some(id => pendingLeaseEventIds.has(id));
389
+ const hasMalformedEvidence = observations.some(observation => malformedObservationEvidence.has(observation.id)
390
+ && eventIds.some(id => observation.source_event_ids.includes(id)));
391
+ const ambiguous = outcomeKeys.size > 1 || hasPendingLease || hasMalformedEvidence;
392
+ const reason = outcomeKeys.size > 1
393
+ ? 'conflicting_outcome'
394
+ : hasPendingLease
395
+ ? 'pending_lease_reference'
396
+ : hasMalformedEvidence
397
+ ? 'malformed_observation_evidence'
398
+ : undefined;
399
+ groups.push({
400
+ groupKey: createHash('sha256')
401
+ .update(`${fingerprint}|${candidate[0].created_at}`)
402
+ .digest('hex'),
403
+ canonicalId: canonical.id,
404
+ duplicateIds: eventIds.filter(id => id !== canonical.id),
405
+ eventIds,
406
+ ambiguous,
407
+ reason,
408
+ timestampSpanMs: candidate.at(-1).created_at - candidate[0].created_at,
409
+ });
410
+ candidate = [];
411
+ };
412
+ for (const row of rows) {
413
+ if (candidate.length === 0 || row.created_at - candidate[0].created_at <= windowMs) {
414
+ candidate.push(row);
415
+ }
416
+ else {
417
+ flush();
418
+ candidate.push(row);
419
+ }
420
+ }
421
+ flush();
422
+ }
423
+ return groups.sort((left, right) => left.eventIds[0].localeCompare(right.eventIds[0]));
424
+ }
425
+ function chooseCanonicalEvent(events) {
426
+ return [...events].sort((left, right) => canonicalIdScore(right.id) - canonicalIdScore(left.id)
427
+ || left.created_at - right.created_at
428
+ || left.id.localeCompare(right.id))[0];
429
+ }
430
+ function canonicalIdScore(id) {
431
+ if (id.startsWith('memory:'))
432
+ return 100;
433
+ if (/fallback|legacy|random/i.test(id))
434
+ return 0;
435
+ return 10;
436
+ }
437
+ function normalizePayload(raw) {
438
+ if (!raw)
439
+ return '';
440
+ try {
441
+ const parsed = JSON.parse(raw);
442
+ return stableJson(stripVolatileFields(parsed));
443
+ }
444
+ catch {
445
+ return normalizeClusterText(raw);
446
+ }
447
+ }
448
+ function stripVolatileFields(value) {
449
+ if (Array.isArray(value))
450
+ return value.map(stripVolatileFields);
451
+ if (!value || typeof value !== 'object')
452
+ return value;
453
+ const result = {};
454
+ for (const [key, entry] of Object.entries(value).sort()) {
455
+ if (/^(?:id|eventId|memoryEventId|requestId|toolUseId|timestamp|createdAt)$/i.test(key))
456
+ continue;
457
+ result[key] = stripVolatileFields(entry);
458
+ }
459
+ return result;
460
+ }
461
+ function stableJson(value) {
462
+ if (Array.isArray(value))
463
+ return `[${value.map(stableJson).join(',')}]`;
464
+ if (value && typeof value === 'object') {
465
+ return `{${Object.entries(value)
466
+ .sort(([left], [right]) => left.localeCompare(right))
467
+ .map(([key, entry]) => `${JSON.stringify(key)}:${stableJson(entry)}`)
468
+ .join(',')}}`;
469
+ }
470
+ return JSON.stringify(value);
471
+ }
472
+ function readLeases(db) {
473
+ if (!tableExists(db, 'distill_leases'))
474
+ return [];
475
+ return db.prepare('SELECT * FROM distill_leases ORDER BY created_at ASC').all().map(row => ({
476
+ batchId: row.batch_id,
477
+ eventIds: parseStringArray(row.event_ids),
478
+ createdAt: row.created_at,
479
+ expiresAt: row.expires_at,
480
+ status: row.status,
481
+ }));
482
+ }
483
+ function normalizeActions(actions) {
484
+ if (!actions || actions.length === 0)
485
+ return [...MEMORY_MAINTENANCE_ACTIONS];
486
+ const unique = [...new Set(actions)];
487
+ for (const action of unique) {
488
+ if (!MEMORY_MAINTENANCE_ACTIONS.includes(action)) {
489
+ throw new Error(`Unknown memory maintenance action: ${action}`);
490
+ }
491
+ }
492
+ return unique;
493
+ }
494
+ async function backupDatabase(databasePath, projectRoot, timestamp) {
495
+ const destination = join(projectRoot, '.devflow', 'backups', new Date(timestamp).toISOString().replace(/[:.]/g, '-'), 'memories.db');
496
+ mkdirSync(dirname(destination), { recursive: true });
497
+ const db = new Database(databasePath, { fileMustExist: true });
498
+ try {
499
+ await db.backup(destination);
500
+ }
501
+ finally {
502
+ db.close();
503
+ }
504
+ return destination;
505
+ }
506
+ function getStoreDatabase(store) {
507
+ return store.db;
508
+ }
509
+ function tableExists(db, table) {
510
+ return db.prepare("SELECT 1 FROM sqlite_master WHERE type = 'table' AND name = ?").get(table) !== undefined;
511
+ }
512
+ function tableColumns(db, table) {
513
+ if (!tableExists(db, table))
514
+ return new Set();
515
+ return new Set(db.pragma(`table_info(${table})`).map(row => row.name));
516
+ }
517
+ function countRows(db, table) {
518
+ if (!tableExists(db, table))
519
+ return 0;
520
+ return db.prepare(`SELECT COUNT(*) AS count FROM ${table}`).get().count;
521
+ }
522
+ function countRecentAccess(db, since) {
523
+ if (tableExists(db, 'retrieval_access_log')) {
524
+ return db.prepare('SELECT COUNT(*) AS count FROM retrieval_access_log WHERE timestamp >= ?').get(since).count;
525
+ }
526
+ if (tableExists(db, 'access_log')) {
527
+ return db.prepare('SELECT COUNT(*) AS count FROM access_log WHERE timestamp >= ?').get(since).count;
528
+ }
529
+ return 0;
530
+ }
531
+ function parseStringArray(value) {
532
+ try {
533
+ const parsed = JSON.parse(value);
534
+ return Array.isArray(parsed)
535
+ ? parsed.filter((entry) => typeof entry === 'string')
536
+ : [];
537
+ }
538
+ catch {
539
+ return [];
540
+ }
541
+ }
542
+ function isStringArrayJson(value) {
543
+ try {
544
+ const parsed = JSON.parse(value);
545
+ return Array.isArray(parsed) && parsed.every(entry => typeof entry === 'string');
546
+ }
547
+ catch {
548
+ return false;
549
+ }
550
+ }
551
+ function emptyInspection() {
552
+ const diagnostics = {
553
+ pendingEvents: { count: 0, oldestAgeMs: 0, unleased: 0 },
554
+ leases: { pending: 0, stale: 0, oldestPendingAgeMs: 0, oldestStaleAgeMs: 0 },
555
+ duplicates: { groups: 0, rows: 0, rate: 0, ambiguousGroups: 0 },
556
+ observationVectors: {
557
+ observations: 0,
558
+ eligible: 0,
559
+ vectors: 0,
560
+ missing: 0,
561
+ quarantined: 0,
562
+ coverage: 1,
563
+ },
564
+ retrieval: { duplicateRatio: 0, accessLogLast7Days: 0 },
565
+ thresholds: {
566
+ pendingAge: 'ok',
567
+ staleLeases: 'ok',
568
+ duplicateRate: 'ok',
569
+ vectorCoverage: 'ok',
570
+ retrievalDuplicateRatio: 'ok',
571
+ accessLogActivity: 'ok',
572
+ },
573
+ };
574
+ return {
575
+ events: [],
576
+ observations: [],
577
+ leases: [],
578
+ pendingLeaseEventIds: new Set(),
579
+ malformedObservationEvidence: new Set(),
580
+ duplicateGroups: [],
581
+ quarantineCandidates: [],
582
+ missingVectorIds: [],
583
+ staleLeaseIds: [],
584
+ reprocessEventIds: [],
585
+ diagnostics,
586
+ };
587
+ }
588
+ function round(value) {
589
+ return Math.round(value * 10_000) / 10_000;
590
+ }
591
+ function errorMessage(error) {
592
+ return error instanceof Error ? error.message : String(error);
593
+ }
594
+ //# sourceMappingURL=memory-maintenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory-maintenance.js","sourceRoot":"","sources":["../src/memory-maintenance.ts"],"names":[],"mappings":"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"}