mirror of
https://github.com/harivansh-afk/sandbox-agent.git
synced 2026-04-15 07:04:48 +00:00
fix: end opencode turn on errors to avoid hangs (#126)
This commit is contained in:
parent
2f1e30f85a
commit
915d484845
1 changed files with 47 additions and 11 deletions
|
|
@ -1394,6 +1394,38 @@ fn emit_file_edited(state: &OpenCodeState, path: &str) {
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn emit_session_idle(state: &OpenCodeState, session_id: &str) {
|
||||||
|
state.emit_event(json!({
|
||||||
|
"type": "session.status",
|
||||||
|
"properties": {"sessionID": session_id, "status": {"type": "idle"}}
|
||||||
|
}));
|
||||||
|
state.emit_event(json!({
|
||||||
|
"type": "session.idle",
|
||||||
|
"properties": {"sessionID": session_id}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
|
fn emit_session_error(
|
||||||
|
state: &OpenCodeState,
|
||||||
|
session_id: &str,
|
||||||
|
message: &str,
|
||||||
|
code: Option<&str>,
|
||||||
|
details: Option<Value>,
|
||||||
|
) {
|
||||||
|
let mut error = serde_json::Map::new();
|
||||||
|
error.insert("data".to_string(), json!({"message": message}));
|
||||||
|
if let Some(code) = code {
|
||||||
|
error.insert("code".to_string(), json!(code));
|
||||||
|
}
|
||||||
|
if let Some(details) = details {
|
||||||
|
error.insert("details".to_string(), details);
|
||||||
|
}
|
||||||
|
state.emit_event(json!({
|
||||||
|
"type": "session.error",
|
||||||
|
"properties": {"sessionID": session_id, "error": Value::Object(error)}
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
fn permission_event(event_type: &str, permission: &Value) -> Value {
|
fn permission_event(event_type: &str, permission: &Value) -> Value {
|
||||||
json!({
|
json!({
|
||||||
"type": event_type,
|
"type": event_type,
|
||||||
|
|
@ -1626,17 +1658,15 @@ async fn apply_universal_event(state: Arc<OpenCodeAppState>, event: UniversalEve
|
||||||
}
|
}
|
||||||
UniversalEventType::Error => {
|
UniversalEventType::Error => {
|
||||||
if let UniversalEventData::Error(error) = &event.data {
|
if let UniversalEventData::Error(error) = &event.data {
|
||||||
state.opencode.emit_event(json!({
|
let session_id = event.session_id.clone();
|
||||||
"type": "session.error",
|
emit_session_error(
|
||||||
"properties": {
|
&state.opencode,
|
||||||
"sessionID": event.session_id,
|
&session_id,
|
||||||
"error": {
|
&error.message,
|
||||||
"data": {"message": error.message},
|
error.code.as_deref(),
|
||||||
"code": error.code,
|
error.details.clone(),
|
||||||
"details": error.details,
|
);
|
||||||
}
|
emit_session_idle(&state.opencode, &session_id);
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
|
|
@ -3400,6 +3430,9 @@ async fn oc_session_message_create(
|
||||||
?err,
|
?err,
|
||||||
"failed to ensure backing session"
|
"failed to ensure backing session"
|
||||||
);
|
);
|
||||||
|
emit_session_error(&state.opencode, &session_id, &err.to_string(), None, None);
|
||||||
|
emit_session_idle(&state.opencode, &session_id);
|
||||||
|
return sandbox_error_response(err).into_response();
|
||||||
} else {
|
} else {
|
||||||
ensure_session_stream(state.clone(), session_id.clone()).await;
|
ensure_session_stream(state.clone(), session_id.clone()).await;
|
||||||
}
|
}
|
||||||
|
|
@ -3421,6 +3454,9 @@ async fn oc_session_message_create(
|
||||||
?err,
|
?err,
|
||||||
"failed to send message to backing agent"
|
"failed to send message to backing agent"
|
||||||
);
|
);
|
||||||
|
emit_session_error(&state.opencode, &session_id, &err.to_string(), None, None);
|
||||||
|
emit_session_idle(&state.opencode, &session_id);
|
||||||
|
return sandbox_error_response(err).into_response();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue