// ----------------------------------------------------------------------------- // IAiCodeGuardService.cs // Sprint: SPRINT_20260112_010_SCANNER_ai_code_guard_core // Task: SCANNER-AIGUARD-002/006 // Description: AI Code Guard service interface for Scanner. // ----------------------------------------------------------------------------- using System.Collections.Immutable; namespace StellaOps.Scanner.AiCodeGuard; /// /// Service for AI Code Guard analysis. /// public interface IAiCodeGuardService { /// /// Analyzes changed hunks for AI-generated code issues. /// /// Analysis request with hunks and options. /// Cancellation token. /// Analysis result with findings and verdict. Task AnalyzeAsync( AiCodeGuardAnalysisRequest request, CancellationToken cancellationToken = default); } /// /// Analysis request for AI Code Guard. /// public sealed record AiCodeGuardAnalysisRequest { /// /// Repository URI. /// public required string RepositoryUri { get; init; } /// /// Commit SHA being analyzed. /// public required string CommitSha { get; init; } /// /// Branch name (optional). /// public string? Branch { get; init; } /// /// Base commit for diff comparison (optional, for PR analysis). /// public string? BaseCommitSha { get; init; } /// /// Changed hunks to analyze. /// public required IReadOnlyList Hunks { get; init; } /// /// Analysis timestamp (input, not wall-clock for determinism). /// public required DateTimeOffset AnalysisTimestamp { get; init; } /// /// Optional options override (uses defaults if null). /// public AiCodeGuardOptions? Options { get; init; } } /// /// A code hunk to analyze. /// public sealed record CodeHunk { /// /// File path relative to repository root. /// public required string FilePath { get; init; } /// /// Programming language (detected or specified). /// public required string Language { get; init; } /// /// Start line in the file (1-based). /// public required int StartLine { get; init; } /// /// End line in the file (1-based). /// public required int EndLine { get; init; } /// /// Hunk content (source code). /// public required string Content { get; init; } /// /// Whether this is new code (added) vs existing. /// public required bool IsNew { get; init; } /// /// SHA-256 hash of normalized content for deterministic hunk ID. /// public string? ContentHash { get; init; } } /// /// AI Code Guard analysis result. /// public sealed record AiCodeGuardAnalysisResult { /// /// Whether analysis completed successfully. /// public required bool Success { get; init; } /// /// Scanner configuration used. /// public required AiCodeGuardScannerConfigResult ScannerConfig { get; init; } /// /// Files analyzed. /// public required ImmutableList Files { get; init; } /// /// Detected findings. /// public required ImmutableList Findings { get; init; } /// /// Overall verdict. /// public required AiCodeGuardVerdictResult Verdict { get; init; } /// /// Total lines analyzed. /// public required long TotalLinesAnalyzed { get; init; } /// /// Error message if Success is false. /// public string? Error { get; init; } /// /// Content digest for the analysis result (SHA-256). /// public string? ContentDigest { get; init; } } /// /// Scanner configuration in result. /// public sealed record AiCodeGuardScannerConfigResult { public required string ScannerVersion { get; init; } public required string ModelVersion { get; init; } public required double ConfidenceThreshold { get; init; } public required ImmutableList EnabledCategories { get; init; } public ImmutableList? RuleSets { get; init; } } /// /// File analyzed in result. /// public sealed record AiCodeGuardFileResult { public required string Path { get; init; } public required string Digest { get; init; } public required int LineCount { get; init; } public string? Language { get; init; } } /// /// Finding in result. /// public sealed record AiCodeGuardFindingResult { public required string Id { get; init; } public required string Category { get; init; } public required string Severity { get; init; } public required double Confidence { get; init; } public required string FilePath { get; init; } public required int StartLine { get; init; } public required int EndLine { get; init; } public int? StartColumn { get; init; } public int? EndColumn { get; init; } public string? Snippet { get; init; } public required string Description { get; init; } public required string RuleId { get; init; } public string? DetectionMethod { get; init; } public ImmutableList? Indicators { get; init; } public double? PerplexityScore { get; init; } public ImmutableList? PatternMatches { get; init; } public string? Remediation { get; init; } } /// /// Verdict in result. /// public sealed record AiCodeGuardVerdictResult { public required string Status { get; init; } public required int TotalFindings { get; init; } public required ImmutableDictionary FindingsBySeverity { get; init; } public double? AiGeneratedPercentage { get; init; } public required string Message { get; init; } public string? Recommendation { get; init; } }