diff --git a/src/NexusReader.UI.Shared/Components/Organisms/GlobalIntelligence.razor b/src/NexusReader.UI.Shared/Components/Organisms/GlobalIntelligence.razor
index 15674f9..fa67ad8 100644
--- a/src/NexusReader.UI.Shared/Components/Organisms/GlobalIntelligence.razor
+++ b/src/NexusReader.UI.Shared/Components/Organisms/GlobalIntelligence.razor
@@ -8,7 +8,6 @@
@namespace NexusReader.UI.Shared.Components.Organisms
@inject HttpClient Http
@inject IKnowledgeService KnowledgeService
-@inject AuthenticationStateProvider AuthStateProvider
@inject IReaderNavigationService NavigationService
@@ -169,8 +168,29 @@
@code {
+ private static readonly System.Text.RegularExpressions.Regex CitationRegex = new(
+ @"\[Source ID:\s*([^\]]+)\]|\[([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})\]",
+ System.Text.RegularExpressions.RegexOptions.IgnoreCase | System.Text.RegularExpressions.RegexOptions.Compiled);
+
+ private static readonly System.Text.RegularExpressions.Regex BoldRegex = new(
+ @"\*\*(.*?)\*\*",
+ System.Text.RegularExpressions.RegexOptions.Compiled);
+
+ private static readonly System.Text.RegularExpressions.Regex ItalicRegex = new(
+ @"\*(.*?)\*",
+ System.Text.RegularExpressions.RegexOptions.Compiled);
+
+ private static readonly System.Text.RegularExpressions.Regex CodeBlockRegex = new(
+ @"```(?:[a-zA-Z0-9+#]+)?\s*([\s\S]*?)\s*```",
+ System.Text.RegularExpressions.RegexOptions.Compiled);
+
+ private static readonly System.Text.RegularExpressions.Regex InlineCodeRegex = new(
+ @"`(.*?)`",
+ System.Text.RegularExpressions.RegexOptions.Compiled);
+
[Parameter] public bool IsOpen { get; set; }
[Parameter] public EventCallback OnClose { get; set; }
+ [Parameter] public string? TenantId { get; set; }
private string _question = string.Empty;
private bool _isLoading;
@@ -245,8 +265,7 @@
ebookId = NavigationService.CurrentEbookId;
}
- var authState = await AuthStateProvider.GetAuthenticationStateAsync();
- var tenantId = authState.User.FindFirst("TenantId")?.Value ?? "global";
+ var tenantId = TenantId ?? "global";
var result = await KnowledgeService.AskQuestionAsync(userQuestion, tenantId, ebookId);
if (result.IsSuccess)
@@ -293,10 +312,7 @@
var segments = new List();
if (string.IsNullOrEmpty(text)) return segments;
- var regex = new System.Text.RegularExpressions.Regex(
- @"\[Source ID:\s*([^\]]+)\]|\[([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})\]",
- System.Text.RegularExpressions.RegexOptions.IgnoreCase);
- var matches = regex.Matches(text);
+ var matches = CitationRegex.Matches(text);
int lastIndex = 0;
foreach (System.Text.RegularExpressions.Match match in matches)
@@ -340,10 +356,10 @@
if (string.IsNullOrEmpty(text)) return new MarkupString(string.Empty);
var html = System.Net.WebUtility.HtmlEncode(text);
- html = System.Text.RegularExpressions.Regex.Replace(html, @"\*\*(.*?)\*\*", "$1");
- html = System.Text.RegularExpressions.Regex.Replace(html, @"\*(.*?)\*", "$1");
- html = System.Text.RegularExpressions.Regex.Replace(html, @"```(?:[a-zA-Z0-9+#]+)?\s*([\s\S]*?)\s*```", "$1
");
- html = System.Text.RegularExpressions.Regex.Replace(html, @"`(.*?)`", "$1");
+ html = BoldRegex.Replace(html, "$1");
+ html = ItalicRegex.Replace(html, "$1");
+ html = CodeBlockRegex.Replace(html, "$1
");
+ html = InlineCodeRegex.Replace(html, "$1");
html = html.Replace("\n", "
");
return new MarkupString(html);
diff --git a/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor.css b/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor.css
index 3d10e86..fac7f04 100644
--- a/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor.css
+++ b/src/NexusReader.UI.Shared/Components/Organisms/ReaderCanvas.razor.css
@@ -372,4 +372,4 @@
.theme-light .nexus-chapter-nav-btn:hover:not(:disabled) {
background: rgba(0, 0, 0, 0.06);
-}
\ No newline at end of file
+}
diff --git a/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor b/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor
index bdf5c70..f802a2b 100644
--- a/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor
+++ b/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor
@@ -233,7 +233,7 @@
OnAssistantClick="OpenAssistant"
Checkpoints="@StateService.CurrentCheckpoints" />
-
+
}
diff --git a/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor.css b/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor.css
index 6e97fae..7b633c6 100644
--- a/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor.css
+++ b/src/NexusReader.UI.Shared/Layout/ReaderLayout.razor.css
@@ -647,4 +647,4 @@ main {
overflow-y: auto;
}
-/* Obsolescence managed: consolidated mobile toolbar and sheet styled inside respective components */
\ No newline at end of file
+/* Obsolescence managed: consolidated mobile toolbar and sheet styled inside respective components */
diff --git a/src/NexusReader.UI.Shared/Pages/SerilogDemo.razor b/src/NexusReader.UI.Shared/Pages/SerilogDemo.razor
index 8e2efbb..140ae01 100644
--- a/src/NexusReader.UI.Shared/Pages/SerilogDemo.razor
+++ b/src/NexusReader.UI.Shared/Pages/SerilogDemo.razor
@@ -101,6 +101,8 @@ else
}
@code {
+ // Compile-time check ensures _isDebug is baked as false in Release/Test/Production builds,
+ // which completely bypasses/strips rendering of the diagnostic UI and avoids exposing internal controls.
#if DEBUG
private readonly bool _isDebug = true;
#else