huskies: merge 882

This commit is contained in:
dave
2026-04-30 00:31:08 +00:00
parent a796bd933f
commit b0de86767a
7 changed files with 173 additions and 3 deletions
+5
View File
@@ -61,6 +61,9 @@ impl AgentRuntime for ClaudeCodeRuntime {
match pty_result {
Ok(result) => Ok(RuntimeResult {
// Abort+no-session: CLI crashed (e.g. SIGABRT) before emitting its
// first "system" event. Detected by: non-zero exit AND no session.
aborted_signal: !result.exit_ok && result.session_id.is_none(),
session_id: result.session_id,
token_usage: result.token_usage,
}),
@@ -90,6 +93,8 @@ impl AgentRuntime for ClaudeCodeRuntime {
)
.await?;
Ok(RuntimeResult {
aborted_signal: !fallback_result.exit_ok
&& fallback_result.session_id.is_none(),
session_id: fallback_result.session_id,
token_usage: fallback_result.token_usage,
})
+4
View File
@@ -135,6 +135,7 @@ impl AgentRuntime for GeminiRuntime {
return Ok(RuntimeResult {
session_id: None,
token_usage: Some(total_usage),
aborted_signal: false,
});
}
@@ -148,6 +149,7 @@ impl AgentRuntime for GeminiRuntime {
return Ok(RuntimeResult {
session_id: None,
token_usage: Some(total_usage),
aborted_signal: false,
});
}
@@ -248,6 +250,7 @@ impl AgentRuntime for GeminiRuntime {
return Ok(RuntimeResult {
session_id: None,
token_usage: Some(total_usage),
aborted_signal: false,
});
}
@@ -330,6 +333,7 @@ impl AgentRuntime for GeminiRuntime {
Ok(RuntimeResult {
session_id: None,
token_usage: Some(total_usage),
aborted_signal: false,
})
}
+10
View File
@@ -47,6 +47,14 @@ pub struct RuntimeContext {
pub struct RuntimeResult {
pub session_id: Option<String>,
pub token_usage: Option<TokenUsage>,
/// `true` when the process exited with a failure AND no session was established.
///
/// This indicates the Claude Code CLI crashed (e.g. SIGABRT from an assertion
/// failure) before it could emit its first "system" event — the classic
/// "signal=Aborted, Session: None" case (bug 882). The completion handler
/// 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,
}
/// Runtime status reported by the backend.
@@ -138,6 +146,7 @@ mod tests {
cache_read_input_tokens: 0,
total_cost_usd: 0.01,
}),
aborted_signal: false,
};
assert_eq!(result.session_id, Some("sess-123".to_string()));
assert!(result.token_usage.is_some());
@@ -152,6 +161,7 @@ mod tests {
let result = RuntimeResult {
session_id: None,
token_usage: None,
aborted_signal: false,
};
assert!(result.session_id.is_none());
assert!(result.token_usage.is_none());
+3
View File
@@ -122,6 +122,7 @@ impl AgentRuntime for OpenAiRuntime {
return Ok(RuntimeResult {
session_id: None,
token_usage: Some(total_usage),
aborted_signal: false,
});
}
@@ -135,6 +136,7 @@ impl AgentRuntime for OpenAiRuntime {
return Ok(RuntimeResult {
session_id: None,
token_usage: Some(total_usage),
aborted_signal: false,
});
}
@@ -218,6 +220,7 @@ impl AgentRuntime for OpenAiRuntime {
return Ok(RuntimeResult {
session_id: None,
token_usage: Some(total_usage),
aborted_signal: false,
});
}