- Neuer POST /api/backup Endpoint (BackupEndpoint.cs)
- Packt gott.db in data/backup/gott-{timestamp}.tar.gz
- Gibt Archiv gleichzeitig als Download an Client zurück
- Button 'Datenbank sichern' im Header-Dropdown-Menü
- Content-Disposition Header-Parsing mit filename* UTF-8 Support
149 lines
3.9 KiB
JavaScript
149 lines
3.9 KiB
JavaScript
// ── 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);
|
|
}
|