Update the manifest when a vault entry is deleted.
(manifest: &mut VaultManifest, path: &str, now: &str)
| 619 | |
| 620 | /// Update the manifest when a vault entry is deleted. |
| 621 | fn update_manifest_for_delete(manifest: &mut VaultManifest, path: &str, now: &str) { |
| 622 | // Remove from type-specific indexes |
| 623 | manifest.memory.remove(path); |
| 624 | manifest.skills.remove(path); |
| 625 | manifest.goals.remove(path); |
| 626 | manifest.intents.remove(path); |
| 627 | |
| 628 | // Decrement file count (floor at 0) |
| 629 | manifest.file_count = manifest.file_count.saturating_sub(1); |
| 630 | |
| 631 | // We can't easily adjust total_bytes without knowing the old entry's size, |
| 632 | // so we leave it as-is. Use vault_recompute_manifest_totals() for accuracy. |
| 633 | // The merkle also changes on delete. |
| 634 | let prev_merkle = if manifest.merkle.is_empty() { |
| 635 | Merkle::ZERO |
| 636 | } else { |
| 637 | Merkle::from_base32(manifest.merkle.as_bytes()).unwrap_or(Merkle::ZERO) |
| 638 | }; |
| 639 | // Hash path as the "delete event" to advance the merkle |
| 640 | let delete_hash = Hash::of(format!("delete:{}", path).as_bytes()); |
| 641 | let new_merkle = prev_merkle.next(&delete_hash); |
| 642 | manifest.merkle = new_merkle.to_base32(); |
| 643 | |
| 644 | manifest.updated_at = now.to_string(); |
| 645 | } |
| 646 | |
| 647 | // ── Materialization helpers ───────────────────────────────────────────── |
| 648 |