use anyhow::Result;
use aptu_core::ai::AiResponse;
use aptu_core::{IssueDetails, TriageResponse};
use tracing::{debug, info, instrument};
use crate::provider::CliTokenProvider;
pub struct AnalyzeResult {
pub issue_details: IssueDetails,
pub triage: TriageResponse,
}
#[instrument(skip_all, fields(reference = %reference))]
pub async fn fetch(reference: &str, repo_context: Option<&str>) -> Result<IssueDetails> {
let provider = CliTokenProvider;
let issue_details =
aptu_core::fetch_issue_for_triage(&provider, reference, repo_context).await?;
debug!(
issue_number = issue_details.number,
"Issue fetched successfully"
);
Ok(issue_details)
}
#[instrument(skip_all, fields(issue_number = issue_details.number))]
pub async fn analyze(
issue_details: &IssueDetails,
ai_config: &aptu_core::AiConfig,
) -> Result<AiResponse> {
let provider = CliTokenProvider;
let ai_response = aptu_core::analyze_issue(&provider, issue_details, ai_config).await?;
debug!("Issue analyzed successfully");
Ok(ai_response)
}
#[instrument(skip_all, fields(issue_number = analyze_result.issue_details.number))]
pub async fn post(analyze_result: &AnalyzeResult) -> Result<String> {
let provider = CliTokenProvider;
let comment_url = aptu_core::post_triage_comment(
&provider,
&analyze_result.issue_details,
&analyze_result.triage,
)
.await?;
info!(comment_url = %comment_url, "Triage comment posted");
debug!(
"Triage complete for issue #{}",
analyze_result.issue_details.number
);
Ok(comment_url)
}
#[instrument(skip_all, fields(owner = %issue_details.owner, repo = %issue_details.repo, number = issue_details.number))]
pub async fn apply(
issue_details: &IssueDetails,
triage: &TriageResponse,
) -> Result<aptu_core::github::issues::ApplyResult> {
let provider = CliTokenProvider;
debug!("Applying labels and milestone to issue");
let result = aptu_core::apply_triage_labels(&provider, issue_details, triage).await?;
info!(
labels = ?result.applied_labels,
milestone = ?result.applied_milestone,
warnings = ?result.warnings,
"Labels and milestone applied"
);
Ok(result)
}