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)
Work only on this task. This is a workflow invariant, not a suggestion.
- Do not switch tasks based on queue order, "first todo", or "lowest ID".
- Treat `.cueloop/done.jsonc` only as historical reference when explicitly needed.
- Do not change task status manually; use phase/checklist instructions.
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_with_context(
task_id,
&task_title,
&resolved.config.agent.webhook,
&now,
webhook::context_for_resolved_repo(resolved),
);
Ok(())
}