diff --git a/apps/server/src/main/kotlin/com/correx/apps/server/routes/ApprovalRoutes.kt b/apps/server/src/main/kotlin/com/correx/apps/server/routes/ApprovalRoutes.kt deleted file mode 100644 index f3dd35a6..00000000 --- a/apps/server/src/main/kotlin/com/correx/apps/server/routes/ApprovalRoutes.kt +++ /dev/null @@ -1,55 +0,0 @@ -@file:Suppress("MatchingDeclarationName") - -package com.correx.apps.server.routes - -import com.correx.apps.server.approval.ApprovalCoordinator -import com.correx.apps.server.protocol.ApprovalDecision -import com.correx.apps.server.protocol.ClientMessage -import com.correx.apps.server.protocol.ServerMessage -import com.correx.core.events.types.ApprovalRequestId -import com.correx.core.events.types.SessionId -import com.correx.core.utils.TypeId -import io.ktor.http.HttpStatusCode -import io.ktor.server.request.receive -import io.ktor.server.response.respond -import io.ktor.server.routing.Route -import io.ktor.server.routing.post -import io.ktor.server.routing.route -import kotlinx.serialization.Serializable - -@Serializable -data class ApprovalRequest( - val requestId: String, - val decision: String, - val note: String? = null, -) - -fun Route.approvalRoutes(coordinator: ApprovalCoordinator) { - route("/sessions/{id}/approve") { - post { - val id = call.parameters["id"] - ?: return@post call.respond(HttpStatusCode.BadRequest, "Missing session id") - val sessionId: SessionId = TypeId(id) - val body = call.receive() - val requestId: ApprovalRequestId = TypeId(body.requestId) - val decision = when (body.decision.lowercase()) { - "approve" -> ApprovalDecision.APPROVE - "reject" -> ApprovalDecision.REJECT - "steer" -> ApprovalDecision.STEER - else -> return@post call.respond(HttpStatusCode.BadRequest, "Unknown decision: ${body.decision}") - } - val msg = ClientMessage.ApprovalResponse( - requestId = requestId, - decision = decision, - steeringNote = body.note, - ) - val error = coordinator.handleResponse(msg, sessionId) - if (error != null) { - val msg = (error as? ServerMessage.ProtocolError)?.message - call.respond(HttpStatusCode.Conflict, mapOf("error" to msg)) - } else { - call.respond(HttpStatusCode.OK) - } - } - } -} diff --git a/apps/tui/src/main/kotlin/com/correx/apps/tui/TuiNavigation.kt b/apps/tui/src/main/kotlin/com/correx/apps/tui/TuiNavigation.kt deleted file mode 100644 index 70327bbf..00000000 --- a/apps/tui/src/main/kotlin/com/correx/apps/tui/TuiNavigation.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.correx.apps.tui - -import com.correx.apps.tui.state.TuiState - -internal fun navigateUp(state: TuiState): TuiState { - val sessions = state.sessions.sessions - if (sessions.isEmpty()) return state - val idx = sessions.indexOfFirst { it.id == state.sessions.selectedId } - val newIdx = if (idx <= 0) sessions.lastIndex else idx - 1 - return state.copy(sessions = state.sessions.copy(selectedId = sessions[newIdx].id)) -} - -internal fun navigateDown(state: TuiState): TuiState { - val sessions = state.sessions.sessions - if (sessions.isEmpty()) return state - val idx = sessions.indexOfFirst { it.id == state.sessions.selectedId } - val newIdx = if (idx >= sessions.lastIndex) 0 else idx + 1 - return state.copy(sessions = state.sessions.copy(selectedId = sessions[newIdx].id)) -} diff --git a/core/transitions/src/main/kotlin/com/correx/core/transitions/execution/StageExecutor.kt b/core/transitions/src/main/kotlin/com/correx/core/transitions/execution/StageExecutor.kt deleted file mode 100644 index a56b37cf..00000000 --- a/core/transitions/src/main/kotlin/com/correx/core/transitions/execution/StageExecutor.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.correx.core.transitions.execution - -interface StageExecutor { - fun execute( - request: StageExecutionRequest - ): StageExecutionResult -} \ No newline at end of file diff --git a/core/transitions/src/main/kotlin/com/correx/core/transitions/policy/CyclePolicyResolver.kt b/core/transitions/src/main/kotlin/com/correx/core/transitions/policy/CyclePolicyResolver.kt deleted file mode 100644 index 9d51e70a..00000000 --- a/core/transitions/src/main/kotlin/com/correx/core/transitions/policy/CyclePolicyResolver.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.correx.core.transitions.policy - -class CyclePolicyResolver( - private val bindings: Set -) { - - fun resolve(signature: CycleSignature): CyclePolicy? { - return bindings - .firstOrNull { it.cycle == signature } - ?.policy - } -} \ No newline at end of file diff --git a/core/transitions/src/main/kotlin/com/correx/core/transitions/policy/PolicyValidation.kt b/core/transitions/src/main/kotlin/com/correx/core/transitions/policy/PolicyValidation.kt deleted file mode 100644 index 9540494a..00000000 --- a/core/transitions/src/main/kotlin/com/correx/core/transitions/policy/PolicyValidation.kt +++ /dev/null @@ -1,23 +0,0 @@ -package com.correx.core.transitions.policy - -class PolicyValidation { - fun validate( - bindings: Set, - knownCycles: Set - ): List { - - val errors = mutableListOf() - - val bound = bindings.map { it.cycle }.toSet() - - val unbound = knownCycles - bound - - if (unbound.isNotEmpty()) { - errors += unbound.map { - "Cycle $it has no policy binding" - } - } - - return errors - } -} \ No newline at end of file diff --git a/testing/contracts/src/testFixtures/kotlin/com/correx/testing/contracts/fixtures/projections/ReplayContractTest.kt b/testing/contracts/src/testFixtures/kotlin/com/correx/testing/contracts/fixtures/projections/ReplayContractTest.kt deleted file mode 100644 index c7c98cc0..00000000 --- a/testing/contracts/src/testFixtures/kotlin/com/correx/testing/contracts/fixtures/projections/ReplayContractTest.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.correx.testing.contracts.fixtures.projections - -import com.correx.core.events.stores.EventStore -import com.correx.core.events.types.EventId -import com.correx.core.events.types.SessionId -import com.correx.core.sessions.projections.replay.EventReplayer -import com.correx.testing.fixtures.EventFixtures.newEvent -import kotlinx.coroutines.runBlocking -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Test - -abstract class ReplayContractTest { - - protected abstract fun store(): EventStore - - protected abstract fun replayer( - store: EventStore - ): EventReplayer - - @Test - fun `rebuild is deterministic`(): Unit = runBlocking { - val store = store() - - repeat(50) { - store.append(newEvent(EventId("e$it"), SessionId("s1"))) - } - - val replayer = replayer(store) - - val state1 = replayer.rebuild(SessionId("s1")) - val state2 = replayer.rebuild(SessionId("s1")) - - assertEquals(state1, state2) - } -} \ No newline at end of file