/** * Knowledge API client — Wiki articles/categories/versions, knowledge graph, * and Ask Knowledge. * * All requests use the shared `apiClient` (`baseURL: '/api/v1'`). */ import { apiDelete, apiGet, apiPatch, apiPost } from './client'; // ─── Wiki types ──────────────────────────────────────────────────────────── export type WikiArticleStatus = 'draft' | 'published' | 'archived'; export interface WikiArticle { id: string; title: string; slug: string; content: string; content_html: string | null; summary: string | null; category_id: string | null; tags: string[]; status: WikiArticleStatus; entity_links: Record[]; version: number; published_at: string | null; owner_id: string | null; created_at: string | null; updated_at: string | null; } export interface WikiArticleListResult { items: WikiArticle[]; total: number; page: number; page_size: number; } export interface WikiArticleCreate { title: string; slug?: string; content?: string; summary?: string | null; category_id?: string | null; tags?: string[]; status?: WikiArticleStatus; entity_links?: Record[]; } export interface WikiArticleUpdate { title?: string; content?: string; summary?: string | null; category_id?: string | null; tags?: string[]; status?: WikiArticleStatus; entity_links?: Record[]; edit_comment?: string | null; } export interface WikiCategory { id: string; name: string; slug: string; description: string | null; parent_id: string | null; sort_order: number; } export interface WikiCategoryCreate { name: string; slug?: string; description?: string | null; parent_id?: string | null; sort_order?: number; } export interface WikiVersion { id: string; version: number; title: string; content: string; edited_by: string | null; edit_comment: string | null; created_at: string | null; } // ─── Graph types ─────────────────────────────────────────────────────────── export interface GraphRelationship { id: string; source_type: string; source_id: string; target_type: string; target_id: string; relationship_type: string; metadata: Record | null; owner_id: string | null; created_at: string | null; } export interface GraphRelationshipsResult { items: GraphRelationship[]; total: number; } // ─── Ask Knowledge types ─────────────────────────────────────────────────── export interface KnowledgeAskRequest { query: string; source_types?: string[]; } export interface KnowledgeEvidence { id: string; source_type: string; source_id: string; title: string; snippet: string; score?: number; url?: string | null; } export interface KnowledgeAskResponse { answer: string; evidence: KnowledgeEvidence[]; sources_used?: string[]; } // ─── Wiki API ────────────────────────────────────────────────────────────── export async function fetchWikiArticles(params?: { page?: number; page_size?: number; category_id?: string | null; status?: string | null; search?: string | null; }): Promise { const query = new URLSearchParams(); if (params?.page) query.set('page', String(params.page)); if (params?.page_size) query.set('page_size', String(params.page_size)); if (params?.category_id) query.set('category_id', params.category_id); if (params?.status) query.set('status', params.status); if (params?.search) query.set('search', params.search); const qs = query.toString(); return apiGet(`/wiki/articles${qs ? `?${qs}` : ''}`); } export async function fetchWikiArticle(articleId: string): Promise { return apiGet(`/wiki/articles/${articleId}`); } export async function createWikiArticle(data: WikiArticleCreate): Promise { return apiPost('/wiki/articles', data); } export async function updateWikiArticle(articleId: string, data: WikiArticleUpdate): Promise { return apiPatch(`/wiki/articles/${articleId}`, data); } export async function deleteWikiArticle(articleId: string): Promise { await apiDelete(`/wiki/articles/${articleId}`); } export async function fetchWikiVersions(articleId: string): Promise { const result = await apiGet<{ items: WikiVersion[] }>(`/wiki/articles/${articleId}/versions`); return result.items; } export async function restoreWikiVersion(articleId: string, version: number): Promise { return apiPost(`/wiki/articles/${articleId}/versions/${version}/restore`); } export async function fetchWikiCategories(): Promise { const result = await apiGet<{ items: WikiCategory[] }>('/wiki/categories'); return result.items; } export async function createWikiCategory(data: WikiCategoryCreate): Promise { return apiPost('/wiki/categories', data); } // ─── Graph API ───────────────────────────────────────────────────────────── export async function fetchGraphRelationships(params?: { source_type?: string | null; source_id?: string | null; target_type?: string | null; target_id?: string | null; relationship_type?: string | null; page?: number; page_size?: number; }): Promise { const query = new URLSearchParams(); if (params?.source_type) query.set('source_type', params.source_type); if (params?.source_id) query.set('source_id', params.source_id); if (params?.target_type) query.set('target_type', params.target_type); if (params?.target_id) query.set('target_id', params.target_id); if (params?.relationship_type) query.set('relationship_type', params.relationship_type); if (params?.page) query.set('page', String(params.page)); if (params?.page_size) query.set('page_size', String(params.page_size)); const qs = query.toString(); return apiGet(`/graph/relationships${qs ? `?${qs}` : ''}`); } // ─── Ask Knowledge API ───────────────────────────────────────────────────── export async function askKnowledge(body: KnowledgeAskRequest): Promise { return apiPost('/knowledge/ask', body); }