spb/zyquo-cloud-web Public MIT
Zyquo Cloud Web — every cloud model, one beautiful chat, entirely in your browser.
TypeScript 81.9%
CSS 8.9%
JavaScript 7.5%
Shell 1.1%
HTML 0.6%
1/*2 * exporters.ts3 * Zyquo Cloud Web4 *5 * Author: Simon-Pierre Boucher6 * Mail: contact@spboucher.ai7 *8 * Single-conversation exports (Markdown / JSON) and the all-data backup9 * download — client-side file downloads, no server.10 */1112import { exportAll } from '../storage/backup'13import type { Conversation } from '../types'1415function download(filename: string, content: string, type: string): void {16 const blob = new Blob([content], { type })17 const url = URL.createObjectURL(blob)18 const a = document.createElement('a')19 a.href = url20 a.download = filename21 a.click()22 URL.revokeObjectURL(url)23}2425function safeName(title: string): string {26 return title.replace(/[/\\:*?"<>|]/g, '-').slice(0, 80)27}2829export function exportConversationMarkdown(conversation: Conversation): void {30 const lines: string[] = [`# ${conversation.title}`, '']31 lines.push(`*Model: ${conversation.modelID} (${conversation.provider})*`, '')32 if (conversation.systemPrompt) {33 lines.push(`> **System:** ${conversation.systemPrompt}`, '')34 }35 for (const message of conversation.messages) {36 const label = message.role === 'user' ? '**You**' : `**Assistant** (${message.modelID ?? ''})`37 lines.push(`${label}:`, '', message.text, '')38 if (message.citations && message.citations.length > 0) {39 lines.push(40 ...message.citations.map((c) => `[${c.index}]: ${c.url}${c.title ? ` "${c.title}"` : ''}`),41 ''42 )43 }44 }45 download(`${safeName(conversation.title)}.md`, lines.join('\n'), 'text/markdown')46}4748export function exportConversationJSON(conversation: Conversation): void {49 download(50 `${safeName(conversation.title)}.json`,51 JSON.stringify(conversation, null, 2),52 'application/json'53 )54}5556export async function downloadBackup(includeKeys: boolean): Promise<void> {57 const data = await exportAll(includeKeys)58 const stamp = new Date().toISOString().slice(0, 10)59 download(`zyquo-cloud-backup-${stamp}.json`, JSON.stringify(data, null, 2), 'application/json')60}61