fleet-memory/hindsight-control-plane/src/lib/api.ts
2025-12-01 18:44:49 +01:00

155 lines
3.8 KiB
TypeScript

/**
* Client for calling Control Plane API routes (which proxy to the dataplane via SDK)
* This should be used in client components, not the SDK directly
*/
export class ControlPlaneClient {
private async fetchApi<T>(path: string, options?: RequestInit): Promise<T> {
const response = await fetch(path, {
...options,
headers: {
'Content-Type': 'application/json',
...options?.headers,
},
});
if (!response.ok) {
const error = await response.text();
throw new Error(`API Error: ${response.status} - ${error}`);
}
return response.json();
}
/**
* List all banks
*/
async listBanks() {
return this.fetchApi<{ banks: any[] }>('/api/banks', { cache: 'no-store' as RequestCache });
}
/**
* Recall memories
*/
async recall(params: {
query: string;
types?: string[];
bank_id: string;
budget?: string;
max_tokens?: number;
trace?: boolean;
}) {
return this.fetchApi('/api/recall', {
method: 'POST',
body: JSON.stringify(params),
});
}
/**
* Reflect and generate answer
*/
async reflect(params: {
query: string;
bank_id: string;
budget?: string;
context?: string;
include_facts?: boolean;
}) {
return this.fetchApi('/api/reflect', {
method: 'POST',
body: JSON.stringify(params),
});
}
/**
* Retain memories (batch)
*/
async retain(params: {
bank_id: string;
items: Array<{
content: string;
timestamp?: string;
context?: string;
}>;
document_id?: string;
async?: boolean;
}) {
const endpoint = params.async ? '/api/memories/retain_async' : '/api/memories/retain';
return this.fetchApi(endpoint, {
method: 'POST',
body: JSON.stringify(params),
});
}
/**
* Get bank statistics
*/
async getBankStats(bankId: string) {
return this.fetchApi(`/api/stats/${bankId}`);
}
/**
* Get graph data
*/
async getGraph(params: { bank_id: string; type?: string }) {
const queryParams = new URLSearchParams();
queryParams.append('bank_id', params.bank_id);
if (params.type) queryParams.append('type', params.type);
return this.fetchApi(`/api/graph?${queryParams}`);
}
/**
* List operations
*/
async listOperations(bankId: string) {
return this.fetchApi(`/api/operations/${bankId}`);
}
/**
* List entities
*/
async listEntities(params: { bank_id: string; limit?: number }) {
const queryParams = new URLSearchParams();
queryParams.append('bank_id', params.bank_id);
if (params.limit) queryParams.append('limit', params.limit.toString());
return this.fetchApi(`/api/entities?${queryParams}`);
}
/**
* Get entity details
*/
async getEntity(entityId: string, bankId: string) {
return this.fetchApi(`/api/entities/${entityId}?bank_id=${bankId}`);
}
/**
* Regenerate entity observations
*/
async regenerateEntityObservations(entityId: string, bankId: string) {
return this.fetchApi(`/api/entities/${entityId}/regenerate?bank_id=${bankId}`, {
method: 'POST',
});
}
/**
* List documents
*/
async listDocuments(params: { bank_id: string; q?: string; limit?: number; offset?: number }) {
const queryParams = new URLSearchParams();
queryParams.append('bank_id', params.bank_id);
if (params.q) queryParams.append('q', params.q);
if (params.limit) queryParams.append('limit', params.limit.toString());
if (params.offset) queryParams.append('offset', params.offset.toString());
return this.fetchApi(`/api/documents?${queryParams}`);
}
/**
* Get document
*/
async getDocument(documentId: string, bankId: string) {
return this.fetchApi(`/api/documents/${documentId}?bank_id=${bankId}`);
}
}
// Export singleton instance
export const client = new ControlPlaneClient();