Context
The OS event bus fires webhooks on events like agent.status, quest.completed, payment.received. Currently if the downstream endpoint is down, the call is dropped. This issue adds retry logic.
What to implement
Retry store
Track pending deliveries with:
interface PendingDelivery {
id: string
webhookUrl: string
payload: object
attempts: number // max 4
nextRetryAt: number // epoch ms
}
Retry schedule (exponential backoff)
- Attempt 1: immediate
- Attempt 2: +30s
- Attempt 3: +2m
- Attempt 4: +10m
- After 4 failures: mark as
dead_letter, stop retrying
Route: GET /api/webhooks/dead-letters
Returns all dead-lettered deliveries (last 100) for manual inspection.
Route: POST /api/webhooks/dead-letters/:id/retry
Manually re-enqueue a dead-lettered delivery.
Acceptance criteria
Context
The OS event bus fires webhooks on events like
agent.status,quest.completed,payment.received. Currently if the downstream endpoint is down, the call is dropped. This issue adds retry logic.What to implement
Retry store
Track pending deliveries with:
Retry schedule (exponential backoff)
dead_letter, stop retryingRoute: GET /api/webhooks/dead-letters
Returns all dead-lettered deliveries (last 100) for manual inspection.
Route: POST /api/webhooks/dead-letters/:id/retry
Manually re-enqueue a dead-lettered delivery.
Acceptance criteria
GET /api/webhooks/dead-letters