feat(config): [project] block for cross-session project memory

This commit is contained in:
2026-06-04 00:58:22 +04:00
parent 8d67f5b03e
commit a77d9a1288
4 changed files with 65 additions and 0 deletions
@@ -413,6 +413,13 @@ object ConfigLoader {
)
}
val projectSection = sections["project"] ?: emptyMap()
val project = ProjectConfig(
enabled = asBoolean(projectSection["enabled"], false),
root = asString(projectSection["root"], ""),
memoryK = asInt(projectSection["memory_k"], 5),
)
val modelsSettings = ModelsSettings(
defaultModel = asStringOrNull(modelsSection["default_model"]),
llamaServerBin = asString(modelsSection["llama_server_bin"], "llama-server"),
@@ -440,6 +447,7 @@ object ConfigLoader {
models = models,
modelsSettings = modelsSettings,
artifacts = artifacts,
project = project,
)
}
@@ -13,6 +13,19 @@ data class CorrexConfig(
val models: List<ModelConfig> = emptyList(),
val modelsSettings: ModelsSettings = ModelsSettings(),
val artifacts: List<ArtifactKindConfig> = emptyList(),
val project: ProjectConfig = ProjectConfig(),
)
/**
* Project-scoped, cross-session memory. When [enabled], the decision journal is distilled
* to durable per-repo memory at session end and retrieved (top-[memoryK]) at session start.
* [root] is the repo root key; empty means the current working directory.
*/
@Serializable
data class ProjectConfig(
val enabled: Boolean = false,
val root: String = "",
val memoryK: Int = 5,
)
/**
@@ -183,6 +183,42 @@ class ConfigLoaderTest {
assertEquals("python3", result.tools.shellAllowedExecutables[2])
}
@Test
fun `parseToml parses project block`() {
val toml = """
[project]
enabled = true
root = "/home/me/repo"
memory_k = 8
""".trimIndent()
val loader = ConfigLoader::class.java
val parseTomlMethod = loader.getDeclaredMethod("parseToml", String::class.java)
parseTomlMethod.isAccessible = true
val result = parseTomlMethod.invoke(ConfigLoader, toml) as CorrexConfig
assertEquals(true, result.project.enabled)
assertEquals("/home/me/repo", result.project.root)
assertEquals(8, result.project.memoryK)
}
@Test
fun `parseToml project defaults when block absent`() {
val toml = """
[server]
host = "localhost"
""".trimIndent()
val loader = ConfigLoader::class.java
val parseTomlMethod = loader.getDeclaredMethod("parseToml", String::class.java)
parseTomlMethod.isAccessible = true
val result = parseTomlMethod.invoke(ConfigLoader, toml) as CorrexConfig
assertEquals(false, result.project.enabled)
assertEquals("", result.project.root)
assertEquals(5, result.project.memoryK)
}
@Test
fun `parseToml parses JSON array shell_allowed_executables`() {
val toml = """