vor litedb

This commit is contained in:
Roland 2026-05-17 07:27:18 +02:00
parent a6d7d873ad
commit 79796bd143
20 changed files with 951 additions and 282 deletions

View file

@ -3,29 +3,41 @@
"WorkspaceRootPath": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\", "WorkspaceRootPath": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\",
"Documents": [ "Documents": [
{ {
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}", "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\data\\appdbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:data\\appdbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\settings.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\settings.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
},
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}, },
{ {
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\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\\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}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ollamaservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}, },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\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\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\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\\models\\ollamasettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\models\\ollamasettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:models\\ollamasettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:models\\ollamasettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}, },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\settings.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\settings.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
},
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
},
{ {
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\filescannerservice.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\\filescannerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\filescannerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\filescannerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
@ -46,10 +58,6 @@
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\models\\llm_model.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\models\\llm_model.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:models\\llm_model.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:models\\llm_model.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\\models\\modelstatus.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\models\\modelstatus.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:models\\modelstatus.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:models\\modelstatus.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
@ -58,18 +66,10 @@
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\models.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\\models.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\models.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\models.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\\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\\ifilescannerservice.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\\ifilescannerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ifilescannerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ifilescannerservice.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\\appdbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|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\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-utilities.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}", "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-utilities.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-utilities.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-utilities.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}"
@ -122,33 +122,85 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 5, "DocumentIndex": 1,
"Title": "OllamaSettings.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
"RelativeDocumentMoniker": "Models\\OllamaSettings.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
"RelativeToolTip": "Models\\OllamaSettings.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAqwAQAAAAcAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-16T13:39:46.179Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 4,
"Title": "OllamaService.cs", "Title": "OllamaService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaService.cs",
"RelativeDocumentMoniker": "Services\\OllamaService.cs", "RelativeDocumentMoniker": "Services\\OllamaService.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaService.cs", "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\OllamaService.cs*",
"RelativeToolTip": "Services\\OllamaService.cs", "RelativeToolTip": "Services\\OllamaService.cs*",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAdAAAAAAAAAA==", "ViewState": "AgIAADQAAAAAAAAAAAAQwEUAAABDAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-16T06:43:46.404Z", "WhenOpened": "2026-05-16T06:43:46.404Z",
"EditorCaption": "" "EditorCaption": ""
}, },
{
"$type": "Document",
"DocumentIndex": 3,
"Title": "SettingsService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\SettingsService.cs",
"RelativeDocumentMoniker": "Services\\SettingsService.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\SettingsService.cs",
"RelativeToolTip": "Services\\SettingsService.cs",
"ViewState": "AgIAAMAAAAAAAAAAAAAQwMgAAAAMAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-16T06:05:12.928Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 11,
"Title": "ThemeService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
"RelativeDocumentMoniker": "Services\\ThemeService.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
"RelativeToolTip": "Services\\ThemeService.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-16T13:35:33.991Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 4,
"Title": "ISettingsService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ISettingsService.cs",
"RelativeDocumentMoniker": "Services\\ISettingsService.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ISettingsService.cs",
"RelativeToolTip": "Services\\ISettingsService.cs",
"ViewState": "AgIAAAsAAAAAAAAAAAA8wCEAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-16T13:21:26.951Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 8,
"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": "AgIAAG8AAAAAAAAAAAAAAH0AAAAtAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2026-05-15T16:04:36.444Z",
"EditorCaption": ""
},
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 6, "DocumentIndex": 6,
"Title": "OllamaSettings.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
"RelativeDocumentMoniker": "Models\\OllamaSettings.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
"RelativeToolTip": "Models\\OllamaSettings.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAqwAYAAAA6AAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-16T13:39:46.179Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 9,
"Title": "FileScannerService.cs", "Title": "FileScannerService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
"RelativeDocumentMoniker": "Services\\FileScannerService.cs", "RelativeDocumentMoniker": "Services\\FileScannerService.cs",
@ -162,58 +214,49 @@
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 2, "DocumentIndex": 2,
"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": "AgIAAFgAAAAAAAAAAAApwGsAAAAwAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2026-05-16T13:01:59.743Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 0,
"Title": "AppDbContext.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
"RelativeDocumentMoniker": "Data\\AppDbContext.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
"RelativeToolTip": "Data\\AppDbContext.cs",
"ViewState": "AgIAADgAAAAAAAAAAAAuwEsAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-14T10:50:13.284Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 7,
"Title": "Settings.razor", "Title": "Settings.razor",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Settings.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Settings.razor",
"RelativeDocumentMoniker": "Components\\Pages\\Settings.razor", "RelativeDocumentMoniker": "Components\\Pages\\Settings.razor",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Settings.razor", "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Settings.razor",
"RelativeToolTip": "Components\\Pages\\Settings.razor", "RelativeToolTip": "Components\\Pages\\Settings.razor",
"ViewState": "AgIAADcAAAAAAAAAAADwv0wAAAAAAAAAAAAAAA==", "ViewState": "AgIAAHMAAAAAAAAAAADwv4UAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2026-05-15T16:43:26.6Z", "WhenOpened": "2026-05-15T16:43:26.6Z",
"EditorCaption": "" "EditorCaption": ""
}, },
{ {
"$type": "Document", "$type": "Bookmark",
"DocumentIndex": 3, "Name": "RST:0:0:{b3f9f954-0ca5-0091-76b4-34a47f44c954}"
"Title": "SettingsService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\SettingsService.cs",
"RelativeDocumentMoniker": "Services\\SettingsService.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\SettingsService.cs",
"RelativeToolTip": "Services\\SettingsService.cs",
"ViewState": "AgIAAEwAAAAAAAAAAAAewFoAAAAnAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-16T06:05:12.928Z",
"EditorCaption": ""
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 8, "DocumentIndex": 5,
"Title": "ThemeService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
"RelativeDocumentMoniker": "Services\\ThemeService.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
"RelativeToolTip": "Services\\ThemeService.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-16T13:35:33.991Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "ISettingsService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ISettingsService.cs",
"RelativeDocumentMoniker": "Services\\ISettingsService.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ISettingsService.cs*",
"RelativeToolTip": "Services\\ISettingsService.cs*",
"ViewState": "AgIAAAIAAAAAAAAAAAAxwBcAAAAbAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-16T13:21:26.951Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 14,
"Title": "IOllamaService.cs", "Title": "IOllamaService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaService.cs",
"RelativeDocumentMoniker": "Services\\IOllamaService.cs", "RelativeDocumentMoniker": "Services\\IOllamaService.cs",
@ -226,20 +269,7 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 0, "DocumentIndex": 10,
"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": "AgIAAG8AAAAAAAAAAAAAAH0AAAAtAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2026-05-15T16:04:36.444Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 7,
"Title": "Program.cs", "Title": "Program.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Program.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Program.cs",
"RelativeDocumentMoniker": "Program.cs", "RelativeDocumentMoniker": "Program.cs",
@ -252,7 +282,7 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 9, "DocumentIndex": 12,
"Title": "App.razor", "Title": "App.razor",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor",
"RelativeDocumentMoniker": "Components\\App.razor", "RelativeDocumentMoniker": "Components\\App.razor",
@ -263,13 +293,9 @@
"WhenOpened": "2026-05-16T05:42:06.383Z", "WhenOpened": "2026-05-16T05:42:06.383Z",
"EditorCaption": "" "EditorCaption": ""
}, },
{
"$type": "Bookmark",
"Name": "RST:0:0:{b3f9f954-0ca5-0091-76b4-34a47f44c954}"
},
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 13, "DocumentIndex": 15,
"Title": "Models.razor", "Title": "Models.razor",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor",
"RelativeDocumentMoniker": "Components\\Pages\\Models.razor", "RelativeDocumentMoniker": "Components\\Pages\\Models.razor",
@ -282,7 +308,7 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 10, "DocumentIndex": 13,
"Title": "LLM_Model.cs", "Title": "LLM_Model.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs",
"RelativeDocumentMoniker": "Models\\LLM_Model.cs", "RelativeDocumentMoniker": "Models\\LLM_Model.cs",
@ -295,7 +321,7 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 12, "DocumentIndex": 14,
"Title": "ModelStatus.cs", "Title": "ModelStatus.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs",
"RelativeDocumentMoniker": "Models\\ModelStatus.cs", "RelativeDocumentMoniker": "Models\\ModelStatus.cs",
@ -306,19 +332,6 @@
"WhenOpened": "2026-05-16T13:01:24.508Z", "WhenOpened": "2026-05-16T13:01:24.508Z",
"EditorCaption": "" "EditorCaption": ""
}, },
{
"$type": "Document",
"DocumentIndex": 11,
"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": "AgIAAFkAAAAAAAAAAAApwGAAAAAOAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2026-05-16T13:01:59.743Z",
"EditorCaption": ""
},
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 19, "DocumentIndex": 19,
@ -345,7 +358,7 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 15, "DocumentIndex": 16,
"Title": "IFileScannerService.cs", "Title": "IFileScannerService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IFileScannerService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IFileScannerService.cs",
"RelativeDocumentMoniker": "Services\\IFileScannerService.cs", "RelativeDocumentMoniker": "Services\\IFileScannerService.cs",
@ -367,18 +380,6 @@
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-15T15:57:10.2Z" "WhenOpened": "2026-05-15T15:57:10.2Z"
}, },
{
"$type": "Document",
"DocumentIndex": 16,
"Title": "AppDbContext.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
"RelativeDocumentMoniker": "Data\\AppDbContext.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
"RelativeToolTip": "Data\\AppDbContext.cs",
"ViewState": "AgIAABoAAAAAAAAAAAAQwD4AAAAIAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-14T10:50:13.284Z"
},
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 17, "DocumentIndex": 17,

