feat(config): [project] block for cross-session project memory
This commit is contained in:
@@ -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 = """
|
||||
|
||||
Reference in New Issue
Block a user