From e64a38ccdfa6d606b61a901f00b5e414adef5fdb Mon Sep 17 00:00:00 2001 From: Roland Date: Sat, 4 Jul 2026 10:32:35 +0200 Subject: [PATCH] Design Improvements --- .../v18/DocumentLayout.backup.json | 411 +++++++----- .../v18/DocumentLayout.json | 411 +++++++----- Components/Layout/MainLayout.razor | 4 +- Components/Pages/Chat.razor | 34 +- Components/Pages/Editor.razor | 7 +- Components/Pages/FirstRunSetup.razor | 6 +- Components/Pages/Models.razor | 72 ++- Components/Pages/OllamaAssistant.razor | 3 +- Components/Pages/QuickMarkdown.razor | 203 +++++- Components/Pages/Settings.razor | 602 +++++++++--------- Components/Pages/Setup2FA.razor | 3 +- Components/Pages/UserManagement.razor | 3 +- Data/QuickMarkdownEntry.cs | 12 + Data/QuickMarkdownPrompt.cs | 11 + Program.cs | 1 + .../PublishProfiles/FolderProfile.pubxml.user | 2 +- Services/IOllamaService.cs | 1 + Services/IQuickMarkdownService.cs | 16 + Services/OllamaService.cs | 49 ++ Services/QuickMarkdownService.cs | 76 +++ wwwroot/app.css | 109 +++- 21 files changed, 1349 insertions(+), 687 deletions(-) create mode 100644 Data/QuickMarkdownEntry.cs create mode 100644 Data/QuickMarkdownPrompt.cs create mode 100644 Services/IQuickMarkdownService.cs create mode 100644 Services/QuickMarkdownService.cs diff --git a/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.backup.json b/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.backup.json index e38ca8f..6bff376 100644 --- a/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.backup.json +++ b/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.backup.json @@ -6,6 +6,46 @@ "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\\wwwroot\\app.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}", + "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:wwwroot\\app.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}" + }, + { + "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\\authorbuddy.web.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}", + "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:authorbuddy.web.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}" + }, + { + "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\quickmarkdown.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}", + "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\quickmarkdown.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\\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}" + }, + { + "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\\services\\ollamabackend.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ollamabackend.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\\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\\chatservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\chatservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, { "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\resources\\en.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}", "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:resources\\en.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}" @@ -30,22 +70,10 @@ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\layout\\navmenu.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}", "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\layout\\navmenu.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\\ollamabackend.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ollamabackend.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\\illmbackend.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\illmbackend.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\\chatservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\chatservice.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\\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}" @@ -62,10 +90,6 @@ "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\\pages\\dbadmin.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}", "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\dbadmin.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}" @@ -84,10 +108,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\\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}" - }, { "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}" @@ -96,10 +116,6 @@ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\iollamasetupservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\iollamasetupservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" }, - { - "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\authorbuddy.web.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}", - "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:authorbuddy.web.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}" - }, { "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\install.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}", "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:install.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}" @@ -192,7 +208,7 @@ "DocumentGroups": [ { "DockedWidth": 200, - "SelectedChildIndex": 6, + "SelectedChildIndex": 5, "Children": [ { "$type": "Bookmark", @@ -201,30 +217,43 @@ { "$type": "Document", "DocumentIndex": 1, - "Title": "en.json", - "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\en.json", - "RelativeDocumentMoniker": "Resources\\en.json", - "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\en.json", - "RelativeToolTip": "Resources\\en.json", - "ViewState": "AgIAABQBAAAAAAAAAAAAACQBAAAfAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", - "WhenOpened": "2026-06-14T06:03:36.064Z" + "Title": "app.css", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\wwwroot\\app.css", + "RelativeDocumentMoniker": "wwwroot\\app.css", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\wwwroot\\app.css", + "RelativeToolTip": "wwwroot\\app.css", + "ViewState": "AgIAAJYCAAAAAAAAAAAiwKoCAAAJAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|", + "WhenOpened": "2026-07-04T08:22:21.143Z", + "EditorCaption": "" }, { "$type": "Document", - "DocumentIndex": 2, - "Title": "de.json", - "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\de.json", - "RelativeDocumentMoniker": "Resources\\de.json", - "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\de.json", - "RelativeToolTip": "Resources\\de.json", - "ViewState": "AgIAABoBAAAAAAAAAAAAACQBAAACAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", - "WhenOpened": "2026-06-14T06:02:40.854Z" + "DocumentIndex": 5, + "Title": "Editor.razor", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Editor.razor", + "RelativeDocumentMoniker": "Components\\Pages\\Editor.razor", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Editor.razor", + "RelativeToolTip": "Components\\Pages\\Editor.razor", + "ViewState": "AgIAAC0AAAAAAAAAAAAAABIAAAAKAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", + "WhenOpened": "2026-05-16T13:01:59.743Z" }, { "$type": "Document", - "DocumentIndex": 4, + "DocumentIndex": 9, + "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": "AgIAAAAAAAAAAAAAAAAAAA0AAAAUAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-06-22T18:01:10.082Z" + }, + { + "$type": "Document", + "DocumentIndex": 14, "Title": "Chat.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Chat.razor", "RelativeDocumentMoniker": "Components\\Pages\\Chat.razor", @@ -236,19 +265,57 @@ }, { "$type": "Document", - "DocumentIndex": 7, + "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": "AgIAADIAAAAAAAAAAAApwEUAAAByAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", + "WhenOpened": "2026-05-15T16:04:36.444Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 6, + "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": "AgIAAEcAAAAAAAAAAAAQwFoAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-05-20T04:07:21.54Z" + }, + { + "$type": "Document", + "DocumentIndex": 8, "Title": "OllamaBackend.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaBackend.cs", "RelativeDocumentMoniker": "Services\\OllamaBackend.cs", "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaBackend.cs", "RelativeToolTip": "Services\\OllamaBackend.cs", - "ViewState": "AgIAACUAAAAAAAAAAAASwDUAAAAeAAAAAAAAAA==", + "ViewState": "AgIAACkAAAAAAAAAAAAQwEEAAAAMAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "WhenOpened": "2026-06-14T05:03:24.305Z" }, { "$type": "Document", - "DocumentIndex": 17, + "DocumentIndex": 2, + "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": "AgIAABIAAAAAAAAAAAAAADMAAAAfAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", + "WhenOpened": "2026-05-15T16:43:26.6Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 23, "Title": "DbAdminService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\DbAdminService.cs", "RelativeDocumentMoniker": "Services\\DbAdminService.cs", @@ -260,20 +327,43 @@ }, { "$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": "AgIAAFAAAAAAAAAAAAAQwGEAAAAZAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", - "WhenOpened": "2026-05-15T16:04:36.444Z", - "EditorCaption": "" + "DocumentIndex": 3, + "Title": "AuthorBuddy.Web.csproj", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\AuthorBuddy.Web.csproj", + "RelativeDocumentMoniker": "AuthorBuddy.Web.csproj", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\AuthorBuddy.Web.csproj", + "RelativeToolTip": "AuthorBuddy.Web.csproj", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|", + "WhenOpened": "2026-05-14T10:14:30.128Z" }, { "$type": "Document", - "DocumentIndex": 12, + "DocumentIndex": 7, + "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": "AgIAAK8AAAAAAAAAAAAqwLwAAAAIAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-06-26T13:33:25.661Z" + }, + { + "$type": "Document", + "DocumentIndex": 4, + "Title": "QuickMarkdown.razor", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\QuickMarkdown.razor", + "RelativeDocumentMoniker": "Components\\Pages\\QuickMarkdown.razor", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\QuickMarkdown.razor", + "RelativeToolTip": "Components\\Pages\\QuickMarkdown.razor", + "ViewState": "AgIAACkAAAAAAAAAAAAiwEoAAABfAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", + "WhenOpened": "2026-07-01T16:53:16.035Z" + }, + { + "$type": "Document", + "DocumentIndex": 19, "Title": "Login.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor", "RelativeDocumentMoniker": "Components\\Pages\\Login.razor", @@ -285,7 +375,7 @@ }, { "$type": "Document", - "DocumentIndex": 13, + "DocumentIndex": 20, "Title": "FirstRunSetup.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\FirstRunSetup.razor", "RelativeDocumentMoniker": "Components\\Pages\\FirstRunSetup.razor", @@ -297,7 +387,7 @@ }, { "$type": "Document", - "DocumentIndex": 3, + "DocumentIndex": 13, "Title": "SettingsService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\SettingsService.cs", "RelativeDocumentMoniker": "Services\\SettingsService.cs", @@ -310,79 +400,6 @@ { "$type": "Document", "DocumentIndex": 10, - "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": "AgIAAFAAAAAAAAAAAAAQwGMAAAAhAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-05-20T04:07:21.54Z" - }, - { - "$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": "AgIAAJsAAAAAAAAAAAAAAKwAAAAAAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", - "WhenOpened": "2026-05-15T16:43:26.6Z" - }, - { - "$type": "Document", - "DocumentIndex": 21, - "Title": "Editor.razor", - "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Editor.razor", - "RelativeDocumentMoniker": "Components\\Pages\\Editor.razor", - "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Editor.razor", - "RelativeToolTip": "Components\\Pages\\Editor.razor", - "ViewState": "AgIAAFsCAAAAAAAAAAAiwEgDAAAkAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", - "WhenOpened": "2026-05-16T13:01:59.743Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 6, - "Title": "NavMenu.razor", - "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\NavMenu.razor", - "RelativeDocumentMoniker": "Components\\Layout\\NavMenu.razor", - "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\NavMenu.razor", - "RelativeToolTip": "Components\\Layout\\NavMenu.razor", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", - "WhenOpened": "2026-05-15T16:04:37.739Z" - }, - { - "$type": "Document", - "DocumentIndex": 5, - "Title": "MainLayout.razor.css", - "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor.css", - "RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor.css", - "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor.css", - "RelativeToolTip": "Components\\Layout\\MainLayout.razor.css", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|", - "WhenOpened": "2026-05-15T16:04:50.455Z" - }, - { - "$type": "Document", - "DocumentIndex": 16, - "Title": "DbAdmin.razor", - "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\DbAdmin.razor", - "RelativeDocumentMoniker": "Components\\Pages\\DbAdmin.razor", - "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\DbAdmin.razor", - "RelativeToolTip": "Components\\Pages\\DbAdmin.razor", - "ViewState": "AgIAAFwAAAAAAAAAAAApwKMAAAAcAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", - "WhenOpened": "2026-06-10T17:34:42.97Z" - }, - { - "$type": "Document", - "DocumentIndex": 9, "Title": "ChatService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ChatService.cs", "RelativeDocumentMoniker": "Services\\ChatService.cs", @@ -394,7 +411,67 @@ }, { "$type": "Document", - "DocumentIndex": 8, + "DocumentIndex": 12, + "Title": "de.json", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\de.json", + "RelativeDocumentMoniker": "Resources\\de.json", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\de.json", + "RelativeToolTip": "Resources\\de.json", + "ViewState": "AgIAABoBAAAAAAAAAAAAACQBAAACAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", + "WhenOpened": "2026-06-14T06:02:40.854Z" + }, + { + "$type": "Document", + "DocumentIndex": 11, + "Title": "en.json", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\en.json", + "RelativeDocumentMoniker": "Resources\\en.json", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\en.json", + "RelativeToolTip": "Resources\\en.json", + "ViewState": "AgIAABQBAAAAAAAAAAAAACQBAAAfAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", + "WhenOpened": "2026-06-14T06:03:36.064Z" + }, + { + "$type": "Document", + "DocumentIndex": 16, + "Title": "NavMenu.razor", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\NavMenu.razor", + "RelativeDocumentMoniker": "Components\\Layout\\NavMenu.razor", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\NavMenu.razor", + "RelativeToolTip": "Components\\Layout\\NavMenu.razor", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", + "WhenOpened": "2026-05-15T16:04:37.739Z" + }, + { + "$type": "Document", + "DocumentIndex": 15, + "Title": "MainLayout.razor.css", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor.css", + "RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor.css", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor.css", + "RelativeToolTip": "Components\\Layout\\MainLayout.razor.css", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|", + "WhenOpened": "2026-05-15T16:04:50.455Z" + }, + { + "$type": "Document", + "DocumentIndex": 22, + "Title": "DbAdmin.razor", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\DbAdmin.razor", + "RelativeDocumentMoniker": "Components\\Pages\\DbAdmin.razor", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\DbAdmin.razor", + "RelativeToolTip": "Components\\Pages\\DbAdmin.razor", + "ViewState": "AgIAAFwAAAAAAAAAAAApwKMAAAAcAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", + "WhenOpened": "2026-06-10T17:34:42.97Z" + }, + { + "$type": "Document", + "DocumentIndex": 17, "Title": "ILLMBackend.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ILLMBackend.cs", "RelativeDocumentMoniker": "Services\\ILLMBackend.cs", @@ -406,7 +483,7 @@ }, { "$type": "Document", - "DocumentIndex": 11, + "DocumentIndex": 18, "Title": "UserEntity.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\UserEntity.cs", "RelativeDocumentMoniker": "Data\\UserEntity.cs", @@ -418,7 +495,7 @@ }, { "$type": "Document", - "DocumentIndex": 14, + "DocumentIndex": 21, "Title": "OllamaAssistant.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor", "RelativeDocumentMoniker": "Components\\Pages\\OllamaAssistant.razor", @@ -430,7 +507,7 @@ }, { "$type": "Document", - "DocumentIndex": 22, + "DocumentIndex": 27, "Title": "ProjectService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ProjectService.cs", "RelativeDocumentMoniker": "Services\\ProjectService.cs", @@ -442,7 +519,7 @@ }, { "$type": "Document", - "DocumentIndex": 23, + "DocumentIndex": 28, "Title": "IOllamaSetupService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaSetupService.cs", "RelativeDocumentMoniker": "Services\\IOllamaSetupService.cs", @@ -454,7 +531,7 @@ }, { "$type": "Document", - "DocumentIndex": 18, + "DocumentIndex": 24, "Title": "SafeFileHandle.Windows.cs", "DocumentMoniker": "C:\\Users\\HP\\AppData\\Local\\SourceServer\\dddeb33c46e3c746b90c5f64463103c08ec03b9a85e92eab3b21c11218135d28\\src\\runtime\\src\\libraries\\System.Private.CoreLib\\src\\Microsoft\\Win32\\SafeHandles\\SafeFileHandle.Windows.cs", "ToolTip": "C:\\Users\\HP\\AppData\\Local\\SourceServer\\dddeb33c46e3c746b90c5f64463103c08ec03b9a85e92eab3b21c11218135d28\\src\\runtime\\src\\libraries\\System.Private.CoreLib\\src\\Microsoft\\Win32\\SafeHandles\\SafeFileHandle.Windows.cs [Schreibgesch\u00FCtzt]", @@ -465,7 +542,7 @@ }, { "$type": "Document", - "DocumentIndex": 19, + "DocumentIndex": 25, "Title": "A7405018.jpg", "DocumentMoniker": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg", "ToolTip": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg", @@ -474,19 +551,7 @@ }, { "$type": "Document", - "DocumentIndex": 24, - "Title": "AuthorBuddy.Web.csproj", - "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\AuthorBuddy.Web.csproj", - "RelativeDocumentMoniker": "AuthorBuddy.Web.csproj", - "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\AuthorBuddy.Web.csproj", - "RelativeToolTip": "AuthorBuddy.Web.csproj", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|", - "WhenOpened": "2026-05-14T10:14:30.128Z" - }, - { - "$type": "Document", - "DocumentIndex": 25, + "DocumentIndex": 29, "Title": "INSTALL.md", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\INSTALL.md", "RelativeDocumentMoniker": "INSTALL.md", @@ -498,7 +563,7 @@ }, { "$type": "Document", - "DocumentIndex": 26, + "DocumentIndex": 30, "Title": "IThemeService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IThemeService.cs", "RelativeDocumentMoniker": "Services\\IThemeService.cs", @@ -510,7 +575,7 @@ }, { "$type": "Document", - "DocumentIndex": 27, + "DocumentIndex": 31, "Title": "RedirectToLogin.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\RedirectToLogin.razor", "RelativeDocumentMoniker": "Components\\RedirectToLogin.razor", @@ -522,7 +587,7 @@ }, { "$type": "Document", - "DocumentIndex": 28, + "DocumentIndex": 32, "Title": "ISettingsService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ISettingsService.cs", "RelativeDocumentMoniker": "Services\\ISettingsService.cs", @@ -534,7 +599,7 @@ }, { "$type": "Document", - "DocumentIndex": 29, + "DocumentIndex": 33, "Title": "IRagService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IRagService.cs", "RelativeDocumentMoniker": "Services\\IRagService.cs", @@ -546,7 +611,7 @@ }, { "$type": "Document", - "DocumentIndex": 30, + "DocumentIndex": 34, "Title": "ThemeService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs", "RelativeDocumentMoniker": "Services\\ThemeService.cs", @@ -558,7 +623,7 @@ }, { "$type": "Document", - "DocumentIndex": 31, + "DocumentIndex": 35, "Title": "logo.jpg", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Assets\\logo.jpg", "RelativeDocumentMoniker": "Assets\\logo.jpg", @@ -569,7 +634,7 @@ }, { "$type": "Document", - "DocumentIndex": 32, + "DocumentIndex": 36, "Title": "OllamaSettings.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs", "RelativeDocumentMoniker": "Models\\OllamaSettings.cs", @@ -581,7 +646,7 @@ }, { "$type": "Document", - "DocumentIndex": 20, + "DocumentIndex": 26, "Title": "AppDbContext.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs", "RelativeDocumentMoniker": "Data\\AppDbContext.cs", @@ -592,7 +657,7 @@ }, { "$type": "Document", - "DocumentIndex": 33, + "DocumentIndex": 37, "Title": "FileScannerService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs", "RelativeDocumentMoniker": "Services\\FileScannerService.cs", @@ -604,7 +669,7 @@ }, { "$type": "Document", - "DocumentIndex": 34, + "DocumentIndex": 38, "Title": "TotpHelper.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs", "RelativeDocumentMoniker": "Services\\TotpHelper.cs", @@ -616,7 +681,7 @@ }, { "$type": "Document", - "DocumentIndex": 35, + "DocumentIndex": 39, "Title": "Project.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs", "RelativeDocumentMoniker": "Models\\Project.cs", @@ -628,7 +693,7 @@ }, { "$type": "Document", - "DocumentIndex": 36, + "DocumentIndex": 40, "Title": "RagService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs", "RelativeDocumentMoniker": "Services\\RagService.cs", @@ -640,7 +705,7 @@ }, { "$type": "Document", - "DocumentIndex": 37, + "DocumentIndex": 41, "Title": "App.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor", "RelativeDocumentMoniker": "Components\\App.razor", @@ -652,7 +717,7 @@ }, { "$type": "Document", - "DocumentIndex": 38, + "DocumentIndex": 42, "Title": "Models.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor", "RelativeDocumentMoniker": "Components\\Pages\\Models.razor", @@ -664,7 +729,7 @@ }, { "$type": "Document", - "DocumentIndex": 39, + "DocumentIndex": 43, "Title": "LLM_Model.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs", "RelativeDocumentMoniker": "Models\\LLM_Model.cs", @@ -676,7 +741,7 @@ }, { "$type": "Document", - "DocumentIndex": 40, + "DocumentIndex": 44, "Title": "ModelStatus.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs", "RelativeDocumentMoniker": "Models\\ModelStatus.cs", @@ -688,7 +753,7 @@ }, { "$type": "Document", - "DocumentIndex": 41, + "DocumentIndex": 45, "Title": "IFileScannerService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IFileScannerService.cs", "RelativeDocumentMoniker": "Services\\IFileScannerService.cs", @@ -700,7 +765,7 @@ }, { "$type": "Document", - "DocumentIndex": 42, + "DocumentIndex": 46, "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", @@ -712,7 +777,7 @@ }, { "$type": "Document", - "DocumentIndex": 43, + "DocumentIndex": 47, "Title": "ProjectEntity.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\ProjectEntity.cs", "RelativeDocumentMoniker": "Data\\ProjectEntity.cs", @@ -724,7 +789,7 @@ }, { "$type": "Document", - "DocumentIndex": 44, + "DocumentIndex": 48, "Title": "IProjectService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IProjectService.cs", "RelativeDocumentMoniker": "Services\\IProjectService.cs", @@ -736,7 +801,7 @@ }, { "$type": "Document", - "DocumentIndex": 45, + "DocumentIndex": 49, "Title": "appsettings.json", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\appsettings.json", "RelativeDocumentMoniker": "appsettings.json", diff --git a/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.json b/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.json index 62fe829..6bff376 100644 --- a/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.json +++ b/.vs/AuthorBuddy.Web.slnx/v18/DocumentLayout.json @@ -6,6 +6,46 @@ "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\\wwwroot\\app.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}", + "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:wwwroot\\app.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}" + }, + { + "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\\authorbuddy.web.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}", + "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:authorbuddy.web.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}" + }, + { + "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\quickmarkdown.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}", + "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\quickmarkdown.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\\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}" + }, + { + "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\\services\\ollamabackend.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ollamabackend.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\\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\\chatservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", + "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\chatservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" + }, { "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\resources\\en.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}", "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:resources\\en.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}" @@ -30,22 +70,10 @@ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\layout\\navmenu.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}", "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\layout\\navmenu.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\\ollamabackend.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ollamabackend.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\\illmbackend.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\illmbackend.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\\chatservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", - "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\chatservice.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\\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}" @@ -62,10 +90,6 @@ "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\\pages\\dbadmin.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}", "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\dbadmin.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}" @@ -84,10 +108,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\\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}" - }, { "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}" @@ -96,10 +116,6 @@ "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\iollamasetupservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\iollamasetupservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" }, - { - "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\authorbuddy.web.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}", - "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:authorbuddy.web.csproj||{FA3CD31E-987B-443A-9B81-186104E8DAC1}" - }, { "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\install.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}", "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:install.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}" @@ -192,7 +208,7 @@ "DocumentGroups": [ { "DockedWidth": 200, - "SelectedChildIndex": 6, + "SelectedChildIndex": 5, "Children": [ { "$type": "Bookmark", @@ -201,30 +217,43 @@ { "$type": "Document", "DocumentIndex": 1, - "Title": "en.json", - "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\en.json", - "RelativeDocumentMoniker": "Resources\\en.json", - "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\en.json", - "RelativeToolTip": "Resources\\en.json", - "ViewState": "AgIAABQBAAAAAAAAAAAAACQBAAAfAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", - "WhenOpened": "2026-06-14T06:03:36.064Z" + "Title": "app.css", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\wwwroot\\app.css", + "RelativeDocumentMoniker": "wwwroot\\app.css", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\wwwroot\\app.css", + "RelativeToolTip": "wwwroot\\app.css", + "ViewState": "AgIAAJYCAAAAAAAAAAAiwKoCAAAJAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|", + "WhenOpened": "2026-07-04T08:22:21.143Z", + "EditorCaption": "" }, { "$type": "Document", - "DocumentIndex": 2, - "Title": "de.json", - "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\de.json", - "RelativeDocumentMoniker": "Resources\\de.json", - "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\de.json", - "RelativeToolTip": "Resources\\de.json", - "ViewState": "AgIAABoBAAAAAAAAAAAAACQBAAACAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", - "WhenOpened": "2026-06-14T06:02:40.854Z" + "DocumentIndex": 5, + "Title": "Editor.razor", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Editor.razor", + "RelativeDocumentMoniker": "Components\\Pages\\Editor.razor", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Editor.razor", + "RelativeToolTip": "Components\\Pages\\Editor.razor", + "ViewState": "AgIAAC0AAAAAAAAAAAAAABIAAAAKAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", + "WhenOpened": "2026-05-16T13:01:59.743Z" }, { "$type": "Document", - "DocumentIndex": 4, + "DocumentIndex": 9, + "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": "AgIAAAAAAAAAAAAAAAAAAA0AAAAUAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-06-22T18:01:10.082Z" + }, + { + "$type": "Document", + "DocumentIndex": 14, "Title": "Chat.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Chat.razor", "RelativeDocumentMoniker": "Components\\Pages\\Chat.razor", @@ -236,19 +265,57 @@ }, { "$type": "Document", - "DocumentIndex": 7, + "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": "AgIAADIAAAAAAAAAAAApwEUAAAByAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", + "WhenOpened": "2026-05-15T16:04:36.444Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 6, + "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": "AgIAAEcAAAAAAAAAAAAQwFoAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-05-20T04:07:21.54Z" + }, + { + "$type": "Document", + "DocumentIndex": 8, "Title": "OllamaBackend.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaBackend.cs", "RelativeDocumentMoniker": "Services\\OllamaBackend.cs", "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaBackend.cs", "RelativeToolTip": "Services\\OllamaBackend.cs", - "ViewState": "AgIAACUAAAAAAAAAAAASwDUAAAAeAAAAAAAAAA==", + "ViewState": "AgIAACkAAAAAAAAAAAAQwEEAAAAMAAAAAAAAAA==", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "WhenOpened": "2026-06-14T05:03:24.305Z" }, { "$type": "Document", - "DocumentIndex": 17, + "DocumentIndex": 2, + "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": "AgIAABIAAAAAAAAAAAAAADMAAAAfAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", + "WhenOpened": "2026-05-15T16:43:26.6Z", + "EditorCaption": "" + }, + { + "$type": "Document", + "DocumentIndex": 23, "Title": "DbAdminService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\DbAdminService.cs", "RelativeDocumentMoniker": "Services\\DbAdminService.cs", @@ -260,20 +327,43 @@ }, { "$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": "AgIAAFAAAAAAAAAAAAAQwFUAAAApAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", - "WhenOpened": "2026-05-15T16:04:36.444Z", - "EditorCaption": "" + "DocumentIndex": 3, + "Title": "AuthorBuddy.Web.csproj", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\AuthorBuddy.Web.csproj", + "RelativeDocumentMoniker": "AuthorBuddy.Web.csproj", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\AuthorBuddy.Web.csproj", + "RelativeToolTip": "AuthorBuddy.Web.csproj", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|", + "WhenOpened": "2026-05-14T10:14:30.128Z" }, { "$type": "Document", - "DocumentIndex": 12, + "DocumentIndex": 7, + "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": "AgIAAK8AAAAAAAAAAAAqwLwAAAAIAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", + "WhenOpened": "2026-06-26T13:33:25.661Z" + }, + { + "$type": "Document", + "DocumentIndex": 4, + "Title": "QuickMarkdown.razor", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\QuickMarkdown.razor", + "RelativeDocumentMoniker": "Components\\Pages\\QuickMarkdown.razor", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\QuickMarkdown.razor", + "RelativeToolTip": "Components\\Pages\\QuickMarkdown.razor", + "ViewState": "AgIAACkAAAAAAAAAAAAiwEoAAABfAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", + "WhenOpened": "2026-07-01T16:53:16.035Z" + }, + { + "$type": "Document", + "DocumentIndex": 19, "Title": "Login.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor", "RelativeDocumentMoniker": "Components\\Pages\\Login.razor", @@ -285,7 +375,7 @@ }, { "$type": "Document", - "DocumentIndex": 13, + "DocumentIndex": 20, "Title": "FirstRunSetup.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\FirstRunSetup.razor", "RelativeDocumentMoniker": "Components\\Pages\\FirstRunSetup.razor", @@ -297,7 +387,7 @@ }, { "$type": "Document", - "DocumentIndex": 3, + "DocumentIndex": 13, "Title": "SettingsService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\SettingsService.cs", "RelativeDocumentMoniker": "Services\\SettingsService.cs", @@ -310,79 +400,6 @@ { "$type": "Document", "DocumentIndex": 10, - "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": "AgIAAFAAAAAAAAAAAAAQwGMAAAAhAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", - "WhenOpened": "2026-05-20T04:07:21.54Z" - }, - { - "$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": "AgIAAJsAAAAAAAAAAAAAAKwAAAAAAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", - "WhenOpened": "2026-05-15T16:43:26.6Z" - }, - { - "$type": "Document", - "DocumentIndex": 21, - "Title": "Editor.razor", - "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Editor.razor", - "RelativeDocumentMoniker": "Components\\Pages\\Editor.razor", - "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Editor.razor", - "RelativeToolTip": "Components\\Pages\\Editor.razor", - "ViewState": "AgIAAFsCAAAAAAAAAAAiwEgDAAAkAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", - "WhenOpened": "2026-05-16T13:01:59.743Z", - "EditorCaption": "" - }, - { - "$type": "Document", - "DocumentIndex": 6, - "Title": "NavMenu.razor", - "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\NavMenu.razor", - "RelativeDocumentMoniker": "Components\\Layout\\NavMenu.razor", - "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\NavMenu.razor", - "RelativeToolTip": "Components\\Layout\\NavMenu.razor", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", - "WhenOpened": "2026-05-15T16:04:37.739Z" - }, - { - "$type": "Document", - "DocumentIndex": 5, - "Title": "MainLayout.razor.css", - "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor.css", - "RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor.css", - "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor.css", - "RelativeToolTip": "Components\\Layout\\MainLayout.razor.css", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|", - "WhenOpened": "2026-05-15T16:04:50.455Z" - }, - { - "$type": "Document", - "DocumentIndex": 16, - "Title": "DbAdmin.razor", - "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\DbAdmin.razor", - "RelativeDocumentMoniker": "Components\\Pages\\DbAdmin.razor", - "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\DbAdmin.razor", - "RelativeToolTip": "Components\\Pages\\DbAdmin.razor", - "ViewState": "AgIAAFwAAAAAAAAAAAApwKMAAAAcAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", - "WhenOpened": "2026-06-10T17:34:42.97Z" - }, - { - "$type": "Document", - "DocumentIndex": 9, "Title": "ChatService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ChatService.cs", "RelativeDocumentMoniker": "Services\\ChatService.cs", @@ -394,7 +411,67 @@ }, { "$type": "Document", - "DocumentIndex": 8, + "DocumentIndex": 12, + "Title": "de.json", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\de.json", + "RelativeDocumentMoniker": "Resources\\de.json", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\de.json", + "RelativeToolTip": "Resources\\de.json", + "ViewState": "AgIAABoBAAAAAAAAAAAAACQBAAACAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", + "WhenOpened": "2026-06-14T06:02:40.854Z" + }, + { + "$type": "Document", + "DocumentIndex": 11, + "Title": "en.json", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\en.json", + "RelativeDocumentMoniker": "Resources\\en.json", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Resources\\en.json", + "RelativeToolTip": "Resources\\en.json", + "ViewState": "AgIAABQBAAAAAAAAAAAAACQBAAAfAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001642|", + "WhenOpened": "2026-06-14T06:03:36.064Z" + }, + { + "$type": "Document", + "DocumentIndex": 16, + "Title": "NavMenu.razor", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\NavMenu.razor", + "RelativeDocumentMoniker": "Components\\Layout\\NavMenu.razor", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\NavMenu.razor", + "RelativeToolTip": "Components\\Layout\\NavMenu.razor", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", + "WhenOpened": "2026-05-15T16:04:37.739Z" + }, + { + "$type": "Document", + "DocumentIndex": 15, + "Title": "MainLayout.razor.css", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor.css", + "RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor.css", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor.css", + "RelativeToolTip": "Components\\Layout\\MainLayout.razor.css", + "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|", + "WhenOpened": "2026-05-15T16:04:50.455Z" + }, + { + "$type": "Document", + "DocumentIndex": 22, + "Title": "DbAdmin.razor", + "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\DbAdmin.razor", + "RelativeDocumentMoniker": "Components\\Pages\\DbAdmin.razor", + "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\DbAdmin.razor", + "RelativeToolTip": "Components\\Pages\\DbAdmin.razor", + "ViewState": "AgIAAFwAAAAAAAAAAAApwKMAAAAcAAAAAAAAAA==", + "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", + "WhenOpened": "2026-06-10T17:34:42.97Z" + }, + { + "$type": "Document", + "DocumentIndex": 17, "Title": "ILLMBackend.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ILLMBackend.cs", "RelativeDocumentMoniker": "Services\\ILLMBackend.cs", @@ -406,7 +483,7 @@ }, { "$type": "Document", - "DocumentIndex": 11, + "DocumentIndex": 18, "Title": "UserEntity.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\UserEntity.cs", "RelativeDocumentMoniker": "Data\\UserEntity.cs", @@ -418,7 +495,7 @@ }, { "$type": "Document", - "DocumentIndex": 14, + "DocumentIndex": 21, "Title": "OllamaAssistant.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor", "RelativeDocumentMoniker": "Components\\Pages\\OllamaAssistant.razor", @@ -430,7 +507,7 @@ }, { "$type": "Document", - "DocumentIndex": 22, + "DocumentIndex": 27, "Title": "ProjectService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ProjectService.cs", "RelativeDocumentMoniker": "Services\\ProjectService.cs", @@ -442,7 +519,7 @@ }, { "$type": "Document", - "DocumentIndex": 23, + "DocumentIndex": 28, "Title": "IOllamaSetupService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaSetupService.cs", "RelativeDocumentMoniker": "Services\\IOllamaSetupService.cs", @@ -454,7 +531,7 @@ }, { "$type": "Document", - "DocumentIndex": 18, + "DocumentIndex": 24, "Title": "SafeFileHandle.Windows.cs", "DocumentMoniker": "C:\\Users\\HP\\AppData\\Local\\SourceServer\\dddeb33c46e3c746b90c5f64463103c08ec03b9a85e92eab3b21c11218135d28\\src\\runtime\\src\\libraries\\System.Private.CoreLib\\src\\Microsoft\\Win32\\SafeHandles\\SafeFileHandle.Windows.cs", "ToolTip": "C:\\Users\\HP\\AppData\\Local\\SourceServer\\dddeb33c46e3c746b90c5f64463103c08ec03b9a85e92eab3b21c11218135d28\\src\\runtime\\src\\libraries\\System.Private.CoreLib\\src\\Microsoft\\Win32\\SafeHandles\\SafeFileHandle.Windows.cs [Schreibgesch\u00FCtzt]", @@ -465,7 +542,7 @@ }, { "$type": "Document", - "DocumentIndex": 19, + "DocumentIndex": 25, "Title": "A7405018.jpg", "DocumentMoniker": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg", "ToolTip": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg", @@ -474,19 +551,7 @@ }, { "$type": "Document", - "DocumentIndex": 24, - "Title": "AuthorBuddy.Web.csproj", - "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\AuthorBuddy.Web.csproj", - "RelativeDocumentMoniker": "AuthorBuddy.Web.csproj", - "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\AuthorBuddy.Web.csproj", - "RelativeToolTip": "AuthorBuddy.Web.csproj", - "ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==", - "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000758|", - "WhenOpened": "2026-05-14T10:14:30.128Z" - }, - { - "$type": "Document", - "DocumentIndex": 25, + "DocumentIndex": 29, "Title": "INSTALL.md", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\INSTALL.md", "RelativeDocumentMoniker": "INSTALL.md", @@ -498,7 +563,7 @@ }, { "$type": "Document", - "DocumentIndex": 26, + "DocumentIndex": 30, "Title": "IThemeService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IThemeService.cs", "RelativeDocumentMoniker": "Services\\IThemeService.cs", @@ -510,7 +575,7 @@ }, { "$type": "Document", - "DocumentIndex": 27, + "DocumentIndex": 31, "Title": "RedirectToLogin.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\RedirectToLogin.razor", "RelativeDocumentMoniker": "Components\\RedirectToLogin.razor", @@ -522,7 +587,7 @@ }, { "$type": "Document", - "DocumentIndex": 28, + "DocumentIndex": 32, "Title": "ISettingsService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ISettingsService.cs", "RelativeDocumentMoniker": "Services\\ISettingsService.cs", @@ -534,7 +599,7 @@ }, { "$type": "Document", - "DocumentIndex": 29, + "DocumentIndex": 33, "Title": "IRagService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IRagService.cs", "RelativeDocumentMoniker": "Services\\IRagService.cs", @@ -546,7 +611,7 @@ }, { "$type": "Document", - "DocumentIndex": 30, + "DocumentIndex": 34, "Title": "ThemeService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs", "RelativeDocumentMoniker": "Services\\ThemeService.cs", @@ -558,7 +623,7 @@ }, { "$type": "Document", - "DocumentIndex": 31, + "DocumentIndex": 35, "Title": "logo.jpg", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Assets\\logo.jpg", "RelativeDocumentMoniker": "Assets\\logo.jpg", @@ -569,7 +634,7 @@ }, { "$type": "Document", - "DocumentIndex": 32, + "DocumentIndex": 36, "Title": "OllamaSettings.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs", "RelativeDocumentMoniker": "Models\\OllamaSettings.cs", @@ -581,7 +646,7 @@ }, { "$type": "Document", - "DocumentIndex": 20, + "DocumentIndex": 26, "Title": "AppDbContext.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs", "RelativeDocumentMoniker": "Data\\AppDbContext.cs", @@ -592,7 +657,7 @@ }, { "$type": "Document", - "DocumentIndex": 33, + "DocumentIndex": 37, "Title": "FileScannerService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs", "RelativeDocumentMoniker": "Services\\FileScannerService.cs", @@ -604,7 +669,7 @@ }, { "$type": "Document", - "DocumentIndex": 34, + "DocumentIndex": 38, "Title": "TotpHelper.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs", "RelativeDocumentMoniker": "Services\\TotpHelper.cs", @@ -616,7 +681,7 @@ }, { "$type": "Document", - "DocumentIndex": 35, + "DocumentIndex": 39, "Title": "Project.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs", "RelativeDocumentMoniker": "Models\\Project.cs", @@ -628,7 +693,7 @@ }, { "$type": "Document", - "DocumentIndex": 36, + "DocumentIndex": 40, "Title": "RagService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs", "RelativeDocumentMoniker": "Services\\RagService.cs", @@ -640,7 +705,7 @@ }, { "$type": "Document", - "DocumentIndex": 37, + "DocumentIndex": 41, "Title": "App.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor", "RelativeDocumentMoniker": "Components\\App.razor", @@ -652,7 +717,7 @@ }, { "$type": "Document", - "DocumentIndex": 38, + "DocumentIndex": 42, "Title": "Models.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor", "RelativeDocumentMoniker": "Components\\Pages\\Models.razor", @@ -664,7 +729,7 @@ }, { "$type": "Document", - "DocumentIndex": 39, + "DocumentIndex": 43, "Title": "LLM_Model.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs", "RelativeDocumentMoniker": "Models\\LLM_Model.cs", @@ -676,7 +741,7 @@ }, { "$type": "Document", - "DocumentIndex": 40, + "DocumentIndex": 44, "Title": "ModelStatus.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs", "RelativeDocumentMoniker": "Models\\ModelStatus.cs", @@ -688,7 +753,7 @@ }, { "$type": "Document", - "DocumentIndex": 41, + "DocumentIndex": 45, "Title": "IFileScannerService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IFileScannerService.cs", "RelativeDocumentMoniker": "Services\\IFileScannerService.cs", @@ -700,7 +765,7 @@ }, { "$type": "Document", - "DocumentIndex": 42, + "DocumentIndex": 46, "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", @@ -712,7 +777,7 @@ }, { "$type": "Document", - "DocumentIndex": 43, + "DocumentIndex": 47, "Title": "ProjectEntity.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\ProjectEntity.cs", "RelativeDocumentMoniker": "Data\\ProjectEntity.cs", @@ -724,7 +789,7 @@ }, { "$type": "Document", - "DocumentIndex": 44, + "DocumentIndex": 48, "Title": "IProjectService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IProjectService.cs", "RelativeDocumentMoniker": "Services\\IProjectService.cs", @@ -736,7 +801,7 @@ }, { "$type": "Document", - "DocumentIndex": 45, + "DocumentIndex": 49, "Title": "appsettings.json", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\appsettings.json", "RelativeDocumentMoniker": "appsettings.json", diff --git a/Components/Layout/MainLayout.razor b/Components/Layout/MainLayout.razor index a0c5c5f..0ee63c9 100644 --- a/Components/Layout/MainLayout.razor +++ b/Components/Layout/MainLayout.razor @@ -68,7 +68,6 @@ else - } else { @@ -297,7 +296,7 @@ else @@ -444,6 +443,7 @@ else private string? currentFilePath; private string copyProjectName = string.Empty; private string copyProjectPath = string.Empty; + private bool _copyProjectDisabled => string.IsNullOrWhiteSpace(copyProjectName) || string.IsNullOrWhiteSpace(copyProjectPath); private Project? copyProjectSource; private bool showRenameDialog; private string renameNewName = string.Empty; diff --git a/Components/Pages/Chat.razor b/Components/Pages/Chat.razor index c2422af..406db46 100644 --- a/Components/Pages/Chat.razor +++ b/Components/Pages/Chat.razor @@ -6,6 +6,7 @@ @inject ISettingsService SettingsService @inject IAuthService AuthService @inject NavigationManager Navigation +@inject IJSRuntime JS @rendermode InteractiveServer @@ -31,7 +32,7 @@
- +
präzise (0) kreativ (2) @@ -70,11 +71,11 @@
- -
@@ -92,8 +93,10 @@ private bool _isBusy; private int _userId; private bool _showSettings; + private bool _sendDisabled => _isBusy || string.IsNullOrWhiteSpace(_input); private string _systemPrompt = string.Empty; private double _temperature = 0.7; + private bool _needsScroll; protected override async Task OnInitializedAsync() { @@ -108,6 +111,16 @@ _systemPrompt = await SettingsService.GetChatPromptAsync() ?? Settings.GetChatDefaultPrompt(Settings.Language); _temperature = await SettingsService.GetChatTempAsync(); + _needsScroll = true; + } + + protected override async Task OnAfterRenderAsync(bool firstRender) + { + if (_needsScroll) + { + _needsScroll = false; + await ScrollToBottom(); + } } private void ToggleSettings() @@ -144,6 +157,7 @@ _input = string.Empty; _error = string.Empty; _isBusy = true; + _needsScroll = true; try { @@ -159,6 +173,7 @@ }; await ChatService.AddMessageAsync(msg); _messages.Add(msg); + _needsScroll = true; } catch (Exception ex) { @@ -167,6 +182,8 @@ finally { _isBusy = false; + _input = string.Empty; + _needsScroll = true; } } @@ -176,6 +193,11 @@ _messages.Clear(); } + private async Task ScrollToBottom() + { + await JS.InvokeVoidAsync("eval", "document.getElementById('chat-messages').scrollTop = document.getElementById('chat-messages').scrollHeight"); + } + private MarkupString MarkdownToHtml(string text) { if (string.IsNullOrEmpty(text)) return new MarkupString(string.Empty); diff --git a/Components/Pages/Editor.razor b/Components/Pages/Editor.razor index a4c09c4..39bd120 100644 --- a/Components/Pages/Editor.razor +++ b/Components/Pages/Editor.razor @@ -189,7 +189,7 @@ ? Loc["editor.wikipedia.status.loaded"] : Loc["editor.wikipedia.button.load"]) -
@@ -238,7 +238,7 @@ @@ -270,6 +270,7 @@ private bool showCreateDialog; private string newProjectName = string.Empty; private string newProjectPath = string.Empty; + private bool _createProjectDisabled => string.IsNullOrWhiteSpace(newProjectName) || string.IsNullOrWhiteSpace(newProjectPath); private ProjectTemplate selectedTemplate = ProjectTemplate.Novel; private Dictionary loadedArticles = new(); private bool showVersionDialog; @@ -594,6 +595,8 @@ } } + private bool IsSaveFactDisabled(WikipediaResult r) => string.IsNullOrWhiteSpace(r.Extract) || currentProjectId == 0; + private async Task SaveAsFact(WikipediaResult result) { if (string.IsNullOrWhiteSpace(result.Extract) || currentProjectId == 0) return; diff --git a/Components/Pages/FirstRunSetup.razor b/Components/Pages/FirstRunSetup.razor index 04644e3..50073f9 100644 --- a/Components/Pages/FirstRunSetup.razor +++ b/Components/Pages/FirstRunSetup.razor @@ -23,7 +23,7 @@ - + @if (!string.IsNullOrEmpty(_generatedPassword)) { @@ -41,7 +41,7 @@ - + } } else @@ -66,6 +66,8 @@ private string _errorMessage = string.Empty; private bool _isBusy; private bool _setupComplete; + private bool _generateDisabled => _isBusy || string.IsNullOrWhiteSpace(_username); + private bool _createAdminDisabled => _isBusy || _password != _generatedPassword; protected override async Task OnInitializedAsync() { diff --git a/Components/Pages/Models.razor b/Components/Pages/Models.razor index 61d7e7c..d3cd8bd 100644 --- a/Components/Pages/Models.razor +++ b/Components/Pages/Models.razor @@ -26,10 +26,17 @@ else @foreach (var model in localModels) {
-
@model.Name
-
- @Loc["models.label.size"] @FormatSize(model.Size) | - @Loc["models.label.modified"] @model.ModifiedAt?.ToString("g") +
+
+
@model.Name
+
+ @Loc["models.label.size"] @FormatSize(model.Size) | + @Loc["models.label.modified"] @model.ModifiedAt?.ToString("g") +
+
+
} @@ -41,9 +48,9 @@ else
- +
-
@@ -65,16 +72,34 @@ else
} +@if (_confirmDeleteModel != null) +{ + +} + @code { private List localModels = new(); private bool isLoading; private string? errorMessage; private string modelToPull = string.Empty; private bool isPulling; + private bool _pullDisabled => isPulling || string.IsNullOrWhiteSpace(modelToPull); private double pullProgress; private string pullStatus = string.Empty; private string? pullResult; private string pullPercentDisplay => $"{pullProgress:F0}%"; + private string? _confirmDeleteModel; protected override async Task OnInitializedAsync() { @@ -116,6 +141,9 @@ else var progress = new Progress(status => { pullStatus = status; + var m = System.Text.RegularExpressions.Regex.Match(status, @"\((\d+)%\)"); + if (m.Success && double.TryParse(m.Groups[1].Value, out var pct)) + pullProgress = pct; InvokeAsync(StateHasChanged); }); @@ -134,6 +162,38 @@ else } } + private void DeleteModel(string name) + { + _confirmDeleteModel = name; + } + + private void CancelDelete() + { + _confirmDeleteModel = null; + } + + private async Task ConfirmDelete() + { + if (_confirmDeleteModel == null) return; + + try + { + var deleted = await OllamaService.DeleteModelAsync(_confirmDeleteModel); + if (deleted) + await RefreshModels(); + else + errorMessage = $"Fehler beim Löschen von '{_confirmDeleteModel}'"; + } + catch (Exception ex) + { + errorMessage = $"Fehler: {ex.Message}"; + } + finally + { + _confirmDeleteModel = null; + } + } + private static string FormatSize(long? bytes) { if (!bytes.HasValue) return "---"; diff --git a/Components/Pages/OllamaAssistant.razor b/Components/Pages/OllamaAssistant.razor index 3fb10bd..726ff05 100644 --- a/Components/Pages/OllamaAssistant.razor +++ b/Components/Pages/OllamaAssistant.razor @@ -31,7 +31,7 @@ } - + @if (!string.IsNullOrEmpty(outputText)) { @@ -95,6 +95,7 @@ private string errorMessage = string.Empty; private string statusText = string.Empty; private bool isRunning; + private bool _runDisabled => isRunning || string.IsNullOrWhiteSpace(inputText); private double progress; private bool showPromptEditor; private string promptOverride = string.Empty; diff --git a/Components/Pages/QuickMarkdown.razor b/Components/Pages/QuickMarkdown.razor index 30e057a..a2222d2 100644 --- a/Components/Pages/QuickMarkdown.razor +++ b/Components/Pages/QuickMarkdown.razor @@ -5,6 +5,7 @@ @inject IJSRuntime JS @inject IAuthService AuthService @inject ISettingsService SettingsService +@inject IQuickMarkdownService QuickMarkdownService @inject NavigationManager Navigation @rendermode InteractiveServer @@ -17,6 +18,30 @@
+ +
+ +
+ + + +
+ @if (_showPromptNameInput) + { +
+ + + +
+ } +
+
@@ -31,28 +56,26 @@
-
-
- - -
-
-
- +
- +
+ + +
@@ -63,10 +86,27 @@
- + + @if (_savedEntries.Count > 0) + { +
+

Gespeicherte Texte

+ @foreach (var e in _savedEntries) + { +
+
+ @e.Timestamp.ToLocalTime().ToString("g") + @(e.InputText.Length > 60 ? e.InputText[..60] + "…" : e.InputText) +
+ +
+ } +
+ } + @if (!string.IsNullOrEmpty(_error)) {
@_error
@@ -85,7 +125,15 @@ private string _error = string.Empty; private string _modelNotice = string.Empty; private bool _isBusy; + private bool _generateDisabled => _isBusy || string.IsNullOrWhiteSpace(_inputText); + private bool _saveEntryDisabled => string.IsNullOrWhiteSpace(_inputText) && string.IsNullOrWhiteSpace(_output); private double _temperature = 0.3; + private int _userId; + private List _savedEntries = new(); + private List _savedPrompts = new(); + private int _selectedPromptId; + private bool _showPromptNameInput; + private string _newPromptName = string.Empty; protected override async Task OnInitializedAsync() { @@ -95,25 +143,132 @@ Navigation.NavigateTo("/"); return; } + _userId = user.Id; + _savedPrompts = await QuickMarkdownService.GetPromptsAsync(_userId); _systemPrompt = await SettingsService.GetQuickMarkdownPromptAsync() ?? Settings.GetQuickMarkdownDefaultPrompt(Settings.Language); _temperature = await SettingsService.GetQuickMarkdownTempAsync(); + _savedEntries = await QuickMarkdownService.GetAllAsync(_userId); _modelNotice = $"Verwendetes Modell: {Settings.StyleModel} (via {Settings.Backend})"; } - private async Task SaveSettings() + private async Task SwitchPrompt(ChangeEventArgs e) { - await SettingsService.SaveQuickMarkdownPromptAsync(_systemPrompt); - await SettingsService.SaveQuickMarkdownTempAsync(_temperature); + var id = int.Parse(e.Value?.ToString() ?? "0"); + _selectedPromptId = id; + if (id == 0) + { + _systemPrompt = Settings.GetQuickMarkdownDefaultPrompt(Settings.Language); + _temperature = Settings.QuickMarkdownTemp; + } + else + { + var prompt = _savedPrompts.FirstOrDefault(p => p.Id == id); + if (prompt != null) + { + _systemPrompt = prompt.PromptText; + _temperature = prompt.Temperature; + } + } } - private async Task ResetToDefault() + private void ShowSavePromptDialog() { + _newPromptName = string.Empty; + _showPromptNameInput = true; + } + + private async Task ConfirmSavePrompt() + { + if (string.IsNullOrWhiteSpace(_newPromptName)) + return; + + var existing = _savedPrompts.FirstOrDefault(p => + p.Name == _newPromptName && p.Id != _selectedPromptId); + if (existing != null) + { + existing.PromptText = _systemPrompt; + existing.Temperature = _temperature; + existing.Timestamp = DateTime.UtcNow; + await QuickMarkdownService.SavePromptAsync(existing); + _selectedPromptId = existing.Id; + } + else + { + var prompt = new QuickMarkdownPrompt + { + UserId = _userId, + Name = _newPromptName, + PromptText = _systemPrompt, + Temperature = _temperature, + Timestamp = DateTime.UtcNow + }; + await QuickMarkdownService.SavePromptAsync(prompt); + _selectedPromptId = prompt.Id; + } + + _savedPrompts = await QuickMarkdownService.GetPromptsAsync(_userId); + _showPromptNameInput = false; + _newPromptName = string.Empty; + } + + private void CancelSavePrompt() + { + _showPromptNameInput = false; + _newPromptName = string.Empty; + } + + private async Task DeleteCurrentPrompt() + { + if (_selectedPromptId == 0) + return; + + await QuickMarkdownService.DeletePromptAsync(_selectedPromptId); + _savedPrompts = await QuickMarkdownService.GetPromptsAsync(_userId); + _selectedPromptId = 0; _systemPrompt = Settings.GetQuickMarkdownDefaultPrompt(Settings.Language); _temperature = Settings.QuickMarkdownTemp; - await SaveSettings(); + } + + private async Task SaveEntry() + { + if (string.IsNullOrWhiteSpace(_inputText) && string.IsNullOrWhiteSpace(_output)) + return; + + var entry = new QuickMarkdownEntry + { + UserId = _userId, + InputText = _inputText, + OutputText = _output, + SystemPrompt = _systemPrompt, + Temperature = _temperature, + Timestamp = DateTime.UtcNow + }; + await QuickMarkdownService.SaveAsync(entry); + _savedEntries = await QuickMarkdownService.GetAllAsync(_userId); + } + + private async Task LoadEntry(int id) + { + var entry = await QuickMarkdownService.GetByIdAsync(id); + if (entry == null) return; + + _inputText = entry.InputText; + _output = entry.OutputText; + + if (!string.IsNullOrEmpty(entry.SystemPrompt)) + { + _systemPrompt = entry.SystemPrompt; + _temperature = entry.Temperature; + } + } + + private async Task DeleteEntry(int id) + { + await QuickMarkdownService.DeleteAsync(id); + _savedEntries = await QuickMarkdownService.GetAllAsync(_userId); } private async Task Generate() diff --git a/Components/Pages/Settings.razor b/Components/Pages/Settings.razor index 36df45d..4a83527 100644 --- a/Components/Pages/Settings.razor +++ b/Components/Pages/Settings.razor @@ -26,6 +26,12 @@
+ @if (_isAdmin) + { + + } @@ -35,239 +41,250 @@
+ @if (_isAdmin && _activePromptTab == "admin") + { +
-
- @if (_isAdmin) - { -
-

@Loc["settings.section.user"]

-
- - -
-
- -
- - +
+ +
+

@Loc["settings.section.user"]

+
+ + +
+
+ +
+ + +
-
-
- -
+
+ +
-
-

@Loc["settings.section.models"]

-
- - -
-
- - -
-
- - -
-
- -
-

@Loc["settings.section.ollama_server"]

-
- - -
-
- -
- - +
+

@Loc["settings.section.models"]

+
+ +
- @if (_connectionTested) +
+ + +
+
+ + +
+
+ +
+

@Loc["settings.section.ollama_server"]

+
+ + +
+
+ +
+ + +
+ @if (_connectionTested) + { +
+ @(_connectionOk + ? $"✓ {_connectionLatency} ms {Loc["settings.ollama.online"]}" + : $"✗ {Loc["settings.ollama.offline"]}") +
+ } +
@Loc["settings.ollama.hint.url"]
+
+
+ + +
Nur aktiv wenn Backend auf "llama.cpp" gesetzt ist
+
+
+ +
+ +
+ +
+

@Loc["settings.section.diagnostics"]

+ + @if (_diagnosticsResults != null) { -
- @(_connectionOk - ? $"✓ {_connectionLatency} ms {Loc["settings.ollama.online"]}" - : $"✗ {Loc["settings.ollama.offline"]}") +
+ @foreach (var line in _diagnosticsResults) + { +
@line
+ }
} -
@Loc["settings.ollama.hint.url"]
-
- - -
Nur aktiv wenn Backend auf "llama.cpp" gesetzt ist
-
-
- -
-

@Loc["settings.section.diagnostics"]

- - @if (_diagnosticsResults != null) - { -
- @foreach (var line in _diagnosticsResults) - { -
@line
- } +
+

@Loc["settings.section.appearance"]

+
+ +
- } -
- } +
+ +
+

@Loc["settings.section.language"]

+
+ + +
+
-
-

@Loc["settings.section.appearance"]

-
- -
+
- -
-

@Loc["settings.section.language"]

-
- - -
-
-
- + } @if (_activePromptTab == "novel") { -
-
-

@Loc["settings.section.editor_prompt"]

-
- +
+
+
+

@Loc["settings.section.editor_prompt"]

+
+ +
+
+ + +
@GetTempCategory(lektorTemp)
+
@GetTempDescription(lektorTemp)
+
-
- - -
@GetTempCategory(lektorTemp)
-
@GetTempDescription(lektorTemp)
+ +
+

@Loc["settings.section.factcheck_template"]

+
+ +
+
+ + +
@GetTempCategory(factCheckTemp)
+
@GetTempDescription(factCheckTemp)
+
+
+ +
+

@Loc["settings.section.spellcheck_prompt"]

+
+ +
+
+ + +
@GetTempCategory(spellingTemp)
+
@GetTempDescription(spellingTemp)
+
+
+ +
+

@Loc["settings.section.advocatus_diaboli"]

+
+ +
+
+ + +
@GetTempCategory(advocatusDiaboliTemp)
+
@GetTempDescription(advocatusDiaboliTemp)
+
-
-

@Loc["settings.section.factcheck_template"]

-
- +
+
+

@Loc["settings.section.hook_finder"]

+
+ +
+
+ + +
@GetTempCategory(hookFinderTemp)
+
@GetTempDescription(hookFinderTemp)
+
-
- - -
@GetTempCategory(factCheckTemp)
-
@GetTempDescription(factCheckTemp)
-
-
-
-

@Loc["settings.section.spellcheck_prompt"]

-
- +
+

@Loc["settings.section.eli5"]

+
+ +
+
+ + +
@GetTempCategory(eli5Temp)
+
@GetTempDescription(eli5Temp)
+
-
- - -
@GetTempCategory(spellingTemp)
-
@GetTempDescription(spellingTemp)
-
-
-
-

@Loc["settings.section.advocatus_diaboli"]

-
- -
-
- - -
@GetTempCategory(advocatusDiaboliTemp)
-
@GetTempDescription(advocatusDiaboliTemp)
-
-
- -
-

@Loc["settings.section.hook_finder"]

-
- -
-
- - -
@GetTempCategory(hookFinderTemp)
-
@GetTempDescription(hookFinderTemp)
-
-
- -
-

@Loc["settings.section.eli5"]

-
- -
-
- - -
@GetTempCategory(eli5Temp)
-
@GetTempDescription(eli5Temp)
-
-
- -
-

@Loc["settings.section.coauthor_brainstorming"]

-
- -
-
- - -
@GetTempCategory(coAuthorTemp)
-
@GetTempDescription(coAuthorTemp)
+
+

@Loc["settings.section.coauthor_brainstorming"]

+
+ +
+
+ + +
@GetTempCategory(coAuthorTemp)
+
@GetTempDescription(coAuthorTemp)
+
@@ -275,95 +292,99 @@ @if (_activePromptTab == "technical") { -
-
-

@Loc["settings.section.tech_lastenheft"]

-
- +
+
+
+

@Loc["settings.section.tech_lastenheft"]

+
+ +
+
+ + +
@GetTempCategory(techLastenheftTemp)
+
@GetTempDescription(techLastenheftTemp)
+
-
- - -
@GetTempCategory(techLastenheftTemp)
-
@GetTempDescription(techLastenheftTemp)
+ +
+

@Loc["settings.section.tech_pflichtenheft"]

+
+ +
+
+ + +
@GetTempCategory(techPflichtenheftTemp)
+
@GetTempDescription(techPflichtenheftTemp)
+
+
+ +
+

@Loc["settings.section.tech_usecase"]

+
+ +
+
+ + +
@GetTempCategory(techUseCaseTemp)
+
@GetTempDescription(techUseCaseTemp)
+
+
+ +
+

@Loc["settings.section.tech_stakeholder"]

+
+ +
+
+ + +
@GetTempCategory(techStakeholderTemp)
+
@GetTempDescription(techStakeholderTemp)
+
-
-

@Loc["settings.section.tech_pflichtenheft"]

-
- +
+
+

@Loc["settings.section.tech_glossar"]

+
+ +
+
+ + +
@GetTempCategory(techGlossarTemp)
+
@GetTempDescription(techGlossarTemp)
+
-
- - -
@GetTempCategory(techPflichtenheftTemp)
-
@GetTempDescription(techPflichtenheftTemp)
-
-
-
-

@Loc["settings.section.tech_usecase"]

-
- +
+

@Loc["settings.section.tech_qualitaet"]

+
+ +
+
+ + +
@GetTempCategory(techQualitaetTemp)
+
@GetTempDescription(techQualitaetTemp)
+
-
- - -
@GetTempCategory(techUseCaseTemp)
-
@GetTempDescription(techUseCaseTemp)
-
-
-
-

@Loc["settings.section.tech_stakeholder"]

-
- -
-
- - -
@GetTempCategory(techStakeholderTemp)
-
@GetTempDescription(techStakeholderTemp)
-
-
- -
-

@Loc["settings.section.tech_glossar"]

-
- -
-
- - -
@GetTempCategory(techGlossarTemp)
-
@GetTempDescription(techGlossarTemp)
-
-
- -
-

@Loc["settings.section.tech_qualitaet"]

-
- -
-
- - -
@GetTempCategory(techQualitaetTemp)
-
@GetTempDescription(techQualitaetTemp)
-
-
- -
-

@Loc["settings.section.tech_risiko"]

-
- -
-
- - -
@GetTempCategory(techRisikoTemp)
-
@GetTempDescription(techRisikoTemp)
+
+

@Loc["settings.section.tech_risiko"]

+
+ +
+
+ + +
@GetTempCategory(techRisikoTemp)
+
@GetTempDescription(techRisikoTemp)
+
@@ -386,6 +407,7 @@ private void SwitchToNovelTab() => _activePromptTab = "novel"; private void SwitchToTechnicalTab() => _activePromptTab = "technical"; + private void SwitchToAdminTab() => _activePromptTab = "admin"; private string ragModel = "llama3.2"; private string styleModel = "llama3.2"; private string spellingModel = "phi3:mini"; diff --git a/Components/Pages/Setup2FA.razor b/Components/Pages/Setup2FA.razor index 947122b..5358e56 100644 --- a/Components/Pages/Setup2FA.razor +++ b/Components/Pages/Setup2FA.razor @@ -45,7 +45,7 @@
- +
} @@ -73,6 +73,7 @@ private bool isEnabled; private bool isBusy; private string? username; + private bool _enableDisabled => isBusy || string.IsNullOrWhiteSpace(verificationCode); protected override async Task OnInitializedAsync() { diff --git a/Components/Pages/UserManagement.razor b/Components/Pages/UserManagement.razor index d8b8e9a..0a95c02 100644 --- a/Components/Pages/UserManagement.razor +++ b/Components/Pages/UserManagement.razor @@ -110,7 +110,7 @@
@@ -172,6 +172,7 @@ private string _newEmail = string.Empty; private List _newRoles = new() { "Author" }; private string _newPassword = string.Empty; + private bool _createUserDisabled => string.IsNullOrWhiteSpace(_newUsername) || string.IsNullOrWhiteSpace(_newPassword); private string? _generatedPassword; private bool showEditDialog; diff --git a/Data/QuickMarkdownEntry.cs b/Data/QuickMarkdownEntry.cs new file mode 100644 index 0000000..3d354e9 --- /dev/null +++ b/Data/QuickMarkdownEntry.cs @@ -0,0 +1,12 @@ +namespace AuthorBuddy.Web.Data; + +public class QuickMarkdownEntry +{ + public int Id { get; set; } + public int UserId { get; set; } + public string InputText { get; set; } = string.Empty; + public string OutputText { get; set; } = string.Empty; + public string SystemPrompt { get; set; } = string.Empty; + public double Temperature { get; set; } + public DateTime Timestamp { get; set; } = DateTime.UtcNow; +} diff --git a/Data/QuickMarkdownPrompt.cs b/Data/QuickMarkdownPrompt.cs new file mode 100644 index 0000000..e8a9ebc --- /dev/null +++ b/Data/QuickMarkdownPrompt.cs @@ -0,0 +1,11 @@ +namespace AuthorBuddy.Web.Data; + +public class QuickMarkdownPrompt +{ + public int Id { get; set; } + public int UserId { get; set; } + public string Name { get; set; } = string.Empty; + public string PromptText { get; set; } = string.Empty; + public double Temperature { get; set; } + public DateTime Timestamp { get; set; } = DateTime.UtcNow; +} diff --git a/Program.cs b/Program.cs index 4230b09..d6a6dba 100644 --- a/Program.cs +++ b/Program.cs @@ -42,6 +42,7 @@ builder.Services.AddSingleton(); builder.Services.AddScoped(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); +builder.Services.AddSingleton(); var smtpSettings = new SmtpSettings(); builder.Configuration.GetSection("Smtp").Bind(smtpSettings); diff --git a/Properties/PublishProfiles/FolderProfile.pubxml.user b/Properties/PublishProfiles/FolderProfile.pubxml.user index 6d94c27..6d58bf2 100644 --- a/Properties/PublishProfiles/FolderProfile.pubxml.user +++ b/Properties/PublishProfiles/FolderProfile.pubxml.user @@ -3,7 +3,7 @@ <_PublishTargetUrl>E:\ollama_net\ollama\AuthorBuddy.Web\bin\Release\net10.0\publish\ - True|2026-06-14T06:09:44.9432726Z||; + True|2026-07-04T08:31:55.1105019Z||;True|2026-07-03T19:42:19.2725521+02:00||;True|2026-07-03T19:14:41.2291817+02:00||;True|2026-06-26T17:29:16.2419779+02:00||;True|2026-06-14T08:09:44.9432726+02:00||; \ No newline at end of file diff --git a/Services/IOllamaService.cs b/Services/IOllamaService.cs index 2326e57..e24ef62 100644 --- a/Services/IOllamaService.cs +++ b/Services/IOllamaService.cs @@ -16,6 +16,7 @@ public interface IOllamaService Task AnswerBasedOnFactsAsync(string question, string facts); Task<(bool Success, long LatencyMs)> TestConnectionAsync(); Task ModelExistsAsync(string model); + Task DeleteModelAsync(string modelName); Task<(bool Success, int ContextWindow)> GetModelContextWindowAsync(string model); Task MeasureLatencyAsync(string model); void Reconfigure(string ollamaUrl); diff --git a/Services/IQuickMarkdownService.cs b/Services/IQuickMarkdownService.cs new file mode 100644 index 0000000..9593116 --- /dev/null +++ b/Services/IQuickMarkdownService.cs @@ -0,0 +1,16 @@ +using AuthorBuddy.Web.Data; + +namespace AuthorBuddy.Web.Services; + +public interface IQuickMarkdownService +{ + Task> GetAllAsync(int userId); + Task GetByIdAsync(int id); + Task SaveAsync(QuickMarkdownEntry entry); + Task DeleteAsync(int id); + + Task> GetPromptsAsync(int userId); + Task GetPromptByIdAsync(int id); + Task SavePromptAsync(QuickMarkdownPrompt prompt); + Task DeletePromptAsync(int id); +} diff --git a/Services/OllamaService.cs b/Services/OllamaService.cs index 1503653..907b6da 100644 --- a/Services/OllamaService.cs +++ b/Services/OllamaService.cs @@ -21,6 +21,9 @@ public class OllamaService : IOllamaService private ILLMBackend ActiveBackend => _backends.FirstOrDefault(b => b.Name == _settings.Backend) ?? _backends.First(); + private readonly object _warmLock = new(); + private bool _warmupAttempted; + private async Task EnsureRunningAsync() { if (ActiveBackend.Name != "Ollama") @@ -28,7 +31,10 @@ public class OllamaService : IOllamaService var reachable = await ActiveBackend.TestConnectionAsync(); if (reachable) + { + await WarmupModelAsync(); return; + } lock (_startLock) { @@ -60,6 +66,7 @@ public class OllamaService : IOllamaService if (reachable) { _opState.AppendThought(" Ollama ist bereit"); + await WarmupModelAsync(); return; } _opState.AppendThought("."); @@ -68,6 +75,39 @@ public class OllamaService : IOllamaService _opState.AppendThought(" Zeitüberschreitung"); } + private async Task WarmupModelAsync() + { + lock (_warmLock) + { + if (_warmupAttempted) return; + _warmupAttempted = true; + } + + var modelsToWarm = new[] { _settings.StyleModel, _settings.EmbedModel } + .Where(m => !string.IsNullOrWhiteSpace(m)) + .Distinct() + .ToList(); + + if (modelsToWarm.Count == 0) return; + + _opState.SetThought("Lade Modelle in den Arbeitsspeicher..."); + foreach (var model in modelsToWarm) + { + _opState.AppendThought($" {model}..."); + try + { + var warmCts = new CancellationTokenSource(TimeSpan.FromMinutes(3)); + var dummy = await ActiveBackend.ChatAsync(model, " ", null, 0.0); + _opState.AppendThought(" ✓"); + } + catch (Exception ex) + { + _opState.AppendThought($" ✗ ({ex.Message})"); + } + } + _opState.AppendThought(" Fertig"); + } + public void Reconfigure(string url) { _settings.OllamaUrl = url; @@ -175,4 +215,13 @@ public class OllamaService : IOllamaService _opState.AppendThought(result ? " Erfolgreich" : " Fehlgeschlagen"); return result; } + + public async Task DeleteModelAsync(string modelName) + { + await EnsureRunningAsync(); + _opState.SetThought($"Lösche Modell {modelName}..."); + var result = await ActiveBackend.DeleteModelAsync(modelName); + _opState.AppendThought(result ? " Erfolgreich" : " Fehlgeschlagen"); + return result; + } } diff --git a/Services/QuickMarkdownService.cs b/Services/QuickMarkdownService.cs new file mode 100644 index 0000000..3022ab4 --- /dev/null +++ b/Services/QuickMarkdownService.cs @@ -0,0 +1,76 @@ +using AuthorBuddy.Web.Data; +using LiteDB; + +namespace AuthorBuddy.Web.Services; + +public class QuickMarkdownService : IQuickMarkdownService +{ + private readonly ILiteDatabase _db; + + public QuickMarkdownService(ILiteDatabase db) + { + _db = db; + } + + public Task> GetAllAsync(int userId) + { + var col = _db.GetCollection("quick_md"); + return Task.FromResult(col.Find(e => e.UserId == userId) + .OrderByDescending(e => e.Timestamp) + .ToList()); + } + + public Task GetByIdAsync(int id) + { + var col = _db.GetCollection("quick_md"); + return Task.FromResult(col.FindById(id)); + } + + public Task SaveAsync(QuickMarkdownEntry entry) + { + var col = _db.GetCollection("quick_md"); + if (entry.Id > 0) + col.Update(entry); + else + col.Insert(entry); + return Task.CompletedTask; + } + + public Task DeleteAsync(int id) + { + var col = _db.GetCollection("quick_md"); + col.Delete(id); + return Task.CompletedTask; + } + + public Task> GetPromptsAsync(int userId) + { + var col = _db.GetCollection("quick_md_prompts"); + return Task.FromResult(col.Find(p => p.UserId == userId) + .OrderByDescending(p => p.Timestamp) + .ToList()); + } + + public Task GetPromptByIdAsync(int id) + { + var col = _db.GetCollection("quick_md_prompts"); + return Task.FromResult(col.FindById(id)); + } + + public Task SavePromptAsync(QuickMarkdownPrompt prompt) + { + var col = _db.GetCollection("quick_md_prompts"); + if (prompt.Id > 0) + col.Update(prompt); + else + col.Insert(prompt); + return Task.CompletedTask; + } + + public Task DeletePromptAsync(int id) + { + var col = _db.GetCollection("quick_md_prompts"); + col.Delete(id); + return Task.CompletedTask; + } +} diff --git a/wwwroot/app.css b/wwwroot/app.css index 8faaf30..b16e362 100644 --- a/wwwroot/app.css +++ b/wwwroot/app.css @@ -775,8 +775,8 @@ button.primary { } .settings-layout { - display: grid; - grid-template-columns: 1fr 2fr; + display: flex; + flex-direction: column; gap: 16px; } @@ -784,9 +784,10 @@ button.primary { min-width: 0; } -.settings-column-wide { - min-width: 0; - grid-column: 2; +.settings-two-column { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 16px; } .settings-column .form-group textarea { @@ -1497,6 +1498,95 @@ button.primary { gap: 8px; } +.qm-generate-row { + display: flex; + gap: 8px; + align-items: center; +} + +.qm-prompt-selector { + display: flex; + gap: 6px; + align-items: center; +} + +.qm-prompt-select { + flex: 1; + padding: 6px 8px; + border: 1px solid var(--border-color); + background: var(--input-bg, var(--editor-bg)); + color: var(--text-color); + font-size: 13px; +} + +.qm-prompt-name-row { + display: flex; + gap: 6px; + margin-top: 6px; + align-items: center; +} + +.qm-prompt-name-row input { + flex: 1; + padding: 6px 8px; + border: 1px solid var(--border-color); + background: var(--input-bg, var(--editor-bg)); + color: var(--text-color); + font-size: 13px; +} + +.qm-saved-list { + margin-top: 16px; + border-top: 1px solid var(--border-color); + padding-top: 12px; +} + +.qm-saved-list h4 { + font-size: 14px; + margin-bottom: 8px; +} + +.qm-saved-item { + display: flex; + align-items: center; + justify-content: space-between; + padding: 6px 8px; + border: 1px solid var(--border-color); + margin-bottom: 4px; + cursor: pointer; + font-size: 13px; +} + +.qm-saved-item:hover { + background: var(--accent-color); + color: white; +} + +.qm-saved-meta { + flex: 1; + min-width: 0; +} + +.qm-saved-date { + font-weight: bold; + margin-right: 12px; + white-space: nowrap; +} + +.qm-saved-preview { + color: var(--text-color); + opacity: 0.7; +} + +.qm-saved-item:hover .qm-saved-preview { + color: white; +} + +.qm-saved-item button { + flex-shrink: 0; + margin-left: 8px; +} + /* Chat page */ .chat-page { display: flex; @@ -1656,6 +1746,10 @@ button.primary { grid-template-columns: 1fr; } + .settings-two-column { + grid-template-columns: 1fr; + } + .qm-layout { grid-template-columns: 1fr; } @@ -1733,6 +1827,11 @@ button.primary { grid-template-columns: 1fr; } + .settings-two-column { + grid-template-columns: 1fr; + grid-column: 1; + } + .settings-page { padding: 8px; }