Move unconscious agents to their own task with watch channel
Instead of managing idle timers in the mind event loop, the unconscious agents run on a dedicated task that watches a conscious_active channel. 60s after conscious activity stops, agents start looping. Conscious activity cancels the timer. Expose mind state (DMN, scoring, unconscious timer) on the thalamus screen. Co-Authored-By: ProofOfConcept <poc@bcachefs.org>
This commit is contained in:
parent
7a6322c2bf
commit
74945e5754
3 changed files with 84 additions and 18 deletions
|
|
@ -109,6 +109,7 @@ struct App {
|
|||
context_info: Option<ContextInfo>,
|
||||
agent_state: Vec<crate::mind::SubconsciousSnapshot>,
|
||||
unconscious_state: Vec<crate::mind::UnconsciousSnapshot>,
|
||||
mind_state: Option<crate::mind::MindState>,
|
||||
graph_health: Option<crate::subconscious::daemon::GraphHealth>,
|
||||
/// Agent toggle requests from UI — consumed by mind loop.
|
||||
pub agent_toggles: Vec<String>,
|
||||
|
|
@ -137,6 +138,7 @@ impl App {
|
|||
context_info: None,
|
||||
agent_state: Vec::new(),
|
||||
unconscious_state: Vec::new(),
|
||||
mind_state: None,
|
||||
graph_health: None,
|
||||
agent_toggles: Vec::new(),
|
||||
walked_count: 0,
|
||||
|
|
@ -403,6 +405,7 @@ async fn run(
|
|||
}
|
||||
app.unconscious_state = unc.snapshots();
|
||||
app.graph_health = unc.graph_health.clone();
|
||||
app.mind_state = Some(mind.shared.lock().unwrap().clone());
|
||||
}
|
||||
app.walked_count = mind.subconscious_walked().await.len();
|
||||
if !startup_done {
|
||||
|
|
|
|||
|
|
@ -100,6 +100,27 @@ impl ScreenView for ThalamusScreen {
|
|||
}
|
||||
lines.push(Line::raw(""));
|
||||
|
||||
// Mind state
|
||||
lines.push(Line::styled("── Mind ──", section));
|
||||
lines.push(Line::raw(""));
|
||||
if let Some(ref ms) = app.mind_state {
|
||||
lines.push(Line::raw(format!(" DMN: {} (turn {}/{})",
|
||||
ms.dmn.label(), ms.dmn_turns, ms.max_dmn_turns)));
|
||||
lines.push(Line::raw(format!(" Turn active: {}", ms.turn_active)));
|
||||
lines.push(Line::raw(format!(" Scoring: {}", ms.scoring_in_flight)));
|
||||
let unc_status = if ms.unc_idle {
|
||||
"idle (agents running)".to_string()
|
||||
} else {
|
||||
let remaining = ms.unc_idle_deadline
|
||||
.saturating_duration_since(std::time::Instant::now());
|
||||
format!("{:.0}s until idle", remaining.as_secs_f64())
|
||||
};
|
||||
lines.push(Line::raw(format!(" Unconscious: {}", unc_status)));
|
||||
} else {
|
||||
lines.push(Line::styled(" not initialized", dim));
|
||||
}
|
||||
lines.push(Line::raw(""));
|
||||
|
||||
// Channel status
|
||||
lines.push(Line::styled("── Channels ──", section));
|
||||
lines.push(Line::raw(""));
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue