huskies: merge 882
This commit is contained in:
@@ -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,
|
||||
})
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user