@model IllustrationLibraryAdminViewModel @{ ViewData["Title"] = "Illustration Library"; }

Admin / Story Intelligence

Illustration Library

Representative visual identifiers for the Story Intelligence experience. These are reusable library illustrations, not canonical manuscript artwork.

@if (TempData["AdminMessage"] is string message) {
@message
} @if (TempData["AdminError"] is string error) {
@error
}

Generation workflow

Planned → queued → generating → generated

@Model.ProviderStatus

Storage: @Model.StoragePathHint

@Html.AntiForgeryToken()
@Html.AntiForgeryToken()

Total

@Model.Summary.TotalCount.ToString("N0")

Planned

@Model.Summary.PlannedCount.ToString("N0")

Queued

@Model.Summary.QueuedCount.ToString("N0")

Generated

@Model.Summary.GeneratedCount.ToString("N0")

Approved

@Model.Summary.ApprovedCount.ToString("N0")

Failed

@Model.Summary.FailedCount.ToString("N0")

Superseded

@Model.Summary.SupersededCount.ToString("N0")

Completed

@Model.CompletedTotal.ToString("N0")

Starter library: @Model.StarterCharacterCount characters, @Model.StarterLocationCount locations, @Model.StarterAssetCount assets. Next generation click will queue @Model.StarterGenerationPlan.TotalToGenerate total.

@foreach (var item in Model.Items) { var preview = !string.IsNullOrWhiteSpace(item.ThumbnailPath) ? item.ThumbnailPath : item.FilePath; var generationSource = item.StableCode.StartsWith("char-demand-", StringComparison.OrdinalIgnoreCase) ? "Demand generation" : item.ParentItemID.HasValue ? "Manual regeneration" : IllustrationStarterBatchDefinition.StarterCodes.Contains(item.StableCode) ? "Starter batch" : "Manual library item";

@item.Category / @item.Status

@item.DisplayTitle

@item.AttemptCount.ToString("N0") tries
@if (!string.IsNullOrWhiteSpace(preview)) { @item.DisplayTitle }

@item.ShortDescription

Code
@item.StableCode
Provider
@(item.Provider ?? "Not generated") @(item.Model is null ? string.Empty : $" / {item.Model}")
Template
@(item.PromptTemplateVersion ?? "Not generated")
Source
@generationSource
Updated
@item.UpdatedUtc.ToString("yyyy-MM-dd HH:mm") UTC
@if (item.ApprovedUtc.HasValue) {
Approved
@item.ApprovedUtc.Value.ToString("yyyy-MM-dd HH:mm") UTC
} @if (item.RejectedUtc.HasValue) {
Rejected
@item.RejectedUtc.Value.ToString("yyyy-MM-dd HH:mm") UTC
} @if (!string.IsNullOrWhiteSpace(item.LastError)) {
Failure
@(item.ErrorMessage ?? item.LastError)
}
Prompt and metadata
@Html.AntiForgeryToken()
@if (item.Status is IllustrationLibraryStatuses.Planned or IllustrationLibraryStatuses.Failed or IllustrationLibraryStatuses.Rejected) {
@Html.AntiForgeryToken()
} @if (item.Status == IllustrationLibraryStatuses.Generated) {
@Html.AntiForgeryToken()
@Html.AntiForgeryToken()
} @if (item.Status is IllustrationLibraryStatuses.Generated or IllustrationLibraryStatuses.Approved or IllustrationLibraryStatuses.Rejected or IllustrationLibraryStatuses.Failed or IllustrationLibraryStatuses.Superseded) {
@Html.AntiForgeryToken()
} @if (item.Status != IllustrationLibraryStatuses.Disabled) {
@Html.AntiForgeryToken()
}
}
@if (Model.Items.Count == 0) {

No library items match this filter.

}