{"version":3,"sources":["../src/index.ts","../src/exporter.ts","../src/png-exporter.ts","../src/loss-checker.ts","../src/charx-exporter.ts","../src/voxta-exporter.ts"],"sourcesContent":["/**\n * @character-foundry/exporter\n *\n * Universal character card exporter - export to PNG, CharX, or Voxta formats.\n */\n\n// Types\nexport type {\n  ExportFormat,\n  ExportAsset,\n  ExportLossReport,\n  ExportOptionsBase,\n  PngExportOptions,\n  CharxExportOptions,\n  VoxtaExportOptions,\n  ExportOptions,\n  ExportResult,\n  PreExportCheck,\n} from './types.js';\n\n// Main exporter\nexport {\n  exportCard,\n  exportCardAsync,\n  getSupportedFormats,\n  getFormatExtension,\n  getFormatMimeType,\n  type ExportCardOptions,\n} from './exporter.js';\n\n// Format-specific exporters\nexport {\n  exportToPng,\n  exportToPngAsync,\n} from './png-exporter.js';\n\nexport {\n  exportToCharx,\n  exportToCharxAsync,\n} from './charx-exporter.js';\n\nexport {\n  exportToVoxta,\n  exportToVoxtaAsync,\n} from './voxta-exporter.js';\n\n// Loss checking\nexport {\n  checkExportLoss,\n  preExportCheck,\n  formatLossReport,\n} from './loss-checker.js';\n","/**\n * Universal Card Exporter\n *\n * Exports character cards to any supported format.\n */\n\nimport type { CCv3Data } from '@character-foundry/schemas';\nimport { FormatNotSupportedError } from '@character-foundry/core';\nimport { exportToPng, exportToPngAsync } from './png-exporter.js';\nimport { exportToCharx, exportToCharxAsync } from './charx-exporter.js';\nimport { exportToVoxta, exportToVoxtaAsync } from './voxta-exporter.js';\nimport type {\n  ExportFormat,\n  ExportAsset,\n  ExportResult,\n  PngExportOptions,\n  CharxExportOptions,\n  VoxtaExportOptions,\n} from './types.js';\n\n/**\n * Options for exportCard function\n */\nexport interface ExportCardOptions {\n  /** Target format */\n  format: ExportFormat;\n  /** Format-specific options */\n  png?: PngExportOptions;\n  charx?: CharxExportOptions;\n  voxta?: VoxtaExportOptions;\n}\n\n/**\n * Export a character card to any supported format\n *\n * @param card - CCv3 card data to export\n * @param assets - Assets to include in export\n * @param options - Export options including target format\n * @returns ExportResult with buffer and metadata\n */\nexport function exportCard(\n  card: CCv3Data,\n  assets: ExportAsset[],\n  options: ExportCardOptions\n): ExportResult {\n  switch (options.format) {\n    case 'png':\n      return exportToPng(card, assets, options.png);\n\n    case 'charx':\n      return exportToCharx(card, assets, options.charx);\n\n    case 'voxta':\n      return exportToVoxta(card, assets, options.voxta);\n\n    default:\n      throw new FormatNotSupportedError(options.format as string);\n  }\n}\n\n/**\n * Async version of exportCard\n */\nexport async function exportCardAsync(\n  card: CCv3Data,\n  assets: ExportAsset[],\n  options: ExportCardOptions\n): Promise<ExportResult> {\n  switch (options.format) {\n    case 'png':\n      return exportToPngAsync(card, assets, options.png);\n\n    case 'charx':\n      return exportToCharxAsync(card, assets, options.charx);\n\n    case 'voxta':\n      return exportToVoxtaAsync(card, assets, options.voxta);\n\n    default:\n      throw new FormatNotSupportedError(options.format as string);\n  }\n}\n\n/**\n * Get supported export formats\n */\nexport function getSupportedFormats(): ExportFormat[] {\n  return ['png', 'charx', 'voxta'];\n}\n\n/**\n * Get file extension for a format\n */\nexport function getFormatExtension(format: ExportFormat): string {\n  switch (format) {\n    case 'png':\n      return 'png';\n    case 'charx':\n      return 'charx';\n    case 'voxta':\n      return 'voxpkg';\n    default:\n      throw new FormatNotSupportedError(format);\n  }\n}\n\n/**\n * Get MIME type for a format\n */\nexport function getFormatMimeType(format: ExportFormat): string {\n  switch (format) {\n    case 'png':\n      return 'image/png';\n    case 'charx':\n    case 'voxta':\n      return 'application/zip';\n    default:\n      throw new FormatNotSupportedError(format);\n  }\n}\n","/**\n * PNG Exporter\n *\n * Exports character cards to PNG format with embedded JSON.\n */\n\nimport type { CCv3Data, CCv2Data } from '@character-foundry/schemas';\nimport { \n  embedIntoPNG, \n  injectTextChunk, \n  removeAllTextChunks \n} from '@character-foundry/png';\nimport { base64Encode, fromString, ValidationError } from '@character-foundry/core';\nimport type { ExportAsset, PngExportOptions, ExportResult } from './types.js';\nimport { checkExportLoss } from './loss-checker.js';\n\n/**\n * Convert CCv3 to CCv2 data format for compatibility\n */\nfunction convertToV2Data(card: CCv3Data): CCv2Data {\n  const data = card.data;\n\n  // Convert character book entries to ensure extensions is not undefined\n  const characterBook = data.character_book ? {\n    ...data.character_book,\n    entries: data.character_book.entries.map((entry) => ({\n      ...entry,\n      extensions: entry.extensions || {},\n    })),\n  } : undefined;\n\n  return {\n    name: data.name,\n    description: data.description,\n    personality: data.personality,\n    scenario: data.scenario,\n    first_mes: data.first_mes,\n    mes_example: data.mes_example,\n    creator_notes: data.creator_notes,\n    system_prompt: data.system_prompt,\n    post_history_instructions: data.post_history_instructions,\n    alternate_greetings: data.alternate_greetings,\n    character_book: characterBook,\n    tags: data.tags,\n    creator: data.creator,\n    character_version: data.character_version,\n    extensions: data.extensions,\n  };\n}\n\n/**\n * Sanitize filename for safe filesystem use\n */\nfunction sanitizeFilename(name: string): string {\n  return name\n    .replace(/[<>:\"/\\\\|?*]/g, '_')\n    .replace(/\\s+/g, '_')\n    .replace(/_+/g, '_')\n    .replace(/^_|_$/g, '')\n    .substring(0, 100) || 'character';\n}\n\n/**\n * Export card to PNG format\n */\nexport function exportToPng(\n  card: CCv3Data,\n  assets: ExportAsset[],\n  options: PngExportOptions = {}\n): ExportResult {\n  const {\n    chunkKey = 'chara',\n    exportAsV2 = false,\n    checkLoss = true,\n  } = options;\n\n  // Find main icon asset\n  const mainIcon = assets.find((a) => a.isMain && a.type === 'icon') ||\n                   assets.find((a) => a.type === 'icon');\n\n  if (!mainIcon) {\n    throw new ValidationError('PNG export requires at least one icon asset', 'assets');\n  }\n\n  // Prepare card data\n  let cardData: CCv2Data | CCv3Data;\n\n  if (exportAsV2) {\n    // Export as v2 format for maximum compatibility\n    cardData = convertToV2Data(card);\n  } else {\n    // Export as v3\n    cardData = card;\n  }\n\n  // 1. Clean the PNG (remove existing chunks)\n  let currentPng = removeAllTextChunks(mainIcon.data);\n\n  // 2. Embed the main card data\n  const json = JSON.stringify(cardData); // Minified by default\n  const text = base64Encode(fromString(json));\n  currentPng = injectTextChunk(currentPng, chunkKey, text);\n\n  // 3. Embed RisuAI extra assets\n  for (const asset of assets) {\n    if (asset.path && asset.path.startsWith('pngchunk:')) {\n      // Extract ID from \"pngchunk:N\"\n      const id = asset.path.substring('pngchunk:'.length);\n      \n      // Encode asset data\n      const assetBase64 = base64Encode(asset.data);\n      \n      // Inject chunk \"chara-ext-asset_:N\"\n      currentPng = injectTextChunk(currentPng, `chara-ext-asset_:${id}`, assetBase64);\n    }\n  }\n\n  // Generate loss report if requested\n  const lossReport = checkLoss ? checkExportLoss(card, assets, 'png') : undefined;\n\n  const filename = `${sanitizeFilename(card.data.name)}.png`;\n\n  return {\n    buffer: currentPng,\n    format: 'png',\n    filename,\n    mimeType: 'image/png',\n    assetCount: 1,\n    totalSize: currentPng.length,\n    lossReport,\n  };\n}\n\n/**\n * Async version of exportToPng\n */\nexport async function exportToPngAsync(\n  card: CCv3Data,\n  assets: ExportAsset[],\n  options: PngExportOptions = {}\n): Promise<ExportResult> {\n  return exportToPng(card, assets, options);\n}\n","/**\n * Export Loss Checker\n *\n * Analyzes what data would be lost when exporting to different formats.\n */\n\nimport type { CCv3Data } from '@character-foundry/schemas';\nimport { hasRisuExtensions, hasRisuScripts, hasDepthPrompt } from '@character-foundry/schemas';\nimport { FormatNotSupportedError } from '@character-foundry/core';\nimport type { ExportFormat, ExportLossReport, ExportAsset, PreExportCheck } from './types.js';\n\n/**\n * Check loss for PNG export\n */\nfunction checkPngLoss(card: CCv3Data, assets: ExportAsset[]): ExportLossReport {\n  const lostFields: string[] = [];\n  const lostAssets: string[] = [];\n  const warnings: string[] = [];\n\n  // PNG can only embed one image (the main icon)\n  const nonMainAssets = assets.filter((a) => !a.isMain && a.type !== 'icon');\n  if (nonMainAssets.length > 0) {\n    for (const asset of nonMainAssets) {\n      lostAssets.push(`${asset.name}.${asset.ext} (${asset.type})`);\n    }\n    warnings.push(`${nonMainAssets.length} assets cannot be embedded in PNG format`);\n  }\n\n  // Additional emotion assets beyond main\n  const emotionAssets = assets.filter((a) => a.type === 'emotion');\n  if (emotionAssets.length > 1) {\n    warnings.push('Multiple emotion assets - only main icon will be embedded');\n  }\n\n  // Sound assets cannot be embedded in PNG\n  const soundAssets = assets.filter((a) => a.type === 'sound');\n  if (soundAssets.length > 0) {\n    warnings.push(`${soundAssets.length} sound assets cannot be embedded in PNG`);\n  }\n\n  // Check for embedded asset URIs that won't resolve\n  const extensions = card.data.extensions as Record<string, unknown> | undefined;\n  if (card.data.assets && card.data.assets.length > 1) {\n    warnings.push('Card has multiple asset references - only main will be available');\n  }\n\n  return {\n    lostFields,\n    lostAssets,\n    warnings,\n    targetFormat: 'png',\n    isLossless: lostFields.length === 0 && lostAssets.length === 0,\n  };\n}\n\n/**\n * Check loss for CharX export\n */\nfunction checkCharxLoss(card: CCv3Data, assets: ExportAsset[]): ExportLossReport {\n  const lostFields: string[] = [];\n  const lostAssets: string[] = [];\n  const warnings: string[] = [];\n\n  // CharX supports most CCv3 features, minimal loss expected\n  const extensions = card.data.extensions as Record<string, unknown> | undefined;\n\n  // Voxta-specific extensions won't be preserved in standard CharX\n  if (extensions?.voxta) {\n    warnings.push('Voxta-specific settings may not be recognized by all applications');\n  }\n\n  // Check for remote asset URLs that might not be fetched\n  if (card.data.assets) {\n    for (const asset of card.data.assets) {\n      if (asset.uri.startsWith('http://') || asset.uri.startsWith('https://')) {\n        warnings.push(`Remote asset URL may not be resolved: ${asset.uri}`);\n      }\n    }\n  }\n\n  return {\n    lostFields,\n    lostAssets,\n    warnings,\n    targetFormat: 'charx',\n    isLossless: lostFields.length === 0 && lostAssets.length === 0,\n  };\n}\n\n/**\n * Check loss for Voxta export\n */\nfunction checkVoxtaLoss(card: CCv3Data, assets: ExportAsset[]): ExportLossReport {\n  const lostFields: string[] = [];\n  const lostAssets: string[] = [];\n  const warnings: string[] = [];\n\n  const cardData = card.data;\n  const extensions = cardData.extensions as Record<string, unknown> | undefined;\n\n  // Note: Voxta DOES support system_prompt (as SystemPrompt)\n  // Note: Voxta DOES support post_history_instructions (as PostHistoryInstructions)\n  // Note: Voxta DOES support alternate_greetings (as AlternativeFirstMessages)\n\n  // Voxta doesn't support group greetings\n  if (cardData.group_only_greetings && cardData.group_only_greetings.length > 0) {\n    lostFields.push(`group_only_greetings (${cardData.group_only_greetings.length} entries)`);\n  }\n\n  // Check extensions\n  if (hasRisuExtensions(extensions)) {\n    lostFields.push('extensions.risuai.*');\n    if (hasRisuScripts(extensions)) {\n      warnings.push('Risu scripts (triggerscript, customScripts) will be lost');\n    }\n  }\n\n  if (hasDepthPrompt(extensions)) {\n    lostFields.push('extensions.depth_prompt');\n    warnings.push('SillyTavern depth prompt will be lost');\n  }\n\n  if (extensions?.chub) {\n    lostFields.push('extensions.chub.*');\n  }\n\n  // Check for unknown extensions\n  if (extensions) {\n    for (const key of Object.keys(extensions)) {\n      if (key !== 'voxta' && key !== 'visual_description' &&\n          key !== 'risuai' && key !== 'chub' && key !== 'depth_prompt') {\n        lostFields.push(`extensions.${key}`);\n      }\n    }\n  }\n\n  // Character book extensions\n  if (cardData.character_book?.extensions) {\n    lostFields.push('character_book.extensions');\n  }\n\n  // Lorebook entry extensions\n  if (cardData.character_book?.entries) {\n    const entriesWithExt = cardData.character_book.entries.filter(\n      (e) => e.extensions && Object.keys(e.extensions).length > 0\n    );\n    if (entriesWithExt.length > 0) {\n      lostFields.push(`lorebook entries extensions (${entriesWithExt.length} entries)`);\n    }\n  }\n\n  // Asset checks\n  const unsupportedAssets = assets.filter(\n    (a) => a.type !== 'icon' && a.type !== 'emotion' && a.type !== 'sound'\n  );\n  for (const asset of unsupportedAssets) {\n    lostAssets.push(`${asset.name}.${asset.ext} (${asset.type})`);\n  }\n\n  return {\n    lostFields,\n    lostAssets,\n    warnings,\n    targetFormat: 'voxta',\n    isLossless: lostFields.length === 0 && lostAssets.length === 0,\n  };\n}\n\n/**\n * Check what would be lost when exporting to a specific format\n */\nexport function checkExportLoss(\n  card: CCv3Data,\n  assets: ExportAsset[],\n  targetFormat: ExportFormat\n): ExportLossReport {\n  switch (targetFormat) {\n    case 'png':\n      return checkPngLoss(card, assets);\n    case 'charx':\n      return checkCharxLoss(card, assets);\n    case 'voxta':\n      return checkVoxtaLoss(card, assets);\n    default:\n      throw new FormatNotSupportedError(targetFormat);\n  }\n}\n\n/**\n * Perform pre-export check and suggest alternatives\n */\nexport function preExportCheck(\n  card: CCv3Data,\n  assets: ExportAsset[],\n  targetFormat: ExportFormat\n): PreExportCheck {\n  const lossReport = checkExportLoss(card, assets, targetFormat);\n\n  // Suggest alternatives if significant loss\n  const suggestedFormats: ExportFormat[] = [];\n\n  if (!lossReport.isLossless) {\n    // Check other formats for less loss\n    const allFormats: ExportFormat[] = ['png', 'charx', 'voxta'];\n\n    for (const format of allFormats) {\n      if (format === targetFormat) continue;\n      const altReport = checkExportLoss(card, assets, format);\n      if (altReport.lostFields.length < lossReport.lostFields.length) {\n        suggestedFormats.push(format);\n      }\n    }\n  }\n\n  return {\n    canExport: true, // Always allow export, just warn about loss\n    lossReport,\n    suggestedFormats: suggestedFormats.length > 0 ? suggestedFormats : undefined,\n  };\n}\n\n/**\n * Format a loss report as human-readable string\n */\nexport function formatLossReport(report: ExportLossReport): string {\n  const lines: string[] = [];\n\n  if (report.isLossless) {\n    return `Export to ${report.targetFormat.toUpperCase()} will be lossless.`;\n  }\n\n  lines.push(`Export Loss Report (${report.targetFormat.toUpperCase()})`);\n  lines.push('='.repeat(40));\n  lines.push('');\n\n  if (report.lostFields.length > 0) {\n    lines.push('Fields that will be lost:');\n    for (const field of report.lostFields) {\n      lines.push(`  - ${field}`);\n    }\n    lines.push('');\n  }\n\n  if (report.lostAssets.length > 0) {\n    lines.push('Assets that will be lost:');\n    for (const asset of report.lostAssets) {\n      lines.push(`  - ${asset}`);\n    }\n    lines.push('');\n  }\n\n  if (report.warnings.length > 0) {\n    lines.push('Warnings:');\n    for (const warning of report.warnings) {\n      lines.push(`  ! ${warning}`);\n    }\n  }\n\n  return lines.join('\\n');\n}\n","/**\n * CharX Exporter\n *\n * Exports character cards to CharX (ZIP) format.\n */\n\nimport type { CCv3Data } from '@character-foundry/schemas';\nimport { writeCharX, type CharxWriteAsset } from '@character-foundry/charx';\nimport type { ExportAsset, CharxExportOptions, ExportResult } from './types.js';\nimport { checkExportLoss } from './loss-checker.js';\n\n/**\n * Sanitize filename for safe filesystem use\n */\nfunction sanitizeFilename(name: string): string {\n  return name\n    .replace(/[<>:\"/\\\\|?*]/g, '_')\n    .replace(/\\s+/g, '_')\n    .replace(/_+/g, '_')\n    .replace(/^_|_$/g, '')\n    .substring(0, 100) || 'character';\n}\n\n/**\n * Convert ExportAsset to CharxWriteAsset\n */\nfunction toCharxAsset(asset: ExportAsset): CharxWriteAsset {\n  return {\n    name: asset.name,\n    type: asset.type,\n    ext: asset.ext,\n    data: asset.data,\n    isMain: asset.isMain,\n  };\n}\n\n/**\n * Export card to CharX format\n */\nexport function exportToCharx(\n  card: CCv3Data,\n  assets: ExportAsset[],\n  options: CharxExportOptions = {}\n): ExportResult {\n  const {\n    spec = 'v3',\n    compressionLevel = 6,\n    includeReadme = false,\n    emitXMeta,\n    moduleRisum,\n    checkLoss = true,\n  } = options;\n\n  // Convert assets to CharX format\n  const charxAssets = assets.map(toCharxAsset);\n\n  // Build CharX\n  const result = writeCharX(card, charxAssets, {\n    spec,\n    compressionLevel,\n    emitReadme: includeReadme,\n    emitXMeta: emitXMeta ?? (spec === 'risu'),\n    moduleRisum: spec === 'risu' ? moduleRisum : undefined,\n  });\n\n  // Generate loss report if requested\n  const lossReport = checkLoss ? checkExportLoss(card, assets, 'charx') : undefined;\n\n  const filename = `${sanitizeFilename(card.data.name)}.charx`;\n\n  return {\n    buffer: result.buffer,\n    format: 'charx',\n    filename,\n    mimeType: 'application/zip',\n    assetCount: result.assetCount,\n    totalSize: result.totalSize,\n    lossReport,\n  };\n}\n\n/**\n * Async version of exportToCharx\n */\nexport async function exportToCharxAsync(\n  card: CCv3Data,\n  assets: ExportAsset[],\n  options: CharxExportOptions = {}\n): Promise<ExportResult> {\n  return exportToCharx(card, assets, options);\n}\n","/**\n * Voxta Exporter\n *\n * Exports character cards to Voxta (VoxPkg) format.\n */\n\nimport type { CCv3Data } from '@character-foundry/schemas';\nimport { writeVoxta, type VoxtaWriteAsset } from '@character-foundry/voxta';\nimport type { ExportAsset, VoxtaExportOptions, ExportResult } from './types.js';\nimport { checkExportLoss } from './loss-checker.js';\n\n/**\n * Sanitize filename for safe filesystem use\n */\nfunction sanitizeFilename(name: string): string {\n  return name\n    .replace(/[<>:\"/\\\\|?*]/g, '_')\n    .replace(/\\s+/g, '_')\n    .replace(/_+/g, '_')\n    .replace(/^_|_$/g, '')\n    .substring(0, 100) || 'character';\n}\n\n/**\n * Map ExportAsset type to Voxta asset type\n */\nfunction mapToVoxtaType(type: ExportAsset['type']): VoxtaWriteAsset['type'] {\n  switch (type) {\n    case 'icon':\n    case 'emotion':\n      return 'icon';\n    case 'sound':\n      return 'sound';\n    default:\n      return 'icon'; // Default to icon for unknown types\n  }\n}\n\n/**\n * Convert ExportAsset to VoxtaWriteAsset\n */\nfunction toVoxtaAsset(asset: ExportAsset): VoxtaWriteAsset {\n  return {\n    name: asset.name,\n    type: mapToVoxtaType(asset.type),\n    ext: asset.ext,\n    data: asset.data,\n    isMain: asset.isMain,\n    tags: asset.tags,\n  };\n}\n\n/**\n * Export card to Voxta format\n */\nexport function exportToVoxta(\n  card: CCv3Data,\n  assets: ExportAsset[],\n  options: VoxtaExportOptions = {}\n): ExportResult {\n  const {\n    characterId,\n    packageId,\n    compressionLevel = 6,\n    includePackageJson = false,\n    checkLoss = true,\n  } = options;\n\n  // Filter assets to only those Voxta supports\n  const supportedAssets = assets.filter(\n    (a) => a.type === 'icon' || a.type === 'emotion' || a.type === 'sound'\n  );\n\n  // Convert assets to Voxta format\n  const voxtaAssets = supportedAssets.map(toVoxtaAsset);\n\n  // Build Voxta package\n  const result = writeVoxta(card, voxtaAssets, {\n    characterId,\n    packageId,\n    compressionLevel,\n    includePackageJson,\n  });\n\n  // Generate loss report if requested\n  const lossReport = checkLoss ? checkExportLoss(card, assets, 'voxta') : undefined;\n\n  const filename = `${sanitizeFilename(card.data.name)}.voxpkg`;\n\n  return {\n    buffer: result.buffer,\n    format: 'voxta',\n    filename,\n    mimeType: 'application/zip',\n    assetCount: result.assetCount,\n    totalSize: result.totalSize,\n    lossReport,\n  };\n}\n\n/**\n * Async version of exportToVoxta\n */\nexport async function exportToVoxtaAsync(\n  card: CCv3Data,\n  assets: ExportAsset[],\n  options: VoxtaExportOptions = {}\n): Promise<ExportResult> {\n  return exportToVoxta(card, assets, options);\n}\n"],"mappings":"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","names":["import_core","import_core","sanitizeFilename","sanitizeFilename"]}