use super::step_commit::{write_meta, write_request};
use super::{Resolved, model_call, stop_signal};
use crate::prompt::step::{RESPONSE_FILE, StepMeta, step_dir_rel};
use crate::prompt::{Deps, Error};
use brazen::CanonicalRequest;
use std::path::Path;
pub(super) struct Step<'a> {
pub(super) conv_repo: &'a Path,
pub(super) conv_id: &'a str,
pub(super) seq: u32,
pub(super) tip: String,
}
pub(super) fn issue(
step: Step<'_>,
request: &CanonicalRequest,
call: &model_call::ModelCall<'_>,
resolved: &Resolved<'_>,
deps: &Deps<'_>,
) -> Result<Option<String>, Error> {
let request_value =
serde_json::to_value(request).expect("CanonicalRequest is always serializable");
let step_dir_rel_str = step_dir_rel(step.conv_id, step.seq);
write_request(step.conv_repo, &step_dir_rel_str, &request_value)?;
let request_bytes =
serde_json::to_vec(request).expect("CanonicalRequest is always serializable");
let started_at = deps.clock.now_iso8601();
let response_path = step.conv_repo.join(&step_dir_rel_str).join(RESPONSE_FILE);
let call_outcome = model_call::run(call, &request_bytes, &response_path);
if stop_signal::stopped(deps.stop) {
return Ok(None);
}
call_outcome?;
let ended_at = deps.clock.now_iso8601();
write_meta(
step.conv_repo,
&step_dir_rel_str,
&StepMeta {
commit: step.tip,
config_commit: Some(resolved.grant.config_commit.to_string()),
workflow_commit: Some(resolved.workflow_commit.to_string()),
provider: Some(call.provider_row.to_string()),
started_at,
ended_at,
},
)?;
Ok(Some(step_dir_rel_str))
}