<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>io.github.loom-ai-labs</groupId>
    <artifactId>ai-fabric-bom</artifactId>
    <version>0.2.0</version>
    <packaging>pom</packaging>

    <name>AI Fabric Framework BOM</name>
    <description>Open-source AI Fabric Framework for Spring Boot applications with orchestration, RAG, actions, providers, and vector integration</description>
    <url>https://github.com/loom-ai-labs/ai-fabric-framework</url>

    <scm>
        <connection>scm:git:https://github.com/loom-ai-labs/ai-fabric-framework.git</connection>
        <developerConnection>scm:git:https://github.com/loom-ai-labs/ai-fabric-framework.git</developerConnection>
        <url>https://github.com/loom-ai-labs/ai-fabric-framework</url>
        <tag>HEAD</tag>
    </scm>

    <licenses>
        <license>
            <name>Apache License, Version 2.0</name>
            <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
            <distribution>repo</distribution>
        </license>
    </licenses>

    <developers>
        <developer>
            <id>loom-ai-labs</id>
            <name>Loom AI Labs</name>
            <organization>Loom AI Labs</organization>
            <organizationUrl>https://github.com/loom-ai-labs</organizationUrl>
        </developer>
    </developers>

    <modules>
        <module>ai-fabric-core</module>
        <module>ai-fabric-actions-connector</module>
        <module>ai-fabric-actions-registry</module>
        <module>ai-fabric-actions-registry-liquibase</module>
        <module>ai-fabric-retrieval-connector</module>
        <module>ai-fabric-data-sync</module>
        <module>ai-fabric-relay</module>
        <module>ai-fabric-indexing</module>
        <module>ai-fabric-pii</module>
        <module>ai-fabric-governance</module>
        <module>ai-fabric-starter</module>
        <module>ai-fabric-provider-starter</module>
        <module>curated/ai-fabric-curated-default</module>
        <module>curated/ai-fabric-curated-commerce</module>
        <module>curated/ai-fabric-curated-support</module>
        <module>ai-fabric-rag</module>
        <module>ai-fabric-web</module>
        <module>providers/ai-fabric-provider-openai</module>
        <module>providers/ai-fabric-provider-azure</module>
        <module>providers/ai-fabric-provider-cohere</module>
        <module>providers/ai-fabric-provider-anthropic</module>
        <module>providers/ai-fabric-provider-gemini</module>
        <module>providers/ai-fabric-onnx-starter</module>
        <module>ai-fabric-relationship-query</module>
        <module>ai-fabric-chat-session</module>
        <module>ai-fabric-behavior</module>
        <module>victor-databases/ai-fabric-vector-lucene</module>
        <module>victor-databases/ai-fabric-vector-pinecone</module>
        <module>ai-fabric-migration</module>
        <module>victor-databases/ai-fabric-vector-memory</module>
        <module>victor-databases/ai-fabric-vector-weaviate</module>
        <module>victor-databases/ai-fabric-vector-qdrant</module>
        <module>victor-databases/ai-fabric-vector-milvus</module>
    </modules>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <maven.compiler.proc>full</maven.compiler.proc>
        <maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
        <maven-surefire-plugin.version>3.0.0</maven-surefire-plugin.version>
        <maven-failsafe-plugin.version>3.0.0</maven-failsafe-plugin.version>
        <maven-source-plugin.version>3.3.1</maven-source-plugin.version>
        <maven-javadoc-plugin.version>3.6.3</maven-javadoc-plugin.version>
        <maven-gpg-plugin.version>3.2.4</maven-gpg-plugin.version>
        <central-publishing-maven-plugin.version>0.7.0</central-publishing-maven-plugin.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <spring-boot.version>3.2.0</spring-boot.version>
        <spring-cloud-context.version>4.0.4</spring-cloud-context.version>
        <openai.version>0.18.2</openai.version>
        <lucene.version>9.10.0</lucene.version>
        <lombok.version>1.18.38</lombok.version>
        <mapstruct.version>1.5.5.Final</mapstruct.version>
        <jsr305.version>3.0.2</jsr305.version>
        <testcontainers.version>1.19.3</testcontainers.version>
        <awaitility.version>4.2.0</awaitility.version>
        <mockito.version>5.8.0</mockito.version>
        <jmh.version>1.37</jmh.version>
        <javafaker.version>1.0.2</javafaker.version>
        <swagger-request-validator.version>2.40.0</swagger-request-validator.version>
        <!-- Align gRPC versions across vector DB SDKs (Qdrant/Pinecone/Weaviate/Milvus). -->
        <grpc.version>1.68.2</grpc.version>
        <!-- Align protobuf across SDKs (Pinecone/Milvus/Qdrant/Weaviate) to avoid runtime CNF errors. -->
        <protobuf.version>3.25.3</protobuf.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>io.grpc</groupId>
                <artifactId>grpc-bom</artifactId>
                <version>${grpc.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <dependency>
                <groupId>com.google.protobuf</groupId>
                <artifactId>protobuf-java</artifactId>
                <version>${protobuf.version}</version>
            </dependency>
            <dependency>
                <groupId>com.google.code.findbugs</groupId>
                <artifactId>jsr305</artifactId>
                <version>${jsr305.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-context</artifactId>
                <version>${spring-cloud-context.version}</version>
            </dependency>
            <dependency>
                <groupId>com.atlassian.oai</groupId>
                <artifactId>swagger-request-validator-mockmvc</artifactId>
                <version>${swagger-request-validator.version}</version>
            </dependency>

	            <!-- AI Infrastructure Core Module -->
	            <dependency>
	                <groupId>io.github.loom-ai-labs</groupId>
	                <artifactId>ai-fabric-core</artifactId>
	                <version>${project.version}</version>
	            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-starter</artifactId>
                <version>${project.version}</version>
            </dependency>
	            <!-- Optional: connector-backed actions module -->
	            <dependency>
	                <groupId>io.github.loom-ai-labs</groupId>
	                <artifactId>ai-fabric-actions-connector</artifactId>
	                <version>${project.version}</version>
	            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-actions-registry</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-actions-registry-liquibase</artifactId>
                <version>${project.version}</version>
            </dependency>
		            <!-- Optional: documents-only retrieval connector module -->
		            <dependency>
		                <groupId>io.github.loom-ai-labs</groupId>
		                <artifactId>ai-fabric-retrieval-connector</artifactId>
		                <version>${project.version}</version>
		            </dependency>
		            <!-- Optional: push-based data sync (ingestion) API for managed vector DB -->
		            <dependency>
		                <groupId>io.github.loom-ai-labs</groupId>
		                <artifactId>ai-fabric-data-sync</artifactId>
		                <version>${project.version}</version>
		            </dependency>
		            <dependency>
		                <groupId>io.github.loom-ai-labs</groupId>
		                <artifactId>ai-fabric-provider-starter</artifactId>
		                <version>${project.version}</version>
		            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-relay</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-web</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-relationship-query</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-migration-core</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-rag</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-pii</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-governance</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-indexing</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-chat-session</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-behavior</artifactId>
                <version>${project.version}</version>
            </dependency>

            <!-- Curated Packs (optional) -->
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-curated-default</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-curated-commerce</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-curated-support</artifactId>
                <version>${project.version}</version>
            </dependency>
            
            <!-- Provider Modules -->
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-provider-openai</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-provider-azure</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-provider-cohere</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-provider-anthropic</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-provider-gemini</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-onnx-starter</artifactId>
                <version>${project.version}</version>
            </dependency>
            <!-- Vector Modules -->
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-vector-lucene</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-vector-pinecone</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-vector-memory</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-vector-weaviate</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-vector-qdrant</artifactId>
                <version>${project.version}</version>
            </dependency>
            <dependency>
                <groupId>io.github.loom-ai-labs</groupId>
                <artifactId>ai-fabric-vector-milvus</artifactId>
                <version>${project.version}</version>
            </dependency>

            <!-- Lucene Dependencies -->
            <dependency>
                <groupId>org.apache.lucene</groupId>
                <artifactId>lucene-core</artifactId>
                <version>${lucene.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.lucene</groupId>
                <artifactId>lucene-analysis-common</artifactId>
                <version>${lucene.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.lucene</groupId>
                <artifactId>lucene-queryparser</artifactId>
                <version>${lucene.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.lucene</groupId>
                <artifactId>lucene-spatial3d</artifactId>
                <version>${lucene.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.lucene</groupId>
                <artifactId>lucene-backward-codecs</artifactId>
                <version>${lucene.version}</version>
            </dependency>
            <dependency>
                <groupId>org.apache.lucene</groupId>
                <artifactId>lucene-misc</artifactId>
                <version>${lucene.version}</version>
            </dependency>
            
            <!-- OpenAI -->
            <dependency>
                <groupId>com.theokanning.openai-gpt3-java</groupId>
                <artifactId>service</artifactId>
                <version>${openai.version}</version>
            </dependency>
            
            <!-- Utilities -->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct</artifactId>
                <version>${mapstruct.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mapstruct</groupId>
                <artifactId>mapstruct-processor</artifactId>
                <version>${mapstruct.version}</version>
            </dependency>
            
            <!-- Testing -->
            <dependency>
                <groupId>org.testcontainers</groupId>
                <artifactId>junit-jupiter</artifactId>
                <version>${testcontainers.version}</version>
            </dependency>
            <dependency>
                <groupId>org.awaitility</groupId>
                <artifactId>awaitility</artifactId>
                <version>${awaitility.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-core</artifactId>
                <version>${mockito.version}</version>
            </dependency>
            <dependency>
                <groupId>org.mockito</groupId>
                <artifactId>mockito-junit-jupiter</artifactId>
                <version>${mockito.version}</version>
            </dependency>
            <dependency>
                <groupId>org.openjdk.jmh</groupId>
                <artifactId>jmh-core</artifactId>
                <version>${jmh.version}</version>
            </dependency>
            <dependency>
                <groupId>org.openjdk.jmh</groupId>
                <artifactId>jmh-generator-annprocess</artifactId>
                <version>${jmh.version}</version>
            </dependency>
            <dependency>
                <groupId>com.github.javafaker</groupId>
                <artifactId>javafaker</artifactId>
                <version>${javafaker.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <!-- No dependencies in parent POM - they belong in child modules -->

    <!--
        Publishing to Maven Central is handled by the `central` profile
        (central-publishing-maven-plugin), so no distributionManagement is required here.
        See docs/MAVEN_CENTRAL_RELEASE_GUIDE.md.
    -->

    <build>
        <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>${spring-boot.version}</version>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>${maven-surefire-plugin.version}</version>
            <configuration>
                <argLine>-Dnet.bytebuddy.experimental=true -XX:+EnableDynamicAgentLoading -Xshare:off</argLine>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>${maven-failsafe-plugin.version}</version>
            <configuration>
                <argLine>-Dnet.bytebuddy.experimental=true -XX:+EnableDynamicAgentLoading -Xshare:off</argLine>
            </configuration>
        </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.13.0</version>
                <configuration>
                    <source>21</source>
                    <target>21</target>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${mapstruct.version}</version>
                        </path>
                    </annotationProcessorPaths>
                    <compilerArgs>
                        <arg>-parameters</arg>
                    </compilerArgs>
                    <fork>true</fork>
                    <meminitial>128m</meminitial>
                    <maxmem>512m</maxmem>
                </configuration>
            </plugin>
            <!-- maven-processor-plugin removed - not compatible with Java 21
                 Annotation processing is already handled by maven-compiler-plugin -->
        </plugins>
    </build>

    <profiles>
        <!--
            Release profile: attaches the -sources.jar and -javadoc.jar that Maven Central
            requires, so consumers also get source and Javadoc in their IDEs. Combine with the
            `central` profile (GPG signing + Central upload) at deploy time: mvn -Prelease,central deploy.
        -->
        <profile>
            <id>release</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-source-plugin</artifactId>
                        <version>${maven-source-plugin.version}</version>
                        <executions>
                            <execution>
                                <id>attach-sources</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>jar-no-fork</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-javadoc-plugin</artifactId>
                        <version>${maven-javadoc-plugin.version}</version>
                        <configuration>
                            <!-- Preview APIs are documented for consumers, not gated on strict linting. -->
                            <doclint>none</doclint>
                            <quiet>true</quiet>
                            <failOnError>false</failOnError>
                        </configuration>
                        <executions>
                            <execution>
                                <id>attach-javadocs</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>jar</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>

        <!--
            Central profile: GPG-signs every artifact and publishes to Maven Central via the
            Sonatype Central Portal. Use together with the release profile:

                mvn -Prelease,central deploy

            Requires (provided as CI secrets / local env, never committed):
              - a GPG key importable into the build, with its passphrase in MAVEN_GPG_PASSPHRASE
              - a Central Portal user token configured for server id `central` in settings.xml
                (CENTRAL_TOKEN_USERNAME / CENTRAL_TOKEN_PASSWORD)
        -->
        <profile>
            <id>central</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-gpg-plugin</artifactId>
                        <version>${maven-gpg-plugin.version}</version>
                        <executions>
                            <execution>
                                <id>sign-artifacts</id>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                                <configuration>
                                    <!-- Non-interactive signing for CI; passphrase comes from env. -->
                                    <gpgArguments>
                                        <arg>--pinentry-mode</arg>
                                        <arg>loopback</arg>
                                    </gpgArguments>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.sonatype.central</groupId>
                        <artifactId>central-publishing-maven-plugin</artifactId>
                        <version>${central-publishing-maven-plugin.version}</version>
                        <extensions>true</extensions>
                        <configuration>
                            <publishingServerId>central</publishingServerId>
                            <autoPublish>true</autoPublish>
                            <waitUntil>published</waitUntil>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>
