huskies: merge 1053

This commit is contained in:
dave
2026-05-14 18:40:37 +00:00
parent bb5abcd042
commit 96e227d8d4
7 changed files with 215 additions and 0 deletions
+4
View File
@@ -71,6 +71,8 @@ impl AgentRuntime for ClaudeCodeRuntime {
aborted_signal: !result.exit_ok && result.session_id.is_none(),
session_id: result.session_id,
token_usage: result.token_usage,
rate_limit_exit: result.rate_limit_exit,
rate_limit_reset_at: result.rate_limit_reset_at,
}),
Err(e) if ctx.session_id_to_resume.is_some() && ctx.fresh_prompt.is_some() => {
// Resume failed — fall back to a fresh session without --resume.
@@ -103,6 +105,8 @@ impl AgentRuntime for ClaudeCodeRuntime {
&& fallback_result.session_id.is_none(),
session_id: fallback_result.session_id,
token_usage: fallback_result.token_usage,
rate_limit_exit: fallback_result.rate_limit_exit,
rate_limit_reset_at: fallback_result.rate_limit_reset_at,
})
}
Err(e) => Err(e),
+8
View File
@@ -136,6 +136,8 @@ impl AgentRuntime for GeminiRuntime {
session_id: None,
token_usage: Some(total_usage),
aborted_signal: false,
rate_limit_exit: false,
rate_limit_reset_at: None,
});
}
@@ -150,6 +152,8 @@ impl AgentRuntime for GeminiRuntime {
session_id: None,
token_usage: Some(total_usage),
aborted_signal: false,
rate_limit_exit: false,
rate_limit_reset_at: None,
});
}
@@ -251,6 +255,8 @@ impl AgentRuntime for GeminiRuntime {
session_id: None,
token_usage: Some(total_usage),
aborted_signal: false,
rate_limit_exit: false,
rate_limit_reset_at: None,
});
}
@@ -334,6 +340,8 @@ impl AgentRuntime for GeminiRuntime {
session_id: None,
token_usage: Some(total_usage),
aborted_signal: false,
rate_limit_exit: false,
rate_limit_reset_at: None,
})
}
+17
View File
@@ -63,6 +63,19 @@ pub struct RuntimeResult {
/// uses this flag to skip acceptance gates and respawn without consuming a
/// retry slot. Always `false` for API-based runtimes (Gemini, OpenAI).
pub aborted_signal: bool,
/// `true` when the Claude Code CLI received a rate-limit hard block event
/// before exiting (bug 1053).
///
/// The completion handler uses this to distinguish a rate-limit-forced exit
/// from a genuine no-progress exit, so commit-recovery counters are not
/// incremented. Always `false` for API-based runtimes (Gemini, OpenAI).
pub rate_limit_exit: bool,
/// When the API rate limit is scheduled to reset.
///
/// Populated from the `reset_at` field of the `rate_limit_event` JSON when
/// `rate_limit_exit` is `true`. The completion handler honours this window
/// before re-attempting the agent spawn. `None` for API-based runtimes.
pub rate_limit_reset_at: Option<chrono::DateTime<chrono::Utc>>,
}
/// Runtime status reported by the backend.
@@ -157,6 +170,8 @@ mod tests {
total_cost_usd: 0.01,
}),
aborted_signal: false,
rate_limit_exit: false,
rate_limit_reset_at: None,
};
assert_eq!(result.session_id, Some("sess-123".to_string()));
assert!(result.token_usage.is_some());
@@ -172,6 +187,8 @@ mod tests {
session_id: None,
token_usage: None,
aborted_signal: false,
rate_limit_exit: false,
rate_limit_reset_at: None,
};
assert!(result.session_id.is_none());
assert!(result.token_usage.is_none());
+6
View File
@@ -123,6 +123,8 @@ impl AgentRuntime for OpenAiRuntime {
session_id: None,
token_usage: Some(total_usage),
aborted_signal: false,
rate_limit_exit: false,
rate_limit_reset_at: None,
});
}
@@ -137,6 +139,8 @@ impl AgentRuntime for OpenAiRuntime {
session_id: None,
token_usage: Some(total_usage),
aborted_signal: false,
rate_limit_exit: false,
rate_limit_reset_at: None,
});
}
@@ -221,6 +225,8 @@ impl AgentRuntime for OpenAiRuntime {
session_id: None,
token_usage: Some(total_usage),
aborted_signal: false,
rate_limit_exit: false,
rate_limit_reset_at: None,
});
}