mod assets;
pub mod openai;
pub mod prompt_builder;
pub mod routes;
pub mod state;
use std::sync::Arc;
use anyhow::Result;
use crate::cli::UiArgs;
use crate::registry::TemplateRegistry;
use state::AppState;
pub async fn launch(args: UiArgs) -> Result<()> {
let registry = Arc::new(TemplateRegistry::load(&args.template_pack)?);
let system_prompt = prompt_builder::build_system_prompt(®istry);
let state = Arc::new(AppState {
openai_api_key: args.openai_api_key,
model: args.model,
registry: registry.clone(),
system_prompt,
});
let router = routes::build(state);
let addr = format!("127.0.0.1:{}", args.port.unwrap_or(0));
let listener = tokio::net::TcpListener::bind(&addr).await?;
let port = listener.local_addr()?.port();
let url = format!("http://127.0.0.1:{port}");
eprintln!("Flow Builder UI started at: {url}");
let _ = open::that(&url);
axum::serve(listener, router).await?;
Ok(())
}