steer_core/app/domain/
effect.rs1use 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}