[codex] surface rollout budget exhaustion (#29715)

## Summary
- surface shared rollout-budget exhaustion as
`CodexErr::RolloutBudgetExceeded` instead of a generic interrupted turn
- map it through the existing `CodexErrorInfo` and app-server v2
`codexErrorInfo` path
- keep local compaction from retrying after the shared rollout budget is
exhausted

This gives app-server clients a stable `rolloutBudgetExceeded` error
they can classify without guessing from `status="interrupted"`.

## Tests
- `just test -p codex-core rollout_budget`
This commit is contained in:
rka-oai
2026-06-23 15:01:28 -07:00
committed by GitHub
Unverified
parent be0dfcfbea
commit bbbea91960
26 changed files with 60 additions and 26 deletions
+6
View File
@@ -275,6 +275,12 @@ async fn run_compact_task_inner_impl(
Err(err @ (CodexErr::Interrupted | CodexErr::TurnAborted)) => {
return Err(err);
}
Err(e @ CodexErr::RolloutBudgetExceeded) => {
sess.track_turn_codex_error(turn_context.as_ref(), &e);
let event = EventMsg::Error(e.to_error_event(/*message_prefix*/ None));
sess.send_event(&turn_context, event).await;
return Err(e);
}
Err(e @ CodexErr::ContextWindowExceeded) => {
if turn_input_len > 1 {
// Trim from the beginning to preserve cache (prefix-based) and keep recent messages intact.
+1 -1
View File
@@ -30,7 +30,7 @@ impl Session {
.rollout_budget()
.record_usage(usage)
{
return Err(CodexErr::TurnAborted);
return Err(CodexErr::RolloutBudgetExceeded);
}
Ok(())
}