diff --git a/.gitignore b/.gitignore
index c4ca33a..a8020b6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,7 @@
-/bin/
-/data/
-/obj/
-/publish/
-/Temp/
-/appsettings.Production.json
-/DEVY.md
+bin/
+data/
+obj/
+publish/
+Temp/
+appsettings.Production.json
+DEVY.md
diff --git a/TODO.md b/TODO.md
index 85ccf2f..1faba47 100644
--- a/TODO.md
+++ b/TODO.md
@@ -21,6 +21,7 @@
- [x] Wenn gerade gestreamt wird und man refreshed die Seite, dann verliert das Frontend den Status "Streaming..." und ich kann eine Nachricht schreiben, obwohl das nicht möglich sein sollte
- [x] Größere Tasks brechen irgendwann ab, könnte an der Limitierung von Antrophic/Claude liegen. Jedoch sollte wird es scheinbar nicht behandelt: Der Status bleibt auf "Streaming..." aber es passiert nichts mehr
- [x] Session -> Chat öffnen im Frontend soll nicht möglich sein, wenn kein Agent gesetzt ist
+- [ ] Falsche Nachrichten anzahl im Dashboard (tool uses werden fälschicherweise mitgezählt) - dasselbe bei "Ältere Nachrichten laden" im Chat
## Backend
- [x] System-Prompt anpassen. Explizit auf Workspace-Pfad hinweisen, weil Model halluziniert oft und will in den nicht vorhandenen Pfad /workspace wechseln
diff --git a/WindowsApp/App.xaml b/WindowsApp/App.xaml
new file mode 100644
index 0000000..3ac2bad
--- /dev/null
+++ b/WindowsApp/App.xaml
@@ -0,0 +1,5 @@
+
+
diff --git a/WindowsApp/App.xaml.cs b/WindowsApp/App.xaml.cs
new file mode 100644
index 0000000..18edfd3
--- /dev/null
+++ b/WindowsApp/App.xaml.cs
@@ -0,0 +1,5 @@
+using System.Windows;
+
+namespace Gott;
+
+public partial class App : Application { }
diff --git a/WindowsApp/Gott.csproj b/WindowsApp/Gott.csproj
new file mode 100644
index 0000000..23880ee
--- /dev/null
+++ b/WindowsApp/Gott.csproj
@@ -0,0 +1,21 @@
+
+
+
+ WinExe
+ net10.0-windows
+ true
+ Gott
+ Gott
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/WindowsApp/MainWindow.xaml b/WindowsApp/MainWindow.xaml
new file mode 100644
index 0000000..15cea57
--- /dev/null
+++ b/WindowsApp/MainWindow.xaml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
diff --git a/WindowsApp/MainWindow.xaml.cs b/WindowsApp/MainWindow.xaml.cs
new file mode 100644
index 0000000..005cfe9
--- /dev/null
+++ b/WindowsApp/MainWindow.xaml.cs
@@ -0,0 +1,72 @@
+using System;
+using System.IO;
+using System.Text.Json;
+using System.Windows;
+using Microsoft.Web.WebView2.Core;
+
+namespace Gott;
+
+public partial class MainWindow : Window
+{
+ private readonly AppSettings _settings;
+
+ public MainWindow()
+ {
+ _settings = LoadSettings();
+
+ InitializeComponent();
+
+ var screenW = SystemParameters.PrimaryScreenWidth;
+ var screenH = SystemParameters.PrimaryScreenHeight;
+ Width = 930;
+ Height = screenH * 0.95;
+ Left = (screenW - Width) / 2;
+ Top = (screenH - Height) / 2;
+
+ Loaded += async (_, _) =>
+ {
+ await webView.EnsureCoreWebView2Async();
+
+ // Dark background to avoid white flash
+ webView.DefaultBackgroundColor = System.Drawing.Color.FromArgb(255, 17, 17, 17);
+
+ // Open external links in default browser
+ webView.CoreWebView2.NewWindowRequested += (_, e) =>
+ {
+ e.Handled = true;
+ System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo(e.Uri) { UseShellExecute = true });
+ };
+
+ webView.CoreWebView2.NavigationCompleted += (_, _) =>
+ {
+ webView.Visibility = Visibility.Visible;
+ loader.Visibility = Visibility.Collapsed;
+ };
+
+ webView.CoreWebView2.Navigate(_settings.Url);
+ };
+ }
+
+ private static AppSettings LoadSettings()
+ {
+ foreach (var file in new[] { "appsettings.Production.json", "appsettings.json" })
+ {
+ var path = Path.Combine(AppContext.BaseDirectory, file);
+ if (File.Exists(path))
+ {
+ try
+ {
+ var json = File.ReadAllText(path);
+ return JsonSerializer.Deserialize(json) ?? new();
+ }
+ catch { }
+ }
+ }
+ return new();
+ }
+}
+
+public class AppSettings
+{
+ public string Url { get; set; } = "http://localhost:19000";
+}
diff --git a/WindowsApp/appsettings.json b/WindowsApp/appsettings.json
new file mode 100644
index 0000000..d39f3a0
--- /dev/null
+++ b/WindowsApp/appsettings.json
@@ -0,0 +1,3 @@
+{
+ "Url": "http://localhost:19000"
+}
diff --git a/wwwroot/css/chat.css b/wwwroot/css/chat.css
index 33a402e..8467fdf 100644
--- a/wwwroot/css/chat.css
+++ b/wwwroot/css/chat.css
@@ -308,7 +308,7 @@
display: flex;
flex-shrink: 0;
align-items: center;
- margin: var(--badge-spacing) var(--badge-spacing) var(--page-spacing);
+ margin: var(--badge-spacing);
gap: var(--badge-spacing);
}
@@ -357,7 +357,7 @@
top: var(--badge-spacing);
opacity: 0;
transition: opacity var(--transition-duration);
- padding: .15em .35em;
+ padding: .1em .3em;
font-size: var(--font-size);
background: var(--f2-bg);
border: var(--border-width) solid var(--f2-border);
@@ -366,11 +366,11 @@
}
.msg-reply-btn {
- right: calc(var(--badge-spacing) + 4em + var(--badge-spacing) * 2);
+ right: calc(var(--badge-spacing) + 4em + var(--badge-spacing));
}
.msg-delete-btn {
- right: calc(var(--badge-spacing) + 2em + var(--badge-spacing));
+ right: calc(var(--badge-spacing) + 2em + var(--badge-spacing) / 2);
}
.msg-mark-btn {
@@ -380,13 +380,7 @@
.msg:hover .msg-reply-btn,
.msg:hover .msg-delete-btn,
.msg:hover .msg-mark-btn {
- opacity: var(--semi-transparent);
-}
-
-.msg-reply-btn:hover,
-.msg-delete-btn:hover,
-.msg-mark-btn:hover {
- opacity: 1 !important;
+ opacity: 1;
}
.msg-mark-btn.marked {
diff --git a/wwwroot/css/mobile.css b/wwwroot/css/mobile.css
index 8b41958..63e599a 100644
--- a/wwwroot/css/mobile.css
+++ b/wwwroot/css/mobile.css
@@ -3,9 +3,6 @@
.msg, .tool-box {
max-width: 100%;
}
- .input-area {
- margin-bottom: var(--badge-spacing);
- }
.fe-sidebar {
width: 100px;
min-width: 100px;