use jamjet_state::backend::WorkItem;
use serde_json::Value;
pub type StreamEventSender = tokio::sync::mpsc::Sender<Value>;
pub struct ExecutionResult {
pub output: Value,
pub state_patch: Value,
pub duration_ms: u64,
pub gen_ai_system: Option<String>,
pub gen_ai_model: Option<String>,
pub input_tokens: Option<u64>,
pub output_tokens: Option<u64>,
pub finish_reason: Option<String>,
}
#[async_trait::async_trait]
pub trait NodeExecutor: Send + Sync {
async fn execute(&self, item: &WorkItem) -> Result<ExecutionResult, String>;
async fn execute_streaming(
&self,
item: &WorkItem,
_tx: StreamEventSender,
) -> Result<ExecutionResult, String> {
self.execute(item).await
}
}