@@ -57,6 +57,7 @@ use openfang_channels::wecom::WeComAdapter;
5757use openfang_kernel:: OpenFangKernel ;
5858use openfang_runtime:: kernel_handle:: KernelHandle ;
5959use openfang_types:: agent:: AgentId ;
60+ use uuid:: Uuid ;
6061use std:: sync:: Arc ;
6162use std:: time:: { Duration , Instant } ;
6263use tracing:: { error, info, warn} ;
@@ -111,6 +112,75 @@ impl ChannelBridgeHandle for KernelBridgeAdapter {
111112 Ok ( result. response )
112113 }
113114
115+ fn queue_max_retries ( & self ) -> usize {
116+ std:: env:: var ( "OPENFANG_QUEUE_MAX_RETRIES" )
117+ . ok ( )
118+ . and_then ( |s| s. parse ( ) . ok ( ) )
119+ . unwrap_or_else ( || {
120+ self . kernel . config . channels . queue_max_retries . unwrap_or ( 300 ) as usize
121+ } )
122+ }
123+
124+ fn queue_sleep_secs ( & self ) -> u64 {
125+ std:: env:: var ( "OPENFANG_QUEUE_SLEEP_SECS" )
126+ . ok ( )
127+ . and_then ( |s| s. parse ( ) . ok ( ) )
128+ . unwrap_or_else ( || {
129+ self . kernel . config . channels . queue_sleep_secs . unwrap_or ( 2 )
130+ } )
131+ }
132+
133+ async fn is_agent_busy ( & self , agent_id : AgentId ) -> bool {
134+ self . kernel
135+ . registry
136+ . get ( agent_id)
137+ . map ( |e| e. state == openfang_types:: agent:: AgentState :: Thinking )
138+ . unwrap_or ( false )
139+ }
140+
141+ async fn get_channel_queue ( & self ) -> Result < String , String > {
142+ let nil_id = openfang_types:: agent:: AgentId ( Uuid :: nil ( ) ) ;
143+ let val = self
144+ . kernel
145+ . memory
146+ . structured_get ( nil_id, "channels_queue" )
147+ . map_err ( |e| format ! ( "{e}" ) ) ?;
148+ match val {
149+ Some ( serde_json:: Value :: String ( s) ) => Ok ( s) ,
150+ _ => Ok ( String :: new ( ) ) ,
151+ }
152+ }
153+
154+ async fn save_channel_queue ( & self , queue_json : & str ) -> Result < ( ) , String > {
155+ let nil_id = openfang_types:: agent:: AgentId ( Uuid :: nil ( ) ) ;
156+ self . kernel
157+ . memory
158+ . structured_set (
159+ nil_id,
160+ "channels_queue" ,
161+ serde_json:: Value :: String ( queue_json. to_string ( ) ) ,
162+ )
163+ . map_err ( |e| format ! ( "{e}" ) ) ?;
164+ Ok ( ( ) )
165+ }
166+
167+ fn queue_enabled ( & self ) -> bool {
168+ self . kernel . config . channels . queue_enabled . unwrap_or ( true )
169+ }
170+
171+ fn queue_poll_secs ( & self ) -> u64 {
172+ self . kernel
173+ . config
174+ . channels
175+ . queue_poll_secs
176+ . or_else ( || {
177+ std:: env:: var ( "OPENFANG_QUEUE_POLL_SECS" )
178+ . ok ( )
179+ . and_then ( |s| s. parse ( ) . ok ( ) )
180+ } )
181+ . unwrap_or ( 30 )
182+ }
183+
114184 async fn find_agent_by_name ( & self , name : & str ) -> Result < Option < AgentId > , String > {
115185 Ok ( self . kernel . registry . find_by_name ( name) . map ( |e| e. id ) )
116186 }
0 commit comments