{"record":{"id":"545659385a7a4061","repo":"chatboxai/chatbox","slug":"unsupported-legacy-backup-data-format","errorCode":null,"errorMessage":"Unsupported legacy backup data format","messagePattern":"Unsupported legacy backup data format","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/renderer/packages/backup/legacy-import.ts","lineNumber":42,"sourceCode":"\nfunction normalizeMeta(value: unknown): SessionMetaRecord | undefined {\n  if (!value || typeof value !== 'object' || !('id' in value) || typeof value.id !== 'string') return undefined\n  const candidate = {\n    ...value,\n    sortOrder: 'sortOrder' in value && typeof value.sortOrder === 'number' ? value.sortOrder : Date.now(),\n    createdAt: 'createdAt' in value && typeof value.createdAt === 'number' ? value.createdAt : Date.now(),\n  }\n  const parsed = SessionMetaRecordSchema.safeParse(candidate)\n  return parsed.success ? parsed.data : undefined\n}\n\nexport async function importLegacyJsonBackup(\n  file: File,\n  options: LegacyBackupImportOptions\n): Promise<LegacyBackupImportResult> {\n  const parsed: unknown = JSON.parse(await file.text())\n  if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n    throw new Error('Unsupported legacy backup data format')\n  }\n  const importData = parsed as Record<string, unknown>\n  await options.migrateData({\n    getData: <T>(key: string, defaultValue: T) => Promise.resolve((importData[key] ?? defaultValue) as T),\n    setData: (key, value) => {\n      importData[key] = value\n      return Promise.resolve()\n    },\n    setAll: (data) => {\n      Object.assign(importData, data)\n      return Promise.resolve()\n    },\n  })\n\n  const entriesToImport = Object.entries(importData).filter(\n    ([key]) =>\n      key !== BackupStorageKey.ChatSessionsList && key !== BackupStorageKey.ConfigVersion && !key.startsWith('__')\n  )","sourceCodeStart":24,"sourceCodeEnd":60,"githubUrl":"https://github.com/chatboxai/chatbox/blob/81571269addb6bafb589a920b2883f1e1e084fd1/src/renderer/packages/backup/legacy-import.ts#L24-L60","documentation":"Thrown by importLegacyJsonBackup after it parses the selected file with JSON.parse. The legacy importer requires the top-level JSON value to be a non-null, non-array object (a key/value record, like the old Chatbox localStorage dump). Any other shape — a primitive, null, or an array — is rejected before migration runs.","triggerScenarios":"Calling importLegacyJsonBackup with a File whose text is 'null', an array '[...]', a quoted string, a number/boolean, or an empty document. Also when a v2 .cbx zip or a settings-only JSON array is routed to the legacy importer.","commonSituations":"User picks a non-backup JSON file in the import dialog; the legacy export was an array of sessions in an older build; the file was truncated to empty; a v2 backup is mis-routed to the legacy path.","solutions":["Open the file and confirm the top-level value is an object (starts with '{', not '[' or a primitive).","Route v2 backups (.cbx / zip) to the v2 importer, not importLegacyJsonBackup.","Re-export the data from a working Chatbox install if the file is corrupt.","If importing arbitrary user JSON, pre-check that file.text() parses to a non-array object before calling the importer."],"exampleFix":"// before\nawait importLegacyJsonBackup(file, options)\n\n// after\nconst text = await file.text()\nconst probe: unknown = JSON.parse(text)\nif (!probe || typeof probe !== 'object' || Array.isArray(probe)) {\n  throw new Error('Please select a legacy Chatbox JSON backup')\n}\nawait importLegacyJsonBackup(file, options)","handlingStrategy":"try-catch","validationCode":"async function looksLikeLegacyBackup(file: File): Promise<boolean> {\n  try {\n    const value: unknown = JSON.parse(await file.text())\n    return !!value && typeof value === 'object' && !Array.isArray(value)\n  } catch {\n    return false\n  }\n}","typeGuard":"const isRecord = (v: unknown): v is Record<string, unknown> =>\n  !!v && typeof v === 'object' && !Array.isArray(v)","tryCatchPattern":"try {\n  const result = await importLegacyJsonBackup(file, options)\n} catch (error) {\n  notifyUser((error as Error).message) // e.g. 'Unsupported legacy backup data format'\n}","preventionTips":["Show a file-type/extension filter in the import dialog.","Validate the picked file is a JSON object before invoking the legacy importer.","Keep v2 (.cbx / zip) and legacy (.json) import paths separate."],"tags":["backup","legacy-import","validation","json"],"backgroundTag":null,"analyzedSha":"81571269addb6bafb589a920b2883f1e1e084fd1","analyzedAt":"2026-08-12T21:51:44.981Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}