WP_REST_Server::CREATABLE, 'callback' => array( $this, 'handle_chat' ), 'permission_callback' => array( 'Aivexa_Security', 'rest_chat_permission' ), 'args' => array( 'message' => array( 'required' => true, 'type' => 'string', 'sanitize_callback' => 'sanitize_text_field', ), 'conversation_id' => array( 'required' => false, 'type' => 'string', 'sanitize_callback' => array( 'Aivexa_Security', 'sanitize_conversation_id' ), ), ), ) ); register_rest_route( AIVEXA_REST_NAMESPACE, '/clear-conversation', array( 'methods' => WP_REST_Server::CREATABLE, 'callback' => array( $this, 'handle_clear_conversation' ), 'permission_callback' => array( 'Aivexa_Security', 'rest_chat_permission' ), 'args' => array( 'conversation_id' => array( 'required' => true, 'type' => 'string', 'sanitize_callback' => array( 'Aivexa_Security', 'sanitize_conversation_id' ), ), ), ) ); register_rest_route( AIVEXA_REST_NAMESPACE, '/status', array( 'methods' => WP_REST_Server::READABLE, 'callback' => array( $this, 'handle_status' ), 'permission_callback' => array( 'Aivexa_Security', 'rest_status_permission' ), ) ); } /** * Handle chat requests. * * @param WP_REST_Request $request Request. * @return WP_REST_Response|WP_Error */ public function handle_chat( WP_REST_Request $request ) { $message = Aivexa_Security::validate_message( $request->get_param( 'message' ) ); if ( is_wp_error( $message ) ) { return $message; } $conversation_id = Aivexa_Security::sanitize_conversation_id( $request->get_param( 'conversation_id' ) ); $agent = new Aivexa_Agent(); $result = $agent->chat( $message, $conversation_id ); if ( is_wp_error( $result ) ) { $status = (int) ( $result->get_error_data()['status'] ?? 500 ); $message = $result->get_error_message(); if ( ! current_user_can( 'manage_options' ) ) { $message = __( 'Sorry, the AI assistant is temporarily unavailable. Please try again later.', 'aivexa' ); } return new WP_REST_Response( array( 'success' => false, 'message' => $message, ), $status > 0 ? $status : 500 ); } return new WP_REST_Response( $result, 200 ); } /** * Clear a conversation. * * @param WP_REST_Request $request Request. * @return WP_REST_Response|WP_Error */ public function handle_clear_conversation( WP_REST_Request $request ) { $conversation_id = Aivexa_Security::sanitize_conversation_id( $request->get_param( 'conversation_id' ) ); if ( '' === $conversation_id ) { return new WP_Error( 'aivexa_invalid_conversation', __( 'Invalid conversation ID.', 'aivexa' ), array( 'status' => 400 ) ); } $memory = new Aivexa_Memory(); $cleared = $memory->clear_conversation( $conversation_id ); return new WP_REST_Response( array( 'success' => $cleared, ), 200 ); } /** * Public status endpoint. * * @return WP_REST_Response */ public function handle_status(): WP_REST_Response { $settings = Aivexa_Settings::get_all(); $agent = new Aivexa_Agent(); $enabled_tools = array_map( static function ( Aivexa_Tool_Interface $tool ): string { return $tool->get_name(); }, $agent->get_tools() ); return new WP_REST_Response( array( 'enabled' => (bool) $settings['enabled'], 'ready' => Aivexa_Settings::is_agent_ready(), 'agent_name' => (string) $settings['agent_name'], 'model' => (string) $settings['model'], 'enabled_tools' => array_values( $enabled_tools ), ), 200 ); } }