use crate::config;
use crate::contracts::Task;
use crate::contracts::TaskStatus;
use crate::queue;
use crate::timeutil;
use crate::webhook;
use anyhow::{Context, Result};
pub(crate) fn task_context_for_prompt(task: &Task) -> Result<String> {
let id = task.id.trim();
let title = task.title.trim();
let rendered =
serde_json::to_string_pretty(task).context("serialize task JSON for prompt context")?;
Ok(format!(
r#"# CURRENT TASK (AUTHORITATIVE)
You MUST work on this exact task and no other task.
- Do NOT switch tasks based on queue order, "first todo", or "lowest ID".
- Ignore `.ralph/done.jsonc` except as historical reference if explicitly needed.
- Do NOT change task status manually.
Task ID: {id}
Title: {title}
Raw task JSON (source of truth):
```json
{rendered}
```
"#,
))
}
pub(crate) fn mark_task_doing(resolved: &config::Resolved, task_id: &str) -> Result<()> {
let mut queue_file = queue::load_queue(&resolved.queue_path)?;
let task_title = queue_file
.tasks
.iter()
.find(|t| t.id == task_id)
.map(|t| t.title.clone())
.unwrap_or_default();
let now = timeutil::now_utc_rfc3339()?;
queue::set_status(&mut queue_file, task_id, TaskStatus::Doing, &now, None)?;
queue::save_queue(&resolved.queue_path, &queue_file)?;
webhook::notify_task_started(task_id, &task_title, &resolved.config.agent.webhook, &now);
Ok(())
}