diff --git a/src/services/memory/pruner.js b/src/services/memory/pruner.js index bf996d6..5619ce1 100644 --- a/src/services/memory/pruner.js +++ b/src/services/memory/pruner.js @@ -265,9 +265,7 @@ export async function createLifecyclePlan(memories, options) { * @param {Awaited>} plan */ export async function applyLifecycleActions(repository, plan) { - const results = []; - - for (const decision of plan.actions) { + const results = await Promise.all(plan.actions.map(async (decision) => { if (decision.merged_into && typeof repository.markMerged === 'function') { await repository.markMerged(decision.id, decision.merged_into); } @@ -280,8 +278,8 @@ export async function applyLifecycleActions(repository, plan) { await repository.keepMemory?.(decision.id, decision.reason); } - results.push(decision); - } + return decision; + })); return { applied: results, diff --git a/test/memory-pruner.test.mjs b/test/memory-pruner.test.mjs index 4957c44..7dd378e 100644 --- a/test/memory-pruner.test.mjs +++ b/test/memory-pruner.test.mjs @@ -138,11 +138,22 @@ test('applyLifecycleActions executes keep/archive/delete and merge markers', asy policyLogs: [], }); - assert.deepEqual(calls, [ - ['keepMemory', 'k1', 'keep reason'], - ['markMerged', 'a1', 'k1'], + // Sort calls to verify presence regardless of execution order + const sortedCalls = [...calls].sort((a, b) => a[0].localeCompare(b[0]) || a[1].localeCompare(b[1])); + const expectedCalls = [ ['archiveMemory', 'a1', 'archive reason'], ['deleteMemory', 'd1', 'delete reason'], - ]); + ['keepMemory', 'k1', 'keep reason'], + ['markMerged', 'a1', 'k1'], + ]; + + assert.deepEqual(sortedCalls, expectedCalls); + + // Verify that markMerged happens before archiveMemory for the same ID + const markIndex = calls.findIndex((c) => c[0] === 'markMerged' && c[1] === 'a1'); + const archiveIndex = calls.findIndex((c) => c[0] === 'archiveMemory' && c[1] === 'a1'); + assert.ok(markIndex !== -1, 'markMerged was called'); + assert.ok(archiveIndex !== -1, 'archiveMemory was called'); + assert.ok(markIndex < archiveIndex, 'markMerged should precede archiveMemory'); assert.equal(result.applied.length, 3); });