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 tools, Set 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 tools, Set 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"); } }