feat(FN-1477): add memory pruning to daily insight extraction

- Add pruneStaleMemoryEntities() function to memory-insights.ts
- Integrate memory pruning into dailyInsightExtraction() workflow
- Add maxMemoryAgeDays setting (default: 30 days) for configurable pruning threshold
- Include pruned count in daily insight report summary
- Add comprehensive unit tests for memory pruning logic
- Update docs: architecture, memory-plugin-contract, settings-reference, contributing
This commit is contained in:
gsxdsm
2026-04-09 21:07:48 -07:00
parent 6f1183b8b1
commit 3ab16f6ad4
9 changed files with 928 additions and 42 deletions

View File

@@ -877,7 +877,10 @@ export async function runDashboard(port: number, opts: { paused?: boolean; dev?:
// Extract the AI step output from the result
const stepResults = result.stepResults ?? [];
const aiStep = stepResults.find((sr) => sr.stepName === "Extract Memory Insights");
// Step name updated in FN-1477 to include pruning
const aiStep = stepResults.find(
(sr) => sr.stepName === "Extract Memory Insights and Prune" || sr.stepName === "Extract Memory Insights",
);
if (!aiStep) {
console.log(`[memory-audit] No insight extraction step found in ${schedule.name} result`);
@@ -894,9 +897,13 @@ export async function runDashboard(port: number, opts: { paused?: boolean; dev?:
error: aiStep.error,
});
const pruneStatus = auditReport.pruning.applied
? ` | Pruned: ${auditReport.pruning.originalSize}${auditReport.pruning.newSize} chars`
: ` | Pruning: ${auditReport.pruning.reason}`;
console.log(
`[memory-audit] ✓ Audit complete — Health: ${auditReport.health}, ` +
`Insights: ${auditReport.insightsMemory.insightCount}`,
`Insights: ${auditReport.insightsMemory.insightCount}${pruneStatus}`,
);
} catch (err) {
console.error(

View File

@@ -578,7 +578,10 @@ export async function runServe(
// Extract the AI step output from the result
const stepResults = result.stepResults ?? [];
const aiStep = stepResults.find((sr) => sr.stepName === "Extract Memory Insights");
// Step name updated in FN-1477 to include pruning
const aiStep = stepResults.find(
(sr) => sr.stepName === "Extract Memory Insights and Prune" || sr.stepName === "Extract Memory Insights",
);
if (!aiStep) {
console.log(`[memory-audit] No insight extraction step found in ${schedule.name} result`);
@@ -595,9 +598,13 @@ export async function runServe(
error: aiStep.error,
});
const pruneStatus = auditReport.pruning.applied
? ` | Pruned: ${auditReport.pruning.originalSize}${auditReport.pruning.newSize} chars`
: ` | Pruning: ${auditReport.pruning.reason}`;
console.log(
`[memory-audit] ✓ Audit complete — Health: ${auditReport.health}, ` +
`Insights: ${auditReport.insightsMemory.insightCount}`,
`Insights: ${auditReport.insightsMemory.insightCount}${pruneStatus}`,
);
} catch (err) {
console.error(