Retry policy with exponential backoff for exec execution.
Usage
config = CodexWrapper.Config.new()
exec = CodexWrapper.Exec.new("fix the bug")
# Retry up to 3 times with exponential backoff
{:ok, result} = CodexWrapper.Retry.execute(exec, config,
max_retries: 3,
base_delay_ms: 1_000,
max_delay_ms: 30_000
)
# With custom retry predicate
{:ok, result} = CodexWrapper.Retry.execute(exec, config,
max_retries: 5,
retry_on: fn
{:error, {:timeout, _}} -> true
{:error, {:system_cmd, _}} -> true
_ -> false
end
)
Summary
Types
@type opts() :: [ max_retries: non_neg_integer(), base_delay_ms: pos_integer(), max_delay_ms: pos_integer(), multiplier: number(), jitter: boolean(), retry_on: (term() -> boolean()) ]
Functions
@spec compute_delay( non_neg_integer(), pos_integer(), pos_integer(), number(), boolean() ) :: non_neg_integer()
Compute the delay for a given attempt number.
@spec execute(CodexWrapper.Exec.t(), CodexWrapper.Config.t(), opts()) :: {:ok, CodexWrapper.Result.t()} | {:error, term()}
Execute an exec command with retry logic.
Options
:max_retries- Maximum number of retry attempts (default: 3):base_delay_ms- Initial delay between retries in ms (default: 1000):max_delay_ms- Maximum delay cap in ms (default: 30000):multiplier- Backoff multiplier (default: 2):jitter- Add random jitter to delays (default: true):retry_on- Function that receives the error and returns whether to retry. Defaults to retrying on timeouts and system cmd errors.