malvin 0.1.6

Non-interactive CLI agent, via Cursor ACP
Documentation
use std::collections::HashMap;

use crate::run_timing::TimingPhase;

use super::{Orchestrator, WorkflowError};

pub(super) async fn run_coder_session_summary_only(
    orchestrator: &mut Orchestrator<'_>,
    context: &HashMap<String, String>,
) -> Result<(), WorkflowError> {
    (orchestrator.progress_callback)("Summary");
    let summary_body = orchestrator
        .prompts
        .render("summary.md", context)
        .map_err(|e| WorkflowError(e.0))?;
    orchestrator
        .run_coder_prompt_body(summary_body, "summary.md", "summary", TimingPhase::Summary)
        .await?;
    orchestrator.fail_on_abort_result()?;
    Ok(())
}

#[cfg(test)]
mod session_flow_smoke_tests {
    use super::run_coder_session_summary_only;
    use crate::acp::AgentClient;
    use crate::artifacts::RunArtifacts;
    use crate::orchestrator::orchestrator_test_support::{
        empty_dotfile_backups, no_session_client, workflow_ctx_for_smoke,
    };
    use crate::orchestrator::{Orchestrator, WorkflowConfig};
    use crate::prompts::PromptStore;

    fn mk_orchestrator<'a>(
        client: &'a mut AgentClient,
        store: &'a PromptStore,
        artifacts: &'a RunArtifacts,
    ) -> Orchestrator<'a> {
        Orchestrator {
            client,
            prompts: store,
            artifacts,
            config: WorkflowConfig { max_loops: 1 },
            progress_callback: Box::new(|_| {}),
            session_dotfile_backups: empty_dotfile_backups(),
        }
    }

    #[tokio::test]
    async fn summary_only_errors_when_coder_session_not_open() {
        let tmp = tempfile::tempdir().expect("tempdir");
        let (artifacts, store, ctx) = workflow_ctx_for_smoke(&tmp, "sf_smoke");
        let mut client = no_session_client();
        let mut orch = mk_orchestrator(&mut client, &store, &artifacts);
        let err = run_coder_session_summary_only(&mut orch, &ctx)
            .await
            .expect_err("expected prompt without session");
        assert!(
            err.0.contains("begin_coder_session"),
            "unexpected err: {}",
            err.0
        );
    }
}