mod assets;
pub mod openai;
pub mod prompt_builder;
pub mod routes;
pub mod state;
pub mod tool_bridge;
use std::sync::Arc;
use anyhow::Result;
use crate::cli::UiArgs;
use state::AppState;
pub async fn launch(args: UiArgs) -> Result<()> {
let knowledge_base = Arc::new(crate::knowledge::Knowledge::embedded());
let system_prompt = prompt_builder::build_system_prompt(&knowledge_base, None);
let state = Arc::new(AppState {
openai_api_key: args.openai_api_key,
model: args.model,
system_prompt,
knowledge_base,
pack_jobs: tokio::sync::Mutex::new(std::collections::HashMap::new()),
wizard_jobs: tokio::sync::Mutex::new(std::collections::HashMap::new()),
});
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(())
}