@@ -805,6 +805,16 @@ pub(crate) async fn list_mcp_server_status_core(
805805 Ok ( json ! ( { "result" : { "data" : data, "nextCursor" : null } } ) )
806806}
807807
808+ pub ( crate ) async fn list_slash_commands_core (
809+ sessions : & Mutex < HashMap < String , Arc < WorkspaceSession > > > ,
810+ workspace_id : String ,
811+ ) -> Result < Value , String > {
812+ let session = get_session_clone ( sessions, & workspace_id) . await ?;
813+ let response = session. rest_get ( "/command" ) . await ?;
814+ let data = response. as_array ( ) . cloned ( ) . unwrap_or_default ( ) ;
815+ Ok ( json ! ( { "result" : { "data" : data } } ) )
816+ }
817+
808818pub ( crate ) async fn archive_thread_core (
809819 sessions : & Mutex < HashMap < String , Arc < WorkspaceSession > > > ,
810820 workspace_id : String ,
@@ -822,12 +832,58 @@ pub(crate) async fn compact_thread_core(
822832 sessions : & Mutex < HashMap < String , Arc < WorkspaceSession > > > ,
823833 workspace_id : String ,
824834 thread_id : String ,
835+ model : Option < String > ,
825836) -> Result < Value , String > {
826837 let session = get_session_clone ( sessions, & workspace_id) . await ?;
827- // Send /compact as a message via POST /session/:id/message.
828- let path = format ! ( "/session/{thread_id}/message" ) ;
838+ let requested_model = normalize_optional_string ( model) ;
839+ let model_override = if let Some ( ref model_id) = requested_model {
840+ resolve_prompt_model_override ( session. as_ref ( ) , model_id)
841+ . await
842+ . ok_or_else ( || format ! ( "Failed to resolve model `{model_id}` for context compaction." ) ) ?
843+ } else {
844+ return Err (
845+ "No model selected for context compaction. Select a model (or connect a provider) and try again."
846+ . to_string ( ) ,
847+ ) ;
848+ } ;
849+
850+ let provider_id = model_override
851+ . get ( "providerID" )
852+ . and_then ( |v| v. as_str ( ) )
853+ . ok_or_else ( || "Compaction model resolution missing providerID." . to_string ( ) ) ?;
854+ let model_id = model_override
855+ . get ( "modelID" )
856+ . and_then ( |v| v. as_str ( ) )
857+ . ok_or_else ( || "Compaction model resolution missing modelID." . to_string ( ) ) ?;
858+
859+ let path = format ! ( "/session/{thread_id}/summarize" ) ;
860+ session
861+ . rest_post (
862+ & path,
863+ json ! ( {
864+ "providerID" : provider_id,
865+ "modelID" : model_id,
866+ } ) ,
867+ )
868+ . await
869+ }
870+
871+ pub ( crate ) async fn execute_slash_command_core (
872+ sessions : & Mutex < HashMap < String , Arc < WorkspaceSession > > > ,
873+ workspace_id : String ,
874+ thread_id : String ,
875+ command : String ,
876+ arguments : Option < String > ,
877+ ) -> Result < Value , String > {
878+ let command = command. trim ( ) . trim_start_matches ( '/' ) . to_string ( ) ;
879+ if command. is_empty ( ) {
880+ return Err ( "empty slash command" . to_string ( ) ) ;
881+ }
882+ let session = get_session_clone ( sessions, & workspace_id) . await ?;
883+ let path = format ! ( "/session/{thread_id}/command" ) ;
829884 let body = json ! ( {
830- "parts" : [ { "type" : "text" , "text" : "/compact" } ]
885+ "command" : command,
886+ "arguments" : arguments. unwrap_or_default( ) . trim( ) . to_string( )
831887 } ) ;
832888 session. rest_post ( & path, body) . await
833889}
0 commit comments