{"record":{"id":"4a544a4fc58c7fdf","repo":"mastra-ai/mastra","slug":"page-must-be-0-when-perpage-is-false","errorCode":null,"errorMessage":"page must be 0 when perPage is false","messagePattern":"page must be 0 when perPage is false","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/core/src/storage/domains/memory/base.ts","lineNumber":501,"sourceCode":"   * @throws Error if perPageInput is false and page !== 0\n   * @throws Error if perPageInput is invalid (not false or a non-negative safe integer)\n   * @throws Error if page is invalid or offset would overflow\n   */\n  protected validatePaginationInput(page: number, perPageInput: number | false): void {\n    // Validate perPageInput type first\n    if (perPageInput !== false) {\n      if (typeof perPageInput !== 'number' || !Number.isFinite(perPageInput) || !Number.isSafeInteger(perPageInput)) {\n        throw new Error('perPage must be false or a safe integer');\n      }\n      if (perPageInput < 0) {\n        throw new Error('perPage must be >= 0');\n      }\n    }\n\n    // When fetching all (perPage: false), only page 0 is valid\n    if (perPageInput === false) {\n      if (page !== 0) {\n        throw new Error('page must be 0 when perPage is false');\n      }\n      // Still validate page is a valid integer\n      if (!Number.isFinite(page) || !Number.isSafeInteger(page)) {\n        throw new Error('page must be >= 0');\n      }\n      return;\n    }\n\n    // For numeric perPage, delegate to existing validation\n    this.validatePagination(page, perPageInput);\n  }\n}\n\nconst THREAD_ORDER_BY_SET: Record<ThreadOrderBy, true> = {\n  createdAt: true,\n  updatedAt: true,\n};\n","sourceCodeStart":483,"sourceCodeEnd":519,"githubUrl":"https://github.com/mastra-ai/mastra/blob/75dd419e613fe9c39f846ffc500716141b74fda6/packages/core/src/storage/domains/memory/base.ts#L483-L519","documentation":"When perPage is false (fetch-all mode), only page 0 is valid because there is a single unpaginated result set. Passing any other page with perPage: false throws 'page must be 0 when perPage is false'.","triggerScenarios":"Calling listThreads/listMessages with { page: 2, perPage: false }; combining 'fetch all' with UI pagination state that is already on page N.","commonSituations":"Export-all feature reusing paginated request state; toggling perPage to false without resetting the page counter; generic request-mapping code that always forwards page.","solutions":["Force page to 0 whenever perPage is false.","Reset the pagination state when switching to fetch-all mode.","Conditionally build the params object: perPage === false ? { page: 0, perPage: false } : { page, perPage }.","Ignore/skip the page parameter in fetch-all code paths."],"exampleFix":"// before\nawait storage.listThreads({ page: currentPage, perPage: false });\n// after\nawait storage.listThreads({ page: 0, perPage: false });","handlingStrategy":"validation","validationCode":"const params = perPage === false\n  ? { page: 0, perPage: false }\n  : { page, perPage };","typeGuard":"function validListParams(p: { page: number; perPage: number | false }) {\n  return p.perPage === false ? { ...p, page: 0 } : p;\n}","tryCatchPattern":"try {\n  await storage.listThreads(params);\n} catch (e) {\n  if (e instanceof Error && e.message === 'page must be 0 when perPage is false') {\n    return storage.listThreads({ page: 0, perPage: false });\n  }\n  throw e;\n}","preventionTips":["Reset page to 0 whenever switching to fetch-all mode","Centralize list-params construction in one helper","Do not forward UI pagination state into fetch-all calls"],"tags":["validation","pagination","storage"],"backgroundTag":"invalid-pagination-parameters","analyzedSha":"75dd419e613fe9c39f846ffc500716141b74fda6","analyzedAt":"2026-08-30T00:15:31.844Z","schemaVersion":2},"datasetVersion":"2026-08-30T03:17:51.788Z"}