diff --git a/crates/colibri-daemon/src/socket.rs b/crates/colibri-daemon/src/socket.rs index 2284f4b..312c2a6 100644 --- a/crates/colibri-daemon/src/socket.rs +++ b/crates/colibri-daemon/src/socket.rs @@ -1082,13 +1082,19 @@ async fn cmd_intake_task( capabilities: Option>, ) -> ColibriResponse { let caps = capabilities.unwrap_or_default(); + // Create the task immediately so the caller gets the ID back. + let task = match state.store.lock().unwrap().create_task(&title, description.as_deref()) { + Ok(t) => t, + Err(e) => return ColibriResponse::err(format!("create task failed: {e}")), + }; + // Also queue for the scheduler tick to route to a capable agent. let mut scheduler = state.scheduler.lock().await; scheduler.submit(crate::scheduler::TaskRequest { title, description, required_capabilities: caps, }); - ColibriResponse::ok(serde_json::json!({"status": "queued"})) + ColibriResponse::ok(serde_json::to_value(&task).unwrap_or_default()) } async fn cmd_set_cost_mode(state: &SharedState, mode: String) -> ColibriResponse { diff --git a/crates/colibri-daemon/tests/multi_agent_board.rs b/crates/colibri-daemon/tests/multi_agent_board.rs index 7ab5052..ef0ea31 100644 --- a/crates/colibri-daemon/tests/multi_agent_board.rs +++ b/crates/colibri-daemon/tests/multi_agent_board.rs @@ -198,7 +198,8 @@ async fn scheduler_routes_intake_tasks_by_capability() { r#"{"cmd":"intake-task","title":"scrub zroot","capabilities":["freebsd"]}"#, ) .await; - assert_eq!(fs_intake["data"]["status"].as_str(), Some("queued")); + // Intake now returns the full task (id + status), not just {"status":"queued"}. + assert!(fs_intake["data"]["id"].is_string(), "intake must return task id"); send_command( &socket_path,