Skip to content

Commit 915d484

Browse files
committed
fix: end opencode turn on errors to avoid hangs (#126)
1 parent 2f1e30f commit 915d484

File tree

1 file changed

+47
-11
lines changed

1 file changed

+47
-11
lines changed

server/packages/sandbox-agent/src/opencode_compat.rs

Lines changed: 47 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,6 +1394,38 @@ fn emit_file_edited(state: &OpenCodeState, path: &str) {
13941394
}));
13951395
}
13961396

1397+
fn emit_session_idle(state: &OpenCodeState, session_id: &str) {
1398+
state.emit_event(json!({
1399+
"type": "session.status",
1400+
"properties": {"sessionID": session_id, "status": {"type": "idle"}}
1401+
}));
1402+
state.emit_event(json!({
1403+
"type": "session.idle",
1404+
"properties": {"sessionID": session_id}
1405+
}));
1406+
}
1407+
1408+
fn emit_session_error(
1409+
state: &OpenCodeState,
1410+
session_id: &str,
1411+
message: &str,
1412+
code: Option<&str>,
1413+
details: Option<Value>,
1414+
) {
1415+
let mut error = serde_json::Map::new();
1416+
error.insert("data".to_string(), json!({"message": message}));
1417+
if let Some(code) = code {
1418+
error.insert("code".to_string(), json!(code));
1419+
}
1420+
if let Some(details) = details {
1421+
error.insert("details".to_string(), details);
1422+
}
1423+
state.emit_event(json!({
1424+
"type": "session.error",
1425+
"properties": {"sessionID": session_id, "error": Value::Object(error)}
1426+
}));
1427+
}
1428+
13971429
fn permission_event(event_type: &str, permission: &Value) -> Value {
13981430
json!({
13991431
"type": event_type,
@@ -1626,17 +1658,15 @@ async fn apply_universal_event(state: Arc<OpenCodeAppState>, event: UniversalEve
16261658
}
16271659
UniversalEventType::Error => {
16281660
if let UniversalEventData::Error(error) = &event.data {
1629-
state.opencode.emit_event(json!({
1630-
"type": "session.error",
1631-
"properties": {
1632-
"sessionID": event.session_id,
1633-
"error": {
1634-
"data": {"message": error.message},
1635-
"code": error.code,
1636-
"details": error.details,
1637-
}
1638-
}
1639-
}));
1661+
let session_id = event.session_id.clone();
1662+
emit_session_error(
1663+
&state.opencode,
1664+
&session_id,
1665+
&error.message,
1666+
error.code.as_deref(),
1667+
error.details.clone(),
1668+
);
1669+
emit_session_idle(&state.opencode, &session_id);
16401670
}
16411671
}
16421672
_ => {}
@@ -3400,6 +3430,9 @@ async fn oc_session_message_create(
34003430
?err,
34013431
"failed to ensure backing session"
34023432
);
3433+
emit_session_error(&state.opencode, &session_id, &err.to_string(), None, None);
3434+
emit_session_idle(&state.opencode, &session_id);
3435+
return sandbox_error_response(err).into_response();
34033436
} else {
34043437
ensure_session_stream(state.clone(), session_id.clone()).await;
34053438
}
@@ -3421,6 +3454,9 @@ async fn oc_session_message_create(
34213454
?err,
34223455
"failed to send message to backing agent"
34233456
);
3457+
emit_session_error(&state.opencode, &session_id, &err.to_string(), None, None);
3458+
emit_session_idle(&state.opencode, &session_id);
3459+
return sandbox_error_response(err).into_response();
34243460
}
34253461
}
34263462

0 commit comments

Comments
 (0)