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