Files
furumi-ng/furumi-agent/src/main.rs
AB-UK e1782a6e3b
All checks were successful
Publish Metadata Agent Image / build-and-push-image (push) Successful in 1m7s
Publish Web Player Image / build-and-push-image (push) Successful in 1m11s
Publish Server Image / build-and-push-image (push) Successful in 2m14s
Added merge
2026-03-19 00:55:49 +00:00

64 lines
2.0 KiB
Rust

mod config;
mod db;
mod ingest;
mod merge;
mod web;
use std::sync::Arc;
use clap::Parser;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::init();
let args = config::Args::parse();
args.validate()?;
let version = option_env!("FURUMI_VERSION").unwrap_or(env!("CARGO_PKG_VERSION"));
tracing::info!("Furumi Agent v{} starting", version);
tracing::info!("Inbox directory: {:?}", args.inbox_dir);
tracing::info!("Storage directory: {:?}", args.storage_dir);
tracing::info!("Ollama: {} (model: {})", args.ollama_url, args.ollama_model);
tracing::info!("Confidence threshold: {}", args.confidence_threshold);
let system_prompt = args.load_system_prompt()?;
tracing::info!("System prompt loaded: {} chars", system_prompt.len());
let merge_prompt = args.load_merge_prompt()?;
tracing::info!("Merge prompt loaded: {} chars", merge_prompt.len());
tracing::info!("Connecting to database...");
let pool = db::connect(&args.database_url).await?;
tracing::info!("Running database migrations...");
db::migrate(&pool).await?;
tracing::info!("Database ready");
let state = Arc::new(web::AppState {
pool: pool.clone(),
config: Arc::new(args),
system_prompt: Arc::new(system_prompt),
merge_prompt: Arc::new(merge_prompt),
});
// Spawn the ingest pipeline as a background task
let ingest_state = state.clone();
tokio::spawn(async move {
ingest::run(ingest_state).await;
});
// Start the admin web UI
let bind_addr: std::net::SocketAddr = state.config.bind.parse().unwrap_or_else(|e| {
eprintln!("Error: Invalid bind address '{}': {}", state.config.bind, e);
std::process::exit(1);
});
tracing::info!("Admin UI: http://{}", bind_addr);
let app = web::build_router(state);
let listener = tokio::net::TcpListener::bind(bind_addr).await?;
axum::serve(listener, app).await?;
Ok(())
}