{"record":{"id":"86fb40c194446acd","repo":"chatboxai/chatbox","slug":"invalid-copilots-entry","errorCode":null,"errorMessage":"Invalid copilots entry","messagePattern":"Invalid copilots entry","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/renderer/packages/backup/import-backup.ts","lineNumber":350,"sourceCode":"      options.onProgress?.({\n        phase: 'restoring',\n        current: resourcePlans.length + index + 1,\n        total: resourcePlans.length + manifest.sessions.length,\n        label: session.name,\n      })\n    }\n\n    if (manifest.data.settings) {\n      const value = stagedEntries.get(manifest.data.settings.path)?.value\n      if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('Invalid settings entry')\n      await options.storage.setItemNow(\n        BackupStorageKey.Settings,\n        restoreSettingsResourceKeys(value as Partial<Settings>, resourceKeyMap)\n      )\n    }\n    if (manifest.data.copilots) {\n      const value = stagedEntries.get(manifest.data.copilots.path)?.value\n      if (!Array.isArray(value)) throw new Error('Invalid copilots entry')\n      await options.storage.setItemNow(\n        BackupStorageKey.MyCopilots,\n        restoreCopilotResourceKeys(value as CopilotDetail[], resourceKeyMap)\n      )\n    }\n    if (manifest.data.sessionSettings) {\n      const value = stagedEntries.get(manifest.data.sessionSettings.path)?.value\n      if (!value || typeof value !== 'object' || Array.isArray(value)) throw new Error('Invalid session settings entry')\n      const sessionSettings = value as Record<string, unknown>\n      for (const key of [BackupStorageKey.ChatSessionSettings, BackupStorageKey.PictureSessionSettings]) {\n        if (key in sessionSettings) await options.storage.setItemNow(key, sessionSettings[key])\n      }\n    }\n\n    await cleanupTemps()\n    return {\n      manifest,\n      warnings: [...manifest.warnings, ...importWarnings],","sourceCodeStart":332,"sourceCodeEnd":368,"githubUrl":"https://github.com/chatboxai/chatbox/blob/81571269addb6bafb589a920b2883f1e1e084fd1/src/renderer/packages/backup/import-backup.ts#L332-L368","documentation":"Thrown when restoring copilots if the staged copilots.json value is not an array. The copilots entry must be an array of CopilotDetail so restoreCopilotResourceKeys can map over it. Propagates after rollback.","triggerScenarios":"manifest.data.copilots is set, but stagedEntries.get(copilots.path).value is not an array.","commonSituations":"A hand-edited or corrupted copilots.json; a format change that wraps copilots in an object; a truncated file.","solutions":["Re-export with a compatible version.","Repair copilots.json to be a JSON array.","Drop the copilots descriptor from the manifest to skip copilot restore."],"exampleFix":"// before: non-array copilots aborts import\nawait importBackupArchive(file, options)\n// after: validate the copilots entry shape before importing\nif (!Array.isArray(parsedCopilots)) {\n  throw new Error('copilots.json must be a JSON array')\n}","handlingStrategy":"type-guard","validationCode":"// Validate the copilots entry is an array before importing.\nif (!Array.isArray(parsedCopilots)) {\n  throw new Error('Invalid copilots entry')\n}","typeGuard":"// Narrows an unknown value to an array - the exact check at line 350.\nconst isCopilotsEntry = Array.isArray as (value: unknown) => value is unknown[]","tryCatchPattern":"try {\n  await importBackupArchive(file, options)\n} catch (error) {\n  if (error instanceof Error && error.message === 'Invalid copilots entry') {\n    // Repair copilots.json to a JSON array or drop the copilots descriptor.\n    throw new Error('copilots.json is malformed', { cause: error })\n  }\n  throw error\n}","preventionTips":["Keep copilots.json as a JSON array of CopilotDetail.","Re-export with a compatible version instead of hand-editing.","Validate staged copilots with Array.isArray before import."],"tags":["backup","import","copilots","schema","validation"],"backgroundTag":null,"analyzedSha":"81571269addb6bafb589a920b2883f1e1e084fd1","analyzedAt":"2026-08-12T21:51:44.981Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}