import { api, del, patch, post, put, qs, uploadFile } from "./client"; import type { Artifact, ArtifactType, BillingStatus, CalendarItem, ChatMessage, ChatSummary, Doc, DocDetail, Job, LibraryVoice, Notebook, NotebookSummary, Page, Platform, Quota, ResurfaceItem, Settings, SocialAccounts, Source, TopicDetail, TopicMap, Usage, Voice, Delivery, VoiceProfileData, VoiceState, } from "./types"; type SourceJob = { source: Source; job: Job }; export const sourcesApi = { list: () => api("/api/sources"), connect: (url: string) => post("/api/sources", { url }), importUrl: (url: string) => post("/api/sources/url", { url }), importFile: async (file: File) => { const { upload_id } = await uploadFile(file); return post("/api/sources/upload", { upload_id }); }, sync: (id: string) => post(`/api/sources/${id}/sync`), remove: (id: string) => del<{ ok: true; removed_posts: number }>(`/api/sources/${id}`), }; export const docsApi = { list: (p: { q?: string; source_id?: string; limit?: number; offset?: number } = {}) => api>(`/api/documents${qs(p)}`), get: (id: string) => api(`/api/documents/${id}`), remove: (id: string) => del(`/api/documents/${id}`), }; export const notebooksApi = { list: () => api("/api/notebooks"), get: (id: string) => api(`/api/notebooks/${id}`), create: (title: string, document_ids: string[] = [], description?: string) => post<{ id: string; title: string; added: number }>("/api/notebooks", { title, document_ids, description }), fromTopic: (topicId: string) => post<{ id: string; title: string }>(`/api/notebooks/from-topic/${topicId}`), update: (id: string, body: { title?: string; description?: string }) => patch(`/api/notebooks/${id}`, body), remove: (id: string) => del(`/api/notebooks/${id}`), addDocs: (id: string, document_ids: string[]) => post<{ added: number }>(`/api/notebooks/${id}/documents`, { document_ids }), removeDoc: (id: string, docId: string) => del(`/api/notebooks/${id}/documents/${docId}`), artifacts: (id: string) => api(`/api/notebooks/${id}/artifacts`), chats: (id: string) => api(`/api/notebooks/${id}/chats`), messages: (chatId: string) => api(`/api/notebooks/chats/${chatId}/messages`), removeChat: (chatId: string) => del(`/api/notebooks/chats/${chatId}`), }; export type GenerateBody = { type: ArtifactType; notebook_id?: string; document_id?: string; format?: "deep_dive" | "brief" | "debate"; minutes?: number; style?: "short" | "explainer" | "audiogram"; audio_artifact_id?: string; slides?: { heading: string; body: string }[]; parent_id?: string; }; export const artifactsApi = { list: (p: { type?: string; notebook_id?: string; document_id?: string; status?: string; q?: string; limit?: number; offset?: number } = {}) => api>(`/api/artifacts${qs(p)}`), get: (id: string) => api(`/api/artifacts/${id}`), generate: (body: GenerateBody) => post("/api/artifacts/generate", body), update: (id: string, body: { title?: string; content?: Record }) => patch(`/api/artifacts/${id}`, body), remove: (id: string) => del(`/api/artifacts/${id}`), retry: (id: string) => post(`/api/artifacts/${id}/retry`), }; export const jobsApi = { active: () => api("/api/jobs?active=1"), recent: (kind?: string) => api(`/api/jobs${qs({ kind, limit: 10 })}`), get: (id: string) => api(`/api/jobs/${id}`), }; export const topicsApi = { map: () => api("/api/topics"), get: (id: string) => api(`/api/topics/${id}`), rebuild: (full = false) => post(`/api/topics/rebuild${qs({ full })}`), }; export const voiceApi = { get: () => api("/api/voice"), update: (body: { profile?: VoiceProfileData; host_voices?: Partial<{ host_a: string; host_b: string }>; delivery?: Partial<{ host_a: Delivery; host_b: Delivery }>; }) => put("/api/voice", body), build: (document_ids: string[]) => post("/api/voice/build", { document_ids }), voices: () => api("/api/voice/voices"), consent: async (files: File[], consent_text: string, remove_background_noise: boolean) => { const upload_ids = []; for (const f of files) upload_ids.push((await uploadFile(f)).upload_id); return post("/api/voice/consent", { upload_ids, agreed: true, consent_text, remove_background_noise }); }, library: (p: { search?: string; gender?: string; age?: string; accent?: string; language?: string; use_case?: string; page?: number }) => api<{ voices: LibraryVoice[]; has_more: boolean }>(`/api/voice/library${qs(p)}`), addFromLibrary: (v: LibraryVoice, use_as?: "host_a" | "host_b") => post("/api/voice/library/add", { public_owner_id: v.public_owner_id, voice_id: v.voice_id, name: v.name, use_as, }), preview: (voice_id: string, opts: { text?: string; host?: "host_a" | "host_b"; delivery?: Delivery } = {}) => post<{ url: string; seconds: number }>("/api/voice/preview", { voice_id, ...opts }), readingScript: () => api<{ title: string; text: string; words: number }>("/api/voice/reading-script"), quota: () => api("/api/voice/quota"), revoke: () => del("/api/voice/consent"), }; export type ItemBody = { platform: Platform; scheduled_at: string; content: string; thread?: string[]; artifact_id?: string | null; document_id?: string | null; social_account_id?: string | null; remind_by_email?: boolean; draft?: boolean; }; export const launchpadApi = { items: (p: { start?: string; end?: string; status?: string } = {}) => api(`/api/calendar${qs(p)}`), create: (body: ItemBody) => post("/api/calendar", body), update: (id: string, body: Partial & { status?: "scheduled" | "draft" }) => patch(`/api/calendar/${id}`, body), remove: (id: string) => del(`/api/calendar/${id}`), publishNow: (id: string) => post(`/api/calendar/${id}/publish`), accounts: () => api("/api/social/accounts"), connectBluesky: (handle: string, app_password: string) => post("/api/social/bluesky", { handle, app_password }), startOAuth: (platform: "x" | "linkedin") => post<{ url: string }>(`/api/social/${platform}/start`), completeOAuth: (ticket: string) => post("/api/social/complete", { ticket }), disconnect: (id: string) => del(`/api/social/accounts/${id}`), }; export const resurfaceApi = { get: () => api<{ evergreen: ResurfaceItem[]; on_this_day: ResurfaceItem[]; unscored: number; total_posts: number }>( "/api/resurface", ), scan: () => post("/api/resurface/scan"), }; export type SettingsPatch = { name?: string; workspace_name?: string; brand_name?: string; brand_accent?: string; logo_upload_id?: string; training_opt_in?: boolean; email_unsubscribed?: boolean; }; export const settingsApi = { get: () => api("/api/settings"), update: (body: SettingsPatch) => patch("/api/settings", body), usage: () => api("/api/settings/usage"), }; export type BillingCycle = "monthly" | "annual"; export const billingApi = { status: () => api("/api/billing/status"), checkout: (plan: string, cycle: BillingCycle) => post<{ url: string }>("/api/billing/checkout", { plan, cycle }), portal: () => post<{ url: string }>("/api/billing/portal"), confirm: (sessionId: string) => post("/api/billing/confirm", { session_id: sessionId }), };