View file

@ -3,16 +3,32 @@
"WorkspaceRootPath": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\", "WorkspaceRootPath": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\",
"Documents": [ "Documents": [
{ {
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\models\\ollamasettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\data\\appdbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:models\\ollamasettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:data\\appdbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ollamaservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ollamaservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\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\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\settingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}, },
{ {
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\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\\isettingsservice.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}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\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\\models\\ollamasettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:models\\ollamasettings.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
}, },
{ {
"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}", "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}",
@ -22,10 +38,6 @@
"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}", "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}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
}, },
{
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\isettingsservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
},
{ {
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\filescannerservice.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\\filescannerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\filescannerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\filescannerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
@ -46,10 +58,6 @@
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\models\\llm_model.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\models\\llm_model.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:models\\llm_model.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:models\\llm_model.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\\models\\modelstatus.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}", "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\models\\modelstatus.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:models\\modelstatus.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:models\\modelstatus.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
@ -58,18 +66,10 @@
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\models.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\\models.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\models.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\models.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\\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\\ifilescannerservice.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\\ifilescannerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ifilescannerservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ifilescannerservice.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\\appdbcontext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|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\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-utilities.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}", "AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-utilities.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}",
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-utilities.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}" "RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-utilities.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}"
@ -124,48 +124,22 @@
"$type": "Bookmark", "$type": "Bookmark",
"Name": "RST:0:0:{b3f9f954-0ca5-0091-76b4-34a47f44c954}" "Name": "RST:0:0:{b3f9f954-0ca5-0091-76b4-34a47f44c954}"
}, },
{
"$type": "Document",
"DocumentIndex": 2,
"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": "AgIAACMAAAAAAAAAAAAwwAAAAAAdAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-16T06:43:46.404Z",
"EditorCaption": ""
},
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 3, "DocumentIndex": 3,
"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": "AgIAAF8AAAAAAAAAAADwv3EAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2026-05-15T16:43:26.6Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"Title": "SettingsService.cs", "Title": "SettingsService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\SettingsService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\SettingsService.cs",
"RelativeDocumentMoniker": "Services\\SettingsService.cs", "RelativeDocumentMoniker": "Services\\SettingsService.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\SettingsService.cs", "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\SettingsService.cs",
"RelativeToolTip": "Services\\SettingsService.cs", "RelativeToolTip": "Services\\SettingsService.cs",
"ViewState": "AgIAAEoAAAAAAAAAAAAAAGUAAAA7AAAAAAAAAA==", "ViewState": "AgIAAMAAAAAAAAAAAAAQwMgAAAAMAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-16T06:05:12.928Z", "WhenOpened": "2026-05-16T06:05:12.928Z",
"EditorCaption": "" "EditorCaption": ""
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 8, "DocumentIndex": 11,
"Title": "ThemeService.cs", "Title": "ThemeService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
"RelativeDocumentMoniker": "Services\\ThemeService.cs", "RelativeDocumentMoniker": "Services\\ThemeService.cs",
@ -178,20 +152,20 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 5, "DocumentIndex": 4,
"Title": "ISettingsService.cs", "Title": "ISettingsService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ISettingsService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ISettingsService.cs",
"RelativeDocumentMoniker": "Services\\ISettingsService.cs", "RelativeDocumentMoniker": "Services\\ISettingsService.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ISettingsService.cs", "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ISettingsService.cs",
"RelativeToolTip": "Services\\ISettingsService.cs", "RelativeToolTip": "Services\\ISettingsService.cs",
"ViewState": "AgIAAAIAAAAAAAAAAAAxwBcAAAAbAAAAAAAAAA==", "ViewState": "AgIAAAsAAAAAAAAAAAA8wCEAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-16T13:21:26.951Z", "WhenOpened": "2026-05-16T13:21:26.951Z",
"EditorCaption": "" "EditorCaption": ""
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 4, "DocumentIndex": 8,
"Title": "MainLayout.razor", "Title": "MainLayout.razor",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor",
"RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor", "RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor",
@ -204,20 +178,20 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 0, "DocumentIndex": 6,
"Title": "OllamaSettings.cs", "Title": "OllamaSettings.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
"RelativeDocumentMoniker": "Models\\OllamaSettings.cs", "RelativeDocumentMoniker": "Models\\OllamaSettings.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs", "ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
"RelativeToolTip": "Models\\OllamaSettings.cs", "RelativeToolTip": "Models\\OllamaSettings.cs",
"ViewState": "AgIAAAAAAAAAAAAAAAAqwBMAAAAgAAAAAAAAAA==", "ViewState": "AgIAAAAAAAAAAAAAAAAqwAYAAAA6AAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-16T13:39:46.179Z", "WhenOpened": "2026-05-16T13:39:46.179Z",
"EditorCaption": "" "EditorCaption": ""
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 6, "DocumentIndex": 9,
"Title": "FileScannerService.cs", "Title": "FileScannerService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
"RelativeDocumentMoniker": "Services\\FileScannerService.cs", "RelativeDocumentMoniker": "Services\\FileScannerService.cs",
@ -230,7 +204,59 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 14, "DocumentIndex": 0,
"Title": "AppDbContext.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
"RelativeDocumentMoniker": "Data\\AppDbContext.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
"RelativeToolTip": "Data\\AppDbContext.cs",
"ViewState": "AgIAADgAAAAAAAAAAAAuwEsAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-14T10:50:13.284Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 1,
"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": "AgIAADQAAAAAAAAAAAAQwEUAAABDAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-16T06:43:46.404Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 2,
"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": "AgIAAFgAAAAAAAAAAAApwGsAAAAwAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2026-05-16T13:01:59.743Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 7,
"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": "AgIAAHMAAAAAAAAAAADwv4UAAAAAAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2026-05-15T16:43:26.6Z",
"EditorCaption": ""
},
{
"$type": "Document",
"DocumentIndex": 5,
"Title": "IOllamaService.cs", "Title": "IOllamaService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaService.cs",
"RelativeDocumentMoniker": "Services\\IOllamaService.cs", "RelativeDocumentMoniker": "Services\\IOllamaService.cs",
@ -243,7 +269,7 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 7, "DocumentIndex": 10,
"Title": "Program.cs", "Title": "Program.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Program.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Program.cs",
"RelativeDocumentMoniker": "Program.cs", "RelativeDocumentMoniker": "Program.cs",
@ -256,7 +282,7 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 9, "DocumentIndex": 12,
"Title": "App.razor", "Title": "App.razor",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor",
"RelativeDocumentMoniker": "Components\\App.razor", "RelativeDocumentMoniker": "Components\\App.razor",
@ -269,7 +295,7 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 13, "DocumentIndex": 15,
"Title": "Models.razor", "Title": "Models.razor",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor",
"RelativeDocumentMoniker": "Components\\Pages\\Models.razor", "RelativeDocumentMoniker": "Components\\Pages\\Models.razor",
@ -282,7 +308,7 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 10, "DocumentIndex": 13,
"Title": "LLM_Model.cs", "Title": "LLM_Model.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs",
"RelativeDocumentMoniker": "Models\\LLM_Model.cs", "RelativeDocumentMoniker": "Models\\LLM_Model.cs",
@ -295,7 +321,7 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 12, "DocumentIndex": 14,
"Title": "ModelStatus.cs", "Title": "ModelStatus.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs",
"RelativeDocumentMoniker": "Models\\ModelStatus.cs", "RelativeDocumentMoniker": "Models\\ModelStatus.cs",
@ -306,19 +332,6 @@
"WhenOpened": "2026-05-16T13:01:24.508Z", "WhenOpened": "2026-05-16T13:01:24.508Z",
"EditorCaption": "" "EditorCaption": ""
}, },
{
"$type": "Document",
"DocumentIndex": 11,
"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": "AgIAAFkAAAAAAAAAAAApwGAAAAAOAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
"WhenOpened": "2026-05-16T13:01:59.743Z",
"EditorCaption": ""
},
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 19, "DocumentIndex": 19,
@ -345,7 +358,7 @@
}, },
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 15, "DocumentIndex": 16,
"Title": "IFileScannerService.cs", "Title": "IFileScannerService.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IFileScannerService.cs", "DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IFileScannerService.cs",
"RelativeDocumentMoniker": "Services\\IFileScannerService.cs", "RelativeDocumentMoniker": "Services\\IFileScannerService.cs",
@ -367,18 +380,6 @@
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|", "Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-15T15:57:10.2Z" "WhenOpened": "2026-05-15T15:57:10.2Z"
}, },
{
"$type": "Document",
"DocumentIndex": 16,
"Title": "AppDbContext.cs",
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
"RelativeDocumentMoniker": "Data\\AppDbContext.cs",
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
"RelativeToolTip": "Data\\AppDbContext.cs",
"ViewState": "AgIAABoAAAAAAAAAAAAQwD4AAAAIAAAAAAAAAA==",
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
"WhenOpened": "2026-05-14T10:50:13.284Z"
},
{ {
"$type": "Document", "$type": "Document",
"DocumentIndex": 17, "DocumentIndex": 17,

View file

@ -8,7 +8,12 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DiffPlex" Version="1.9.0" />
<PackageReference Include="Microsoft.Data.Sqlite" Version="10.0.5" /> <PackageReference Include="Microsoft.Data.Sqlite" Version="10.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="10.0.8">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.8" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.8" />
</ItemGroup> </ItemGroup>

31
Components/DiffView.razor Normal file
View file

@ -0,0 +1,31 @@
@using DiffPlex
@using DiffPlex.DiffBuilder
@using DiffPlex.DiffBuilder.Model
<div class="diff-view">
@if (lines is not null)
{
@foreach (var line in lines.Lines)
{
<div class="diff-line diff-@line.Type.ToString().ToLowerInvariant()">
<span class="diff-line-num">@line.Position</span>
<span class="diff-line-text">@line.Text</span>
</div>
}
}
</div>
@code {
[Parameter]
public string Original { get; set; } = string.Empty;
[Parameter]
public string Corrected { get; set; } = string.Empty;
private DiffPaneModel? lines;
protected override void OnParametersSet()
{
lines = InlineDiffBuilder.Diff(Original, Corrected);
}
}

View file

@ -29,11 +29,18 @@
</div> </div>
</div> </div>
@if (!string.IsNullOrEmpty(analysisResult)) @if (showSpellDiff && !string.IsNullOrEmpty(correctedText))
{ {
<div style="border-top: 2px solid var(--border-color); padding: 12px; max-height: 300px; overflow-y: auto;"> <div class="diff-panel">
<h4 style="margin-bottom: 8px;">Ergebnis:</h4> <h4>Rechtschreibprüfung - Änderungen:</h4>
<div style="white-space: pre-wrap; font-size: 13px; line-height: 1.5;">@analysisResult</div> <DiffView Original="@originalText" Corrected="@correctedText" />
</div>
}
else if (!string.IsNullOrEmpty(analysisResult))
{
<div class="result-panel">
<h4>Ergebnis:</h4>
<div class="result-text">@analysisResult</div>
</div> </div>
} }
@ -49,13 +56,14 @@
private bool isChecking; private bool isChecking;
private double checkProgress; private double checkProgress;
private string analysisResult = string.Empty; private string analysisResult = string.Empty;
private string originalText = string.Empty;
private string correctedText = string.Empty;
private bool showSpellDiff;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
if (Action == "newproject") if (Action == "newproject")
{ {
// The native folder dialog isn't available in Blazor.
// In a real app, you'd provide a form to enter project name and path.
statusText = "Bitte nutze die Einstellungen zum Erstellen eines neuen Projekts."; statusText = "Bitte nutze die Einstellungen zum Erstellen eines neuen Projekts.";
} }
} }
@ -67,6 +75,7 @@
isChecking = true; isChecking = true;
statusText = "Ollama analysiert Stil..."; statusText = "Ollama analysiert Stil...";
checkProgress = 50; checkProgress = 50;
showSpellDiff = false;
try try
{ {
@ -91,10 +100,13 @@
isChecking = true; isChecking = true;
statusText = "Ollama prüft Rechtschreibung..."; statusText = "Ollama prüft Rechtschreibung...";
checkProgress = 50; checkProgress = 50;
showSpellDiff = false;
try try
{ {
//analysisResult = await OllamaService.QuickSpellCheckAsync(editorContent); originalText = editorContent;
correctedText = await OllamaService.QuickSpellCheckAsync(editorContent);
showSpellDiff = true;
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -114,6 +126,7 @@
isChecking = true; isChecking = true;
statusText = "Suche verwandte Fakten..."; statusText = "Suche verwandte Fakten...";
showSpellDiff = false;
await Task.Delay(500); await Task.Delay(500);
analysisResult = "RAG-Suche: Stelle sicher, dass ein Projekt geladen und indexiert wurde."; analysisResult = "RAG-Suche: Stelle sicher, dass ein Projekt geladen und indexiert wurde.";

View file

@ -10,6 +10,26 @@
<div class="settings-page"> <div class="settings-page">
<div class="settings-section">
<h3 class="settings-section-title">Benutzer</h3>
<div class="form-group">
<label for="userSelect">Aktiver Benutzer:</label>
<select id="userSelect" value="@selectedUserId" @onchange="SwitchUser">
@foreach (var u in users)
{
<option value="@u.Id">@u.Name</option>
}
</select>
</div>
<div class="form-group">
<label for="newUserName">Neuer Benutzer:</label>
<div style="display: flex; gap: 8px;">
<input id="newUserName" @bind="newUserName" placeholder="Name" style="flex: 1;" />
<button class="btn btn-secondary" @onclick="AddUser">Hinzufügen</button>
</div>
</div>
</div>
<div class="settings-layout"> <div class="settings-layout">
<div class="settings-layout-left"> <div class="settings-layout-left">
@ -123,23 +143,31 @@
private string factCheckTemplate = string.Empty; private string factCheckTemplate = string.Empty;
private string spellingPrompt = string.Empty; private string spellingPrompt = string.Empty;
private string newProjectName = string.Empty; private string newProjectName = string.Empty;
private string newUserName = string.Empty;
private string statusMessage = string.Empty; private string statusMessage = string.Empty;
private List<LLM_Model> availableModels = new(); private List<LLM_Model> availableModels = new();
private List<UserEntity> users = new();
private int selectedUserId;
protected override async Task OnInitializedAsync() protected override async Task OnInitializedAsync()
{ {
ragModel = await SettingsService.GetRagModelAsync() ?? "llama3.2"; users = await SettingsService.GetUsersAsync();
styleModel = await SettingsService.GetStyleModelAsync() ?? "llama3.2"; var current = await SettingsService.GetCurrentUserAsync();
spellingModel = await SettingsService.GetSpellingModelAsync() ?? "phi3:mini"; selectedUserId = current.Id;
selectedTheme = await SettingsService.GetThemeAsync() ?? "light";
ollamaUrl = await SettingsService.GetOllamaUrlAsync() ?? "http://localhost:11434"; var userSettings = await LoadUserSettingsAsync();
lektorPrompt = await SettingsService.GetLektorSystemPromptAsync() ?? string.Empty;
factCheckTemplate = await SettingsService.GetFactCheckTemplateAsync() ?? string.Empty; ragModel = userSettings.ragModel;
spellingPrompt = await SettingsService.GetSpellingPromptAsync() ?? string.Empty; styleModel = userSettings.styleModel;
spellingModel = userSettings.spellingModel;
selectedTheme = userSettings.selectedTheme;
ollamaUrl = userSettings.ollamaUrl;
lektorPrompt = userSettings.lektorPrompt;
factCheckTemplate = userSettings.factCheckTemplate;
spellingPrompt = userSettings.spellingPrompt;
try try
{ {
var models = await OllamaService.GetLocalModelsAsync(); var models = await OllamaService.GetLocalModelsAsync();
availableModels = models.ToList(); availableModels = models.ToList();
} }
@ -149,6 +177,47 @@
} }
} }
private async Task<(string ragModel, string styleModel, string spellingModel, string selectedTheme, string ollamaUrl, string lektorPrompt, string factCheckTemplate, string spellingPrompt)> LoadUserSettingsAsync()
{
return (
await SettingsService.GetRagModelAsync() ?? "llama3.2",
await SettingsService.GetStyleModelAsync() ?? "llama3.2",
await SettingsService.GetSpellingModelAsync() ?? "phi3:mini",
await SettingsService.GetThemeAsync() ?? "light",
await SettingsService.GetOllamaUrlAsync() ?? "http://localhost:11434",
await SettingsService.GetLektorSystemPromptAsync() ?? string.Empty,
await SettingsService.GetFactCheckTemplateAsync() ?? string.Empty,
await SettingsService.GetSpellingPromptAsync() ?? string.Empty
);
}
private async Task SwitchUser(ChangeEventArgs e)
{
var userId = int.Parse(e.Value?.ToString() ?? "0");
await SettingsService.SetCurrentUserAsync(userId);
selectedUserId = userId;
var userSettings = await LoadUserSettingsAsync();
ragModel = userSettings.ragModel;
styleModel = userSettings.styleModel;
spellingModel = userSettings.spellingModel;
selectedTheme = userSettings.selectedTheme;
ollamaUrl = userSettings.ollamaUrl;
lektorPrompt = userSettings.lektorPrompt;
factCheckTemplate = userSettings.factCheckTemplate;
spellingPrompt = userSettings.spellingPrompt;
}
private async Task AddUser()
{
if (string.IsNullOrWhiteSpace(newUserName)) return;
var user = await SettingsService.CreateUserAsync(newUserName);
users.Add(user);
newUserName = string.Empty;
statusMessage = $"Benutzer '{user.Name}' erstellt.";
}
private async Task SaveSettings() private async Task SaveSettings()
{ {
await SettingsService.SaveOllamaUrlAsync(ollamaUrl); await SettingsService.SaveOllamaUrlAsync(ollamaUrl);
@ -164,7 +233,4 @@
statusMessage = "Einstellungen gespeichert."; statusMessage = "Einstellungen gespeichert.";
await ThemeService.ApplyTheme(selectedTheme); await ThemeService.ApplyTheme(selectedTheme);
} }
} }

View file

@ -8,6 +8,7 @@ public class AppDbContext : DbContext
public DbSet<ProjectEntity> Projects => Set<ProjectEntity>(); public DbSet<ProjectEntity> Projects => Set<ProjectEntity>();
public DbSet<SettingEntity> Settings => Set<SettingEntity>(); public DbSet<SettingEntity> Settings => Set<SettingEntity>();
public DbSet<DocumentMetaEntity> DocumentMeta => Set<DocumentMetaEntity>(); public DbSet<DocumentMetaEntity> DocumentMeta => Set<DocumentMetaEntity>();
public DbSet<UserEntity> Users => Set<UserEntity>();
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { } public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
@ -25,9 +26,19 @@ public class AppDbContext : DbContext
modelBuilder.Entity<SettingEntity>(entity => modelBuilder.Entity<SettingEntity>(entity =>
{ {
entity.ToTable("Settings"); entity.ToTable("Settings");
entity.HasKey(e => e.Key); entity.HasKey(e => e.Id);
entity.Property(e => e.Key).HasColumnName("key"); entity.Property(e => e.Key).HasColumnName("key").IsRequired();
entity.Property(e => e.Value).HasColumnName("value").IsRequired(); entity.Property(e => e.Value).HasColumnName("value").IsRequired();
entity.Property(e => e.UserId).HasColumnName("user_id");
entity.Property(e => e.ProjectId).HasColumnName("project_id");
});
modelBuilder.Entity<UserEntity>(entity =>
{
entity.ToTable("Users");
entity.HasKey(e => e.Id);
entity.Property(e => e.Name).HasColumnName("name").IsRequired();
entity.Property(e => e.IsCurrent).HasColumnName("is_current");
}); });
modelBuilder.Entity<DocumentMetaEntity>(entity => modelBuilder.Entity<DocumentMetaEntity>(entity =>
@ -41,7 +52,7 @@ public class AppDbContext : DbContext
}); });
} }
public static void InitializeDatabase(string connectionString) public static void SetupVecExtension(string connectionString)
{ {
using var connection = new SqliteConnection(connectionString); using var connection = new SqliteConnection(connectionString);
connection.Open(); connection.Open();
@ -62,25 +73,6 @@ public class AppDbContext : DbContext
using var createVecCmd = connection.CreateCommand(); using var createVecCmd = connection.CreateCommand();
createVecCmd.CommandText = @" createVecCmd.CommandText = @"
CREATE TABLE IF NOT EXISTS Projects (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
RootPath TEXT NOT NULL,
LastOpened DATETIME
);
CREATE TABLE IF NOT EXISTS Settings (
key TEXT NOT NULL UNIQUE,
value TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS DocumentMeta (
id INTEGER PRIMARY KEY AUTOINCREMENT,
project_id INTEGER,
file_path TEXT UNIQUE,
last_modified DATETIME,
hash TEXT,
file_type TEXT,
FOREIGN KEY(project_id) REFERENCES Projects(id)
);
CREATE VIRTUAL TABLE IF NOT EXISTS vec_documents USING vec0( CREATE VIRTUAL TABLE IF NOT EXISTS vec_documents USING vec0(
embedding float[1024] embedding float[1024]
);"; );";

View file

@ -7,8 +7,16 @@ namespace AuthorBuddy.Web.Data;
public class SettingEntity public class SettingEntity
{ {
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
public string Key { get; set; } = string.Empty; public string Key { get; set; } = string.Empty;
[Required] [Required]
public string Value { get; set; } = string.Empty; public string Value { get; set; } = string.Empty;
public int? UserId { get; set; }
public int? ProjectId { get; set; }
} }

17
Data/UserEntity.cs Normal file
View file

@ -0,0 +1,17 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace AuthorBuddy.Web.Data;
[Table("Users")]
public class UserEntity
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
[Required]
public string Name { get; set; } = string.Empty;
public bool IsCurrent { get; set; }
}

View file

@ -0,0 +1,127 @@
// <auto-generated />
using System;
using AuthorBuddy.Web.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace AuthorBuddy.Web.Migrations
{
[DbContext(typeof(AppDbContext))]
[Migration("20260516151053_InitialCreate")]
partial class InitialCreate
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "10.0.8");
modelBuilder.Entity("AuthorBuddy.Web.Data.DocumentMetaEntity", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("FilePath")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("file_path");
b.Property<string>("FileType")
.HasColumnType("TEXT")
.HasColumnName("file_type");
b.Property<string>("Hash")
.HasColumnType("TEXT");
b.Property<DateTime?>("LastModified")
.HasColumnType("TEXT")
.HasColumnName("last_modified");
b.Property<int?>("ProjectId")
.HasColumnType("INTEGER")
.HasColumnName("project_id");
b.HasKey("Id");
b.ToTable("DocumentMeta", (string)null);
});
modelBuilder.Entity("AuthorBuddy.Web.Data.ProjectEntity", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<DateTime?>("LastOpened")
.HasColumnType("TEXT");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("RootPath")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("Id");
b.ToTable("Projects", (string)null);
});
modelBuilder.Entity("AuthorBuddy.Web.Data.SettingEntity", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("Key")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("key");
b.Property<int?>("ProjectId")
.HasColumnType("INTEGER")
.HasColumnName("project_id");
b.Property<int?>("UserId")
.HasColumnType("INTEGER")
.HasColumnName("user_id");
b.Property<string>("Value")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("value");
b.HasKey("Id");
b.ToTable("Settings", (string)null);
});
modelBuilder.Entity("AuthorBuddy.Web.Data.UserEntity", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("IsCurrent")
.HasColumnType("INTEGER")
.HasColumnName("is_current");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("name");
b.HasKey("Id");
b.ToTable("Users", (string)null);
});
#pragma warning restore 612, 618
}
}
}

