Skip to main content

algocline_core/
observer.rs

1use crate::recent_log::LogEntry;
2use crate::{ExecutionSpec, LlmQuery, QueryId, TokenUsage};
3
4/// Observer for execution state transitions.
5///
6/// Hooks cross-cutting concerns (stats, logging) without
7/// polluting the Execution core.
8pub trait ExecutionObserver: Send + Sync {
9    fn on_started(&self, _spec: &ExecutionSpec) {}
10    /// LLM request issued (transition to Paused).
11    fn on_paused(&self, _queries: &[LlmQuery]) {}
12    /// Partial response arrived (not yet complete).
13    fn on_partial_feed(&self, _query_id: &QueryId, _remaining: usize) {}
14    /// A single LLM response has been fed back.
15    /// `usage` contains host-provided token counts when available.
16    fn on_response_fed(&self, _query_id: &QueryId, _response: &str, _usage: Option<&TokenUsage>) {}
17    /// All responses arrived, Lua resuming (transition to Running).
18    fn on_resumed(&self) {}
19    fn on_completed(&self, _result: &serde_json::Value) {}
20    fn on_failed(&self, _error: &str) {}
21    /// Host-initiated cancellation.
22    fn on_cancelled(&self) {}
23    /// A log entry was emitted by the session (Lua `print`, `alc.log`, or engine).
24    ///
25    /// Default implementation is a no-op.  Override in observers that capture
26    /// per-session log output (e.g. [`MetricsObserver`](crate::MetricsObserver)).
27    fn on_log(&self, _entry: &LogEntry) {}
28}