Skip to main content

steer_core/app/domain/
effect.rs

1use crate::app::SystemContext;
2use crate::app::conversation::Message;
3use crate::app::domain::types::{OpId, RequestId, SessionId};
4use crate::config::model::ModelId;
5use steer_tools::{ToolCall, ToolSchema};
6
7use super::event::SessionEvent;
8
9#[derive(Debug, Clone)]
10pub enum Effect {
11    EmitEvent {
12        session_id: SessionId,
13        event: SessionEvent,
14    },
15
16    RequestUserApproval {
17        session_id: SessionId,
18        request_id: RequestId,
19        tool_call: ToolCall,
20    },
21
22    ExecuteTool {
23        session_id: SessionId,
24        op_id: OpId,
25        tool_call: ToolCall,
26    },
27
28    CallModel {
29        session_id: SessionId,
30        op_id: OpId,
31        model: ModelId,
32        messages: Vec<Message>,
33        system_context: Option<SystemContext>,
34        tools: Vec<ToolSchema>,
35    },
36
37    ListWorkspaceFiles {
38        session_id: SessionId,
39    },
40
41    CancelOperation {
42        session_id: SessionId,
43        op_id: OpId,
44    },
45
46    ConnectMcpServer {
47        session_id: SessionId,
48        config: McpServerConfig,
49    },
50
51    DisconnectMcpServer {
52        session_id: SessionId,
53        server_name: String,
54    },
55
56    RequestCompaction {
57        session_id: SessionId,
58        op_id: OpId,
59        model: ModelId,
60    },
61
62    ReloadToolSchemas {
63        session_id: SessionId,
64    },
65}
66
67#[derive(Debug, Clone)]
68pub struct McpServerConfig {
69    pub server_name: String,
70    pub transport: crate::tools::McpTransport,
71    pub tool_filter: crate::session::state::ToolFilter,
72}
73
74impl Effect {
75    pub fn session_id(&self) -> SessionId {
76        match self {
77            Effect::EmitEvent { session_id, .. }
78            | Effect::RequestUserApproval { session_id, .. }
79            | Effect::ExecuteTool { session_id, .. }
80            | Effect::CallModel { session_id, .. }
81            | Effect::ListWorkspaceFiles { session_id }
82            | Effect::CancelOperation { session_id, .. }
83            | Effect::ConnectMcpServer { session_id, .. }
84            | Effect::DisconnectMcpServer { session_id, .. }
85            | Effect::RequestCompaction { session_id, .. }
86            | Effect::ReloadToolSchemas { session_id } => *session_id,
87        }
88    }
89
90    pub fn is_emit_event(&self) -> bool {
91        matches!(self, Effect::EmitEvent { .. })
92    }
93
94    pub fn into_event(self) -> Option<SessionEvent> {
95        match self {
96            Effect::EmitEvent { event, .. } => Some(event),
97            _ => None,
98        }
99    }
100}