@@ -36,6 +36,7 @@ fn sse_stream_internal<F, L>(
3636 formatter : F ,
3737 session_id : String ,
3838 lifecycle : Option < L > ,
39+ stop_on_pause : bool ,
3940) -> impl Stream < Item = Result < Event , Infallible > >
4041where
4142 F : EventFormatter + ' static ,
5556 loop {
5657 match rx. next ( ) . await {
5758 Some ( Ok ( event) ) => {
58- let is_terminal = is_terminal_event ( & event) ;
59+ let is_terminal = is_terminal_event ( & event, stop_on_pause ) ;
5960 let formatted = fmt. format_event ( event, & session_id) . await ;
6061 let new_done = if is_terminal { true } else { done } ;
6162
@@ -93,23 +94,31 @@ where
9394
9495/// Core SSE stream creation from event receiver
9596/// Watches events, formats them, and stops on completion or client disconnect
97+ ///
98+ /// # Parameters
99+ /// * `stop_on_pause` - If true, only stops on Completed. If false, stops on Completed or StatusChanged to Paused.
96100pub fn event_to_sse_stream < F > (
97101 event_rx : Receiver < AgentEvent > ,
98102 formatter : F ,
99103 session_id : String ,
104+ stop_on_pause : bool ,
100105) -> impl Stream < Item = Result < Event , Infallible > >
101106where
102107 F : EventFormatter + ' static ,
103108{
104- sse_stream_internal ( event_rx, formatter, session_id, None :: < ( ) > )
109+ sse_stream_internal ( event_rx, formatter, session_id, None :: < ( ) > , stop_on_pause )
105110}
106111
107112/// Create an SSE stream from a RequestSession
108113/// Same as sse_stream but keeps lifecycle in scope for session cleanup
114+ ///
115+ /// # Parameters
116+ /// * `stop_on_pause` - If true, only stops on Completed. If false, stops on Completed or StatusChanged to Paused.
109117pub fn session_to_sse_stream < F > (
110118 request_session : RequestSession ,
111119 formatter : F ,
112120 session_id : String ,
121+ stop_on_pause : bool ,
113122) -> impl Stream < Item = Result < Event , Infallible > >
114123where
115124 F : EventFormatter + ' static ,
@@ -118,17 +127,20 @@ where
118127 let _controller = request_session. controller ;
119128 let lifecycle = request_session. lifecycle ;
120129
121- sse_stream_internal ( event_rx, formatter, session_id, Some ( lifecycle) )
130+ sse_stream_internal ( event_rx, formatter, session_id, Some ( lifecycle) , stop_on_pause )
122131}
123132
124133/// Check if an event signals the end of the stream
125- fn is_terminal_event ( event : & AgentEvent ) -> bool {
126- matches ! (
127- event,
128- AgentEvent :: Completed { .. }
129- | AgentEvent :: StatusChanged {
130- new_status: PublicAgentState :: Paused ,
131- ..
132- }
133- )
134+ ///
135+ /// # Parameters
136+ /// * `stop_on_pause` - If true, only Completed is terminal. If false, both Completed and Paused are terminal.
137+ fn is_terminal_event ( event : & AgentEvent , stop_on_pause : bool ) -> bool {
138+ match event {
139+ AgentEvent :: Completed { .. } => true ,
140+ AgentEvent :: StatusChanged {
141+ new_status : PublicAgentState :: Paused ,
142+ ..
143+ } => stop_on_pause,
144+ _ => false ,
145+ }
134146}
0 commit comments