diff --git a/src/channels/web/handlers/routines.rs b/src/channels/web/handlers/routines.rs index f23f3a94..6cdccfc6 100644 --- a/src/channels/web/handlers/routines.rs +++ b/src/channels/web/handlers/routines.rs @@ -147,6 +147,10 @@ pub async fn routines_trigger_handler( .map_err(|e| (StatusCode::INTERNAL_SERVER_ERROR, e.to_string()))? .ok_or((StatusCode::NOT_FOUND, "Routine not found".to_string()))?; + if routine.user_id != state.user_id { + return Err((StatusCode::FORBIDDEN, "Access denied".to_string())); + } + // Send the routine prompt through the message pipeline as a manual trigger. let prompt = match &routine.action { crate::agent::routine::RoutineAction::Lightweight { prompt, .. } => prompt.clone(), @@ -156,7 +160,12 @@ pub async fn routines_trigger_handler( }; let content = format!("[routine:{}] {}", routine.name, prompt); - let msg = IncomingMessage::new("gateway", &state.user_id, content); + let thread_id = format!( + "routine-{}-{}", + routine_id, + chrono::Utc::now().timestamp_millis() + ); + let msg = IncomingMessage::new("gateway", &state.user_id, content).with_thread(thread_id); let tx_guard = state.msg_tx.read().await; let tx = tx_guard.as_ref().ok_or((