@devflow-tools/memory-engine 0.16.2 → 0.16.4

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