- Agent: Web-Suche als Dropdown (Deaktiviert / 2025 / 2026) statt bool - AnthropicService: web_search Tool dynamisch nach Version einfügen - Stream: server_tool_use + web_search_tool_result Events verarbeiten - Chat-Frontend: web_search_start/end Events mit Suchindikator - Dashboard: Badge zeigt Web-Suche mit Jahresversion - UserRecord: IsAdmin Feld, DB-Migration is_admin Spalte - AuthMiddleware: IsAdmin aus DB laden und in Context setzen - BackupEndpoint: Admin-Check (403 für Nicht-Admins) - AuthEndpoint: isAdmin in Login/Me Response - Frontend: Backup-Section nur für Admins sichtbar - Haiku 4.5 als Model-Option (Agent-Dropdown + ChatEndpoint) - TODO: Cronjobs, Haiku ergänzt
44 lines
1.0 KiB
JavaScript
44 lines
1.0 KiB
JavaScript
// ── Global User State ──
|
|
var currentUser = null;
|
|
|
|
// ── App Init ──
|
|
|
|
document.addEventListener('DOMContentLoaded', async () => {
|
|
// Auth-Check: Eingeloggt?
|
|
var user = await apiMe();
|
|
if (!user) {
|
|
await navigateTo('login', {}, { replace: true });
|
|
return;
|
|
}
|
|
|
|
currentUser = user;
|
|
|
|
const { page, id } = parseHash();
|
|
var target = page === 'login' ? 'dashboard' : page;
|
|
await navigateTo(target, { id }, { replace: true });
|
|
});
|
|
|
|
// Browser Zurück/Vor-Button
|
|
window.addEventListener('popstate', async (e) => {
|
|
var page, id;
|
|
if (e.state && e.state.page) {
|
|
page = e.state.page;
|
|
id = e.state.params ? e.state.params.id : null;
|
|
} else {
|
|
const parsed = parseHash();
|
|
page = parsed.page;
|
|
id = parsed.id;
|
|
}
|
|
|
|
// Login-Seite immer erlauben, alles andere nur wenn eingeloggt
|
|
if (page !== 'login') {
|
|
var user = await apiMe();
|
|
if (!user) {
|
|
await navigateTo('login', {}, { replace: true });
|
|
return;
|
|
}
|
|
}
|
|
|
|
await navigateTo(page, { id }, { replace: true });
|
|
});
|