diff --git a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua
index 40df7acf..334a6c68 100644
--- a/app/MindWork AI Studio/Assistants/I18N/allTexts.lua
+++ b/app/MindWork AI Studio/Assistants/I18N/allTexts.lua
@@ -6364,6 +6364,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T214675
-- Edit ERI v1 Data Source
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T221059217"] = "Edit ERI v1 Data Source"
+-- Indexed files
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2235289713"] = "Indexed files"
+
-- Edit Local File Data Source
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2453292893"] = "Edit Local File Data Source"
@@ -6373,6 +6376,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T262437
-- Name
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T266367750"] = "Name"
+-- Not applicable
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2675917723"] = "Not applicable"
+
-- No valid embedding
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T2698203405"] = "No valid embedding"
@@ -6415,6 +6421,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T359566
-- Local data sources refresh when files change.
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3687976654"] = "Local data sources refresh when files change."
+-- Not available
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3706935413"] = "Not available"
+
-- Export ERI Data Source
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T3831281036"] = "Export ERI Data Source"
@@ -6424,6 +6433,12 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T386503
-- This ERI data source has an access token configured. Do you want to include the encrypted access token in the export? Note: The recipient will need the same encryption secret to use the access token.
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T4027572258"] = "This ERI data source has an access token configured. Do you want to include the encrypted access token in the export? Note: The recipient will need the same encryption secret to use the access token."
+-- Waiting for indexing status
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T4108252513"] = "Waiting for indexing status"
+
+-- Information
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T4256323669"] = "Information"
+
-- Configured Data Sources
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T543942217"] = "Configured Data Sources"
@@ -6439,6 +6454,9 @@ UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T774473
-- Cannot export this ERI data source because no authentication secret is configured. The issue was: {0}
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T782820095"] = "Cannot export this ERI data source because no authentication secret is configured. The issue was: {0}"
+-- {0} of {1}
+UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T825342513"] = "{0} of {1}"
+
-- Local data sources refresh only when triggered manually.
UI_TEXT_CONTENT["AISTUDIO::DIALOGS::SETTINGS::SETTINGSDIALOGDATASOURCES::T854231603"] = "Local data sources refresh only when triggered manually."
diff --git a/app/MindWork AI Studio/Components/DataSourceSelection.razor b/app/MindWork AI Studio/Components/DataSourceSelection.razor
index 74566d7e..08ae07ec 100644
--- a/app/MindWork AI Studio/Components/DataSourceSelection.razor
+++ b/app/MindWork AI Studio/Components/DataSourceSelection.razor
@@ -1,4 +1,5 @@
@using AIStudio.Settings
+@using AIStudio.Provider
@inherits MSGComponentBase
@if (this.SelectionMode is DataSourceSelectionMode.SELECTION_MODE)
{
@@ -92,7 +93,18 @@
@foreach (var source in this.availableDataSources)
{
- @source.Name
+
+
+ @source.Name
+
+ @if (source is IInternalDataSource)
+ {
+
+
+
+
+ }
+
}
@@ -106,7 +118,18 @@
@foreach (var source in this.availableDataSources)
{
- @source.Name
+
+
+ @source.Name
+
+ @if (source is IInternalDataSource)
+ {
+
+
+
+
+ }
+
}
@@ -117,9 +140,18 @@
{
-
- @source.DataSource.Name
-
+
+
+ @source.DataSource.Name
+
+ @if (source.DataSource is IInternalDataSource)
+ {
+
+
+
+
+ }
+
@@ -170,7 +202,18 @@ else if (this.SelectionMode is DataSourceSelectionMode.CONFIGURATION_MODE)
@foreach (var source in this.availableDataSources)
{
- @source.Name
+
+
+ @source.Name
+
+ @if (source is IInternalDataSource)
+ {
+
+
+
+
+ }
+
}
diff --git a/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs b/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs
index 7f11972a..50e7164d 100644
--- a/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs
+++ b/app/MindWork AI Studio/Components/DataSourceSelection.razor.cs
@@ -1,4 +1,5 @@
using AIStudio.Dialogs.Settings;
+using AIStudio.Provider;
using AIStudio.Settings;
using AIStudio.Settings.DataModel;
using AIStudio.Tools.Services;
@@ -141,6 +142,8 @@ public partial class DataSourceSelection : MSGComponentBase
private IReadOnlyCollection GetSelectedDataSourcesWithAI() => this.DataSourcesAISelected.Where(n => n.Selected).ToList();
private string GetAIReasoning(DataSourceAgentSelected source) => $"AI reasoning (confidence {source.AIDecision.Confidence:P0}): {source.AIDecision.Reason}";
+
+ private string GetConfidenceIconStyle(IDataSource source) => $"{source.ComplianceLevel.SetColorStyle(this.SettingsManager)} flex-shrink: 0;";
public void ChangeOptionWithoutSaving(DataSourceOptions options, IReadOnlyList? aiSelectedDataSources = null)
{
@@ -308,4 +311,4 @@ public partial class DataSourceSelection : MSGComponentBase
}
#endregion
-}
\ No newline at end of file
+}
diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor
index e6d58126..308e20c5 100644
--- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor
+++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor
@@ -1,3 +1,4 @@
+@using AIStudio.Settings
@using AIStudio.Settings.DataModel
@inherits SettingsDialogBase
@@ -16,35 +17,56 @@
-
- @T("Refresh all")
-
+
+
+
+ @{ var embeddingStatuses = this.DataSourceEmbeddingService.GetStatuses().ToDictionary(status => status.DataSourceId, StringComparer.OrdinalIgnoreCase); }
-
-
-
+
+
+
+
#
@T("Name")
@T("Type")
@T("Embedding")
+ @T("Indexed files")
@T("Actions")
+ @{ var embeddingStatus = embeddingStatuses.GetValueOrDefault(context.Id); }
@context.Num
- @context.Name
- @context.Type.GetDisplayName()
- @this.GetEmbeddingName(context)
+ @context.Name
+ @context.Type.GetDisplayName()
+ @this.GetEmbeddingName(context)
+
+ @if (context is IInternalDataSource)
+ {
+
+
+
+ @(embeddingStatus is null ? T("Not available") : string.Format(T("{0} of {1}"), embeddingStatus.IndexedFiles, embeddingStatus.TotalFiles))
+
+
+ }
+ else
+ {
+ @T("Not applicable")
+ }
+
-
-
+
+
+
+
@if (context.IsEnterpriseConfiguration)
{
@@ -53,21 +75,21 @@
}
else
{
-
- @T("Edit")
-
-
- @T("Refresh")
-
+
+
+
+
+
+
@if (this.SettingsManager.ConfigurationData.App.ShowAdminSettings && context is DataSourceERI_V1)
{
-
+
}
-
- @T("Delete")
-
+
+
+
}
@@ -81,21 +103,23 @@
}
-
-
- @T("External Data (ERI-Server v1)")
-
-
- @T("Local Directory")
-
-
- @T("Local File")
-
-
-
- @T("Close")
-
+
+
+
+ @T("External Data (ERI-Server v1)")
+
+
+ @T("Local Directory")
+
+
+ @T("Local File")
+
+
+
+ @T("Close")
+
+
diff --git a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs
index a6136595..25680fa9 100644
--- a/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs
+++ b/app/MindWork AI Studio/Dialogs/Settings/SettingsDialogDataSources.razor.cs
@@ -12,6 +12,29 @@ public partial class SettingsDialogDataSources : SettingsDialogBase
[Inject]
private DataSourceEmbeddingService DataSourceEmbeddingService { get; init; } = null!;
+ protected override async Task OnInitializedAsync()
+ {
+ await base.OnInitializedAsync();
+ this.ApplyFilters([], [ Event.CONFIGURATION_CHANGED, Event.RAG_EMBEDDING_STATUS_CHANGED ]);
+ }
+
+ protected override async Task ProcessIncomingMessage(ComponentBase? sendingComponent, Event triggeredEvent, T? data) where T : default
+ {
+ await base.ProcessIncomingMessage(sendingComponent, triggeredEvent, data);
+ if (triggeredEvent is Event.RAG_EMBEDDING_STATUS_CHANGED)
+ this.StateHasChanged();
+ }
+
+ private static Color GetIndexingStatusColor(DataSourceEmbeddingStatus? status)
+ {
+ if (status is null || status.State is DataSourceEmbeddingState.IDLE or DataSourceEmbeddingState.QUEUED or DataSourceEmbeddingState.RUNNING)
+ return Color.Warning;
+
+ return status.State is DataSourceEmbeddingState.FAILED || status.FailedFiles > 0
+ ? Color.Error
+ : Color.Success;
+ }
+
private string GetEmbeddingName(IDataSource dataSource)
{
if(dataSource is IInternalDataSource internalDataSource)
diff --git a/app/MindWork AI Studio/Provider/ConfidenceLevelExtensions.cs b/app/MindWork AI Studio/Provider/ConfidenceLevelExtensions.cs
index 426bdffb..ccfdcd1f 100644
--- a/app/MindWork AI Studio/Provider/ConfidenceLevelExtensions.cs
+++ b/app/MindWork AI Studio/Provider/ConfidenceLevelExtensions.cs
@@ -25,6 +25,9 @@ public static class ConfidenceLevelExtensions
public static string GetColor(this ConfidenceLevel level, SettingsManager settingsManager) => (level, settingsManager.IsDarkMode) switch
{
(ConfidenceLevel.NONE, _) => "#cccccc",
+
+ (ConfidenceLevel.UNKNOWN, false) => "#777777",
+ (ConfidenceLevel.UNKNOWN, true) => "#aaaaaa",
(ConfidenceLevel.UNTRUSTED, false) => "#ff0000",
(ConfidenceLevel.UNTRUSTED, true) => "#800000",