namespace GB5Shared.RecordingIntelligence; /// /// Default DI-registered implementation. Per the plan's /// explicit scope decision, no real LLM/STT provider is wired in this phase — every method here /// throws a clear, specific exception instead of silently returning empty/fake data, so the /// abstraction is real and ready but nothing pretends to work that doesn't. Callers (e.g. /// Meeting's RecordingTranscriptBLL) must catch this exception and mark the operation as failed /// (PROCESSINGSTATUS=4) rather than let it bubble as an unhandled 500 — see the plan's /// "Recording capture itself is out of scope for v1" / "AI capability... explicitly deferred" /// notes and CLAUDE.md's "never swallow exceptions" rule (this rethrows, it does not swallow). /// /// Replace this registration with a real provider-backed implementation via DI (per-tenant if /// needed) once a concrete AI backing is chosen — no consumer code changes required. /// public sealed class NotConfiguredAICapabilityService : IAICapabilityService { private const string NotConfiguredMessage = "AI capability not configured for this tenant/environment. Register a real " + "IAICapabilityService implementation to enable transcription/summarization."; public Task TranscribeAsync(byte[] audioBytes, string mimeType, CancellationToken ct) => throw new InvalidOperationException(NotConfiguredMessage); public Task SummarizeAsync(string transcriptText, CancellationToken ct) => throw new InvalidOperationException(NotConfiguredMessage); public Task> ExtractActionItemsAsync(string transcriptText, CancellationToken ct) => throw new InvalidOperationException(NotConfiguredMessage); }