use serde::{Deserialize, Serialize}; /// Frontend-facing URLs for developer tool services. /// /// Provided as a context signal in `AppShell` so that developer pages /// can read the configured URLs without threading props through layouts. /// An empty string indicates the service is not configured. #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)] pub struct ServiceUrlsContext { /// LangGraph agent builder URL (empty if not configured) pub langgraph_url: String, /// LangFlow visual workflow builder URL (empty if not configured) pub langflow_url: String, /// Langfuse observability URL (empty if not configured) pub langfuse_url: String, } #[cfg(test)] mod tests { use super::*; use pretty_assertions::assert_eq; #[test] fn default_urls_are_empty() { let ctx = ServiceUrlsContext::default(); assert_eq!(ctx.langgraph_url, ""); assert_eq!(ctx.langflow_url, ""); assert_eq!(ctx.langfuse_url, ""); } #[test] fn serde_round_trip() { let ctx = ServiceUrlsContext { langgraph_url: "http://localhost:8123".into(), langflow_url: "http://localhost:7860".into(), langfuse_url: "http://localhost:3000".into(), }; let json = serde_json::to_string(&ctx).expect("serialize ServiceUrlsContext"); let back: ServiceUrlsContext = serde_json::from_str(&json).expect("deserialize ServiceUrlsContext"); assert_eq!(ctx, back); } }