Revert to tokio::sync::Mutex, fix lock-across-await bugs, move input ownership to InteractScreen

The std::sync::Mutex detour caught every place a MutexGuard lived
across an await point in Agent::turn — the compiler enforced Send
safety that tokio::sync::Mutex silently allows. With those fixed,
switch back to tokio::sync::Mutex (std::sync blocks tokio worker
threads and panics inside the runtime).

Input and command dispatch now live in InteractScreen (chat.rs):
- Enter pushes directly to SharedMindState.input (no app.submitted hop)
- sync_from_agent displays pending input with dimmed color
- Slash command table moved from event_loop.rs to chat.rs
- cmd_switch_model kept as pub fn for tool-initiated switches

Co-Authored-By: Proof of Concept <poc@bcachefs.org>
This commit is contained in:
ProofOfConcept 2026-04-05 21:13:48 -04:00
parent 3e1be4d353
commit 48beb8b663
9 changed files with 404 additions and 370 deletions

View file

@ -602,7 +602,7 @@ fn str_err<T>(r: Result<T, String>) -> anyhow::Result<T> {
/// digest_daily tool handler: generate a daily digest
async fn handle_digest_daily(
_agent: Option<std::sync::Arc<std::sync::Mutex<super::super::agent::Agent>>>,
_agent: Option<std::sync::Arc<tokio::sync::Mutex<super::super::agent::Agent>>>,
args: serde_json::Value,
) -> anyhow::Result<String> {
let date = str_err(get_str_required(&args, "date"))?;
@ -613,7 +613,7 @@ async fn handle_digest_daily(
/// digest_weekly tool handler: generate a weekly digest
async fn handle_digest_weekly(
_agent: Option<std::sync::Arc<std::sync::Mutex<super::super::agent::Agent>>>,
_agent: Option<std::sync::Arc<tokio::sync::Mutex<super::super::agent::Agent>>>,
args: serde_json::Value,
) -> anyhow::Result<String> {
let week_label = str_err(get_str_required(&args, "week"))?;
@ -624,7 +624,7 @@ async fn handle_digest_weekly(
/// digest_monthly tool handler: generate a monthly digest
async fn handle_digest_monthly(
_agent: Option<std::sync::Arc<std::sync::Mutex<super::super::agent::Agent>>>,
_agent: Option<std::sync::Arc<tokio::sync::Mutex<super::super::agent::Agent>>>,
args: serde_json::Value,
) -> anyhow::Result<String> {
let month = str_err(get_str_required(&args, "month"))?;
@ -635,7 +635,7 @@ async fn handle_digest_monthly(
/// digest_auto tool handler: auto-generate all missing digests
async fn handle_digest_auto(
_agent: Option<std::sync::Arc<std::sync::Mutex<super::super::agent::Agent>>>,
_agent: Option<std::sync::Arc<tokio::sync::Mutex<super::super::agent::Agent>>>,
_args: serde_json::Value,
) -> anyhow::Result<String> {
let mut store = str_err(Store::load())?;
@ -645,7 +645,7 @@ async fn handle_digest_auto(
/// digest_links tool handler: parse and apply digest links
async fn handle_digest_links(
_agent: Option<std::sync::Arc<std::sync::Mutex<super::super::agent::Agent>>>,
_agent: Option<std::sync::Arc<tokio::sync::Mutex<super::super::agent::Agent>>>,
_args: serde_json::Value,
) -> anyhow::Result<String> {
let mut store = str_err(Store::load())?;