Improve
This commit is contained in:
parent
0735f81235
commit
a5d2c80c70
32 changed files with 2865 additions and 982 deletions
|
|
@ -3,13 +3,77 @@
|
||||||
"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\\pages\\login.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\login.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
"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\\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}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\resources\\de.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
|
||||||
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:resources\\de.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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\\components\\pages\\chat.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||||
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\chat.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.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}",
|
||||||
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\layout\\mainlayout.razor.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\\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}",
|
"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}"
|
"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}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\login.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||||
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\login.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\firstrunsetup.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||||
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\firstrunsetup.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\\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}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\dbadminservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\dbadminservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\HP\\AppData\\Local\\SourceServer\\dddeb33c46e3c746b90c5f64463103c08ec03b9a85e92eab3b21c11218135d28\\src\\runtime\\src\\libraries\\System.Private.CoreLib\\src\\Microsoft\\Win32\\SafeHandles\\SafeFileHandle.Windows.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\HP\\AppData\\Local\\SourceServer\\dddeb33c46e3c746b90c5f64463103c08ec03b9a85e92eab3b21c11218135d28\\src\\runtime\\src\\libraries\\System.Private.CoreLib\\src\\Microsoft\\Win32\\SafeHandles\\SafeFileHandle.Windows.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
},
|
},
|
||||||
|
|
@ -20,22 +84,10 @@
|
||||||
"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}",
|
"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}"
|
"RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:Data\\AppDbContext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\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\\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\\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\\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}"
|
"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\\data\\userentity.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:data\\userentity.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\projectservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\projectservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\projectservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\projectservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
|
@ -52,14 +104,6 @@
|
||||||
"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}",
|
"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}"
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:install.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\ollamaassistant.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\ollamaassistant.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\layout\\mainlayout.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ithemeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ithemeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ithemeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ithemeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
|
@ -104,10 +148,6 @@
|
||||||
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\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\\components\\app.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\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||||
|
|
@ -124,10 +164,6 @@
|
||||||
"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}"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\layout\\mainlayout.razor.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}",
|
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\layout\\mainlayout.razor.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"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}"
|
||||||
|
|
@ -156,7 +192,7 @@
|
||||||
"DocumentGroups": [
|
"DocumentGroups": [
|
||||||
{
|
{
|
||||||
"DockedWidth": 200,
|
"DockedWidth": 200,
|
||||||
"SelectedChildIndex": 8,
|
"SelectedChildIndex": 6,
|
||||||
"Children": [
|
"Children": [
|
||||||
{
|
{
|
||||||
"$type": "Bookmark",
|
"$type": "Bookmark",
|
||||||
|
|
@ -164,44 +200,140 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 5,
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 4,
|
||||||
|
"Title": "Chat.razor",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Chat.razor",
|
||||||
|
"RelativeDocumentMoniker": "Components\\Pages\\Chat.razor",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Chat.razor",
|
||||||
|
"RelativeToolTip": "Components\\Pages\\Chat.razor",
|
||||||
|
"ViewState": "AgIAAFgAAAAAAAAAAAApwG0AAAANAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||||
|
"WhenOpened": "2026-06-14T05:59:50.644Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 7,
|
||||||
|
"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==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-14T05:03:24.305Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 17,
|
||||||
|
"Title": "DbAdminService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\DbAdminService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\DbAdminService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\DbAdminService.cs",
|
||||||
|
"RelativeToolTip": "Services\\DbAdminService.cs",
|
||||||
|
"ViewState": "AgIAABUAAAAAAAAAAAAowAAAAAAAAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-10T17:34:10.361Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$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": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 12,
|
||||||
|
"Title": "Login.razor",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor",
|
||||||
|
"RelativeDocumentMoniker": "Components\\Pages\\Login.razor",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor",
|
||||||
|
"RelativeToolTip": "Components\\Pages\\Login.razor",
|
||||||
|
"ViewState": "AgIAADAAAAAAAAAAAADwv0QAAAAIAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||||
|
"WhenOpened": "2026-05-21T08:47:41.996Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 13,
|
||||||
|
"Title": "FirstRunSetup.razor",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\FirstRunSetup.razor",
|
||||||
|
"RelativeDocumentMoniker": "Components\\Pages\\FirstRunSetup.razor",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\FirstRunSetup.razor",
|
||||||
|
"RelativeToolTip": "Components\\Pages\\FirstRunSetup.razor",
|
||||||
|
"ViewState": "AgIAACEAAAAAAAAAAAAAACsAAABsAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||||
|
"WhenOpened": "2026-06-09T17:25:10.421Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 3,
|
||||||
"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": "AgIAAE0BAAAAAAAAAAAAAC0BAAAMAAAAAAAAAA==",
|
"ViewState": "AgIAANwBAAAAAAAAAAAAAO4BAAAIAAAAAAAAAA==",
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
"WhenOpened": "2026-05-21T17:37:24.777Z"
|
"WhenOpened": "2026-05-21T17:37:24.777Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 6,
|
"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",
|
"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": "AgIAAJsAAAAAAAAAAAAAAKwAAAAWAAAAAAAAAA==",
|
"ViewState": "AgIAAJsAAAAAAAAAAAAAAKwAAAAAAAAAAAAAAA==",
|
||||||
"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"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 1,
|
"DocumentIndex": 21,
|
||||||
"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": "AgIAADMAAAAAAAAAAAAAAFUAAAADAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-20T04:07:21.54Z",
|
|
||||||
"EditorCaption": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 7,
|
|
||||||
"Title": "Editor.razor",
|
"Title": "Editor.razor",
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Editor.razor",
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Editor.razor",
|
||||||
"RelativeDocumentMoniker": "Components\\Pages\\Editor.razor",
|
"RelativeDocumentMoniker": "Components\\Pages\\Editor.razor",
|
||||||
|
|
@ -214,266 +346,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 8,
|
"DocumentIndex": 6,
|
||||||
"Title": "UserEntity.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\UserEntity.cs",
|
|
||||||
"RelativeDocumentMoniker": "Data\\UserEntity.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\UserEntity.cs",
|
|
||||||
"RelativeToolTip": "Data\\UserEntity.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAVAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-24T04:52:42.227Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 9,
|
|
||||||
"Title": "ProjectService.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ProjectService.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\ProjectService.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ProjectService.cs",
|
|
||||||
"RelativeToolTip": "Services\\ProjectService.cs",
|
|
||||||
"ViewState": "AgIAAN0AAAAAAAAAAAApwO0AAAAMAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-15T15:56:55.229Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 10,
|
|
||||||
"Title": "IOllamaSetupService.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaSetupService.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\IOllamaSetupService.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaSetupService.cs",
|
|
||||||
"RelativeToolTip": "Services\\IOllamaSetupService.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-30T08:35:51.087Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 0,
|
|
||||||
"Title": "Login.razor",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor",
|
|
||||||
"RelativeDocumentMoniker": "Components\\Pages\\Login.razor",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor",
|
|
||||||
"RelativeToolTip": "Components\\Pages\\Login.razor",
|
|
||||||
"ViewState": "AgIAADYAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
|
||||||
"WhenOpened": "2026-05-21T08:47:41.996Z",
|
|
||||||
"EditorCaption": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 2,
|
|
||||||
"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]",
|
|
||||||
"ViewState": "AgIAAHwAAAAAAAAAAAAQwHEAAAAQAAAAAQAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-06-09T14:36:02.721Z",
|
|
||||||
"EditorCaption": " [Schreibgesch\u00FCtzt]"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 3,
|
|
||||||
"Title": "A7405018.jpg",
|
|
||||||
"DocumentMoniker": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg",
|
|
||||||
"ToolTip": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
|
|
||||||
"WhenOpened": "2026-05-23T05:52:56.265Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 11,
|
|
||||||
"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,
|
|
||||||
"Title": "INSTALL.md",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\INSTALL.md",
|
|
||||||
"RelativeDocumentMoniker": "INSTALL.md",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\INSTALL.md",
|
|
||||||
"RelativeToolTip": "INSTALL.md",
|
|
||||||
"ViewState": "AgIAAEUAAAAAAAAAAAAAAFIAAAAQAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001818|",
|
|
||||||
"WhenOpened": "2026-05-31T17:07:33.423Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 13,
|
|
||||||
"Title": "OllamaAssistant.razor",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
|
|
||||||
"RelativeDocumentMoniker": "Components\\Pages\\OllamaAssistant.razor",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
|
|
||||||
"RelativeToolTip": "Components\\Pages\\OllamaAssistant.razor",
|
|
||||||
"ViewState": "AgIAANoAAAAAAAAAAAAiwPIAAAAZAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
|
||||||
"WhenOpened": "2026-05-20T05:14:39.037Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 14,
|
|
||||||
"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": "AgIAACABAAAAAAAAAAApwDQBAAARAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
|
||||||
"WhenOpened": "2026-05-15T16:04:36.444Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 15,
|
|
||||||
"Title": "IThemeService.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IThemeService.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\IThemeService.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IThemeService.cs",
|
|
||||||
"RelativeToolTip": "Services\\IThemeService.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAqwAgAAAAAAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-21T17:32:01.784Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 16,
|
|
||||||
"Title": "RedirectToLogin.razor",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\RedirectToLogin.razor",
|
|
||||||
"RelativeDocumentMoniker": "Components\\RedirectToLogin.razor",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\RedirectToLogin.razor",
|
|
||||||
"RelativeToolTip": "Components\\RedirectToLogin.razor",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAIAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
|
||||||
"WhenOpened": "2026-05-21T16:31:16.612Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 17,
|
|
||||||
"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": "AgIAABwAAAAAAAAAAAA9wC4AAAAZAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-21T16:35:36.655Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 18,
|
|
||||||
"Title": "IRagService.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IRagService.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\IRagService.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IRagService.cs",
|
|
||||||
"RelativeToolTip": "Services\\IRagService.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAVAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-18T15:37:44.565Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 19,
|
|
||||||
"Title": "ThemeService.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\ThemeService.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
|
|
||||||
"RelativeToolTip": "Services\\ThemeService.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAABEAAAAdAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-16T13:35:33.991Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 20,
|
|
||||||
"Title": "logo.jpg",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Assets\\logo.jpg",
|
|
||||||
"RelativeDocumentMoniker": "Assets\\logo.jpg",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Assets\\logo.jpg",
|
|
||||||
"RelativeToolTip": "Assets\\logo.jpg",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
|
|
||||||
"WhenOpened": "2026-05-21T17:15:10.852Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 21,
|
|
||||||
"Title": "OllamaSettings.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
|
|
||||||
"RelativeDocumentMoniker": "Models\\OllamaSettings.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
|
|
||||||
"RelativeToolTip": "Models\\OllamaSettings.cs",
|
|
||||||
"ViewState": "AgIAAAYAAAAAAAAAAAAkwBQAAAASAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-16T13:39:46.179Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 4,
|
|
||||||
"Title": "AppDbContext.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
|
|
||||||
"RelativeDocumentMoniker": "Data\\AppDbContext.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
|
|
||||||
"RelativeToolTip": "Data\\AppDbContext.cs",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-14T10:50:13.284Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 22,
|
|
||||||
"Title": "FileScannerService.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\FileScannerService.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
|
|
||||||
"RelativeToolTip": "Services\\FileScannerService.cs",
|
|
||||||
"ViewState": "AgIAABIAAAAAAAAAAAAQwCUAAAAWAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-16T06:02:53.46Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 23,
|
|
||||||
"Title": "TotpHelper.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\TotpHelper.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
|
|
||||||
"RelativeToolTip": "Services\\TotpHelper.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-21T08:20:49.461Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 24,
|
|
||||||
"Title": "Project.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
|
|
||||||
"RelativeDocumentMoniker": "Models\\Project.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
|
|
||||||
"RelativeToolTip": "Models\\Project.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAAaAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-15T15:57:10.2Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 25,
|
|
||||||
"Title": "RagService.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\RagService.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
|
|
||||||
"RelativeToolTip": "Services\\RagService.cs",
|
|
||||||
"ViewState": "AgIAABIAAAAAAAAAAAAxwBoAAAAIAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-18T15:40:05.413Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 26,
|
|
||||||
"Title": "NavMenu.razor",
|
"Title": "NavMenu.razor",
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\NavMenu.razor",
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\NavMenu.razor",
|
||||||
"RelativeDocumentMoniker": "Components\\Layout\\NavMenu.razor",
|
"RelativeDocumentMoniker": "Components\\Layout\\NavMenu.razor",
|
||||||
|
|
@ -485,55 +358,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 27,
|
"DocumentIndex": 5,
|
||||||
"Title": "App.razor",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor",
|
|
||||||
"RelativeDocumentMoniker": "Components\\App.razor",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor",
|
|
||||||
"RelativeToolTip": "Components\\App.razor",
|
|
||||||
"ViewState": "AgIAAAYAAAAAAAAAAAAAABgAAAAAAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
|
||||||
"WhenOpened": "2026-05-16T05:42:06.383Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 28,
|
|
||||||
"Title": "Models.razor",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor",
|
|
||||||
"RelativeDocumentMoniker": "Components\\Pages\\Models.razor",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor",
|
|
||||||
"RelativeToolTip": "Components\\Pages\\Models.razor",
|
|
||||||
"ViewState": "AgIAAGgAAAAAAAAAAAApwHQAAAAtAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
|
||||||
"WhenOpened": "2026-05-16T12:51:13.798Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 29,
|
|
||||||
"Title": "LLM_Model.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs",
|
|
||||||
"RelativeDocumentMoniker": "Models\\LLM_Model.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs",
|
|
||||||
"RelativeToolTip": "Models\\LLM_Model.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAqwBQAAAAzAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-16T12:53:35.486Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 30,
|
|
||||||
"Title": "ModelStatus.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs",
|
|
||||||
"RelativeDocumentMoniker": "Models\\ModelStatus.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs",
|
|
||||||
"RelativeToolTip": "Models\\ModelStatus.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAABEAAAADAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-16T13:01:24.508Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 31,
|
|
||||||
"Title": "MainLayout.razor.css",
|
"Title": "MainLayout.razor.css",
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor.css",
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor.css",
|
||||||
"RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor.css",
|
"RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor.css",
|
||||||
|
|
@ -543,9 +368,327 @@
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|",
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|",
|
||||||
"WhenOpened": "2026-05-15T16:04:50.455Z"
|
"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",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ChatService.cs",
|
||||||
|
"RelativeToolTip": "Services\\ChatService.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-14T05:02:11.491Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 8,
|
||||||
|
"Title": "ILLMBackend.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ILLMBackend.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\ILLMBackend.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ILLMBackend.cs",
|
||||||
|
"RelativeToolTip": "Services\\ILLMBackend.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAqwAsAAAAVAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-14T05:02:24.894Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 11,
|
||||||
|
"Title": "UserEntity.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\UserEntity.cs",
|
||||||
|
"RelativeDocumentMoniker": "Data\\UserEntity.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\UserEntity.cs",
|
||||||
|
"RelativeToolTip": "Data\\UserEntity.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAAUAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-24T04:52:42.227Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 14,
|
||||||
|
"Title": "OllamaAssistant.razor",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
|
||||||
|
"RelativeDocumentMoniker": "Components\\Pages\\OllamaAssistant.razor",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
|
||||||
|
"RelativeToolTip": "Components\\Pages\\OllamaAssistant.razor",
|
||||||
|
"ViewState": "AgIAAA0AAAAAAAAAAAAhwCEAAAAoAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||||
|
"WhenOpened": "2026-05-20T05:14:39.037Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 22,
|
||||||
|
"Title": "ProjectService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ProjectService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\ProjectService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ProjectService.cs",
|
||||||
|
"RelativeToolTip": "Services\\ProjectService.cs",
|
||||||
|
"ViewState": "AgIAAN0AAAAAAAAAAAApwO0AAAAMAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-15T15:56:55.229Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 23,
|
||||||
|
"Title": "IOllamaSetupService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaSetupService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\IOllamaSetupService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaSetupService.cs",
|
||||||
|
"RelativeToolTip": "Services\\IOllamaSetupService.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-30T08:35:51.087Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 18,
|
||||||
|
"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]",
|
||||||
|
"ViewState": "AgIAAHwAAAAAAAAAAAAQwHEAAAAQAAAAAQAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-09T14:36:02.721Z",
|
||||||
|
"EditorCaption": " [Schreibgesch\u00FCtzt]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 19,
|
||||||
|
"Title": "A7405018.jpg",
|
||||||
|
"DocumentMoniker": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg",
|
||||||
|
"ToolTip": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
|
||||||
|
"WhenOpened": "2026-05-23T05:52:56.265Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 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,
|
||||||
|
"Title": "INSTALL.md",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\INSTALL.md",
|
||||||
|
"RelativeDocumentMoniker": "INSTALL.md",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\INSTALL.md",
|
||||||
|
"RelativeToolTip": "INSTALL.md",
|
||||||
|
"ViewState": "AgIAAEUAAAAAAAAAAAAAAFIAAAAQAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001818|",
|
||||||
|
"WhenOpened": "2026-05-31T17:07:33.423Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 26,
|
||||||
|
"Title": "IThemeService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IThemeService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\IThemeService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IThemeService.cs",
|
||||||
|
"RelativeToolTip": "Services\\IThemeService.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAqwAgAAAAAAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-21T17:32:01.784Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 27,
|
||||||
|
"Title": "RedirectToLogin.razor",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\RedirectToLogin.razor",
|
||||||
|
"RelativeDocumentMoniker": "Components\\RedirectToLogin.razor",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\RedirectToLogin.razor",
|
||||||
|
"RelativeToolTip": "Components\\RedirectToLogin.razor",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAIAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||||
|
"WhenOpened": "2026-05-21T16:31:16.612Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 28,
|
||||||
|
"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": "AgIAABwAAAAAAAAAAAA9wC4AAAAZAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-21T16:35:36.655Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 29,
|
||||||
|
"Title": "IRagService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IRagService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\IRagService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IRagService.cs",
|
||||||
|
"RelativeToolTip": "Services\\IRagService.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAVAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-18T15:37:44.565Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 30,
|
||||||
|
"Title": "ThemeService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\ThemeService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
|
||||||
|
"RelativeToolTip": "Services\\ThemeService.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAABEAAAAdAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-16T13:35:33.991Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 31,
|
||||||
|
"Title": "logo.jpg",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Assets\\logo.jpg",
|
||||||
|
"RelativeDocumentMoniker": "Assets\\logo.jpg",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Assets\\logo.jpg",
|
||||||
|
"RelativeToolTip": "Assets\\logo.jpg",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
|
||||||
|
"WhenOpened": "2026-05-21T17:15:10.852Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 32,
|
"DocumentIndex": 32,
|
||||||
|
"Title": "OllamaSettings.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
|
||||||
|
"RelativeDocumentMoniker": "Models\\OllamaSettings.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
|
||||||
|
"RelativeToolTip": "Models\\OllamaSettings.cs",
|
||||||
|
"ViewState": "AgIAAAYAAAAAAAAAAAAkwBQAAAASAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-16T13:39:46.179Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 20,
|
||||||
|
"Title": "AppDbContext.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
|
||||||
|
"RelativeDocumentMoniker": "Data\\AppDbContext.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
|
||||||
|
"RelativeToolTip": "Data\\AppDbContext.cs",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-14T10:50:13.284Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 33,
|
||||||
|
"Title": "FileScannerService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\FileScannerService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
|
||||||
|
"RelativeToolTip": "Services\\FileScannerService.cs",
|
||||||
|
"ViewState": "AgIAABIAAAAAAAAAAAAQwCUAAAAWAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-16T06:02:53.46Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 34,
|
||||||
|
"Title": "TotpHelper.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\TotpHelper.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
|
||||||
|
"RelativeToolTip": "Services\\TotpHelper.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-21T08:20:49.461Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 35,
|
||||||
|
"Title": "Project.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
|
||||||
|
"RelativeDocumentMoniker": "Models\\Project.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
|
||||||
|
"RelativeToolTip": "Models\\Project.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAAaAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-15T15:57:10.2Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 36,
|
||||||
|
"Title": "RagService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\RagService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
|
||||||
|
"RelativeToolTip": "Services\\RagService.cs",
|
||||||
|
"ViewState": "AgIAABIAAAAAAAAAAAAxwBoAAAAIAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-18T15:40:05.413Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 37,
|
||||||
|
"Title": "App.razor",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor",
|
||||||
|
"RelativeDocumentMoniker": "Components\\App.razor",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor",
|
||||||
|
"RelativeToolTip": "Components\\App.razor",
|
||||||
|
"ViewState": "AgIAAAYAAAAAAAAAAAAAABgAAAAAAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||||
|
"WhenOpened": "2026-05-16T05:42:06.383Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 38,
|
||||||
|
"Title": "Models.razor",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor",
|
||||||
|
"RelativeDocumentMoniker": "Components\\Pages\\Models.razor",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor",
|
||||||
|
"RelativeToolTip": "Components\\Pages\\Models.razor",
|
||||||
|
"ViewState": "AgIAAGgAAAAAAAAAAAApwHQAAAAtAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||||
|
"WhenOpened": "2026-05-16T12:51:13.798Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 39,
|
||||||
|
"Title": "LLM_Model.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs",
|
||||||
|
"RelativeDocumentMoniker": "Models\\LLM_Model.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs",
|
||||||
|
"RelativeToolTip": "Models\\LLM_Model.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAqwBQAAAAzAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-16T12:53:35.486Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 40,
|
||||||
|
"Title": "ModelStatus.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs",
|
||||||
|
"RelativeDocumentMoniker": "Models\\ModelStatus.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs",
|
||||||
|
"RelativeToolTip": "Models\\ModelStatus.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAABEAAAADAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-16T13:01:24.508Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 41,
|
||||||
"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",
|
||||||
|
|
@ -557,7 +700,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 33,
|
"DocumentIndex": 42,
|
||||||
"Title": "bootstrap-utilities.css",
|
"Title": "bootstrap-utilities.css",
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\wwwroot\\lib\\bootstrap\\dist\\css\\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",
|
"RelativeDocumentMoniker": "wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-utilities.css",
|
||||||
|
|
@ -569,7 +712,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 34,
|
"DocumentIndex": 43,
|
||||||
"Title": "ProjectEntity.cs",
|
"Title": "ProjectEntity.cs",
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\ProjectEntity.cs",
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\ProjectEntity.cs",
|
||||||
"RelativeDocumentMoniker": "Data\\ProjectEntity.cs",
|
"RelativeDocumentMoniker": "Data\\ProjectEntity.cs",
|
||||||
|
|
@ -581,7 +724,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 35,
|
"DocumentIndex": 44,
|
||||||
"Title": "IProjectService.cs",
|
"Title": "IProjectService.cs",
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IProjectService.cs",
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IProjectService.cs",
|
||||||
"RelativeDocumentMoniker": "Services\\IProjectService.cs",
|
"RelativeDocumentMoniker": "Services\\IProjectService.cs",
|
||||||
|
|
@ -593,7 +736,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 36,
|
"DocumentIndex": 45,
|
||||||
"Title": "appsettings.json",
|
"Title": "appsettings.json",
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\appsettings.json",
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\appsettings.json",
|
||||||
"RelativeDocumentMoniker": "appsettings.json",
|
"RelativeDocumentMoniker": "appsettings.json",
|
||||||
|
|
|
||||||
|
|
@ -7,13 +7,73 @@
|
||||||
"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\\components\\pages\\login.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\resources\\en.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\login.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:resources\\en.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\resources\\de.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}",
|
||||||
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:resources\\de.json||{90A6B3A7-C1A3-4009-A288-E2FF89E96FA0}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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\\components\\pages\\chat.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||||
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\chat.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.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}",
|
||||||
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\layout\\mainlayout.razor.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\\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}",
|
"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}"
|
"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}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\login.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||||
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\login.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\pages\\firstrunsetup.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||||
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\pages\\firstrunsetup.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\\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}"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\dbadminservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\dbadminservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\HP\\AppData\\Local\\SourceServer\\dddeb33c46e3c746b90c5f64463103c08ec03b9a85e92eab3b21c11218135d28\\src\\runtime\\src\\libraries\\System.Private.CoreLib\\src\\Microsoft\\Win32\\SafeHandles\\SafeFileHandle.Windows.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
"AbsoluteMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|C:\\Users\\HP\\AppData\\Local\\SourceServer\\dddeb33c46e3c746b90c5f64463103c08ec03b9a85e92eab3b21c11218135d28\\src\\runtime\\src\\libraries\\System.Private.CoreLib\\src\\Microsoft\\Win32\\SafeHandles\\SafeFileHandle.Windows.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
},
|
},
|
||||||
|
|
@ -24,22 +84,10 @@
|
||||||
"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}",
|
"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}"
|
"RelativeMoniker": "D:0:0:{A2FE74E1-B743-11D0-AE1A-00A0C90FFFC3}|\u003CMiscFiles\u003E|solutionrelative:Data\\AppDbContext.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\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\\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\\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\\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}"
|
"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\\data\\userentity.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:data\\userentity.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\projectservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\projectservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\projectservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\projectservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
|
@ -56,10 +104,6 @@
|
||||||
"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}",
|
"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}"
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:install.md||{EFC0BB08-EA7D-40C6-A696-C870411A895B}"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"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\\services\\ithemeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ithemeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ithemeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ithemeservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
|
|
@ -104,10 +148,6 @@
|
||||||
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\services\\ragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}",
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:services\\ragservice.cs||{A6C744A8-0E4A-4FC6-886A-064283054674}"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\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\\components\\app.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\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}",
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\app.razor||{40D31677-CBC0-4297-A9EF-89D907823A98}"
|
||||||
|
|
@ -124,10 +164,6 @@
|
||||||
"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}"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"AbsoluteMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|e:\\ollama_net\\ollama\\authorbuddy.web\\components\\layout\\mainlayout.razor.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}",
|
|
||||||
"RelativeMoniker": "D:0:0:{4F4697EF-EFFA-26AC-C8A1-C9859805D247}|AuthorBuddy.Web.csproj|solutionrelative:components\\layout\\mainlayout.razor.css||{A5401142-F49D-43DB-90B1-F57BA349E55C}"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"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}"
|
||||||
|
|
@ -156,7 +192,7 @@
|
||||||
"DocumentGroups": [
|
"DocumentGroups": [
|
||||||
{
|
{
|
||||||
"DockedWidth": 200,
|
"DockedWidth": 200,
|
||||||
"SelectedChildIndex": 9,
|
"SelectedChildIndex": 6,
|
||||||
"Children": [
|
"Children": [
|
||||||
{
|
{
|
||||||
"$type": "Bookmark",
|
"$type": "Bookmark",
|
||||||
|
|
@ -164,44 +200,140 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 6,
|
"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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$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"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 4,
|
||||||
|
"Title": "Chat.razor",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Chat.razor",
|
||||||
|
"RelativeDocumentMoniker": "Components\\Pages\\Chat.razor",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Chat.razor",
|
||||||
|
"RelativeToolTip": "Components\\Pages\\Chat.razor",
|
||||||
|
"ViewState": "AgIAAFgAAAAAAAAAAAApwG0AAAANAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||||
|
"WhenOpened": "2026-06-14T05:59:50.644Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 7,
|
||||||
|
"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==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-14T05:03:24.305Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 17,
|
||||||
|
"Title": "DbAdminService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\DbAdminService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\DbAdminService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\DbAdminService.cs",
|
||||||
|
"RelativeToolTip": "Services\\DbAdminService.cs",
|
||||||
|
"ViewState": "AgIAABUAAAAAAAAAAAAowAAAAAAAAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-10T17:34:10.361Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$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": ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 12,
|
||||||
|
"Title": "Login.razor",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor",
|
||||||
|
"RelativeDocumentMoniker": "Components\\Pages\\Login.razor",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor",
|
||||||
|
"RelativeToolTip": "Components\\Pages\\Login.razor",
|
||||||
|
"ViewState": "AgIAADAAAAAAAAAAAADwv0QAAAAIAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||||
|
"WhenOpened": "2026-05-21T08:47:41.996Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 13,
|
||||||
|
"Title": "FirstRunSetup.razor",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\FirstRunSetup.razor",
|
||||||
|
"RelativeDocumentMoniker": "Components\\Pages\\FirstRunSetup.razor",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\FirstRunSetup.razor",
|
||||||
|
"RelativeToolTip": "Components\\Pages\\FirstRunSetup.razor",
|
||||||
|
"ViewState": "AgIAACEAAAAAAAAAAAAAACsAAABsAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||||
|
"WhenOpened": "2026-06-09T17:25:10.421Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 3,
|
||||||
"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": "AgIAAE0BAAAAAAAAAAAAAC0BAAAMAAAAAAAAAA==",
|
"ViewState": "AgIAANwBAAAAAAAAAAAAAO4BAAAIAAAAAAAAAA==",
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
"WhenOpened": "2026-05-21T17:37:24.777Z"
|
"WhenOpened": "2026-05-21T17:37:24.777Z"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 7,
|
"DocumentIndex": 10,
|
||||||
"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": "AgIAAJsAAAAAAAAAAAAAAKwAAAAWAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
|
||||||
"WhenOpened": "2026-05-15T16:43:26.6Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 2,
|
|
||||||
"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",
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Program.cs",
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Program.cs",
|
||||||
"RelativeToolTip": "Program.cs",
|
"RelativeToolTip": "Program.cs",
|
||||||
"ViewState": "AgIAADMAAAAAAAAAAAAAAFUAAAADAAAAAAAAAA==",
|
"ViewState": "AgIAAFAAAAAAAAAAAAAQwGMAAAAhAAAAAAAAAA==",
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
"WhenOpened": "2026-05-20T04:07:21.54Z",
|
"WhenOpened": "2026-05-20T04:07:21.54Z"
|
||||||
"EditorCaption": ""
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 8,
|
"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",
|
"Title": "Editor.razor",
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Editor.razor",
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Editor.razor",
|
||||||
"RelativeDocumentMoniker": "Components\\Pages\\Editor.razor",
|
"RelativeDocumentMoniker": "Components\\Pages\\Editor.razor",
|
||||||
|
|
@ -214,267 +346,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 9,
|
"DocumentIndex": 6,
|
||||||
"Title": "UserEntity.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\UserEntity.cs",
|
|
||||||
"RelativeDocumentMoniker": "Data\\UserEntity.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\UserEntity.cs",
|
|
||||||
"RelativeToolTip": "Data\\UserEntity.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAVAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-24T04:52:42.227Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 10,
|
|
||||||
"Title": "ProjectService.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ProjectService.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\ProjectService.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ProjectService.cs",
|
|
||||||
"RelativeToolTip": "Services\\ProjectService.cs",
|
|
||||||
"ViewState": "AgIAAN0AAAAAAAAAAAApwO0AAAAMAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-15T15:56:55.229Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 11,
|
|
||||||
"Title": "IOllamaSetupService.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaSetupService.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\IOllamaSetupService.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaSetupService.cs",
|
|
||||||
"RelativeToolTip": "Services\\IOllamaSetupService.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-30T08:35:51.087Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 1,
|
|
||||||
"Title": "Login.razor",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor",
|
|
||||||
"RelativeDocumentMoniker": "Components\\Pages\\Login.razor",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Login.razor",
|
|
||||||
"RelativeToolTip": "Components\\Pages\\Login.razor",
|
|
||||||
"ViewState": "AgIAADYAAAAAAAAAAAAAAAAAAAAIAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
|
||||||
"WhenOpened": "2026-05-21T08:47:41.996Z",
|
|
||||||
"EditorCaption": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 0,
|
|
||||||
"Title": "MainLayout.razor",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor",
|
|
||||||
"RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor*",
|
|
||||||
"RelativeToolTip": "Components\\Layout\\MainLayout.razor*",
|
|
||||||
"ViewState": "AgIAANQBAAAAAAAAAAAhwPMBAAAJAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
|
||||||
"WhenOpened": "2026-05-15T16:04:36.444Z",
|
|
||||||
"EditorCaption": ""
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 3,
|
|
||||||
"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]",
|
|
||||||
"ViewState": "AgIAAHwAAAAAAAAAAAAQwHEAAAAQAAAAAQAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-06-09T14:36:02.721Z",
|
|
||||||
"EditorCaption": " [Schreibgesch\u00FCtzt]"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 4,
|
|
||||||
"Title": "A7405018.jpg",
|
|
||||||
"DocumentMoniker": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg",
|
|
||||||
"ToolTip": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
|
|
||||||
"WhenOpened": "2026-05-23T05:52:56.265Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 12,
|
|
||||||
"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": 13,
|
|
||||||
"Title": "INSTALL.md",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\INSTALL.md",
|
|
||||||
"RelativeDocumentMoniker": "INSTALL.md",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\INSTALL.md",
|
|
||||||
"RelativeToolTip": "INSTALL.md",
|
|
||||||
"ViewState": "AgIAAEUAAAAAAAAAAAAAAFIAAAAQAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001818|",
|
|
||||||
"WhenOpened": "2026-05-31T17:07:33.423Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 14,
|
|
||||||
"Title": "OllamaAssistant.razor",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
|
|
||||||
"RelativeDocumentMoniker": "Components\\Pages\\OllamaAssistant.razor",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
|
|
||||||
"RelativeToolTip": "Components\\Pages\\OllamaAssistant.razor",
|
|
||||||
"ViewState": "AgIAANoAAAAAAAAAAAAiwPIAAAAZAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
|
||||||
"WhenOpened": "2026-05-20T05:14:39.037Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 15,
|
|
||||||
"Title": "IThemeService.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IThemeService.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\IThemeService.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IThemeService.cs",
|
|
||||||
"RelativeToolTip": "Services\\IThemeService.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAqwAgAAAAAAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-21T17:32:01.784Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 16,
|
|
||||||
"Title": "RedirectToLogin.razor",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\RedirectToLogin.razor",
|
|
||||||
"RelativeDocumentMoniker": "Components\\RedirectToLogin.razor",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\RedirectToLogin.razor",
|
|
||||||
"RelativeToolTip": "Components\\RedirectToLogin.razor",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAIAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
|
||||||
"WhenOpened": "2026-05-21T16:31:16.612Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 17,
|
|
||||||
"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": "AgIAABwAAAAAAAAAAAA9wC4AAAAZAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-21T16:35:36.655Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 18,
|
|
||||||
"Title": "IRagService.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IRagService.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\IRagService.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IRagService.cs",
|
|
||||||
"RelativeToolTip": "Services\\IRagService.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAVAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-18T15:37:44.565Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 19,
|
|
||||||
"Title": "ThemeService.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\ThemeService.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
|
|
||||||
"RelativeToolTip": "Services\\ThemeService.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAABEAAAAdAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-16T13:35:33.991Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 20,
|
|
||||||
"Title": "logo.jpg",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Assets\\logo.jpg",
|
|
||||||
"RelativeDocumentMoniker": "Assets\\logo.jpg",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Assets\\logo.jpg",
|
|
||||||
"RelativeToolTip": "Assets\\logo.jpg",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
|
|
||||||
"WhenOpened": "2026-05-21T17:15:10.852Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 21,
|
|
||||||
"Title": "OllamaSettings.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
|
|
||||||
"RelativeDocumentMoniker": "Models\\OllamaSettings.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
|
|
||||||
"RelativeToolTip": "Models\\OllamaSettings.cs",
|
|
||||||
"ViewState": "AgIAAAYAAAAAAAAAAAAkwBQAAAASAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-16T13:39:46.179Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 5,
|
|
||||||
"Title": "AppDbContext.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
|
|
||||||
"RelativeDocumentMoniker": "Data\\AppDbContext.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
|
|
||||||
"RelativeToolTip": "Data\\AppDbContext.cs",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-14T10:50:13.284Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 22,
|
|
||||||
"Title": "FileScannerService.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\FileScannerService.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
|
|
||||||
"RelativeToolTip": "Services\\FileScannerService.cs",
|
|
||||||
"ViewState": "AgIAABIAAAAAAAAAAAAQwCUAAAAWAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-16T06:02:53.46Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 23,
|
|
||||||
"Title": "TotpHelper.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\TotpHelper.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
|
|
||||||
"RelativeToolTip": "Services\\TotpHelper.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-21T08:20:49.461Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 24,
|
|
||||||
"Title": "Project.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
|
|
||||||
"RelativeDocumentMoniker": "Models\\Project.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
|
|
||||||
"RelativeToolTip": "Models\\Project.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAAaAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-15T15:57:10.2Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 25,
|
|
||||||
"Title": "RagService.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
|
|
||||||
"RelativeDocumentMoniker": "Services\\RagService.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
|
|
||||||
"RelativeToolTip": "Services\\RagService.cs",
|
|
||||||
"ViewState": "AgIAABIAAAAAAAAAAAAxwBoAAAAIAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-18T15:40:05.413Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 26,
|
|
||||||
"Title": "NavMenu.razor",
|
"Title": "NavMenu.razor",
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\NavMenu.razor",
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\NavMenu.razor",
|
||||||
"RelativeDocumentMoniker": "Components\\Layout\\NavMenu.razor",
|
"RelativeDocumentMoniker": "Components\\Layout\\NavMenu.razor",
|
||||||
|
|
@ -486,55 +358,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 27,
|
"DocumentIndex": 5,
|
||||||
"Title": "App.razor",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor",
|
|
||||||
"RelativeDocumentMoniker": "Components\\App.razor",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor",
|
|
||||||
"RelativeToolTip": "Components\\App.razor",
|
|
||||||
"ViewState": "AgIAAAYAAAAAAAAAAAAAABgAAAAAAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
|
||||||
"WhenOpened": "2026-05-16T05:42:06.383Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 28,
|
|
||||||
"Title": "Models.razor",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor",
|
|
||||||
"RelativeDocumentMoniker": "Components\\Pages\\Models.razor",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor",
|
|
||||||
"RelativeToolTip": "Components\\Pages\\Models.razor",
|
|
||||||
"ViewState": "AgIAAGgAAAAAAAAAAAApwHQAAAAtAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
|
||||||
"WhenOpened": "2026-05-16T12:51:13.798Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 29,
|
|
||||||
"Title": "LLM_Model.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs",
|
|
||||||
"RelativeDocumentMoniker": "Models\\LLM_Model.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs",
|
|
||||||
"RelativeToolTip": "Models\\LLM_Model.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAqwBQAAAAzAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-16T12:53:35.486Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 30,
|
|
||||||
"Title": "ModelStatus.cs",
|
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs",
|
|
||||||
"RelativeDocumentMoniker": "Models\\ModelStatus.cs",
|
|
||||||
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs",
|
|
||||||
"RelativeToolTip": "Models\\ModelStatus.cs",
|
|
||||||
"ViewState": "AgIAAAAAAAAAAAAAAAAAABEAAAADAAAAAAAAAA==",
|
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
|
||||||
"WhenOpened": "2026-05-16T13:01:24.508Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"$type": "Document",
|
|
||||||
"DocumentIndex": 31,
|
|
||||||
"Title": "MainLayout.razor.css",
|
"Title": "MainLayout.razor.css",
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor.css",
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Layout\\MainLayout.razor.css",
|
||||||
"RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor.css",
|
"RelativeDocumentMoniker": "Components\\Layout\\MainLayout.razor.css",
|
||||||
|
|
@ -544,9 +368,327 @@
|
||||||
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|",
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.003000|",
|
||||||
"WhenOpened": "2026-05-15T16:04:50.455Z"
|
"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",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ChatService.cs",
|
||||||
|
"RelativeToolTip": "Services\\ChatService.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-14T05:02:11.491Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 8,
|
||||||
|
"Title": "ILLMBackend.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ILLMBackend.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\ILLMBackend.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ILLMBackend.cs",
|
||||||
|
"RelativeToolTip": "Services\\ILLMBackend.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAqwAsAAAAVAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-14T05:02:24.894Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 11,
|
||||||
|
"Title": "UserEntity.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\UserEntity.cs",
|
||||||
|
"RelativeDocumentMoniker": "Data\\UserEntity.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\UserEntity.cs",
|
||||||
|
"RelativeToolTip": "Data\\UserEntity.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAQAAAAUAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-24T04:52:42.227Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 14,
|
||||||
|
"Title": "OllamaAssistant.razor",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
|
||||||
|
"RelativeDocumentMoniker": "Components\\Pages\\OllamaAssistant.razor",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\OllamaAssistant.razor",
|
||||||
|
"RelativeToolTip": "Components\\Pages\\OllamaAssistant.razor",
|
||||||
|
"ViewState": "AgIAAA0AAAAAAAAAAAAhwCEAAAAoAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||||
|
"WhenOpened": "2026-05-20T05:14:39.037Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 22,
|
||||||
|
"Title": "ProjectService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ProjectService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\ProjectService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ProjectService.cs",
|
||||||
|
"RelativeToolTip": "Services\\ProjectService.cs",
|
||||||
|
"ViewState": "AgIAAN0AAAAAAAAAAAApwO0AAAAMAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-15T15:56:55.229Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 23,
|
||||||
|
"Title": "IOllamaSetupService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaSetupService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\IOllamaSetupService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IOllamaSetupService.cs",
|
||||||
|
"RelativeToolTip": "Services\\IOllamaSetupService.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-30T08:35:51.087Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 18,
|
||||||
|
"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]",
|
||||||
|
"ViewState": "AgIAAHwAAAAAAAAAAAAQwHEAAAAQAAAAAQAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-06-09T14:36:02.721Z",
|
||||||
|
"EditorCaption": " [Schreibgesch\u00FCtzt]"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 19,
|
||||||
|
"Title": "A7405018.jpg",
|
||||||
|
"DocumentMoniker": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg",
|
||||||
|
"ToolTip": "C:\\Users\\HP\\Desktop\\Website\\A7405018.jpg",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
|
||||||
|
"WhenOpened": "2026-05-23T05:52:56.265Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 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,
|
||||||
|
"Title": "INSTALL.md",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\INSTALL.md",
|
||||||
|
"RelativeDocumentMoniker": "INSTALL.md",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\INSTALL.md",
|
||||||
|
"RelativeToolTip": "INSTALL.md",
|
||||||
|
"ViewState": "AgIAAEUAAAAAAAAAAAAAAFIAAAAQAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001818|",
|
||||||
|
"WhenOpened": "2026-05-31T17:07:33.423Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 26,
|
||||||
|
"Title": "IThemeService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IThemeService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\IThemeService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IThemeService.cs",
|
||||||
|
"RelativeToolTip": "Services\\IThemeService.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAqwAgAAAAAAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-21T17:32:01.784Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 27,
|
||||||
|
"Title": "RedirectToLogin.razor",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\RedirectToLogin.razor",
|
||||||
|
"RelativeDocumentMoniker": "Components\\RedirectToLogin.razor",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\RedirectToLogin.razor",
|
||||||
|
"RelativeToolTip": "Components\\RedirectToLogin.razor",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAIAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||||
|
"WhenOpened": "2026-05-21T16:31:16.612Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 28,
|
||||||
|
"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": "AgIAABwAAAAAAAAAAAA9wC4AAAAZAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-21T16:35:36.655Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 29,
|
||||||
|
"Title": "IRagService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IRagService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\IRagService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IRagService.cs",
|
||||||
|
"RelativeToolTip": "Services\\IRagService.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAsAAAAVAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-18T15:37:44.565Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 30,
|
||||||
|
"Title": "ThemeService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\ThemeService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\ThemeService.cs",
|
||||||
|
"RelativeToolTip": "Services\\ThemeService.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAABEAAAAdAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-16T13:35:33.991Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 31,
|
||||||
|
"Title": "logo.jpg",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Assets\\logo.jpg",
|
||||||
|
"RelativeDocumentMoniker": "Assets\\logo.jpg",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Assets\\logo.jpg",
|
||||||
|
"RelativeToolTip": "Assets\\logo.jpg",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.001533|",
|
||||||
|
"WhenOpened": "2026-05-21T17:15:10.852Z"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 32,
|
"DocumentIndex": 32,
|
||||||
|
"Title": "OllamaSettings.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
|
||||||
|
"RelativeDocumentMoniker": "Models\\OllamaSettings.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\OllamaSettings.cs",
|
||||||
|
"RelativeToolTip": "Models\\OllamaSettings.cs",
|
||||||
|
"ViewState": "AgIAAAYAAAAAAAAAAAAkwBQAAAASAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-16T13:39:46.179Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 20,
|
||||||
|
"Title": "AppDbContext.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
|
||||||
|
"RelativeDocumentMoniker": "Data\\AppDbContext.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\AppDbContext.cs",
|
||||||
|
"RelativeToolTip": "Data\\AppDbContext.cs",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-14T10:50:13.284Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 33,
|
||||||
|
"Title": "FileScannerService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\FileScannerService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\FileScannerService.cs",
|
||||||
|
"RelativeToolTip": "Services\\FileScannerService.cs",
|
||||||
|
"ViewState": "AgIAABIAAAAAAAAAAAAQwCUAAAAWAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-16T06:02:53.46Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 34,
|
||||||
|
"Title": "TotpHelper.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\TotpHelper.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\TotpHelper.cs",
|
||||||
|
"RelativeToolTip": "Services\\TotpHelper.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-21T08:20:49.461Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 35,
|
||||||
|
"Title": "Project.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
|
||||||
|
"RelativeDocumentMoniker": "Models\\Project.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\Project.cs",
|
||||||
|
"RelativeToolTip": "Models\\Project.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAAAYAAAAaAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-15T15:57:10.2Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 36,
|
||||||
|
"Title": "RagService.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
|
||||||
|
"RelativeDocumentMoniker": "Services\\RagService.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\RagService.cs",
|
||||||
|
"RelativeToolTip": "Services\\RagService.cs",
|
||||||
|
"ViewState": "AgIAABIAAAAAAAAAAAAxwBoAAAAIAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-18T15:40:05.413Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 37,
|
||||||
|
"Title": "App.razor",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor",
|
||||||
|
"RelativeDocumentMoniker": "Components\\App.razor",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\App.razor",
|
||||||
|
"RelativeToolTip": "Components\\App.razor",
|
||||||
|
"ViewState": "AgIAAAYAAAAAAAAAAAAAABgAAAAAAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||||
|
"WhenOpened": "2026-05-16T05:42:06.383Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 38,
|
||||||
|
"Title": "Models.razor",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor",
|
||||||
|
"RelativeDocumentMoniker": "Components\\Pages\\Models.razor",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Components\\Pages\\Models.razor",
|
||||||
|
"RelativeToolTip": "Components\\Pages\\Models.razor",
|
||||||
|
"ViewState": "AgIAAGgAAAAAAAAAAAApwHQAAAAtAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000759|",
|
||||||
|
"WhenOpened": "2026-05-16T12:51:13.798Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 39,
|
||||||
|
"Title": "LLM_Model.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs",
|
||||||
|
"RelativeDocumentMoniker": "Models\\LLM_Model.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\LLM_Model.cs",
|
||||||
|
"RelativeToolTip": "Models\\LLM_Model.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAqwBQAAAAzAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-16T12:53:35.486Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 40,
|
||||||
|
"Title": "ModelStatus.cs",
|
||||||
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs",
|
||||||
|
"RelativeDocumentMoniker": "Models\\ModelStatus.cs",
|
||||||
|
"ToolTip": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Models\\ModelStatus.cs",
|
||||||
|
"RelativeToolTip": "Models\\ModelStatus.cs",
|
||||||
|
"ViewState": "AgIAAAAAAAAAAAAAAAAAABEAAAADAAAAAAAAAA==",
|
||||||
|
"Icon": "ae27a6b0-e345-4288-96df-5eaf394ee369.000738|",
|
||||||
|
"WhenOpened": "2026-05-16T13:01:24.508Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"$type": "Document",
|
||||||
|
"DocumentIndex": 41,
|
||||||
"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",
|
||||||
|
|
@ -558,7 +700,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 33,
|
"DocumentIndex": 42,
|
||||||
"Title": "bootstrap-utilities.css",
|
"Title": "bootstrap-utilities.css",
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\wwwroot\\lib\\bootstrap\\dist\\css\\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",
|
"RelativeDocumentMoniker": "wwwroot\\lib\\bootstrap\\dist\\css\\bootstrap-utilities.css",
|
||||||
|
|
@ -570,7 +712,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 34,
|
"DocumentIndex": 43,
|
||||||
"Title": "ProjectEntity.cs",
|
"Title": "ProjectEntity.cs",
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\ProjectEntity.cs",
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Data\\ProjectEntity.cs",
|
||||||
"RelativeDocumentMoniker": "Data\\ProjectEntity.cs",
|
"RelativeDocumentMoniker": "Data\\ProjectEntity.cs",
|
||||||
|
|
@ -582,7 +724,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 35,
|
"DocumentIndex": 44,
|
||||||
"Title": "IProjectService.cs",
|
"Title": "IProjectService.cs",
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IProjectService.cs",
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\Services\\IProjectService.cs",
|
||||||
"RelativeDocumentMoniker": "Services\\IProjectService.cs",
|
"RelativeDocumentMoniker": "Services\\IProjectService.cs",
|
||||||
|
|
@ -594,7 +736,7 @@
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"$type": "Document",
|
"$type": "Document",
|
||||||
"DocumentIndex": 36,
|
"DocumentIndex": 45,
|
||||||
"Title": "appsettings.json",
|
"Title": "appsettings.json",
|
||||||
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\appsettings.json",
|
"DocumentMoniker": "E:\\ollama_net\\ollama\\AuthorBuddy.Web\\appsettings.json",
|
||||||
"RelativeDocumentMoniker": "appsettings.json",
|
"RelativeDocumentMoniker": "appsettings.json",
|
||||||
|
|
|
||||||
6
AuthorBuddy.Web.csproj.user
Normal file
6
AuthorBuddy.Web.csproj.user
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<PropertyGroup>
|
||||||
|
<NameOfLastUsedPublishProfile>E:\ollama_net\ollama\AuthorBuddy.Web\Properties\PublishProfiles\FolderProfile.pubxml</NameOfLastUsedPublishProfile>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
|
|
@ -41,7 +41,10 @@ else
|
||||||
@if (activeSection == "file")
|
@if (activeSection == "file")
|
||||||
{
|
{
|
||||||
<div class="nav-section-body">
|
<div class="nav-section-body">
|
||||||
<button class="nav-item" @onclick="CreateNewProject">@Loc["nav.menu.file.new_project"]</button>
|
@if (!_currentUserRoles.Contains(UserRole.Blogger))
|
||||||
|
{
|
||||||
|
<button class="nav-item" @onclick="CreateNewProject">@Loc["nav.menu.file.new_project"]</button>
|
||||||
|
}
|
||||||
<button class="nav-item" @onclick="OpenEditor">@Loc["nav.menu.file.open_editor"]</button>
|
<button class="nav-item" @onclick="OpenEditor">@Loc["nav.menu.file.open_editor"]</button>
|
||||||
<div class="nav-separator"></div>
|
<div class="nav-separator"></div>
|
||||||
<button class="nav-item" @onclick="ExitApp">@Loc["nav.menu.file.exit"]</button>
|
<button class="nav-item" @onclick="ExitApp">@Loc["nav.menu.file.exit"]</button>
|
||||||
|
|
@ -57,7 +60,7 @@ else
|
||||||
{
|
{
|
||||||
<div class="nav-section-body">
|
<div class="nav-section-body">
|
||||||
<button class="nav-item" @onclick='() => NavigateTo("/settings")'>@Loc["nav.menu.extras.settings"]</button>
|
<button class="nav-item" @onclick='() => NavigateTo("/settings")'>@Loc["nav.menu.extras.settings"]</button>
|
||||||
@if (_currentUserRole == UserRole.Administrator)
|
@if (_currentUserRoles.Contains(UserRole.Administrator))
|
||||||
{
|
{
|
||||||
<button class="nav-item" @onclick='() => NavigateTo("/models")'>@Loc["nav.menu.extras.manage_models"]</button>
|
<button class="nav-item" @onclick='() => NavigateTo("/models")'>@Loc["nav.menu.extras.manage_models"]</button>
|
||||||
<button class="nav-item" @onclick='() => NavigateTo("/assistant")'>@Loc["nav.menu.extras.assistant"]</button>
|
<button class="nav-item" @onclick='() => NavigateTo("/assistant")'>@Loc["nav.menu.extras.assistant"]</button>
|
||||||
|
|
@ -65,6 +68,7 @@ else
|
||||||
<div class="nav-separator"></div>
|
<div class="nav-separator"></div>
|
||||||
<button class="nav-item" @onclick='() => NavigateTo("/user-management")'>@Loc["nav.menu.extras.user_management"]</button>
|
<button class="nav-item" @onclick='() => NavigateTo("/user-management")'>@Loc["nav.menu.extras.user_management"]</button>
|
||||||
<button class="nav-item" @onclick='() => NavigateTo("/db-admin")'>📊 DB-Admin</button>
|
<button class="nav-item" @onclick='() => NavigateTo("/db-admin")'>📊 DB-Admin</button>
|
||||||
|
<button class="nav-item" @onclick='() => NavigateTo("/chat")'>💬 Chat</button>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -73,6 +77,37 @@ else
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
@{
|
||||||
|
var canMarkdown = _currentUserRoles.Contains(UserRole.Administrator) || _currentUserRoles.Contains(UserRole.Blogger);
|
||||||
|
var canChat = _currentUserRoles.Contains(UserRole.Administrator) || _currentUserRoles.Contains(UserRole.Chat);
|
||||||
|
}
|
||||||
|
@if (canChat || canMarkdown)
|
||||||
|
{
|
||||||
|
<div class="nav-section">
|
||||||
|
<button class="nav-section-header" @onclick='() => ToggleSection("tools")'>
|
||||||
|
<span class="nav-icon">@(activeSection == "tools" ? "▼" : "▶")</span>
|
||||||
|
@Loc["nav.menu.chat"]
|
||||||
|
</button>
|
||||||
|
@if (activeSection == "tools")
|
||||||
|
{
|
||||||
|
@if (canMarkdown)
|
||||||
|
{
|
||||||
|
<div class="nav-section-body">
|
||||||
|
<button class="nav-item" @onclick='() => NavigateTo("/quick-markdown")'>⚡ Quick Markdown</button>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
@if (canChat)
|
||||||
|
{
|
||||||
|
<div class="nav-section-body">
|
||||||
|
<button class="nav-item" @onclick='() => NavigateTo("/chat")'>💬 Chat öffnen</button>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (_currentUserRoles.Contains(UserRole.Administrator) || _currentUserRoles.Contains(UserRole.Author))
|
||||||
|
{
|
||||||
<div class="nav-section">
|
<div class="nav-section">
|
||||||
<button class="nav-section-header" @onclick='() => ToggleSection("projects")'>
|
<button class="nav-section-header" @onclick='() => ToggleSection("projects")'>
|
||||||
<span class="nav-icon">@(activeSection == "projects" ? "▼" : "▶")</span>
|
<span class="nav-icon">@(activeSection == "projects" ? "▼" : "▶")</span>
|
||||||
|
|
@ -113,6 +148,7 @@ else
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
}
|
||||||
@if (currentProjectId > 0 && fileTree != null)
|
@if (currentProjectId > 0 && fileTree != null)
|
||||||
{
|
{
|
||||||
<div class="nav-section nav-section-open">
|
<div class="nav-section nav-section-open">
|
||||||
|
|
@ -396,7 +432,7 @@ else
|
||||||
@code {
|
@code {
|
||||||
private string _username = string.Empty;
|
private string _username = string.Empty;
|
||||||
private bool _isAuthenticated;
|
private bool _isAuthenticated;
|
||||||
private UserRole _currentUserRole;
|
private List<UserRole> _currentUserRoles = new();
|
||||||
private bool _isLoading = true;
|
private bool _isLoading = true;
|
||||||
private bool _showInfoOverlay;
|
private bool _showInfoOverlay;
|
||||||
private string? activeSection;
|
private string? activeSection;
|
||||||
|
|
@ -457,7 +493,7 @@ else
|
||||||
var user = await AuthService.GetCurrentUserAsync();
|
var user = await AuthService.GetCurrentUserAsync();
|
||||||
_username = user?.Name ?? string.Empty;
|
_username = user?.Name ?? string.Empty;
|
||||||
_isAuthenticated = user != null;
|
_isAuthenticated = user != null;
|
||||||
_currentUserRole = user?.Role ?? UserRole.Author;
|
_currentUserRoles = user?.Roles ?? new List<UserRole> { UserRole.Author };
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task AutoLoadLastProject()
|
private async Task AutoLoadLastProject()
|
||||||
|
|
@ -577,7 +613,7 @@ else
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var currentUser = AuthService.CurrentUser;
|
var currentUser = AuthService.CurrentUser;
|
||||||
int? filterUserId = currentUser?.Role == UserRole.Administrator ? null : currentUser?.Id;
|
int? filterUserId = currentUser?.IsAdministrator == true ? null : currentUser?.Id;
|
||||||
projects = await ProjectService.GetAllProjectsAsync(filterUserId);
|
projects = await ProjectService.GetAllProjectsAsync(filterUserId);
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
|
|
|
||||||
188
Components/Pages/Chat.razor
Normal file
188
Components/Pages/Chat.razor
Normal file
|
|
@ -0,0 +1,188 @@
|
||||||
|
@page "/chat"
|
||||||
|
@attribute [Authorize(Roles = "Administrator,Chat")]
|
||||||
|
@inject IChatService ChatService
|
||||||
|
@inject IOllamaService OllamaService
|
||||||
|
@inject OllamaSettings Settings
|
||||||
|
@inject ISettingsService SettingsService
|
||||||
|
@inject IAuthService AuthService
|
||||||
|
@inject NavigationManager Navigation
|
||||||
|
|
||||||
|
@rendermode InteractiveServer
|
||||||
|
|
||||||
|
<PageTitle>Chat</PageTitle>
|
||||||
|
|
||||||
|
<div class="chat-page">
|
||||||
|
<div class="chat-header">
|
||||||
|
<h3>Chat</h3>
|
||||||
|
<div class="chat-header-actions">
|
||||||
|
<button class="btn btn-sm chat-settings-toggle" @onclick="ToggleSettings">
|
||||||
|
@(_showSettings ? "Einstellungen ausblenden" : "Einstellungen")
|
||||||
|
</button>
|
||||||
|
<button class="btn btn-sm" @onclick="ClearHistory" disabled="@(_messages.Count == 0)">Verlauf löschen</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if (_showSettings)
|
||||||
|
{
|
||||||
|
<div class="chat-settings">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>System-Prompt</label>
|
||||||
|
<textarea class="chat-settings-textarea" @bind="_systemPrompt" rows="3"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="chatTemp">Temperatur: @_temperature.ToString("F2")</label>
|
||||||
|
<input id="chatTemp" type="range" min="0" max="2" step="0.05" @bind="_temperature" />
|
||||||
|
<div class="qm-range-labels">
|
||||||
|
<span>präzise (0)</span>
|
||||||
|
<span>kreativ (2)</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<button class="btn btn-sm btn-primary" @onclick="SaveSettings">System-Prompt & Temperatur speichern</button>
|
||||||
|
<button class="btn btn-sm" @onclick="ResetToDefault">Auf Standard zurücksetzen</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
<div class="chat-messages" id="chat-messages">
|
||||||
|
@if (_messages.Count == 0)
|
||||||
|
{
|
||||||
|
<div class="chat-empty">Noch keine Nachrichten. Stelle eine Frage.</div>
|
||||||
|
}
|
||||||
|
@foreach (var msg in _messages)
|
||||||
|
{
|
||||||
|
<div class="chat-message chat-user">
|
||||||
|
<div class="chat-avatar">U</div>
|
||||||
|
<div class="chat-bubble">@msg.UserMessage</div>
|
||||||
|
</div>
|
||||||
|
<div class="chat-message chat-assistant">
|
||||||
|
<div class="chat-avatar">A</div>
|
||||||
|
<div class="chat-bubble">@MarkdownToHtml(msg.AssistantResponse)</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
@if (_isBusy)
|
||||||
|
{
|
||||||
|
<div class="chat-message chat-assistant">
|
||||||
|
<div class="chat-avatar">A</div>
|
||||||
|
<div class="chat-bubble chat-thinking">…</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="chat-input">
|
||||||
|
<textarea class="chat-textarea" @bind="_input" rows="3"
|
||||||
|
placeholder="Nachricht eingeben…"
|
||||||
|
@onkeydown="HandleKeyDown"
|
||||||
|
disabled="@_isBusy"></textarea>
|
||||||
|
<button class="btn btn-primary" @onclick="Send" disabled="@(_isBusy || string.IsNullOrWhiteSpace(_input))">
|
||||||
|
Senden
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if (!string.IsNullOrEmpty(_error))
|
||||||
|
{
|
||||||
|
<div class="auth-error">@_error</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
private List<ChatEntity> _messages = new();
|
||||||
|
private string _input = string.Empty;
|
||||||
|
private string _error = string.Empty;
|
||||||
|
private bool _isBusy;
|
||||||
|
private int _userId;
|
||||||
|
private bool _showSettings;
|
||||||
|
private string _systemPrompt = string.Empty;
|
||||||
|
private double _temperature = 0.7;
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
var user = await AuthService.GetCurrentUserAsync();
|
||||||
|
if (user == null || (!user.HasRole(UserRole.Administrator) && !user.HasRole(UserRole.Chat)))
|
||||||
|
{
|
||||||
|
Navigation.NavigateTo("/");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_userId = user.Id;
|
||||||
|
_messages = await ChatService.GetHistoryAsync(_userId);
|
||||||
|
_systemPrompt = await SettingsService.GetChatPromptAsync()
|
||||||
|
?? Settings.GetChatDefaultPrompt(Settings.Language);
|
||||||
|
_temperature = await SettingsService.GetChatTempAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToggleSettings()
|
||||||
|
{
|
||||||
|
_showSettings = !_showSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SaveSettings()
|
||||||
|
{
|
||||||
|
await SettingsService.SaveChatPromptAsync(_systemPrompt);
|
||||||
|
await SettingsService.SaveChatTempAsync(_temperature);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ResetToDefault()
|
||||||
|
{
|
||||||
|
_systemPrompt = Settings.GetChatDefaultPrompt(Settings.Language);
|
||||||
|
_temperature = Settings.ChatTemp;
|
||||||
|
await SaveSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task HandleKeyDown(KeyboardEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Key == "Enter" && !e.ShiftKey)
|
||||||
|
{
|
||||||
|
await Send();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task Send()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(_input) || _isBusy) return;
|
||||||
|
|
||||||
|
var text = _input.Trim();
|
||||||
|
_input = string.Empty;
|
||||||
|
_error = string.Empty;
|
||||||
|
_isBusy = true;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var response = await OllamaService.Chat(Settings.StyleModel, text, _systemPrompt, _temperature);
|
||||||
|
|
||||||
|
var msg = new ChatEntity
|
||||||
|
{
|
||||||
|
UserId = _userId,
|
||||||
|
UserMessage = text,
|
||||||
|
AssistantResponse = response,
|
||||||
|
Model = Settings.StyleModel,
|
||||||
|
Timestamp = DateTime.UtcNow
|
||||||
|
};
|
||||||
|
await ChatService.AddMessageAsync(msg);
|
||||||
|
_messages.Add(msg);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_error = $"Fehler: {ex.Message}";
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_isBusy = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ClearHistory()
|
||||||
|
{
|
||||||
|
await ChatService.ClearHistoryAsync(_userId);
|
||||||
|
_messages.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
private MarkupString MarkdownToHtml(string text)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(text)) return new MarkupString(string.Empty);
|
||||||
|
var html = System.Web.HttpUtility.HtmlEncode(text);
|
||||||
|
html = System.Text.RegularExpressions.Regex.Replace(html, @"\*\*(.+?)\*\*", "<strong>$1</strong>");
|
||||||
|
html = System.Text.RegularExpressions.Regex.Replace(html, @"\*(.+?)\*", "<em>$1</em>");
|
||||||
|
html = html.Replace("\n", "<br />");
|
||||||
|
return new MarkupString(html);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -125,7 +125,7 @@
|
||||||
protected override void OnInitialized()
|
protected override void OnInitialized()
|
||||||
{
|
{
|
||||||
var user = AuthService.CurrentUser;
|
var user = AuthService.CurrentUser;
|
||||||
if (user?.Role != UserRole.Administrator)
|
if (user == null || !user.IsAdministrator)
|
||||||
{
|
{
|
||||||
Navigation.NavigateTo("/");
|
Navigation.NavigateTo("/");
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
126
Components/Pages/FirstRunSetup.razor
Normal file
126
Components/Pages/FirstRunSetup.razor
Normal file
|
|
@ -0,0 +1,126 @@
|
||||||
|
@page "/first-run-setup"
|
||||||
|
@inject IAuthService AuthService
|
||||||
|
@inject ISettingsService SettingsService
|
||||||
|
@inject NavigationManager Navigation
|
||||||
|
@inject ILocalizationService Loc
|
||||||
|
|
||||||
|
@rendermode InteractiveServer
|
||||||
|
|
||||||
|
<PageTitle>Ersteinrichtung</PageTitle>
|
||||||
|
|
||||||
|
<div class="auth-page">
|
||||||
|
<div class="auth-card">
|
||||||
|
<div class="auth-logo">
|
||||||
|
<img src="/Assets/logo.jpg" alt="Author Buddy" />
|
||||||
|
</div>
|
||||||
|
<h2>Ersteinrichtung</h2>
|
||||||
|
<p>Willkommen bei Author Buddy! Richten Sie Ihren Administrator-Account ein.</p>
|
||||||
|
|
||||||
|
@if (!_setupComplete)
|
||||||
|
{
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="adminUsername">Admin-Benutzername</label>
|
||||||
|
<input id="adminUsername" @bind="_username" disabled="@_isBusy" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button @onclick="GeneratePassword" disabled="@(() => _isBusy || string.IsNullOrWhiteSpace(_username))">Passwort generieren</button>
|
||||||
|
|
||||||
|
@if (!string.IsNullOrEmpty(_generatedPassword))
|
||||||
|
{
|
||||||
|
<div class="auth-error" style="margin-top: 1rem; padding: 1rem; border: 2px solid red; background: #fff0f0; color: #c00; border-radius: 8px;">
|
||||||
|
<strong style="font-size: 1.2rem;">Sicherheitswarnung!</strong>
|
||||||
|
<p>Dieses Passwort wird nur <strong>einmalig</strong> angezeigt. Speichern Sie es sofort sicher ab.</p>
|
||||||
|
<div style="font-family: monospace; font-size: 1.4rem; text-align: center; padding: 0.5rem; background: white; border: 1px solid #c00; margin: 0.5rem 0; letter-spacing: 2px;">
|
||||||
|
@_generatedPassword
|
||||||
|
</div>
|
||||||
|
<p style="font-size: 0.85rem; color: #888;">Nach dem Klick auf "Admin erstellen" wird das Passwort nicht mehr angezeigt.</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="adminPassword">Passwort eingeben (zur Bestätigung)</label>
|
||||||
|
<input id="adminPassword" type="password" @bind="_password" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button @onclick="CreateAdmin" disabled="@(() => _isBusy || _password != _generatedPassword)">Admin erstellen</button>
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<div class="auth-success" style="margin-top: 1rem; padding: 1rem; border: 2px solid green; background: #f0fff0; color: #080; border-radius: 8px;">
|
||||||
|
<strong>Admin-Account erfolgreich erstellt!</strong>
|
||||||
|
<p>Sie werden zum Login weitergeleitet...</p>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (!string.IsNullOrEmpty(_errorMessage))
|
||||||
|
{
|
||||||
|
<div class="auth-error">@_errorMessage</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
private string _username = "admin";
|
||||||
|
private string? _generatedPassword;
|
||||||
|
private string _password = string.Empty;
|
||||||
|
private string _errorMessage = string.Empty;
|
||||||
|
private bool _isBusy;
|
||||||
|
private bool _setupComplete;
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
var users = await SettingsService.GetUsersAsync();
|
||||||
|
if (users.Count > 0)
|
||||||
|
{
|
||||||
|
Navigation.NavigateTo("/login");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GeneratePassword()
|
||||||
|
{
|
||||||
|
using var rng = System.Security.Cryptography.RandomNumberGenerator.Create();
|
||||||
|
var bytes = new byte[12];
|
||||||
|
rng.GetBytes(bytes);
|
||||||
|
_generatedPassword = Convert.ToBase64String(bytes).TrimEnd('=').Replace('+', 'X').Replace('/', 'Y');
|
||||||
|
_password = string.Empty;
|
||||||
|
_errorMessage = string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task CreateAdmin()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(_username) || string.IsNullOrWhiteSpace(_password))
|
||||||
|
{
|
||||||
|
_errorMessage = "Benutzername und Passwort dürfen nicht leer sein.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_isBusy = true;
|
||||||
|
_errorMessage = string.Empty;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var result = await AuthService.RegisterAsync(_username, _password);
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
_generatedPassword = null;
|
||||||
|
_password = string.Empty;
|
||||||
|
_setupComplete = true;
|
||||||
|
StateHasChanged();
|
||||||
|
await Task.Delay(2000);
|
||||||
|
Navigation.NavigateTo("/login");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_errorMessage = "Benutzername bereits vergeben.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_errorMessage = $"Fehler: {ex.Message}";
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_isBusy = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -69,7 +69,7 @@
|
||||||
var users = await SettingsService.GetUsersAsync();
|
var users = await SettingsService.GetUsersAsync();
|
||||||
if (users.Count == 0)
|
if (users.Count == 0)
|
||||||
{
|
{
|
||||||
Navigation.NavigateTo("/register");
|
Navigation.NavigateTo("/first-run-setup");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
153
Components/Pages/QuickMarkdown.razor
Normal file
153
Components/Pages/QuickMarkdown.razor
Normal file
|
|
@ -0,0 +1,153 @@
|
||||||
|
@page "/quick-markdown"
|
||||||
|
@attribute [Authorize(Roles = "Administrator,Blogger")]
|
||||||
|
@inject IOllamaService OllamaService
|
||||||
|
@inject OllamaSettings Settings
|
||||||
|
@inject IJSRuntime JS
|
||||||
|
@inject IAuthService AuthService
|
||||||
|
@inject ISettingsService SettingsService
|
||||||
|
@inject NavigationManager Navigation
|
||||||
|
|
||||||
|
@rendermode InteractiveServer
|
||||||
|
|
||||||
|
<PageTitle>Quick Markdown</PageTitle>
|
||||||
|
|
||||||
|
<div class="qm-container">
|
||||||
|
<h2>Quick Markdown</h2>
|
||||||
|
<p>Erzeugt aus einem Text und einem System-Prompt direkt formatiertes Markdown – ohne Projekt oder Speicherung.</p>
|
||||||
|
|
||||||
|
<div class="qm-layout">
|
||||||
|
<div class="qm-input-panel">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>System-Prompt</label>
|
||||||
|
<textarea class="qm-textarea qm-prompt" @bind="_systemPrompt" rows="4"></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="tempRange">Temperatur: @_temperature.ToString("F2")</label>
|
||||||
|
<input id="tempRange" type="range" min="0" max="2" step="0.05" @bind="_temperature" />
|
||||||
|
<div class="qm-range-labels">
|
||||||
|
<span>präzise (0)</span>
|
||||||
|
<span>kreativ (2)</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="qm-prompt-actions">
|
||||||
|
<button class="btn btn-secondary" @onclick="SaveSettings">System-Prompt & Temperatur speichern</button>
|
||||||
|
<button class="btn btn-secondary" @onclick="ResetToDefault">Auf Standard zurücksetzen</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Text</label>
|
||||||
|
<textarea class="qm-textarea" @bind="_inputText" rows="12" placeholder="Text hier eingeben…"></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="btn btn-primary" @onclick="Generate" disabled="@_isBusy || string.IsNullOrWhiteSpace(_inputText)">
|
||||||
|
@if (_isBusy)
|
||||||
|
{
|
||||||
|
<span>Generiere…</span>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<span>Markdown erzeugen</span>
|
||||||
|
}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="qm-output-panel">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Ausgabe</label>
|
||||||
|
<div class="qm-output-toolbar">
|
||||||
|
<button class="btn btn-small" @onclick="CopyOutput" disabled="@string.IsNullOrEmpty(_output)">📋 Kopieren</button>
|
||||||
|
<button class="btn btn-small" @onclick="ClearOutput">🗑 Leeren</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<textarea class="qm-textarea qm-output" @bind="_output" rows="20" readonly></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@if (!string.IsNullOrEmpty(_error))
|
||||||
|
{
|
||||||
|
<div class="auth-error">@_error</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (!string.IsNullOrEmpty(_modelNotice))
|
||||||
|
{
|
||||||
|
<div class="qm-notice">@_modelNotice</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
private string _systemPrompt = string.Empty;
|
||||||
|
private string _inputText = string.Empty;
|
||||||
|
private string _output = string.Empty;
|
||||||
|
private string _error = string.Empty;
|
||||||
|
private string _modelNotice = string.Empty;
|
||||||
|
private bool _isBusy;
|
||||||
|
private double _temperature = 0.3;
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
var user = await AuthService.GetCurrentUserAsync();
|
||||||
|
if (user == null || !user.HasAnyRole(UserRole.Administrator, UserRole.Blogger))
|
||||||
|
{
|
||||||
|
Navigation.NavigateTo("/");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_systemPrompt = await SettingsService.GetQuickMarkdownPromptAsync()
|
||||||
|
?? Settings.GetQuickMarkdownDefaultPrompt(Settings.Language);
|
||||||
|
_temperature = await SettingsService.GetQuickMarkdownTempAsync();
|
||||||
|
|
||||||
|
_modelNotice = $"Verwendetes Modell: {Settings.StyleModel} (via {Settings.Backend})";
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SaveSettings()
|
||||||
|
{
|
||||||
|
await SettingsService.SaveQuickMarkdownPromptAsync(_systemPrompt);
|
||||||
|
await SettingsService.SaveQuickMarkdownTempAsync(_temperature);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ResetToDefault()
|
||||||
|
{
|
||||||
|
_systemPrompt = Settings.GetQuickMarkdownDefaultPrompt(Settings.Language);
|
||||||
|
_temperature = Settings.QuickMarkdownTemp;
|
||||||
|
await SaveSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task Generate()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(_inputText)) return;
|
||||||
|
|
||||||
|
_isBusy = true;
|
||||||
|
_error = string.Empty;
|
||||||
|
_output = string.Empty;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var result = await OllamaService.Chat(Settings.StyleModel, _inputText, _systemPrompt, _temperature);
|
||||||
|
_output = result;
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_error = $"Fehler bei der Generierung: {ex.Message}";
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_isBusy = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task CopyOutput()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(_output)) return;
|
||||||
|
await JS.InvokeVoidAsync("navigator.clipboard.writeText", _output);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ClearOutput()
|
||||||
|
{
|
||||||
|
_output = string.Empty;
|
||||||
|
_error = string.Empty;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -14,33 +14,6 @@
|
||||||
|
|
||||||
<div class="settings-page">
|
<div class="settings-page">
|
||||||
|
|
||||||
@if (_isAdmin)
|
|
||||||
{
|
|
||||||
<div class="settings-section">
|
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.user"]</h3>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="userSelect">@Loc["settings.user.label.active"]</label>
|
|
||||||
<select id="userSelect" value="@selectedUserId" @onchange="SwitchUser">
|
|
||||||
@foreach (var u in users)
|
|
||||||
{
|
|
||||||
<option value="@u.Id">@u.Name (@(u.Role == AuthorBuddy.Web.Data.UserRole.Administrator ? Loc["settings.user.role.admin"] : Loc["settings.user.role.author"]))</option>
|
|
||||||
}
|
|
||||||
</select>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="newUserName">@Loc["settings.user.label.new"]</label>
|
|
||||||
<div style="display: flex; gap: 8px;">
|
|
||||||
<input id="newUserName" @bind="newUserName" placeholder="@Loc["settings.user.placeholder.name"]" style="flex: 1;" />
|
|
||||||
<button class="btn btn-secondary" @onclick="AddUser">@Loc["settings.user.button.add"]</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
|
|
||||||
<div class="settings-section" style="margin-bottom:16px;">
|
|
||||||
<button class="btn btn-secondary" @onclick='() => Navigation.NavigateTo("/setup-2fa")'>@Loc["settings.user.link.2fa"]</button>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings-context">
|
<div class="settings-context">
|
||||||
@if (currentProjectName != null)
|
@if (currentProjectName != null)
|
||||||
{
|
{
|
||||||
|
|
@ -52,11 +25,44 @@
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="settings-tabs">
|
||||||
|
<button class="settings-tab @(_activePromptTab == "novel" ? "active" : "")" @onclick="SwitchToNovelTab">
|
||||||
|
Roman
|
||||||
|
</button>
|
||||||
|
<button class="settings-tab @(_activePromptTab == "technical" ? "active" : "")" @onclick="SwitchToTechnicalTab">
|
||||||
|
Technische Vorlage (Requirements)
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="settings-layout">
|
<div class="settings-layout">
|
||||||
|
|
||||||
<div class="settings-column" >
|
<div class="settings-column">
|
||||||
@if (_isAdmin)
|
@if (_isAdmin)
|
||||||
{
|
{
|
||||||
|
<div class="settings-section">
|
||||||
|
<h3 class="settings-section-title">@Loc["settings.section.user"]</h3>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="userSelect">@Loc["settings.user.label.active"]</label>
|
||||||
|
<select id="userSelect" value="@selectedUserId" @onchange="SwitchUser">
|
||||||
|
@foreach (var u in users)
|
||||||
|
{
|
||||||
|
<option value="@u.Id">@u.Name (@(u.IsAdministrator ? Loc["settings.user.role.admin"] : Loc["settings.user.role.author"]))</option>
|
||||||
|
}
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="newUserName">@Loc["settings.user.label.new"]</label>
|
||||||
|
<div style="display: flex; gap: 8px;">
|
||||||
|
<input id="newUserName" @bind="newUserName" placeholder="@Loc["settings.user.placeholder.name"]" style="flex: 1;" />
|
||||||
|
<button class="btn btn-secondary" @onclick="AddUser">@Loc["settings.user.button.add"]</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings-section" style="margin-bottom:16px;">
|
||||||
|
<button class="btn btn-secondary" @onclick='() => Navigation.NavigateTo("/setup-2fa")'>@Loc["settings.user.link.2fa"]</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="settings-section">
|
<div class="settings-section">
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.models"]</h3>
|
<h3 class="settings-section-title">@Loc["settings.section.models"]</h3>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|
@ -171,201 +177,196 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@if (currentProjectTemplate == null || currentProjectTemplate == ProjectTemplate.Novel)
|
@if (_activePromptTab == "novel")
|
||||||
{
|
{
|
||||||
<div class="settings-column">
|
<div class="settings-column settings-column-wide">
|
||||||
<div class="settings-section">
|
<div class="settings-section">
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.editor_prompt"]</h3>
|
<h3 class="settings-section-title">@Loc["settings.section.editor_prompt"]</h3>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<textarea id="lektorPrompt" @bind="lektorPrompt" rows="6"></textarea>
|
<textarea id="lektorPrompt" @bind="lektorPrompt" rows="6"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="temp-slider">
|
||||||
|
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@lektorTemp.ToString("F1")</span></label>
|
||||||
|
<input type="range" min="0" max="2" step="0.1" value="@Fmt(lektorTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => lektorTemp = v))" />
|
||||||
|
<div class="temp-category">@GetTempCategory(lektorTemp)</div>
|
||||||
|
<div class="temp-desc">@GetTempDescription(lektorTemp)</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="temp-slider">
|
|
||||||
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@lektorTemp.ToString("F1")</span></label>
|
|
||||||
<input type="range" min="0" max="2" step="0.1" value="@Fmt(lektorTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => lektorTemp = v))" />
|
|
||||||
<div class="temp-category">@GetTempCategory(lektorTemp)</div>
|
|
||||||
<div class="temp-desc">@GetTempDescription(lektorTemp)</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings-section">
|
<div class="settings-section">
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.factcheck_template"]</h3>
|
<h3 class="settings-section-title">@Loc["settings.section.factcheck_template"]</h3>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<textarea id="factCheckTemplate" @bind="factCheckTemplate" rows="6"></textarea>
|
<textarea id="factCheckTemplate" @bind="factCheckTemplate" rows="6"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="temp-slider">
|
||||||
|
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@factCheckTemp.ToString("F1")</span></label>
|
||||||
|
<input type="range" min="0" max="2" step="0.1" value="@Fmt(factCheckTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => factCheckTemp = v))" />
|
||||||
|
<div class="temp-category">@GetTempCategory(factCheckTemp)</div>
|
||||||
|
<div class="temp-desc">@GetTempDescription(factCheckTemp)</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="temp-slider">
|
|
||||||
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@factCheckTemp.ToString("F1")</span></label>
|
|
||||||
<input type="range" min="0" max="2" step="0.1" value="@Fmt(factCheckTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => factCheckTemp = v))" />
|
|
||||||
<div class="temp-category">@GetTempCategory(factCheckTemp)</div>
|
|
||||||
<div class="temp-desc">@GetTempDescription(factCheckTemp)</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings-section">
|
<div class="settings-section">
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.spellcheck_prompt"]</h3>
|
<h3 class="settings-section-title">@Loc["settings.section.spellcheck_prompt"]</h3>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<textarea id="spellingPrompt" @bind="spellingPrompt" rows="6"></textarea>
|
<textarea id="spellingPrompt" @bind="spellingPrompt" rows="6"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="temp-slider">
|
||||||
|
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@spellingTemp.ToString("F1")</span></label>
|
||||||
|
<input type="range" min="0" max="2" step="0.1" value="@Fmt(spellingTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => spellingTemp = v))" />
|
||||||
|
<div class="temp-category">@GetTempCategory(spellingTemp)</div>
|
||||||
|
<div class="temp-desc">@GetTempDescription(spellingTemp)</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings-section">
|
||||||
|
<h3 class="settings-section-title">@Loc["settings.section.advocatus_diaboli"]</h3>
|
||||||
|
<div class="form-group">
|
||||||
|
<textarea id="advocatusDiaboliPrompt" @bind="advocatusDiaboliPrompt" rows="6"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="temp-slider">
|
||||||
|
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@advocatusDiaboliTemp.ToString("F1")</span></label>
|
||||||
|
<input type="range" min="0" max="2" step="0.1" value="@Fmt(advocatusDiaboliTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => advocatusDiaboliTemp = v))" />
|
||||||
|
<div class="temp-category">@GetTempCategory(advocatusDiaboliTemp)</div>
|
||||||
|
<div class="temp-desc">@GetTempDescription(advocatusDiaboliTemp)</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings-section">
|
||||||
|
<h3 class="settings-section-title">@Loc["settings.section.hook_finder"]</h3>
|
||||||
|
<div class="form-group">
|
||||||
|
<textarea id="hookFinderPrompt" @bind="hookFinderPrompt" rows="6"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="temp-slider">
|
||||||
|
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@hookFinderTemp.ToString("F1")</span></label>
|
||||||
|
<input type="range" min="0" max="2" step="0.1" value="@Fmt(hookFinderTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => hookFinderTemp = v))" />
|
||||||
|
<div class="temp-category">@GetTempCategory(hookFinderTemp)</div>
|
||||||
|
<div class="temp-desc">@GetTempDescription(hookFinderTemp)</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings-section">
|
||||||
|
<h3 class="settings-section-title">@Loc["settings.section.eli5"]</h3>
|
||||||
|
<div class="form-group">
|
||||||
|
<textarea id="eli5Prompt" @bind="eli5Prompt" rows="6"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="temp-slider">
|
||||||
|
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@eli5Temp.ToString("F1")</span></label>
|
||||||
|
<input type="range" min="0" max="2" step="0.1" value="@Fmt(eli5Temp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => eli5Temp = v))" />
|
||||||
|
<div class="temp-category">@GetTempCategory(eli5Temp)</div>
|
||||||
|
<div class="temp-desc">@GetTempDescription(eli5Temp)</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="settings-section">
|
||||||
|
<h3 class="settings-section-title">@Loc["settings.section.coauthor_brainstorming"]</h3>
|
||||||
|
<div class="form-group">
|
||||||
|
<textarea id="coAuthorPrompt" @bind="coAuthorPrompt" rows="6"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="temp-slider">
|
||||||
|
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@coAuthorTemp.ToString("F1")</span></label>
|
||||||
|
<input type="range" min="0" max="2" step="0.1" value="@Fmt(coAuthorTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => coAuthorTemp = v))" />
|
||||||
|
<div class="temp-category">@GetTempCategory(coAuthorTemp)</div>
|
||||||
|
<div class="temp-desc">@GetTempDescription(coAuthorTemp)</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="temp-slider">
|
|
||||||
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@spellingTemp.ToString("F1")</span></label>
|
|
||||||
<input type="range" min="0" max="2" step="0.1" value="@Fmt(spellingTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => spellingTemp = v))" />
|
|
||||||
<div class="temp-category">@GetTempCategory(spellingTemp)</div>
|
|
||||||
<div class="temp-desc">@GetTempDescription(spellingTemp)</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@if (currentProjectTemplate == null || currentProjectTemplate == ProjectTemplate.Novel)
|
@if (_activePromptTab == "technical")
|
||||||
{
|
{
|
||||||
<div class="settings-column">
|
<div class="settings-column settings-column-wide">
|
||||||
<div class="settings-section">
|
<div class="settings-section">
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.advocatus_diaboli"]</h3>
|
<h3 class="settings-section-title">@Loc["settings.section.tech_lastenheft"]</h3>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<textarea id="advocatusDiaboliPrompt" @bind="advocatusDiaboliPrompt" rows="6"></textarea>
|
<textarea id="techLastenheftPrompt" @bind="techLastenheftPrompt" rows="6"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="temp-slider">
|
||||||
|
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@techLastenheftTemp.ToString("F1")</span></label>
|
||||||
|
<input type="range" min="0" max="2" step="0.1" value="@Fmt(techLastenheftTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => techLastenheftTemp = v))" />
|
||||||
|
<div class="temp-category">@GetTempCategory(techLastenheftTemp)</div>
|
||||||
|
<div class="temp-desc">@GetTempDescription(techLastenheftTemp)</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="temp-slider">
|
|
||||||
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@advocatusDiaboliTemp.ToString("F1")</span></label>
|
|
||||||
<input type="range" min="0" max="2" step="0.1" value="@Fmt(advocatusDiaboliTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => advocatusDiaboliTemp = v))" />
|
|
||||||
<div class="temp-category">@GetTempCategory(advocatusDiaboliTemp)</div>
|
|
||||||
<div class="temp-desc">@GetTempDescription(advocatusDiaboliTemp)</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings-section">
|
<div class="settings-section">
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.hook_finder"]</h3>
|
<h3 class="settings-section-title">@Loc["settings.section.tech_pflichtenheft"]</h3>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<textarea id="hookFinderPrompt" @bind="hookFinderPrompt" rows="6"></textarea>
|
<textarea id="techPflichtenheftPrompt" @bind="techPflichtenheftPrompt" rows="6"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="temp-slider">
|
||||||
|
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@techPflichtenheftTemp.ToString("F1")</span></label>
|
||||||
|
<input type="range" min="0" max="2" step="0.1" value="@Fmt(techPflichtenheftTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => techPflichtenheftTemp = v))" />
|
||||||
|
<div class="temp-category">@GetTempCategory(techPflichtenheftTemp)</div>
|
||||||
|
<div class="temp-desc">@GetTempDescription(techPflichtenheftTemp)</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="temp-slider">
|
|
||||||
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@hookFinderTemp.ToString("F1")</span></label>
|
|
||||||
<input type="range" min="0" max="2" step="0.1" value="@Fmt(hookFinderTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => hookFinderTemp = v))" />
|
|
||||||
<div class="temp-category">@GetTempCategory(hookFinderTemp)</div>
|
|
||||||
<div class="temp-desc">@GetTempDescription(hookFinderTemp)</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings-section">
|
<div class="settings-section">
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.eli5"]</h3>
|
<h3 class="settings-section-title">@Loc["settings.section.tech_usecase"]</h3>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<textarea id="eli5Prompt" @bind="eli5Prompt" rows="6"></textarea>
|
<textarea id="techUseCasePrompt" @bind="techUseCasePrompt" rows="6"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="temp-slider">
|
||||||
|
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@techUseCaseTemp.ToString("F1")</span></label>
|
||||||
|
<input type="range" min="0" max="2" step="0.1" value="@Fmt(techUseCaseTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => techUseCaseTemp = v))" />
|
||||||
|
<div class="temp-category">@GetTempCategory(techUseCaseTemp)</div>
|
||||||
|
<div class="temp-desc">@GetTempDescription(techUseCaseTemp)</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="temp-slider">
|
|
||||||
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@eli5Temp.ToString("F1")</span></label>
|
|
||||||
<input type="range" min="0" max="2" step="0.1" value="@Fmt(eli5Temp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => eli5Temp = v))" />
|
|
||||||
<div class="temp-category">@GetTempCategory(eli5Temp)</div>
|
|
||||||
<div class="temp-desc">@GetTempDescription(eli5Temp)</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings-section">
|
<div class="settings-section">
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.coauthor_brainstorming"]</h3>
|
<h3 class="settings-section-title">@Loc["settings.section.tech_stakeholder"]</h3>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<textarea id="coAuthorPrompt" @bind="coAuthorPrompt" rows="6"></textarea>
|
<textarea id="techStakeholderPrompt" @bind="techStakeholderPrompt" rows="6"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="temp-slider">
|
||||||
|
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@techStakeholderTemp.ToString("F1")</span></label>
|
||||||
|
<input type="range" min="0" max="2" step="0.1" value="@Fmt(techStakeholderTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => techStakeholderTemp = v))" />
|
||||||
|
<div class="temp-category">@GetTempCategory(techStakeholderTemp)</div>
|
||||||
|
<div class="temp-desc">@GetTempDescription(techStakeholderTemp)</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="temp-slider">
|
|
||||||
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@coAuthorTemp.ToString("F1")</span></label>
|
|
||||||
<input type="range" min="0" max="2" step="0.1" value="@Fmt(coAuthorTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => coAuthorTemp = v))" />
|
|
||||||
<div class="temp-category">@GetTempCategory(coAuthorTemp)</div>
|
|
||||||
<div class="temp-desc">@GetTempDescription(coAuthorTemp)</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
|
|
||||||
@if (currentProjectTemplate == null || currentProjectTemplate == ProjectTemplate.Technical)
|
<div class="settings-section">
|
||||||
{
|
<h3 class="settings-section-title">@Loc["settings.section.tech_glossar"]</h3>
|
||||||
<div class="settings-column">
|
<div class="form-group">
|
||||||
<div class="settings-section">
|
<textarea id="techGlossarPrompt" @bind="techGlossarPrompt" rows="6"></textarea>
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.tech_lastenheft"]</h3>
|
</div>
|
||||||
<div class="form-group">
|
<div class="temp-slider">
|
||||||
<textarea id="techLastenheftPrompt" @bind="techLastenheftPrompt" rows="6"></textarea>
|
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@techGlossarTemp.ToString("F1")</span></label>
|
||||||
|
<input type="range" min="0" max="2" step="0.1" value="@Fmt(techGlossarTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => techGlossarTemp = v))" />
|
||||||
|
<div class="temp-category">@GetTempCategory(techGlossarTemp)</div>
|
||||||
|
<div class="temp-desc">@GetTempDescription(techGlossarTemp)</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="temp-slider">
|
|
||||||
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@techLastenheftTemp.ToString("F1")</span></label>
|
|
||||||
<input type="range" min="0" max="2" step="0.1" value="@Fmt(techLastenheftTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => techLastenheftTemp = v))" />
|
|
||||||
<div class="temp-category">@GetTempCategory(techLastenheftTemp)</div>
|
|
||||||
<div class="temp-desc">@GetTempDescription(techLastenheftTemp)</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings-section">
|
<div class="settings-section">
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.tech_pflichtenheft"]</h3>
|
<h3 class="settings-section-title">@Loc["settings.section.tech_qualitaet"]</h3>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<textarea id="techPflichtenheftPrompt" @bind="techPflichtenheftPrompt" rows="6"></textarea>
|
<textarea id="techQualitaetPrompt" @bind="techQualitaetPrompt" rows="6"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="temp-slider">
|
||||||
|
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@techQualitaetTemp.ToString("F1")</span></label>
|
||||||
|
<input type="range" min="0" max="2" step="0.1" value="@Fmt(techQualitaetTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => techQualitaetTemp = v))" />
|
||||||
|
<div class="temp-category">@GetTempCategory(techQualitaetTemp)</div>
|
||||||
|
<div class="temp-desc">@GetTempDescription(techQualitaetTemp)</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="temp-slider">
|
|
||||||
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@techPflichtenheftTemp.ToString("F1")</span></label>
|
|
||||||
<input type="range" min="0" max="2" step="0.1" value="@Fmt(techPflichtenheftTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => techPflichtenheftTemp = v))" />
|
|
||||||
<div class="temp-category">@GetTempCategory(techPflichtenheftTemp)</div>
|
|
||||||
<div class="temp-desc">@GetTempDescription(techPflichtenheftTemp)</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings-section">
|
<div class="settings-section">
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.tech_usecase"]</h3>
|
<h3 class="settings-section-title">@Loc["settings.section.tech_risiko"]</h3>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<textarea id="techUseCasePrompt" @bind="techUseCasePrompt" rows="6"></textarea>
|
<textarea id="techRisikoPrompt" @bind="techRisikoPrompt" rows="6"></textarea>
|
||||||
</div>
|
</div>
|
||||||
<div class="temp-slider">
|
<div class="temp-slider">
|
||||||
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@techUseCaseTemp.ToString("F1")</span></label>
|
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@techRisikoTemp.ToString("F1")</span></label>
|
||||||
<input type="range" min="0" max="2" step="0.1" value="@Fmt(techUseCaseTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => techUseCaseTemp = v))" />
|
<input type="range" min="0" max="2" step="0.1" value="@Fmt(techRisikoTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => techRisikoTemp = v))" />
|
||||||
<div class="temp-category">@GetTempCategory(techUseCaseTemp)</div>
|
<div class="temp-category">@GetTempCategory(techRisikoTemp)</div>
|
||||||
<div class="temp-desc">@GetTempDescription(techUseCaseTemp)</div>
|
<div class="temp-desc">@GetTempDescription(techRisikoTemp)</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="settings-section">
|
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.tech_stakeholder"]</h3>
|
|
||||||
<div class="form-group">
|
|
||||||
<textarea id="techStakeholderPrompt" @bind="techStakeholderPrompt" rows="6"></textarea>
|
|
||||||
</div>
|
|
||||||
<div class="temp-slider">
|
|
||||||
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@techStakeholderTemp.ToString("F1")</span></label>
|
|
||||||
<input type="range" min="0" max="2" step="0.1" value="@Fmt(techStakeholderTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => techStakeholderTemp = v))" />
|
|
||||||
<div class="temp-category">@GetTempCategory(techStakeholderTemp)</div>
|
|
||||||
<div class="temp-desc">@GetTempDescription(techStakeholderTemp)</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings-section">
|
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.tech_glossar"]</h3>
|
|
||||||
<div class="form-group">
|
|
||||||
<textarea id="techGlossarPrompt" @bind="techGlossarPrompt" rows="6"></textarea>
|
|
||||||
</div>
|
|
||||||
<div class="temp-slider">
|
|
||||||
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@techGlossarTemp.ToString("F1")</span></label>
|
|
||||||
<input type="range" min="0" max="2" step="0.1" value="@Fmt(techGlossarTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => techGlossarTemp = v))" />
|
|
||||||
<div class="temp-category">@GetTempCategory(techGlossarTemp)</div>
|
|
||||||
<div class="temp-desc">@GetTempDescription(techGlossarTemp)</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings-section">
|
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.tech_qualitaet"]</h3>
|
|
||||||
<div class="form-group">
|
|
||||||
<textarea id="techQualitaetPrompt" @bind="techQualitaetPrompt" rows="6"></textarea>
|
|
||||||
</div>
|
|
||||||
<div class="temp-slider">
|
|
||||||
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@techQualitaetTemp.ToString("F1")</span></label>
|
|
||||||
<input type="range" min="0" max="2" step="0.1" value="@Fmt(techQualitaetTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => techQualitaetTemp = v))" />
|
|
||||||
<div class="temp-category">@GetTempCategory(techQualitaetTemp)</div>
|
|
||||||
<div class="temp-desc">@GetTempDescription(techQualitaetTemp)</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="settings-section">
|
|
||||||
<h3 class="settings-section-title">@Loc["settings.section.tech_risiko"]</h3>
|
|
||||||
<div class="form-group">
|
|
||||||
<textarea id="techRisikoPrompt" @bind="techRisikoPrompt" rows="6"></textarea>
|
|
||||||
</div>
|
|
||||||
<div class="temp-slider">
|
|
||||||
<label class="temp-label">@Loc["settings.temperature.label"] <span class="temp-value">@techRisikoTemp.ToString("F1")</span></label>
|
|
||||||
<input type="range" min="0" max="2" step="0.1" value="@Fmt(techRisikoTemp)" @oninput="@((ChangeEventArgs e) => SetTemp(e, v => techRisikoTemp = v))" />
|
|
||||||
<div class="temp-category">@GetTempCategory(techRisikoTemp)</div>
|
|
||||||
<div class="temp-desc">@GetTempDescription(techRisikoTemp)</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
}
|
}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -381,6 +382,10 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
|
private string _activePromptTab = "novel";
|
||||||
|
|
||||||
|
private void SwitchToNovelTab() => _activePromptTab = "novel";
|
||||||
|
private void SwitchToTechnicalTab() => _activePromptTab = "technical";
|
||||||
private string ragModel = "llama3.2";
|
private string ragModel = "llama3.2";
|
||||||
private string styleModel = "llama3.2";
|
private string styleModel = "llama3.2";
|
||||||
private string spellingModel = "phi3:mini";
|
private string spellingModel = "phi3:mini";
|
||||||
|
|
@ -436,7 +441,7 @@
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
var currentUser = AuthService.CurrentUser;
|
var currentUser = AuthService.CurrentUser;
|
||||||
_isAdmin = currentUser?.Role == UserRole.Administrator;
|
_isAdmin = currentUser?.IsAdministrator == true;
|
||||||
|
|
||||||
users = await SettingsService.GetUsersAsync();
|
users = await SettingsService.GetUsersAsync();
|
||||||
var current = await SettingsService.GetCurrentUserAsync();
|
var current = await SettingsService.GetCurrentUserAsync();
|
||||||
|
|
@ -482,6 +487,12 @@
|
||||||
hookFinderPrompt = await SettingsService.GetHookFinderPromptAsync() ?? string.Empty;
|
hookFinderPrompt = await SettingsService.GetHookFinderPromptAsync() ?? string.Empty;
|
||||||
eli5Prompt = await SettingsService.GetEli5PromptAsync() ?? string.Empty;
|
eli5Prompt = await SettingsService.GetEli5PromptAsync() ?? string.Empty;
|
||||||
coAuthorPrompt = await SettingsService.GetCoAuthorBrainstormingPromptAsync() ?? string.Empty;
|
coAuthorPrompt = await SettingsService.GetCoAuthorBrainstormingPromptAsync() ?? string.Empty;
|
||||||
|
lektorTemp = await SettingsService.GetLektorTempAsync();
|
||||||
|
factCheckTemp = await SettingsService.GetFactCheckTempAsync();
|
||||||
|
spellingTemp = await SettingsService.GetSpellingTempAsync();
|
||||||
|
advocatusDiaboliTemp = await SettingsService.GetAdvocatusDiaboliTempAsync();
|
||||||
|
hookFinderTemp = await SettingsService.GetHookFinderTempAsync();
|
||||||
|
eli5Temp = await SettingsService.GetEli5TempAsync();
|
||||||
coAuthorTemp = await SettingsService.GetCoAuthorTempAsync();
|
coAuthorTemp = await SettingsService.GetCoAuthorTempAsync();
|
||||||
techLastenheftPrompt = await SettingsService.GetTechLastenheftPromptAsync() ?? string.Empty;
|
techLastenheftPrompt = await SettingsService.GetTechLastenheftPromptAsync() ?? string.Empty;
|
||||||
techPflichtenheftPrompt = await SettingsService.GetTechPflichtenheftPromptAsync() ?? string.Empty;
|
techPflichtenheftPrompt = await SettingsService.GetTechPflichtenheftPromptAsync() ?? string.Empty;
|
||||||
|
|
@ -674,4 +685,4 @@
|
||||||
_diagnosticsResults = results;
|
_diagnosticsResults = results;
|
||||||
_isDiagnosing = false;
|
_isDiagnosing = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,21 +1,28 @@
|
||||||
@page "/user-management"
|
@page "/user-management"
|
||||||
@attribute [Authorize]
|
@attribute [Authorize(Roles = "Administrator")]
|
||||||
@inject IAuthService AuthService
|
@inject IAuthService AuthService
|
||||||
|
@inject IEmailService EmailService
|
||||||
@inject ILocalizationService Loc
|
@inject ILocalizationService Loc
|
||||||
@inject NavigationManager Navigation
|
@inject NavigationManager Navigation
|
||||||
|
|
||||||
|
@rendermode InteractiveServer
|
||||||
|
|
||||||
<PageTitle>@Loc["usermanagement.title"] - Author Buddy</PageTitle>
|
<PageTitle>@Loc["usermanagement.title"] - Author Buddy</PageTitle>
|
||||||
|
|
||||||
<div class="usermanagement-page">
|
<div class="usermanagement-page">
|
||||||
<h3>@Loc["usermanagement.title"]</h3>
|
<div class="usermanagement-header">
|
||||||
|
<h3>@Loc["usermanagement.title"]</h3>
|
||||||
|
<button class="btn btn-primary" @onclick="ShowCreateDialog">+ Neuen Benutzer</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
<table class="usermanagement-table">
|
<table class="usermanagement-table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>@Loc["usermanagement.col.name"]</th>
|
<th>Name</th>
|
||||||
<th>@Loc["usermanagement.col.role"]</th>
|
<th>E-Mail</th>
|
||||||
<th>@Loc["usermanagement.col.status"]</th>
|
<th>Rolle</th>
|
||||||
<th>@Loc["usermanagement.col.actions"]</th>
|
<th>Status</th>
|
||||||
|
<th>Aktionen</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
|
@ -23,33 +30,35 @@
|
||||||
{
|
{
|
||||||
<tr class="@(u.Id == currentUserId ? "usermanagement-current" : "") @(!u.IsActive ? "usermanagement-inactive" : "")">
|
<tr class="@(u.Id == currentUserId ? "usermanagement-current" : "") @(!u.IsActive ? "usermanagement-inactive" : "")">
|
||||||
<td>@u.Name @(u.Id == currentUserId ? "(Du)" : "")</td>
|
<td>@u.Name @(u.Id == currentUserId ? "(Du)" : "")</td>
|
||||||
<td>@(u.Role == UserRole.Administrator ? Loc["settings.user.role.admin"] : Loc["settings.user.role.author"])</td>
|
<td>@(!string.IsNullOrEmpty(u.Email) ? u.Email : "—")</td>
|
||||||
|
<td>@string.Join(", ", u.Roles.Select(RoleName))</td>
|
||||||
<td>
|
<td>
|
||||||
@if (u.IsActive)
|
@if (u.IsActive)
|
||||||
{
|
{
|
||||||
<span class="usermanagement-status-active">@Loc["usermanagement.status.active"]</span>
|
<span class="usermanagement-status-active">Aktiv</span>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<span class="usermanagement-status-inactive">@Loc["usermanagement.status.inactive"]</span>
|
<span class="usermanagement-status-inactive">Inaktiv</span>
|
||||||
}
|
}
|
||||||
</td>
|
</td>
|
||||||
<td class="usermanagement-actions">
|
<td class="usermanagement-actions">
|
||||||
|
<button class="btn btn-sm" @onclick="() => BeginEdit(u)" title="Bearbeiten">✎</button>
|
||||||
|
@if (!string.IsNullOrEmpty(u.Email) && EmailService.IsConfigured)
|
||||||
|
{
|
||||||
|
<button class="btn btn-sm" @onclick="() => SendRecovery(u)" title="Passwort zurücksetzen per E-Mail">📧</button>
|
||||||
|
}
|
||||||
@if (u.Id != currentUserId)
|
@if (u.Id != currentUserId)
|
||||||
{
|
{
|
||||||
@if (u.IsActive)
|
@if (u.IsActive)
|
||||||
{
|
{
|
||||||
<button class="btn btn-sm" @onclick="() => DeactivateUser(u.Id)" title="@Loc["usermanagement.action.deactivate"]">@Loc["usermanagement.action.deactivate"]</button>
|
<button class="btn btn-sm" @onclick="() => DeactivateUser(u.Id)" title="Deaktivieren">🔴</button>
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
<button class="btn btn-sm btn-primary" @onclick="() => ActivateUser(u.Id)" title="@Loc["usermanagement.action.activate"]">@Loc["usermanagement.action.activate"]</button>
|
<button class="btn btn-sm btn-primary" @onclick="() => ActivateUser(u.Id)" title="Aktivieren">🟢</button>
|
||||||
}
|
}
|
||||||
<button class="btn btn-sm btn-danger" @onclick="() => DeleteUser(u.Id)" title="@Loc["usermanagement.action.delete"]">@Loc["usermanagement.action.delete"]</button>
|
<button class="btn btn-sm btn-danger" @onclick="() => BeginDelete(u)" title="Löschen">🗑</button>
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
<span style="font-size:11px;color:var(--border-color);">@Loc["usermanagement.cannot_self"]</span>
|
|
||||||
}
|
}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
@ -61,15 +70,134 @@
|
||||||
{
|
{
|
||||||
<div class="usermanagement-status">@statusMessage</div>
|
<div class="usermanagement-status">@statusMessage</div>
|
||||||
}
|
}
|
||||||
|
|
||||||
<button class="btn btn-secondary" @onclick='() => Navigation.NavigateTo("/settings")' style="margin-top:12px;">@Loc["common.back"]</button>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@* Create User Dialog *@
|
||||||
|
@if (showCreateDialog)
|
||||||
|
{
|
||||||
|
<div class="modal-overlay">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-title">Neuen Benutzer anlegen</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Benutzername</label>
|
||||||
|
<input @bind="_newUsername" />
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>E-Mail</label>
|
||||||
|
<input @bind="_newEmail" type="email" />
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Rollen</label>
|
||||||
|
<div class="um-role-checkboxes">
|
||||||
|
@foreach (var (role, label) in UmRoleOptions)
|
||||||
|
{
|
||||||
|
<label><input type="checkbox" checked="@_newRoles.Contains(role)" @onchange="() => ToggleNewRole(role)" /> @label</label>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Passwort</label>
|
||||||
|
<div style="display:flex;gap:8px;">
|
||||||
|
<input @bind="_newPassword" type="password" style="flex:1;" />
|
||||||
|
<button class="btn btn-sm" @onclick="GeneratePassword" type="button">Generieren</button>
|
||||||
|
</div>
|
||||||
|
@if (!string.IsNullOrEmpty(_generatedPassword))
|
||||||
|
{
|
||||||
|
<small style="color:#c00;font-family:monospace;">@_generatedPassword</small>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-actions">
|
||||||
|
<button @onclick="CancelCreate">Abbrechen</button>
|
||||||
|
<button @onclick="CreateUser" class="primary" disabled="@(string.IsNullOrWhiteSpace(_newUsername) || string.IsNullOrWhiteSpace(_newPassword))">Anlegen</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
@* Edit User Dialog *@
|
||||||
|
@if (showEditDialog && _editUser != null)
|
||||||
|
{
|
||||||
|
<div class="modal-overlay">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-title">Benutzer bearbeiten – @_editUser.Name</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>E-Mail</label>
|
||||||
|
<input @bind="_editEmail" type="email" />
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Rollen</label>
|
||||||
|
<div class="um-role-checkboxes">
|
||||||
|
@foreach (var (role, label) in UmRoleOptions)
|
||||||
|
{
|
||||||
|
<label><input type="checkbox" checked="@_editRoles.Contains(role)" @onchange="() => ToggleEditRole(role)" /> @label</label>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-actions">
|
||||||
|
<button @onclick="CancelEdit">Abbrechen</button>
|
||||||
|
<button @onclick="SaveEdit" class="primary">Speichern</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
|
@* Delete Confirmation Dialog *@
|
||||||
|
@if (showDeleteDialog && _deleteUser != null)
|
||||||
|
{
|
||||||
|
<div class="modal-overlay">
|
||||||
|
<div class="modal-dialog">
|
||||||
|
<div class="modal-title">Benutzer löschen</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<p>Soll der Benutzer <strong>@_deleteUser.Name</strong> wirklich gelöscht werden?</p>
|
||||||
|
</div>
|
||||||
|
<div class="modal-actions">
|
||||||
|
<button @onclick="CancelDelete">Abbrechen</button>
|
||||||
|
<button @onclick="ConfirmDelete" class="btn-danger">Löschen</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
|
||||||
@code {
|
@code {
|
||||||
private List<UserEntity> users = new();
|
private List<UserEntity> users = new();
|
||||||
private int currentUserId;
|
private int currentUserId;
|
||||||
private string statusMessage = string.Empty;
|
private string statusMessage = string.Empty;
|
||||||
|
|
||||||
|
private bool showCreateDialog;
|
||||||
|
private string _newUsername = string.Empty;
|
||||||
|
private string _newEmail = string.Empty;
|
||||||
|
private List<string> _newRoles = new() { "Author" };
|
||||||
|
private string _newPassword = string.Empty;
|
||||||
|
private string? _generatedPassword;
|
||||||
|
|
||||||
|
private bool showEditDialog;
|
||||||
|
private UserEntity? _editUser;
|
||||||
|
private string _editEmail = string.Empty;
|
||||||
|
private List<string> _editRoles = new();
|
||||||
|
|
||||||
|
private bool showDeleteDialog;
|
||||||
|
private UserEntity? _deleteUser;
|
||||||
|
|
||||||
|
private static (string role, string label)[] UmRoleOptions => new[]
|
||||||
|
{
|
||||||
|
("Author", "Autor"),
|
||||||
|
("Blogger", "Blogger"),
|
||||||
|
("Chat", "Chat"),
|
||||||
|
("Administrator", "Administrator")
|
||||||
|
};
|
||||||
|
|
||||||
|
private string RoleName(UserRole role) => role switch
|
||||||
|
{
|
||||||
|
UserRole.Administrator => "Administrator",
|
||||||
|
UserRole.Blogger => "Blogger",
|
||||||
|
UserRole.Chat => "Chat",
|
||||||
|
_ => "Autor"
|
||||||
|
};
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
await LoadUsers();
|
await LoadUsers();
|
||||||
|
|
@ -84,21 +212,162 @@
|
||||||
private async Task ActivateUser(int userId)
|
private async Task ActivateUser(int userId)
|
||||||
{
|
{
|
||||||
var ok = await AuthService.SetUserActiveAsync(userId, true);
|
var ok = await AuthService.SetUserActiveAsync(userId, true);
|
||||||
statusMessage = ok ? Loc["usermanagement.status.activated"] : Loc["common.error"];
|
statusMessage = ok ? "Benutzer aktiviert." : "Fehler";
|
||||||
await LoadUsers();
|
await LoadUsers();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task DeactivateUser(int userId)
|
private async Task DeactivateUser(int userId)
|
||||||
{
|
{
|
||||||
var ok = await AuthService.SetUserActiveAsync(userId, false);
|
var ok = await AuthService.SetUserActiveAsync(userId, false);
|
||||||
statusMessage = ok ? Loc["usermanagement.status.deactivated"] : Loc["common.error"];
|
statusMessage = ok ? "Benutzer deaktiviert." : "Fehler";
|
||||||
await LoadUsers();
|
await LoadUsers();
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task DeleteUser(int userId)
|
private void ShowCreateDialog()
|
||||||
{
|
{
|
||||||
var ok = await AuthService.DeleteUserAsync(userId);
|
_newUsername = string.Empty;
|
||||||
statusMessage = ok ? Loc["usermanagement.status.deleted"] : Loc["common.error"];
|
_newEmail = string.Empty;
|
||||||
|
_newRoles = new List<string> { "Author" };
|
||||||
|
_newPassword = string.Empty;
|
||||||
|
_generatedPassword = null;
|
||||||
|
showCreateDialog = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CancelCreate()
|
||||||
|
{
|
||||||
|
showCreateDialog = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToggleNewRole(string role)
|
||||||
|
{
|
||||||
|
if (_newRoles.Contains(role))
|
||||||
|
_newRoles.Remove(role);
|
||||||
|
else
|
||||||
|
_newRoles.Add(role);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void ToggleEditRole(string role)
|
||||||
|
{
|
||||||
|
if (_editRoles.Contains(role))
|
||||||
|
_editRoles.Remove(role);
|
||||||
|
else
|
||||||
|
_editRoles.Add(role);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void GeneratePassword()
|
||||||
|
{
|
||||||
|
using var rng = System.Security.Cryptography.RandomNumberGenerator.Create();
|
||||||
|
var bytes = new byte[10];
|
||||||
|
rng.GetBytes(bytes);
|
||||||
|
_generatedPassword = Convert.ToBase64String(bytes).TrimEnd('=').Replace('+', 'X').Replace('/', 'Y');
|
||||||
|
_newPassword = _generatedPassword;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task CreateUser()
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(_newUsername) || string.IsNullOrWhiteSpace(_newPassword))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (_newRoles.Count == 0)
|
||||||
|
{
|
||||||
|
statusMessage = "Mindestens eine Rolle erforderlich.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var roles = _newRoles.Select(r => r switch
|
||||||
|
{
|
||||||
|
"Administrator" => UserRole.Administrator,
|
||||||
|
"Blogger" => UserRole.Blogger,
|
||||||
|
"Chat" => UserRole.Chat,
|
||||||
|
_ => UserRole.Author
|
||||||
|
}).Distinct().ToList();
|
||||||
|
|
||||||
|
var ok = await AuthService.CreateUserAsync(_newUsername.Trim(), _newPassword, _newEmail.Trim(), roles);
|
||||||
|
statusMessage = ok
|
||||||
|
? $"Benutzer '{_newUsername}' angelegt."
|
||||||
|
: "Benutzername bereits vergeben oder maximal ein Admin erlaubt.";
|
||||||
|
showCreateDialog = false;
|
||||||
await LoadUsers();
|
await LoadUsers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void BeginEdit(UserEntity user)
|
||||||
|
{
|
||||||
|
_editUser = user;
|
||||||
|
_editEmail = user.Email;
|
||||||
|
_editRoles = user.Roles.Select(r => r.ToString()).ToList();
|
||||||
|
showEditDialog = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CancelEdit()
|
||||||
|
{
|
||||||
|
showEditDialog = false;
|
||||||
|
_editUser = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SaveEdit()
|
||||||
|
{
|
||||||
|
if (_editUser == null) return;
|
||||||
|
|
||||||
|
if (_editRoles.Count == 0)
|
||||||
|
{
|
||||||
|
statusMessage = "Mindestens eine Rolle erforderlich.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var roles = _editRoles.Select(r => r switch
|
||||||
|
{
|
||||||
|
"Administrator" => UserRole.Administrator,
|
||||||
|
"Blogger" => UserRole.Blogger,
|
||||||
|
"Chat" => UserRole.Chat,
|
||||||
|
_ => UserRole.Author
|
||||||
|
}).Distinct().ToList();
|
||||||
|
|
||||||
|
string? email = _editEmail?.Trim();
|
||||||
|
if (string.IsNullOrEmpty(email)) email = null;
|
||||||
|
|
||||||
|
var ok = await AuthService.UpdateUserAsync(_editUser.Id, email, roles);
|
||||||
|
statusMessage = ok ? "Benutzer aktualisiert." : "Fehler (max. ein Admin erlaubt).";
|
||||||
|
showEditDialog = false;
|
||||||
|
_editUser = null;
|
||||||
|
await LoadUsers();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void BeginDelete(UserEntity user)
|
||||||
|
{
|
||||||
|
_deleteUser = user;
|
||||||
|
showDeleteDialog = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CancelDelete()
|
||||||
|
{
|
||||||
|
showDeleteDialog = false;
|
||||||
|
_deleteUser = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ConfirmDelete()
|
||||||
|
{
|
||||||
|
if (_deleteUser == null) return;
|
||||||
|
var ok = await AuthService.DeleteUserAsync(_deleteUser.Id);
|
||||||
|
statusMessage = ok ? "Benutzer gelöscht." : "Fehler";
|
||||||
|
showDeleteDialog = false;
|
||||||
|
_deleteUser = null;
|
||||||
|
await LoadUsers();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task SendRecovery(UserEntity user)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrEmpty(user.Email)) return;
|
||||||
|
|
||||||
|
var newPassword = await AuthService.ResetPasswordAsync(user.Id);
|
||||||
|
if (string.IsNullOrEmpty(newPassword))
|
||||||
|
{
|
||||||
|
statusMessage = "Fehler beim Zurücksetzen des Passworts.";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var sent = await EmailService.SendPasswordAsync(user.Email, user.Name, newPassword);
|
||||||
|
statusMessage = sent
|
||||||
|
? $"Neues Passwort an {user.Email} gesendet."
|
||||||
|
: "E-Mail konnte nicht gesendet werden (SMTP-Konfiguration prüfen).";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
11
Data/ChatEntity.cs
Normal file
11
Data/ChatEntity.cs
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
namespace AuthorBuddy.Web.Data;
|
||||||
|
|
||||||
|
public class ChatEntity
|
||||||
|
{
|
||||||
|
public int Id { get; set; }
|
||||||
|
public int UserId { get; set; }
|
||||||
|
public string UserMessage { get; set; } = string.Empty;
|
||||||
|
public string AssistantResponse { get; set; } = string.Empty;
|
||||||
|
public string Model { get; set; } = string.Empty;
|
||||||
|
public DateTime Timestamp { get; set; } = DateTime.UtcNow;
|
||||||
|
}
|
||||||
|
|
@ -1,18 +1,30 @@
|
||||||
|
using LiteDB;
|
||||||
|
|
||||||
namespace AuthorBuddy.Web.Data;
|
namespace AuthorBuddy.Web.Data;
|
||||||
|
|
||||||
public enum UserRole
|
public enum UserRole
|
||||||
{
|
{
|
||||||
Author,
|
Author,
|
||||||
Administrator
|
Administrator,
|
||||||
|
Blogger,
|
||||||
|
Chat
|
||||||
}
|
}
|
||||||
|
|
||||||
public class UserEntity
|
public class UserEntity
|
||||||
{
|
{
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
public string Name { get; set; } = string.Empty;
|
public string Name { get; set; } = string.Empty;
|
||||||
|
public string Email { get; set; } = string.Empty;
|
||||||
public string PasswordHash { get; set; } = string.Empty;
|
public string PasswordHash { get; set; } = string.Empty;
|
||||||
public string TwoFactorSecret { get; set; } = string.Empty;
|
public string TwoFactorSecret { get; set; } = string.Empty;
|
||||||
public bool TwoFactorEnabled { get; set; }
|
public bool TwoFactorEnabled { get; set; }
|
||||||
public UserRole Role { get; set; } = UserRole.Author;
|
public List<UserRole> Roles { get; set; } = new() { UserRole.Author };
|
||||||
public bool IsActive { get; set; } = true;
|
public bool IsActive { get; set; } = true;
|
||||||
|
|
||||||
|
[BsonIgnore]
|
||||||
|
public bool IsAdministrator => Roles.Contains(UserRole.Administrator);
|
||||||
|
|
||||||
|
public bool HasRole(UserRole role) => Roles.Contains(role);
|
||||||
|
|
||||||
|
public bool HasAnyRole(params UserRole[] roles) => roles.Any(HasRole);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -99,6 +99,20 @@ public class OllamaSettings
|
||||||
public double TechQualitaetTemp { get; set; } = 0.3;
|
public double TechQualitaetTemp { get; set; } = 0.3;
|
||||||
public double TechRisikoTemp { get; set; } = 0.5;
|
public double TechRisikoTemp { get; set; } = 0.5;
|
||||||
|
|
||||||
|
public string QuickMarkdownPrompt { get; set; } = "Du bist ein Markdown-Profi. Formatiere den folgenden Text als sauberes, gut strukturiertes Markdown. Verwende Überschriften (##, ###), Listen, Tabellen, Code-Blöcke, fette/kursive Hervorhebungen und Zitate wo sinnvoll. Achte auf Lesbarkeit und eine logische Gliederung.";
|
||||||
|
|
||||||
|
public string QuickMarkdownPromptEn { get; } = "You are a Markdown professional. Format the following text as clean, well-structured Markdown. Use headings (##, ###), lists, tables, code blocks, bold/italic emphasis and quotes where appropriate. Ensure readability and logical structure.";
|
||||||
|
|
||||||
|
public double QuickMarkdownTemp { get; set; } = 0.3;
|
||||||
|
|
||||||
|
public string ChatPrompt { get; set; } = "Du bist ein hilfreicher Assistent. Antworte freundlich und präzise auf Deutsch.";
|
||||||
|
public string ChatPromptEn { get; } = "You are a helpful assistant. Answer friendly and precisely in English.";
|
||||||
|
public double ChatTemp { get; set; } = 0.7;
|
||||||
|
|
||||||
|
public string GetChatDefaultPrompt(string currentLanguage) => GetDefaultPrompt(ChatPrompt, ChatPromptEn, currentLanguage);
|
||||||
|
|
||||||
|
public string GetQuickMarkdownDefaultPrompt(string currentLanguage) => GetDefaultPrompt(QuickMarkdownPrompt, QuickMarkdownPromptEn, currentLanguage);
|
||||||
|
|
||||||
public string GetDefaultPrompt(string dePrompt, string enPrompt, string currentLanguage)
|
public string GetDefaultPrompt(string dePrompt, string enPrompt, string currentLanguage)
|
||||||
{
|
{
|
||||||
return currentLanguage == "en" ? enPrompt : dePrompt;
|
return currentLanguage == "en" ? enPrompt : dePrompt;
|
||||||
|
|
|
||||||
13
Models/SmtpSettings.cs
Normal file
13
Models/SmtpSettings.cs
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
namespace AuthorBuddy.Web.Models;
|
||||||
|
|
||||||
|
public class SmtpSettings
|
||||||
|
{
|
||||||
|
public string Host { get; set; } = string.Empty;
|
||||||
|
public int Port { get; set; } = 587;
|
||||||
|
public string Username { get; set; } = string.Empty;
|
||||||
|
public string Password { get; set; } = string.Empty;
|
||||||
|
public string FromAddress { get; set; } = string.Empty;
|
||||||
|
public string FromName { get; set; } = "Author Buddy";
|
||||||
|
public bool UseSsl { get; set; } = true;
|
||||||
|
public bool Enabled { get; set; }
|
||||||
|
}
|
||||||
35
Program.cs
35
Program.cs
|
|
@ -1,4 +1,5 @@
|
||||||
using AuthorBuddy.Web.Components;
|
using AuthorBuddy.Web.Components;
|
||||||
|
using AuthorBuddy.Web.Data;
|
||||||
using AuthorBuddy.Web.Models;
|
using AuthorBuddy.Web.Models;
|
||||||
using AuthorBuddy.Web.Services;
|
using AuthorBuddy.Web.Services;
|
||||||
using LiteDB;
|
using LiteDB;
|
||||||
|
|
@ -20,7 +21,9 @@ var dbDir = OperatingSystem.IsLinux()
|
||||||
: AppContext.BaseDirectory;
|
: AppContext.BaseDirectory;
|
||||||
Directory.CreateDirectory(dbDir);
|
Directory.CreateDirectory(dbDir);
|
||||||
var dbPath = Path.Combine(dbDir, Constants.DbFile);
|
var dbPath = Path.Combine(dbDir, Constants.DbFile);
|
||||||
builder.Services.AddSingleton<ILiteDatabase>(new LiteDatabase($"Filename={dbPath};Connection=direct"));
|
var db = new LiteDatabase($"Filename={dbPath};Connection=direct");
|
||||||
|
MigrateUserRoles(db);
|
||||||
|
builder.Services.AddSingleton<ILiteDatabase>(db);
|
||||||
|
|
||||||
builder.Services.AddSingleton<OllamaSettings>();
|
builder.Services.AddSingleton<OllamaSettings>();
|
||||||
builder.Services.AddSingleton<IOllamaService, OllamaService>();
|
builder.Services.AddSingleton<IOllamaService, OllamaService>();
|
||||||
|
|
@ -37,6 +40,12 @@ builder.Services.AddSingleton<IWikipediaService, WikipediaService>();
|
||||||
builder.Services.AddSingleton<OperationState>();
|
builder.Services.AddSingleton<OperationState>();
|
||||||
builder.Services.AddSingleton<IDbAdminService, DbAdminService>();
|
builder.Services.AddSingleton<IDbAdminService, DbAdminService>();
|
||||||
builder.Services.AddScoped<IAuthService, AuthService>();
|
builder.Services.AddScoped<IAuthService, AuthService>();
|
||||||
|
builder.Services.AddSingleton<IEmailService, EmailService>();
|
||||||
|
builder.Services.AddSingleton<IChatService, ChatService>();
|
||||||
|
|
||||||
|
var smtpSettings = new SmtpSettings();
|
||||||
|
builder.Configuration.GetSection("Smtp").Bind(smtpSettings);
|
||||||
|
builder.Services.AddSingleton(smtpSettings);
|
||||||
builder.Services.AddScoped<ILocalizationService, LocalizationService>();
|
builder.Services.AddScoped<ILocalizationService, LocalizationService>();
|
||||||
builder.Services.AddScoped<CustomAuthStateProvider>();
|
builder.Services.AddScoped<CustomAuthStateProvider>();
|
||||||
builder.Services.AddScoped<AuthenticationStateProvider>(sp =>
|
builder.Services.AddScoped<AuthenticationStateProvider>(sp =>
|
||||||
|
|
@ -80,7 +89,23 @@ app.MapRazorComponents<App>()
|
||||||
|
|
||||||
app.Run();
|
app.Run();
|
||||||
|
|
||||||
//public partial class Program
|
static void MigrateUserRoles(ILiteDatabase db)
|
||||||
//{
|
{
|
||||||
// public const bool DebugAutoLogin = true;
|
var col = db.GetCollection("users");
|
||||||
//}
|
var docs = col.FindAll().ToList();
|
||||||
|
foreach (var doc in docs)
|
||||||
|
{
|
||||||
|
if (doc.ContainsKey("Role") && !doc.ContainsKey("Roles"))
|
||||||
|
{
|
||||||
|
var oldRole = (Int32)UserRole.Administrator;
|
||||||
|
doc.Remove("Role");
|
||||||
|
doc["Roles"] = new BsonArray { new BsonValue(oldRole) };
|
||||||
|
col.Update(doc);
|
||||||
|
}
|
||||||
|
else if (!doc.ContainsKey("Roles") && !doc.ContainsKey("Role"))
|
||||||
|
{
|
||||||
|
doc["Roles"] = new BsonArray { new BsonValue(0) };
|
||||||
|
col.Update(doc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
15
Properties/PublishProfiles/FolderProfile.pubxml
Normal file
15
Properties/PublishProfiles/FolderProfile.pubxml
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
|
||||||
|
<Project>
|
||||||
|
<PropertyGroup>
|
||||||
|
<DeleteExistingFiles>false</DeleteExistingFiles>
|
||||||
|
<ExcludeApp_Data>false</ExcludeApp_Data>
|
||||||
|
<LaunchSiteAfterPublish>true</LaunchSiteAfterPublish>
|
||||||
|
<LastUsedBuildConfiguration>Release</LastUsedBuildConfiguration>
|
||||||
|
<LastUsedPlatform>Any CPU</LastUsedPlatform>
|
||||||
|
<PublishProvider>FileSystem</PublishProvider>
|
||||||
|
<PublishUrl>bin\Release\net10.0\publish\</PublishUrl>
|
||||||
|
<WebPublishMethod>FileSystem</WebPublishMethod>
|
||||||
|
<_TargetId>Folder</_TargetId>
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
9
Properties/PublishProfiles/FolderProfile.pubxml.user
Normal file
9
Properties/PublishProfiles/FolderProfile.pubxml.user
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- https://go.microsoft.com/fwlink/?LinkID=208121. -->
|
||||||
|
<Project>
|
||||||
|
<PropertyGroup>
|
||||||
|
<_PublishTargetUrl>E:\ollama_net\ollama\AuthorBuddy.Web\bin\Release\net10.0\publish\</_PublishTargetUrl>
|
||||||
|
<History>True|2026-06-14T06:09:44.9432726Z||;</History>
|
||||||
|
<LastFailureDetails />
|
||||||
|
</PropertyGroup>
|
||||||
|
</Project>
|
||||||
|
|
@ -289,5 +289,6 @@
|
||||||
"export.label.format": "Format",
|
"export.label.format": "Format",
|
||||||
"export.format.markdown": "Markdown (Einzeldatei)",
|
"export.format.markdown": "Markdown (Einzeldatei)",
|
||||||
"export.format.zip": "Markdown (ZIP-Archiv)",
|
"export.format.zip": "Markdown (ZIP-Archiv)",
|
||||||
"export.button.export": "Exportieren"
|
"export.button.export": "Exportieren",
|
||||||
|
"nav.menu.chat": "Chat Tools"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -289,5 +289,6 @@
|
||||||
"export.label.format": "Format",
|
"export.label.format": "Format",
|
||||||
"export.format.markdown": "Markdown (single file)",
|
"export.format.markdown": "Markdown (single file)",
|
||||||
"export.format.zip": "Markdown (ZIP archive)",
|
"export.format.zip": "Markdown (ZIP archive)",
|
||||||
"export.button.export": "Export"
|
"export.button.export": "Export",
|
||||||
|
"nav.menu.chat": "Chat Tools"
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ public class AuthService : IAuthService
|
||||||
PasswordHash = TotpHelper.HashPassword(password),
|
PasswordHash = TotpHelper.HashPassword(password),
|
||||||
TwoFactorEnabled = false,
|
TwoFactorEnabled = false,
|
||||||
TwoFactorSecret = string.Empty,
|
TwoFactorSecret = string.Empty,
|
||||||
Role = hasUsers ? UserRole.Author : UserRole.Administrator
|
Roles = hasUsers ? new List<UserRole> { UserRole.Author } : new List<UserRole> { UserRole.Administrator }
|
||||||
};
|
};
|
||||||
col.Insert(user);
|
col.Insert(user);
|
||||||
await SetAuthenticatedUser(user);
|
await SetAuthenticatedUser(user);
|
||||||
|
|
@ -207,4 +207,80 @@ public class AuthService : IAuthService
|
||||||
col.Delete(userId);
|
col.Delete(userId);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<bool> CreateUserAsync(string username, string password, string email, List<UserRole> roles)
|
||||||
|
{
|
||||||
|
var col = _db.GetCollection<UserEntity>("users");
|
||||||
|
var existing = col.FindOne(u => u.Name == username);
|
||||||
|
if (existing != null) return false;
|
||||||
|
|
||||||
|
if (roles.Contains(UserRole.Administrator) && AdminCount() >= 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
var user = new UserEntity
|
||||||
|
{
|
||||||
|
Name = username,
|
||||||
|
Email = email,
|
||||||
|
PasswordHash = TotpHelper.HashPassword(password),
|
||||||
|
Roles = roles,
|
||||||
|
TwoFactorEnabled = false,
|
||||||
|
TwoFactorSecret = string.Empty,
|
||||||
|
IsActive = true
|
||||||
|
};
|
||||||
|
col.Insert(user);
|
||||||
|
await Task.CompletedTask;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<bool> UpdateUserAsync(int userId, string? email, List<UserRole>? roles)
|
||||||
|
{
|
||||||
|
var col = _db.GetCollection<UserEntity>("users");
|
||||||
|
var user = col.FindById(userId);
|
||||||
|
if (user == null) return false;
|
||||||
|
|
||||||
|
if (email != null) user.Email = email;
|
||||||
|
|
||||||
|
if (roles != null)
|
||||||
|
{
|
||||||
|
var currentlyAdmin = user.Roles.Contains(UserRole.Administrator);
|
||||||
|
var willBeAdmin = roles.Contains(UserRole.Administrator);
|
||||||
|
|
||||||
|
if (willBeAdmin && !currentlyAdmin && AdminCount() >= 1)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!willBeAdmin && currentlyAdmin && AdminCount(userId) == 0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
user.Roles = roles;
|
||||||
|
}
|
||||||
|
|
||||||
|
col.Update(user);
|
||||||
|
await Task.CompletedTask;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<string> ResetPasswordAsync(int userId)
|
||||||
|
{
|
||||||
|
var col = _db.GetCollection<UserEntity>("users");
|
||||||
|
var user = col.FindById(userId);
|
||||||
|
if (user == null) return string.Empty;
|
||||||
|
|
||||||
|
using var rng = System.Security.Cryptography.RandomNumberGenerator.Create();
|
||||||
|
var bytes = new byte[10];
|
||||||
|
rng.GetBytes(bytes);
|
||||||
|
var newPassword = Convert.ToBase64String(bytes).TrimEnd('=').Replace('+', 'X').Replace('/', 'Y');
|
||||||
|
|
||||||
|
user.PasswordHash = TotpHelper.HashPassword(newPassword);
|
||||||
|
col.Update(user);
|
||||||
|
await Task.CompletedTask;
|
||||||
|
return newPassword;
|
||||||
|
}
|
||||||
|
|
||||||
|
private int AdminCount(int? excludeUserId = null)
|
||||||
|
{
|
||||||
|
var col = _db.GetCollection<UserEntity>("users");
|
||||||
|
return col.FindAll().Count(u =>
|
||||||
|
u.Roles.Contains(UserRole.Administrator) &&
|
||||||
|
(!excludeUserId.HasValue || u.Id != excludeUserId.Value));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
38
Services/ChatService.cs
Normal file
38
Services/ChatService.cs
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
using AuthorBuddy.Web.Data;
|
||||||
|
using LiteDB;
|
||||||
|
|
||||||
|
namespace AuthorBuddy.Web.Services;
|
||||||
|
|
||||||
|
public class ChatService : IChatService
|
||||||
|
{
|
||||||
|
private readonly ILiteDatabase _db;
|
||||||
|
|
||||||
|
public ChatService(ILiteDatabase db)
|
||||||
|
{
|
||||||
|
_db = db;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<List<ChatEntity>> GetHistoryAsync(int userId)
|
||||||
|
{
|
||||||
|
var col = _db.GetCollection<ChatEntity>("chats");
|
||||||
|
return Task.FromResult(col.Find(c => c.UserId == userId)
|
||||||
|
.OrderByDescending(c => c.Timestamp)
|
||||||
|
.Take(100)
|
||||||
|
.Reverse()
|
||||||
|
.ToList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task AddMessageAsync(ChatEntity message)
|
||||||
|
{
|
||||||
|
var col = _db.GetCollection<ChatEntity>("chats");
|
||||||
|
col.Insert(message);
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task ClearHistoryAsync(int userId)
|
||||||
|
{
|
||||||
|
var col = _db.GetCollection<ChatEntity>("chats");
|
||||||
|
col.DeleteMany(c => c.UserId == userId);
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -19,11 +19,15 @@ public class CustomAuthStateProvider : AuthenticationStateProvider
|
||||||
var user = await _authService.GetCurrentUserAsync();
|
var user = await _authService.GetCurrentUserAsync();
|
||||||
if (user != null)
|
if (user != null)
|
||||||
{
|
{
|
||||||
var identity = new ClaimsIdentity(new[]
|
var claims = new List<Claim>
|
||||||
{
|
{
|
||||||
new Claim(ClaimTypes.Name, user.Name),
|
new Claim(ClaimTypes.Name, user.Name),
|
||||||
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
|
new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
|
||||||
}, "custom");
|
};
|
||||||
|
foreach (var role in user.Roles)
|
||||||
|
claims.Add(new Claim(ClaimTypes.Role, role.ToString()));
|
||||||
|
|
||||||
|
var identity = new ClaimsIdentity(claims, "custom");
|
||||||
return new AuthenticationState(new ClaimsPrincipal(identity));
|
return new AuthenticationState(new ClaimsPrincipal(identity));
|
||||||
}
|
}
|
||||||
return _anonymous;
|
return _anonymous;
|
||||||
|
|
|
||||||
55
Services/EmailService.cs
Normal file
55
Services/EmailService.cs
Normal file
|
|
@ -0,0 +1,55 @@
|
||||||
|
using System.Net;
|
||||||
|
using System.Net.Mail;
|
||||||
|
using AuthorBuddy.Web.Models;
|
||||||
|
|
||||||
|
namespace AuthorBuddy.Web.Services;
|
||||||
|
|
||||||
|
public class EmailService : IEmailService
|
||||||
|
{
|
||||||
|
private readonly SmtpSettings _settings;
|
||||||
|
|
||||||
|
public EmailService(SmtpSettings settings)
|
||||||
|
{
|
||||||
|
_settings = settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool IsConfigured => _settings.Enabled
|
||||||
|
&& !string.IsNullOrEmpty(_settings.Host)
|
||||||
|
&& !string.IsNullOrEmpty(_settings.FromAddress);
|
||||||
|
|
||||||
|
public async Task<bool> SendPasswordAsync(string recipientEmail, string recipientName, string newPassword)
|
||||||
|
{
|
||||||
|
if (!IsConfigured) return false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using var client = new SmtpClient(_settings.Host, _settings.Port)
|
||||||
|
{
|
||||||
|
EnableSsl = _settings.UseSsl,
|
||||||
|
Credentials = string.IsNullOrEmpty(_settings.Username)
|
||||||
|
? null
|
||||||
|
: new NetworkCredential(_settings.Username, _settings.Password)
|
||||||
|
};
|
||||||
|
|
||||||
|
using var msg = new MailMessage
|
||||||
|
{
|
||||||
|
From = new MailAddress(_settings.FromAddress, _settings.FromName),
|
||||||
|
Subject = "Ihr Author-Buddy-Passwort",
|
||||||
|
Body = $"Hallo {recipientName},\n\n"
|
||||||
|
+ $"Ihr neues Passwort für Author Buddy lautet:\n\n"
|
||||||
|
+ $" {newPassword}\n\n"
|
||||||
|
+ $"Bitte ändern Sie es nach dem Login.\n\n"
|
||||||
|
+ $"Mit freundlichen Grüßen\nIhr Author-Buddy-Team",
|
||||||
|
IsBodyHtml = false
|
||||||
|
};
|
||||||
|
msg.To.Add(recipientEmail);
|
||||||
|
|
||||||
|
await client.SendMailAsync(msg);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -21,5 +21,8 @@ public interface IAuthService
|
||||||
Task<List<UserEntity>> GetAllUsersAsync();
|
Task<List<UserEntity>> GetAllUsersAsync();
|
||||||
Task<bool> SetUserActiveAsync(int userId, bool active);
|
Task<bool> SetUserActiveAsync(int userId, bool active);
|
||||||
Task<bool> DeleteUserAsync(int userId);
|
Task<bool> DeleteUserAsync(int userId);
|
||||||
|
Task<bool> CreateUserAsync(string username, string password, string email, List<UserRole> roles);
|
||||||
|
Task<bool> UpdateUserAsync(int userId, string? email, List<UserRole>? roles);
|
||||||
|
Task<string> ResetPasswordAsync(int userId);
|
||||||
UserEntity? CurrentUser { get; }
|
UserEntity? CurrentUser { get; }
|
||||||
}
|
}
|
||||||
|
|
|
||||||
10
Services/IChatService.cs
Normal file
10
Services/IChatService.cs
Normal file
|
|
@ -0,0 +1,10 @@
|
||||||
|
using AuthorBuddy.Web.Data;
|
||||||
|
|
||||||
|
namespace AuthorBuddy.Web.Services;
|
||||||
|
|
||||||
|
public interface IChatService
|
||||||
|
{
|
||||||
|
Task<List<ChatEntity>> GetHistoryAsync(int userId);
|
||||||
|
Task AddMessageAsync(ChatEntity message);
|
||||||
|
Task ClearHistoryAsync(int userId);
|
||||||
|
}
|
||||||
7
Services/IEmailService.cs
Normal file
7
Services/IEmailService.cs
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
namespace AuthorBuddy.Web.Services;
|
||||||
|
|
||||||
|
public interface IEmailService
|
||||||
|
{
|
||||||
|
Task<bool> SendPasswordAsync(string recipientEmail, string recipientName, string newPassword);
|
||||||
|
bool IsConfigured { get; }
|
||||||
|
}
|
||||||
|
|
@ -77,6 +77,16 @@ public interface ISettingsService
|
||||||
Task SaveTechGlossarTempAsync(double temp);
|
Task SaveTechGlossarTempAsync(double temp);
|
||||||
Task SaveTechQualitaetTempAsync(double temp);
|
Task SaveTechQualitaetTempAsync(double temp);
|
||||||
Task SaveTechRisikoTempAsync(double temp);
|
Task SaveTechRisikoTempAsync(double temp);
|
||||||
|
Task<string?> GetQuickMarkdownPromptAsync();
|
||||||
|
Task SaveQuickMarkdownPromptAsync(string prompt);
|
||||||
|
Task<double> GetQuickMarkdownTempAsync();
|
||||||
|
Task SaveQuickMarkdownTempAsync(double temp);
|
||||||
|
|
||||||
|
Task<string?> GetChatPromptAsync();
|
||||||
|
Task SaveChatPromptAsync(string prompt);
|
||||||
|
Task<double> GetChatTempAsync();
|
||||||
|
Task SaveChatTempAsync(double temp);
|
||||||
|
|
||||||
Task<string?> GetLanguageAsync();
|
Task<string?> GetLanguageAsync();
|
||||||
Task SaveLanguageAsync(string language);
|
Task SaveLanguageAsync(string language);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
using System.Diagnostics;
|
||||||
using AuthorBuddy.Web.Models;
|
using AuthorBuddy.Web.Models;
|
||||||
|
|
||||||
namespace AuthorBuddy.Web.Services;
|
namespace AuthorBuddy.Web.Services;
|
||||||
|
|
@ -7,6 +8,8 @@ public class OllamaService : IOllamaService
|
||||||
private readonly IEnumerable<ILLMBackend> _backends;
|
private readonly IEnumerable<ILLMBackend> _backends;
|
||||||
private readonly OllamaSettings _settings;
|
private readonly OllamaSettings _settings;
|
||||||
private readonly OperationState _opState;
|
private readonly OperationState _opState;
|
||||||
|
private readonly object _startLock = new();
|
||||||
|
private bool _startAttempted;
|
||||||
|
|
||||||
public OllamaService(IEnumerable<ILLMBackend> backends, OllamaSettings settings, OperationState opState)
|
public OllamaService(IEnumerable<ILLMBackend> backends, OllamaSettings settings, OperationState opState)
|
||||||
{
|
{
|
||||||
|
|
@ -18,6 +21,53 @@ public class OllamaService : IOllamaService
|
||||||
private ILLMBackend ActiveBackend =>
|
private ILLMBackend ActiveBackend =>
|
||||||
_backends.FirstOrDefault(b => b.Name == _settings.Backend) ?? _backends.First();
|
_backends.FirstOrDefault(b => b.Name == _settings.Backend) ?? _backends.First();
|
||||||
|
|
||||||
|
private async Task EnsureRunningAsync()
|
||||||
|
{
|
||||||
|
if (ActiveBackend.Name != "Ollama")
|
||||||
|
return;
|
||||||
|
|
||||||
|
var reachable = await ActiveBackend.TestConnectionAsync();
|
||||||
|
if (reachable)
|
||||||
|
return;
|
||||||
|
|
||||||
|
lock (_startLock)
|
||||||
|
{
|
||||||
|
if (_startAttempted)
|
||||||
|
return;
|
||||||
|
_startAttempted = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
_opState.SetThought("Ollama läuft nicht – starte ollama serve...");
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var psi = new ProcessStartInfo("ollama", "serve")
|
||||||
|
{
|
||||||
|
CreateNoWindow = true,
|
||||||
|
UseShellExecute = false
|
||||||
|
};
|
||||||
|
Process.Start(psi);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_opState.AppendThought($" Fehler: {ex.Message}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 30; i++)
|
||||||
|
{
|
||||||
|
await Task.Delay(1000);
|
||||||
|
reachable = await ActiveBackend.TestConnectionAsync();
|
||||||
|
if (reachable)
|
||||||
|
{
|
||||||
|
_opState.AppendThought(" Ollama ist bereit");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
_opState.AppendThought(".");
|
||||||
|
}
|
||||||
|
|
||||||
|
_opState.AppendThought(" Zeitüberschreitung");
|
||||||
|
}
|
||||||
|
|
||||||
public void Reconfigure(string url)
|
public void Reconfigure(string url)
|
||||||
{
|
{
|
||||||
_settings.OllamaUrl = url;
|
_settings.OllamaUrl = url;
|
||||||
|
|
@ -25,8 +75,9 @@ public class OllamaService : IOllamaService
|
||||||
|
|
||||||
public async Task<(bool Success, long LatencyMs)> TestConnectionAsync()
|
public async Task<(bool Success, long LatencyMs)> TestConnectionAsync()
|
||||||
{
|
{
|
||||||
|
await EnsureRunningAsync();
|
||||||
_opState.SetThought($"Teste Verbindung zu {ActiveBackend.Name}...");
|
_opState.SetThought($"Teste Verbindung zu {ActiveBackend.Name}...");
|
||||||
var sw = System.Diagnostics.Stopwatch.StartNew();
|
var sw = Stopwatch.StartNew();
|
||||||
var result = await ActiveBackend.TestConnectionAsync();
|
var result = await ActiveBackend.TestConnectionAsync();
|
||||||
sw.Stop();
|
sw.Stop();
|
||||||
_opState.AppendThought(result ? " OK" : " Fehlgeschlagen");
|
_opState.AppendThought(result ? " OK" : " Fehlgeschlagen");
|
||||||
|
|
@ -35,6 +86,7 @@ public class OllamaService : IOllamaService
|
||||||
|
|
||||||
public async Task<IEnumerable<LLM_Model>> GetLocalModelsAsync()
|
public async Task<IEnumerable<LLM_Model>> GetLocalModelsAsync()
|
||||||
{
|
{
|
||||||
|
await EnsureRunningAsync();
|
||||||
_opState.SetThought($"Lade Modelle von {ActiveBackend.Name}...");
|
_opState.SetThought($"Lade Modelle von {ActiveBackend.Name}...");
|
||||||
var models = await ActiveBackend.GetModelsAsync();
|
var models = await ActiveBackend.GetModelsAsync();
|
||||||
_opState.AppendThought($" {models.Count()} gefunden");
|
_opState.AppendThought($" {models.Count()} gefunden");
|
||||||
|
|
@ -43,47 +95,56 @@ public class OllamaService : IOllamaService
|
||||||
|
|
||||||
public async Task<bool> TestEmbeddingAsync(string model)
|
public async Task<bool> TestEmbeddingAsync(string model)
|
||||||
{
|
{
|
||||||
|
await EnsureRunningAsync();
|
||||||
return ActiveBackend.TestEmbedding(model);
|
return ActiveBackend.TestEmbedding(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<float[]> GetEmbeddingAsync(string text)
|
public async Task<float[]> GetEmbeddingAsync(string text)
|
||||||
{
|
{
|
||||||
|
await EnsureRunningAsync();
|
||||||
return await ActiveBackend.GetEmbeddingAsync(text, _settings.EmbedModel);
|
return await ActiveBackend.GetEmbeddingAsync(text, _settings.EmbedModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<string> QuickSpellCheckAsync(string text)
|
public async Task<string> QuickSpellCheckAsync(string text)
|
||||||
{
|
{
|
||||||
|
await EnsureRunningAsync();
|
||||||
return await Chat(_settings.SpellingModel, text, _settings.SpellingPrompt, _settings.SpellingTemp);
|
return await Chat(_settings.SpellingModel, text, _settings.SpellingPrompt, _settings.SpellingTemp);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<string> StreamStyleCheckAsync(string text)
|
public async Task<string> StreamStyleCheckAsync(string text)
|
||||||
{
|
{
|
||||||
|
await EnsureRunningAsync();
|
||||||
return await Chat(_settings.StyleModel, text, _settings.LektorSystemPrompt, _settings.LektorTemp);
|
return await Chat(_settings.StyleModel, text, _settings.LektorSystemPrompt, _settings.LektorTemp);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<string> AnswerBasedOnFactsAsync(string question, string facts)
|
public async Task<string> AnswerBasedOnFactsAsync(string question, string facts)
|
||||||
{
|
{
|
||||||
|
await EnsureRunningAsync();
|
||||||
var prompt = _settings.GetFactCheckPrompt(question, facts);
|
var prompt = _settings.GetFactCheckPrompt(question, facts);
|
||||||
return await Chat(_settings.EmbedModel, prompt, temperature: _settings.FactCheckTemp);
|
return await Chat(_settings.EmbedModel, prompt, temperature: _settings.FactCheckTemp);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<bool> ModelExistsAsync(string model)
|
public async Task<bool> ModelExistsAsync(string model)
|
||||||
{
|
{
|
||||||
|
await EnsureRunningAsync();
|
||||||
return await ActiveBackend.ModelExistsAsync(model);
|
return await ActiveBackend.ModelExistsAsync(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<(bool Success, int ContextWindow)> GetModelContextWindowAsync(string model)
|
public async Task<(bool Success, int ContextWindow)> GetModelContextWindowAsync(string model)
|
||||||
{
|
{
|
||||||
|
await EnsureRunningAsync();
|
||||||
return await ActiveBackend.GetModelContextWindowAsync(model);
|
return await ActiveBackend.GetModelContextWindowAsync(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<long> MeasureLatencyAsync(string model)
|
public async Task<long> MeasureLatencyAsync(string model)
|
||||||
{
|
{
|
||||||
|
await EnsureRunningAsync();
|
||||||
return await ActiveBackend.MeasureLatencyAsync(model);
|
return await ActiveBackend.MeasureLatencyAsync(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<string> Chat(string model, string userMessage, string? systemPrompt = null, double? temperature = null)
|
public async Task<string> Chat(string model, string userMessage, string? systemPrompt = null, double? temperature = null)
|
||||||
{
|
{
|
||||||
|
await EnsureRunningAsync();
|
||||||
_opState.SetThought($"{ActiveBackend.Name}: Sende Anfrage an {model}...");
|
_opState.SetThought($"{ActiveBackend.Name}: Sende Anfrage an {model}...");
|
||||||
var result = await ActiveBackend.ChatAsync(model, userMessage, systemPrompt, temperature);
|
var result = await ActiveBackend.ChatAsync(model, userMessage, systemPrompt, temperature);
|
||||||
_opState.AppendThought(" Fertig");
|
_opState.AppendThought(" Fertig");
|
||||||
|
|
@ -92,6 +153,7 @@ public class OllamaService : IOllamaService
|
||||||
|
|
||||||
public async Task ChatStream(string model, string userMessage, Func<string, Task> onToken, string? systemPrompt = null, double? temperature = null)
|
public async Task ChatStream(string model, string userMessage, Func<string, Task> onToken, string? systemPrompt = null, double? temperature = null)
|
||||||
{
|
{
|
||||||
|
await EnsureRunningAsync();
|
||||||
_opState.SetThought($"{ActiveBackend.Name}: Verbinde mit Modell {model}...");
|
_opState.SetThought($"{ActiveBackend.Name}: Verbinde mit Modell {model}...");
|
||||||
|
|
||||||
int tokenCount = 0;
|
int tokenCount = 0;
|
||||||
|
|
@ -107,6 +169,7 @@ public class OllamaService : IOllamaService
|
||||||
|
|
||||||
public async Task<bool> PullModelAsync(string modelName, IProgress<string> progress)
|
public async Task<bool> PullModelAsync(string modelName, IProgress<string> progress)
|
||||||
{
|
{
|
||||||
|
await EnsureRunningAsync();
|
||||||
_opState.SetThought($"Lade Modell {modelName}...");
|
_opState.SetThought($"Lade Modell {modelName}...");
|
||||||
var result = await ActiveBackend.PullModelAsync(modelName, progress);
|
var result = await ActiveBackend.PullModelAsync(modelName, progress);
|
||||||
_opState.AppendThought(result ? " Erfolgreich" : " Fehlgeschlagen");
|
_opState.AppendThought(result ? " Erfolgreich" : " Fehlgeschlagen");
|
||||||
|
|
|
||||||
|
|
@ -41,6 +41,10 @@ public class SettingsService : ISettingsService
|
||||||
private const string KeyTechGlossarTemp = "tech_glossar_temp";
|
private const string KeyTechGlossarTemp = "tech_glossar_temp";
|
||||||
private const string KeyTechQualitaetTemp = "tech_qualitaet_temp";
|
private const string KeyTechQualitaetTemp = "tech_qualitaet_temp";
|
||||||
private const string KeyTechRisikoTemp = "tech_risiko_temp";
|
private const string KeyTechRisikoTemp = "tech_risiko_temp";
|
||||||
|
private const string KeyQuickMarkdownPrompt = "quick_md_prompt";
|
||||||
|
private const string KeyQuickMarkdownTemp = "quick_md_temp";
|
||||||
|
private const string KeyChatPrompt = "chat_prompt";
|
||||||
|
private const string KeyChatTemp = "chat_temp";
|
||||||
private const string KeyLanguage = "language";
|
private const string KeyLanguage = "language";
|
||||||
|
|
||||||
private const string KeyLastProjectId = "last_project_id";
|
private const string KeyLastProjectId = "last_project_id";
|
||||||
|
|
@ -346,6 +350,42 @@ public class SettingsService : ISettingsService
|
||||||
return Task.CompletedTask;
|
return Task.CompletedTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Task<string?> GetQuickMarkdownPromptAsync() => Task.FromResult(Get(KeyQuickMarkdownPrompt));
|
||||||
|
|
||||||
|
public Task SaveQuickMarkdownPromptAsync(string prompt)
|
||||||
|
{
|
||||||
|
Set(KeyQuickMarkdownPrompt, prompt);
|
||||||
|
_ollamaConfig.QuickMarkdownPrompt = prompt;
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<double> GetQuickMarkdownTempAsync() => Task.FromResult(double.TryParse(Get(KeyQuickMarkdownTemp), out var v) ? v : _ollamaConfig.QuickMarkdownTemp);
|
||||||
|
|
||||||
|
public Task SaveQuickMarkdownTempAsync(double temp)
|
||||||
|
{
|
||||||
|
Set(KeyQuickMarkdownTemp, temp.ToString("F1"));
|
||||||
|
_ollamaConfig.QuickMarkdownTemp = temp;
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<string?> GetChatPromptAsync() => Task.FromResult(Get(KeyChatPrompt));
|
||||||
|
|
||||||
|
public Task SaveChatPromptAsync(string prompt)
|
||||||
|
{
|
||||||
|
Set(KeyChatPrompt, prompt);
|
||||||
|
_ollamaConfig.ChatPrompt = prompt;
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<double> GetChatTempAsync() => Task.FromResult(double.TryParse(Get(KeyChatTemp), out var v) ? v : _ollamaConfig.ChatTemp);
|
||||||
|
|
||||||
|
public Task SaveChatTempAsync(double temp)
|
||||||
|
{
|
||||||
|
Set(KeyChatTemp, temp.ToString("F1"));
|
||||||
|
_ollamaConfig.ChatTemp = temp;
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
public Task SaveTechLastenheftPromptAsync(string prompt)
|
public Task SaveTechLastenheftPromptAsync(string prompt)
|
||||||
{
|
{
|
||||||
Set(KeyTechLastenheft, prompt);
|
Set(KeyTechLastenheft, prompt);
|
||||||
|
|
@ -479,7 +519,7 @@ public class SettingsService : ISettingsService
|
||||||
var user = new UserEntity
|
var user = new UserEntity
|
||||||
{
|
{
|
||||||
Name = name,
|
Name = name,
|
||||||
Role = hasUsers ? UserRole.Author : UserRole.Administrator
|
Roles = new List<UserRole> { hasUsers ? UserRole.Author : UserRole.Administrator }
|
||||||
};
|
};
|
||||||
col.Insert(user);
|
col.Insert(user);
|
||||||
return Task.FromResult(user);
|
return Task.FromResult(user);
|
||||||
|
|
@ -498,7 +538,7 @@ public class SettingsService : ISettingsService
|
||||||
var all = users.FindAll().OrderBy(u => u.Id).ToList();
|
var all = users.FindAll().OrderBy(u => u.Id).ToList();
|
||||||
if (all.Count > 0)
|
if (all.Count > 0)
|
||||||
{
|
{
|
||||||
all[0].Role = UserRole.Administrator;
|
all[0].Roles = new List<UserRole> { UserRole.Administrator };
|
||||||
foreach (var u in all)
|
foreach (var u in all)
|
||||||
{
|
{
|
||||||
u.IsActive = true;
|
u.IsActive = true;
|
||||||
|
|
@ -506,20 +546,20 @@ public class SettingsService : ISettingsService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var authorExists = all.Any(u => u.Name == "Author");
|
//var authorExists = all.Any(u => u.Name == "Author");
|
||||||
if (!authorExists)
|
//if (!authorExists)
|
||||||
{
|
//{
|
||||||
var authorUser = new UserEntity
|
// var authorUser = new UserEntity
|
||||||
{
|
// {
|
||||||
Name = "Author",
|
// Name = "Author",
|
||||||
PasswordHash = TotpHelper.HashPassword("author123"),
|
// PasswordHash = TotpHelper.HashPassword("author123"),
|
||||||
TwoFactorEnabled = false,
|
// TwoFactorEnabled = false,
|
||||||
TwoFactorSecret = string.Empty,
|
// TwoFactorSecret = string.Empty,
|
||||||
Role = UserRole.Author,
|
// Role = UserRole.Author,
|
||||||
IsActive = true
|
// IsActive = true
|
||||||
};
|
// };
|
||||||
users.Insert(authorUser);
|
// users.Insert(authorUser);
|
||||||
}
|
//}
|
||||||
|
|
||||||
var projects = _db.GetCollection<ProjectEntity>("projects");
|
var projects = _db.GetCollection<ProjectEntity>("projects");
|
||||||
var orphaned = projects.Find(p => p.UserId == 0).ToList();
|
var orphaned = projects.Find(p => p.UserId == 0).ToList();
|
||||||
|
|
|
||||||
|
|
@ -5,5 +5,15 @@
|
||||||
"Microsoft.AspNetCore": "Warning"
|
"Microsoft.AspNetCore": "Warning"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AllowedHosts": "*"
|
"AllowedHosts": "*",
|
||||||
|
"Smtp": {
|
||||||
|
"Host": "",
|
||||||
|
"Port": 587,
|
||||||
|
"Username": "",
|
||||||
|
"Password": "",
|
||||||
|
"FromAddress": "",
|
||||||
|
"FromName": "Author Buddy",
|
||||||
|
"UseSsl": true,
|
||||||
|
"Enabled": false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
394
wwwroot/app.css
394
wwwroot/app.css
|
|
@ -743,9 +743,40 @@ button.primary {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.settings-tabs {
|
||||||
|
display: flex;
|
||||||
|
gap: 0;
|
||||||
|
border-bottom: 2px solid var(--accent-color);
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-tab {
|
||||||
|
padding: 10px 24px;
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
border-bottom: none;
|
||||||
|
background: var(--menu-bg);
|
||||||
|
color: var(--text-color);
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: bold;
|
||||||
|
margin-right: 4px;
|
||||||
|
border-radius: 4px 4px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-tab:hover {
|
||||||
|
background: var(--accent-color);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-tab.active {
|
||||||
|
background: var(--accent-color);
|
||||||
|
color: white;
|
||||||
|
border-color: var(--accent-color);
|
||||||
|
}
|
||||||
|
|
||||||
.settings-layout {
|
.settings-layout {
|
||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 1fr 2fr 2fr;
|
grid-template-columns: 1fr 2fr;
|
||||||
gap: 16px;
|
gap: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -753,6 +784,11 @@ button.primary {
|
||||||
min-width: 0;
|
min-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.settings-column-wide {
|
||||||
|
min-width: 0;
|
||||||
|
grid-column: 2;
|
||||||
|
}
|
||||||
|
|
||||||
.settings-column .form-group textarea {
|
.settings-column .form-group textarea {
|
||||||
min-height: 120px;
|
min-height: 120px;
|
||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
|
|
@ -1401,3 +1437,359 @@ button.primary {
|
||||||
.modal-dialog.modal-sm {
|
.modal-dialog.modal-sm {
|
||||||
max-width: 400px;
|
max-width: 400px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* QuickMarkdown page */
|
||||||
|
.qm-container {
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qm-layout {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr 1fr;
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qm-input-panel,
|
||||||
|
.qm-output-panel {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qm-textarea {
|
||||||
|
width: 100%;
|
||||||
|
resize: vertical;
|
||||||
|
padding: 8px;
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
background: var(--input-bg, var(--editor-bg));
|
||||||
|
color: var(--text-color);
|
||||||
|
font-size: 13px;
|
||||||
|
font-family: inherit;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qm-prompt {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qm-output {
|
||||||
|
font-family: monospace;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qm-notice {
|
||||||
|
margin-top: 12px;
|
||||||
|
padding: 8px;
|
||||||
|
background: var(--card-bg);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qm-range-labels {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
font-size: 11px;
|
||||||
|
color: var(--border-color);
|
||||||
|
margin-top: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qm-prompt-actions {
|
||||||
|
display: flex;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Chat page */
|
||||||
|
.chat-page {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 12px 16px;
|
||||||
|
border-bottom: 1px solid var(--border-color);
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-header h3 {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-header-actions {
|
||||||
|
display: flex;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-settings {
|
||||||
|
padding: 12px 16px;
|
||||||
|
border-bottom: 1px solid var(--border-color);
|
||||||
|
background: var(--card-bg);
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-settings .form-group {
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-settings .form-group:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-settings-textarea {
|
||||||
|
width: 100%;
|
||||||
|
resize: vertical;
|
||||||
|
padding: 6px 8px;
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
background: var(--input-bg, var(--editor-bg));
|
||||||
|
color: var(--text-color);
|
||||||
|
font-size: 12px;
|
||||||
|
font-family: monospace;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-messages {
|
||||||
|
flex: 1;
|
||||||
|
overflow-y: auto;
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-empty {
|
||||||
|
text-align: center;
|
||||||
|
color: var(--border-color);
|
||||||
|
font-style: italic;
|
||||||
|
padding: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message {
|
||||||
|
display: flex;
|
||||||
|
gap: 10px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-avatar {
|
||||||
|
width: 32px;
|
||||||
|
height: 32px;
|
||||||
|
border-radius: 50%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 14px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-user .chat-avatar {
|
||||||
|
background: var(--accent-color);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-assistant .chat-avatar {
|
||||||
|
background: var(--border-color);
|
||||||
|
color: var(--text-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-bubble {
|
||||||
|
padding: 10px 14px;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.5;
|
||||||
|
max-width: 75%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-user .chat-bubble {
|
||||||
|
background: var(--accent-color);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-assistant .chat-bubble {
|
||||||
|
background: var(--card-bg);
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-assistant .chat-bubble strong {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-assistant .chat-bubble em {
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-thinking {
|
||||||
|
min-width: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-input {
|
||||||
|
display: flex;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 12px 16px;
|
||||||
|
border-top: 1px solid var(--border-color);
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-textarea {
|
||||||
|
flex: 1;
|
||||||
|
resize: none;
|
||||||
|
padding: 8px;
|
||||||
|
border: 1px solid var(--border-color);
|
||||||
|
background: var(--input-bg, var(--editor-bg));
|
||||||
|
color: var(--text-color);
|
||||||
|
font-size: 14px;
|
||||||
|
font-family: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-input button {
|
||||||
|
align-self: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Responsive: Tablets */
|
||||||
|
@media (max-width: 1024px) {
|
||||||
|
.sidebar {
|
||||||
|
width: 200px;
|
||||||
|
min-width: 120px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-layout {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qm-layout {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-bubble {
|
||||||
|
max-width: 85%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Responsive: Phones */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
body {
|
||||||
|
overflow: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.sidebar {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-content {
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.detail-panel {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qm-layout {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qm-container {
|
||||||
|
padding: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.qm-textarea {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-settings,
|
||||||
|
.chat-settings-toggle {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-header {
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
gap: 8px;
|
||||||
|
padding: 8px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-header-actions {
|
||||||
|
width: 100%;
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-messages {
|
||||||
|
padding: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-bubble {
|
||||||
|
max-width: 90%;
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-input {
|
||||||
|
padding: 8px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-textarea {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-layout {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.settings-page {
|
||||||
|
padding: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
input, select, textarea, button {
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
padding: 10px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-small, .btn-sm {
|
||||||
|
padding: 8px 12px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.modal-dialog {
|
||||||
|
min-width: unset;
|
||||||
|
width: 95%;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Responsive: Small phones */
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
.chat-header h3 {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-avatar {
|
||||||
|
width: 28px;
|
||||||
|
height: 28px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-bubble {
|
||||||
|
padding: 8px 10px;
|
||||||
|
max-width: 95%;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-message {
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chat-empty {
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.usermanagement-table th,
|
||||||
|
.usermanagement-table td {
|
||||||
|
padding: 6px 8px;
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.usermanagement-actions {
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue