Added the visual briefing assistant (#893)
Build and Release / Determine run mode (push) Has been cancelled
Build and Release / Read metadata (push) Has been cancelled
Build and Release / Sync Flatpak repo (push) Has been cancelled
Build and Release / Collect Flatpak artifacts (push) Has been cancelled
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-apple-darwin, osx-arm64, macos-latest, aarch64-apple-darwin, dmg,app,updater, dmg) (push) Has been cancelled
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-pc-windows-msvc.exe, win-arm64, windows-latest, aarch64-pc-windows-msvc, nsis,updater, nsis) (push) Has been cancelled
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-aarch64-unknown-linux-gnu, linux-arm64, ubuntu-22.04-arm, aarch64-unknown-linux-gnu, appimage,updater, appimage) (push) Has been cancelled
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-apple-darwin, osx-x64, macos-latest, x86_64-apple-darwin, dmg,app,updater, dmg) (push) Has been cancelled
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-pc-windows-msvc.exe, win-x64, windows-latest, x86_64-pc-windows-msvc, nsis,updater, nsis) (push) Has been cancelled
Build and Release / Build app (${{ matrix.dotnet_runtime }}) (-x86_64-unknown-linux-gnu, linux-x64, ubuntu-22.04, x86_64-unknown-linux-gnu, appimage,updater, appimage) (push) Has been cancelled
Build and Release / Prepare & create release (push) Has been cancelled
Build and Release / Publish release (push) Has been cancelled

This commit is contained in:
Thorsten Sommer authored and GitHub committed 2026-08-02 21:41:12 +02:00
1 parent df4663fff4
commit 58cc811a58
214 files changed
+18943 -353

No files matched your search

@@ -0,0 +1,30 @@
using AIStudio.Chat;
namespace AIStudio.Tools.Media;
/// <summary>
/// Persists a completed media transcript for a feature-specific owner.
/// </summary>
public interface IMediaTranscriptStorage
{
/// <summary>
/// Determines whether this storage handles the specified media-import owner.
/// </summary>
/// <param name="owner">The feature-specific media-import owner.</param>
/// <returns><see langword="true"/> when the transcript can be stored.</returns>
bool CanStore(MediaImportOwner owner);
/// <summary>
/// Persists a completed transcript and returns the attachment exposed to the calling workflow.
/// </summary>
/// <param name="target">The stable media-import target.</param>
/// <param name="originalMediaPath">The original media path.</param>
/// <param name="transcript">The completed transcript text.</param>
/// <param name="token">The cancellation token.</param>
/// <returns>The attachment representing the persisted transcript.</returns>
Task<FileAttachment> StoreAsync(
MediaImportTarget target,
string originalMediaPath,
string transcript,
CancellationToken token);
}
@@ -8,4 +8,11 @@ public readonly record struct MediaImportOwner(MediaImportOwnerKind Kind, string
public static MediaImportOwner ForChat(Guid chatId) => new(MediaImportOwnerKind.CHAT, chatId.ToString("N"));
public static MediaImportOwner ForAssistant(AssistantSessionKey key) => new(MediaImportOwnerKind.ASSISTANT, key.ToString());
/// <summary>
/// Creates a persistent media-import owner for a visual briefing.
/// </summary>
/// <param name="briefingId">The stable briefing identifier.</param>
/// <returns>The media-import owner.</returns>
public static MediaImportOwner ForVisualBriefing(Guid briefingId) => new(MediaImportOwnerKind.VISUAL_BRIEFING, briefingId.ToString("D"));
}
@@ -5,4 +5,17 @@ public enum MediaImportOwnerKind
{
CHAT,
ASSISTANT,
/// <summary>
/// Identifies persistent media transcripts owned by a visual briefing.
/// </summary>
/// <remarks>
/// A visual briefing cannot use <see cref="ASSISTANT"/>: that kind is keyed by an assistant
/// session, which ends when the user navigates away or closes the app. A briefing is a stored
/// document that outlives both, and its transcripts are stored next to it. The owner is
/// therefore keyed by the briefing ID, see <see cref="MediaImportOwner.ForVisualBriefing"/>.
/// This is what lets AI Studio re-associate transcripts with the right briefing after a
/// restart, and what lets the UI show a running import on the briefing it belongs to.
/// </remarks>
VISUAL_BRIEFING,
}
@@ -0,0 +1,19 @@
namespace AIStudio.Tools.Media;
/// <summary>Capabilities of a media-import owner kind.</summary>
public static class MediaImportOwnerKindExtensions
{
/// <summary>
/// Gets whether the owner stores its own source list and transcripts.
/// </summary>
/// <remarks>
/// Owners that persist their own sources take the attached media over immediately and keep it
/// next to the stored document, see <see cref="MediaImportOwnerKind.VISUAL_BRIEFING"/>. The
/// attachment control must therefore neither wait for the transcription to finish before showing
/// the file, nor deliver the completed transcripts back into its own list afterwards, because
/// the owner already holds them. All other owners rely on that delivery instead.
/// </remarks>
/// <param name="kind">The owner kind to look up.</param>
/// <returns><c>true</c> when the owner persists its own sources.</returns>
public static bool PersistsOwnSources(this MediaImportOwnerKind kind) => kind is MediaImportOwnerKind.VISUAL_BRIEFING;
}