feat: add database support, conversation sidebar, and improve chat streaming

- Update .gitignore to exclude database files, extensions, and .cursor directory
- Enhance chat streaming API with safe enqueue and close functions to prevent errors
- Integrate ConversationSidebar component into ClientHome for better UI
- Add dependencies like better-sqlite3 and esbuild packages for database functionality

This commit introduces database persistence for conversations, improves error handling in streaming responses, and adds a sidebar for managing chats, enhancing overall app robustness and user experience.
This commit is contained in:
Evandro Fonseca Junior committed 2025-10-28 14:14:07 -03:00
1 parent a3f8226fda
commit 0cc7a81319
34 files changed
+2370 -198

No files matched your search

+30 -12
View File
@@ -14,6 +14,30 @@ export async function POST(req: NextRequest) {
const stream = new ReadableStream({
async start(controller) {
let isClosed = false;
const safeEnqueue = (data: string) => {
if (!isClosed) {
try {
controller.enqueue(new TextEncoder().encode(data));
} catch (error) {
console.error("Error enqueuing data:", error);
isClosed = true;
}
}
};
const safeClose = () => {
if (!isClosed) {
try {
controller.close();
isClosed = true;
} catch (error) {
console.error("Error closing controller:", error);
}
}
};
try {
const ollamaMessages = convertToOllamaMessages(messages);
const response = await chatWithStream(
@@ -26,24 +50,18 @@ export async function POST(req: NextRequest) {
for await (const chunk of response) {
const token = chunk.message?.content || "";
if (token) {
controller.enqueue(
new TextEncoder().encode(JSON.stringify({ token }) + "\n")
);
safeEnqueue(JSON.stringify({ token }) + "\n");
}
}
controller.enqueue(
new TextEncoder().encode(JSON.stringify({ done: true }) + "\n")
);
controller.close();
safeEnqueue(JSON.stringify({ done: true }) + "\n");
safeClose();
} catch (error) {
console.error("Chat streaming error:", error);
controller.enqueue(
new TextEncoder().encode(
JSON.stringify({ error: "Failed to generate response" }) + "\n"
)
safeEnqueue(
JSON.stringify({ error: "Failed to generate response" }) + "\n"
);
controller.close();
safeClose();
}
},
});