package ar.com.companeros.decision; import java.math.BigDecimal; import java.util.UUID; public record DecisionResponse(UUID requestId, UUID actorUUID, long sessionEpoch, long observationSeq, Status status, String model, ToolDecision decision, Usage usage, String reason, java.util.List webSources) { public DecisionResponse { webSources = java.util.List.copyOf(webSources); } public DecisionResponse(UUID requestId, UUID actorUUID, long sessionEpoch, long observationSeq, Status status, String model, ToolDecision decision, Usage usage, String reason) { this(requestId, actorUUID, sessionEpoch, observationSeq, status, model, decision, usage, reason, java.util.List.of()); } public enum Status { ACCEPTED, DISABLED, CLOSED, CANCELLED, STALE, THROTTLED, BUDGET_EXHAUSTED, STRATEGIC_DENIED, HTTP_ERROR, NETWORK_ERROR, INVALID_RESPONSE, REFUSED, INCOMPLETE } public record Usage(long inputTokens, long outputTokens, long reasoningTokens, long cachedTokens, long cacheWriteTokens, boolean estimatedBillable, BigDecimal usd) { public static Usage zero() { return new Usage(0, 0, 0, 0, 0, false, BigDecimal.ZERO); } } public boolean accepted() { return status == Status.ACCEPTED && decision != null; } public boolean validFor(UUID actor, long epoch, long observation) { return accepted() && actorUUID.equals(actor) && sessionEpoch == epoch && observationSeq == observation; } }