fix(daemon): reject dead structured sessions

This commit is contained in:
Miguel Palhas
2026-09-05 02:13:55 +01:00
parent c7c294996e
commit bbae09bc48
3 changed files with 58 additions and 10 deletions
+20 -6
View File
@@ -103,6 +103,15 @@ pub struct SessionRecord {
acp_event_pump: Option<watch::Receiver<bool>>,
}
impl SessionRecord {
fn is_live_structured(&self) -> bool {
self.session.view == SessionView::Structured
&& self.session.status == SessionStatus::Running
&& self.acp.is_some()
&& self.acp_events.is_some()
}
}
#[derive(Debug)]
struct AcpEventStream {
log: EventLog,
@@ -341,6 +350,9 @@ impl SessionManager {
let Some(record) = sessions.get(&id) else {
return Ok(None);
};
if !record.is_live_structured() {
return Ok(None);
}
let Some(stream) = &record.acp_events else {
return Ok(None);
};
@@ -378,7 +390,7 @@ impl SessionManager {
let stream = {
let sessions = self.inner.sessions.lock().await;
let record = sessions.get(&id).ok_or(SessionError::NotFound(id))?;
if record.session.view != SessionView::Structured {
if !record.is_live_structured() {
return Ok(None);
}
record.acp_events.clone()
@@ -441,9 +453,10 @@ impl SessionManager {
> {
let stream = {
let sessions = self.inner.sessions.lock().await;
let Some(record) = sessions.get(&id) else {
let record = sessions.get(&id).ok_or(SessionError::NotFound(id))?;
if !record.is_live_structured() {
return Ok(None);
};
}
let Some(stream) = &record.acp_events else {
return Ok(None);
};
@@ -488,9 +501,7 @@ impl SessionManager {
let (acp, stream) = {
let sessions = self.inner.sessions.lock().await;
let record = sessions.get(&id).ok_or(SessionError::NotFound(id))?;
if record.session.view != SessionView::Structured
|| record.session.status != SessionStatus::Running
{
if !record.is_live_structured() {
return Ok(BeginAcpTurn::Unavailable);
}
(record.acp.clone(), record.acp_events.clone())
@@ -512,6 +523,9 @@ impl SessionManager {
let (acp, stream) = {
let sessions = self.inner.sessions.lock().await;
let record = sessions.get(&id).ok_or(SessionError::NotFound(id))?;
if !record.is_live_structured() {
return Ok(false);
}
(record.acp.clone(), record.acp_events.clone())
};
let (Some(acp), Some(stream)) = (acp, stream) else {