export type TranscriptionSourceKind = "workflow-file" | "vault-artifact"; export type TranscriptionMediaType = "audio" | "video"; export type TranscriptionExecutionMode = "local" | "external"; export type TranscriptionConsentStatus = "not_required" | "provided" | "missing" | "unknown"; export type TranscriptionTimestampQuality = "none" | "low" | "medium" | "high"; export type TranscriptionRetentionClass = "ephemeral" | "task-evidence" | "regulated" | "do-not-retain"; export interface TranscriptionSource { kind: TranscriptionSourceKind; mediaType: TranscriptionMediaType; path?: string; artifactId?: string; sizeBytes?: number; durationMs?: number; language?: string; checksum?: string; } export interface TranscriptionEngineRequest { executionMode?: TranscriptionExecutionMode; provider?: string; model?: string; } export interface TranscriptionPolicy { policyId: string; executionMode: TranscriptionExecutionMode; externalProviderAllowed: boolean; allowedExternalProviders: string[]; requireConsent: boolean; retentionClass: TranscriptionRetentionClass; redactionPolicyId: string; maxFileBytes?: number; maxDurationMs?: number; } export interface TranscriptionRequest { taskId: string; actor: string; source: TranscriptionSource; engine?: TranscriptionEngineRequest; policy?: Partial; consentStatus?: TranscriptionConsentStatus; retentionNotes?: string; requestedAt?: string; } export interface NormalizedTranscriptionRequest extends Omit { engine: Required; policy: TranscriptionPolicy; requestedAt: string; } export type TranscriptionFailureCode = "missing_task" | "missing_actor" | "missing_source" | "invalid_source_identity" | "invalid_source_path" | "source_file_unreadable" | "unsupported_media_type" | "unsupported_media_extension" | "unsupported_media_codec" | "external_provider_denied" | "external_provider_not_allowed" | "missing_consent" | "duration_limit_exceeded" | "file_size_limit_exceeded" | "missing_local_engine" | "missing_media_probe" | "media_probe_failed"; export interface TranscriptionFailure { code: TranscriptionFailureCode; message: string; field?: string; } export type TranscriptionValidationResult = { ok: true; request: NormalizedTranscriptionRequest; failures: []; } | { ok: false; failures: TranscriptionFailure[]; }; export interface TranscriptionRuntimeEnvironment { localEngineAvailable: boolean; mediaProbeAvailable: boolean; } export type TranscriptionReadinessStatus = "ready" | "degraded" | "blocked"; export interface TranscriptionReadiness { status: TranscriptionReadinessStatus; failures: TranscriptionFailure[]; warnings: string[]; } export interface TranscriptionMediaToolReadiness { ffmpegAvailable: boolean; ffprobeAvailable: boolean; } export type TranscriptionMediaStreamType = "audio" | "video"; export interface TranscriptionMediaStreamProbe { type: TranscriptionMediaStreamType; codecName: string; durationMs?: number; } export interface TranscriptionMediaProbeResult { formatName: string; durationMs?: number; sizeBytes?: number; streams: TranscriptionMediaStreamProbe[]; } export interface TranscriptionMediaPreflight { sourcePath: string; resolvedPath: string; sizeBytes: number; durationMs?: number; formatName?: string; codecs: string[]; } export type TranscriptionMediaPreflightResult = { ok: true; status: "ready"; preflight: TranscriptionMediaPreflight; failures: []; warnings: string[]; } | { ok: false; status: "degraded" | "blocked"; failures: TranscriptionFailure[]; warnings: string[]; }; export interface TranscriptionProvenance { sourceKind: TranscriptionSourceKind; sourcePath?: string; artifactId?: string; checksum?: string; durationMs?: number; language?: string; mediaType: TranscriptionMediaType; engineProvider: string; engineModel: string; executionMode: TranscriptionExecutionMode; actor: string; taskId: string; generatedAt: string; consentStatus: TranscriptionConsentStatus; retentionClass: TranscriptionRetentionClass; retentionNotes?: string; } export interface TranscriptionSegment { id: string; speaker?: string; startMs?: number; endMs?: number; text: string; timestampQuality: TranscriptionTimestampQuality; } export interface TranscriptionFindings { decisions: string[]; risks: string[]; actionItems: string[]; acceptanceCriteriaCandidates: string[]; defects: string[]; lessonLearnedCandidates: string[]; } export interface TranscriptionRedactionSummary { policyId: string; count: number; categories: string[]; } export interface TranscriptionOutput { schemaVersion: 1; status: "completed" | "failed" | "degraded"; provenance: TranscriptionProvenance; segments: TranscriptionSegment[]; findings: TranscriptionFindings; redactions: TranscriptionRedactionSummary; artifacts: { markdown?: string; json?: string; vtt?: string; srt?: string; }; failures: TranscriptionFailure[]; }