diff --git a/crates/executors/src/executors/cursor.rs b/crates/executors/src/executors/cursor.rs
index cf61259f..57c8cc7c 100644
--- a/crates/executors/src/executors/cursor.rs
+++ b/crates/executors/src/executors/cursor.rs
@@ -872,7 +872,7 @@ impl CursorToolCall {
.iter()
.map(|t| TodoItem {
content: t.content.clone(),
- status: t.status.clone(),
+ status: normalize_todo_status(&t.status),
priority: None, // CursorTodoItem doesn't have priority field
})
.collect()
@@ -921,6 +921,16 @@ impl CursorToolCall {
}
}
+fn normalize_todo_status(status: &str) -> String {
+ match status.to_lowercase().as_str() {
+ "todo_status_pending" => "pending".to_string(),
+ "todo_status_in_progress" => "in_progress".to_string(),
+ "todo_status_completed" => "completed".to_string(),
+ "todo_status_cancelled" => "cancelled".to_string(),
+ other => other.to_string(),
+ }
+}
+
/* ===========================
Typed tool results for Cursor
=========================== */
diff --git a/frontend/src/components/tasks/TodoPanel.tsx b/frontend/src/components/tasks/TodoPanel.tsx
index 001dccc5..a6ed5b85 100644
--- a/frontend/src/components/tasks/TodoPanel.tsx
+++ b/frontend/src/components/tasks/TodoPanel.tsx
@@ -13,6 +13,8 @@ function getStatusIcon(status?: string) {
return ;
if (s === 'in_progress' || s === 'in-progress')
return ;
+ if (s === 'cancelled')
+ return ;
return ;
}
@@ -57,7 +59,11 @@ function TodoPanel() {
{getStatusIcon(todo.status)}
- {todo.content}
+ {todo.status?.toLowerCase() === 'cancelled' ? (
+ {todo.content}
+ ) : (
+ todo.content
+ )}
))}