import { del, get, patch, post } from './client'; export interface TradeQuota { day: string; resetsAt: string; used: number; plan: string; /** `-1` quand l'offre est illimitée (Platinium). */ limit: number; unlimited: boolean; /** `-1` quand l'offre est illimitée : ne rien décompter dans ce cas. */ remaining: number; available: boolean; supportEmail: string; } /** Page du wiki citee sous une reponse. */ export interface TradeSource { title: string; section: string; href: string; } /** Capacité invoquée par l'assistant pour produire une réponse. */ export interface TradeAction { name: string; ok: boolean; } export interface TradeMessage { id: string; role: 'user' | 'assistant'; content: string; sources: TradeSource[]; actions: TradeAction[]; createdAt: string; } export interface TradeConversation { id: string; title: string; createdAt: string; updatedAt: string; messageCount: number; } export interface TradeReply { mode: 'ai' | 'guided' | 'unavailable'; conversationId?: string; conversationTitle?: string; messages?: TradeMessage[]; answer?: string; sources?: TradeSource[]; actions?: TradeAction[]; quota: TradeQuota; } /** * Page proposée au wiki par l'assistant. * * Le wiki publié vit dans les fichiers de traduction et ne bouge qu'au build. * Celles-ci s'écrivent en cours de route, quand une question révèle un trou * dans la documentation — mais elles n'entrent dans le wiki qu'après validation * par un administrateur. */ export interface WikiContribution { id: string; /** Sujet du wiki auquel la page se rattache, ex. `douanes`. */ topic: string; title: string; section: string; body: string; href: string; updatedAt: string; } export type WikiContributionStatus = 'pending' | 'published' | 'rejected'; /** La même page, vue depuis la file de relecture : statut et décision compris. */ export interface WikiContributionReview extends Omit { version: number; locale: string; status: WikiContributionStatus; /** `null` tant que la page n'est pas publiée : le lien pointerait vers du vide. */ href: string | null; reviewedBy: string | null; reviewedAt: string | null; reviewNote: string | null; createdAt: string; } export interface WikiReviewQueue { /** Nombre de pages qui attendent une décision. */ pending: number; contributions: WikiContributionReview[]; } export const getTradeQuota = () => get('/api/v1/trade-assistant/quota'); export const getWikiContributions = (language: string) => get(`/api/v1/trade-assistant/wiki?language=${language}`); /* -------------------------------------------------------------------------- */ /* Relecture (administration) */ /* -------------------------------------------------------------------------- */ export const getWikiReviewQueue = (status?: WikiContributionStatus) => get(`/api/v1/admin/wiki-contributions${status ? `?status=${status}` : ''}`); export const publishWikiContribution = ( id: string, edits: { expectedVersion: number; section?: string; body?: string } ) => post(`/api/v1/admin/wiki-contributions/${id}/publish`, edits); export const rejectWikiContribution = (id: string, expectedVersion: number, note?: string) => post(`/api/v1/admin/wiki-contributions/${id}/reject`, { expectedVersion, note, }); export const getTradeConversations = () => get('/api/v1/trade-assistant/conversations'); export const getTradeMessages = (conversationId: string) => get(`/api/v1/trade-assistant/conversations/${conversationId}`); export const renameTradeConversation = (conversationId: string, title: string) => patch(`/api/v1/trade-assistant/conversations/${conversationId}`, { title }); export const deleteTradeConversation = (conversationId: string) => del(`/api/v1/trade-assistant/conversations/${conversationId}`); export const askTradeQuestion = (question: string, language: string, conversationId?: string) => post('/api/v1/trade-assistant/questions', { question, language, conversationId });