<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

  <context:annotation-config />

  <!-- Import Java-based Spring config for rate limiting -->
  <bean class="com.appiancorp.lcpapi.ratelimit.LcpApiRateLimitSpringConfig"/>

  <!-- Import Java-based Spring config for request size limiting -->
  <bean class="com.appiancorp.lcpapi.ratelimit.LcpApiRequestSizeLimitSpringConfig"/>

  <!-- Thread pool metrics - shared between the servlet and rate limit interceptor -->
  <bean id="lcpApiThreadPoolMetrics" class="com.appiancorp.lcpapi.threadpool.LcpApiThreadPoolMetrics"/>

  <!-- Thread pool config - hot-reloadable pool size from custom.properties -->
  <bean id="lcpApiThreadPoolConfig" class="com.appiancorp.lcpapi.threadpool.LcpApiThreadPoolConfig"/>

  <!-- Metrics interceptor for LCP API requests - records request counts, latencies, and error rates -->
  <bean id="lcpApiMetricsInterceptor" class="com.appiancorp.lcpapi.metrics.LcpApiMetricsInterceptor"/>

  <!-- Audit interceptor for LCP API requests - writes per-request trace to appian_platform_api_trace.csv -->
  <bean id="lcpApiAuditInterceptor" class="com.appiancorp.lcpapi.audit.LcpApiAuditInterceptor">
    <constructor-arg ref="lcpApiTraceDataCollector"/>
  </bean>

  <!-- Tracing interceptor for LCP API requests - creates spans with controller/method info -->
  <bean id="lcpApiTracingInterceptor" class="com.appiancorp.lcpapi.tracing.LcpApiTracingInterceptor">
    <constructor-arg ref="tracerWrapper"/>
  </bean>

  <!-- Checks feature toggles before OpenAPI validation runs. If the feature
       for a given path prefix is disabled, returns 501 immediately without
       triggering schema validation (which would produce a confusing 400). -->
  <bean id="lcpApiFeatureToggleInterceptor"
        class="com.appiancorp.lcpapi.filter.LcpApiFeatureToggleInterceptor">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg value="classpath:lcpApi-feature-toggle-paths.properties"/>
  </bean>

  <!-- Validates incoming HTTP requests against the OpenAPI spec for the requested API version.
       Each API version has its own spec: the unreleased spec for the latest version, and frozen
       released specs for versioned releases. The release script adds entries for each release.
       Rejects invalid requests with HTTP 400 in RFC 9457 Problem Detail format. -->
  <bean id="openApiValidationInterceptor"
        class="com.appiancorp.lcpapi.validation.VersionAwareOpenApiValidationInterceptor">
    <constructor-arg>
      <map>
        <!-- Start of validation specs, DO NOT REMOVE COMMENT, USED BY RELEASE SCRIPT -->
        <entry key="2026-07-20" value="classpath:openapi-spec-2026-07-20.yaml"/>
        <entry key="2026-06-12" value="classpath:openapi-spec-2026-06-12.yaml"/>
        <entry key="2026-05-11" value="classpath:openapi-spec-2026-05-11.yaml"/>
        <entry key="unreleased" value="classpath:openapi-spec-unreleased.yaml"/>
        <!-- End of validation specs, DO NOT REMOVE COMMENT, USED BY RELEASE SCRIPT -->
      </map>
    </constructor-arg>
    <constructor-arg value="classpath:lcpApi-validation-enabled-paths.txt"/>
  </bean>

  <!-- Validates HTTP method against handler's @RequestMapping before execution.
       Returns 405 when a request reaches a handler with the wrong HTTP method,
       which can happen because the custom ApiVersionCondition interferes with
       Spring's built-in method-not-allowed detection. -->
  <bean id="httpMethodValidationInterceptor" class="com.appiancorp.lcpapi.filter.HttpMethodValidationInterceptor"/>

  <!-- Controllers (from lcp-api-rest-controllers-2026-05-11 module) -->
  <bean class="com.appiancorp.lcpapi.v20260511.controller.DesignObjectsInterfacesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="interfaceBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.DesignObjectsExpressionRulesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="expressionRuleBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.DesignObjectsAgentsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="aiAgentDesignObjectsLcpApi"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.RuntimeAgentRunsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="aiPlatformAgentRunService"/>
    <constructor-arg ref="stepDataService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.DesignObjectsRecordTypesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="recordTypeBridgeService"/>
    <constructor-arg ref="recordTypeDataBridgeService"/>
    <constructor-arg ref="recordTypeSqlQueryBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.DesignObjectsConnectedSystemsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="connectedSystemBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.DesignObjectsProcessModelsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="processModelBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.RuntimeProcessesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="processModelBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.ContentDocumentsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.DesignObjectsDocumentsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.DesignObjectsFoldersApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.ContentFoldersApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.ContentSemanticSearchApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.AuthenticationApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="authenticationBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.MetadataTypesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="metadataBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.DesignObjectsAiSkillsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="aiSkillBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.DesignObjectsRoboticTasksApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="roboticTaskBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.DesignObjectsBusinessProcessesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="businessProcessBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.DesignObjectsDashboardsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="dashboardBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260511.controller.DesignObjectsReportsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="reportBridgeService"/>
  </bean>
  <!-- Global exception handler for RFC 9457 error responses -->
  <bean class="com.appiancorp.lcpapi.v20260511.handler.LcpApiExceptionHandler">
    <constructor-arg ref="versionTranslatorProvider"/>
  </bean>

  <!-- Controllers (from lcp-api-rest-controllers-2026-06-12 module) -->
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsInterfacesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="interfaceBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsExpressionRulesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="expressionRuleBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsAgentsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="aiAgentDesignObjectsLcpApi"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.RuntimeAgentRunsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="aiPlatformAgentRunService"/>
    <constructor-arg ref="stepDataService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsRecordTypesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="recordTypeBridgeService"/>
    <constructor-arg ref="recordTypeDataBridgeService"/>
    <constructor-arg ref="recordTypeSqlQueryBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsConnectedSystemsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="connectedSystemBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsProcessModelsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="processModelBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.RuntimeProcessesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="processModelBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.ContentDocumentsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsDocumentsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsFoldersApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.ContentFoldersApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.ContentSemanticSearchApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.AuthenticationApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="authenticationBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.MetadataTypesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="metadataBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsAiSkillsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="aiSkillBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsRoboticTasksApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="roboticTaskBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsBusinessProcessesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="businessProcessBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsDashboardsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="dashboardBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsReportsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="reportBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsCheckpointApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="checkpointService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.DesignObjectsSearchApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="searchBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260612.controller.ConfigurationMcpApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="mcpFeatureBridgeService"/>
  </bean>
  <!-- Global exception handler for RFC 9457 error responses -->
  <bean class="com.appiancorp.lcpapi.v20260612.handler.LcpApiExceptionHandler">
    <constructor-arg ref="versionTranslatorProvider"/>
  </bean>

  <!-- Controllers (from lcp-api-rest-controllers-2026-07-20 module) -->
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsInterfacesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="interfaceBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsExpressionRulesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="expressionRuleBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsAgentsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="aiAgentDesignObjectsLcpApi"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.RuntimeAgentRunsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="aiPlatformAgentRunService"/>
    <constructor-arg ref="stepDataService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsRecordTypesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="recordTypeBridgeService"/>
    <constructor-arg ref="recordTypeDataBridgeService"/>
    <constructor-arg ref="recordTypeSqlQueryBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsConnectedSystemsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="connectedSystemBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsProcessModelsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="processModelBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.RuntimeProcessesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="processModelBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.ContentDocumentsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsDocumentsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsFoldersApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.ContentFoldersApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.ContentSemanticSearchApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.AuthenticationApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="authenticationBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.MetadataTypesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="metadataBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsAiSkillsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="aiSkillBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsRoboticTasksApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="roboticTaskBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsBusinessProcessesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="businessProcessBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsDashboardsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="dashboardBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsReportsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="reportBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsCheckpointApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="checkpointService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.DesignObjectsSearchApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="searchBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.v20260720.controller.ConfigurationMcpApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="mcpFeatureBridgeService"/>
  </bean>
  <!-- Global exception handler for RFC 9457 error responses -->
  <bean class="com.appiancorp.lcpapi.v20260720.handler.LcpApiExceptionHandler">
    <constructor-arg ref="versionTranslatorProvider"/>
  </bean>

  <!-- Start of latest controllers, DO NOT REMOVE COMMENT, USED BY RELEASE SCRIPT -->
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsInterfacesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="interfaceBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsExpressionRulesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="expressionRuleBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsAgentsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="aiAgentDesignObjectsLcpApi"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.RuntimeAgentRunsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="aiPlatformAgentRunService"/>
    <constructor-arg ref="stepDataService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsRecordTypesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="recordTypeBridgeService"/>
    <constructor-arg ref="recordTypeDataBridgeService"/>
    <constructor-arg ref="recordTypeSqlQueryBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsConnectedSystemsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="connectedSystemBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsProcessModelsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="processModelBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.RuntimeProcessesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="processModelBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.ContentDocumentsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsDocumentsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsFoldersApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.ContentFoldersApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.ContentSemanticSearchApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="contentBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.AuthenticationApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="authenticationBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.MetadataTypesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="metadataBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsAiSkillsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="aiSkillBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsRoboticTasksApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="roboticTaskBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsBusinessProcessesApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="businessProcessBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsDashboardsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="dashboardBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsReportsApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="reportBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsCheckpointApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="checkpointService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.DesignObjectsSearchApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="searchBridgeService"/>
  </bean>
  <bean class="com.appiancorp.lcpapi.latest.controller.ConfigurationMcpApiRestController">
    <constructor-arg ref="featureToggleClient"/>
    <constructor-arg ref="versionTranslatorProvider"/>
    <constructor-arg ref="mcpFeatureBridgeService"/>
  </bean>
  <!-- Global exception handler for RFC 9457 error responses -->
  <bean class="com.appiancorp.lcpapi.latest.handler.LcpApiExceptionHandler">
    <constructor-arg ref="versionTranslatorProvider"/>
  </bean>
  <!-- End of latest controllers, DO NOT REMOVE COMMENT, USED BY RELEASE SCRIPT -->

  <!-- Unversioned discovery endpoint (auth required, no version header required) -->
  <bean class="com.appiancorp.lcpapi.controller.VersionsApiController"/>

  <!-- Custom handler mapping for API version routing based on X-Appian-Api-Version header -->
  <bean class="com.appiancorp.lcpapi.version.ApiVersionRequestMappingHandlerMapping">
    <!-- Lower order = higher priority. Ensures this mapping is checked before any default handler mappings. -->
    <property name="order" value="0"/>
    <property name="interceptors">
      <list>
        <ref bean="lcpApiMetricsInterceptor"/>
        <ref bean="lcpApiAuditInterceptor"/>
        <ref bean="lcpApiRequestSizeLimitInterceptor"/>
        <ref bean="lcpApiRateLimitInterceptor"/>
        <ref bean="lcpApiTracingInterceptor"/>
        <ref bean="lcpApiFeatureToggleInterceptor"/>
        <ref bean="openApiValidationInterceptor"/>
        <ref bean="httpMethodValidationInterceptor"/>
      </list>
    </property>
  </bean>

  <!-- Message converters with Gson configured for OffsetDateTime -->
  <bean id="lcpApiGsonMessageConverter" class="org.springframework.http.converter.json.GsonHttpMessageConverter">
    <property name="gson">
      <bean class="com.appiancorp.lcpapi.json.LcpApiGsonFactory" factory-method="create"/>
    </property>
  </bean>

  <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
    <property name="messageConverters">
      <list>
        <ref bean="lcpApiGsonMessageConverter"/>
      </list>
    </property>
  </bean>

  <!-- Exception handler resolver to enable @ExceptionHandler processing -->
  <bean class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver">
    <property name="messageConverters">
      <list>
        <ref bean="lcpApiGsonMessageConverter"/>
      </list>
    </property>
  </bean>
</beans>
