Output
✅ shared/tests/retry.test.ts
20 passed 0 failed · 2s
withRetry (8 tests)
| ✓ | succeeds on first attempt | 5ms |
| ✓ | retries on network error and succeeds | 41ms |
| ✓ | gives up after max retries | 35ms |
| ✓ | does not retry non-network errors | 0ms |
| ✓ | calls onRetry callback | 33ms |
| ✓ | uses exponential backoff | 705ms |
| ✓ | respects max delay | 1s |
| ✓ | custom shouldRetry function | 11ms |
withRetryResult (2 tests)
| ✓ | returns success result | 0ms |
| ✓ | returns failure result after max retries | 33ms |
CircuitBreaker (5 tests)
| ✓ | starts closed | 0ms |
| ✓ | opens after threshold failures | 0ms |
| ✓ | success resets failure count | 0ms |
| ✓ | resets after timeout | 61ms |
| ✓ | getState returns current state | 0ms |
withCircuitBreaker (5 tests)
| ✓ | executes when circuit closed | 0ms |
| ✓ | throws when circuit open | 0ms |
| ✓ | returns fallback when circuit open | 0ms |
| ✓ | records success | 0ms |
| ✓ | records failure | 0ms |
Quick Actions
Original Request
No layout configured
Details
Type
General
Status
Completed
Scope
vibetools
Tags
sharedtestsretry
Created
4 Jan 2026, 11:47 am
Updated
4 Jan 2026, 11:47 am
Timing
⏱️ 57.8s
2 tools
● TTFE 7%
● Thinking 85%
● Tools 8%
Created By
claude
Raw Data
{
"id": "85d67dab-53cc-417c-8a2e-c04772e7e788",
"type": "general",
"status": "completed",
"title": "Retry tests: 20 passed",
"description": "All 20 retry utility tests passed in 2 seconds",
"context": {
"output": "<div style=\"background:#1e1e1e;color:#e0e0e0;padding:20px;border-radius:8px;font-family:'Consolas','Monaco',monospace;\">\n<h2 style=\"font-family:sans-serif;color:#fff;margin:0 0 16px 0;\">✅ shared/tests/retry.test.ts</h2>\n<p style=\"font-family:sans-serif;margin:0 0 16px 0;\"><span style=\"background:#22c55e;color:#fff;padding:4px 12px;border-radius:4px;font-weight:bold;\">20 passed</span> <span style=\"color:#9ca3af;margin-left:8px;\">0 failed · 2s</span></p>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#98c379;margin:0 0 12px 0;font-family:sans-serif;\">withRetry (8 tests)</h3>\n<table style=\"width:100%;border-collapse:collapse;font-size:0.85rem;\">\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;width:24px;color:#22c55e;\">✓</td><td>succeeds on first attempt</td><td style=\"text-align:right;color:#7f848e;\">5ms</td></tr>\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>retries on network error and succeeds</td><td style=\"text-align:right;color:#7f848e;\">41ms</td></tr>\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>gives up after max retries</td><td style=\"text-align:right;color:#7f848e;\">35ms</td></tr>\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>does not retry non-network errors</td><td style=\"text-align:right;color:#7f848e;\">0ms</td></tr>\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>calls onRetry callback</td><td style=\"text-align:right;color:#7f848e;\">33ms</td></tr>\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>uses exponential backoff</td><td style=\"text-align:right;color:#7f848e;\">705ms</td></tr>\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>respects max delay</td><td style=\"text-align:right;color:#7f848e;\">1s</td></tr>\n<tr><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>custom shouldRetry function</td><td style=\"text-align:right;color:#7f848e;\">11ms</td></tr>\n</table>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#61afef;margin:0 0 12px 0;font-family:sans-serif;\">withRetryResult (2 tests)</h3>\n<table style=\"width:100%;border-collapse:collapse;font-size:0.85rem;\">\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;width:24px;color:#22c55e;\">✓</td><td>returns success result</td><td style=\"text-align:right;color:#7f848e;\">0ms</td></tr>\n<tr><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>returns failure result after max retries</td><td style=\"text-align:right;color:#7f848e;\">33ms</td></tr>\n</table>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;margin-bottom:16px;\">\n<h3 style=\"color:#c678dd;margin:0 0 12px 0;font-family:sans-serif;\">CircuitBreaker (5 tests)</h3>\n<table style=\"width:100%;border-collapse:collapse;font-size:0.85rem;\">\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;width:24px;color:#22c55e;\">✓</td><td>starts closed</td><td style=\"text-align:right;color:#7f848e;\">0ms</td></tr>\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>opens after threshold failures</td><td style=\"text-align:right;color:#7f848e;\">0ms</td></tr>\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>success resets failure count</td><td style=\"text-align:right;color:#7f848e;\">0ms</td></tr>\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>resets after timeout</td><td style=\"text-align:right;color:#7f848e;\">61ms</td></tr>\n<tr><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>getState returns current state</td><td style=\"text-align:right;color:#7f848e;\">0ms</td></tr>\n</table>\n</div>\n\n<div style=\"background:#2d2d2d;padding:16px;border-radius:6px;\">\n<h3 style=\"color:#56b6c2;margin:0 0 12px 0;font-family:sans-serif;\">withCircuitBreaker (5 tests)</h3>\n<table style=\"width:100%;border-collapse:collapse;font-size:0.85rem;\">\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;width:24px;color:#22c55e;\">✓</td><td>executes when circuit closed</td><td style=\"text-align:right;color:#7f848e;\">0ms</td></tr>\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>throws when circuit open</td><td style=\"text-align:right;color:#7f848e;\">0ms</td></tr>\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>returns fallback when circuit open</td><td style=\"text-align:right;color:#7f848e;\">0ms</td></tr>\n<tr style=\"border-bottom:1px solid #444;\"><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>records success</td><td style=\"text-align:right;color:#7f848e;\">0ms</td></tr>\n<tr><td style=\"padding:4px 0;color:#22c55e;\">✓</td><td>records failure</td><td style=\"text-align:right;color:#7f848e;\">0ms</td></tr>\n</table>\n</div>\n</div>",
"requestedAt": "2026-01-04T00:00:00.000Z",
"requestId": "4ca895a8-0a76-40ee-ad1f-db4890ce50b6",
"choices": [
{
"label": "Run all shared tests",
"value": "Run all shared utility tests",
"primary": true
},
{
"label": "View retry.ts",
"value": "Show me retry.ts in shared"
},
{
"label": "View test source",
"value": "Show me the retry.ts tests"
}
],
"turnTiming": {
"totalMs": 57799,
"ttfeMs": 4165,
"thinkingMs": 49082,
"toolExecutionMs": 4549,
"toolCallCount": 2,
"thinkingPct": 85,
"toolsPct": 8,
"ttfePct": 7
}
},
"createdBy": "claude",
"createdAt": "2026-01-04T01:47:20.206Z",
"updatedAt": "2026-01-04T01:47:25.481Z",
"requestId": "4ca895a8-0a76-40ee-ad1f-db4890ce50b6",
"scope": "vibetools",
"tags": [
"shared",
"tests",
"retry"
],
"targetUser": "claude"
}