pub const DEFAULT_MAX_SUBAGENTS: usize = 20;
pub const MAX_SUBAGENTS: usize = 20;
pub const MAX_SUBAGENT_ADMISSION: usize = 200;
pub const DEFAULT_SUBAGENT_API_TIMEOUT_SECS: u64 = 120;
pub const MIN_SUBAGENT_API_TIMEOUT_SECS: u64 = 1;
pub const MAX_SUBAGENT_API_TIMEOUT_SECS: u64 = 1800;
pub const DEFAULT_SUBAGENT_HEARTBEAT_TIMEOUT_SECS: u64 = 300;
pub const MIN_SUBAGENT_HEARTBEAT_TIMEOUT_SECS: u64 = 30;
pub const MAX_SUBAGENT_HEARTBEAT_TIMEOUT_SECS: u64 = 3600;
pub const DEFAULT_STREAM_CHUNK_TIMEOUT_SECS: u64 = 300;
pub const MIN_STREAM_CHUNK_TIMEOUT_SECS: u64 = 1;
pub const MAX_STREAM_CHUNK_TIMEOUT_SECS: u64 = 3600;
pub(crate) const STREAM_CHUNK_TIMEOUT_ENV: &str = "DEEPSEEK_STREAM_IDLE_TIMEOUT_SECS";
pub(crate) fn resolve_subagent_api_timeout_secs(raw: Option<u64>) -> u64 {
let raw = raw.unwrap_or(DEFAULT_SUBAGENT_API_TIMEOUT_SECS);
if raw == 0 {
return DEFAULT_SUBAGENT_API_TIMEOUT_SECS;
}
raw.clamp(MIN_SUBAGENT_API_TIMEOUT_SECS, MAX_SUBAGENT_API_TIMEOUT_SECS)
}
pub(crate) fn resolve_subagent_heartbeat_timeout_secs(
raw: Option<u64>,
api_timeout_secs: u64,
) -> u64 {
let raw = raw.unwrap_or(DEFAULT_SUBAGENT_HEARTBEAT_TIMEOUT_SECS);
let configured = if raw == 0 {
DEFAULT_SUBAGENT_HEARTBEAT_TIMEOUT_SECS
} else {
raw.clamp(
MIN_SUBAGENT_HEARTBEAT_TIMEOUT_SECS,
MAX_SUBAGENT_HEARTBEAT_TIMEOUT_SECS,
)
};
let min_for_api = api_timeout_secs.saturating_add(30).clamp(
MIN_SUBAGENT_HEARTBEAT_TIMEOUT_SECS,
MAX_SUBAGENT_HEARTBEAT_TIMEOUT_SECS,
);
configured.max(min_for_api)
}