import java.security.MessageDigest plugins { id 'java' } repositories { maven { url 'https://repo.spring.io/snapshot' } maven { url 'https://repo.spring.io/milestone' } } // --- sqlite-vec loadable extensions ------------------------------------------------------------- // sqlite-vec has no Maven artifact and no JVM binding, so we download the official, checksum-pinned // loadable binaries at build time and package them as jar resources under /sqlite-vec//. // SqliteVecExtensions extracts the right one at runtime. Apache-2.0/MIT licensed, redistributable. ext.sqliteVecVersion = '0.1.9' ext.sqliteVecArtifacts = [ 'linux-x86_64' : 'b959baa1d8dc88861b1edb337b8587178cdcb12d60b4998f9d10b6a82052d5d7', 'linux-aarch64' : 'ea03d39541e478fab5974253c461e1cb5d77742f69e40cf96e3fad5bc309a37c', 'macos-aarch64' : '8282126333399ddfe98bbbcc7a1936e7252625aac49df056a98be602e46bfd29', 'macos-x86_64' : '53ad76e400786515e2edcaed2f01271dda846316390b761fadbd2dcf56aa4713', 'windows-x86_64': '51581189d52066b4dfc6631f6d7a3eab7dedc2260656ab09ca97ab3fb8165983', ] def sqliteVecResourceDir = layout.buildDirectory.dir('generated/resources/sqlite-vec') def downloadSqliteVec = tasks.register('downloadSqliteVec') { description = 'Downloads, verifies and stages the sqlite-vec loadable extensions as jar resources.' group = 'build' inputs.property('version', sqliteVecVersion) inputs.property('artifacts', sqliteVecArtifacts) outputs.dir(sqliteVecResourceDir) doLast { def base = sqliteVecResourceDir.get().asFile def cache = new File(temporaryDir, 'archives') cache.mkdirs() sqliteVecArtifacts.each { platform, expectedSha -> def archive = new File(cache, "sqlite-vec-${platform}.tar.gz") if (!archive.exists()) { def url = "https://github.com/asg017/sqlite-vec/releases/download/v${sqliteVecVersion}/sqlite-vec-${sqliteVecVersion}-loadable-${platform}.tar.gz" logger.lifecycle("Downloading sqlite-vec ${platform} from ${url}") ant.get(src: url, dest: archive, verbose: false) } def digest = MessageDigest.getInstance('SHA-256') archive.eachByte(64 * 1024) { buf, len -> digest.update(buf, 0, len) } def actualSha = digest.digest().encodeHex().toString() if (actualSha != expectedSha) { throw new GradleException("Checksum mismatch for sqlite-vec ${platform}: expected ${expectedSha}, got ${actualSha}") } def platformDir = new File(base, "sqlite-vec/${platform}") platformDir.mkdirs() copy { from tarTree(resources.gzip(archive)) into platformDir } } } } // Register the task provider (not the bare directory) as a resource source dir so that every // consumer of the resources — processResources, sourcesJar, etc. — automatically depends on // downloadSqliteVec instead of racing it. sourceSets.main.resources.srcDir(downloadSqliteVec) dependencies { compileOnly 'org.springframework.boot:spring-boot-starter' // Needed to compile A2A push-notification callback controller and AgentSpan activation glue; // supplied by the server at runtime. compileOnly 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.springframework.boot:spring-boot-autoconfigure' implementation project(':conductor-common') implementation project(':conductor-core') api "org.springframework.ai:spring-ai-model:${revSpringAI}" api "org.springframework.ai:spring-ai-client-chat:${revSpringAI}" api "org.springframework.ai:spring-ai-mistral-ai:${revSpringAI}" api "org.springframework.ai:spring-ai-bedrock-converse:${revSpringAI}" api "org.springframework.ai:spring-ai-ollama:${revSpringAI}" api "com.google.auth:google-auth-library-oauth2-http:1.33.0" api "com.networknt:json-schema-validator:${revJSonSchemaValidator}" api("io.modelcontextprotocol.sdk:mcp-core:${revMCP}") api "com.squareup.okhttp3:okhttp:4.12.0" api "org.apache.commons:commons-lang3" // Markdown parsing and PDF generation // Exclude openhtmltopdf-pdfbox (pulled in by flexmark-pdf-converter inside flexmark-all): // it was compiled against fontbox 2.x and calls TTFParser.parse(InputStream) which was // removed in fontbox 3.x, causing a NoSuchMethodError at runtime in GENERATE_PDF tasks. // The custom MarkdownToPdfConverter uses PDFBox 3.x directly and does not need openhtmltopdf. implementation("com.vladsch.flexmark:flexmark-all:${revFlexmark}") { exclude group: "com.openhtmltopdf", module: "openhtmltopdf-pdfbox" exclude group: "de.rototor.pdfbox", module: "graphics2d" } implementation "org.apache.pdfbox:pdfbox:3.0.5" //Vector Databases api "org.mongodb:mongodb-driver-sync:${mongodb}" api "org.mongodb:mongodb-driver-core:${mongodb}" api "org.mongodb:bson:${mongodb}" api "io.pinecone:pinecone-client:${pinecone}" api "com.pgvector:pgvector:${pgVector}" // SQLite + sqlite-vec backend. The native vec0 extension is supplied by the operator at // runtime (no JVM binding / Maven artifact exists); see SqliteConfig. api "org.xerial:sqlite-jdbc:${sqliteJdbc}" api "org.springframework.boot:spring-boot-starter-jdbc" testImplementation 'org.springframework.boot:spring-boot-starter-web' testImplementation "com.squareup.okhttp3:mockwebserver:4.12.0" testImplementation "org.testcontainers:mongodb:${revTestContainer}" testImplementation "org.testcontainers:postgresql:${revTestContainer}" testImplementation "org.postgresql:postgresql:${revPostgres}" testImplementation "org.apache.commons:commons-compress:${revCommonsCompress}" testImplementation "com.h2database:h2:2.4.240" }