generated from nhcarrigan/template
feat: parse and display rate_limit_event messages from Claude CLI
Closes #155 - Add RateLimitInfo struct and RateLimitEvent variant to ClaudeMessage - Emit rate-limit OutputEvent with human-readable message in wsl_bridge - Add rate-limit line type to TerminalLine union and Terminal rendering - Display rate-limit lines in amber with [rate-limit] prefix - Add Terminal.test.ts with 28 tests for getLineClass, getLinePrefix, formatTime, isToolContentLong, and truncateToolContent
This commit is contained in:
@@ -1521,6 +1521,23 @@ fn process_json_line(
|
||||
emit_state_change(app, state, None, conversation_id.clone());
|
||||
}
|
||||
|
||||
ClaudeMessage::RateLimitEvent { rate_limit_info } => {
|
||||
tracing::warn!("Rate limit event received: {:?}", rate_limit_info);
|
||||
|
||||
let content = format_rate_limit_message(rate_limit_info);
|
||||
let _ = app.emit(
|
||||
"claude:output",
|
||||
OutputEvent {
|
||||
line_type: "rate-limit".to_string(),
|
||||
content,
|
||||
tool_name: None,
|
||||
conversation_id: conversation_id.clone(),
|
||||
cost: None,
|
||||
parent_tool_use_id: None,
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
ClaudeMessage::User { message } => {
|
||||
// Increment message count for user messages
|
||||
stats.write().increment_messages();
|
||||
@@ -1629,6 +1646,35 @@ fn get_tool_state(tool_name: &str) -> CharacterState {
|
||||
}
|
||||
}
|
||||
|
||||
fn format_rate_limit_message(info: &crate::types::RateLimitInfo) -> String {
|
||||
let mut parts = Vec::new();
|
||||
|
||||
if let (Some(remaining), Some(limit)) = (info.requests_remaining, info.requests_limit) {
|
||||
parts.push(format!("requests: {}/{}", remaining, limit));
|
||||
}
|
||||
|
||||
if let (Some(remaining), Some(limit)) = (info.tokens_remaining, info.tokens_limit) {
|
||||
parts.push(format!("tokens: {}/{}", remaining, limit));
|
||||
}
|
||||
|
||||
if let Some(reset) = &info.requests_reset {
|
||||
parts.push(format!("resets at {}", reset));
|
||||
} else if let Some(reset) = &info.tokens_reset {
|
||||
parts.push(format!("resets at {}", reset));
|
||||
}
|
||||
|
||||
if let Some(retry_ms) = info.retry_after_ms {
|
||||
let secs = retry_ms / 1000;
|
||||
parts.push(format!("retry after {}s", secs));
|
||||
}
|
||||
|
||||
if parts.is_empty() {
|
||||
"Rate limit reached".to_string()
|
||||
} else {
|
||||
format!("Rate limit reached — {}", parts.join(", "))
|
||||
}
|
||||
}
|
||||
|
||||
fn format_tool_description(name: &str, input: &serde_json::Value) -> String {
|
||||
// Helper function to check if a path is a memory file
|
||||
fn is_memory_path(path: &str) -> bool {
|
||||
|
||||
Reference in New Issue
Block a user