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
- Grant s3:ListBucket on the bucket/arbitrary prefix
- Verify bucket and endpoint config
- 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
- Ensure s3:ListBucket in IAM
- Verify bucket names before save
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
- S3 upload failed: ${s3ErrorMessage(error)}
- S3 download returned an unsupported response body
- S3 metadata lookup failed: ${s3ErrorMessage(error)}
- ${context}: ${response.status} ${message || response.statusT
- S3 object not found: ${normalized}
AI-assisted analysis of linshenkx/prompt-optimizer@3e677b1d9f (2026-08-27).
Data as JSON: /api/errors/a6af0d125126fef1.
Report an issue: GitHub.