View file

@ -0,0 +1,93 @@
using System;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace AuthorBuddy.Web.Migrations
{
/// <inheritdoc />
public partial class InitialCreate : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "DocumentMeta",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
project_id = table.Column<int>(type: "INTEGER", nullable: true),
file_path = table.Column<string>(type: "TEXT", nullable: false),
last_modified = table.Column<DateTime>(type: "TEXT", nullable: true),
Hash = table.Column<string>(type: "TEXT", nullable: true),
file_type = table.Column<string>(type: "TEXT", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_DocumentMeta", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Projects",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
Name = table.Column<string>(type: "TEXT", nullable: false),
RootPath = table.Column<string>(type: "TEXT", nullable: false),
LastOpened = table.Column<DateTime>(type: "TEXT", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Projects", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Settings",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
key = table.Column<string>(type: "TEXT", nullable: false),
value = table.Column<string>(type: "TEXT", nullable: false),
user_id = table.Column<int>(type: "INTEGER", nullable: true),
project_id = table.Column<int>(type: "INTEGER", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("PK_Settings", x => x.Id);
});
migrationBuilder.CreateTable(
name: "Users",
columns: table => new
{
Id = table.Column<int>(type: "INTEGER", nullable: false)
.Annotation("Sqlite:Autoincrement", true),
name = table.Column<string>(type: "TEXT", nullable: false),
is_current = table.Column<bool>(type: "INTEGER", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_Users", x => x.Id);
});
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "DocumentMeta");
migrationBuilder.DropTable(
name: "Projects");
migrationBuilder.DropTable(
name: "Settings");
migrationBuilder.DropTable(
name: "Users");
}
}
}

