<?xml version="1.0" encoding="UTF-8"?>
<!--
    大龙虾 / Big Lobster AI Server — web.xml
    =======================================
    - 声明 SSE Servlet（`/ai/api/runs/stream`）并启用异步支持
    - Spring ContextLoaderListener 由现有 zmeg_new 框架自己启动；
      这里只补充大龙虾自带的 Servlet/Filter。
    - 若容器会扫 @WebServlet 注解，可不重复声明；为兼容保守配置双写。
-->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1"
         metadata-complete="false">

    <display-name>zm-ai-server (Big Lobster)</display-name>

    <!--
        SSE 流式 Run 入口 / SSE run endpoint.
        前端 lobsterSse.js 默认 POST 到此路径；Tomcat / Jetty 9+ 会自动启用
        async 上下文写 text/event-stream。
    -->
    <servlet>
        <servlet-name>LobsterRunStreamServlet</servlet-name>
        <servlet-class>com.gzzm.lobster.api.RunStreamServlet</servlet-class>
        <async-supported>true</async-supported>
        <load-on-startup>2</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>LobsterRunStreamServlet</servlet-name>
        <url-pattern>/ai/api/runs/stream</url-pattern>
    </servlet-mapping>

    <!--
        知识库 mock / KB Mock servlet — 仅用于本地端到端测试.
        把 lobster.xml 的 <oaKnowledgeBaseUrl> 指到 http://<host>:<port>/ai/api/_mock/kb 即可启用.
        生产环境无需删除——只要 oaKnowledgeBaseUrl 指向真实 KB，mock 端点形同虚设；
        但若担心未授权访问，可在反向代理层屏蔽 /ai/api/_mock/* 路径.
    -->
    <servlet>
        <servlet-name>LobsterKbMockServlet</servlet-name>
        <servlet-class>com.gzzm.lobster.api.KbMockServlet</servlet-class>
        <load-on-startup>3</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>LobsterKbMockServlet</servlet-name>
        <url-pattern>/ai/api/_mock/kb/*</url-pattern>
    </servlet-mapping>

    <!--
        大龙虾启动引导 / Lobster bootstrap.
        借 Servlet 生命周期作为"容器就绪"信号，调用 LobsterBootstrap.onStart() 注册内置工具。
        load-on-startup 值大于 RunStreamServlet(2)，确保晚于其他核心 Servlet 初始化。
    -->
    <servlet>
        <servlet-name>LobsterBootstrapServlet</servlet-name>
        <servlet-class>com.gzzm.lobster.bootstrap.BootstrapServlet</servlet-class>
        <load-on-startup>99</load-on-startup>
    </servlet>

    <!--
        会话配置：SSE 长连可能超过默认 session timeout；这里保守留 60 分钟。
        运维侧应在 nginx / 反代 proxy_read_timeout 同步拉长，并 proxy_buffering off。
    -->
    <session-config>
        <session-timeout>60</session-timeout>
    </session-config>
</web-app>
