diff --git a/Cargo.lock b/Cargo.lock
index 6f528894..bbcdbf41 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1841,6 +1841,7 @@ dependencies = [
"chrono",
"crossterm",
"derive_more",
+ "devo-client",
"devo-core",
"devo-protocol",
"devo-provider",
diff --git a/crates/cli/src/prompt_command.rs b/crates/cli/src/prompt_command.rs
index 927dd4b8..a98f70da 100644
--- a/crates/cli/src/prompt_command.rs
+++ b/crates/cli/src/prompt_command.rs
@@ -98,6 +98,7 @@ pub(crate) async fn run_prompt(
agent_coordinator: None,
client_filesystem: None,
client_terminal: None,
+ file_read_ledger: std::sync::Arc::new(devo_core::tools::FileReadLedger::new()),
local_web_search: None,
hooks: (!app_config.hooks.is_empty()).then(|| devo_core::HookRuntimeContext {
runner: devo_core::HookRunner::new(app_config.hooks.clone()),
diff --git a/crates/client/src/client_core.rs b/crates/client/src/client_core.rs
index 386b07de..69c93624 100644
--- a/crates/client/src/client_core.rs
+++ b/crates/client/src/client_core.rs
@@ -46,7 +46,7 @@ pub const ACP_PROMPT_COMPLETED_NOTIFICATION_METHOD: &str = "_devo/acp_prompt/com
const SERVER_RESPONSE_TIMEOUT: Duration = Duration::from_secs(10);
/// Synthetic notifications emitted when falling back to detached `session/prompt`.
-#[derive(Debug, Clone)]
+#[derive(Debug, Clone, PartialEq)]
pub struct ServerNotificationMessage {
pub method: String,
pub params: serde_json::Value,
@@ -412,6 +412,13 @@ impl ServerClientCore {
self.notifications_rx.recv().await
}
+ pub(crate) async fn recv_client_event(&mut self) -> Result