Volver al índice

src/main/java/ar/com/companeros/memory/MemoryRecord.java

package ar.com.companeros.memory;

import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import net.minecraft.core.GlobalPos;

/** Recuerdo inmutable con fecha, lugar, procedencia y evidencia verificable. */
public record MemoryRecord(UUID id, UUID agentId, UUID worldId, GlobalPos location,
        long occurredAtUtc, long gameTime, MemoryType type, double importance, double confidence,
        long lastVerifiedAtUtc, long lastVerifiedGameTime, MemoryOrigin origin, String sourceId,
        List<UUID> evidenceIds, String content, Set<String> keywords,
        Set<UUID> relatedAgents, UUID supersedes, boolean pinned) {
    public static final int MAX_CONTENT_CHARS = 2048;

    public MemoryRecord {
        Objects.requireNonNull(id, "id"); Objects.requireNonNull(agentId, "agentId");
        Objects.requireNonNull(worldId, "worldId"); Objects.requireNonNull(type, "type");
        Objects.requireNonNull(origin, "origin"); Objects.requireNonNull(content, "content");
        Objects.requireNonNull(sourceId, "sourceId");
        if (content.isBlank() || content.length() > MAX_CONTENT_CHARS || sourceId.length() > 128)
            throw new IllegalArgumentException("Texto de recuerdo fuera de límite");
        if (occurredAtUtc < 0 || gameTime < 0 || lastVerifiedAtUtc < 0 || lastVerifiedGameTime < 0
                || !Double.isFinite(importance) || importance < 0 || importance > 1
                || !Double.isFinite(confidence) || confidence < 0 || confidence > 1)
            throw new IllegalArgumentException("Metadatos de recuerdo inválidos");
        if (id.equals(supersedes)) throw new IllegalArgumentException("Un recuerdo no se reemplaza a sí mismo");
        evidenceIds = List.copyOf(evidenceIds); keywords = Set.copyOf(keywords);
        relatedAgents = Set.copyOf(relatedAgents);
        if (evidenceIds.size() > 32 || keywords.size() > 32 || relatedAgents.size() > 32
                || keywords.stream().anyMatch(key -> key.isBlank() || key.length() > 64))
            throw new IllegalArgumentException("Índices de recuerdo fuera de límite");
        if (location != null) location = GlobalPos.of(location.dimension(), location.pos().immutable());
    }

    public boolean protectedFromEviction() { return pinned || importance >= .8; }

    public MemoryRecord verified(double newConfidence, long nowUtc, long nowGameTime) {
        return new MemoryRecord(id, agentId, worldId, location, occurredAtUtc, gameTime, type,
            importance, newConfidence, nowUtc, nowGameTime, origin, sourceId, evidenceIds,
            content, keywords, relatedAgents, supersedes, pinned);
    }
}