mod bridge; mod command_support; mod compat; mod documents; mod editor; mod gateway; mod health; mod hermes; mod kernel; mod local_folder_source; mod local_markdown_parser; mod mindmap_shell; mod query_support; mod search; mod session; mod snapshot_support; mod sse; mod stream_support; mod tree; mod web_shell; mod ws; use crate::app::AppState; use axum::routing::{get, post}; use axum::Router; pub fn build_router(state: AppState) -> Router { let hermes_base_path = state.config().hermes_base_path.clone(); let compat_next_base_path = state.config().compat_next_base_path.clone(); let enable_debug_shell_routes = state.config().enable_debug_shell_routes; let mut router = Router::new() .route("/health", get(health::health)) .route("/", get(gateway::root_entry)) .route("/favicon.ico", get(gateway::favicon)) .route("/auth", get(gateway::auth_entry).post(gateway::auth_entry)) .route("/search", get(search::shell)) .route( "/mindmap/{doc_id}/{mindmap_id}", get(mindmap_shell::mindmap_object_shell), ) .route( "/documents/{document_id}", get(web_shell::document_page_shell), ) .route( "/api/page-aggregate/{document_id}", get(web_shell::page_aggregate), ) .route( "/api/leptos-tiptap-runtime/manifest.json", get(web_shell::leptos_tiptap_manifest), ) .route( "/api/leptos-tiptap-runtime/{*asset_path}", get(web_shell::leptos_tiptap_asset), ) .route( "/api/editor/image-placeholder.svg", get(web_shell::editor_image_placeholder_asset), ) .route("/api/search/documents", post(search::documents)) .route("/api/gateway/health", get(gateway::gateway_health)) .route("/api/runtime/config", get(session::runtime_config)) .route("/api/auth", post(gateway::auth_api)) .route("/api/auth/session", get(session::session)) .route("/api/auth/whoami", get(session::session)) .route("/api/auth/mnote-web-token", get(session::session)) .route("/api/auth/session/refresh", post(session::refresh_session)) .route("/api/ai-agent/run", post(compat::next_ai_agent_run)) .route("/api/documents/meta", get(documents::meta)) .route("/api/documents/content", get(documents::content)) .route("/api/documents/page", get(web_shell::documents_page_compat)) .route("/api/documents/purge", post(documents::purge)) .route("/api/documents/title", post(documents::title)) .route("/api/documents/options", post(documents::options)) .route("/api/documents/save", post(documents::save)) .route( "/api/documents/runtime/transform", post(editor::transform_runtime_snapshot), ) .route( "/api/tree/projections/sidebar", get(kernel::project_tree_sidebar), ) .route("/api/tree/projections/page", get(kernel::project_tree_page)) .route("/api/tree/projections/file", get(kernel::project_tree_file)) .route( "/api/kernel/projections/sidebar", get(kernel::project_sidebar), ) .route("/api/kernel/subtree", get(kernel::subtree)) .route("/api/kernel/edges", get(kernel::edges)) .route("/api/kernel/graph", get(kernel::graph)) .route("/api/tree/commands", post(tree::tree_command)) .route( "/api/tree/local-folder-watch", get(tree::local_folder_watch), ) .route( "/api/tree/runtime/reduce", post(tree::reduce_tree_shell_runtime), ) .route("/api/bridge/workspace", get(bridge::workspace)) .route("/api/bridge/request", get(bridge::request)) .route("/api/bridge/trace", get(bridge::trace)) .route("/api/tree/events", get(sse::tree_events)) .route("/api/stream/events", get(sse::events)) .route("/api/realtime/ws", get(ws::socket)) .nest( &hermes_base_path, Router::new() .route("/health", get(hermes::health)) .route("/bridge", post(hermes::bridge_runtime)), ) .nest( &compat_next_base_path, Router::new() .route("/ai-agent/run", post(compat::next_ai_agent_run)) .route("/sidebar", get(compat::next_sidebar)), ) .fallback(gateway::legacy_next_proxy); if enable_debug_shell_routes { router = router .route("/tree", get(tree::tree_shell)) .route("/document-debug", get(editor::document_editor_shell)) .route("/document", get(editor::document_editor_shell)); } router.with_state(state) }