use axum::{
Router,
routing::{any, get, post},
};
use tower_http::cors::CorsLayer;
use tower_http::trace::TraceLayer;
use super::{
AppState, analyze_indexes_handler, analyze_visualize_handler, health_handler, services_handler,
};
pub fn build_router(state: AppState) -> Router {
build_router_with_self_origins(state, crate::routes::origin_guard::SelfOrigins::default())
}
pub fn build_router_with_webhooks(
state: AppState,
self_origins: crate::routes::origin_guard::SelfOrigins,
ingress: crate::webhook::WebhookIngress,
) -> Router {
build_router_inner(state, self_origins, Some(ingress))
}
pub fn build_router_with_self_origins(
state: AppState,
self_origins: crate::routes::origin_guard::SelfOrigins,
) -> Router {
build_router_inner(state, self_origins, None)
}
fn build_router_inner(
state: AppState,
self_origins: crate::routes::origin_guard::SelfOrigins,
webhook: Option<crate::webhook::WebhookIngress>,
) -> Router {
let core = Router::new()
.route("/health", get(health_handler))
.route("/api/console/services", get(services_handler))
.route(
"/api/console/metrics/analyze",
get(crate::routes::metrics::metrics_analyze_handler),
)
.route(
"/api/console/metrics/memory",
get(crate::routes::metrics::metrics_memory_handler),
)
.route(
"/api/console/metrics/search",
get(crate::routes::metrics::metrics_search_handler),
)
.route(
"/api/console/metrics/review",
get(crate::routes::metrics::metrics_review_handler),
)
.route(
"/api/console/metrics/mpm",
get(crate::routes::metrics::metrics_mpm_handler),
)
.route(
"/api/console/machine-status",
get(crate::routes::machine_status::machine_status_handler),
)
.route(
"/api/console/machine-status/history",
get(crate::routes::machine_history::history_handler),
)
.route(
"/api/console/machine-status/stream",
get(crate::routes::machine_history::stream_handler),
)
.route(
"/api/console/architect-dashboard",
get(crate::routes::architect::dashboard_link_handler),
)
.route(
"/api/console/sessions",
get(crate::routes::sessions::list_handler).post(crate::routes::sessions::new_handler),
)
.route(
"/api/console/sessions/supervisor",
get(crate::routes::sessions::supervisor_handler),
)
.route(
"/api/console/sessions/supervisor/auto-resume",
axum::routing::post(crate::routes::sessions::auto_resume_handler),
)
.route(
"/api/console/sessions/bulk-delete",
axum::routing::post(crate::routes::sessions::bulk_delete_handler),
)
.route(
"/api/console/sessions/{id}",
get(crate::routes::sessions::get_handler)
.delete(crate::routes::sessions::decommission_handler),
)
.route(
"/api/console/sessions/{id}/activity",
get(crate::routes::sessions::activity_handler),
)
.route(
"/api/console/sessions/{id}/stop",
axum::routing::post(crate::routes::sessions::stop_handler),
)
.route(
"/api/console/sessions/{id}/resume",
axum::routing::post(crate::routes::sessions::resume_handler),
)
.route(
"/api/console/disk/tree",
get(crate::routes::disk::tree_handler),
)
.route(
"/api/console/disk/worktrees/{id}",
get(crate::routes::disk::worktree_handler),
)
.route(
"/api/console/config/mpm",
get(crate::routes::config::get_handler).post(crate::routes::config::post_handler),
)
.route(
"/api/console/memory/palaces/{id}",
axum::routing::delete(crate::routes::deletes::delete_palace_handler),
)
.route(
"/api/console/search/indexes/{id}",
axum::routing::delete(crate::routes::deletes::delete_index_handler),
)
.route(
"/api/console/memory/palaces/{id}/compact",
post(crate::routes::cleanup::compact_palace_handler),
)
.route(
"/api/console/metrics/analyze/indexes",
get(analyze_indexes_handler),
)
.route(
"/api/console/metrics/analyze/visualize",
get(analyze_visualize_handler),
)
.route(
"/api/search/{*path}",
any(crate::search_uds::routes::search_api_handler),
)
.route(
"/proxy/search/{*path}",
any(crate::search_uds::routes::deprecated_search_api_handler),
)
.route(
"/api/memory/{*path}",
any(crate::memory_uds::routes::memory_api_handler),
)
.route(
"/proxy/memory/{*path}",
any(crate::memory_uds::routes::deprecated_memory_api_handler),
)
.route(
"/api/analyze/{*path}",
any(crate::analyze_uds::routes::analyze_api_handler),
)
.route(
"/proxy/analyze/{*path}",
any(crate::analyze_uds::routes::deprecated_analyze_api_handler),
)
.route("/api/{service}/{*path}", any(crate::proxy::proxy_handler))
.route(
"/proxy/{daemon}/{*path}",
any(crate::proxy::deprecated_proxy_handler),
)
.route("/tools/search", get(crate::tools_ui::search_ui_redirect))
.route("/tools/search/", get(crate::tools_ui::search_ui_index))
.route(
"/tools/search/{*path}",
get(crate::tools_ui::search_ui_asset),
)
.route("/tools/memory", get(crate::tools_ui::memory_ui_redirect))
.route("/tools/memory/", get(crate::tools_ui::memory_ui_index))
.route(
"/tools/memory/{*path}",
get(crate::tools_ui::memory_ui_asset),
)
.route("/tools/analyze", get(crate::tools_ui::analyze_ui_redirect))
.route("/tools/analyze/", get(crate::tools_ui::analyze_ui_index))
.route(
"/tools/analyze/{*path}",
get(crate::tools_ui::analyze_ui_asset),
)
.route("/", get(crate::console_ui::spa_index_handler))
.route("/screensaver", get(crate::console_ui::spa_index_handler))
.route("/ui", get(crate::console_ui::spa_index_handler))
.route("/ui/", get(crate::console_ui::spa_index_handler))
.route("/ui/{*path}", get(crate::console_ui::spa_asset_handler))
.with_state(state);
let router = match webhook {
Some(ingress) => core.merge(
Router::new()
.route(
"/api/webhooks/{source}",
axum::routing::post(crate::webhook::webhook_handler),
)
.route(
"/api/console/metrics/webhooks",
get(crate::webhook::metrics_webhooks_handler),
)
.with_state(ingress)
.layer(axum::extract::DefaultBodyLimit::max(
crate::webhook::MAX_WEBHOOK_BODY_BYTES,
)),
),
None => core,
};
router
.layer(axum::middleware::from_fn_with_state(
self_origins,
crate::routes::origin_guard::guard_write_origin,
))
.layer(CorsLayer::permissive())
.layer(TraceLayer::new_for_http())
}