feat: cleanup endpoint, auto-extraction on capture, daily cron script

- POST /admin/backup/cleanup — retention cleanup via API (dry-run by default)
- record_interaction() accepts extract=True to auto-extract candidate
  memories from response text using the Phase 9C rule-based extractor
- POST /interactions accepts extract field to enable extraction on capture
- deploy/dalidou/cron-backup.sh — daily backup + cleanup for cron

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-11 10:28:32 -04:00
parent 2829d5ec1c
commit 0b1742770a
3 changed files with 103 additions and 0 deletions

View File

@@ -63,6 +63,7 @@ def record_interaction(
chunks_used: list[str] | None = None,
context_pack: dict | None = None,
reinforce: bool = True,
extract: bool = False,
) -> Interaction:
"""Persist a single interaction to the audit trail.
@@ -163,6 +164,30 @@ def record_interaction(
error=str(exc),
)
if extract and (response or response_summary):
try:
from atocore.memory.extractor import extract_candidates_from_interaction
from atocore.memory.service import create_memory
candidates = extract_candidates_from_interaction(interaction)
for candidate in candidates:
try:
create_memory(
memory_type=candidate.memory_type,
content=candidate.content,
project=candidate.project,
confidence=candidate.confidence,
status="candidate",
)
except ValueError:
pass # duplicate or validation error — skip silently
except Exception as exc: # pragma: no cover - extraction must never block capture
log.error(
"extraction_failed_on_capture",
interaction_id=interaction_id,
error=str(exc),
)
return interaction