Skip to content

SemanticRetrievalSmokeTest.kt

src/jvmMain/kotlin/afield/examples/SemanticRetrievalSmokeTest.kt · 190 lines

package afield.examples

import afield.ai.retrieval.SemanticRetrievalQueryRequest
import afield.ai.retrieval.SemanticRetrievalService
import afield.ai.retrieval.SemanticSearchManager
import java.nio.file.Files

object SemanticRetrievalSmokeTest

FIELD_TEST id: examples.semantic-retrieval.lucene-baseline runner: jvm-main entrypoint: afield.examples.SemanticRetrievalSmokeTest tags: [smoke, ai, semantic-retrieval, lucene] timeoutSec: 90 expect: exitCode: 0 stdoutContains: - "SemanticRetrievalSmokeTest ok"

fun main(args: Array<String>)

body — 169 lines, from line 21
    @JvmStatic
    fun main(args: Array<String>) {
        val tempDir = Files.createTempDirectory("afield-semantic-retrieval")
        System.setProperty("afield.semanticSearch.indexPath", tempDir.resolve("lucene").toString())
        val workspaceDir = tempDir.resolve("workspace")
        val documentDir = workspaceDir.resolve("wiggleDocument")
        Files.createDirectories(documentDir)
        Files.writeString(
            documentDir.resolve("metadata.edn"),
            """
            {"version" 2
             "boxes" [{"id" "box-a"
                       "properties" {"name" "Wiggly Line Box"
                                     "code_language" "kotlin"
                                     "code" "sidecar"}}
                      {"id" "box-b"
                       "properties" {"name" "Deleted Backup Box"
                                     "_tombstone" true
                                     "code" "sidecar"}}]}
            """.trimIndent()
        )
        Files.writeString(
            documentDir.resolve("box-a_code_.kt"),
            """
            fun drawRandomWigglyLine() {
                println("current workspace sidecar curve")
            }

            fun unrelatedWorkspaceHelper() {
                println("unrelated workspace helper")
            }
            """.trimIndent()
        )
        Files.writeString(
            documentDir.resolve("box-b_code_.kt"),
            """println("tombstoned backup-only sidecar")"""
        )
        Files.writeString(
            documentDir.resolve("orphan_code_.kt"),
            """println("orphan backup-only sidecar")"""
        )
        System.setProperty("afield.semanticSearch.workspaceRoot", workspaceDir.toString())
        System.setProperty("afield.semanticSearch.onnx.model", tempDir.resolve("missing-model.onnx").toString())
        System.setProperty("afield.semanticSearch.onnx.tokenizer", tempDir.resolve("missing-tokenizer.json").toString())

        val build = SemanticRetrievalService.rebuild()
        require(build.success) { build.message }
        require(build.status.indexExists) { "index was not created" }
        require(build.status.indexedCapsules > 20) { "expected source/docs capsules, got ${build.status.indexedCapsules}" }
        require(build.status.workspaceSidecarFiles == 1) {
            "expected exactly one current workspace sidecar, got ${build.status.workspaceSidecarFiles}"
        }
        require(!build.status.indexStale) { "freshly built index should not be stale" }

        val codeResult = SemanticRetrievalService.query(
            SemanticRetrievalQueryRequest(
                query = "semantic sidecar analyzes Field box Kotlin code and resolves source uses",
                limit = 8,
                includeSource = true
            )
        )
        require(codeResult.success) { codeResult.message }
        require(codeResult.results.isNotEmpty()) { "expected code search results" }
        require(codeResult.results.any { it.path.contains("CodeUseTelemetryService") || it.path.contains("code-use-semantic-sidecar") }) {
            "expected a code-use or sidecar result, got ${codeResult.results.map { it.path }}"
        }

        val docsResult = SemanticRetrievalService.query(
            SemanticRetrievalQueryRequest(
                query = "browser screenshot smoke with backdoor playwright",
                limit = 8,
                corpus = "documentation"
            )
        )
        require(docsResult.success) { docsResult.message }
        require(docsResult.results.isNotEmpty()) { "expected documentation search results" }

        val linalgDocsResult = SemanticRetrievalService.query(
            SemanticRetrievalQueryRequest(
                query = "dot product directional agreement perpendicular unit vectors",
                limit = 10,
                corpus = "documentation",
                includeSource = true
            )
        )
        require(linalgDocsResult.success) { linalgDocsResult.message }
        require(linalgDocsResult.results.any { it.path.endsWith("linear_algebra.md") }) {
            "expected the beginner linear-algebra guide, got ${linalgDocsResult.results.map { it.path }}"
        }

        val generatedLinalgResult = SemanticRetrievalService.query(
            SemanticRetrievalQueryRequest(
                query = "vector dot measures direction cosine perpendicular",
                limit = 12,
                corpus = "field-internals",
                includeSource = true
            )
        )
        require(generatedLinalgResult.success) { generatedLinalgResult.message }
        require(generatedLinalgResult.results.any { it.path.startsWith("src/generatedLinalg/kotlin/") }) {
            "expected generated linalg KDoc in field-internals, got ${generatedLinalgResult.results.map { it.path }}"
        }

        val combinedResult = SemanticRetrievalService.query(
            SemanticRetrievalQueryRequest(
                query = "random wiggly line browser screenshot smoke",
                limit = 12,
                corpora = listOf("workspace", "documentation"),
                includeSource = true
            )
        )
        require(combinedResult.success) { combinedResult.message }
        require(combinedResult.results.isNotEmpty()) { "expected combined corpus search results" }
        require(combinedResult.results.all { it.corpus in setOf("workspace", "documentation") }) {
            "combined corpus filter leaked unexpected corpora: ${combinedResult.results.map { it.corpus }}"
        }
        require(combinedResult.results.any { it.corpus == "workspace" }) {
            "expected workspace in combined corpus results"
        }

        val workspaceFunctionResult = SemanticRetrievalService.query(
            SemanticRetrievalQueryRequest(
                query = "draw random wiggly line function",
                limit = 10,
                corpus = "workspace",
                documentName = "wiggleDocument",
                includeSource = true
            )
        )
        require(workspaceFunctionResult.success) { workspaceFunctionResult.message }
        require(workspaceFunctionResult.results.any {
            it.scale == "declaration" &&
                    it.kind == "fun" &&
                    it.symbol == "drawRandomWigglyLine" &&
                    it.documentName == "wiggleDocument" &&
                    it.boxName == "Wiggly Line Box" &&
                    it.property == "code" &&
                    it.line > 0
        }) {
            "expected workspace Kotlin function sub-capsule, got ${workspaceFunctionResult.results.map { "${it.scale}:${it.kind}:${it.symbol}:${it.line}" }}"
        }

        val managerHits = SemanticSearchManager().findTopK(
            query = "random wiggly line",
            k = 5,
            corpora = listOf("field-internals", "workspace"),
            includeSource = true
        )
        require(managerHits.isNotEmpty()) { "expected manager facade search results" }
        require(managerHits.first().location.isNotBlank()) { "expected manager hit location" }

        val workspaceHits = SemanticSearchManager().findWorkspaceTopK(
            query = "current workspace sidecar curve",
            k = 5,
            documentName = "wiggleDocument",
            includeSource = true
        )
        require(workspaceHits.isNotEmpty()) { "expected workspace sidecar search results" }
        require(workspaceHits.first().documentName == "wiggleDocument") { "expected document metadata on hit" }
        require(workspaceHits.first().boxName == "Wiggly Line Box") { "expected box name metadata on hit" }
        require(workspaceHits.first().boxId == "box-a") { "expected box id metadata on hit" }
        require(workspaceHits.first().property == "code") { "expected sidecar property metadata on hit" }
        require(workspaceHits.none { it.boxId == "box-b" || it.path.contains("orphan") }) {
            "tombstoned or orphan sidecars should not be indexed: $workspaceHits"
        }

        println("SemanticRetrievalSmokeTest ok capsules=${build.status.indexedCapsules} codeHits=${codeResult.results.size} docHits=${docsResult.results.size}")
    }
}