use std::path::Path;
use argonauts_core::TaskId;
use argonauts_core::settings::delivery::Unclaimed;
use crate::engine::host::Host;
use crate::git::Claims;
use crate::task::session::report_of;
pub(crate) fn of_task(host: &Host, task: &TaskId, worktree: &Path) -> Option<Claims> {
if host.settings().commit.unclaimed == Unclaimed::Keep {
return None;
}
let (written, reported, ran_a_workflow) = host.read(|state| {
let mut written = Vec::new();
let mut reported = Vec::new();
let mut ran_a_workflow = false;
for session in state.sessions.by_key.values() {
if session.task.as_ref() != Some(task) {
continue;
}
written.extend(session.written.iter().cloned());
if let Some(report) = session.end.as_ref().and_then(report_of) {
reported.extend(report.files_changed);
}
ran_a_workflow |= session.workflow.is_some();
}
(written, reported, ran_a_workflow)
});
let mut claims = Claims::default().always_keeping(&host.settings().commit.always_keep);
if ran_a_workflow || host.shared().claude_codes_own(task).is_some() {
claims = claims.every_new_file();
}
for path in written.iter().chain(&reported) {
claims.add(worktree, path);
}
Some(claims)
}
pub(crate) fn of_a_merge(host: &Host) -> Option<Claims> {
(host.settings().commit.unclaimed != Unclaimed::Keep).then(Claims::default)
}