SPB Git

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%
2.0 KB · 61 lines typescript
Raw Blame History
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