linshenkx/prompt-optimizer · error · Error

S3 list failed: ${s3ErrorMessage(error)}

Error message

S3 list failed: ${s3ErrorMessage(error)}

What it means

ListObjectsV2 pagination loop failed; the SDK error is wrapped. Any listing error (auth, permissions, bucket missing) surfaces here.

Source

Thrown at packages/ui/src/utils/remote-backup.ts:1665

          Prefix: this.listPrefixForPath(prefix),
          ContinuationToken: continuationToken,
        }))
        for (const object of response.Contents ?? []) {
          const key = object.Key || ''
          const path = this.pathFromKey(key)
          if (!path) continue
          entries.push({
            path,
            sizeBytes: typeof object.Size === 'number' ? object.Size : undefined,
            updatedAt: object.LastModified instanceof Date
              ? object.LastModified.toISOString()
              : undefined,
          })
        }
        continuationToken = response.IsTruncated ? response.NextContinuationToken : undefined
      } while (continuationToken)
    } catch (error) {
      throw new Error(`S3 list failed: ${s3ErrorMessage(error)}`, { cause: error })
    }

    return entries.sort((a, b) => a.path.localeCompare(b.path))
  }

  async delete(path: string): Promise<void> {
    try {
      await this.client.send(new DeleteObjectCommand({
        Bucket: this.config.bucket,
        Key: this.keyForPath(path),
      }))
    } catch (error) {
      throw new Error(`S3 delete failed: ${s3ErrorMessage(error)}`, { cause: error })
    }
  }

  private prefix(): string {
    return joinRemotePath(this.config.prefix || 'prompt-optimizer-backups')

View on GitHub (pinned to 3e677b1d9f)

Solutions

  1. Grant s3:ListBucket on the bucket/arbitrary prefix
  2. Verify bucket and endpoint config
  3. Reproduce with aws s3api list-objects-v2 --bucket ... --prefix ...
Defensive patterns

Strategy: try-catch

Try / catch

try { await store.list(prefix) } catch (e) { if ((e as Error).message.startsWith('S3 list failed')) { await refreshS3Credentials(); return retry(() => store.list(prefix)) } throw e }

Prevention

When it happens

Trigger: list(prefix) without s3:ListBucket permission, wrong bucket name, invalid prefix, or endpoint/credential errors against S3-compatible storage.

Common situations: IAM keys with object-level only permissions; bucket renamed; R2 endpoint mismatch.

Related errors


AI-assisted analysis of linshenkx/prompt-optimizer@3e677b1d9f (2026-08-27). Data as JSON: /api/errors/a6af0d125126fef1. Report an issue: GitHub.