import type { CreateMemoryInput, CreateMemoryResult, QueryMemoriesResult, GetMemoryResult, UpdateMemoryResult, SubmitFeedbackInput, SubmitFeedbackResult, DetectEnvironmentResult, ExpandCacheKeyResult, Feedback, ActivityLog, } from "@fixonce/shared"; const BASE = "/api"; async function request(url: string, options?: RequestInit): Promise { const res = await fetch(url, { ...options, headers: { "Content-Type": "application/json", ...options?.headers, }, }); if (!res.ok) { const body = await res.json().catch(() => null); const message = body?.error?.reason ?? `Request failed with status ${res.status}`; throw new Error(message); } if (res.status === 204) { return undefined as T; } return res.json() as Promise; } export async function fetchMemories( params: Record, ): Promise { const search = new URLSearchParams(params); return request(`${BASE}/memories?${search.toString()}`); } export async function createMemoryApi( input: Omit, ): Promise { return request(`${BASE}/memories`, { method: "POST", body: JSON.stringify(input), }); } export async function getMemoryApi( id: string, verbosity?: string, ): Promise { const params = verbosity ? `?verbosity=${verbosity}` : ""; return request(`${BASE}/memories/${id}${params}`); } export async function updateMemoryApi( id: string, updates: Record, ): Promise { return request(`${BASE}/memories/${id}`, { method: "PATCH", body: JSON.stringify(updates), }); } export async function deleteMemoryApi(id: string): Promise { return request(`${BASE}/memories/${id}`, { method: "DELETE", }); } export async function submitFeedbackApi( input: SubmitFeedbackInput, ): Promise { return request( `${BASE}/memories/${input.memory_id}/feedback`, { method: "POST", body: JSON.stringify({ text: input.text, tags: input.tags, suggested_action: input.suggested_action, }), }, ); } export async function getFeedbackApi(id: string): Promise { return request(`${BASE}/memories/${id}/feedback`); } export async function getActivityApi( params?: Record, ): Promise { const search = params ? `?${new URLSearchParams(params).toString()}` : ""; return request(`${BASE}/activity${search}`); } export async function detectEnvironmentApi(): Promise { return request(`${BASE}/environment`); } export async function expandCacheKeyApi( key: string, verbosity?: string, ): Promise { const params = verbosity ? `?verbosity=${verbosity}` : ""; return request(`${BASE}/expand/${key}${params}`); } export async function previewDuplicatesApi(input: { title: string; content: string; summary: string; language: string; }): Promise<{ outcome: string; reason: string; target_memory_id?: string; }> { return request(`${BASE}/memories/preview-duplicates`, { method: "POST", body: JSON.stringify(input), }); }