// ── API Calls ── async function apiChat(messages, sessionId) { return fetch('/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ messages, sessionId }) }); } // ── Agent API ── async function apiGetAgents() { const resp = await fetch('/api/agents'); return resp.json(); } async function apiGetAgent(agentId) { const resp = await fetch(`/api/agents/${agentId}`); if (!resp.ok) return null; return resp.json(); } async function apiCreateAgent(data) { const resp = await fetch('/api/agents', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); return resp.json(); } async function apiUpdateAgent(agentId, data) { const resp = await fetch(`/api/agents/${agentId}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); return resp.json(); } async function apiDeleteAgent(agentId) { return fetch(`/api/agents/${agentId}`, { method: 'DELETE' }); } async function apiHistory(sessionId) { const resp = await fetch(`/api/history?sessionId=${sessionId}`); return resp.json(); } async function apiHistoryPoll(sessionId, afterId) { const resp = await fetch(`/api/history/poll?sessionId=${sessionId}&afterId=${afterId}`); return resp.json(); } async function apiArchive(sessionId) { const resp = await fetch(`/api/archive?sessionId=${sessionId}`, { method: 'POST' }); if (resp.status === 204) return null; return resp.json(); } async function apiListArchives(sessionId) { const resp = await fetch(`/api/archives?sessionId=${sessionId}`); return resp.json(); } async function apiGetArchive(archiveId) { const resp = await fetch(`/api/archive/${archiveId}`); return resp.json(); } // ── Session API ── async function apiGetSessions() { const resp = await fetch('/api/sessions'); return resp.json(); } async function apiCreateSession(data = {}) { const resp = await fetch('/api/sessions', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); return resp.json(); } async function apiGetSession(sessionId) { const resp = await fetch(`/api/sessions/${sessionId}`); if (!resp.ok) return null; return resp.json(); } async function apiDeleteSession(sessionId) { return fetch(`/api/sessions/${sessionId}`, { method: 'DELETE' }); } async function apiUpdateSession(sessionId, data) { const resp = await fetch(`/api/sessions/${sessionId}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); return resp.json(); } async function apiExecCommand(sessionId, command) { return fetch(`/api/sessions/${sessionId}/exec`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ command }) }); } async function apiGetSystemPrompt(sessionId) { const resp = await fetch(`/api/sessions/${sessionId}/system-prompt`); if (!resp.ok) throw new Error('System-Prompt konnte nicht geladen werden'); return resp.text(); } async function apiIsStreaming(sessionId) { const resp = await fetch(`/api/sessions/${sessionId}/streaming`); return resp.json(); } async function apiGetChain(chainId) { const resp = await fetch(`/api/chains/${chainId}`); if (!resp.ok) return null; return resp.json(); } async function apiBackupDb() { const resp = await fetch('/api/backup', { method: 'POST' }); if (!resp.ok) throw new Error('Backup fehlgeschlagen'); const blob = await resp.blob(); const cd = resp.headers.get('content-disposition') || ''; const filename = cd.match(/filename\*=UTF-8''(.+?)(?:;|$)/i)?.[1] || cd.match(/filename="?([^";]+)"?/)?.[1] || 'gott-backup.tar.gz'; const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = filename; document.body.appendChild(a); a.click(); a.remove(); URL.revokeObjectURL(url); }