mind: move DMN commands to event_loop, remove MindMessage variants
/dmn, /sleep, /wake, /pause now lock MindState directly from the UI event loop. No MindMessage roundtrip needed — they're just state transitions + info display. MindMessage reduced to: Hotkey (Interrupt, CycleAutonomy), NewSession, Score. Everything else handled directly by UI. Co-Authored-By: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
7adc333219
commit
4eb0c891c4
2 changed files with 60 additions and 77 deletions
|
|
@ -347,49 +347,15 @@ impl Mind {
|
||||||
biased;
|
biased;
|
||||||
|
|
||||||
Some(msg) = input_rx.recv() => {
|
Some(msg) = input_rx.recv() => {
|
||||||
{
|
|
||||||
let mut s = self.shared.lock().unwrap();
|
|
||||||
match msg {
|
match msg {
|
||||||
MindMessage::Hotkey(HotkeyAction::CycleAutonomy) => {
|
MindMessage::Hotkey(HotkeyAction::CycleAutonomy) => {
|
||||||
let label = s.cycle_autonomy();
|
let label = self.shared.lock().unwrap().cycle_autonomy();
|
||||||
let _ = self.ui_tx.send(UiMessage::Info(
|
let _ = self.ui_tx.send(UiMessage::Info(
|
||||||
format!("DMN → {} (Ctrl+P to cycle)", label),
|
format!("DMN → {} (Ctrl+P to cycle)", label),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
MindMessage::NewSession => {
|
|
||||||
s.dmn_sleep();
|
|
||||||
let _ = self.ui_tx.send(UiMessage::Info("New session started.".into()));
|
|
||||||
}
|
|
||||||
MindMessage::Score => {
|
|
||||||
if !s.scoring_in_flight {
|
|
||||||
s.scoring_in_flight = true;
|
|
||||||
} else {
|
|
||||||
let _ = self.ui_tx.send(UiMessage::Info("(scoring already in progress)".into()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
MindMessage::DmnQuery => {
|
|
||||||
let _ = self.ui_tx.send(UiMessage::Info(format!("DMN: {:?} ({}/{})", s.dmn, s.dmn_turns, s.max_dmn_turns)));
|
|
||||||
}
|
|
||||||
MindMessage::DmnSleep => {
|
|
||||||
s.dmn_sleep();
|
|
||||||
let _ = self.ui_tx.send(UiMessage::Info("DMN sleeping.".into()));
|
|
||||||
}
|
|
||||||
MindMessage::DmnWake => {
|
|
||||||
s.dmn_wake();
|
|
||||||
let _ = self.ui_tx.send(UiMessage::Info("DMN foraging.".into()));
|
|
||||||
}
|
|
||||||
MindMessage::DmnPause => {
|
|
||||||
s.dmn_pause();
|
|
||||||
let _ = self.ui_tx.send(UiMessage::Info("DMN paused.".into()));
|
|
||||||
}
|
|
||||||
MindMessage::Hotkey(HotkeyAction::Interrupt) => {
|
MindMessage::Hotkey(HotkeyAction::Interrupt) => {
|
||||||
s.interrupt();
|
self.shared.lock().unwrap().interrupt();
|
||||||
}
|
|
||||||
_ => {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Handle interrupt — kill processes and abort turn
|
|
||||||
if matches!(msg, MindMessage::Hotkey(HotkeyAction::Interrupt)) {
|
|
||||||
let ag = self.agent.lock().await;
|
let ag = self.agent.lock().await;
|
||||||
let mut tools = ag.active_tools.lock().unwrap();
|
let mut tools = ag.active_tools.lock().unwrap();
|
||||||
for entry in tools.drain(..) { entry.handle.abort(); }
|
for entry in tools.drain(..) { entry.handle.abort(); }
|
||||||
|
|
@ -399,8 +365,8 @@ impl Mind {
|
||||||
let _ = self.turn_watch.send(false);
|
let _ = self.turn_watch.send(false);
|
||||||
let _ = self.ui_tx.send(UiMessage::Info("(interrupted)".into()));
|
let _ = self.ui_tx.send(UiMessage::Info("(interrupted)".into()));
|
||||||
}
|
}
|
||||||
// Handle /new — reset agent
|
MindMessage::NewSession => {
|
||||||
if matches!(msg, MindMessage::NewSession) {
|
self.shared.lock().unwrap().dmn_sleep();
|
||||||
let new_log = log::ConversationLog::new(
|
let new_log = log::ConversationLog::new(
|
||||||
self.config.session_dir.join("conversation.jsonl"),
|
self.config.session_dir.join("conversation.jsonl"),
|
||||||
).ok();
|
).ok();
|
||||||
|
|
@ -413,10 +379,19 @@ impl Mind {
|
||||||
self.config.app.clone(), self.config.prompt_file.clone(),
|
self.config.app.clone(), self.config.prompt_file.clone(),
|
||||||
new_log, shared_ctx, shared_tools,
|
new_log, shared_ctx, shared_tools,
|
||||||
);
|
);
|
||||||
|
let _ = self.ui_tx.send(UiMessage::Info("New session started.".into()));
|
||||||
}
|
}
|
||||||
// Handle /score — spawn scoring
|
MindMessage::Score => {
|
||||||
if matches!(msg, MindMessage::Score) && self.shared.lock().unwrap().scoring_in_flight {
|
let mut s = self.shared.lock().unwrap();
|
||||||
|
if !s.scoring_in_flight {
|
||||||
|
s.scoring_in_flight = true;
|
||||||
|
drop(s);
|
||||||
self.start_memory_scoring();
|
self.start_memory_scoring();
|
||||||
|
} else {
|
||||||
|
let _ = self.ui_tx.send(UiMessage::Info("(scoring already in progress)".into()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
}
|
}
|
||||||
// Check for pending input
|
// Check for pending input
|
||||||
let action = self.shared.lock().unwrap().take_pending_input();
|
let action = self.shared.lock().unwrap().take_pending_input();
|
||||||
|
|
|
||||||
|
|
@ -20,10 +20,6 @@ use crate::user::ui_channel::{self, UiMessage};
|
||||||
/// Messages from the UI to the Mind.
|
/// Messages from the UI to the Mind.
|
||||||
pub enum MindMessage {
|
pub enum MindMessage {
|
||||||
Hotkey(HotkeyAction),
|
Hotkey(HotkeyAction),
|
||||||
DmnSleep,
|
|
||||||
DmnWake,
|
|
||||||
DmnPause,
|
|
||||||
DmnQuery,
|
|
||||||
NewSession,
|
NewSession,
|
||||||
Score,
|
Score,
|
||||||
}
|
}
|
||||||
|
|
@ -289,10 +285,22 @@ pub async fn run(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
"/new" | "/clear" => { let _ = mind_tx.send(MindMessage::NewSession); }
|
"/new" | "/clear" => { let _ = mind_tx.send(MindMessage::NewSession); }
|
||||||
"/dmn" => { let _ = mind_tx.send(MindMessage::DmnQuery); }
|
"/dmn" => {
|
||||||
"/sleep" => { let _ = mind_tx.send(MindMessage::DmnSleep); }
|
let s = shared_mind.lock().unwrap();
|
||||||
"/wake" => { let _ = mind_tx.send(MindMessage::DmnWake); }
|
let _ = ui_tx.send(UiMessage::Info(format!("DMN: {:?} ({}/{})", s.dmn, s.dmn_turns, s.max_dmn_turns)));
|
||||||
"/pause" => { let _ = mind_tx.send(MindMessage::DmnPause); }
|
}
|
||||||
|
"/sleep" => {
|
||||||
|
shared_mind.lock().unwrap().dmn_sleep();
|
||||||
|
let _ = ui_tx.send(UiMessage::Info("DMN sleeping.".into()));
|
||||||
|
}
|
||||||
|
"/wake" => {
|
||||||
|
shared_mind.lock().unwrap().dmn_wake();
|
||||||
|
let _ = ui_tx.send(UiMessage::Info("DMN foraging.".into()));
|
||||||
|
}
|
||||||
|
"/pause" => {
|
||||||
|
shared_mind.lock().unwrap().dmn_pause();
|
||||||
|
let _ = ui_tx.send(UiMessage::Info("DMN paused.".into()));
|
||||||
|
}
|
||||||
"/score" => { let _ = mind_tx.send(MindMessage::Score); }
|
"/score" => { let _ = mind_tx.send(MindMessage::Score); }
|
||||||
"/retry" => {
|
"/retry" => {
|
||||||
let agent = agent.clone();
|
let agent = agent.clone();
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue