* feat(embed): retry transient embedding errors and survive partial failures
Classify OpenAI embedding errors into a typed APIError and retry
transient ones (429, 5xx, network timeouts) with Retry-After-aware
exponential backoff and jitter; longer base for overloaded_error.
insufficient_quota, 4xx, and ctx errors surface immediately.
Replace abort-on-first-error with a per-batch retry queue: each batch
retries once with fresh backoff and the rest keep going. Final run
status is success / partial / error / cancelled, and stats_json carries
retries plus per-batch failure metadata for diagnostics.
* fix(embed): avoid final retry sleep
---------
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
Parses rel="last" from the Link header, and for the cursor-paginated
issues listing falls back to open_issues_count from the prior GetRepo
response. Logs read "page 3/7 fetched count=100 accumulated=300" when a
total is known and remain "page 3 ..." otherwise.
Single chokepoint Client.do now inspects the response on 403/429 and,
when the headers say we're rate-limited (X-RateLimit-Remaining=0 or a
Retry-After value), sleeps until the reset and retries once. The sleep
honors ctx cancellation, so callers bound the wait with
context.WithTimeout if they want a deadline.
RequestError gains a Headers field so the retry decision can read the
underlying response without re-fetching.
* feat/tui-context-menu:
feat(tui): open rows on double click
feat(tui): enable hover for floating menu
fix(tui): preserve working set on refresh
fix(tui): clamp member scroll and footer width
fix(tui): preserve rows under floating menu
chore(tui): advertise right click menu
test(tui): cover floating action menu
feat(tui): float action menu on right click
## Summary
- align gitcrawl sync, portable read support, embeddings, durable clusters, and TUI cluster display with ghcrawl behavior
- add clearer TUI cluster state text for open vs closed rows
## Validation
- go test ./...
- GitHub CI run 25082322968 passed on ubuntu-latest and macos-latest