corpus integrity UI: Ingest Health section in SettingsPanel, corpus API types

This commit is contained in:
2026-04-30 21:54:39 +00:00
parent 3d0a2168f1
commit 3101df3846
2 changed files with 117 additions and 0 deletions
+43
View File
@@ -11,6 +11,29 @@ async function request<T>(path: string, options?: RequestInit): Promise<T> {
return res.json();
}
export interface IngestFailure {
source: string;
filepath: string;
error: string;
retry_count: number;
first_failed_at: string;
last_failed_at: string;
}
export interface CorpusStatus {
filesystem: number;
pgvector: number;
graphiti: number;
failures: IngestFailure[];
failure_count: number;
last_reconciliation: {
timestamp: string;
gaps: number;
auto_queued: number;
} | null;
}
export const api = {
getSettings: () => request<Settings>('/settings'),
updateSettings: (s: Partial<Settings>) =>
@@ -38,6 +61,26 @@ export const api = {
updateMemory: (content: string) =>
request<{ saved: boolean }>('/memory', { method: 'POST', body: JSON.stringify({ content }) }),
getStatus: () => request<Status>('/status'),
getCorpusStatus: async (): Promise<CorpusStatus> => {
const r = await fetch('/api/corpus/status');
return r.json();
},
retryIngestFailure: async (source: string): Promise<{queued: boolean}> => {
const r = await fetch('/api/corpus/retry', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({source}),
});
return r.json();
},
runReconciliation: async (): Promise<{started: boolean}> => {
const r = await fetch('/api/corpus/reconcile', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({fix: true}),
});
return r.json();
},
reindex: () => request<{ started: boolean }>('/reindex', { method: 'POST' }),
getDreamerStatus: () => request<DreamerStatus>('/dreamer/status'),
runDreamer: (mode: string, task?: string) =>