Volver al índice

src/main/java/ar/com/companeros/decision/DecisionRequest.java

package ar.com.companeros.decision;

import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;

/** Solicitud vinculada a la identidad y revisión de sesión que originó la observación. */
public record DecisionRequest(UUID requestId, UUID actorUUID, long sessionEpoch, long observationSeq,
        String trigger, ObservationSnapshot observation, Map<String, ToolCapability> tools,
        Set<String> grantedPermissions, Kind kind, StrategicGate.Permit strategicPermit, String operatorInstructions) {
    public enum Kind { ORDINARY, STRATEGIC, WEB_RESEARCH, UPGRADE_APPRAISAL }
    public DecisionRequest(UUID requestId, UUID actorUUID, long sessionEpoch, long observationSeq,
            String trigger, ObservationSnapshot observation, Map<String, ToolCapability> tools,
            Set<String> grantedPermissions, Kind kind, StrategicGate.Permit strategicPermit) {
        this(requestId, actorUUID, sessionEpoch, observationSeq, trigger, observation, tools, grantedPermissions, kind, strategicPermit, "");
    }
    public DecisionRequest {
        Objects.requireNonNull(requestId); Objects.requireNonNull(actorUUID); Objects.requireNonNull(trigger);
        Objects.requireNonNull(observation); Objects.requireNonNull(kind);
        Objects.requireNonNull(operatorInstructions);
        if (operatorInstructions.length() > 12_288) throw new IllegalArgumentException("Instrucciones fuera de límite");
        tools = Map.copyOf(tools); grantedPermissions = Set.copyOf(grantedPermissions);
        if (sessionEpoch < 0 || observationSeq < 0 || trigger.isBlank() || trigger.length() > 256
                || tools.size() > 64 || grantedPermissions.size() > 32
                || tools.entrySet().stream().anyMatch(e -> !e.getKey().equals(e.getValue().id()))
                || grantedPermissions.stream().anyMatch(p -> p.isBlank() || p.length() > 64))
            throw new IllegalArgumentException("Solicitud de decisión fuera de límite");
        if (kind != Kind.STRATEGIC && strategicPermit != null)
            throw new IllegalArgumentException("Una decisión ordinaria no tiene permiso estratégico");
    }
}