View file

@ -0,0 +1,124 @@
// <auto-generated />
using System;
using AuthorBuddy.Web.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace AuthorBuddy.Web.Migrations
{
[DbContext(typeof(AppDbContext))]
partial class AppDbContextModelSnapshot : ModelSnapshot
{
protected override void BuildModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "10.0.8");
modelBuilder.Entity("AuthorBuddy.Web.Data.DocumentMetaEntity", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("FilePath")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("file_path");
b.Property<string>("FileType")
.HasColumnType("TEXT")
.HasColumnName("file_type");
b.Property<string>("Hash")
.HasColumnType("TEXT");
b.Property<DateTime?>("LastModified")
.HasColumnType("TEXT")
.HasColumnName("last_modified");
b.Property<int?>("ProjectId")
.HasColumnType("INTEGER")
.HasColumnName("project_id");
b.HasKey("Id");
b.ToTable("DocumentMeta", (string)null);
});
modelBuilder.Entity("AuthorBuddy.Web.Data.ProjectEntity", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<DateTime?>("LastOpened")
.HasColumnType("TEXT");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("TEXT");
b.Property<string>("RootPath")
.IsRequired()
.HasColumnType("TEXT");
b.HasKey("Id");
b.ToTable("Projects", (string)null);
});
modelBuilder.Entity("AuthorBuddy.Web.Data.SettingEntity", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<string>("Key")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("key");
b.Property<int?>("ProjectId")
.HasColumnType("INTEGER")
.HasColumnName("project_id");
b.Property<int?>("UserId")
.HasColumnType("INTEGER")
.HasColumnName("user_id");
b.Property<string>("Value")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("value");
b.HasKey("Id");
b.ToTable("Settings", (string)null);
});
modelBuilder.Entity("AuthorBuddy.Web.Data.UserEntity", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER");
b.Property<bool>("IsCurrent")
.HasColumnType("INTEGER")
.HasColumnName("is_current");
b.Property<string>("Name")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("name");
b.HasKey("Id");
b.ToTable("Users", (string)null);
});
#pragma warning restore 612, 618
}
}
}

