From 7873fa73c2fa57c218397b10024f406ad33b4d92 Mon Sep 17 00:00:00 2001 From: LegendaryForge Date: Thu, 29 Jan 2026 18:32:49 -0700 Subject: [PATCH] Add activation gates and sessions; wire runtime services --- .../activation/ActivationAttemptResult.java | 11 ++ .../activation/ActivationAttemptStatus.java | 8 ++ .../api/activation/ActivationAuthority.java | 13 +++ .../api/activation/ActivationDecision.java | 19 +++ .../api/activation/ActivationService.java | 19 +++ .../session/ActivationSessionAbortResult.java | 5 + .../session/ActivationSessionAbortStatus.java | 6 + .../session/ActivationSessionBeginResult.java | 7 ++ .../session/ActivationSessionBeginStatus.java | 7 ++ .../ActivationSessionCommitResult.java | 8 ++ .../ActivationSessionCommitStatus.java | 8 ++ .../session/ActivationSessionService.java | 28 +++++ .../session/ActivationSessionState.java | 7 ++ .../session/ActivationSessionView.java | 12 ++ .../core/api/gate/ConditionGate.java | 23 ++++ .../legendary/core/api/gate/GateDecision.java | 19 +++ .../legendary/core/api/gate/GateService.java | 10 ++ .../activation/DefaultActivationService.java | 21 ++++ .../DefaultActivationSessionService.java | 108 ++++++++++++++++++ .../internal/gate/DefaultGateService.java | 27 +++++ .../internal/runtime/DefaultCoreRuntime.java | 15 +++ 21 files changed, 381 insertions(+) create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationAttemptResult.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationAttemptStatus.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationAuthority.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationDecision.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationService.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionAbortResult.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionAbortStatus.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionBeginResult.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionBeginStatus.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionCommitResult.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionCommitStatus.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionService.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionState.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionView.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/gate/ConditionGate.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/gate/GateDecision.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/api/gate/GateService.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/internal/activation/DefaultActivationService.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/internal/activation/session/DefaultActivationSessionService.java create mode 100644 src/main/java/io/github/legendaryforge/legendary/core/internal/gate/DefaultGateService.java diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationAttemptResult.java b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationAttemptResult.java new file mode 100644 index 0000000..734d26a --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationAttemptResult.java @@ -0,0 +1,11 @@ +package io.github.legendaryforge.legendary.core.api.activation; + +import io.github.legendaryforge.legendary.core.api.encounter.EncounterInstance; +import java.util.Optional; +import java.util.UUID; + +public record ActivationAttemptResult( + ActivationAttemptStatus status, + ActivationDecision decision, + Optional sessionId, + Optional instance) {} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationAttemptStatus.java b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationAttemptStatus.java new file mode 100644 index 0000000..6648b4d --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationAttemptStatus.java @@ -0,0 +1,8 @@ +package io.github.legendaryforge.legendary.core.api.activation; + +public enum ActivationAttemptStatus { + STARTED, + DENIED, + SESSION_REQUIRED, + FAILED +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationAuthority.java b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationAuthority.java new file mode 100644 index 0000000..b6c0101 --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationAuthority.java @@ -0,0 +1,13 @@ +package io.github.legendaryforge.legendary.core.api.activation; + +import io.github.legendaryforge.legendary.core.api.encounter.EncounterContext; +import io.github.legendaryforge.legendary.core.api.encounter.EncounterDefinition; +import java.util.UUID; + +@FunctionalInterface +public interface ActivationAuthority { + + ActivationDecision evaluate(ActivationAuthorityRequest request); + + record ActivationAuthorityRequest(UUID activatorId, EncounterDefinition definition, EncounterContext context) {} +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationDecision.java b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationDecision.java new file mode 100644 index 0000000..a628dcb --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationDecision.java @@ -0,0 +1,19 @@ +package io.github.legendaryforge.legendary.core.api.activation; + +import io.github.legendaryforge.legendary.core.api.id.ResourceId; +import java.util.Map; + +public record ActivationDecision(boolean allowed, ResourceId reasonCode, Map attributes) { + + public static ActivationDecision allow() { + return new ActivationDecision(true, ResourceId.of("legendarycore", "allowed"), Map.of()); + } + + public static ActivationDecision deny(ResourceId reasonCode) { + return new ActivationDecision(false, reasonCode, Map.of()); + } + + public static ActivationDecision deny(ResourceId reasonCode, Map attributes) { + return new ActivationDecision(false, reasonCode, Map.copyOf(attributes)); + } +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationService.java b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationService.java new file mode 100644 index 0000000..115f0ac --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/ActivationService.java @@ -0,0 +1,19 @@ +package io.github.legendaryforge.legendary.core.api.activation; + +import io.github.legendaryforge.legendary.core.api.encounter.EncounterContext; +import io.github.legendaryforge.legendary.core.api.encounter.EncounterDefinition; +import io.github.legendaryforge.legendary.core.api.id.ResourceId; +import java.util.Optional; +import java.util.UUID; + +public interface ActivationService { + + ActivationAttemptResult attemptActivation(ActivationAttemptRequest request); + + record ActivationAttemptRequest( + UUID activatorId, + EncounterDefinition definition, + EncounterContext context, + Optional activationGateKey, + Optional authorityOverride) {} +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionAbortResult.java b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionAbortResult.java new file mode 100644 index 0000000..28a5d23 --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionAbortResult.java @@ -0,0 +1,5 @@ +package io.github.legendaryforge.legendary.core.api.activation.session; + +import io.github.legendaryforge.legendary.core.api.id.ResourceId; + +public record ActivationSessionAbortResult(ActivationSessionAbortStatus status, ResourceId reasonCode) {} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionAbortStatus.java b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionAbortStatus.java new file mode 100644 index 0000000..c28cbf3 --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionAbortStatus.java @@ -0,0 +1,6 @@ +package io.github.legendaryforge.legendary.core.api.activation.session; + +public enum ActivationSessionAbortStatus { + ABORTED, + ALREADY_ABORTED +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionBeginResult.java b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionBeginResult.java new file mode 100644 index 0000000..a8587f4 --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionBeginResult.java @@ -0,0 +1,7 @@ +package io.github.legendaryforge.legendary.core.api.activation.session; + +import io.github.legendaryforge.legendary.core.api.id.ResourceId; +import java.util.UUID; + +public record ActivationSessionBeginResult( + ActivationSessionBeginStatus status, ResourceId reasonCode, UUID sessionId) {} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionBeginStatus.java b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionBeginStatus.java new file mode 100644 index 0000000..51a3d61 --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionBeginStatus.java @@ -0,0 +1,7 @@ +package io.github.legendaryforge.legendary.core.api.activation.session; + +public enum ActivationSessionBeginStatus { + CREATED, + EXISTING, + DENIED +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionCommitResult.java b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionCommitResult.java new file mode 100644 index 0000000..9a843d5 --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionCommitResult.java @@ -0,0 +1,8 @@ +package io.github.legendaryforge.legendary.core.api.activation.session; + +import io.github.legendaryforge.legendary.core.api.encounter.EncounterInstance; +import io.github.legendaryforge.legendary.core.api.id.ResourceId; +import java.util.Optional; + +public record ActivationSessionCommitResult( + ActivationSessionCommitStatus status, ResourceId reasonCode, Optional instance) {} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionCommitStatus.java b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionCommitStatus.java new file mode 100644 index 0000000..4d0e79b --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionCommitStatus.java @@ -0,0 +1,8 @@ +package io.github.legendaryforge.legendary.core.api.activation.session; + +public enum ActivationSessionCommitStatus { + COMMITTED, + ALREADY_COMMITTED, + DENIED, + FAILED +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionService.java b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionService.java new file mode 100644 index 0000000..f7d639a --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionService.java @@ -0,0 +1,28 @@ +package io.github.legendaryforge.legendary.core.api.activation.session; + +import io.github.legendaryforge.legendary.core.api.encounter.EncounterContext; +import io.github.legendaryforge.legendary.core.api.encounter.EncounterDefinition; +import io.github.legendaryforge.legendary.core.api.encounter.EncounterKey; +import io.github.legendaryforge.legendary.core.api.id.ResourceId; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + +public interface ActivationSessionService { + + ActivationSessionBeginResult begin(ActivationSessionBeginRequest request); + + ActivationSessionCommitResult commit(UUID sessionId); + + ActivationSessionAbortResult abort(UUID sessionId, ResourceId reasonCode); + + Optional get(UUID sessionId); + + record ActivationSessionBeginRequest( + UUID activatorId, + EncounterKey encounterKey, + EncounterDefinition definition, + EncounterContext context, + Optional activationGateKey, + Map attributes) {} +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionState.java b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionState.java new file mode 100644 index 0000000..7817ec1 --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionState.java @@ -0,0 +1,7 @@ +package io.github.legendaryforge.legendary.core.api.activation.session; + +public enum ActivationSessionState { + OPEN, + COMMITTED, + ABORTED +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionView.java b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionView.java new file mode 100644 index 0000000..2fd4fe3 --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/activation/session/ActivationSessionView.java @@ -0,0 +1,12 @@ +package io.github.legendaryforge.legendary.core.api.activation.session; + +import io.github.legendaryforge.legendary.core.api.encounter.EncounterKey; +import java.util.Map; +import java.util.UUID; + +public record ActivationSessionView( + UUID sessionId, + UUID activatorId, + EncounterKey encounterKey, + ActivationSessionState state, + Map attributes) {} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/gate/ConditionGate.java b/src/main/java/io/github/legendaryforge/legendary/core/api/gate/ConditionGate.java new file mode 100644 index 0000000..d8e51f8 --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/gate/ConditionGate.java @@ -0,0 +1,23 @@ +package io.github.legendaryforge.legendary.core.api.gate; + +import io.github.legendaryforge.legendary.core.api.encounter.EncounterKey; +import io.github.legendaryforge.legendary.core.api.id.ResourceId; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + +@FunctionalInterface +public interface ConditionGate { + + GateDecision evaluate(GateRequest request); + + record GateRequest( + ResourceId gateKey, + UUID playerId, + Optional encounterKey, + Optional interactionKind, + Optional location, + Map attributes) {} + + record LocationRef(String worldId, int x, int y, int z) {} +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/gate/GateDecision.java b/src/main/java/io/github/legendaryforge/legendary/core/api/gate/GateDecision.java new file mode 100644 index 0000000..edb0511 --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/gate/GateDecision.java @@ -0,0 +1,19 @@ +package io.github.legendaryforge.legendary.core.api.gate; + +import io.github.legendaryforge.legendary.core.api.id.ResourceId; +import java.util.Map; + +public record GateDecision(boolean allowed, ResourceId reasonCode, Map attributes) { + + public static GateDecision allow() { + return new GateDecision(true, ResourceId.of("legendarycore", "allowed"), Map.of()); + } + + public static GateDecision deny(ResourceId reasonCode) { + return new GateDecision(false, reasonCode, Map.of()); + } + + public static GateDecision deny(ResourceId reasonCode, Map attributes) { + return new GateDecision(false, reasonCode, Map.copyOf(attributes)); + } +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/api/gate/GateService.java b/src/main/java/io/github/legendaryforge/legendary/core/api/gate/GateService.java new file mode 100644 index 0000000..b39c337 --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/api/gate/GateService.java @@ -0,0 +1,10 @@ +package io.github.legendaryforge.legendary.core.api.gate; + +import io.github.legendaryforge.legendary.core.api.id.ResourceId; + +public interface GateService { + + void register(ResourceId gateKey, ConditionGate gate); + + GateDecision evaluate(ConditionGate.GateRequest request); +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/internal/activation/DefaultActivationService.java b/src/main/java/io/github/legendaryforge/legendary/core/internal/activation/DefaultActivationService.java new file mode 100644 index 0000000..bd74fba --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/internal/activation/DefaultActivationService.java @@ -0,0 +1,21 @@ +package io.github.legendaryforge.legendary.core.internal.activation; + +import io.github.legendaryforge.legendary.core.api.activation.ActivationAttemptResult; +import io.github.legendaryforge.legendary.core.api.activation.ActivationAttemptStatus; +import io.github.legendaryforge.legendary.core.api.activation.ActivationDecision; +import io.github.legendaryforge.legendary.core.api.activation.ActivationService; +import io.github.legendaryforge.legendary.core.api.id.ResourceId; +import java.util.Optional; + +public final class DefaultActivationService implements ActivationService { + + @Override + public ActivationAttemptResult attemptActivation(ActivationAttemptRequest request) { + // Intentionally inert until Phase 1 ยท Step 3 wiring (authority + gate + session + encounter creation). + return new ActivationAttemptResult( + ActivationAttemptStatus.FAILED, + ActivationDecision.deny(ResourceId.of("legendarycore", "not_wired")), + Optional.empty(), + Optional.empty()); + } +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/internal/activation/session/DefaultActivationSessionService.java b/src/main/java/io/github/legendaryforge/legendary/core/internal/activation/session/DefaultActivationSessionService.java new file mode 100644 index 0000000..ced47b5 --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/internal/activation/session/DefaultActivationSessionService.java @@ -0,0 +1,108 @@ +package io.github.legendaryforge.legendary.core.internal.activation.session; + +import io.github.legendaryforge.legendary.core.api.activation.session.*; +import io.github.legendaryforge.legendary.core.api.encounter.EncounterInstance; +import io.github.legendaryforge.legendary.core.api.encounter.EncounterKey; +import io.github.legendaryforge.legendary.core.api.id.ResourceId; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public final class DefaultActivationSessionService implements ActivationSessionService { + + private static final class SessionRecord { + final UUID sessionId; + final UUID activatorId; + final EncounterKey encounterKey; + volatile ActivationSessionState state; + volatile EncounterInstance instance; + + SessionRecord(UUID sessionId, UUID activatorId, EncounterKey encounterKey) { + this.sessionId = sessionId; + this.activatorId = activatorId; + this.encounterKey = encounterKey; + this.state = ActivationSessionState.OPEN; + } + } + + private final Map sessions = new ConcurrentHashMap<>(); + private final Map openSessionsByKey = new ConcurrentHashMap<>(); + + @Override + public ActivationSessionBeginResult begin(ActivationSessionBeginRequest request) { + UUID existing = openSessionsByKey.get(request.encounterKey()); + if (existing != null) { + SessionRecord record = sessions.get(existing); + if (record != null && record.activatorId.equals(request.activatorId())) { + return new ActivationSessionBeginResult( + ActivationSessionBeginStatus.EXISTING, + ResourceId.of("legendarycore", "session_exists"), + existing); + } + return new ActivationSessionBeginResult( + ActivationSessionBeginStatus.DENIED, ResourceId.of("legendarycore", "session_locked"), existing); + } + + UUID sessionId = UUID.randomUUID(); + SessionRecord record = new SessionRecord(sessionId, request.activatorId(), request.encounterKey()); + sessions.put(sessionId, record); + openSessionsByKey.put(request.encounterKey(), sessionId); + + return new ActivationSessionBeginResult( + ActivationSessionBeginStatus.CREATED, ResourceId.of("legendarycore", "session_created"), sessionId); + } + + @Override + public ActivationSessionCommitResult commit(UUID sessionId) { + SessionRecord record = sessions.get(sessionId); + if (record == null) { + return new ActivationSessionCommitResult( + ActivationSessionCommitStatus.DENIED, + ResourceId.of("legendarycore", "session_not_found"), + Optional.empty()); + } + + if (record.state == ActivationSessionState.COMMITTED) { + return new ActivationSessionCommitResult( + ActivationSessionCommitStatus.ALREADY_COMMITTED, + ResourceId.of("legendarycore", "already_committed"), + Optional.ofNullable(record.instance)); + } + + if (record.state == ActivationSessionState.ABORTED) { + return new ActivationSessionCommitResult( + ActivationSessionCommitStatus.DENIED, + ResourceId.of("legendarycore", "session_aborted"), + Optional.empty()); + } + + record.state = ActivationSessionState.COMMITTED; + openSessionsByKey.remove(record.encounterKey); + + return new ActivationSessionCommitResult( + ActivationSessionCommitStatus.COMMITTED, ResourceId.of("legendarycore", "committed"), Optional.empty()); + } + + @Override + public ActivationSessionAbortResult abort(UUID sessionId, ResourceId reasonCode) { + SessionRecord record = sessions.get(sessionId); + if (record == null || record.state == ActivationSessionState.ABORTED) { + return new ActivationSessionAbortResult(ActivationSessionAbortStatus.ALREADY_ABORTED, reasonCode); + } + + record.state = ActivationSessionState.ABORTED; + openSessionsByKey.remove(record.encounterKey); + + return new ActivationSessionAbortResult(ActivationSessionAbortStatus.ABORTED, reasonCode); + } + + @Override + public Optional get(UUID sessionId) { + SessionRecord record = sessions.get(sessionId); + if (record == null) return Optional.empty(); + + return Optional.of(new ActivationSessionView( + record.sessionId, record.activatorId, record.encounterKey, record.state, Map.of())); + } +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/internal/gate/DefaultGateService.java b/src/main/java/io/github/legendaryforge/legendary/core/internal/gate/DefaultGateService.java new file mode 100644 index 0000000..ff97dc1 --- /dev/null +++ b/src/main/java/io/github/legendaryforge/legendary/core/internal/gate/DefaultGateService.java @@ -0,0 +1,27 @@ +package io.github.legendaryforge.legendary.core.internal.gate; + +import io.github.legendaryforge.legendary.core.api.gate.ConditionGate; +import io.github.legendaryforge.legendary.core.api.gate.GateDecision; +import io.github.legendaryforge.legendary.core.api.gate.GateService; +import io.github.legendaryforge.legendary.core.api.id.ResourceId; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public final class DefaultGateService implements GateService { + + private final Map gates = new ConcurrentHashMap<>(); + + @Override + public void register(ResourceId gateKey, ConditionGate gate) { + gates.put(gateKey, gate); + } + + @Override + public GateDecision evaluate(ConditionGate.GateRequest request) { + ConditionGate gate = gates.get(request.gateKey()); + if (gate == null) { + return GateDecision.deny(ResourceId.of("legendarycore", "gate_not_registered")); + } + return gate.evaluate(request); + } +} diff --git a/src/main/java/io/github/legendaryforge/legendary/core/internal/runtime/DefaultCoreRuntime.java b/src/main/java/io/github/legendaryforge/legendary/core/internal/runtime/DefaultCoreRuntime.java index fad23da..e216c1f 100644 --- a/src/main/java/io/github/legendaryforge/legendary/core/internal/runtime/DefaultCoreRuntime.java +++ b/src/main/java/io/github/legendaryforge/legendary/core/internal/runtime/DefaultCoreRuntime.java @@ -1,7 +1,10 @@ package io.github.legendaryforge.legendary.core.internal.runtime; +import io.github.legendaryforge.legendary.core.api.activation.ActivationService; +import io.github.legendaryforge.legendary.core.api.activation.session.ActivationSessionService; import io.github.legendaryforge.legendary.core.api.encounter.EncounterManager; import io.github.legendaryforge.legendary.core.api.event.EventBus; +import io.github.legendaryforge.legendary.core.api.gate.GateService; import io.github.legendaryforge.legendary.core.api.identity.PartyDirectory; import io.github.legendaryforge.legendary.core.api.identity.PlayerDirectory; import io.github.legendaryforge.legendary.core.api.legendary.access.DefaultLegendaryAccessPolicy; @@ -9,9 +12,12 @@ import io.github.legendaryforge.legendary.core.api.lifecycle.ServiceRegistry; import io.github.legendaryforge.legendary.core.api.platform.CoreRuntime; import io.github.legendaryforge.legendary.core.api.registry.RegistryAccess; +import io.github.legendaryforge.legendary.core.internal.activation.DefaultActivationService; +import io.github.legendaryforge.legendary.core.internal.activation.session.DefaultActivationSessionService; import io.github.legendaryforge.legendary.core.internal.encounter.DefaultEncounterManager; import io.github.legendaryforge.legendary.core.internal.encounter.lifecycle.EncounterDurationTelemetry; import io.github.legendaryforge.legendary.core.internal.event.SimpleEventBus; +import io.github.legendaryforge.legendary.core.internal.gate.DefaultGateService; import io.github.legendaryforge.legendary.core.internal.legendary.arena.ArenaInvariantBridge; import io.github.legendaryforge.legendary.core.internal.legendary.arena.ArenaInvariantRegistry; import io.github.legendaryforge.legendary.core.internal.legendary.arena.ArenaRevocationController; @@ -109,6 +115,15 @@ public DefaultCoreRuntime(Optional players, Optional revocations.clearInstance(e.instanceId()));