diff --git a/services/assistant-api/src/main/kotlin/com/jorisjonkers/personalstack/assistant/config/AgentRuntimeProperties.kt b/services/assistant-api/src/main/kotlin/com/jorisjonkers/personalstack/assistant/config/AgentRuntimeProperties.kt index fa899df5..782d9a3b 100644 --- a/services/assistant-api/src/main/kotlin/com/jorisjonkers/personalstack/assistant/config/AgentRuntimeProperties.kt +++ b/services/assistant-api/src/main/kotlin/com/jorisjonkers/personalstack/assistant/config/AgentRuntimeProperties.kt @@ -73,4 +73,23 @@ data class AgentRuntimeProperties( // starting with the `gh` wrapper degrading to a no-op. val githubAppBearerSecret: String = "github-app", val githubAppBearerSecretKey: String = "token-bearer", -) +) { + init { + require(defaultMcpProfile in VALID_MCP_PROFILES) { + "agent-runtime.default-mcp-profile must be one of " + + VALID_MCP_PROFILES.joinToString(", ") + + "; got '$defaultMcpProfile'" + } + } + + companion object { + val VALID_MCP_PROFILES: Set = + setOf( + "minimal", + "frontend", + "cluster", + "code-intel", + "full-diagnostic", + ) + } +} diff --git a/services/assistant-api/src/test/kotlin/com/jorisjonkers/personalstack/assistant/config/AgentRuntimePropertiesBindingTest.kt b/services/assistant-api/src/test/kotlin/com/jorisjonkers/personalstack/assistant/config/AgentRuntimePropertiesBindingTest.kt index 53a9d536..e1014a24 100644 --- a/services/assistant-api/src/test/kotlin/com/jorisjonkers/personalstack/assistant/config/AgentRuntimePropertiesBindingTest.kt +++ b/services/assistant-api/src/test/kotlin/com/jorisjonkers/personalstack/assistant/config/AgentRuntimePropertiesBindingTest.kt @@ -1,6 +1,7 @@ package com.jorisjonkers.personalstack.assistant.config import org.assertj.core.api.Assertions.assertThat +import org.assertj.core.api.Assertions.assertThatThrownBy import org.junit.jupiter.api.Test import org.springframework.boot.context.properties.bind.Binder import org.springframework.boot.context.properties.source.MapConfigurationPropertySource @@ -73,6 +74,32 @@ class AgentRuntimePropertiesBindingTest { assertThat(props.nodeSelector).containsKey("personal-stacknode") } + @Test + fun `default mcp profile accepts every declared runner profile`() { + AgentRuntimeProperties.VALID_MCP_PROFILES.forEach { profile -> + val props = + bind( + base + + mapOf("agent-runtime.default-mcp-profile" to profile), + ) + + assertThat(props.defaultMcpProfile).isEqualTo(profile) + } + } + + @Test + fun `default mcp profile rejects unknown values`() { + assertThatThrownBy { + bind( + base + + mapOf("agent-runtime.default-mcp-profile" to "frontned"), + ) + }.rootCause() + .isInstanceOf(IllegalArgumentException::class.java) + .hasMessageContaining("agent-runtime.default-mcp-profile") + .hasMessageContaining("frontned") + } + private fun bind(properties: Map): AgentRuntimeProperties { val source = MapConfigurationPropertySource(properties) return Binder(source)