diff --git a/.localpilot/map.txt b/.localpilot/map.txt
index 169d8d0..66bb0bf 100644
--- a/.localpilot/map.txt
+++ b/.localpilot/map.txt
@@ -1,13 +1,13 @@
## WORKSPACE EXECUTIVE SUMMARY (YAML)
-# Generated: 2026-05-21T10:41:25.5071284+02:00
+# Generated: 2026-05-23T07:48:43.1838976+02:00
# Root: E:\ollama_net\ollama\AuthorBuddy.Web
Architecture:
Type: Backend (C#/.NET)
- Scale: 38 relevant source files
+ Scale: 42 relevant source files
Components: 0
Controllers: 0
Models: 8
- Services: 16
+ Services: 18
---
- File: AuthorBuddy.Web.csproj
Preview: " net10.0 enable en..."
@@ -20,68 +20,109 @@ Architecture:
- File: Program.cs
Preview: "using AuthorBuddy.Web.Components; using AuthorBuddy.Web.Models; using AuthorBuddy.Web.Services; using LiteDB; using Microsoft.AspNetCore.Authenticatio..."
- File: Data\DocumentMetaEntity.cs
+ Symbols: [DocumentMetaEntity]
Preview: "namespace AuthorBuddy.Web.Data; public class DocumentMetaEntity { public int Id { get; set; } public int? ProjectId { get; set; } public string ..."
- File: Data\DocumentVector.cs
+ Symbols: [DocumentVector]
Preview: "namespace AuthorBuddy.Web.Data; public class DocumentVector { public int Id { get; set; } public int DocumentMetaId { get; set; } public int Pro..."
- File: Data\ProjectEntity.cs
+ Symbols: [ProjectEntity]
Preview: "namespace AuthorBuddy.Web.Data; public class ProjectEntity { public int Id { get; set; } public string Name { get; set; } = string.Empty; public..."
- File: Data\SettingEntity.cs
+ Symbols: [SettingEntity]
Preview: "using LiteDB; namespace AuthorBuddy.Web.Data; public class SettingEntity { public int Id { get; set; } public string Key { get; set; } = string.Em..."
- File: Data\UserEntity.cs
- Preview: "namespace AuthorBuddy.Web.Data; public class UserEntity { public int Id { get; set; } public string Name { get; set; } = string.Empty; public bo..."
+ Symbols: [UserEntity]
+ Preview: "namespace AuthorBuddy.Web.Data; public class UserEntity { public int Id { get; set; } public string Name { get; set; } = string.Empty; public st..."
- File: Models\Chapter.cs
+ Symbols: [Chapter]
Preview: "namespace AuthorBuddy.Web.Models; public class Chapter { public string Title { get; set; } = string.Empty; public string FilePath { get; set; } = ..."
- File: Models\Constants.cs
+ Symbols: [Constants]
Preview: "namespace AuthorBuddy.Web.Models; public static class Constants { public static readonly string[] SubFolders = { '00_Drafts', '01_Fakten/Per..."
- File: Models\FileTreeItem.cs
+ Symbols: [FileTreeItem]
Preview: "namespace AuthorBuddy.Web.Models; public class FileTreeItem { public string Name { get; set; } = string.Empty; public string FullPath { get; set; ..."
- File: Models\LLM_Model.cs
+ Symbols: [LLM_Model, LLM_Model]
Preview: "using System.Text.Json; namespace AuthorBuddy.Web.Models { public class LLM_Model { public LLM_Model(JsonElement model) { if (mode..."
- File: Models\ModelStatus.cs
+ Symbols: [ModelStatus]
Preview: " //namespace AuthorBuddy.Web.Models; //public class ModelStatus //{ // public string Status { get; private set; } = 'Unknown'; // public double Prog..."
- File: Models\OllamaSettings.cs
+ Symbols: [OllamaSettings]
Preview: "namespace AuthorBuddy.Web.Models; public class OllamaSettings { public string StyleModel { get; set; } = 'gemma4:e4b'; public string EmbedModel { ..."
- File: Models\Project.cs
+ Symbols: [Project]
Preview: "namespace AuthorBuddy.Web.Models; public class Project { public int Id { get; internal set; } public string Name { get; internal set; } = string.E..."
- File: Models\WikipediaResult.cs
+ Symbols: [WikipediaResult]
Preview: "namespace AuthorBuddy.Web.Models; public class WikipediaResult { public string Title { get; set; } = string.Empty; public string Snippet { get; se..."
- File: Properties\launchSettings.json
Preview: "{ '$schema': 'https://json.schemastore.org/launchsettings.json', 'profiles': { 'http': { 'commandName': 'Project', 'dotnetRunMessages': ..."
+- File: Resources\de.json
+ Preview: "{ 'common.status.ready': 'Bereit', 'common.cancel': 'Abbrechen', 'common.error': 'Fehler:', 'common.copy': 'Kopieren', 'common.status.error': 'Fe..."
+- File: Resources\en.json
+ Preview: "{ 'common.status.ready': 'Ready', 'common.cancel': 'Cancel', 'common.error': 'Error:', 'common.copy': 'Copy', 'common.status.error': 'Error', 'p..."
- File: Services\AuthService.cs
+ Symbols: [AuthService]
Preview: "using AuthorBuddy.Web.Data; using LiteDB; namespace AuthorBuddy.Web.Services; public class AuthService : IAuthService { private readonly ILiteDataba..."
- File: Services\CustomAuthStateProvider.cs
+ Symbols: [CustomAuthStateProvider]
Preview: "using System.Security.Claims; using Microsoft.AspNetCore.Components.Authorization; namespace AuthorBuddy.Web.Services; public class CustomAuthStatePro..."
- File: Services\FileScannerService.cs
+ Symbols: [FileScannerService]
Preview: "using AuthorBuddy.Web.Data; using LiteDB; namespace AuthorBuddy.Web.Services; public class FileScannerService : IFileScannerService { private readon..."
- File: Services\IAuthService.cs
+ Symbols: [IAuthService]
Preview: "using AuthorBuddy.Web.Data; namespace AuthorBuddy.Web.Services; public interface IAuthService { Task LoginAsync(string username, string passwo..."
- File: Services\IFileScannerService.cs
+ Symbols: [IFileScannerService]
Preview: "namespace AuthorBuddy.Web.Services; public interface IFileScannerService { Task ScanProjectFolderAsync(int projectId, string rootPath, IProgress> GetLocalModelsAsyn..."
- File: Services\IProjectService.cs
+ Symbols: [IProjectService]
Preview: "using AuthorBuddy.Web.Models; namespace AuthorBuddy.Web.Services; public interface IProjectService { Task CreateNewProjectAsync(string projectN..."
- File: Services\IRagService.cs
+ Symbols: [IRagServi, RagSearchResult]
Preview: "namespace AuthorBuddy.Web.Services; public class RagSearchResult { public string Text { get; set; } = string.Empty; public string FilePath { get; ..."
- File: Services\ISettingsService.cs
+ Symbols: [ISettingsService]
Preview: "using AuthorBuddy.Web.Data; namespace AuthorBuddy.Web.Services; public interface ISettingsService { Task GetOllamaUrlAsync(); Task> SearchAsync(strin..."
+- File: Services\LocalizationService.cs
+ Symbols: [LocalizationService]
+ Preview: "using System.Text.Json; namespace AuthorBuddy.Web.Services; public class LocalizationService : ILocalizationService { private readonly ISettingsServ..."
- File: Services\OllamaService.cs
+ Symbols: [OllamaService]
Preview: "using AuthorBuddy.Web.Models; using System.Text.Json; using static System.Net.Mime.MediaTypeNames; namespace AuthorBuddy.Web.Services; public class Ol..."
- File: Services\ProjectService.cs
+ Symbols: [ProjectService]
Preview: "using AuthorBuddy.Web.Data; using AuthorBuddy.Web.Models; using LiteDB; namespace AuthorBuddy.Web.Services; public class ProjectService : IProjectServ..."
- File: Services\RagService.cs
+ Symbols: [RagService]
Preview: "using AuthorBuddy.Web.Data; using LiteDB; using System.Security.Cryptography; using System.Text; namespace AuthorBuddy.Web.Services; public class RagS..."
- File: Services\SettingsService.cs
+ Symbols: [SettingsService]
Preview: "using AuthorBuddy.Web.Data; using AuthorBuddy.Web.Models; using LiteDB; namespace AuthorBuddy.Web.Services; public class SettingsService : ISettingsSe..."
- File: Services\ThemeService.cs
- Preview: "using Microsoft.JSInterop; namespace AuthorBuddy.Web.Services; public class ThemeService : IThemeService { private readonly IJSRuntime _js; public..."
+ Symbols: [ThemeService]
+ Preview: "using Microsoft.JSInterop; using System.Reflection.Metadata.Ecma335; namespace AuthorBuddy.Web.Services; public class ThemeService : IThemeService { ..."
- File: Services\TotpHelper.cs
+ Symbols: [TotpHelper]
Preview: "using System.Security.Cryptography; namespace AuthorBuddy.Web.Services; public static class TotpHelper { private const int TotpSize = 6; private c..."
- File: Services\WikipediaService.cs
+ Symbols: [WikipediaService]
Preview: "using AuthorBuddy.Web.Models; using System.Text.Json; using System.Web; namespace AuthorBuddy.Web.Services; public class WikipediaService : IWikipedia..."
- File: Components\Layout\ReconnectModal.razor.js
Preview: "// Set up event handlers const reconnectModal = document.getElementById('components-reconnect-modal'); reconnectModal.addEventListener('components-rec..."
diff --git a/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.backup.json b/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.backup.json
index 112ca06..1569913 100644
--- a/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.backup.json
+++ b/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.backup.json
@@ -3,29 +3,68 @@
"WorkspaceRootPath": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\",
"Documents": [
{
- "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
- "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
- "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ithemeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ithemeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
- "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\totphelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\totphelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\iragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\iragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\data\\userentity.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:data\\userentity.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg||{58961B49-13E0-48C0-9258-13CBC4D40279}"
},
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\ollamaassistant.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\ollamaassistant.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
},
{
- "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\settings.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
- "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\settings.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\themeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\themeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\assets\\logo.jpg||{58961B49-13E0-48C0-9258-13CBC4D40279}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:assets\\logo.jpg||{58961B49-13E0-48C0-9258-13CBC4D40279}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\redirecttologin.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\redirecttologin.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ollamaservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ollamaservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\login.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\login.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\totphelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\totphelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\settings.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\settings.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
+ },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\models\\ollamasettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:models\\ollamasettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
@@ -34,14 +73,6 @@
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\iollamaservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\iollamaservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
- {
- "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\projectservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\projectservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
@@ -58,10 +89,6 @@
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
- {
- "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\iragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\iragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\editor.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\editor.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
@@ -74,10 +101,6 @@
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:Data\\AppDbContext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
- {
- "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\themeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\themeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
@@ -137,183 +160,103 @@
"Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}"
},
{
- "$type": "Bookmark",
- "Name": "RST:0:0:{b3f9f954-0ca5-0091-76b4-34a47f44c954}"
+ "$type": "Document",
+ "DocumentIndex": 4,
+ "Title": "UserEntity.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\UserEntity.cs",
+ "RelativeDocumentMoniker": "Data\\UserEntity.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\UserEntity.cs",
+ "RelativeToolTip": "Data\\UserEntity.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAqwAIAAAAMAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-24T04:52:42.227Z"
},
{
"$type": "Document",
- "DocumentIndex": 3,
- "Title": "OllamaAssistant.razor",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
- "RelativeDocumentMoniker": "Components\\Pages\\OllamaAssistant.razor",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
- "RelativeToolTip": "Components\\Pages\\OllamaAssistant.razor",
- "ViewState": "AgIAAAkAAAAAAAAAAAAAABEAAAARAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
- "WhenOpened": "2026-05-20T05:14:39.037Z",
- "EditorCaption": ""
+ "DocumentIndex": 5,
+ "Title": "A7405018.jpg",
+ "DocumentMoniker": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg",
+ "ToolTip": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
+ "WhenOpened": "2026-05-23T05:52:56.265Z"
},
{
"$type": "Document",
"DocumentIndex": 0,
- "Title": "MainLayout.razor",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor",
- "RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor*",
- "RelativeToolTip": "Components\\Layout\\MainLayout.razor*",
- "ViewState": "AgIAAMkAAAAAAAAAAAAQwOcAAAARAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
- "WhenOpened": "2026-05-15T16:04:36.444Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 6,
- "Title": "OllamaSettings.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
- "RelativeDocumentMoniker": "Models\\OllamaSettings.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
- "RelativeToolTip": "Models\\OllamaSettings.cs",
- "ViewState": "AgIAAAYAAAAAAAAAAAAkwBQAAAASAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-16T13:39:46.179Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 17,
- "Title": "AppDbContext.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
- "RelativeDocumentMoniker": "Data\\AppDbContext.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
- "RelativeToolTip": "Data\\AppDbContext.cs",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-14T10:50:13.284Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 11,
- "Title": "FileScannerService.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
- "RelativeDocumentMoniker": "Services\\FileScannerService.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
- "RelativeToolTip": "Services\\FileScannerService.cs",
- "ViewState": "AgIAABIAAAAAAAAAAAAQwCUAAAAWAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-16T06:02:53.46Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 7,
- "Title": "IOllamaService.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaService.cs",
- "RelativeDocumentMoniker": "Services\\IOllamaService.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaService.cs",
- "RelativeToolTip": "Services\\IOllamaService.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAqwAkAAAAPAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-16T07:20:19.212Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "Program.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Program.cs",
- "RelativeDocumentMoniker": "Program.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Program.cs*",
- "RelativeToolTip": "Program.cs*",
- "ViewState": "AgIAABgAAAAAAAAAAAAAADAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-20T04:07:21.54Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 2,
- "Title": "TotpHelper.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
- "RelativeDocumentMoniker": "Services\\TotpHelper.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
- "RelativeToolTip": "Services\\TotpHelper.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-21T08:20:49.461Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 12,
- "Title": "Project.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
- "RelativeDocumentMoniker": "Models\\Project.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
- "RelativeToolTip": "Models\\Project.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAAaAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-15T15:57:10.2Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 4,
- "Title": "Settings.razor",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Settings.razor",
- "RelativeDocumentMoniker": "Components\\Pages\\Settings.razor",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Settings.razor",
- "RelativeToolTip": "Components\\Pages\\Settings.razor",
- "ViewState": "AgIAAAwAAAAAAAAAAAAAAIYAAAAlAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
- "WhenOpened": "2026-05-15T16:43:26.6Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 8,
"Title": "SettingsService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\SettingsService.cs",
"RelativeDocumentMoniker": "Services\\SettingsService.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\SettingsService.cs",
"RelativeToolTip": "Services\\SettingsService.cs",
- "ViewState": "AgIAAEUBAAAAAAAAAAAQwFwBAAAAAAAAAAAAAA==",
+ "ViewState": "AgIAAAMBAAAAAAAAAAAAABsBAAApAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-16T06:05:12.928Z"
+ "WhenOpened": "2026-05-21T17:37:24.777Z",
+ "EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 5,
- "Title": "OllamaService.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaService.cs",
- "RelativeDocumentMoniker": "Services\\OllamaService.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaService.cs",
- "RelativeToolTip": "Services\\OllamaService.cs",
- "ViewState": "AgIAAFkAAAAAAAAAAAAqwGsAAAAeAAAAAAAAAA==",
+ "DocumentIndex": 1,
+ "Title": "IThemeService.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IThemeService.cs",
+ "RelativeDocumentMoniker": "Services\\IThemeService.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IThemeService.cs",
+ "RelativeToolTip": "Services\\IThemeService.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAqwAgAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-16T06:43:46.404Z"
+ "WhenOpened": "2026-05-21T17:32:01.784Z",
+ "EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 13,
- "Title": "RagService.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
- "RelativeDocumentMoniker": "Services\\RagService.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
- "RelativeToolTip": "Services\\RagService.cs",
- "ViewState": "AgIAABIAAAAAAAAAAAAxwBoAAAAIAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-18T15:40:05.413Z"
+ "DocumentIndex": 10,
+ "Title": "RedirectToLogin.razor",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\RedirectToLogin.razor",
+ "RelativeDocumentMoniker": "Components\\RedirectToLogin.razor",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\RedirectToLogin.razor",
+ "RelativeToolTip": "Components\\RedirectToLogin.razor",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAIAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+ "WhenOpened": "2026-05-21T16:31:16.612Z"
},
{
"$type": "Document",
- "DocumentIndex": 9,
+ "DocumentIndex": 6,
+ "Title": "OllamaAssistant.razor",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
+ "RelativeDocumentMoniker": "Components\\Pages\\OllamaAssistant.razor",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
+ "RelativeToolTip": "Components\\Pages\\OllamaAssistant.razor",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAGgAAAAMAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+ "WhenOpened": "2026-05-20T05:14:39.037Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 7,
+ "Title": "MainLayout.razor",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor",
+ "RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor",
+ "RelativeToolTip": "Components\\Layout\\MainLayout.razor",
+ "ViewState": "AgIAAB4BAAAAAAAAAAApwDQBAAApAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+ "WhenOpened": "2026-05-15T16:04:36.444Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 2,
"Title": "ISettingsService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ISettingsService.cs",
"RelativeDocumentMoniker": "Services\\ISettingsService.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ISettingsService.cs",
"RelativeToolTip": "Services\\ISettingsService.cs",
- "ViewState": "AgIAABoAAAAAAAAAAAA8wCoAAAAPAAAAAAAAAA==",
+ "ViewState": "AgIAABwAAAAAAAAAAAA9wC4AAAAZAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-16T13:21:26.951Z"
+ "WhenOpened": "2026-05-21T16:35:36.655Z"
},
{
"$type": "Document",
- "DocumentIndex": 14,
+ "DocumentIndex": 3,
"Title": "IRagService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IRagService.cs",
"RelativeDocumentMoniker": "Services\\IRagService.cs",
@@ -325,7 +268,161 @@
},
{
"$type": "Document",
- "DocumentIndex": 10,
+ "DocumentIndex": 13,
+ "Title": "Login.razor",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor",
+ "RelativeDocumentMoniker": "Components\\Pages\\Login.razor",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor",
+ "RelativeToolTip": "Components\\Pages\\Login.razor",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+ "WhenOpened": "2026-05-21T08:47:41.996Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 8,
+ "Title": "ThemeService.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
+ "RelativeDocumentMoniker": "Services\\ThemeService.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
+ "RelativeToolTip": "Services\\ThemeService.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAABEAAAAdAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-16T13:35:33.991Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 11,
+ "Title": "Program.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Program.cs",
+ "RelativeDocumentMoniker": "Program.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Program.cs",
+ "RelativeToolTip": "Program.cs",
+ "ViewState": "AgIAABwAAAAAAAAAAAAAABIAAAAsAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-20T04:07:21.54Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 12,
+ "Title": "OllamaService.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaService.cs",
+ "RelativeDocumentMoniker": "Services\\OllamaService.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaService.cs",
+ "RelativeToolTip": "Services\\OllamaService.cs",
+ "ViewState": "AgIAAGEAAAAAAAAAAAAcwHsAAAAVAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-16T06:43:46.404Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 9,
+ "Title": "logo.jpg",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Assets\\logo.jpg",
+ "RelativeDocumentMoniker": "Assets\\logo.jpg",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Assets\\logo.jpg",
+ "RelativeToolTip": "Assets\\logo.jpg",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
+ "WhenOpened": "2026-05-21T17:15:10.852Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 16,
+ "Title": "OllamaSettings.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
+ "RelativeDocumentMoniker": "Models\\OllamaSettings.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
+ "RelativeToolTip": "Models\\OllamaSettings.cs",
+ "ViewState": "AgIAAAYAAAAAAAAAAAAkwBQAAAASAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-16T13:39:46.179Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 24,
+ "Title": "AppDbContext.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
+ "RelativeDocumentMoniker": "Data\\AppDbContext.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
+ "RelativeToolTip": "Data\\AppDbContext.cs",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-14T10:50:13.284Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 19,
+ "Title": "FileScannerService.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
+ "RelativeDocumentMoniker": "Services\\FileScannerService.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
+ "RelativeToolTip": "Services\\FileScannerService.cs",
+ "ViewState": "AgIAABIAAAAAAAAAAAAQwCUAAAAWAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-16T06:02:53.46Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 17,
+ "Title": "IOllamaService.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaService.cs",
+ "RelativeDocumentMoniker": "Services\\IOllamaService.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaService.cs",
+ "RelativeToolTip": "Services\\IOllamaService.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAqwAkAAAAPAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-16T07:20:19.212Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 14,
+ "Title": "TotpHelper.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
+ "RelativeDocumentMoniker": "Services\\TotpHelper.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
+ "RelativeToolTip": "Services\\TotpHelper.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-21T08:20:49.461Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 20,
+ "Title": "Project.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
+ "RelativeDocumentMoniker": "Models\\Project.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
+ "RelativeToolTip": "Models\\Project.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAAaAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-15T15:57:10.2Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 15,
+ "Title": "Settings.razor",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Settings.razor",
+ "RelativeDocumentMoniker": "Components\\Pages\\Settings.razor",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Settings.razor",
+ "RelativeToolTip": "Components\\Pages\\Settings.razor",
+ "ViewState": "AgIAAAwAAAAAAAAAAAAAAIYAAAAlAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+ "WhenOpened": "2026-05-15T16:43:26.6Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 21,
+ "Title": "RagService.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
+ "RelativeDocumentMoniker": "Services\\RagService.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
+ "RelativeToolTip": "Services\\RagService.cs",
+ "ViewState": "AgIAABIAAAAAAAAAAAAxwBoAAAAIAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-18T15:40:05.413Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 18,
"Title": "ProjectService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ProjectService.cs",
"RelativeDocumentMoniker": "Services\\ProjectService.cs",
@@ -337,7 +434,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 16,
+ "DocumentIndex": 23,
"Title": "NavMenu.razor",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\NavMenu.razor",
"RelativeDocumentMoniker": "Components\\Layout\\NavMenu.razor",
@@ -349,7 +446,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 15,
+ "DocumentIndex": 22,
"Title": "Editor.razor",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Editor.razor",
"RelativeDocumentMoniker": "Components\\Pages\\Editor.razor",
@@ -357,24 +454,11 @@
"RelativeToolTip": "Components\\Pages\\Editor.razor",
"ViewState": "AgIAAAoAAACA6NuCpTYvwKAAAAAcAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
- "WhenOpened": "2026-05-16T13:01:59.743Z",
- "EditorCaption": ""
+ "WhenOpened": "2026-05-16T13:01:59.743Z"
},
{
"$type": "Document",
- "DocumentIndex": 18,
- "Title": "ThemeService.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
- "RelativeDocumentMoniker": "Services\\ThemeService.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
- "RelativeToolTip": "Services\\ThemeService.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-16T13:35:33.991Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 19,
+ "DocumentIndex": 25,
"Title": "App.razor",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor",
"RelativeDocumentMoniker": "Components\\App.razor",
@@ -386,7 +470,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 22,
+ "DocumentIndex": 28,
"Title": "Models.razor",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor",
"RelativeDocumentMoniker": "Components\\Pages\\Models.razor",
@@ -398,7 +482,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 20,
+ "DocumentIndex": 26,
"Title": "LLM_Model.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs",
"RelativeDocumentMoniker": "Models\\LLM_Model.cs",
@@ -410,7 +494,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 21,
+ "DocumentIndex": 27,
"Title": "ModelStatus.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs",
"RelativeDocumentMoniker": "Models\\ModelStatus.cs",
@@ -422,7 +506,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 25,
+ "DocumentIndex": 31,
"Title": "MainLayout.razor.css",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor.css",
"RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor.css",
@@ -434,7 +518,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 23,
+ "DocumentIndex": 29,
"Title": "IFileScannerService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IFileScannerService.cs",
"RelativeDocumentMoniker": "Services\\IFileScannerService.cs",
@@ -446,7 +530,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 24,
+ "DocumentIndex": 30,
"Title": "bootstrap-utilities.css",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-utilities.css",
"RelativeDocumentMoniker": "wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-utilities.css",
@@ -458,7 +542,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 27,
+ "DocumentIndex": 33,
"Title": "ProjectEntity.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\ProjectEntity.cs",
"RelativeDocumentMoniker": "Data\\ProjectEntity.cs",
@@ -470,7 +554,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 26,
+ "DocumentIndex": 32,
"Title": "IProjectService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IProjectService.cs",
"RelativeDocumentMoniker": "Services\\IProjectService.cs",
@@ -482,7 +566,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 28,
+ "DocumentIndex": 34,
"Title": "AuthorBuddy.Web.csproj",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\AuthorBuddy.Web.csproj",
"RelativeDocumentMoniker": "AuthorBuddy.Web.csproj",
@@ -494,7 +578,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 29,
+ "DocumentIndex": 35,
"Title": "appsettings.json",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\appsettings.json",
"RelativeDocumentMoniker": "appsettings.json",
@@ -503,6 +587,10 @@
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
"WhenOpened": "2026-05-14T10:14:25.605Z"
+ },
+ {
+ "$type": "Bookmark",
+ "Name": "RST:0:0:{b3f9f954-0ca5-0091-76b4-34a47f44c954}"
}
]
}
diff --git a/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.json b/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.json
index 95cca1f..c509723 100644
--- a/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.json
+++ b/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.json
@@ -2,14 +2,57 @@
"Version": 1,
"WorkspaceRootPath": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\",
"Documents": [
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ithemeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ithemeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\iragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\iragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\data\\userentity.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:data\\userentity.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg||{58961B49-13E0-48C0-9258-13CBC4D40279}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\ollamaassistant.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\ollamaassistant.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
+ },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
},
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\themeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\themeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\assets\\logo.jpg||{58961B49-13E0-48C0-9258-13CBC4D40279}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:assets\\logo.jpg||{58961B49-13E0-48C0-9258-13CBC4D40279}"
+ },
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\redirecttologin.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\redirecttologin.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
+ },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:program.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
+ {
+ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ollamaservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
+ "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ollamaservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
+ },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\login.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\login.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
@@ -18,18 +61,10 @@
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\totphelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\totphelper.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
- {
- "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\ollamaassistant.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
- "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\ollamaassistant.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
- },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\settings.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\settings.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
},
- {
- "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ollamaservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ollamaservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\models\\ollamasettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:models\\ollamasettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
@@ -38,14 +73,6 @@
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\iollamaservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\iollamaservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
- {
- "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
- {
- "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\projectservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\projectservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
@@ -62,10 +89,6 @@
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
- {
- "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\iragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\iragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\editor.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\editor.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
@@ -78,10 +101,6 @@
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:Data\\AppDbContext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
- {
- "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\themeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
- "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\themeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
- },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
@@ -140,197 +159,104 @@
"$type": "Bookmark",
"Name": "ST:0:0:{aa2115a1-9712-457b-9047-dbb71ca2cdd2}"
},
- {
- "$type": "Bookmark",
- "Name": "RST:0:0:{b3f9f954-0ca5-0091-76b4-34a47f44c954}"
- },
- {
- "$type": "Document",
- "DocumentIndex": 2,
- "Title": "Login.razor",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor",
- "RelativeDocumentMoniker": "Components\\Pages\\Login.razor",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor",
- "RelativeToolTip": "Components\\Pages\\Login.razor",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
- "WhenOpened": "2026-05-21T08:47:41.996Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 0,
- "Title": "MainLayout.razor",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor",
- "RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor",
- "RelativeToolTip": "Components\\Layout\\MainLayout.razor",
- "ViewState": "AgIAAI0AAAAAAAAAAAAAAHIBAAAgAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
- "WhenOpened": "2026-05-15T16:04:36.444Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 1,
- "Title": "Program.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Program.cs",
- "RelativeDocumentMoniker": "Program.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Program.cs",
- "RelativeToolTip": "Program.cs",
- "ViewState": "AgIAAAsAAAAAAAAAAAApwB8AAAAeAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-20T04:07:21.54Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 7,
- "Title": "OllamaSettings.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
- "RelativeDocumentMoniker": "Models\\OllamaSettings.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
- "RelativeToolTip": "Models\\OllamaSettings.cs",
- "ViewState": "AgIAAAYAAAAAAAAAAAAkwBQAAAASAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-16T13:39:46.179Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 18,
- "Title": "AppDbContext.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
- "RelativeDocumentMoniker": "Data\\AppDbContext.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
- "RelativeToolTip": "Data\\AppDbContext.cs",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-14T10:50:13.284Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 12,
- "Title": "FileScannerService.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
- "RelativeDocumentMoniker": "Services\\FileScannerService.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
- "RelativeToolTip": "Services\\FileScannerService.cs",
- "ViewState": "AgIAABIAAAAAAAAAAAAQwCUAAAAWAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-16T06:02:53.46Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 8,
- "Title": "IOllamaService.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaService.cs",
- "RelativeDocumentMoniker": "Services\\IOllamaService.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaService.cs",
- "RelativeToolTip": "Services\\IOllamaService.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAqwAkAAAAPAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-16T07:20:19.212Z"
- },
{
"$type": "Document",
"DocumentIndex": 4,
- "Title": "OllamaAssistant.razor",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
- "RelativeDocumentMoniker": "Components\\Pages\\OllamaAssistant.razor",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
- "RelativeToolTip": "Components\\Pages\\OllamaAssistant.razor",
- "ViewState": "AgIAAAkAAAAAAAAAAAAAABEAAAARAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
- "WhenOpened": "2026-05-20T05:14:39.037Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 3,
- "Title": "TotpHelper.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
- "RelativeDocumentMoniker": "Services\\TotpHelper.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
- "RelativeToolTip": "Services\\TotpHelper.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Title": "UserEntity.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\UserEntity.cs",
+ "RelativeDocumentMoniker": "Data\\UserEntity.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\UserEntity.cs",
+ "RelativeToolTip": "Data\\UserEntity.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAqwAIAAAAMAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-21T08:20:49.461Z",
- "EditorCaption": ""
- },
- {
- "$type": "Document",
- "DocumentIndex": 13,
- "Title": "Project.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
- "RelativeDocumentMoniker": "Models\\Project.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
- "RelativeToolTip": "Models\\Project.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAAaAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-15T15:57:10.2Z"
+ "WhenOpened": "2026-05-24T04:52:42.227Z"
},
{
"$type": "Document",
"DocumentIndex": 5,
- "Title": "Settings.razor",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Settings.razor",
- "RelativeDocumentMoniker": "Components\\Pages\\Settings.razor",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Settings.razor",
- "RelativeToolTip": "Components\\Pages\\Settings.razor",
- "ViewState": "AgIAAAwAAAAAAAAAAAAAAIYAAAAlAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
- "WhenOpened": "2026-05-15T16:43:26.6Z"
+ "Title": "A7405018.jpg",
+ "DocumentMoniker": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg",
+ "ToolTip": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
+ "WhenOpened": "2026-05-23T05:52:56.265Z"
},
{
"$type": "Document",
- "DocumentIndex": 9,
+ "DocumentIndex": 0,
"Title": "SettingsService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\SettingsService.cs",
"RelativeDocumentMoniker": "Services\\SettingsService.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\SettingsService.cs",
"RelativeToolTip": "Services\\SettingsService.cs",
- "ViewState": "AgIAAEUBAAAAAAAAAAAQwFwBAAAAAAAAAAAAAA==",
+ "ViewState": "AgIAAO4AAAAAAAAAAAAqwBsBAAApAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-16T06:05:12.928Z"
+ "WhenOpened": "2026-05-21T17:37:24.777Z",
+ "EditorCaption": ""
},
{
"$type": "Document",
- "DocumentIndex": 6,
- "Title": "OllamaService.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaService.cs",
- "RelativeDocumentMoniker": "Services\\OllamaService.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaService.cs",
- "RelativeToolTip": "Services\\OllamaService.cs",
- "ViewState": "AgIAAFkAAAAAAAAAAAAqwGsAAAAeAAAAAAAAAA==",
+ "DocumentIndex": 1,
+ "Title": "IThemeService.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IThemeService.cs",
+ "RelativeDocumentMoniker": "Services\\IThemeService.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IThemeService.cs",
+ "RelativeToolTip": "Services\\IThemeService.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAqwAgAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-16T06:43:46.404Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 14,
- "Title": "RagService.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
- "RelativeDocumentMoniker": "Services\\RagService.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
- "RelativeToolTip": "Services\\RagService.cs",
- "ViewState": "AgIAABIAAAAAAAAAAAAxwBoAAAAIAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-18T15:40:05.413Z"
+ "WhenOpened": "2026-05-21T17:32:01.784Z",
+ "EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 10,
+ "Title": "RedirectToLogin.razor",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\RedirectToLogin.razor",
+ "RelativeDocumentMoniker": "Components\\RedirectToLogin.razor",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\RedirectToLogin.razor",
+ "RelativeToolTip": "Components\\RedirectToLogin.razor",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAIAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+ "WhenOpened": "2026-05-21T16:31:16.612Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 6,
+ "Title": "OllamaAssistant.razor",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
+ "RelativeDocumentMoniker": "Components\\Pages\\OllamaAssistant.razor",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
+ "RelativeToolTip": "Components\\Pages\\OllamaAssistant.razor",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAGgAAAAMAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+ "WhenOpened": "2026-05-20T05:14:39.037Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 7,
+ "Title": "MainLayout.razor",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor",
+ "RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor",
+ "RelativeToolTip": "Components\\Layout\\MainLayout.razor",
+ "ViewState": "AgIAAB4BAAAAAAAAAAApwDQBAAApAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+ "WhenOpened": "2026-05-15T16:04:36.444Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 2,
"Title": "ISettingsService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ISettingsService.cs",
"RelativeDocumentMoniker": "Services\\ISettingsService.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ISettingsService.cs",
"RelativeToolTip": "Services\\ISettingsService.cs",
- "ViewState": "AgIAABoAAAAAAAAAAAA8wCoAAAAPAAAAAAAAAA==",
+ "ViewState": "AgIAABwAAAAAAAAAAAA9wC4AAAAZAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-16T13:21:26.951Z"
+ "WhenOpened": "2026-05-21T16:35:36.655Z"
},
{
"$type": "Document",
- "DocumentIndex": 15,
+ "DocumentIndex": 3,
"Title": "IRagService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IRagService.cs",
"RelativeDocumentMoniker": "Services\\IRagService.cs",
@@ -340,9 +266,163 @@
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-18T15:37:44.565Z"
},
+ {
+ "$type": "Document",
+ "DocumentIndex": 13,
+ "Title": "Login.razor",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor",
+ "RelativeDocumentMoniker": "Components\\Pages\\Login.razor",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor",
+ "RelativeToolTip": "Components\\Pages\\Login.razor",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+ "WhenOpened": "2026-05-21T08:47:41.996Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 8,
+ "Title": "ThemeService.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
+ "RelativeDocumentMoniker": "Services\\ThemeService.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
+ "RelativeToolTip": "Services\\ThemeService.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAABEAAAAdAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-16T13:35:33.991Z"
+ },
{
"$type": "Document",
"DocumentIndex": 11,
+ "Title": "Program.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Program.cs",
+ "RelativeDocumentMoniker": "Program.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Program.cs",
+ "RelativeToolTip": "Program.cs",
+ "ViewState": "AgIAABwAAAAAAAAAAAAAABIAAAAsAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-20T04:07:21.54Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 12,
+ "Title": "OllamaService.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaService.cs",
+ "RelativeDocumentMoniker": "Services\\OllamaService.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaService.cs",
+ "RelativeToolTip": "Services\\OllamaService.cs",
+ "ViewState": "AgIAAGEAAAAAAAAAAAAcwHsAAAAVAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-16T06:43:46.404Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 9,
+ "Title": "logo.jpg",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Assets\\logo.jpg",
+ "RelativeDocumentMoniker": "Assets\\logo.jpg",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Assets\\logo.jpg",
+ "RelativeToolTip": "Assets\\logo.jpg",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
+ "WhenOpened": "2026-05-21T17:15:10.852Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 16,
+ "Title": "OllamaSettings.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
+ "RelativeDocumentMoniker": "Models\\OllamaSettings.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
+ "RelativeToolTip": "Models\\OllamaSettings.cs",
+ "ViewState": "AgIAAAYAAAAAAAAAAAAkwBQAAAASAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-16T13:39:46.179Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 24,
+ "Title": "AppDbContext.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
+ "RelativeDocumentMoniker": "Data\\AppDbContext.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
+ "RelativeToolTip": "Data\\AppDbContext.cs",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-14T10:50:13.284Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 19,
+ "Title": "FileScannerService.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
+ "RelativeDocumentMoniker": "Services\\FileScannerService.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
+ "RelativeToolTip": "Services\\FileScannerService.cs",
+ "ViewState": "AgIAABIAAAAAAAAAAAAQwCUAAAAWAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-16T06:02:53.46Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 17,
+ "Title": "IOllamaService.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaService.cs",
+ "RelativeDocumentMoniker": "Services\\IOllamaService.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaService.cs",
+ "RelativeToolTip": "Services\\IOllamaService.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAqwAkAAAAPAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-16T07:20:19.212Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 14,
+ "Title": "TotpHelper.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
+ "RelativeDocumentMoniker": "Services\\TotpHelper.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
+ "RelativeToolTip": "Services\\TotpHelper.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-21T08:20:49.461Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 20,
+ "Title": "Project.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
+ "RelativeDocumentMoniker": "Models\\Project.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
+ "RelativeToolTip": "Models\\Project.cs",
+ "ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAAaAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-15T15:57:10.2Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 15,
+ "Title": "Settings.razor",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Settings.razor",
+ "RelativeDocumentMoniker": "Components\\Pages\\Settings.razor",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Settings.razor",
+ "RelativeToolTip": "Components\\Pages\\Settings.razor",
+ "ViewState": "AgIAAAwAAAAAAAAAAAAAAIYAAAAlAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
+ "WhenOpened": "2026-05-15T16:43:26.6Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 21,
+ "Title": "RagService.cs",
+ "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
+ "RelativeDocumentMoniker": "Services\\RagService.cs",
+ "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
+ "RelativeToolTip": "Services\\RagService.cs",
+ "ViewState": "AgIAABIAAAAAAAAAAAAxwBoAAAAIAAAAAAAAAA==",
+ "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
+ "WhenOpened": "2026-05-18T15:40:05.413Z"
+ },
+ {
+ "$type": "Document",
+ "DocumentIndex": 18,
"Title": "ProjectService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ProjectService.cs",
"RelativeDocumentMoniker": "Services\\ProjectService.cs",
@@ -354,7 +434,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 17,
+ "DocumentIndex": 23,
"Title": "NavMenu.razor",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\NavMenu.razor",
"RelativeDocumentMoniker": "Components\\Layout\\NavMenu.razor",
@@ -366,7 +446,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 16,
+ "DocumentIndex": 22,
"Title": "Editor.razor",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Editor.razor",
"RelativeDocumentMoniker": "Components\\Pages\\Editor.razor",
@@ -374,24 +454,11 @@
"RelativeToolTip": "Components\\Pages\\Editor.razor",
"ViewState": "AgIAAAoAAACA6NuCpTYvwKAAAAAcAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
- "WhenOpened": "2026-05-16T13:01:59.743Z",
- "EditorCaption": ""
+ "WhenOpened": "2026-05-16T13:01:59.743Z"
},
{
"$type": "Document",
- "DocumentIndex": 19,
- "Title": "ThemeService.cs",
- "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
- "RelativeDocumentMoniker": "Services\\ThemeService.cs",
- "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
- "RelativeToolTip": "Services\\ThemeService.cs",
- "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
- "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
- "WhenOpened": "2026-05-16T13:35:33.991Z"
- },
- {
- "$type": "Document",
- "DocumentIndex": 20,
+ "DocumentIndex": 25,
"Title": "App.razor",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor",
"RelativeDocumentMoniker": "Components\\App.razor",
@@ -403,7 +470,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 23,
+ "DocumentIndex": 28,
"Title": "Models.razor",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor",
"RelativeDocumentMoniker": "Components\\Pages\\Models.razor",
@@ -415,7 +482,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 21,
+ "DocumentIndex": 26,
"Title": "LLM_Model.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs",
"RelativeDocumentMoniker": "Models\\LLM_Model.cs",
@@ -427,7 +494,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 22,
+ "DocumentIndex": 27,
"Title": "ModelStatus.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs",
"RelativeDocumentMoniker": "Models\\ModelStatus.cs",
@@ -439,7 +506,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 26,
+ "DocumentIndex": 31,
"Title": "MainLayout.razor.css",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor.css",
"RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor.css",
@@ -451,7 +518,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 24,
+ "DocumentIndex": 29,
"Title": "IFileScannerService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IFileScannerService.cs",
"RelativeDocumentMoniker": "Services\\IFileScannerService.cs",
@@ -463,7 +530,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 25,
+ "DocumentIndex": 30,
"Title": "bootstrap-utilities.css",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-utilities.css",
"RelativeDocumentMoniker": "wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-utilities.css",
@@ -475,7 +542,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 28,
+ "DocumentIndex": 33,
"Title": "ProjectEntity.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\ProjectEntity.cs",
"RelativeDocumentMoniker": "Data\\ProjectEntity.cs",
@@ -487,7 +554,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 27,
+ "DocumentIndex": 32,
"Title": "IProjectService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IProjectService.cs",
"RelativeDocumentMoniker": "Services\\IProjectService.cs",
@@ -499,7 +566,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 29,
+ "DocumentIndex": 34,
"Title": "AuthorBuddy.Web.csproj",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\AuthorBuddy.Web.csproj",
"RelativeDocumentMoniker": "AuthorBuddy.Web.csproj",
@@ -511,7 +578,7 @@
},
{
"$type": "Document",
- "DocumentIndex": 30,
+ "DocumentIndex": 35,
"Title": "appsettings.json",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\appsettings.json",
"RelativeDocumentMoniker": "appsettings.json",
@@ -520,6 +587,10 @@
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|",
"WhenOpened": "2026-05-14T10:14:25.605Z"
+ },
+ {
+ "$type": "Bookmark",
+ "Name": "RST:0:0:{b3f9f954-0ca5-0091-76b4-34a47f44c954}"
}
]
}
diff --git a/Assets/logo.jpg b/Assets/logo.jpg
new file mode 100644
index 0000000..35a0029
Binary files /dev/null and b/Assets/logo.jpg differ
diff --git a/Assets/splash.jpg b/Assets/splash.jpg
new file mode 100644
index 0000000..554ba12
Binary files /dev/null and b/Assets/splash.jpg differ
diff --git a/AuthorBuddy.Web.csproj b/AuthorBuddy.Web.csproj
index f812cf0..e815d63 100644
--- a/AuthorBuddy.Web.csproj
+++ b/AuthorBuddy.Web.csproj
@@ -12,4 +12,8 @@
+
+
+
+
diff --git a/Components/Layout/MainLayout.razor b/Components/Layout/MainLayout.razor
index f3aaab0..449cea5 100644
--- a/Components/Layout/MainLayout.razor
+++ b/Components/Layout/MainLayout.razor
@@ -6,75 +6,101 @@
@inject OllamaSettings OllamaSettings
@inject IAuthService AuthService
@inject CustomAuthStateProvider AuthStateProvider
+@inject ILocalizationService Loc
-
+@if (_isLoading)
+{
+
+
+
+
+
+
+
+
+
+}
+else
+{
+
@if (_isAuthenticated)
{
}
@@ -185,11 +237,33 @@
}
+}
+
+@if (_showInfoOverlay)
+{
+
+
+
+
+
+
+
Author Buddy
+
Version 1.0
+
© 2026 Author Buddy. Alle Rechte vorbehalten.
+
+ https://example.com
+
+
Schließen
+
+
+}
@code {
- private string _language = "de";
private string _username = string.Empty;
private bool _isAuthenticated;
+ private UserRole _currentUserRole;
+ private bool _isLoading = true;
+ private bool _showInfoOverlay;
private string? activeSection;
private bool showProjectList;
private List
? projects;
@@ -205,8 +279,10 @@
private bool showNewFileDialog;
private string newFileName = string.Empty;
private FileTreeItem? newFileParentDir;
-
- private string T(string de, string en) => _language == "en" ? en : de;
+ private bool showCopyProjectDialog;
+ private string copyProjectName = string.Empty;
+ private string copyProjectPath = string.Empty;
+ private Project? copyProjectSource;
[Inject]
private NavigationManager Navigation { get; set; } = default!;
@@ -214,8 +290,8 @@
protected override async Task OnInitializedAsync()
{
await SettingsService.InitializeAsync();
- _language = await SettingsService.GetLanguageAsync() ?? "de";
- statusText = T("Bereit", "Ready");
+ await Loc.InitAsync();
+ statusText = Loc["common.status.ready"];
Navigation.LocationChanged += OnLocationChanged;
}
@@ -224,6 +300,7 @@
var user = await AuthService.GetCurrentUserAsync();
_username = user?.Name ?? string.Empty;
_isAuthenticated = user != null;
+ _currentUserRole = user?.Role ?? UserRole.Author;
}
private async Task AutoLoadLastProject()
@@ -234,18 +311,20 @@
var project = projects?.FirstOrDefault(p => p.Id == lastId.Value);
if (project != null)
{
- await SettingsService.InitializeAsync(lastId.Value);
+ SettingsService.CurrentProjectId = project.Id;
+ await SettingsService.InitializeAsync();
await SelectProject(project);
}
}
protected override async Task OnAfterRenderAsync(bool firstRender)
{
+ var themeChanged = OllamaSettings.Theme != ThemeService.Theme;
+
+
if (firstRender)
{
- var theme = OllamaSettings.Theme;
- if (!string.IsNullOrEmpty(theme))
- await ThemeService.ApplyTheme(theme);
+ await ThemeService.ApplyTheme(OllamaSettings.Theme);
// Auto-login runs AFTER circuit establishment (correct scoped services)
await LoadCurrentUser();
@@ -268,6 +347,8 @@
await LoadProjectContext();
await AutoLoadLastProject();
}
+
+ _isLoading = false;
StateHasChanged();
}
}
@@ -344,6 +425,62 @@
Navigation.NavigateTo("/editor/newproject");
}
+ private void BeginCopyProject(Project project)
+ {
+ copyProjectSource = project;
+ copyProjectName = $"{project.Name} (Kopie)";
+ copyProjectPath = project.RootPath + "_Kopie";
+ showCopyProjectDialog = true;
+ }
+
+ private void CancelCopyProject()
+ {
+ showCopyProjectDialog = false;
+ copyProjectSource = null;
+ copyProjectName = string.Empty;
+ copyProjectPath = string.Empty;
+ }
+
+ private async Task ConfirmCopyProject()
+ {
+ if (copyProjectSource == null || string.IsNullOrWhiteSpace(copyProjectName) || string.IsNullOrWhiteSpace(copyProjectPath))
+ return;
+
+ try
+ {
+ var userId = (await AuthService.GetCurrentUserAsync())?.Id;
+ if (userId == null) return;
+
+ statusText = $"{Loc["nav.status.project_copied"]} {copyProjectName}...";
+ isBusy = true;
+ StateHasChanged();
+
+ var newId = await ProjectService.CopyProjectAsync(copyProjectSource.Id, copyProjectName, copyProjectPath, userId.Value);
+ await LoadProjects();
+
+ var newProject = projects?.FirstOrDefault(p => p.Id == newId);
+ if (newProject != null)
+ {
+ await SelectProject(newProject);
+ }
+
+ statusText = $"{Loc["nav.status.project_copied"]} {copyProjectName}";
+ }
+ catch (Exception ex)
+ {
+ statusText = $"{Loc["common.error"]} {ex.Message}";
+ }
+ finally
+ {
+ isBusy = false;
+ showCopyProjectDialog = false;
+ copyProjectSource = null;
+ copyProjectName = string.Empty;
+ copyProjectPath = string.Empty;
+ StateHasChanged();
+ }
+ }
+
private void OpenEditor()
{
activeSection = null;
@@ -356,6 +493,16 @@
Navigation.NavigateTo(path);
}
+ private void ToggleInfoOverlay()
+ {
+ _showInfoOverlay = !_showInfoOverlay;
+ }
+
+ private void CloseInfoOverlay()
+ {
+ _showInfoOverlay = false;
+ }
+
private void NavigateToSetup2FA()
{
activeSection = null;
@@ -413,7 +560,7 @@
var newPath = Path.Combine(dir, renameNewName);
if (File.Exists(newPath))
{
- statusText = T("Datei existiert bereits.", "File already exists.");
+ statusText = Loc["nav.error.file_exists"];
return;
}
File.Move(renameTarget.FullPath, newPath);
@@ -421,11 +568,11 @@
if (currentFilePath == renameTarget.FullPath)
SettingsService.CurrentFilePath = newPath;
- statusText = $"{T("Umbenannt zu:", "Renamed to:")} {renameNewName}";
+ statusText = $"{Loc["nav.status.renamed_to"]} {renameNewName}";
}
catch (Exception ex)
{
- statusText = $"{T("Fehler:", "Error:")} {ex.Message}";
+ statusText = $"{Loc["common.error"]} {ex.Message}";
}
finally
{
@@ -462,15 +609,15 @@
path += ".md";
if (File.Exists(path))
{
- statusText = T("Datei existiert bereits.", "File already exists.");
+ statusText = Loc["nav.error.file_exists"];
return;
}
File.WriteAllText(path, $"# {Path.GetFileNameWithoutExtension(path)}\n\n");
- statusText = $"{T("Erstellt:", "Created:")} {Path.GetFileName(path)}";
+ statusText = $"{Loc["nav.status.created"]} {Path.GetFileName(path)}";
}
catch (Exception ex)
{
- statusText = $"{T("Fehler:", "Error:")} {ex.Message}";
+ statusText = $"{Loc["common.error"]} {ex.Message}";
}
finally
{
diff --git a/Components/Pages/Editor.razor b/Components/Pages/Editor.razor
index a3eadb8..8c6b8f1 100644
--- a/Components/Pages/Editor.razor
+++ b/Components/Pages/Editor.razor
@@ -1,82 +1,143 @@
@page "/editor"
@page "/editor/{action}"
@page "/editor/{action}/{projectId:int}"
+@using System.Threading
@inject IOllamaService OllamaService
@inject IProjectService ProjectService
@inject IRagService RagService
@inject ISettingsService SettingsService
@inject IWikipediaService WikipediaService
@inject NavigationManager Navigation
+@inject ILocalizationService Loc
@implements IDisposable
@rendermode InteractiveServer
@attribute [Authorize]
-@T("Editor - Author Buddy", "Editor - Author Buddy")
+@Loc["page.title.editor"]
-
+
+
@if (showVersionDialog)
{
-
@T("Version speichern", "Save version")
+
@Loc["editor.version.title"]
- showVersionDialog = false">@T("Abbrechen", "Cancel")
- @T("Version speichern", "Save version")
+ showVersionDialog = false">@Loc["common.cancel"]
+ @Loc["editor.version.button.save"]
}
-
-
- @T("Fakten suchen (RAG)", "Search facts (RAG)")
- @T("Wikipedia-Recherche", "Wikipedia research")
+ @Loc["editor.button.search_rag"]
+ @Loc["editor.button.search_wikipedia"]
-
@searchQuery
@if (showSpellDiff && !string.IsNullOrEmpty(correctedText))
{
-
@T("Rechtschreibpr\u00fcfung - \u00c4nderungen:", "Spell check - Changes:")
+
@Loc["editor.spellcheck.heading"]
+
+ @Loc["editor.spellcheck.button.apply"]
+
}
+ else if (showVersionDiff && _selectedVersion != null)
+ {
+
+
+
@Loc["editor.version.diff_title"] @_selectedVersion.Timestamp:dd.MM.yyyy HH:mm
+ @if (!string.IsNullOrEmpty(_selectedVersion.Comment))
+ {
+
@Loc["editor.version.label.comment"]: @_selectedVersion.Comment
+ }
+
+
+ RestoreVersion(_selectedVersion)">@Loc["editor.version.button.restore"]
+ @Loc["common.cancel"]
+
+
+
+ }
+ else if (showVersionBrowser)
+ {
+
+
@Loc["editor.version.list_title"]
+ @if (_versionList == null || _versionList.Count == 0)
+ {
+
@Loc["editor.version.empty"]
+ }
+ else
+ {
+
+ @foreach (var v in _versionList)
+ {
+
+
+ @v.Timestamp.ToString("dd.MM.yyyy HH:mm")
+ @if (!string.IsNullOrEmpty(v.Comment))
+ {
+
+ }
+
+
+ ShowVersionDiff(v)">@Loc["editor.version.button.diff"]
+ RestoreVersion(v)">@Loc["editor.version.button.restore"]
+
+
+ }
+
+ }
+
@Loc["common.cancel"]
+
+ }
else if (ragResults != null && ragResults.Count > 0)
{
-
@T("Gefundene Fakten (RAG):", "Found facts (RAG):")
+
@Loc["editor.rag.heading"]
@foreach (var r in ragResults)
{
-
@T("\u00c4hnlichkeit:", "Similarity:") @r.Similarity.ToString("P1")
+
@Loc["editor.rag.label.similarity"] @r.Similarity.ToString("P1")
@r.FilePath
@r.Text
@@ -86,7 +147,7 @@
else if (wikipediaResults != null && wikipediaResults.Count > 0)
{
-
@T("Wikipedia-Recherche:", "Wikipedia research:")
+
@Loc["editor.wikipedia.heading"]
@foreach (var r in wikipediaResults)
{
@@ -102,21 +163,21 @@
LoadFullArticle(r)" disabled="@(loadedArticles.ContainsKey(r.Url))">
@(loadedArticles.ContainsKey(r.Url)
- ? T("✓ Geladen", "✓ Loaded")
- : T("Vollst\u00e4ndigen Artikel laden", "Load full article"))
+ ? Loc["editor.wikipedia.status.loaded"]
+ : Loc["editor.wikipedia.button.load"])
SaveAsFact(r)" disabled="@(string.IsNullOrWhiteSpace(r.Extract) || currentProjectId == 0)">
- @T("Als Fakt speichern", "Save as fact")
+ @Loc["editor.wikipedia.button.save_as_fact"]
}
}
- else if (!string.IsNullOrEmpty(analysisResult))
+ else if (!string.IsNullOrEmpty(analysisResult) && !showVersionBrowser)
{
-
@T("Ergebnis:", "Result:")
+
@Loc["editor.result.heading"]
@analysisResult
}
@@ -126,30 +187,26 @@
{
-
@T("Neues Projekt erstellen", "Create new project")
+
@Loc["editor.create_project.title"]
- @T("Abbrechen", "Cancel")
- @T("Erstellen", "Create")
+ @Loc["common.cancel"]
+ @Loc["editor.button.create"]
}
@code {
- private string _language = "de";
-
- private string T(string de, string en) => _language == "en" ? en : de;
-
[Parameter]
public string? Action { get; set; }
@@ -179,12 +236,20 @@
private string versionComment = string.Empty;
private VersionEntry? latestVersion;
+ private Timer? _autosaveTimer;
+ private string _lastSavedContent = string.Empty;
+ private bool _contentModified;
+ private bool showVersionBrowser;
+ private bool showVersionDiff;
+ private List
_versionList = new();
+ private VersionEntry? _selectedVersion;
+ private string _versionDiffContent = string.Empty;
+
private record VersionEntry(string FilePath, DateTime Timestamp, string? Comment);
protected override async Task OnInitializedAsync()
{
- _language = await SettingsService.GetLanguageAsync() ?? "de";
- statusText = T("Bereit", "Ready");
+ statusText = Loc["common.status.ready"];
Navigation.LocationChanged += OnLocationChanged;
@@ -195,7 +260,8 @@
{
SettingsService.PendingAssistantOutput = null;
editorContent = pendingOutput;
- statusText = T("Text aus Assistent \u00fcbernommen.", "Text imported from assistant.");
+ _lastSavedContent = editorContent;
+ statusText = Loc["editor.status.imported_from_assistant"];
}
if (string.Equals(Action, "newproject", StringComparison.OrdinalIgnoreCase))
@@ -213,6 +279,41 @@
public void Dispose()
{
Navigation.LocationChanged -= OnLocationChanged;
+ _autosaveTimer?.Dispose();
+ }
+
+ private void OnContentChanged(ChangeEventArgs e)
+ {
+ editorContent = e.Value?.ToString() ?? string.Empty;
+ _contentModified = editorContent != _lastSavedContent;
+ ResetAutosaveTimer();
+ StateHasChanged();
+ }
+
+ private void ResetAutosaveTimer()
+ {
+ _autosaveTimer?.Dispose();
+ _autosaveTimer = new Timer(AutosaveCallback, null, TimeSpan.FromSeconds(2), Timeout.InfiniteTimeSpan);
+ }
+
+ private async void AutosaveCallback(object? state)
+ {
+ if (string.IsNullOrEmpty(currentFile) || !_contentModified || isChecking) return;
+
+ try
+ {
+ await InvokeAsync(async () =>
+ {
+ await File.WriteAllTextAsync(currentFile, editorContent);
+ _lastSavedContent = editorContent;
+ _contentModified = false;
+ statusText = Loc["editor.status.autosaved"];
+ StateHasChanged();
+ });
+ }
+ catch
+ {
+ }
}
private void OpenAssistant()
@@ -248,32 +349,42 @@
{
currentFile = filePath;
editorContent = await File.ReadAllTextAsync(filePath);
- statusText = $"{T("Geladen:", "Loaded:")} {Path.GetFileName(filePath)}";
+ _lastSavedContent = editorContent;
+ _contentModified = false;
+ statusText = $"{Loc["editor.status.loaded"]} {Path.GetFileName(filePath)}";
RefreshLatestVersion();
}
}
+ private void ClearResults()
+ {
+ showSpellDiff = false;
+ showVersionBrowser = false;
+ showVersionDiff = false;
+ ragResults = null;
+ wikipediaResults = null;
+ analysisResult = string.Empty;
+ }
+
private async Task CheckStyle()
{
if (string.IsNullOrWhiteSpace(editorContent)) return;
isChecking = true;
- statusText = T("Ollama analysiert Stil...", "Ollama analyzing style...");
+ statusText = Loc["editor.status.analyzing_style"];
checkProgress = 50;
- showSpellDiff = false;
- ragResults = null;
- wikipediaResults = null;
+ ClearResults();
try
{
}
catch (Exception ex)
{
- analysisResult = $"{T("Fehler:", "Error:")} {ex.Message}";
+ analysisResult = $"{Loc["common.error"]} {ex.Message}";
}
finally
{
- statusText = T("Bereit", "Ready");
+ statusText = Loc["common.status.ready"];
isChecking = false;
checkProgress = 0;
}
@@ -284,11 +395,9 @@
if (string.IsNullOrWhiteSpace(editorContent)) return;
isChecking = true;
- statusText = T("Ollama pr\u00fcft Rechtschreibung...", "Ollama checking spelling...");
+ statusText = Loc["editor.status.checking_spelling"];
checkProgress = 50;
- showSpellDiff = false;
- ragResults = null;
- wikipediaResults = null;
+ ClearResults();
try
{
@@ -298,32 +407,40 @@
}
catch (Exception ex)
{
- analysisResult = $"{T("Fehler:", "Error:")} {ex.Message}";
+ analysisResult = $"{Loc["common.error"]} {ex.Message}";
}
finally
{
- statusText = T("Bereit", "Ready");
+ statusText = Loc["common.status.ready"];
isChecking = false;
checkProgress = 0;
}
}
+ private void ApplySpellCorrections()
+ {
+ if (string.IsNullOrEmpty(correctedText)) return;
+ editorContent = correctedText;
+ _contentModified = editorContent != _lastSavedContent;
+ showSpellDiff = false;
+ ResetAutosaveTimer();
+ statusText = Loc["editor.status.corrections_applied"];
+ }
+
private async Task RagSearch()
{
if (string.IsNullOrWhiteSpace(searchQuery)) return;
isChecking = true;
- statusText = T("Suche verwandte Fakten...", "Searching related facts...");
- showSpellDiff = false;
+ statusText = Loc["editor.status.searching_rag"];
+ ClearResults();
analysisResult = string.Empty;
- ragResults = null;
- wikipediaResults = null;
try
{
if (currentProjectId == 0)
{
- analysisResult = T("Kein Projekt geladen. \u00d6ffne zuerst ein Projekt \u00fcber die Sidebar.", "No project loaded. Open a project via the sidebar first.");
+ analysisResult = Loc["editor.rag.error.no_project"];
return;
}
@@ -331,16 +448,16 @@
if (ragResults.Count == 0)
{
- analysisResult = T("Keine relevanten Fakten gefunden. Indexiere das Projekt ggf. \u00fcber 'Projekt indexieren'.", "No relevant facts found. Index the project if needed via 'Index project'.");
+ analysisResult = Loc["editor.rag.error.no_facts"];
}
}
catch (Exception ex)
{
- analysisResult = $"{T("RAG-Fehler:", "RAG error:")} {ex.Message}";
+ analysisResult = $"{Loc["editor.rag.error.generic"]} {ex.Message}";
}
finally
{
- statusText = T("Bereit", "Ready");
+ statusText = Loc["common.status.ready"];
isChecking = false;
}
}
@@ -350,11 +467,9 @@
if (string.IsNullOrWhiteSpace(searchQuery)) return;
isChecking = true;
- statusText = T("Suche auf Wikipedia...", "Searching Wikipedia...");
- showSpellDiff = false;
+ statusText = Loc["editor.status.searching_wikipedia"];
+ ClearResults();
analysisResult = string.Empty;
- ragResults = null;
- wikipediaResults = null;
loadedArticles.Clear();
try
@@ -377,22 +492,22 @@
}
if (wikipediaResults.Count == 0)
- analysisResult = T("Keine Wikipedia-Artikel gefunden.", "No Wikipedia articles found.");
+ analysisResult = Loc["editor.wikipedia.error.not_found"];
}
catch (Exception ex)
{
- analysisResult = $"{T("Wikipedia-Fehler:", "Wikipedia error:")} {ex.Message}";
+ analysisResult = $"{Loc["editor.wikipedia.error.generic"]} {ex.Message}";
}
finally
{
- statusText = T("Bereit", "Ready");
+ statusText = Loc["common.status.ready"];
isChecking = false;
}
}
private async Task LoadFullArticle(WikipediaResult result)
{
- statusText = $"{T("Lade Artikel:", "Loading article:")} {result.Title}...";
+ statusText = $"{Loc["editor.status.loading_article"]} {result.Title}...";
try
{
@@ -401,16 +516,16 @@
{
result.Extract = fullText;
loadedArticles[result.Url] = true;
- statusText = T("Artikel geladen.", "Article loaded.");
+ statusText = Loc["editor.wikipedia.status.loaded"];
}
else
{
- statusText = T("Konnte Artikel nicht laden.", "Could not load article.");
+ statusText = Loc["editor.wikipedia.error.load_failed"];
}
}
catch (Exception ex)
{
- statusText = $"{T("Fehler:", "Error:")} {ex.Message}";
+ statusText = $"{Loc["common.error"]} {ex.Message}";
}
}
@@ -418,7 +533,7 @@
{
if (string.IsNullOrWhiteSpace(result.Extract) || currentProjectId == 0) return;
- statusText = T("Speichere als Fakt...", "Saving as fact...");
+ statusText = Loc["editor.status.saving_fact"];
try
{
@@ -426,7 +541,7 @@
var project = projects.FirstOrDefault(p => p.Id == currentProjectId);
if (project == null)
{
- statusText = T("Projekt nicht gefunden.", "Project not found.");
+ statusText = Loc["editor.error.project_not_found"];
return;
}
@@ -443,11 +558,11 @@
result.Extract;
await File.WriteAllTextAsync(filePath, content);
- statusText = $"{T("Gespeichert als:", "Saved as:")} {safeName}.md";
+ statusText = $"{Loc["editor.status.saved_as"]} {safeName}.md";
}
catch (Exception ex)
{
- statusText = $"{T("Fehler beim Speichern:", "Error saving:")} {ex.Message}";
+ statusText = $"{Loc["editor.error.save_failed"]} {ex.Message}";
}
}
@@ -469,7 +584,7 @@
if (string.IsNullOrWhiteSpace(newProjectName) || string.IsNullOrWhiteSpace(newProjectPath)) return;
isChecking = true;
- statusText = T("Erstelle Projekt...", "Creating project...");
+ statusText = Loc["editor.status.creating_project"];
try
{
@@ -482,12 +597,12 @@
}
catch (Exception ex)
{
- analysisResult = $"{T("Fehler beim Erstellen:", "Error creating:")} {ex.Message}";
+ analysisResult = $"{Loc["editor.error.create_failed"]} {ex.Message}";
}
finally
{
isChecking = false;
- statusText = T("Bereit", "Ready");
+ statusText = Loc["common.status.ready"];
}
}
@@ -495,12 +610,12 @@
{
if (currentProjectId == 0)
{
- analysisResult = T("Kein Projekt geladen. \u00d6ffne zuerst ein Projekt \u00fcber die Sidebar.", "No project loaded. Open a project via the sidebar first.");
+ analysisResult = Loc["editor.index.error.no_project"];
return;
}
isChecking = true;
- statusText = T("Indexiere Projekt...", "Indexing project...");
+ statusText = Loc["editor.status.indexing"];
analysisResult = string.Empty;
ragResults = null;
@@ -510,7 +625,7 @@
var project = projects.FirstOrDefault(p => p.Id == currentProjectId);
if (project == null)
{
- analysisResult = T("Projekt nicht gefunden.", "Project not found.");
+ analysisResult = Loc["editor.index.error.not_found"];
return;
}
@@ -521,15 +636,15 @@
});
await RagService.IndexProjectAsync(currentProjectId, project.RootPath, p);
- analysisResult = T("Projekt erfolgreich indexiert.", "Project indexed successfully.");
+ analysisResult = Loc["editor.index.status.success"];
}
catch (Exception ex)
{
- analysisResult = $"{T("Indexierungsfehler:", "Indexing error:")} {ex.Message}";
+ analysisResult = $"{Loc["editor.index.error.generic"]} {ex.Message}";
}
finally
{
- statusText = T("Bereit", "Ready");
+ statusText = Loc["common.status.ready"];
isChecking = false;
}
}
@@ -538,7 +653,9 @@
{
if (string.IsNullOrEmpty(currentFile)) return;
await File.WriteAllTextAsync(currentFile, editorContent);
- statusText = $"{T("Gespeichert:", "Saved:")} {Path.GetFileName(currentFile)}";
+ _lastSavedContent = editorContent;
+ _contentModified = false;
+ statusText = $"{Loc["editor.status.saved"]} {Path.GetFileName(currentFile)}";
}
private void ShowVersionDialog()
@@ -565,12 +682,98 @@
var meta = $"Kommentar: {versionComment}";
await File.WriteAllTextAsync(versionPath + ".meta", meta);
- statusText = $"{T("Version gespeichert:", "Version saved:")} {name}_{stamp}{ext}";
+ statusText = $"{Loc["editor.status.version_saved"]} {name}_{stamp}{ext}";
showVersionDialog = false;
versionComment = string.Empty;
+ _lastSavedContent = editorContent;
+ _contentModified = false;
RefreshLatestVersion();
}
+ private void ShowVersionBrowser()
+ {
+ ClearResults();
+ LoadVersionList();
+ showVersionBrowser = true;
+ }
+
+ private void CloseVersionBrowser()
+ {
+ showVersionBrowser = false;
+ showVersionDiff = false;
+ _selectedVersion = null;
+ }
+
+ private void LoadVersionList()
+ {
+ _versionList.Clear();
+ if (string.IsNullOrEmpty(currentFile)) return;
+
+ var dir = Path.GetDirectoryName(currentFile)!;
+ var name = Path.GetFileNameWithoutExtension(currentFile);
+ var ext = Path.GetExtension(currentFile);
+ var versionsDir = Path.Combine(dir, "_versions");
+ if (!Directory.Exists(versionsDir)) return;
+
+ var pattern = $"{name}_*{ext}";
+ var files = Directory.GetFiles(versionsDir, pattern).OrderByDescending(f => f).ToList();
+
+ foreach (var file in files)
+ {
+ var metaFile = file + ".meta";
+ string? comment = null;
+ if (File.Exists(metaFile))
+ {
+ var lines = File.ReadAllLines(metaFile);
+ if (lines.Length > 0 && lines[0].StartsWith("Kommentar: "))
+ comment = lines[0]["Kommentar: ".Length..];
+ }
+
+ var fileName = Path.GetFileNameWithoutExtension(file);
+ var stamp = fileName[(name.Length + 1)..];
+ var parsed = DateTime.TryParseExact(stamp, "yyyyMMdd_HHmmss", null,
+ System.Globalization.DateTimeStyles.None, out var dt);
+
+ _versionList.Add(new VersionEntry(
+ file,
+ parsed ? dt : File.GetLastWriteTime(file),
+ comment
+ ));
+ }
+ }
+
+ private async void ShowVersionDiff(VersionEntry version)
+ {
+ try
+ {
+ _versionDiffContent = await File.ReadAllTextAsync(version.FilePath);
+ _selectedVersion = version;
+ showVersionDiff = true;
+ }
+ catch (Exception ex)
+ {
+ statusText = $"{Loc["common.error"]} {ex.Message}";
+ }
+ }
+
+ private async void RestoreVersion(VersionEntry version)
+ {
+ try
+ {
+ editorContent = await File.ReadAllTextAsync(version.FilePath);
+ _contentModified = editorContent != _lastSavedContent;
+ ResetAutosaveTimer();
+ statusText = $"{Loc["editor.version.status_loaded_prefix"]} {version.Timestamp:dd.MM.yyyy HH:mm} {Loc["editor.version.status_loaded_suffix"]}";
+ showVersionBrowser = false;
+ showVersionDiff = false;
+ _selectedVersion = null;
+ }
+ catch (Exception ex)
+ {
+ statusText = $"{Loc["common.error"]} {ex.Message}";
+ }
+ }
+
private void RefreshLatestVersion()
{
latestVersion = null;
@@ -606,18 +809,4 @@
comment
);
}
-
- private async Task LoadLatestVersion()
- {
- if (latestVersion == null) return;
- try
- {
- editorContent = await File.ReadAllTextAsync(latestVersion.FilePath);
- statusText = $"{T("Version vom", "Version from")} {latestVersion.Timestamp:dd.MM.yyyy HH:mm} {T("geladen.", "loaded.")}";
- }
- catch (Exception ex)
- {
- statusText = $"{T("Fehler:", "Error:")} {ex.Message}";
- }
- }
}
diff --git a/Components/Pages/Error.razor b/Components/Pages/Error.razor
index 428e955..8cd753a 100644
--- a/Components/Pages/Error.razor
+++ b/Components/Pages/Error.razor
@@ -1,25 +1,19 @@
@page "/Error"
-@inject ISettingsService SettingsService
+@inject ILocalizationService Loc
@rendermode InteractiveServer
-@T("Fehler", "Error")
+@Loc["page.title.error"]
-@T("Ein Fehler ist aufgetreten", "An error occurred")
-@T("Entschuldigung, es ist ein unerwarteter Fehler aufgetreten.", "Sorry, an unexpected error occurred.")
-@T("Zurück zur Startseite", "Back to home")
+@Loc["error.heading"]
+@Loc["error.message"]
+@Loc["error.link.back_to_home"]
@code {
- private string _language = "de";
-
- private string T(string de, string en) => _language == "en" ? en : de;
-
[CascadingParameter]
private HttpContext? HttpContext { get; set; }
- protected override async Task OnInitializedAsync()
+ protected override void OnInitialized()
{
- _language = await SettingsService.GetLanguageAsync() ?? "de";
-
if (HttpContext is not null)
{
HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError;
diff --git a/Components/Pages/Home.razor b/Components/Pages/Home.razor
index fc974be..82344ee 100644
--- a/Components/Pages/Home.razor
+++ b/Components/Pages/Home.razor
@@ -2,13 +2,13 @@
@attribute [Authorize]
@inject IOllamaService OllamaService
@inject IProjectService ProjectService
-@inject ISettingsService SettingsService
+@inject ILocalizationService Loc
-@T("Dashboard - Author Buddy", "Dashboard - Author Buddy")
+@Loc["page.title.home"]
-
activeTab = "rag"'>@T("Gefundene Fakten (RAG)", "Found facts (RAG)")
-
activeTab = "style"'>@T("Stil-Analyse", "Style analysis")
+
activeTab = "rag"'>@Loc["home.tab.rag_facts"]
+
activeTab = "style"'>@Loc["home.tab.style_analysis"]
@@ -16,7 +16,7 @@
{
@if (foundFacts.Count == 0)
{
-
@T("Keine Fakten gefunden. Öffne ein Projekt und scanne die Dateien.", "No facts found. Open a project and scan the files.")
+
@Loc["home.rag.empty"]
}
else
{
@@ -33,18 +33,10 @@
@code {
- private string _language = "de";
private string activeTab = "rag";
private List foundFacts = new();
private string styleSuggestions = string.Empty;
- private string T(string de, string en) => _language == "en" ? en : de;
-
- protected override async Task OnInitializedAsync()
- {
- _language = await SettingsService.GetLanguageAsync() ?? "de";
- }
-
private string GetTabClass(string tab)
{
return activeTab == tab ? "active" : "";
diff --git a/Components/Pages/Login.razor b/Components/Pages/Login.razor
index f6b3dff..03bc2a0 100644
--- a/Components/Pages/Login.razor
+++ b/Components/Pages/Login.razor
@@ -3,39 +3,43 @@
@inject CustomAuthStateProvider AuthStateProvider
@inject NavigationManager Navigation
@inject ISettingsService SettingsService
+@inject ILocalizationService Loc
@rendermode InteractiveServer
-@T("Anmelden - Author Buddy", "Login - Author Buddy")
+@Loc["page.title.login"]
-
@T("Anmelden", "Login")
+
+
+
+
@Loc["login.heading"]
@if (!show2FA)
{
- @T("Benutzername:", "Username:")
+ @Loc["login.label.username"]
- @T("Passwort:", "Password:")
+ @Loc["login.label.password"]
}
else
{
-
@T("Gib den 6-stelligen Code aus deiner Authenticator-App ein:", "Enter the 6-digit code from your authenticator app:")
+
@Loc["login.2fa.instruction"]
- @T("2FA-Code:", "2FA code:")
+ @Loc["login.2fa.label.code"]
- @T("Bestätigen", "Verify")
+ @Loc["login.2fa.button.verify"]
}
@@ -47,7 +51,6 @@
@code {
- private string _language = "de";
private string username = string.Empty;
private string password = string.Empty;
private string twoFactorCode = string.Empty;
@@ -55,12 +58,8 @@
private bool isBusy;
private bool show2FA;
- private string T(string de, string en) => _language == "en" ? en : de;
-
protected override async Task OnInitializedAsync()
{
- _language = await SettingsService.GetLanguageAsync() ?? "de";
-
if (AuthService.IsLoggedIn)
{
Navigation.NavigateTo("/");
@@ -95,7 +94,7 @@
{
if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
{
- errorMessage = T("Bitte Benutzername und Passwort eingeben.", "Please enter username and password.");
+ errorMessage = Loc["login.error.empty_fields"];
return;
}
@@ -117,12 +116,12 @@
}
else
{
- errorMessage = T("Benutzername oder Passwort falsch.", "Invalid username or password.");
+ errorMessage = Loc["login.error.invalid_credentials"];
}
}
catch (Exception ex)
{
- errorMessage = $"{T("Fehler:", "Error:")} {ex.Message}";
+ errorMessage = $"{Loc["common.error"]} {ex.Message}";
}
finally
{
@@ -134,7 +133,7 @@
{
if (string.IsNullOrWhiteSpace(twoFactorCode) || twoFactorCode.Length != 6)
{
- errorMessage = T("Bitte gib einen gültigen 6-stelligen Code ein.", "Please enter a valid 6-digit code.");
+ errorMessage = Loc["login.2fa.error.invalid_code"];
return;
}
@@ -151,12 +150,12 @@
}
else
{
- errorMessage = T("Ungültiger Code. Bitte versuche es erneut.", "Invalid code. Please try again.");
+ errorMessage = Loc["login.2fa.error.code_failed"];
}
}
catch (Exception ex)
{
- errorMessage = $"{T("Fehler:", "Error:")} {ex.Message}";
+ errorMessage = $"{Loc["common.error"]} {ex.Message}";
}
finally
{
diff --git a/Components/Pages/Models.razor b/Components/Pages/Models.razor
index 25372f7..61d7e7c 100644
--- a/Components/Pages/Models.razor
+++ b/Components/Pages/Models.razor
@@ -1,20 +1,20 @@
@page "/models"
@attribute [Authorize]
@inject IOllamaService OllamaService
-@inject ISettingsService SettingsService
@inject NavigationManager Navigation
+@inject ILocalizationService Loc
-
@T("Modelle - Author Buddy", "Models - Author Buddy")
+
@Loc["page.title.models"]
-
@T("Ollama Modelle verwalten", "Manage Ollama models")
- @T("Aktualisieren", "Refresh")
+ @Loc["models.heading"]
+ @Loc["models.button.refresh"]
@if (isLoading)
{
-
@T("Lade Modelle...", "Loading models...")
+
@Loc["models.status.loading"]
}
else if (!string.IsNullOrEmpty(errorMessage))
{
@@ -28,8 +28,8 @@ else
@model.Name
- @T("Größe:", "Size:") @FormatSize(model.Size) |
- @T("Geändert:", "Modified:") @model.ModifiedAt?.ToString("g")
+ @Loc["models.label.size"] @FormatSize(model.Size) |
+ @Loc["models.label.modified"] @model.ModifiedAt?.ToString("g")
}
@@ -37,14 +37,14 @@ else
}
-
@T("Neues Modell herunterladen", "Download new model")
+
@Loc["models.pull.heading"]
@if (isPulling)
@@ -66,7 +66,6 @@ else
}
@code {
- private string _language = "de";
private List
localModels = new();
private bool isLoading;
private string? errorMessage;
@@ -77,11 +76,8 @@ else
private string? pullResult;
private string pullPercentDisplay => $"{pullProgress:F0}%";
- private string T(string de, string en) => _language == "en" ? en : de;
-
protected override async Task OnInitializedAsync()
{
- _language = await SettingsService.GetLanguageAsync() ?? "de";
await RefreshModels();
}
@@ -97,7 +93,7 @@ else
}
catch (Exception ex)
{
- errorMessage = $"{T("Fehler beim Laden der Modelle:", "Error loading models:")} {ex.Message}";
+ errorMessage = $"{Loc["models.error.loading"]} {ex.Message}";
localModels = new();
}
finally
@@ -112,7 +108,7 @@ else
isPulling = true;
pullProgress = 0;
- pullStatus = T("Starte Download...", "Starting download...");
+ pullStatus = Loc["models.pull.status.starting"];
pullResult = null;
try
@@ -124,13 +120,13 @@ else
});
await OllamaService.PullModelAsync(modelToPull, progress);
- pullResult = $"{T("Modell", "Model")} '{modelToPull}' {T("erfolgreich heruntergeladen.", "downloaded successfully.")}";
+ pullResult = $"{Loc["models.pull.status.model"]} '{modelToPull}' {Loc["models.pull.status.success"]}";
modelToPull = string.Empty;
await RefreshModels();
}
catch (Exception ex)
{
- pullResult = $"{T("Fehler:", "Error:")} {ex.Message}";
+ pullResult = $"{Loc["common.error"]} {ex.Message}";
}
finally
{
diff --git a/Components/Pages/NotFound.razor b/Components/Pages/NotFound.razor
index 0815110..4d254fc 100644
--- a/Components/Pages/NotFound.razor
+++ b/Components/Pages/NotFound.razor
@@ -1,25 +1,19 @@
@page "/not-found"
-@inject ISettingsService SettingsService
+@inject ILocalizationService Loc
@rendermode InteractiveServer
-@T("Seite nicht gefunden", "Page not found")
+@Loc["page.title.not_found"]
-@T("404 - Seite nicht gefunden", "404 - Page not found")
-@T("Die angeforderte Seite existiert nicht.", "The requested page does not exist.")
-@T("Zurück zur Startseite", "Back to home")
+@Loc["notfound.heading"]
+@Loc["notfound.message"]
+@Loc["notfound.link.back_to_home"]
@code {
- private string _language = "de";
-
- private string T(string de, string en) => _language == "en" ? en : de;
-
[CascadingParameter]
private HttpContext? HttpContext { get; set; }
- protected override async Task OnInitializedAsync()
+ protected override void OnInitialized()
{
- _language = await SettingsService.GetLanguageAsync() ?? "de";
-
if (HttpContext is not null)
{
HttpContext.Response.StatusCode = StatusCodes.Status404NotFound;
diff --git a/Components/Pages/OllamaAssistant.razor b/Components/Pages/OllamaAssistant.razor
index 5afa466..61e7ab5 100644
--- a/Components/Pages/OllamaAssistant.razor
+++ b/Components/Pages/OllamaAssistant.razor
@@ -3,23 +3,24 @@
@inject IOllamaService OllamaService
@inject ISettingsService SettingsService
@inject NavigationManager Navigation
+@inject ILocalizationService Loc
@rendermode InteractiveServer
-@T("Assistent - Author Buddy", "Assistant - Author Buddy")
+@Loc["page.title.assistant"]