mirror of
https://github.com/MindWorkAI/AI-Studio.git
synced 2026-08-11 18:32:12 +00:00
Extracted the visual briefing build progress into its own component
This commit is contained in:
parent
bb418ab5b1
commit
070cbd01cb
@ -2281,9 +2281,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Stop build
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1150899861"] = "Stop build"
|
||||
|
||||
-- Running
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1160324588"] = "Running"
|
||||
|
||||
-- changed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1177151643"] = "changed"
|
||||
|
||||
@ -2314,12 +2311,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Protection level
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1407518380"] = "Protection level"
|
||||
|
||||
-- Failed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1434043348"] = "Failed"
|
||||
|
||||
-- Curate content
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1458812674"] = "Curate content"
|
||||
|
||||
-- Import
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1463683828"] = "Import"
|
||||
|
||||
@ -2356,9 +2347,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Refresh status
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2035829510"] = "Refresh status"
|
||||
|
||||
-- Analyze material
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T204596900"] = "Analyze material"
|
||||
|
||||
-- Unavailable visual briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2068761945"] = "Unavailable visual briefing"
|
||||
|
||||
@ -2368,9 +2356,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Documents, spreadsheets, images, audio, and video are considered as source context.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2228157968"] = "Documents, spreadsheets, images, audio, and video are considered as source context."
|
||||
|
||||
-- Compile and save
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2332777012"] = "Compile and save"
|
||||
|
||||
-- Target language
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T237828418"] = "Target language"
|
||||
|
||||
@ -2431,15 +2416,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Enter a new name for this visual briefing.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2782842014"] = "Enter a new name for this visual briefing."
|
||||
|
||||
-- Prepare sources
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2838352358"] = "Prepare sources"
|
||||
|
||||
-- Linked sources
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2857875074"] = "Linked sources"
|
||||
|
||||
-- Action required
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2870470104"] = "Action required"
|
||||
|
||||
-- import
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T288002260"] = "import"
|
||||
|
||||
@ -2452,9 +2431,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Opened the visual briefing project folder.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2964042492"] = "Opened the visual briefing project folder."
|
||||
|
||||
-- Resume build
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3016389190"] = "Resume build"
|
||||
|
||||
-- Visual assets
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3226971402"] = "Visual assets"
|
||||
|
||||
@ -2470,9 +2446,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Could not open the visual briefing project folder.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3290777125"] = "Could not open the visual briefing project folder."
|
||||
|
||||
-- {0} in progress...
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3291403991"] = "{0} in progress..."
|
||||
|
||||
-- The visual briefing was imported.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3348040099"] = "The visual briefing was imported."
|
||||
|
||||
@ -2503,15 +2476,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Author (optional)
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3529399925"] = "Author (optional)"
|
||||
|
||||
-- Not started
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3531294543"] = "Not started"
|
||||
|
||||
-- The visual briefing project folder is not available.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3564616779"] = "The visual briefing project folder is not available."
|
||||
|
||||
-- Plan briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3576809882"] = "Plan briefing"
|
||||
|
||||
-- The visual briefing recompilation failed unexpectedly. Copy the technical details for support.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3614047460"] = "The visual briefing recompilation failed unexpectedly. Copy the technical details for support."
|
||||
|
||||
@ -2545,9 +2512,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Choose a different export location so the immutable briefing version is not overwritten.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3955270674"] = "Choose a different export location so the immutable briefing version is not overwritten."
|
||||
|
||||
-- Completed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3968379570"] = "Completed"
|
||||
|
||||
-- Show source references
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3977003073"] = "Show source references"
|
||||
|
||||
@ -2557,9 +2521,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- unchanged
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4017131198"] = "unchanged"
|
||||
|
||||
-- Design presentation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4023219825"] = "Design presentation"
|
||||
|
||||
-- Create briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4028101071"] = "Create briefing"
|
||||
|
||||
@ -2575,9 +2536,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- transcript outdated
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4158473953"] = "transcript outdated"
|
||||
|
||||
-- Canceled
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4165352378"] = "Canceled"
|
||||
|
||||
-- Large visual briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4198749440"] = "Large visual briefing"
|
||||
|
||||
@ -2605,9 +2563,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- The briefing was recompiled with the current AI Studio version.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T453632597"] = "The briefing was recompiled with the current AI Studio version."
|
||||
|
||||
-- Reused
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T48113973"] = "Reused"
|
||||
|
||||
-- The updated content no longer fits the current presentation. You can continue as a rebuild without another content model call.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T494870741"] = "The updated content no longer fits the current presentation. You can continue as a rebuild without another content model call."
|
||||
|
||||
@ -2650,9 +2605,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Please provide a briefing name.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T902674552"] = "Please provide a briefing name."
|
||||
|
||||
-- Build progress
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T909046610"] = "Build progress"
|
||||
|
||||
-- Briefing settings
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T937201158"] = "Briefing settings"
|
||||
|
||||
@ -2665,6 +2617,54 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- The media file changed. Transcribe it again with the configured transcription provider?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T998394163"] = "The media file changed. Transcribe it again with the configured transcription provider?"
|
||||
|
||||
-- Running
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T1160324588"] = "Running"
|
||||
|
||||
-- Failed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T1434043348"] = "Failed"
|
||||
|
||||
-- Curate content
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T1458812674"] = "Curate content"
|
||||
|
||||
-- Analyze material
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T204596900"] = "Analyze material"
|
||||
|
||||
-- Compile and save
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T2332777012"] = "Compile and save"
|
||||
|
||||
-- Prepare sources
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T2838352358"] = "Prepare sources"
|
||||
|
||||
-- Action required
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T2870470104"] = "Action required"
|
||||
|
||||
-- Resume build
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3016389190"] = "Resume build"
|
||||
|
||||
-- {0} in progress...
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3291403991"] = "{0} in progress..."
|
||||
|
||||
-- Not started
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3531294543"] = "Not started"
|
||||
|
||||
-- Plan briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3576809882"] = "Plan briefing"
|
||||
|
||||
-- Completed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3968379570"] = "Completed"
|
||||
|
||||
-- Design presentation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T4023219825"] = "Design presentation"
|
||||
|
||||
-- Canceled
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T4165352378"] = "Canceled"
|
||||
|
||||
-- Reused
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T48113973"] = "Reused"
|
||||
|
||||
-- Build progress
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T909046610"] = "Build progress"
|
||||
|
||||
-- System
|
||||
UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T2402387132"] = "System"
|
||||
|
||||
|
||||
@ -245,62 +245,7 @@
|
||||
|
||||
@if (this.latestBuild is not null)
|
||||
{
|
||||
string[] buildStepTitles =
|
||||
[
|
||||
T("Prepare sources"),
|
||||
T("Analyze material"),
|
||||
T("Plan briefing"),
|
||||
T("Curate content"),
|
||||
T("Design presentation"),
|
||||
T("Compile and save"),
|
||||
];
|
||||
<MudExpansionPanels Class="mb-4 visual-briefing-build-progress" Elevation="0">
|
||||
<MudExpansionPanel Text="@this.BuildProgressTitle"
|
||||
Expanded="@(this.latestBuild.Status is not VisualBriefingBuildStatus.COMPLETED)">
|
||||
<MudStepper ActiveIndex="@this.BuildStepperIndex"
|
||||
CompletedStepColor="Color.Primary"
|
||||
CurrentStepColor="Color.Primary"
|
||||
ErrorStepColor="Color.Error"
|
||||
NonLinear="@false"
|
||||
OnPreviewInteraction="@PreventBuildStepperInteractionAsync"
|
||||
ShowResetButton="@false">
|
||||
<ChildContent>
|
||||
@for (var index = 0; index < buildStepTitles.Length; index++)
|
||||
{
|
||||
var stepIndex = index;
|
||||
<MudStep Title="@buildStepTitles[stepIndex]"
|
||||
Completed="@this.BuildGroupCompleted(stepIndex)"
|
||||
HasError="@this.BuildGroupStopped(stepIndex)">
|
||||
<MudStack Spacing="1" Class="mt-2">
|
||||
<MudText Typo="Typo.body2">@this.BuildGroupSummary(stepIndex)</MudText>
|
||||
@if (this.BuildGroupRunning(stepIndex))
|
||||
{
|
||||
<MudProgressLinear Color="Color.Primary" Indeterminate="true"/>
|
||||
<MudText Typo="Typo.body2">@string.Format(T("{0} in progress..."), buildStepTitles[stepIndex])</MudText>
|
||||
}
|
||||
@if (this.BuildGroupStopped(stepIndex))
|
||||
{
|
||||
<MudAlert Severity="Severity.Error" Dense="true">
|
||||
@this.BuildGroupFailure(stepIndex)
|
||||
</MudAlert>
|
||||
@if (this.latestBuild.Status is VisualBriefingBuildStatus.FAILED or VisualBriefingBuildStatus.CANCELED)
|
||||
{
|
||||
<MudButton Variant="Variant.Filled"
|
||||
Color="Color.Primary"
|
||||
StartIcon="@Icons.Material.Filled.PlayArrow"
|
||||
Disabled="@this.IsCurrentBusy"
|
||||
OnClick="@this.ResumeLatestBuildAsync">
|
||||
@T("Resume build")
|
||||
</MudButton>
|
||||
}
|
||||
}
|
||||
</MudStack>
|
||||
</MudStep>
|
||||
}
|
||||
</ChildContent>
|
||||
</MudStepper>
|
||||
</MudExpansionPanel>
|
||||
</MudExpansionPanels>
|
||||
<VisualBriefingBuildProgress Build="@this.latestBuild" Disabled="@this.IsCurrentBusy" OnResume="@this.ResumeLatestBuildAsync"/>
|
||||
}
|
||||
|
||||
@if (this.reusableContentBuildId is { } reusableBuildId)
|
||||
|
||||
@ -38,61 +38,6 @@ public partial class VisualBriefingAssistant
|
||||
this.selectedBriefing?.Sources.Any(source =>
|
||||
source.Status is VisualBriefingSourceStatus.UNREACHABLE or VisualBriefingSourceStatus.TRANSCRIPT_OUTDATED) == true;
|
||||
|
||||
/// <summary>Gets the active build stepper index.</summary>
|
||||
private int BuildStepperIndex
|
||||
{
|
||||
get
|
||||
{
|
||||
if (this.latestBuild is null)
|
||||
return 0;
|
||||
|
||||
var groups = BuildStageGroups();
|
||||
for (var index = 0; index < groups.Length; index++)
|
||||
{
|
||||
var statuses = groups[index].Select(this.StageStatus).ToArray();
|
||||
if (statuses.Any(status => status is VisualBriefingBuildStageStatus.RUNNING or
|
||||
VisualBriefingBuildStageStatus.FAILED or VisualBriefingBuildStageStatus.CANCELED))
|
||||
return index;
|
||||
|
||||
if (statuses.Any(status => status is VisualBriefingBuildStageStatus.NOT_STARTED))
|
||||
return index;
|
||||
}
|
||||
|
||||
return groups.Length - 1;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the localized collapsed build-progress summary.
|
||||
/// </summary>
|
||||
private string BuildProgressTitle
|
||||
{
|
||||
get
|
||||
{
|
||||
var title = this.latestBuild?.Status switch
|
||||
{
|
||||
VisualBriefingBuildStatus.COMPLETED => $"{T("Build progress")} · {T("Completed")}",
|
||||
VisualBriefingBuildStatus.FAILED => $"{T("Build progress")} · {T("Failed")}",
|
||||
VisualBriefingBuildStatus.CANCELED => $"{T("Build progress")} · {T("Canceled")}",
|
||||
VisualBriefingBuildStatus.AWAITING_REBUILD => $"{T("Build progress")} · {T("Action required")}",
|
||||
|
||||
_ => $"{T("Build progress")} · {T("Running")}",
|
||||
};
|
||||
|
||||
var duration = this.CalculateBuildDuration(this.latestBuild?.Stages ?? []);
|
||||
return duration > TimeSpan.Zero ? $"{title} · {FormatBuildDuration(duration)}" : title;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Keeps the status stepper informational while allowing actions inside the active step.
|
||||
/// </summary>
|
||||
private static Task PreventBuildStepperInteractionAsync(StepperInteractionEventArgs args)
|
||||
{
|
||||
args.Cancel = true;
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Defines <c>GenerateAsync</c> for the visual briefing feature.
|
||||
/// </summary>
|
||||
@ -358,34 +303,10 @@ public partial class VisualBriefingAssistant
|
||||
return;
|
||||
|
||||
this.latestBuild = this.BuildProgressService.GetLatest(briefingId);
|
||||
this.buildDurationReferenceUtc = DateTimeOffset.UtcNow;
|
||||
this.StateHasChanged();
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Refreshes live build durations at most once per second while a selected stage is running.
|
||||
/// </summary>
|
||||
private async Task MonitorBuildDurationAsync(CancellationToken token)
|
||||
{
|
||||
using var timer = new PeriodicTimer(TimeSpan.FromSeconds(1));
|
||||
try
|
||||
{
|
||||
while (await timer.WaitForNextTickAsync(token))
|
||||
await this.InvokeAsync(() =>
|
||||
{
|
||||
if (this.latestBuild?.Stages.Any(stage => stage.Status is VisualBriefingBuildStageStatus.RUNNING) != true)
|
||||
return;
|
||||
|
||||
this.buildDurationReferenceUtc = DateTimeOffset.UtcNow;
|
||||
this.StateHasChanged();
|
||||
});
|
||||
}
|
||||
catch (OperationCanceledException) when (token.IsCancellationRequested)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Resumes the latest failed build with its persisted operation inputs.
|
||||
/// </summary>
|
||||
@ -418,120 +339,6 @@ public partial class VisualBriefingAssistant
|
||||
this.StateHasChanged();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the six UI groups for the eight durable build stages.
|
||||
/// </summary>
|
||||
private static VisualBriefingBuildStage[][] BuildStageGroups() =>
|
||||
[
|
||||
[VisualBriefingBuildStage.SOURCE_PREPARATION],
|
||||
[VisualBriefingBuildStage.EVIDENCE],
|
||||
[VisualBriefingBuildStage.PLAN],
|
||||
[VisualBriefingBuildStage.CONTENT],
|
||||
[VisualBriefingBuildStage.DESIGN],
|
||||
[VisualBriefingBuildStage.COMPILATION, VisualBriefingBuildStage.ASSEMBLY, VisualBriefingBuildStage.COMMIT],
|
||||
];
|
||||
|
||||
/// <summary>
|
||||
/// Gets a persistent stage status, defaulting to not started.
|
||||
/// </summary>
|
||||
private VisualBriefingBuildStageStatus StageStatus(VisualBriefingBuildStage stage) =>
|
||||
this.latestBuild?.Stages.FirstOrDefault(item => item.Stage == stage)?.Status ??
|
||||
VisualBriefingBuildStageStatus.NOT_STARTED;
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether one UI group completed or was reused.
|
||||
/// </summary>
|
||||
private bool BuildGroupCompleted(int index) =>
|
||||
BuildStageGroups()[index].All(stage =>
|
||||
this.StageStatus(stage) is VisualBriefingBuildStageStatus.COMPLETED or VisualBriefingBuildStageStatus.SKIPPED);
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether one UI group failed.
|
||||
/// </summary>
|
||||
private bool BuildGroupFailed(int index) =>
|
||||
BuildStageGroups()[index].Any(stage => this.StageStatus(stage) is VisualBriefingBuildStageStatus.FAILED);
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether one UI group was canceled.
|
||||
/// </summary>
|
||||
private bool BuildGroupCanceled(int index) =>
|
||||
BuildStageGroups()[index].Any(stage => this.StageStatus(stage) is VisualBriefingBuildStageStatus.CANCELED);
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether one UI group stopped with a failure or cancellation.
|
||||
/// </summary>
|
||||
private bool BuildGroupStopped(int index) =>
|
||||
this.BuildGroupFailed(index) || this.BuildGroupCanceled(index);
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether one UI group is active.
|
||||
/// </summary>
|
||||
private bool BuildGroupRunning(int index) =>
|
||||
BuildStageGroups()[index].Any(stage => this.StageStatus(stage) is VisualBriefingBuildStageStatus.RUNNING);
|
||||
|
||||
/// <summary>
|
||||
/// Formats a safe localized status summary and duration.
|
||||
/// </summary>
|
||||
private string BuildGroupSummary(int index)
|
||||
{
|
||||
if (this.latestBuild is null)
|
||||
return T("Not started");
|
||||
|
||||
var records = BuildStageGroups()[index]
|
||||
.Select(stage => this.latestBuild.Stages.FirstOrDefault(item => item.Stage == stage))
|
||||
.Where(record => record is not null)
|
||||
.Cast<VisualBriefingBuildStageRecord>()
|
||||
.ToArray();
|
||||
|
||||
var status = this.BuildGroupRunning(index)
|
||||
? T("Running")
|
||||
: this.BuildGroupFailed(index)
|
||||
? T("Failed")
|
||||
: this.BuildGroupCanceled(index)
|
||||
? T("Canceled")
|
||||
: records.Length > 0 && records.All(record => record.Status is VisualBriefingBuildStageStatus.SKIPPED)
|
||||
? T("Reused")
|
||||
: this.BuildGroupCompleted(index)
|
||||
? T("Completed")
|
||||
: T("Not started");
|
||||
|
||||
var duration = this.CalculateBuildDuration(records);
|
||||
return duration > TimeSpan.Zero ? $"{status} · {FormatBuildDuration(duration)}" : status;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculates active processing time without counting reused stages or time between resume attempts.
|
||||
/// </summary>
|
||||
private TimeSpan CalculateBuildDuration(IEnumerable<VisualBriefingBuildStageRecord> records) => records
|
||||
.Where(record => record.StartedAtUtc is not null && record.Status is not VisualBriefingBuildStageStatus.SKIPPED)
|
||||
.Aggregate(TimeSpan.Zero, (total, record) => total + this.CalculateStageDuration(record));
|
||||
|
||||
/// <summary>
|
||||
/// Calculates one stage duration against the shared live timestamp.
|
||||
/// </summary>
|
||||
private TimeSpan CalculateStageDuration(VisualBriefingBuildStageRecord record)
|
||||
{
|
||||
var finishedAtUtc = record.Status is VisualBriefingBuildStageStatus.RUNNING ? this.buildDurationReferenceUtc : record.FinishedAtUtc;
|
||||
if (record.StartedAtUtc is null || finishedAtUtc is null)
|
||||
return TimeSpan.Zero;
|
||||
|
||||
var duration = finishedAtUtc.Value - record.StartedAtUtc.Value;
|
||||
return duration > TimeSpan.Zero ? duration : TimeSpan.Zero;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Formats a build duration using the current UI culture.
|
||||
/// </summary>
|
||||
private static string FormatBuildDuration(TimeSpan duration) => $"{duration.TotalSeconds:0.0} s";
|
||||
|
||||
/// <summary>
|
||||
/// Gets the safe failure reason for a UI group.
|
||||
/// </summary>
|
||||
private string BuildGroupFailure(int index) =>
|
||||
BuildStageGroups()[index]
|
||||
.Select(stage => this.latestBuild?.Stages.FirstOrDefault(item => item.Stage == stage)?.Failure)
|
||||
.FirstOrDefault(failure => failure is not null)?.UserMessage ?? this.latestBuild?.Failure?.UserMessage ?? string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Defines <c>CopyTechnicalDetailsAsync</c> for the visual briefing feature.
|
||||
/// </summary>
|
||||
|
||||
@ -91,9 +91,6 @@ public partial class VisualBriefingAssistant : MSGComponentBase
|
||||
/// <summary>Stops the background source-status monitor.</summary>
|
||||
private readonly CancellationTokenSource sourceMonitorCancellation = new();
|
||||
|
||||
/// <summary>Stops the live build-duration monitor.</summary>
|
||||
private readonly CancellationTokenSource buildDurationMonitorCancellation = new();
|
||||
|
||||
/// <summary>Stores available and recoverable projects ordered by most recent modification.</summary>
|
||||
private IReadOnlyList<VisualBriefingProjectEntry> projects = [];
|
||||
|
||||
@ -172,9 +169,6 @@ public partial class VisualBriefingAssistant : MSGComponentBase
|
||||
/// <summary>Stores the latest persistent or live build shown in the stepper.</summary>
|
||||
private VisualBriefingBuildRecord? latestBuild;
|
||||
|
||||
/// <summary>Stores the shared timestamp used to render consistent live build durations.</summary>
|
||||
private DateTimeOffset buildDurationReferenceUtc = DateTimeOffset.UtcNow;
|
||||
|
||||
/// <summary>Stores incompatible validated content offered for rebuild continuation.</summary>
|
||||
private Guid? reusableContentBuildId;
|
||||
|
||||
@ -220,7 +214,6 @@ public partial class VisualBriefingAssistant : MSGComponentBase
|
||||
this.BuildProgressService.Changed += this.BuildProgressChanged;
|
||||
await this.ReloadListAsync();
|
||||
_ = this.MonitorSourceStatusAsync(this.sourceMonitorCancellation.Token);
|
||||
_ = this.MonitorBuildDurationAsync(this.buildDurationMonitorCancellation.Token);
|
||||
var deferredInstruction = this.MessageBus.CheckDeferredMessages<string>(Event.SEND_TO_VISUAL_BRIEFING_ASSISTANT).FirstOrDefault();
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(deferredInstruction))
|
||||
@ -243,8 +236,6 @@ public partial class VisualBriefingAssistant : MSGComponentBase
|
||||
this.isDisposed = true;
|
||||
this.sourceMonitorCancellation.Cancel();
|
||||
this.sourceMonitorCancellation.Dispose();
|
||||
this.buildDurationMonitorCancellation.Cancel();
|
||||
this.buildDurationMonitorCancellation.Dispose();
|
||||
this.MediaTranscriptionService.StateChanged -= this.MediaStateChanged;
|
||||
this.BuildProgressService.Changed -= this.BuildProgressChanged;
|
||||
base.DisposeResources();
|
||||
|
||||
@ -0,0 +1,48 @@
|
||||
@inherits MSGComponentBase
|
||||
|
||||
<MudExpansionPanels Class="mb-4" Elevation="0">
|
||||
<MudExpansionPanel Text="@this.BuildProgressTitle" Expanded="@(this.Build?.Status is not VisualBriefingBuildStatus.COMPLETED)">
|
||||
<MudStepper ActiveIndex="@this.BuildStepperIndex"
|
||||
CompletedStepColor="Color.Primary"
|
||||
CurrentStepColor="Color.Primary"
|
||||
ErrorStepColor="Color.Error"
|
||||
NonLinear="@false"
|
||||
OnPreviewInteraction="@PreventBuildStepperInteractionAsync"
|
||||
ShowResetButton="@false">
|
||||
<ChildContent>
|
||||
@for (var index = 0; index < STAGE_GROUPS.Length; index++)
|
||||
{
|
||||
var stepIndex = index;
|
||||
<MudStep Title="@this.StepTitle(stepIndex)" Completed="@this.BuildGroupCompleted(stepIndex)" HasError="@this.BuildGroupStopped(stepIndex)">
|
||||
<MudStack Spacing="1" Class="mt-2">
|
||||
<MudText Typo="Typo.body2">@this.BuildGroupSummary(stepIndex)</MudText>
|
||||
@if (this.BuildGroupRunning(stepIndex))
|
||||
{
|
||||
<MudProgressLinear Color="Color.Primary" Indeterminate="true"/>
|
||||
<MudText Typo="Typo.body2">@string.Format(T("{0} in progress..."), this.StepTitle(stepIndex))</MudText>
|
||||
}
|
||||
|
||||
@if (this.BuildGroupStopped(stepIndex))
|
||||
{
|
||||
<MudAlert Severity="Severity.Error" Dense="true">
|
||||
@this.BuildGroupFailure(stepIndex)
|
||||
</MudAlert>
|
||||
|
||||
@if (this.Build?.Status is VisualBriefingBuildStatus.FAILED or VisualBriefingBuildStatus.CANCELED)
|
||||
{
|
||||
<MudButton Variant="Variant.Filled"
|
||||
Color="Color.Primary"
|
||||
StartIcon="@Icons.Material.Filled.PlayArrow"
|
||||
Disabled="@this.Disabled"
|
||||
OnClick="@this.OnResume">
|
||||
@T("Resume build")
|
||||
</MudButton>
|
||||
}
|
||||
}
|
||||
</MudStack>
|
||||
</MudStep>
|
||||
}
|
||||
</ChildContent>
|
||||
</MudStepper>
|
||||
</MudExpansionPanel>
|
||||
</MudExpansionPanels>
|
||||
@ -0,0 +1,291 @@
|
||||
using AIStudio.Components;
|
||||
|
||||
using Microsoft.AspNetCore.Components;
|
||||
|
||||
namespace AIStudio.Assistants.VisualBriefing;
|
||||
|
||||
/// <summary>
|
||||
/// Renders the staged progress, durations, and failures of one visual briefing build.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// The component derives everything it shows from <see cref="Build"/> alone. It also owns the timer
|
||||
/// that keeps the duration of a running stage current, so a build in progress re-renders this panel
|
||||
/// once per second instead of the entire assistant page.
|
||||
/// </remarks>
|
||||
public partial class VisualBriefingBuildProgress : MSGComponentBase
|
||||
{
|
||||
/// <summary>
|
||||
/// Gets or sets the build whose progress is displayed.
|
||||
/// </summary>
|
||||
[Parameter, EditorRequired]
|
||||
public VisualBriefingBuildRecord? Build { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets whether the resume action is blocked because other work is running.
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public bool Disabled { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the callback raised when the user resumes a failed or canceled build.
|
||||
/// </summary>
|
||||
[Parameter]
|
||||
public EventCallback OnResume { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The six UI groups covering the eight durable build stages.
|
||||
/// </summary>
|
||||
private static readonly VisualBriefingBuildStage[][] STAGE_GROUPS =
|
||||
[
|
||||
[VisualBriefingBuildStage.SOURCE_PREPARATION],
|
||||
[VisualBriefingBuildStage.EVIDENCE],
|
||||
[VisualBriefingBuildStage.PLAN],
|
||||
[VisualBriefingBuildStage.CONTENT],
|
||||
[VisualBriefingBuildStage.DESIGN],
|
||||
[VisualBriefingBuildStage.COMPILATION, VisualBriefingBuildStage.ASSEMBLY, VisualBriefingBuildStage.COMMIT],
|
||||
];
|
||||
|
||||
/// <summary>Stops the live build-duration monitor.</summary>
|
||||
private readonly CancellationTokenSource durationMonitorCancellation = new();
|
||||
|
||||
/// <summary>Stores the shared timestamp used to render consistent live build durations.</summary>
|
||||
private DateTimeOffset durationReferenceUtc = DateTimeOffset.UtcNow;
|
||||
|
||||
#region Overrides of ComponentBase
|
||||
|
||||
protected override async Task OnInitializedAsync()
|
||||
{
|
||||
await base.OnInitializedAsync();
|
||||
_ = this.MonitorBuildDurationAsync(this.durationMonitorCancellation.Token);
|
||||
}
|
||||
|
||||
protected override void OnParametersSet()
|
||||
{
|
||||
// The parent re-renders us whenever it received a progress update, so this is the moment the
|
||||
// durations of running stages must be measured against again.
|
||||
this.durationReferenceUtc = DateTimeOffset.UtcNow;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Overrides of MSGComponentBase
|
||||
|
||||
protected override void DisposeResources()
|
||||
{
|
||||
this.durationMonitorCancellation.Cancel();
|
||||
this.durationMonitorCancellation.Dispose();
|
||||
base.DisposeResources();
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Refreshes live build durations at most once per second while a stage is running.
|
||||
/// </summary>
|
||||
/// <param name="token">The token that stops the monitor.</param>
|
||||
/// <returns>A task that completes once the monitor was stopped.</returns>
|
||||
private async Task MonitorBuildDurationAsync(CancellationToken token)
|
||||
{
|
||||
using var timer = new PeriodicTimer(TimeSpan.FromSeconds(1));
|
||||
try
|
||||
{
|
||||
while (await timer.WaitForNextTickAsync(token))
|
||||
await this.InvokeAsync(() =>
|
||||
{
|
||||
if (this.Build?.Stages.Any(stage => stage.Status is VisualBriefingBuildStageStatus.RUNNING) != true)
|
||||
return;
|
||||
|
||||
this.durationReferenceUtc = DateTimeOffset.UtcNow;
|
||||
this.StateHasChanged();
|
||||
});
|
||||
}
|
||||
catch (OperationCanceledException) when (token.IsCancellationRequested)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the localized title of one build step.
|
||||
/// </summary>
|
||||
/// <param name="index">The zero-based index of the step.</param>
|
||||
/// <returns>The localized step title.</returns>
|
||||
private string StepTitle(int index) => index switch
|
||||
{
|
||||
0 => T("Prepare sources"),
|
||||
1 => T("Analyze material"),
|
||||
2 => T("Plan briefing"),
|
||||
3 => T("Curate content"),
|
||||
4 => T("Design presentation"),
|
||||
|
||||
_ => T("Compile and save"),
|
||||
};
|
||||
|
||||
/// <summary>Gets the active build stepper index.</summary>
|
||||
private int BuildStepperIndex
|
||||
{
|
||||
get
|
||||
{
|
||||
for (var index = 0; index < STAGE_GROUPS.Length; index++)
|
||||
{
|
||||
var statuses = STAGE_GROUPS[index].Select(this.StageStatus).ToArray();
|
||||
if (statuses.Any(status => status is VisualBriefingBuildStageStatus.RUNNING or VisualBriefingBuildStageStatus.FAILED or VisualBriefingBuildStageStatus.CANCELED))
|
||||
return index;
|
||||
|
||||
if (statuses.Any(status => status is VisualBriefingBuildStageStatus.NOT_STARTED))
|
||||
return index;
|
||||
}
|
||||
|
||||
return STAGE_GROUPS.Length - 1;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the localized collapsed build-progress summary.
|
||||
/// </summary>
|
||||
private string BuildProgressTitle
|
||||
{
|
||||
get
|
||||
{
|
||||
if(this.Build is null)
|
||||
return $"{T("Build progress")} · {T("Running")}";
|
||||
|
||||
var title = this.Build.Status switch
|
||||
{
|
||||
VisualBriefingBuildStatus.COMPLETED => $"{T("Build progress")} · {T("Completed")}",
|
||||
VisualBriefingBuildStatus.FAILED => $"{T("Build progress")} · {T("Failed")}",
|
||||
VisualBriefingBuildStatus.CANCELED => $"{T("Build progress")} · {T("Canceled")}",
|
||||
VisualBriefingBuildStatus.AWAITING_REBUILD => $"{T("Build progress")} · {T("Action required")}",
|
||||
|
||||
_ => $"{T("Build progress")} · {T("Running")}",
|
||||
};
|
||||
|
||||
var duration = this.CalculateBuildDuration(this.Build.Stages);
|
||||
return duration > TimeSpan.Zero ? $"{title} · {FormatBuildDuration(duration)}" : title;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Keeps the status stepper informational while allowing actions inside the active step.
|
||||
/// </summary>
|
||||
/// <param name="args">The interaction to cancel.</param>
|
||||
/// <returns>A completed task.</returns>
|
||||
private static Task PreventBuildStepperInteractionAsync(StepperInteractionEventArgs args)
|
||||
{
|
||||
args.Cancel = true;
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a persistent stage status, defaulting to not started.
|
||||
/// </summary>
|
||||
/// <param name="stage">The stage to look up.</param>
|
||||
/// <returns>The stage status.</returns>
|
||||
private VisualBriefingBuildStageStatus StageStatus(VisualBriefingBuildStage stage) => this.Build?.Stages.FirstOrDefault(item => item.Stage == stage)?.Status ?? VisualBriefingBuildStageStatus.NOT_STARTED;
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether one UI group completed or was reused.
|
||||
/// </summary>
|
||||
/// <param name="index">The zero-based index of the group.</param>
|
||||
/// <returns><c>true</c> when the group finished.</returns>
|
||||
private bool BuildGroupCompleted(int index) => STAGE_GROUPS[index].All(stage => this.StageStatus(stage) is VisualBriefingBuildStageStatus.COMPLETED or VisualBriefingBuildStageStatus.SKIPPED);
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether one UI group failed.
|
||||
/// </summary>
|
||||
/// <param name="index">The zero-based index of the group.</param>
|
||||
/// <returns><c>true</c> when the group failed.</returns>
|
||||
private bool BuildGroupFailed(int index) => STAGE_GROUPS[index].Any(stage => this.StageStatus(stage) is VisualBriefingBuildStageStatus.FAILED);
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether one UI group was canceled.
|
||||
/// </summary>
|
||||
/// <param name="index">The zero-based index of the group.</param>
|
||||
/// <returns><c>true</c> when the group was canceled.</returns>
|
||||
private bool BuildGroupCanceled(int index) => STAGE_GROUPS[index].Any(stage => this.StageStatus(stage) is VisualBriefingBuildStageStatus.CANCELED);
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether one UI group stopped with a failure or cancellation.
|
||||
/// </summary>
|
||||
/// <param name="index">The zero-based index of the group.</param>
|
||||
/// <returns><c>true</c> when the group stopped.</returns>
|
||||
private bool BuildGroupStopped(int index) => this.BuildGroupFailed(index) || this.BuildGroupCanceled(index);
|
||||
|
||||
/// <summary>
|
||||
/// Gets whether one UI group is active.
|
||||
/// </summary>
|
||||
/// <param name="index">The zero-based index of the group.</param>
|
||||
/// <returns><c>true</c> when the group is running.</returns>
|
||||
private bool BuildGroupRunning(int index) => STAGE_GROUPS[index].Any(stage => this.StageStatus(stage) is VisualBriefingBuildStageStatus.RUNNING);
|
||||
|
||||
/// <summary>
|
||||
/// Formats a safe localized status summary and duration.
|
||||
/// </summary>
|
||||
/// <param name="index">The zero-based index of the group.</param>
|
||||
/// <returns>The localized summary.</returns>
|
||||
private string BuildGroupSummary(int index)
|
||||
{
|
||||
if(this.Build is null)
|
||||
return T("Not started");
|
||||
|
||||
var records = STAGE_GROUPS[index]
|
||||
.Select(stage => this.Build.Stages.FirstOrDefault(item => item.Stage == stage))
|
||||
.Where(record => record is not null)
|
||||
.Cast<VisualBriefingBuildStageRecord>()
|
||||
.ToArray();
|
||||
|
||||
var status = this.BuildGroupRunning(index)
|
||||
? T("Running")
|
||||
: this.BuildGroupFailed(index)
|
||||
? T("Failed")
|
||||
: this.BuildGroupCanceled(index)
|
||||
? T("Canceled")
|
||||
: records.Length > 0 && records.All(record => record.Status is VisualBriefingBuildStageStatus.SKIPPED)
|
||||
? T("Reused")
|
||||
: this.BuildGroupCompleted(index)
|
||||
? T("Completed")
|
||||
: T("Not started");
|
||||
|
||||
var duration = this.CalculateBuildDuration(records);
|
||||
return duration > TimeSpan.Zero ? $"{status} · {FormatBuildDuration(duration)}" : status;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Calculates active processing time without counting reused stages or time between resume attempts.
|
||||
/// </summary>
|
||||
/// <param name="records">The stage records to aggregate.</param>
|
||||
/// <returns>The aggregated duration.</returns>
|
||||
private TimeSpan CalculateBuildDuration(IEnumerable<VisualBriefingBuildStageRecord> records) => records
|
||||
.Where(record => record.StartedAtUtc is not null && record.Status is not VisualBriefingBuildStageStatus.SKIPPED)
|
||||
.Aggregate(TimeSpan.Zero, (total, record) => total + this.CalculateStageDuration(record));
|
||||
|
||||
/// <summary>
|
||||
/// Calculates one stage duration against the shared live timestamp.
|
||||
/// </summary>
|
||||
/// <param name="record">The stage record to measure.</param>
|
||||
/// <returns>The stage duration.</returns>
|
||||
private TimeSpan CalculateStageDuration(VisualBriefingBuildStageRecord record)
|
||||
{
|
||||
var finishedAtUtc = record.Status is VisualBriefingBuildStageStatus.RUNNING ? this.durationReferenceUtc : record.FinishedAtUtc;
|
||||
if (record.StartedAtUtc is null || finishedAtUtc is null)
|
||||
return TimeSpan.Zero;
|
||||
|
||||
var duration = finishedAtUtc.Value - record.StartedAtUtc.Value;
|
||||
return duration > TimeSpan.Zero ? duration : TimeSpan.Zero;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Formats a build duration in seconds using the current culture.
|
||||
/// </summary>
|
||||
/// <param name="duration">The duration to format.</param>
|
||||
/// <returns>The formatted duration.</returns>
|
||||
private static string FormatBuildDuration(TimeSpan duration) => $"{duration.TotalSeconds:0.0} s";
|
||||
|
||||
/// <summary>
|
||||
/// Gets the safe failure reason for a UI group.
|
||||
/// </summary>
|
||||
/// <param name="index">The zero-based index of the group.</param>
|
||||
/// <returns>The user-facing failure message.</returns>
|
||||
private string BuildGroupFailure(int index) => this.Build is null ? string.Empty : STAGE_GROUPS[index]
|
||||
.Select(stage => this.Build.Stages.FirstOrDefault(item => item.Stage == stage)?.Failure)
|
||||
.FirstOrDefault(failure => failure is not null)?.UserMessage ?? this.Build.Failure?.UserMessage ?? string.Empty;
|
||||
}
|
||||
@ -8,12 +8,12 @@ public sealed class VisualBriefingBuildRecord
|
||||
/// <summary>
|
||||
/// Gets or sets the build-record schema version.
|
||||
/// </summary>
|
||||
public int BuildVersion { get; set; } = VisualBriefingVersions.BUILD;
|
||||
public int BuildVersion { get; init; } = VisualBriefingVersions.BUILD;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the build identifier.
|
||||
/// </summary>
|
||||
public Guid BuildId { get; set; }
|
||||
public Guid BuildId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the operation identifier shown in diagnostics and logs.
|
||||
@ -23,17 +23,17 @@ public sealed class VisualBriefingBuildRecord
|
||||
/// <summary>
|
||||
/// Gets or sets the owning briefing identifier.
|
||||
/// </summary>
|
||||
public Guid BriefingId { get; set; }
|
||||
public Guid BriefingId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the requested edit mode.
|
||||
/// </summary>
|
||||
public VisualBriefingEditMode Mode { get; set; }
|
||||
public VisualBriefingEditMode Mode { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the parent revision identifier.
|
||||
/// </summary>
|
||||
public Guid? ParentRevisionId { get; set; }
|
||||
public Guid? ParentRevisionId { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the local revision instruction used for recovery.
|
||||
@ -48,7 +48,7 @@ public sealed class VisualBriefingBuildRecord
|
||||
/// <summary>
|
||||
/// Gets or sets durable stage progress.
|
||||
/// </summary>
|
||||
public List<VisualBriefingBuildStageRecord> Stages { get; set; } = [];
|
||||
public List<VisualBriefingBuildStageRecord> Stages { get; init; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the content artifact identifier.
|
||||
@ -83,47 +83,47 @@ public sealed class VisualBriefingBuildRecord
|
||||
/// <summary>
|
||||
/// Gets or sets the complete safe input fingerprint.
|
||||
/// </summary>
|
||||
public string InputFingerprint { get; set; } = string.Empty;
|
||||
public string InputFingerprint { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the source and transcript fingerprint.
|
||||
/// </summary>
|
||||
public string SourceFingerprint { get; set; } = string.Empty;
|
||||
public string SourceFingerprint { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the content prompt contract version.
|
||||
/// </summary>
|
||||
public int ContentContractVersion { get; set; } = VisualBriefingVersions.CONTENT_CONTRACT;
|
||||
public int ContentContractVersion { get; init; } = VisualBriefingVersions.CONTENT_CONTRACT;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the evidence prompt contract version.
|
||||
/// </summary>
|
||||
public int EvidenceContractVersion { get; set; } = VisualBriefingVersions.EVIDENCE_CONTRACT;
|
||||
public int EvidenceContractVersion { get; init; } = VisualBriefingVersions.EVIDENCE_CONTRACT;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the plan prompt contract version.
|
||||
/// </summary>
|
||||
public int PlanContractVersion { get; set; } = VisualBriefingVersions.PLAN_CONTRACT;
|
||||
public int PlanContractVersion { get; init; } = VisualBriefingVersions.PLAN_CONTRACT;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the design prompt contract version.
|
||||
/// </summary>
|
||||
public int DesignContractVersion { get; set; } = VisualBriefingVersions.DESIGN_CONTRACT;
|
||||
public int DesignContractVersion { get; init; } = VisualBriefingVersions.DESIGN_CONTRACT;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the selected provider family.
|
||||
/// </summary>
|
||||
public string ProviderFamily { get; set; } = string.Empty;
|
||||
public string ProviderFamily { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the selected model name.
|
||||
/// </summary>
|
||||
public string Model { get; set; } = string.Empty;
|
||||
public string Model { get; init; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the build creation time.
|
||||
/// </summary>
|
||||
public DateTimeOffset CreatedAtUtc { get; set; }
|
||||
public DateTimeOffset CreatedAtUtc { get; init; }
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the most recent build update time.
|
||||
|
||||
@ -2283,9 +2283,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Stop build
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1150899861"] = "Erstellung stoppen"
|
||||
|
||||
-- Running
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1160324588"] = "Wird ausgeführt"
|
||||
|
||||
-- changed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1177151643"] = "geändert"
|
||||
|
||||
@ -2316,12 +2313,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Protection level
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1407518380"] = "Schutzstufe"
|
||||
|
||||
-- Failed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1434043348"] = "fehlgeschlagen"
|
||||
|
||||
-- Curate content
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1458812674"] = "Inhalte kuratieren"
|
||||
|
||||
-- Import
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1463683828"] = "Importieren"
|
||||
|
||||
@ -2358,9 +2349,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Refresh status
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2035829510"] = "Status aktualisieren"
|
||||
|
||||
-- Analyze material
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T204596900"] = "Material analysieren"
|
||||
|
||||
-- Unavailable visual briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2068761945"] = "Nicht verfügbares visuelles Briefing"
|
||||
|
||||
@ -2370,9 +2358,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Documents, spreadsheets, images, audio, and video are considered as source context.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2228157968"] = "Dokumente, Tabellenkalkulationen, Bilder, Audio- und Videodateien werden als Ausgangsmaterial berücksichtigt."
|
||||
|
||||
-- Compile and save
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2332777012"] = "Kompilieren und speichern"
|
||||
|
||||
-- Target language
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T237828418"] = "Zielsprache"
|
||||
|
||||
@ -2433,15 +2418,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Enter a new name for this visual briefing.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2782842014"] = "Geben Sie einen neuen Namen für dieses visuelle Briefing ein."
|
||||
|
||||
-- Prepare sources
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2838352358"] = "Ausgangsmaterial vorbereiten"
|
||||
|
||||
-- Linked sources
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2857875074"] = "Verknüpfte Quellen"
|
||||
|
||||
-- Action required
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2870470104"] = "Handlung erforderlich"
|
||||
|
||||
-- import
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T288002260"] = "Importieren"
|
||||
|
||||
@ -2454,9 +2433,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Opened the visual briefing project folder.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2964042492"] = "Projektordner für das visuelle Briefing öffnen."
|
||||
|
||||
-- Resume build
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3016389190"] = "Erstellung fortsetzen"
|
||||
|
||||
-- Visual assets
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3226971402"] = "Visuelle Elemente"
|
||||
|
||||
@ -2472,9 +2448,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Could not open the visual briefing project folder.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3290777125"] = "Der Projektordner für das visuelle Briefing konnte nicht geöffnet werden."
|
||||
|
||||
-- {0} in progress...
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3291403991"] = "{0} wird verarbeitet ..."
|
||||
|
||||
-- The visual briefing was imported.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3348040099"] = "Das visuelle Briefing wurde importiert."
|
||||
|
||||
@ -2505,15 +2478,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Author (optional)
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3529399925"] = "Autor/in (optional)"
|
||||
|
||||
-- Not started
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3531294543"] = "Nicht gestartet"
|
||||
|
||||
-- The visual briefing project folder is not available.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3564616779"] = "Der Projektordner für das visuelle Briefing ist nicht verfügbar."
|
||||
|
||||
-- Plan briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3576809882"] = "Briefing planen"
|
||||
|
||||
-- The visual briefing recompilation failed unexpectedly. Copy the technical details for support.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3614047460"] = "Die erneute Erstellung des visuellen Briefings ist unerwartet fehlgeschlagen. Kopieren Sie die technischen Details für den Support."
|
||||
|
||||
@ -2547,9 +2514,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Choose a different export location so the immutable briefing version is not overwritten.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3955270674"] = "Wähle einen anderen Ort für den Export, damit die unveränderliche Briefing-Version nicht überschrieben wird."
|
||||
|
||||
-- Completed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3968379570"] = "Abgeschlossen"
|
||||
|
||||
-- Show source references
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3977003073"] = "Quellverweise anzeigen"
|
||||
|
||||
@ -2559,9 +2523,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- unchanged
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4017131198"] = "unverändert"
|
||||
|
||||
-- Design presentation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4023219825"] = "Präsentation gestalten"
|
||||
|
||||
-- Create briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4028101071"] = "Briefing erstellen"
|
||||
|
||||
@ -2577,9 +2538,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- transcript outdated
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4158473953"] = "Transkript veraltet"
|
||||
|
||||
-- Canceled
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4165352378"] = "Abgebrochen"
|
||||
|
||||
-- Large visual briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4198749440"] = "Umfassendes visuelles Briefing"
|
||||
|
||||
@ -2607,9 +2565,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- The briefing was recompiled with the current AI Studio version.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T453632597"] = "Das Briefing wurde mit der aktuellen AI Studio-Version neu kompiliert."
|
||||
|
||||
-- Reused
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T48113973"] = "Wiederverwendet"
|
||||
|
||||
-- The updated content no longer fits the current presentation. You can continue as a rebuild without another content model call.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T494870741"] = "Die aktualisierten Inhalte passen nicht mehr in die aktuelle Präsentation. Sie können ohne weiteren Aufruf des KI-Modells mit einer Neuerstellung fortfahren."
|
||||
|
||||
@ -2652,9 +2607,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Please provide a briefing name.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T902674552"] = "Bitte geben Sie einen Namen für das Briefing ein."
|
||||
|
||||
-- Build progress
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T909046610"] = "Erstellungsfortschritt"
|
||||
|
||||
-- Briefing settings
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T937201158"] = "Briefing-Einstellungen"
|
||||
|
||||
@ -2667,6 +2619,54 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- The media file changed. Transcribe it again with the configured transcription provider?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T998394163"] = "Die Mediendatei wurde geändert. Mit dem konfigurierten Transkriptionsanbieter erneut transkribieren?"
|
||||
|
||||
-- Running
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T1160324588"] = "Wird ausgeführt"
|
||||
|
||||
-- Failed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T1434043348"] = "Fehlgeschlagen"
|
||||
|
||||
-- Curate content
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T1458812674"] = "Inhalte kuratieren"
|
||||
|
||||
-- Analyze material
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T204596900"] = "Material analysieren"
|
||||
|
||||
-- Compile and save
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T2332777012"] = "Kompilieren und speichern"
|
||||
|
||||
-- Prepare sources
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T2838352358"] = "Quellen vorbereiten"
|
||||
|
||||
-- Action required
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T2870470104"] = "Aktion erforderlich"
|
||||
|
||||
-- Resume build
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3016389190"] = "Erstellung fortsetzen"
|
||||
|
||||
-- {0} in progress...
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3291403991"] = "{0} wird bearbeitet …"
|
||||
|
||||
-- Not started
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3531294543"] = "Nicht gestartet"
|
||||
|
||||
-- Plan briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3576809882"] = "Briefing planen"
|
||||
|
||||
-- Completed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3968379570"] = "Abgeschlossen"
|
||||
|
||||
-- Design presentation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T4023219825"] = "Präsentation gestalten"
|
||||
|
||||
-- Canceled
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T4165352378"] = "Abgebrochen"
|
||||
|
||||
-- Reused
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T48113973"] = "Wiederverwendet"
|
||||
|
||||
-- Build progress
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T909046610"] = "Erstellungsfortschritt"
|
||||
|
||||
-- System
|
||||
UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T2402387132"] = "System"
|
||||
|
||||
|
||||
@ -2283,9 +2283,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Stop build
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1150899861"] = "Stop build"
|
||||
|
||||
-- Running
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1160324588"] = "Running"
|
||||
|
||||
-- changed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1177151643"] = "changed"
|
||||
|
||||
@ -2316,12 +2313,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Protection level
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1407518380"] = "Protection level"
|
||||
|
||||
-- Failed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1434043348"] = "Failed"
|
||||
|
||||
-- Curate content
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1458812674"] = "Curate content"
|
||||
|
||||
-- Import
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T1463683828"] = "Import"
|
||||
|
||||
@ -2358,9 +2349,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Refresh status
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2035829510"] = "Refresh status"
|
||||
|
||||
-- Analyze material
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T204596900"] = "Analyze material"
|
||||
|
||||
-- Unavailable visual briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2068761945"] = "Unavailable visual briefing"
|
||||
|
||||
@ -2370,9 +2358,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Documents, spreadsheets, images, audio, and video are considered as source context.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2228157968"] = "Documents, spreadsheets, images, audio, and video are considered as source context."
|
||||
|
||||
-- Compile and save
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2332777012"] = "Compile and save"
|
||||
|
||||
-- Target language
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T237828418"] = "Target language"
|
||||
|
||||
@ -2433,15 +2418,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Enter a new name for this visual briefing.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2782842014"] = "Enter a new name for this visual briefing."
|
||||
|
||||
-- Prepare sources
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2838352358"] = "Prepare sources"
|
||||
|
||||
-- Linked sources
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2857875074"] = "Linked sources"
|
||||
|
||||
-- Action required
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2870470104"] = "Action required"
|
||||
|
||||
-- import
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T288002260"] = "import"
|
||||
|
||||
@ -2454,9 +2433,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Opened the visual briefing project folder.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T2964042492"] = "Opened the visual briefing project folder."
|
||||
|
||||
-- Resume build
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3016389190"] = "Resume build"
|
||||
|
||||
-- Visual assets
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3226971402"] = "Visual assets"
|
||||
|
||||
@ -2472,9 +2448,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Could not open the visual briefing project folder.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3290777125"] = "Could not open the visual briefing project folder."
|
||||
|
||||
-- {0} in progress...
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3291403991"] = "{0} in progress..."
|
||||
|
||||
-- The visual briefing was imported.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3348040099"] = "The visual briefing was imported."
|
||||
|
||||
@ -2505,15 +2478,9 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Author (optional)
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3529399925"] = "Author (optional)"
|
||||
|
||||
-- Not started
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3531294543"] = "Not started"
|
||||
|
||||
-- The visual briefing project folder is not available.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3564616779"] = "The visual briefing project folder is not available."
|
||||
|
||||
-- Plan briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3576809882"] = "Plan briefing"
|
||||
|
||||
-- The visual briefing recompilation failed unexpectedly. Copy the technical details for support.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3614047460"] = "The visual briefing recompilation failed unexpectedly. Copy the technical details for support."
|
||||
|
||||
@ -2547,9 +2514,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Choose a different export location so the immutable briefing version is not overwritten.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3955270674"] = "Choose a different export location so the immutable briefing version is not overwritten."
|
||||
|
||||
-- Completed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3968379570"] = "Completed"
|
||||
|
||||
-- Show source references
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T3977003073"] = "Show source references"
|
||||
|
||||
@ -2559,9 +2523,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- unchanged
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4017131198"] = "unchanged"
|
||||
|
||||
-- Design presentation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4023219825"] = "Design presentation"
|
||||
|
||||
-- Create briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4028101071"] = "Create briefing"
|
||||
|
||||
@ -2577,9 +2538,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- transcript outdated
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4158473953"] = "transcript outdated"
|
||||
|
||||
-- Canceled
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4165352378"] = "Canceled"
|
||||
|
||||
-- Large visual briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T4198749440"] = "Large visual briefing"
|
||||
|
||||
@ -2607,9 +2565,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- The briefing was recompiled with the current AI Studio version.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T453632597"] = "The briefing was recompiled with the current AI Studio version."
|
||||
|
||||
-- Reused
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T48113973"] = "Reused"
|
||||
|
||||
-- The updated content no longer fits the current presentation. You can continue as a rebuild without another content model call.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T494870741"] = "The updated content no longer fits the current presentation. You can continue as a rebuild without another content model call."
|
||||
|
||||
@ -2652,9 +2607,6 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- Please provide a briefing name.
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T902674552"] = "Please provide a briefing name."
|
||||
|
||||
-- Build progress
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T909046610"] = "Build progress"
|
||||
|
||||
-- Briefing settings
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T937201158"] = "Briefing settings"
|
||||
|
||||
@ -2667,6 +2619,54 @@ UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::
|
||||
-- The media file changed. Transcribe it again with the configured transcription provider?
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGASSISTANT::T998394163"] = "The media file changed. Transcribe it again with the configured transcription provider?"
|
||||
|
||||
-- Running
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T1160324588"] = "Running"
|
||||
|
||||
-- Failed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T1434043348"] = "Failed"
|
||||
|
||||
-- Curate content
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T1458812674"] = "Curate content"
|
||||
|
||||
-- Analyze material
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T204596900"] = "Analyze material"
|
||||
|
||||
-- Compile and save
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T2332777012"] = "Compile and save"
|
||||
|
||||
-- Prepare sources
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T2838352358"] = "Prepare sources"
|
||||
|
||||
-- Action required
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T2870470104"] = "Action required"
|
||||
|
||||
-- Resume build
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3016389190"] = "Resume build"
|
||||
|
||||
-- {0} in progress...
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3291403991"] = "{0} in progress..."
|
||||
|
||||
-- Not started
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3531294543"] = "Not started"
|
||||
|
||||
-- Plan briefing
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3576809882"] = "Plan briefing"
|
||||
|
||||
-- Completed
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T3968379570"] = "Completed"
|
||||
|
||||
-- Design presentation
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T4023219825"] = "Design presentation"
|
||||
|
||||
-- Canceled
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T4165352378"] = "Canceled"
|
||||
|
||||
-- Reused
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T48113973"] = "Reused"
|
||||
|
||||
-- Build progress
|
||||
UI_TEXT_CONTENT["AISTUDIO::ASSISTANTS::VISUALBRIEFING::VISUALBRIEFINGBUILDPROGRESS::T909046610"] = "Build progress"
|
||||
|
||||
-- System
|
||||
UI_TEXT_CONTENT["AISTUDIO::CHAT::CHATROLEEXTENSIONS::T2402387132"] = "System"
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user