Date: 30/01/2026 Status: TERMINE
connectors-api/src/db/supabase.tsSTORAGE_URL (derive de SUPABASE_URL)storage a l'objet supabase avec methodes :createBucket(name, {public}) - creation bucket (ignore 409)upload(bucket, path, buffer, contentType) - upload binaire avec upsertcreateSignedUrl(bucket, path, expiresIn) - URL signee temporairegetPublicUrl(bucket, path) - URL publiqueremove(bucket, paths[]) - suppression fichiersis optionnel a la methode update() pour filtrer IS NULLconnectors-api/src/services/ai.tsdownloadJobFile(jobId, filename, userId) exportee{ buffer, contentType } ou nullconnectors-api/src/services/aiChat.tsdownloadJobFile depuis ./aiMIME_TYPES + helper getMimeType(filename)uploadJobOutputToStorage(jobId, outputResult, userId, conversationId)output_files ou download_urlai-outputsai_attachments avec message_id=nullexecuteToolCall : ajout parametre conversationIdai_job : upload vers Storage si fichiers, fallback sur download_urlsendMessage :conversationId a executeToolCallai_attachments orphelins avec message_idconnectors-api/src/index.tsai-outputs au startup (apres syncBuiltinTypes)GET /api/ai/attachments/:id/url (refresh signed URL)GET /api/ai/conversations/:id/attachments (liste attachments)connectors-front/src/components/ai/ChatMessages.tsxrenderMessageContent() pour messages assistantFichier genere: URL dans le contenu<img> pour images, <audio> pour audio, <video> pour videoFILE_SIZE_LIMIT dans config Supabase Storage (defaut 50MB)