namespace PlotLine.Models; public static class StoryIntelligenceRunStatuses { public const string Pending = "Pending"; public const string Running = "Running"; public const string Completed = "Completed"; public const string CompletedWithWarnings = "CompletedWithWarnings"; public const string Failed = "Failed"; public const string Cancelled = "Cancelled"; } public static class StoryIntelligenceFailureStages { public const string DocumentRead = "DocumentRead"; public const string ChapterStructure = "ChapterStructure"; public const string SceneSplit = "SceneSplit"; public const string SceneIntelligence = "SceneIntelligence"; public const string Validation = "Validation"; public const string Persistence = "Persistence"; public const string DomainImport = "DomainImport"; } public static class StoryIntelligencePipelineStages { public const string Chapters = "Chapters"; public const string SceneReview = "SceneReview"; public const string SceneImport = "SceneImport"; public const string CharacterReview = "CharacterReview"; public const string CharacterImport = "CharacterImport"; public const string LocationReview = "LocationReview"; public const string LocationImport = "LocationImport"; public const string AssetReview = "AssetReview"; public const string AssetImport = "AssetImport"; public const string RelationshipReview = "RelationshipReview"; public const string RelationshipImport = "RelationshipImport"; public const string KnowledgeReview = "KnowledgeReview"; public const string KnowledgeImport = "KnowledgeImport"; public const string NarrativeReview = "NarrativeReview"; public const string NarrativeImport = "NarrativeImport"; public const string Complete = "Complete"; } public static class StoryIntelligencePipelineStatuses { public const string InProgress = "InProgress"; public const string NeedsReview = "NeedsReview"; public const string Complete = "Complete"; } public sealed class StoryIntelligenceBookPipelineState { public int StoryIntelligenceBookPipelineID { get; init; } public int ProjectID { get; init; } public string ProjectName { get; init; } = string.Empty; public int BookID { get; init; } public string BookTitle { get; init; } = string.Empty; public string? BookSubtitle { get; init; } public string BookDisplayTitle => BookTitleFormatter.DisplayTitle(BookTitle, BookSubtitle); public string CurrentStage { get; init; } = StoryIntelligencePipelineStages.SceneReview; public string? LastCompletedStage { get; init; } public string? CurrentReviewStage { get; init; } public string Status { get; init; } = StoryIntelligencePipelineStatuses.NeedsReview; public DateTime? CompletedUtc { get; init; } public DateTime? CharacterReviewCompletedUtc { get; init; } public DateTime? LocationReviewCompletedUtc { get; init; } public DateTime? AssetReviewCompletedUtc { get; init; } public DateTime? RelationshipReviewCompletedUtc { get; init; } public DateTime? KnowledgeReviewCompletedUtc { get; init; } public DateTime? NarrativeReviewCompletedUtc { get; init; } public int? LastRunID { get; init; } public DateTime CreatedUtc { get; init; } public DateTime UpdatedUtc { get; init; } public bool IsComplete => string.Equals(Status, StoryIntelligencePipelineStatuses.Complete, StringComparison.OrdinalIgnoreCase) && string.Equals(LastCompletedStage, StoryIntelligencePipelineStages.NarrativeImport, StringComparison.OrdinalIgnoreCase); } public sealed class StoryIntelligenceImportNotificationTarget { public int ImportSessionID { get; init; } public int UserID { get; init; } public int ProjectID { get; init; } public string ProjectName { get; init; } = string.Empty; public int BookID { get; init; } public string BookTitle { get; init; } = string.Empty; public string? BookSubtitle { get; init; } public string BookDisplayTitle => BookTitleFormatter.DisplayTitle(BookTitle, BookSubtitle); public int ChapterCount { get; init; } public int CompletedChapterCount { get; init; } public int FailedChapterCount { get; init; } public string NotificationKind { get; init; } = "Success"; } public sealed class StoryIntelligenceSceneAnalysisCompletion { public int StoryIntelligenceBookPipelineID { get; init; } public int ProjectID { get; init; } public int BookID { get; init; } public int UserID { get; init; } public int? LastRunID { get; init; } public string Status { get; init; } = StoryIntelligencePipelineStatuses.NeedsReview; public string CurrentStage { get; init; } = StoryIntelligencePipelineStages.CharacterReview; public string? LastCompletedStage { get; init; } public string? CurrentReviewStage { get; init; } public int RunCount { get; init; } public int CompletedRunCount { get; init; } public int FailedRunCount { get; init; } public int TotalExpectedScenes { get; init; } public int CompletedScenes { get; init; } public int FailedScenes { get; init; } public bool CompletedNow { get; init; } } public sealed class StoryIntelligenceSceneAnalysisRecoveryCandidate { public int StoryIntelligenceBookPipelineID { get; init; } public int ProjectID { get; init; } public int BookID { get; init; } public int UserID { get; init; } public int? LastRunID { get; init; } public int RunCount { get; init; } public int TotalExpectedScenes { get; init; } public int CompletedScenes { get; init; } public int FailedScenes { get; init; } } public sealed class StoryIntelligenceBookPipelineSaveRequest { public int ProjectID { get; init; } public int BookID { get; init; } public string CurrentStage { get; init; } = StoryIntelligencePipelineStages.SceneReview; public string? LastCompletedStage { get; init; } public string? CurrentReviewStage { get; init; } public string Status { get; init; } = StoryIntelligencePipelineStatuses.NeedsReview; public DateTime? CompletedUtc { get; init; } public int? LastRunID { get; init; } public bool MarkCharacterReviewComplete { get; init; } public bool MarkLocationReviewComplete { get; init; } public bool MarkAssetReviewComplete { get; init; } public bool MarkRelationshipReviewComplete { get; init; } public bool MarkKnowledgeReviewComplete { get; init; } public bool MarkNarrativeReviewComplete { get; init; } } public sealed class StoryIntelligenceReviewCentreSummary { public int StoryIntelligenceBookPipelineID { get; init; } public int ProjectID { get; init; } public string ProjectName { get; init; } = string.Empty; public int BookID { get; init; } public string BookTitle { get; init; } = string.Empty; public string? BookSubtitle { get; init; } public string BookDisplayTitle => BookTitleFormatter.DisplayTitle(BookTitle, BookSubtitle); public string CurrentStage { get; init; } = StoryIntelligencePipelineStages.SceneReview; public string? LastCompletedStage { get; init; } public string? CurrentReviewStage { get; init; } public string Status { get; init; } = StoryIntelligencePipelineStatuses.NeedsReview; public DateTime? CompletedUtc { get; init; } public DateTime? CharacterReviewCompletedUtc { get; init; } public DateTime? LocationReviewCompletedUtc { get; init; } public DateTime? AssetReviewCompletedUtc { get; init; } public DateTime? RelationshipReviewCompletedUtc { get; init; } public DateTime? KnowledgeReviewCompletedUtc { get; init; } public DateTime? NarrativeReviewCompletedUtc { get; init; } public string? CharacterCandidateGenerationStatus { get; init; } public int? CharacterCandidateCount { get; init; } public int? CharacterPendingCount { get; init; } public string? LocationCandidateGenerationStatus { get; init; } public int? LocationCandidateCount { get; init; } public int? LocationPendingCount { get; init; } public string? AssetCandidateGenerationStatus { get; init; } public int? AssetCandidateCount { get; init; } public int? AssetPendingCount { get; init; } public string? RelationshipCandidateGenerationStatus { get; init; } public int? RelationshipCandidateCount { get; init; } public int? RelationshipPendingCount { get; init; } public string? KnowledgeCandidateGenerationStatus { get; init; } public int? KnowledgeCandidateCount { get; init; } public int? KnowledgePendingCount { get; init; } public int? LastRunID { get; init; } public int RunCount { get; init; } public int CompletedRunCount { get; init; } public int ActiveRunCount { get; init; } public int FailedRunCount { get; init; } public int TotalDetectedScenes { get; init; } public int CompletedScenes { get; init; } public int FailedScenes { get; init; } public int WholeBookPlotSynthesisRunID { get; init; } public string? WholeBookPlotSynthesisStatus { get; init; } public string? WholeBookPlotSynthesisErrorMessage { get; init; } public int NarrativeCandidateCount { get; init; } public int NarrativePendingCount { get; init; } public int NarrativeThreadCount { get; init; } public int NarrativeEventCount { get; init; } public int MetricValueCount { get; init; } } public sealed class StoryIntelligenceCommittedRunSummary { public int StoryIntelligenceRunID { get; init; } public int UserID { get; init; } public int ProjectID { get; init; } public string ProjectName { get; init; } = string.Empty; public int BookID { get; init; } public string BookTitle { get; init; } = string.Empty; public string? BookSubtitle { get; init; } public int ChapterID { get; init; } public decimal ChapterNumber { get; init; } public string ChapterTitle { get; init; } = string.Empty; public string? SourceLabel { get; init; } } public sealed class StoryIntelligenceRunSaveRequest { public int UserID { get; init; } public int? ProjectID { get; init; } public int? BookID { get; init; } public string Status { get; init; } = StoryIntelligenceRunStatuses.Completed; public string SourceType { get; init; } = "AdminDryRun"; public string? SourceFileName { get; init; } public long? SourceFileSizeBytes { get; init; } public int? SourceWordCount { get; init; } public int? SourceCharacterCount { get; init; } public int? SourceParagraphCount { get; init; } public int? SourceChapterCount { get; init; } public int? SourceDetectedImagesCount { get; init; } public int? SourceDetectedTablesCount { get; init; } public int? SourceDetectedFootnotesCount { get; init; } public int? SourceDetectedCommentsCount { get; init; } public string PromptVersion { get; init; } = string.Empty; public string Model { get; init; } = string.Empty; public DateTime StartedUtc { get; init; } public DateTime? CompletedUtc { get; init; } public string? FailureStage { get; init; } public int? TotalInputTokens { get; init; } public int? TotalOutputTokens { get; init; } public int? TotalTokens { get; init; } public long? TotalDurationMs { get; init; } public decimal? EstimatedCostGBP { get; init; } public decimal? EstimatedCostUSD { get; init; } public string? PromptVersionsSummary { get; init; } public string? ErrorMessage { get; init; } public string? ErrorDetail { get; init; } public StoryIntelligenceChapterResultSaveRequest? ChapterResult { get; init; } public IReadOnlyList SceneResults { get; init; } = []; } public sealed class StoryIntelligenceRunQueueRequest { public int UserID { get; init; } public int? ProjectID { get; init; } public int? BookID { get; init; } public int? ChapterID { get; init; } public decimal? ChapterNumber { get; init; } public string SourceType { get; init; } = "AdminText"; public string SourceLabel { get; init; } = string.Empty; public string ChapterText { get; init; } = string.Empty; public string? SourceFileName { get; init; } public long? SourceFileSizeBytes { get; init; } public int? SourceWordCount { get; init; } public int? SourceCharacterCount { get; init; } public int? SourceParagraphCount { get; init; } public int? SourceChapterCount { get; init; } public string Model { get; init; } = string.Empty; public string PromptVersionsSummary { get; init; } = string.Empty; public string? KnownCharactersJson { get; init; } } public sealed class StoryIntelligenceKnownCharacterContext { public string CanonicalName { get; init; } = string.Empty; public IReadOnlyList Aliases { get; init; } = []; public string SexHint { get; init; } = "Unknown"; public int? ExistingCharacterID { get; init; } public IReadOnlyList CandidateKeys { get; init; } = []; public IReadOnlyList SceneIDs { get; init; } = []; public int MentionCount { get; init; } public decimal Confidence { get; init; } public string Source { get; init; } = "InitialManuscriptScan"; } public sealed class StoryIntelligenceChapterResultSaveRequest { public int? ProjectID { get; init; } public int? BookID { get; init; } public int? ChapterID { get; init; } public decimal? ChapterNumber { get; init; } public string SourceLabel { get; init; } = string.Empty; public string PromptVersion { get; init; } = string.Empty; public string Model { get; init; } = string.Empty; public string RawResponseJson { get; init; } = string.Empty; public string OutputTextJson { get; init; } = string.Empty; public string ParsedJson { get; init; } = string.Empty; public int ValidationErrorsCount { get; init; } public int ValidationWarningsCount { get; init; } public int? InputTokens { get; init; } public int? OutputTokens { get; init; } public int? TotalTokens { get; init; } public long? DurationMs { get; init; } } public sealed class StoryIntelligenceSceneResultSaveRequest { public int? ProjectID { get; init; } public int? BookID { get; init; } public int? ChapterID { get; init; } public int? SceneID { get; init; } public int TemporarySceneNumber { get; init; } public int? StartParagraph { get; init; } public int? EndParagraph { get; init; } public string SourceLabel { get; init; } = string.Empty; public string PromptVersion { get; init; } = string.Empty; public string Model { get; init; } = string.Empty; public string RawResponseJson { get; init; } = string.Empty; public string OutputTextJson { get; init; } = string.Empty; public string ParsedJson { get; init; } = string.Empty; public int ValidationErrorsCount { get; init; } public int ValidationWarningsCount { get; init; } public int? InputTokens { get; init; } public int? OutputTokens { get; init; } public int? TotalTokens { get; init; } public long? DurationMs { get; init; } } public sealed class StoryIntelligenceSavedRunListItem { public int StoryIntelligenceRunID { get; init; } public DateTime CreatedUtc { get; init; } public int UserID { get; init; } public int? ProjectID { get; init; } public string? ProjectTitle { get; init; } public int? BookID { get; init; } public string? BookTitle { get; init; } public int? ChapterID { get; init; } public decimal? ChapterNumber { get; init; } public string Status { get; init; } = string.Empty; public string SourceType { get; init; } = string.Empty; public string? FailureStage { get; init; } public int SceneCount { get; init; } public int? TotalTokens { get; init; } public long? TotalDurationMs { get; init; } public decimal? EstimatedCostGBP { get; init; } public decimal? EstimatedCostUSD { get; init; } public int ValidationErrorsCount { get; init; } public int ValidationWarningsCount { get; init; } } public sealed class StoryIntelligenceSavedRun { public int StoryIntelligenceRunID { get; init; } public int UserID { get; init; } public int? ProjectID { get; init; } public string? ProjectTitle { get; init; } public int? BookID { get; init; } public string? BookTitle { get; init; } public int? ChapterID { get; init; } public decimal? ChapterNumber { get; init; } public string Status { get; init; } = string.Empty; public string SourceType { get; init; } = string.Empty; public string? SourceText { get; init; } public string? SourceFileName { get; init; } public long? SourceFileSizeBytes { get; init; } public int? SourceWordCount { get; init; } public int? SourceCharacterCount { get; init; } public int? SourceParagraphCount { get; init; } public int? SourceChapterCount { get; init; } public int? SourceDetectedImagesCount { get; init; } public int? SourceDetectedTablesCount { get; init; } public int? SourceDetectedFootnotesCount { get; init; } public int? SourceDetectedCommentsCount { get; init; } public string? CurrentStage { get; init; } public string? CurrentMessage { get; init; } public int? TotalDetectedScenes { get; init; } public int? CompletedScenes { get; init; } public int? FailedScenes { get; init; } public DateTime? CancellationRequestedUtc { get; init; } public DateTime? CancelledUtc { get; init; } public string PromptVersion { get; init; } = string.Empty; public string? PromptVersionsSummary { get; init; } public string Model { get; init; } = string.Empty; public DateTime StartedUtc { get; init; } public DateTime? CompletedUtc { get; init; } public string? FailureStage { get; init; } public int? TotalInputTokens { get; init; } public int? TotalOutputTokens { get; init; } public int? TotalTokens { get; init; } public long? TotalDurationMs { get; init; } public decimal? EstimatedCostGBP { get; init; } public decimal? EstimatedCostUSD { get; init; } public string? ErrorMessage { get; init; } public string? ErrorDetail { get; init; } public DateTime CreatedUtc { get; init; } public DateTime UpdatedUtc { get; init; } } public sealed class StoryIntelligenceQueuedRun { public int StoryIntelligenceRunID { get; init; } public int UserID { get; init; } public int? ProjectID { get; init; } public int? BookID { get; init; } public int? ChapterID { get; init; } public decimal? ChapterNumber { get; init; } public string Status { get; init; } = string.Empty; public string SourceType { get; init; } = string.Empty; public string? SourceLabel { get; init; } public string? SourceText { get; init; } public int? SourceWordCount { get; init; } public int? SourceCharacterCount { get; init; } public int? SourceParagraphCount { get; init; } public int? SourceChapterCount { get; init; } public string PromptVersion { get; init; } = string.Empty; public string? PromptVersionsSummary { get; init; } public string? KnownCharactersJson { get; init; } public string Model { get; init; } = string.Empty; public DateTime StartedUtc { get; init; } public DateTime? CompletedUtc { get; init; } public string? FailureStage { get; init; } public int? TotalInputTokens { get; init; } public int? TotalOutputTokens { get; init; } public int? TotalTokens { get; init; } public long? TotalDurationMs { get; init; } public decimal? EstimatedCostGBP { get; init; } public decimal? EstimatedCostUSD { get; init; } public string? ErrorMessage { get; init; } public string? ErrorDetail { get; init; } public string? CurrentStage { get; init; } public string? CurrentMessage { get; init; } public int? TotalDetectedScenes { get; init; } public int? CompletedScenes { get; init; } public int? FailedScenes { get; init; } public DateTime? CancellationRequestedUtc { get; init; } public DateTime? CancelledUtc { get; init; } public DateTime CreatedUtc { get; init; } public DateTime UpdatedUtc { get; init; } public bool CancellationRequested => CancellationRequestedUtc.HasValue; } public sealed class StoryIntelligenceActiveBookRunSummary { public int UserID { get; init; } public int? ProjectID { get; init; } public string? ProjectTitle { get; init; } public int? BookID { get; init; } public string? BookTitle { get; init; } public string? BookSubtitle { get; init; } public string BookDisplayTitle => BookTitleFormatter.DisplayTitle(BookTitle, BookSubtitle); public int RunCount { get; init; } public int PendingRunCount { get; init; } public int RunningRunCount { get; init; } public int CompletedRunCount { get; init; } public int FailedRunCount { get; init; } public int TotalExpectedScenes { get; init; } public int TotalDetectedScenes { get; init; } public int CompletedScenes { get; init; } public int FailedScenes { get; init; } public int ActiveScenes { get; init; } public int ProgressPercent { get; init; } public string Status { get; init; } = StoryIntelligenceRunStatuses.Pending; public long TotalDurationMs { get; init; } public DateTime FirstCreatedUtc { get; init; } public DateTime UpdatedUtc { get; init; } public bool HasActiveRuns => PendingRunCount > 0 || RunningRunCount > 0; public bool HasFailures => FailedRunCount > 0 || FailedScenes > 0; } public sealed class StoryIntelligenceSourceOption { public int Value { get; init; } public string Text { get; init; } = string.Empty; } public sealed class StoryIntelligenceExistingChapterSource { public int ProjectID { get; init; } public string ProjectName { get; init; } = string.Empty; public int BookID { get; init; } public string BookTitle { get; init; } = string.Empty; public string? BookSubtitle { get; init; } public int ChapterID { get; init; } public decimal ChapterNumber { get; init; } public string ChapterTitle { get; init; } = string.Empty; public string? SourceText { get; init; } public int? SourceWordCount { get; init; } public int? SourceCharacterCount { get; init; } public bool HasSourceText => !string.IsNullOrWhiteSpace(SourceText); } public sealed class StoryIntelligenceExistingChapterQueueForm { public int? ProjectID { get; init; } public int? BookID { get; init; } public int? ChapterID { get; init; } } public sealed class StoryIntelligenceExistingChapterQueueViewModel { public StoryIntelligenceExistingChapterQueueForm Form { get; init; } = new(); public IReadOnlyList Projects { get; init; } = []; public IReadOnlyList Books { get; init; } = []; public IReadOnlyList Chapters { get; init; } = []; public StoryIntelligenceExistingChapterSource? SelectedChapter { get; init; } public string? WarningMessage { get; init; } public string? ErrorMessage { get; init; } public int? QueuedRunID { get; init; } } public sealed class StoryIntelligenceFullChapterTestForm { public string? SourceLabel { get; init; } public int? ProjectID { get; init; } public int? BookID { get; init; } public int? ChapterID { get; init; } public string? ChapterStructureModel { get; init; } public string? SceneIntelligenceModel { get; init; } public string? ChapterText { get; init; } } public sealed class StoryIntelligenceFullChapterPreflight { public int CharacterCount { get; init; } public int WordCount { get; init; } public int ParagraphCount { get; init; } public int EstimatedInputTokens { get; init; } public int EstimatedPipelineInputTokens { get; init; } public decimal? EstimatedInputCostUSD { get; init; } public decimal? EstimatedInputCostGBP { get; init; } public IReadOnlyList Warnings { get; init; } = []; } public sealed class StoryIntelligenceFullChapterTestViewModel { public StoryIntelligenceFullChapterTestForm Form { get; init; } = new(); public IReadOnlyList ModelOptions { get; init; } = []; public StoryIntelligenceFullChapterPreflight? Preflight { get; init; } public string? SourceFileName { get; init; } public long? SourceFileSizeBytes { get; init; } public string? ErrorMessage { get; init; } } public sealed class StoryIntelligenceSavedChapterResult { public int ChapterResultID { get; init; } public int StoryIntelligenceRunID { get; init; } public int? ProjectID { get; init; } public int? BookID { get; init; } public int? ChapterID { get; init; } public decimal? ChapterNumber { get; init; } public string SourceLabel { get; init; } = string.Empty; public string PromptVersion { get; init; } = string.Empty; public string Model { get; init; } = string.Empty; public string RawResponseJson { get; init; } = string.Empty; public string OutputTextJson { get; init; } = string.Empty; public string ParsedJson { get; init; } = string.Empty; public int ValidationErrorsCount { get; init; } public int ValidationWarningsCount { get; init; } public int? InputTokens { get; init; } public int? OutputTokens { get; init; } public int? TotalTokens { get; init; } public long? DurationMs { get; init; } public DateTime CreatedUtc { get; init; } } public sealed class StoryIntelligenceSavedSceneResult { public int SceneResultID { get; init; } public int StoryIntelligenceRunID { get; init; } public int? ChapterResultID { get; init; } public int? ProjectID { get; init; } public int? BookID { get; init; } public int? ChapterID { get; init; } public int? SceneID { get; init; } public int TemporarySceneNumber { get; init; } public int? StartParagraph { get; init; } public int? EndParagraph { get; init; } public string SourceLabel { get; init; } = string.Empty; public string PromptVersion { get; init; } = string.Empty; public string Model { get; init; } = string.Empty; public string RawResponseJson { get; init; } = string.Empty; public string OutputTextJson { get; init; } = string.Empty; public string ParsedJson { get; init; } = string.Empty; public int ValidationErrorsCount { get; init; } public int ValidationWarningsCount { get; init; } public int? InputTokens { get; init; } public int? OutputTokens { get; init; } public int? TotalTokens { get; init; } public long? DurationMs { get; init; } public DateTime CreatedUtc { get; init; } } public static class StoryIntelligenceImportCommitStatuses { public const string Pending = "Pending"; public const string Completed = "Completed"; public const string Failed = "Failed"; } public sealed class StoryIntelligenceImportCommit { public int StoryIntelligenceImportCommitID { get; init; } public int StoryIntelligenceRunID { get; init; } public int? ProjectID { get; init; } public int? BookID { get; init; } public int? ChapterID { get; init; } public DateTime CommittedAt { get; init; } public int CommittedByUserID { get; init; } public int ScenesCreated { get; init; } public int MetricsCreated { get; init; } public string Status { get; init; } = string.Empty; public string? Notes { get; init; } public DateTime CreatedUtc { get; init; } } public sealed class StoryIntelligenceSceneImportItem { public int SceneResultID { get; init; } public int? SceneID { get; init; } public int TemporarySceneNumber { get; init; } public int? StartParagraph { get; init; } public int? EndParagraph { get; init; } public string SourceLabel { get; init; } = string.Empty; public SceneIntelligenceScene ParsedScene { get; init; } = new(); public int? PovCharacterID { get; init; } public IReadOnlyList PurposeTypeIDs { get; init; } = []; public IReadOnlyList Metrics { get; init; } = []; public string SceneTitle { get; init; } = string.Empty; public string? Summary { get; init; } public string? PurposeNotes { get; init; } public string? OutcomeNotes { get; init; } public string? ImportNoteText { get; init; } public string AnalysisStatus { get; init; } = "Ready"; public bool HasWarnings { get; init; } } public sealed class StoryIntelligenceImportCommitRequest { public int StoryIntelligenceRunID { get; init; } public int UserID { get; init; } public int ProjectID { get; init; } public int BookID { get; init; } public int ChapterID { get; init; } public int TimeModeID { get; init; } public int TimeConfidenceID { get; init; } public int RevisionStatusID { get; init; } public int? TimelineNoteTypeID { get; init; } public string? ChapterSummary { get; init; } public int? ChapterPurposeID { get; init; } public IReadOnlyList Scenes { get; init; } = []; public IReadOnlyList Warnings { get; init; } = []; } public sealed class StoryIntelligenceChapterImportReadiness { public int ActiveSceneCount { get; init; } public bool CanCommit { get; init; } public string CommitMode { get; init; } = string.Empty; public string? BlockReason { get; init; } } public sealed class StoryIntelligenceImportCommitResult { public bool Success { get; init; } public int? CommitID { get; init; } public int ScenesCreated { get; init; } public int MetricsCreated { get; init; } public string Message { get; init; } = string.Empty; }