func runWithRetry(ctx context.Context, sbx *declaw.Sandbox, cmd string, retries int) (string, error) {
delay := time.Second
for attempt := 0; attempt < retries; attempt++ {
result, err := sbx.Commands.Run(ctx, cmd,
declaw.WithRunTimeout(30*time.Second),
)
if err == nil {
return result.Stdout, nil
}
// Don't retry deterministic failures
var exitErr *declaw.CommandExitError
if errors.As(err, &exitErr) {
return "", err // non-zero exit won't improve on retry
}
var ae *declaw.AuthenticationError
if errors.As(err, &ae) {
return "", err
}
var nfe *declaw.NotFoundError
if errors.As(err, &nfe) {
return "", err
}
if attempt < retries-1 {
time.Sleep(delay)
delay *= 2
}
}
return "", fmt.Errorf("command failed after %d retries", retries)
}