use std::ffi::OsString;
use std::path::PathBuf;
use std::time::Duration;
use crate::{
DEFAULT_CODEX_ACP_MODEL, DEFAULT_CODEX_ACP_REASONING_EFFORT, DEFAULT_SYSTEM_PROMPT,
RubricEffort, RubricOptions, default_codex_acp_binary,
};
pub(super) const DEFAULT_SUBMIT_TIMEOUT: Duration = Duration::from_secs(600);
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct PoolConfig {
pub workers: usize,
pub max_prompts_per_worker: u32,
pub max_retries: u32,
pub backoff_base: Duration,
pub backoff_cap: Duration,
pub default_options: RubricOptions,
pub codex_acp_binary: PathBuf,
pub extra_env: Vec<(OsString, OsString)>,
pub submit_timeout: Duration,
pub source_codex_home: Option<PathBuf>,
pub log_capture: Option<LogCaptureConfig>,
}
impl Default for PoolConfig {
fn default() -> Self {
Self {
workers: 4,
max_prompts_per_worker: 50,
max_retries: 4,
backoff_base: Duration::from_secs(30),
backoff_cap: Duration::from_secs(300),
default_options: default_options(),
codex_acp_binary: default_codex_acp_binary(),
extra_env: Vec::new(),
submit_timeout: DEFAULT_SUBMIT_TIMEOUT,
source_codex_home: None,
log_capture: None,
}
}
}
fn default_options() -> RubricOptions {
RubricOptions {
model: Some(DEFAULT_CODEX_ACP_MODEL.to_string()),
effort: Some(RubricEffort::from(DEFAULT_CODEX_ACP_REASONING_EFFORT)),
system_prompt: Some(DEFAULT_SYSTEM_PROMPT.to_string()),
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct LogCaptureConfig {
pub temp_dir: PathBuf,
pub output_dir: PathBuf,
pub path_mode: LogPathMode,
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub enum LogPathMode {
RelativeTo(PathBuf),
#[default]
Absolute,
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub struct PoolStats {
pub completed: u64,
pub failures: u64,
pub rate_limit_events: Vec<crate::RateLimitEvent>,
pub worker_recycles: u64,
}