greentic-flow-builder 0.1.0

AI-powered Adaptive Card flow builder with visual graph editor and demo runner
Documentation
//! Flow Builder web UI — Axum server.
//!
//! This module boots an HTTP server that serves the embedded HTML/JS/CSS
//! bundle and exposes a small JSON API around the template registry
//! (`/api/templates`, `/api/render`, `/api/chat`, ...). The real handler
//! code lives in `routes/`.

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;

/// Start the Flow Builder HTTP server and block until it exits.
pub async fn launch(args: UiArgs) -> Result<()> {
    let registry = Arc::new(TemplateRegistry::load(&args.template_pack)?);
    let system_prompt = prompt_builder::build_system_prompt(&registry);

    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(())
}