refactor: server no longer runs agent loop or LLM

- Remove agent_loop from server (was ~400 lines) — server dispatches to workers
- AgentManager simplified to pure dispatcher (send_event → worker)
- Remove LLM config requirement from server (workers bring their own via config.yaml)
- Remove process_feedback, build_feedback_tools from server
- Remove chat API endpoint (LLM on workers only)
- Remove service proxy (services run on workers)
- Worker reads LLM config from its own config.yaml
- ws_worker.rs handles WorkerToServer::Update messages (DB + broadcast)
- Verified locally: tori server + tori worker connect and register
This commit is contained in:
2026-04-06 13:18:21 +01:00
parent dfedb6dd45
commit decabc0e8a
9 changed files with 380 additions and 997 deletions

View File

@@ -27,6 +27,9 @@ enum Command {
/// Worker name
#[arg(long, env = "TORI_WORKER_NAME")]
name: Option<String>,
/// Config file path (for LLM settings)
#[arg(long, default_value = "config.yaml")]
config: String,
},
}
@@ -40,13 +43,19 @@ async fn main() -> anyhow::Result<()> {
match cli.command {
Command::Server => run_server().await,
Command::Worker { server, name } => {
Command::Worker { server, name, config } => {
let name = name.unwrap_or_else(|| {
hostname::get()
.map(|h| h.to_string_lossy().to_string())
.unwrap_or_else(|_| "worker-1".to_string())
});
worker_runner::run(&server, &name).await
let config_str = std::fs::read_to_string(&config)
.unwrap_or_else(|e| panic!("Failed to read {}: {}", config, e));
let cfg: Config = serde_yaml::from_str(&config_str)
.unwrap_or_else(|e| panic!("Failed to parse {}: {}", config, e));
let llm_config = cfg.llm
.unwrap_or_else(|| panic!("LLM config required in {} for worker mode", config));
worker_runner::run(&server, &name, &llm_config).await
}
}
}
@@ -79,10 +88,6 @@ async fn run_server() -> anyhow::Result<()> {
let agent_mgr = agent::AgentManager::new(
database.pool.clone(),
config.llm.clone(),
config.template_repo.clone(),
kb_arc.clone(),
config.jwt_private_key.clone(),
worker_mgr.clone(),
);
@@ -129,6 +134,7 @@ async fn run_server() -> anyhow::Result<()> {
}
};
let ws_pool = database.pool.clone();
let state = Arc::new(AppState {
db: database,
config: config.clone(),
@@ -151,7 +157,13 @@ async fn run_server() -> anyhow::Result<()> {
let r = obj_root;
move || api::obj::root_listing(r)
}))
.nest("/ws/tori/workers", ws_worker::router(worker_mgr))
.nest("/ws/tori/workers", {
let pool = ws_pool;
let agent_mgr_for_ws = agent_mgr.clone();
let broadcast_fn: Arc<dyn Fn(&str) -> tokio::sync::broadcast::Sender<agent::WsMessage> + Send + Sync> =
Arc::new(move |pid: &str| agent_mgr_for_ws.get_broadcast_sender(pid));
ws_worker::router(worker_mgr, pool, broadcast_fn)
})
.nest("/ws/tori", ws::router(agent_mgr))
.nest_service("/tori", ServeDir::new("web/dist").fallback(ServeFile::new("web/dist/index.html")))
.route("/", axum::routing::get(|| async {