var __defProp = Object.defineProperty; var __name = (target, value) => __defProp(target, "name", { value, configurable: true });

// api.js var CEREBRAS_MODEL = "gpt-oss-120b"; var CEREBRAS_API_URL = "https://api.cerebras.ai/v1/chat/completions"; var MAX_HISTORY_LENGTH = 50; var HISTORY_TTL = 60 * 60 * 24 * 30; async function handleChatRequest(request, env) { try { const { message, sessionId = "default" } = await request.json(); if (!message || typeof message !== "string" || message.trim().length === 0) { return jsonResponse({ error: "Invalid message" }, 400); } let history = []; if (env.AI_KV) { const historyKey = chat:${sessionId}; const storedHistory = await env.AI_KV.get(historyKey); if (storedHistory) { try { history = JSON.parse(storedHistory); } catch (e) { console.error("Failed to parse history:", e); history = []; } } } const messages = [ { role: "system", content: You are a helpful AI assistant powered by Cerebras GPT-OSS-120B. Format your responses using markdown. Be concise yet thorough. If asked to generate code, use proper syntax highlighting. If asked to create HTML, provide clean, modern code. }, ...history.slice(-20).map(([role, content]) => ({ role, content })), { role: "user", content: message } ]; let reply; if (!env.CEREBRAS_API_KEY) { reply = `\u{1F916} Demo Mode Response

I received your message: "${message}"

To enable real AI responses:

  1. Add your Cerebras API key in Cloudflare Workers settings
  2. Set it as a secret named: \CEREBRAS_API_KEY\\
  3. Get your API key from cerebras.ai

Features available:

Failed to get response from Cerebras API. Error: ${apiError.message}

