use std::pin::Pin;
use futures::stream::Stream;
use serde_json::Value;
use crate::error::ProviderError;
use crate::message::{StopReason, ThinkingMetadata, ThinkingProvider, Usage};
use crate::mode::ModeAuthority;
use crate::prompt_policy::PolicyId;
use crate::steering::TurnId;
use crate::tool::ToolClass;
#[derive(Debug, Clone)]
pub enum StreamEvent {
TurnStarted { turn_id: TurnId },
ModeChanged {
from: String,
to: String,
authority: ModeAuthority,
},
ModeChangeRequested {
from: String,
to: String,
requested_at: TurnId,
},
ContinuationInjected { guard_name: String, iteration: u32 },
GuardAborted { guard_name: String, reason: String },
PolicyInstalled { policy_id: PolicyId },
PolicyRemoved { policy_id: PolicyId },
PolicyApplied {
turn_id: TurnId,
policy_ids: Vec<PolicyId>,
},
ContentDelta(String),
ThinkingDelta { text: String },
ThinkingBlock {
text: String,
provider: ThinkingProvider,
metadata: ThinkingMetadata,
},
ToolUse {
id: String,
name: String,
input: Value,
},
ToolCallPending {
id: String,
name: String,
input: Value,
class: ToolClass,
},
MessageDelta { stop_reason: StopReason },
Usage(Usage),
Done,
}
pub type ProviderEventStream =
Pin<Box<dyn Stream<Item = Result<StreamEvent, ProviderError>> + Send>>;