fix(daemon): reject dead structured sessions
This commit is contained in:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user