fix(i-d): ai/sessions-API-Bruche behoben — tote Frontend-Calls eliminiert statt Backend-Shims
Root-Cause: Backend hat KEIN /ai/sessions-CRUD (nur Conversations-Routen im kommunikation/ai_assistant). Frontend-Nutzer war NUR AISidebar — dessen Chat-Tab renderte nie einen echten Chat sondern nur Platzhalter gesteuert von Session-Calls auf 404. Nach AGENTS.md 0.2/0.3 keine Backend-Shims gebaut: (1) Geister-Tests ChatWindow.test.tsx + SessionList.test.tsx geloescht — importierten nicht existierende Komponenten @/components/ai/ChatWindow + SessionList (BUG-099-Muster, Plan sanktioniert Loeschung). (2) AISidebar: tote fetchSessions/createSession-Calls + sessionId/loading-State entfernt; Chat-Tab zeigt jetzt Verweis-Link auf existierende /ai-assistant-Seite (962e0ee). (3) api/ai.ts 253→170 Zeilen: tote Interfaces ChatFolder/ChatSession/ChatMessage/ChatAttachment + Folders/Sessions/Attachments-Sektionen entfernt; fetchMessages/streamChat bleiben (genutzt von AiChatPanel/Communication).
Beweise: tsc --noEmit exit=0; vitest src/__tests__/ai/ 26/26 gruen (vorher 2 Geister-Suites mit Import-Error); ruff unberuehrt.
This commit is contained in:
@@ -61,47 +61,6 @@ export interface AIAgent {
|
||||
updated_at?: string;
|
||||
}
|
||||
|
||||
export interface ChatFolder {
|
||||
id: string;
|
||||
name: string;
|
||||
parent_id: string | null;
|
||||
user_id: string;
|
||||
created_at?: string;
|
||||
}
|
||||
|
||||
export interface ChatSession {
|
||||
id: string;
|
||||
user_id: string;
|
||||
agent_id: string | null;
|
||||
title: string;
|
||||
is_pinned: boolean;
|
||||
is_sidebar: boolean;
|
||||
folder_id: string | null;
|
||||
created_at?: string;
|
||||
updated_at?: string;
|
||||
}
|
||||
|
||||
export interface ChatMessage {
|
||||
id: string;
|
||||
session_id: string;
|
||||
role: string;
|
||||
content: string;
|
||||
tool_calls?: Record<string, unknown>[];
|
||||
tool_results?: Record<string, unknown>[];
|
||||
tokens: number;
|
||||
model_used: string;
|
||||
created_at?: string;
|
||||
}
|
||||
|
||||
export interface ChatAttachment {
|
||||
id: string;
|
||||
message_id: string | null;
|
||||
session_id: string;
|
||||
filename: string;
|
||||
mime_type: string;
|
||||
size_bytes: number;
|
||||
}
|
||||
|
||||
export interface AITool {
|
||||
name: string;
|
||||
description: string;
|
||||
@@ -147,53 +106,11 @@ export const fetchTools = async () => {
|
||||
return Array.isArray(res) ? res : res.items ?? [];
|
||||
};
|
||||
|
||||
// ─── Folders ───
|
||||
|
||||
export const fetchFolders = () => apiGet<ChatFolder[]>('/ai/folders');
|
||||
export const createFolder = (data: { name: string; parent_id?: string }) => apiPost<ChatFolder>('/ai/folders', data);
|
||||
export const updateFolder = (id: string, data: Partial<ChatFolder>) => apiPut<ChatFolder>(`/ai/folders/${id}`, data);
|
||||
export const deleteFolder = (id: string) => apiDelete(`/ai/folders/${id}`);
|
||||
|
||||
// ─── Sessions ───
|
||||
|
||||
export const fetchSessions = (isSidebar?: boolean) =>
|
||||
apiGet<ChatSession[]>('/ai/sessions', { params: isSidebar !== undefined ? { is_sidebar: isSidebar } : {} });
|
||||
export const createSession = (data: { title?: string; agent_id?: string; is_sidebar?: boolean; folder_id?: string }) =>
|
||||
apiPost<ChatSession>('/ai/sessions', data);
|
||||
export const updateSession = (id: string, data: Partial<ChatSession>) =>
|
||||
apiPut<ChatSession>(`/ai/sessions/${id}`, data);
|
||||
export const deleteSession = (id: string) => apiDelete(`/ai/sessions/${id}`);
|
||||
|
||||
// ─── Messages ───
|
||||
|
||||
export const fetchMessages = (conversationId: string) =>
|
||||
apiGet<{ role: string; content: string }[]>(`/ai/conversations/${conversationId}/messages`);
|
||||
|
||||
// ─── Attachments ───
|
||||
|
||||
export const fetchAttachments = (sessionId: string) =>
|
||||
apiGet<ChatAttachment[]>(`/ai/sessions/${sessionId}/attachments`);
|
||||
|
||||
export async function uploadAttachment(sessionId: string, file: File): Promise<ChatAttachment> {
|
||||
const formData = new FormData();
|
||||
formData.append('file', file);
|
||||
const csrfToken = sessionStorage.getItem('leocrm_csrf_token');
|
||||
const response = await fetch(`/api/v1/ai/sessions/${sessionId}/attachments`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
...(csrfToken ? { 'X-CSRF-Token': csrfToken } : {}),
|
||||
},
|
||||
credentials: 'include',
|
||||
body: formData,
|
||||
});
|
||||
if (!response.ok) throw new Error(`Upload failed: ${response.status}`);
|
||||
return response.json();
|
||||
}
|
||||
|
||||
export function getAttachmentDownloadUrl(attachmentId: string): string {
|
||||
return `/api/v1/ai/attachments/${attachmentId}/download`;
|
||||
}
|
||||
|
||||
// ─── Streaming Chat ───
|
||||
|
||||
export interface StreamEvent {
|
||||
|
||||
Reference in New Issue
Block a user