@@ -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+
13971429fn 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