Web-Suche (Agent-Toggle mit Versionswahl), Admin-only Backup, Haiku 4.5

- 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
This commit is contained in:
Meleki committed 2026-03-02 14:05:59 +01:00
1 parent 485f47b29a
commit 8039b47dec
19 files changed
+155 -20

No files matched your search

+3
View File
@@ -24,6 +24,7 @@ registerPage('agent', {
const useIdentityEl = document.getElementById('agentUseIdentity');
const useUserInfoEl = document.getElementById('agentUseUserInfo');
const useMemoryEl = document.getElementById('agentUseMemory');
const webSearchVersionEl = document.getElementById('agentWebSearchVersion');
const avatarPreview = document.getElementById('avatarPreview');
const avatarInput = document.getElementById('avatarInput');
const avatarBtn = document.getElementById('avatarBtn');
@@ -49,6 +50,7 @@ registerPage('agent', {
useIdentityEl.checked = agent.useIdentity !== false;
useUserInfoEl.checked = agent.useUserInfo !== false;
useMemoryEl.checked = agent.useMemory !== false;
webSearchVersionEl.value = agent.webSearchVersion || '';
_agentAvatarData = agent.avatar || null;
deleteBtn.hidden = false;
@@ -130,6 +132,7 @@ registerPage('agent', {
useIdentity: useIdentityEl.checked,
useUserInfo: useUserInfoEl.checked,
useMemory: useMemoryEl.checked,
webSearchVersion: webSearchVersionEl.value,
avatar: _agentAvatarData,
customCommands: getCommandsFromUI(commandsList)
};
+4
View File
@@ -152,6 +152,10 @@ registerPage('dashboard', {
if (a.useIdentity) badges.push('<span class="badge badge-feature" title="Hat eine Identität (IDENTITY.md)"><i class="fa fa-id-badge"></i> Ich</span>');
if (a.useUserInfo) badges.push('<span class="badge badge-feature" title="Kennt sein Gegenüber (USER.md)"><i class="fa fa-user"></i> Du</span>');
if (a.useMemory) badges.push('<span class="badge badge-feature" title="Auf Erinnerungen zugreifen (Memory-Tools)"><i class="fa fa-database"></i> Erinnerungen</span>');
if (a.webSearchVersion) {
const wsYear = a.webSearchVersion.includes('2025') ? '2025' : '2026';
badges.push(`<span class="badge badge-feature" title="Web-Suche (${wsYear})"><i class="fa fa-search"></i> Web-Suche</span>`);
}
const skills = agentSkillsMap[a.agentId] || [];
for (const skill of skills) {
+1 -1
View File
@@ -22,7 +22,7 @@ registerPage('login', {
return;
}
await apiLogin(username, password);
currentUser = await apiLogin(username, password);
navigateTo('dashboard');
} catch (err) {
errorDiv.textContent = err.message || 'Login fehlgeschlagen';
+6
View File
@@ -39,6 +39,12 @@ registerPage('settings', {
const toolCallSelect = document.getElementById('settingToolCallDisplay');
const chainMetaSelect = document.getElementById('settingChainMetaDisplay');
const resetBtn = document.getElementById('settingsResetBtn');
const backupSection = document.getElementById('settingsBackupSection');
// Backup nur für Admins
if (currentUser && currentUser.isAdmin) {
backupSection.style.display = '';
}
const s = loadSettings();
slider.value = s.pageWidth;