feat(kernel): RepoKnowledgeRetriever port + relevance-retrieved repo context with recency fallback

This commit is contained in:
2026-06-11 13:39:57 +04:00
parent 9d38a89c88
commit 7a9e060a55
7 changed files with 111 additions and 8 deletions
@@ -276,6 +276,22 @@ fun main() {
val artifactKindRegistry = DefaultArtifactKindRegistry().also { reg ->
configArtifactKindsEarly.forEach { reg.register(it) }
}
val embedder = InfrastructureModule.createEmbedderFromConfig(correxConfig.router.embedder)
val l3MemoryStore = InfrastructureModule.createL3MemoryStoreFromConfig(correxConfig.router.l3)
// Rebuild the L3 metadata map from the ChatTurnEvent log before serving queries:
// persisted vectors survive restart but the metadata map does not (no-op for
// non-rehydratable backends like in_memory).
runBlocking { L3MetadataRehydrator(eventStore).rehydrate(l3MemoryStore) }
val repoKnowledgeRetriever: com.correx.apps.server.memory.L3RepoKnowledgeRetriever? =
if (correxConfig.project.enabled) {
com.correx.apps.server.memory.L3RepoKnowledgeRetriever(
embedder = embedder,
l3MemoryStore = l3MemoryStore,
repoRoot = workspaceRoot.toString(),
)
} else {
null
}
val orchestrator = DefaultSessionOrchestrator(
repositories = repositories,
engines = engines,
@@ -285,13 +301,8 @@ fun main() {
decisionJournalRepository = decisionJournalRepository,
compactionService = journalCompactionService,
artifactKindRegistry = artifactKindRegistry,
repoKnowledgeRetriever = repoKnowledgeRetriever,
)
val embedder = InfrastructureModule.createEmbedderFromConfig(correxConfig.router.embedder)
val l3MemoryStore = InfrastructureModule.createL3MemoryStoreFromConfig(correxConfig.router.l3)
// Rebuild the L3 metadata map from the ChatTurnEvent log before serving queries:
// persisted vectors survive restart but the metadata map does not (no-op for
// non-rehydratable backends like in_memory).
runBlocking { L3MetadataRehydrator(eventStore).rehydrate(l3MemoryStore) }
val workflowRegistry = FileSystemWorkflowRegistry(
InfrastructureModule.createWorkflowLoader(configArtifactKindsEarly),
)
@@ -0,0 +1,24 @@
package com.correx.apps.server.memory
import com.correx.core.events.events.RepoKnowledgeHit
import com.correx.core.events.types.SessionId
import com.correx.core.inference.Embedder
import com.correx.core.kernel.orchestration.RepoKnowledgeRetriever
import com.correx.core.router.l3.L3MemoryStore
import com.correx.core.router.l3.L3Query
private const val RETRIEVAL_OVERSAMPLE_FACTOR = 4
class L3RepoKnowledgeRetriever(
private val embedder: Embedder,
private val l3MemoryStore: L3MemoryStore,
private val repoRoot: String,
) : RepoKnowledgeRetriever {
override suspend fun retrieve(sessionId: SessionId, query: String, k: Int): List<RepoKnowledgeHit> {
val vector = embedder.embed(query)
return l3MemoryStore.query(L3Query(vector = vector, k = k * RETRIEVAL_OVERSAMPLE_FACTOR))
.filter { it.entry.turnId.startsWith("repomap:$repoRoot") }
.take(k)
.map { RepoKnowledgeHit(path = it.entry.text.substringBefore(":"), text = it.entry.text, score = it.score) }
}
}