Files
FusionAGI/fusionagi/governance/audit_log.py

30 lines
1.3 KiB
Python
Raw Normal View History

"""Structured audit log for AGI."""
import uuid
from fusionagi.schemas.audit import AuditEntry
class AuditLog:
def __init__(self, max_entries=100000):
self._entries = []
self._max_entries = max_entries
self._by_task = {}
self._by_type = {}
def append(self, event_type, actor, action="", task_id=None, payload=None, outcome=""):
entry_id = str(uuid.uuid4())
entry = AuditEntry(entry_id=entry_id, event_type=event_type, actor=actor, task_id=task_id, action=action, payload=payload or {}, outcome=outcome)
if len(self._entries) >= self._max_entries:
self._entries.pop(0)
idx = len(self._entries)
self._entries.append(entry)
if entry.task_id:
self._by_task.setdefault(entry.task_id, []).append(idx)
self._by_type.setdefault(entry.event_type.value, []).append(idx)
return entry_id
def get_by_task(self, task_id, limit=100):
indices = self._by_task.get(task_id, [])[-limit:]
return [self._entries[i] for i in indices if i < len(self._entries)]
def get_by_type(self, event_type, limit=100):
indices = self._by_type.get(event_type.value, [])[-limit:]
return [self._entries[i] for i in indices if i < len(self._entries)]