Please check your API key and try again.; } } const newHistory = [...history, ["user", message], ["assistant", reply]]; if (newHistory.length > MAX_HISTORY_LENGTH * 2) { newHistory.splice(0, newHistory.length - MAX_HISTORY_LENGTH * 2); } if (env.AI_KV) { const historyKey = chat:${sessionId}; await env.AI_KV.put(historyKey, JSON.stringify(newHistory), { expirationTtl: HISTORY_TTL }); await updateSessionMetadata(env, sessionId, newHistory.length / 2); } return jsonResponse({ reply, sessionId, timestamp: (/* @__PURE__ */ new Date()).toISOString(), messageCount: newHistory.length / 2 }); } catch (error) { console.error("Chat request error:", error); return jsonResponse({ error: "Failed to process chat request", details: error.message }, 500); } } __name(handleChatRequest, "handleChatRequest"); async function handleHistoryRequest(request, env) { try { const url = new URL(request.url); const sessionId = url.searchParams.get("session") || "default"; if (!env.AI_KV) { return jsonResponse({ history: [], sessionId }); } const historyKey = chat:${sessionId}; const storedHistory = await env.AI_KV.get(historyKey); let history = []; if (storedHistory) { try { history = JSON.parse(storedHistory); } catch (e) { console.error("Failed to parse history:", e); } } return jsonResponse({ history, sessionId, messageCount: history.length / 2 }); } catch (error) { console.error("History request error:", error); return jsonResponse({ error: "Failed to retrieve history", history: [], sessionId: "default" }, 500); } } __name(handleHistoryRequest, "handleHistoryRequest"); async function handleClearHistory(request, env) { try { const { sessionId = "default" } = await request.json(); if (!env.AI_KV) { return jsonResponse({ success: true }); } const historyKey = chat:${sessionId}`; await env.AI_KV.delete(historyKey); await updateSessionMetadata(env, sessionId, 0); return jsonResponse({ success: true, sessionId, message: "History cleared successfully" }); } catch (error) { console.error("Clear history error:", error); return jsonResponse({ error: "Failed to clear history", success: false }, 500); } } __name(handleClearHistory, "handleClearHistory"); async function updateSessionMetadata(env, sessionId, messageCount) { if (!env.AI_KV) return; try { const sessionsKey = "sessions:list"; const sessionsData = await env.AI_KV.get(sessionsKey); let sessions = sessionsData ? JSON.parse(sessionsData) : []; const sessionIndex = sessions.findIndex((s) => s.id === sessionId); if (sessionIndex >= 0) { sessions[sessionIndex].lastUsed = Date.now(); sessions[sessionIndex].messageCount = messageCount; } else if (sessionId === "default") { sessions.push({ id: "default", name: "Default Chat", created: Date.now(), lastUsed: Date.now(), messageCount }); } await env.AI_KV.put(sessionsKey, JSON.stringify(sessions), { expirationTtl: HISTORY_TTL }); } catch (e) { console.error("Failed to update session metadata:", e); } } __name(updateSessionMetadata, "updateSessionMetadata"); function jsonResponse(data, status = 200) { return new Response(JSON.stringify(data), { status, headers: { "Content-Type": "application/json", "Cache-Control": "no-cache" } }); } __name(jsonResponse, "jsonResponse");

// sessions.js var MAX_SESSIONS = 20; var SESSION_TTL = 60 * 60 * 24 * 30; async function handleSessionsList(request, env) { try { const userId = request.user?.userId || "default"; if (!env.AI_KV) { return jsonResponse2({ sessions: [] }); } const sessionsKey = userId !== "default" ? sessions:user:${userId} : "sessions:list"; const sessionsData = await env.AI_KV.get(sessionsKey); let sessions = []; if (sessionsData) { try { sessions = JSON.parse(sessionsData); } catch (e) { console.error("Failed to parse sessions:", e); } } sessions.sort((a, b) => { return (b.lastUsed || 0) - (a.lastUsed || 0); }); return jsonResponse2({ sessions }); } catch (error) { console.error("List sessions error:", error); return jsonResponse2({ error: "Failed to list sessions", sessions: [] // Return empty array on error, no default session }, 500); } } __name(handleSessionsList, "handleSessionsList"); async function handleNewSession(request, env) { try { const { name } = await request.json(); if (!name || typeof name !== "string" || name.trim().length === 0) { return jsonResponse2({ error: "Session name is required" }, 400); } const sessionId = session_${Date.now()}_${Math.random().toString(36).substr(2, 9)}; const session = { id: sessionId, name: name.trim(), created: Date.now(), lastUsed: Date.now(), messageCount: 0 }; if (!env.AI_KV) { return jsonResponse2({ session }); } const userId = request.user?.userId || "default"; const sessionsKey = userId !== "default" ? sessions:user:${userId} : "sessions:list"; const sessionsData = await env.AI_KV.get(sessionsKey); let sessions = sessionsData ? JSON.parse(sessionsData) : []; sessions.push(session); if (sessions.length > MAX_SESSIONS) { sessions.sort((a, b) => { return (b.lastUsed || 0) - (a.lastUsed || 0); }); const toRemove = sessions.slice(MAX_SESSIONS); for (const oldSession of toRemove) { await env.AI_KV.delete(chat:${oldSession.id}); } sessions = sessions.slice(0, MAX_SESSIONS); } await env.AI_KV.put(sessionsKey, JSON.stringify(sessions), { expirationTtl: SESSION_TTL }); return jsonResponse2({ session, message: "Session created successfully" }); } catch (error) { console.error("New session error:", error); return jsonResponse2({ error: "Failed to create session", details: error.message }, 500); } } __name(handleNewSession, "handleNewSession"); async function handleDeleteSession(request, env) { try { const { sessionId } = await request.json(); if (!sessionId) { return jsonResponse2({ error: "Session ID is required" }, 400); } if (!env.AI_KV) { return jsonResponse2({ success: true }); } const userId = request.user?.userId || "default"; const sessionsKey = userId !== "default" ? sessions:user:${userId} : "sessions:list"; const sessionsData = await env.AI_KV.get(sessionsKey); let sessions = sessionsData ? JSON.parse(sessionsData) : []; sessions = sessions.filter((s) => s.id !== sessionId); await env.AI_KV.delete(chat:${sessionId}); await env.AI_KV.put(sessionsKey, JSON.stringify(sessions), { expirationTtl: SESSION_TTL }); return jsonResponse2({ success: true, message: "Session deleted successfully" }); } catch (error) { console.error("Delete session error:", error); return jsonResponse2({ error: "Failed to delete session", details: error.message }, 500); } } __name(handleDeleteSession, "handleDeleteSession"); async function handleSwitchSession(request, env) { try { const { sessionId } = await request.json(); if (!sessionId) { return jsonResponse2({ error: "Session ID is required" }, 400); } if (env.AI_KV) { const userId = request.user?.userId || "default"; const sessionsKey = userId !== "default" ? sessions:user:${userId} : "sessions:list"; const sessionsData = await env.AI_KV.get(sessionsKey); if (sessionsData) { let sessions = JSON.parse(sessionsData); const sessionIndex = sessions.findIndex((s) => s.id === sessionId); if (sessionIndex >= 0) { sessions[sessionIndex].lastUsed = Date.now(); await env.AI_KV.put(sessionsKey, JSON.stringify(sessions), { expirationTtl: SESSION_TTL }); } } } return jsonResponse2({ success: true, sessionId, message: "Switched to session successfully" }); } catch (error) { console.error("Switch session error:", error); return jsonResponse2({ error: "Failed to switch session", details: error.message }, 500); } } __name(handleSwitchSession, "handleSwitchSession"); function jsonResponse2(data, status = 200) { return new Response(JSON.stringify(data), { status, headers: { "Content-Type": "application/json", "Cache-Control": "no-cache" } }); } __name(jsonResponse2, "jsonResponse");