View file

@ -21,7 +21,13 @@ builder.Services.AddDbContextFactory<AppDbContext>(options =>
var app = builder.Build(); var app = builder.Build();
AppDbContext.InitializeDatabase(Constants.SQLiteConnection); AppDbContext.SetupVecExtension(Constants.SQLiteConnection);
await using var db = await app.Services.GetRequiredService<IDbContextFactory<AppDbContext>>().CreateDbContextAsync();
await db.Database.MigrateAsync();
var settingsInit = app.Services.GetRequiredService<ISettingsService>();
await settingsInit.InitializeAsync();
if (!app.Environment.IsDevelopment()) if (!app.Environment.IsDevelopment())
{ {

View file

@ -8,10 +8,6 @@ public interface IOllamaService
{ {
Task<IEnumerable<LLM_Model>> GetLocalModelsAsync(); Task<IEnumerable<LLM_Model>> GetLocalModelsAsync();
Task<bool> PullModelAsync(string modelName, IProgress<string> progress); Task<bool> PullModelAsync(string modelName, IProgress<string> progress);
//Task<IList<double>> GetEmbeddingAsync(string text); Task<string> QuickSpellCheckAsync(string text);
//Task<string> StreamStyleCheckAsync(string input);
//Task<string> AnswerBasedOnFactsAsync(string question, string facts);
//Task<string> QuickSpellCheckAsync(string text);
void Reconfigure(string ollamaUrl); void Reconfigure(string ollamaUrl);
} }

View file

@ -1,4 +1,6 @@
namespace AuthorBuddy.Web.Services; using AuthorBuddy.Web.Data;
namespace AuthorBuddy.Web.Services;
public interface ISettingsService public interface ISettingsService
{ {
@ -21,5 +23,12 @@ public interface ISettingsService
Task SaveFactCheckTemplateAsync(string prompt); Task SaveFactCheckTemplateAsync(string prompt);
Task SaveSpellingPromptAsync(string prompt); Task SaveSpellingPromptAsync(string prompt);
Task<List<UserEntity>> GetUsersAsync();
Task<UserEntity> GetCurrentUserAsync();
Task SetCurrentUserAsync(int userId);
Task<UserEntity> CreateUserAsync(string name);
int? CurrentProjectId { get; set; }
Task InitializeAsync(); Task InitializeAsync();
} }

View file

@ -1,15 +1,19 @@
using AuthorBuddy.Web.Models; using AuthorBuddy.Web.Models;
using System.Text.Json; using System.Text.Json;
using static System.Net.Mime.MediaTypeNames;
namespace AuthorBuddy.Web.Services; namespace AuthorBuddy.Web.Services;
public class OllamaService : IOllamaService public class OllamaService : IOllamaService
{ {
private readonly HttpClient _httpClient; private readonly HttpClient _httpClient;
private readonly OllamaSettings _settings;
private string _baseUrl = "http://localhost:11434"; private string _baseUrl = "http://localhost:11434";
public OllamaService() public OllamaService(OllamaSettings settings)
{ {
_settings = settings;
_baseUrl = settings.OllamaUrl;
_httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(300) }; _httpClient = new HttpClient { Timeout = TimeSpan.FromSeconds(300) };
} }
@ -49,6 +53,27 @@ public class OllamaService : IOllamaService
} }
} }
public async Task<string> QuickSpellCheckAsync(string text)
{
return await Chat(_settings.SpellingModel, text, _settings.SpellingPrompt);
}
public async Task<string> StreamStyleCheckAsync(string text)
{
var systemPrompt = _settings.LektorSystemPrompt;
return await Chat(_settings.StyleModel, text, systemPrompt);
}
public async Task<string> AnswerBasedOnFactsAsync(string question, string facts)
{
var prompt = _settings.GetFactCheckPrompt(question, facts);
return await Chat(_settings.EmbedModel, prompt);
}
public async Task<string> Chat(string model, string userMessage, string? systemPrompt = null) public async Task<string> Chat(string model, string userMessage, string? systemPrompt = null)
{ {
try try
@ -57,6 +82,7 @@ public class OllamaService : IOllamaService
{ {
model = model, model = model,
prompt = userMessage, prompt = userMessage,
system = systemPrompt,
stream = false stream = false
}; };

View file

@ -17,6 +17,8 @@ public class SettingsService : ISettingsService
private readonly IDbContextFactory<AppDbContext> _contextFactory; private readonly IDbContextFactory<AppDbContext> _contextFactory;
private readonly OllamaSettings _ollamaConfig; private readonly OllamaSettings _ollamaConfig;
private int? _currentUserId;
private int? _currentProjectId;
public SettingsService(IDbContextFactory<AppDbContext> contextFactory, OllamaSettings ollamaConfig) public SettingsService(IDbContextFactory<AppDbContext> contextFactory, OllamaSettings ollamaConfig)
{ {
@ -24,35 +26,69 @@ public class SettingsService : ISettingsService
_ollamaConfig = ollamaConfig; _ollamaConfig = ollamaConfig;
} }
private async Task<string?> GetAsync(string key) public int? CurrentProjectId
{
get => _currentProjectId;
set => _currentProjectId = value;
}
private async Task<string?> GetSettingAsync(string key, int? userId, int? projectId)
{ {
await using var context = await _contextFactory.CreateDbContextAsync(); await using var context = await _contextFactory.CreateDbContextAsync();
var setting = await context.Settings.FindAsync(key);
var matches = context.Settings.Where(s =>
s.Key == key &&
(s.UserId == userId || s.UserId == null) &&
(s.ProjectId == projectId || s.ProjectId == null));
var setting = await matches
.OrderByDescending(s => s.UserId != null)
.ThenByDescending(s => s.ProjectId != null)
.FirstOrDefaultAsync();
return setting?.Value; return setting?.Value;
} }
private async Task<string?> GetAsync(string key)
{
return await GetSettingAsync(key, _currentUserId, _currentProjectId);
}
private async Task SetAsync(string key, string value)
{
await using var context = await _contextFactory.CreateDbContextAsync();
var existing = await context.Settings
.Where(s => s.Key == key && s.UserId == _currentUserId && s.ProjectId == _currentProjectId)
.FirstOrDefaultAsync();
if (existing != null)
{
existing.Value = value;
}
else
{
context.Settings.Add(new SettingEntity
{
Key = key,
Value = value,
UserId = _currentUserId,
ProjectId = _currentProjectId
});
}
await context.SaveChangesAsync();
}
public Task<string?> GetOllamaUrlAsync() => GetAsync(KeyOllamaUrl); public Task<string?> GetOllamaUrlAsync() => GetAsync(KeyOllamaUrl);
public Task<string?> GetRagModelAsync() => GetAsync(KeyRagModel); public Task<string?> GetRagModelAsync() => GetAsync(KeyRagModel);
public Task<string?> GetStyleModelAsync() => GetAsync(KeyStyleModel); public Task<string?> GetStyleModelAsync() => GetAsync(KeyStyleModel);
public Task<string?> GetLektorSystemPromptAsync() => GetAsync(KeyLektorPrompt); public Task<string?> GetLektorSystemPromptAsync() => GetAsync(KeyLektorPrompt);
public Task<string?> GetFactCheckTemplateAsync() => GetAsync(KeyFactCheckTemplate); public Task<string?> GetFactCheckTemplateAsync() => GetAsync(KeyFactCheckTemplate);
public Task<string?> GetSpellingPromptAsync() => GetAsync(KeySpellingPrompt); public Task<string?> GetSpellingPromptAsync() => GetAsync(KeySpellingPrompt);
public Task<string?> GetSpellingModelAsync() => GetAsync(KeySpellingModel); public Task<string?> GetSpellingModelAsync() => GetAsync(KeySpellingModel);
public Task<string?> GetThemeAsync() => GetAsync(KeyTheme); public Task<string?> GetThemeAsync() => GetAsync(KeyTheme);
private async Task SetAsync(string key, string value)
{
await using var context = await _contextFactory.CreateDbContextAsync();
var existing = await context.Settings.FindAsync(key);
if (existing != null)
existing.Value = value;
else
context.Settings.Add(new SettingEntity { Key = key, Value = value });
await context.SaveChangesAsync();
}
public async Task SaveOllamaUrlAsync(string url) public async Task SaveOllamaUrlAsync(string url)
{ {
await SetAsync(KeyOllamaUrl, url); await SetAsync(KeyOllamaUrl, url);
@ -82,6 +118,7 @@ public class SettingsService : ISettingsService
await SetAsync(KeyFactCheckTemplate, prompt); await SetAsync(KeyFactCheckTemplate, prompt);
_ollamaConfig.FactCheckTemplate = prompt; _ollamaConfig.FactCheckTemplate = prompt;
} }
public async Task SaveSpellingPromptAsync(string prompt) public async Task SaveSpellingPromptAsync(string prompt)
{ {
await SetAsync(KeySpellingPrompt, prompt); await SetAsync(KeySpellingPrompt, prompt);
@ -97,10 +134,56 @@ public class SettingsService : ISettingsService
public Task SaveThemeAsync(string theme) public Task SaveThemeAsync(string theme)
=> SetAsync(KeyTheme, theme); => SetAsync(KeyTheme, theme);
public async Task<List<UserEntity>> GetUsersAsync()
{
await using var context = await _contextFactory.CreateDbContextAsync();
return await context.Users.ToListAsync();
}
public async Task<UserEntity> GetCurrentUserAsync()
{
await using var context = await _contextFactory.CreateDbContextAsync();
var user = await context.Users.FirstOrDefaultAsync(u => u.IsCurrent);
return user ?? await context.Users.FirstAsync();
}
public async Task SetCurrentUserAsync(int userId)
{
await using var context = await _contextFactory.CreateDbContextAsync();
var users = await context.Users.ToListAsync();
foreach (var u in users)
u.IsCurrent = u.Id == userId;
await context.SaveChangesAsync();
_currentUserId = userId;
}
public async Task<UserEntity> CreateUserAsync(string name)
{
await using var context = await _contextFactory.CreateDbContextAsync();
var user = new UserEntity { Name = name };
context.Users.Add(user);
await context.SaveChangesAsync();
return user;
}
public async Task InitializeAsync() public async Task InitializeAsync()
{ {
await using var context = await _contextFactory.CreateDbContextAsync(); await using var context = await _contextFactory.CreateDbContextAsync();
var userExists = await context.Users.AnyAsync();
if (!userExists)
{
var defaultUser = new UserEntity { Name = "Standardbenutzer", IsCurrent = true };
context.Users.Add(defaultUser);
await context.SaveChangesAsync();
_currentUserId = defaultUser.Id;
}
else
{
var current = await context.Users.FirstOrDefaultAsync(u => u.IsCurrent);
_currentUserId = current?.Id ?? (await context.Users.FirstAsync()).Id;
}
var entries = new (string Key, string Default)[] var entries = new (string Key, string Default)[]
{ {
(KeyOllamaUrl, _ollamaConfig.OllamaUrl), (KeyOllamaUrl, _ollamaConfig.OllamaUrl),
@ -115,7 +198,10 @@ public class SettingsService : ISettingsService
foreach (var entry in entries) foreach (var entry in entries)
{ {
var existing = await context.Settings.FindAsync(entry.Key); var existing = await context.Settings
.Where(s => s.Key == entry.Key && s.UserId == _currentUserId && s.ProjectId == null)
.FirstOrDefaultAsync();
if (existing != null) if (existing != null)
{ {
var val = existing.Value; var val = existing.Value;
@ -130,7 +216,13 @@ public class SettingsService : ISettingsService
} }
else else
{ {
context.Settings.Add(new SettingEntity { Key = entry.Key, Value = entry.Default }); context.Settings.Add(new SettingEntity
{
Key = entry.Key,
Value = entry.Default,
UserId = _currentUserId,
ProjectId = null
});
} }
} }

Binary file not shown.

View file

@ -398,6 +398,68 @@ button.primary {
font-size: 13px; font-size: 13px;
} }
/* Diff view */
.diff-panel {
border-top: 2px solid var(--border-color);
padding: 12px;
max-height: 400px;
overflow-y: auto;
}
.diff-panel h4, .result-panel h4 {
margin-bottom: 8px;
font-size: 14px;
}
.diff-view {
font-family: monospace;
font-size: 13px;
line-height: 1.5;
}
.diff-line {
display: flex;
gap: 8px;
padding: 1px 4px;
}
.diff-line-num {
color: var(--border-color);
min-width: 32px;
text-align: right;
user-select: none;
}
.diff-line-text {
white-space: pre-wrap;
word-break: break-word;
}
.diff-inserted {
background: rgba(0, 200, 0, 0.15);
}
.diff-deleted {
background: rgba(200, 0, 0, 0.15);
}
.diff-modified {
background: rgba(200, 200, 0, 0.15);
}
.result-panel {
border-top: 2px solid var(--border-color);
padding: 12px;
max-height: 300px;
overflow-y: auto;
}
.result-text {
white-space: pre-wrap;
font-size: 13px;
line-height: 1.5;
}
/* Scrollbar styling */ /* Scrollbar styling */
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 8px; width: 8px;