data
11 months ago
engines
11 months ago
exceptions
11 months ago
modules
11 months ago
query
11 months ago
rest
11 months ago
services
11 months ago
admin.php
11 months ago
api.php
11 months ago
core.php
11 months ago
discussion.php
11 months ago
event.php
11 months ago
init.php
11 months ago
logging.php
11 months ago
reply.php
11 months ago
rest.php
11 months ago
event.php
248 lines
| 1 | <?php |
| 2 | |
| 3 | // Load constants once at class definition |
| 4 | if ( !defined( 'MWAI_STREAM_TYPES' ) ) { |
| 5 | require_once MWAI_PATH . '/constants/types.php'; |
| 6 | } |
| 7 | |
| 8 | class Meow_MWAI_Event { |
| 9 | private $type; |
| 10 | private $subtype; |
| 11 | private $content; |
| 12 | private $metadata; |
| 13 | private $visibility; |
| 14 | private $timestamp; |
| 15 | |
| 16 | public function __construct( $type = 'live', $subtype = null ) { |
| 17 | $this->type = $type; |
| 18 | $this->subtype = $subtype ?: MWAI_STREAM_TYPES['CONTENT']; |
| 19 | $this->content = ''; |
| 20 | $this->metadata = []; |
| 21 | $this->visibility = $this->get_default_visibility( $this->subtype ); |
| 22 | $this->timestamp = microtime( true ); |
| 23 | } |
| 24 | |
| 25 | // Setters with fluent interface |
| 26 | public function set_content( $content ) { |
| 27 | $this->content = $content; |
| 28 | return $this; |
| 29 | } |
| 30 | |
| 31 | public function set_metadata( $key, $value = null ) { |
| 32 | if ( is_array( $key ) ) { |
| 33 | $this->metadata = array_merge( $this->metadata, $key ); |
| 34 | } |
| 35 | else { |
| 36 | $this->metadata[$key] = $value; |
| 37 | } |
| 38 | return $this; |
| 39 | } |
| 40 | |
| 41 | public function set_visibility( $visibility ) { |
| 42 | $this->visibility = $visibility; |
| 43 | return $this; |
| 44 | } |
| 45 | |
| 46 | public function set_subtype( $subtype ) { |
| 47 | $this->subtype = $subtype; |
| 48 | $this->visibility = $this->get_default_visibility( $subtype ); |
| 49 | return $this; |
| 50 | } |
| 51 | |
| 52 | // Get default visibility based on subtype |
| 53 | private function get_default_visibility( $subtype ) { |
| 54 | $hidden_types = [ |
| 55 | MWAI_STREAM_TYPES['TOOL_ARGS'], |
| 56 | MWAI_STREAM_TYPES['DEBUG'], |
| 57 | MWAI_STREAM_TYPES['HEARTBEAT'], |
| 58 | ]; |
| 59 | |
| 60 | $collapsed_types = [ |
| 61 | MWAI_STREAM_TYPES['THINKING'], |
| 62 | MWAI_STREAM_TYPES['MCP_DISCOVERY'], |
| 63 | MWAI_STREAM_TYPES['STATUS'], |
| 64 | ]; |
| 65 | |
| 66 | if ( in_array( $subtype, $hidden_types ) ) { |
| 67 | return MWAI_STREAM_VISIBILITY['HIDDEN']; |
| 68 | } |
| 69 | |
| 70 | if ( in_array( $subtype, $collapsed_types ) ) { |
| 71 | return MWAI_STREAM_VISIBILITY['COLLAPSED']; |
| 72 | } |
| 73 | |
| 74 | return MWAI_STREAM_VISIBILITY['VISIBLE']; |
| 75 | } |
| 76 | |
| 77 | // Convert to array for JSON encoding |
| 78 | public function to_array() { |
| 79 | $data = [ |
| 80 | 'type' => $this->type, |
| 81 | 'data' => $this->content, |
| 82 | 'timestamp' => $this->timestamp, |
| 83 | ]; |
| 84 | |
| 85 | // Only add extra fields for 'live' messages |
| 86 | if ( $this->type === 'live' ) { |
| 87 | $data['subtype'] = $this->subtype; |
| 88 | $data['visibility'] = $this->visibility; |
| 89 | |
| 90 | if ( !empty( $this->metadata ) ) { |
| 91 | $data['metadata'] = $this->metadata; |
| 92 | } |
| 93 | } |
| 94 | |
| 95 | return $data; |
| 96 | } |
| 97 | |
| 98 | // Static factory methods for common message types |
| 99 | public static function content( $content ) { |
| 100 | return ( new self( 'live', MWAI_STREAM_TYPES['CONTENT'] ) ) |
| 101 | ->set_content( $content ); |
| 102 | } |
| 103 | |
| 104 | public static function thinking( $content ) { |
| 105 | return ( new self( 'live', MWAI_STREAM_TYPES['THINKING'] ) ) |
| 106 | ->set_content( $content ); |
| 107 | } |
| 108 | |
| 109 | public static function tool_call( $tool_name, $args = null ) { |
| 110 | $msg = ( new self( 'live', MWAI_STREAM_TYPES['TOOL_CALL'] ) ) |
| 111 | ->set_content( "Calling function: $tool_name" ) |
| 112 | ->set_metadata( 'tool_name', $tool_name ); |
| 113 | |
| 114 | if ( $args ) { |
| 115 | $msg->set_metadata( 'args', $args ); |
| 116 | } |
| 117 | |
| 118 | return $msg; |
| 119 | } |
| 120 | |
| 121 | public static function status( $status, $details = null ) { |
| 122 | $msg = ( new self( 'live', MWAI_STREAM_TYPES['STATUS'] ) ) |
| 123 | ->set_content( $status ); |
| 124 | |
| 125 | if ( $details ) { |
| 126 | $msg->set_metadata( 'details', $details ); |
| 127 | } |
| 128 | |
| 129 | return $msg; |
| 130 | } |
| 131 | |
| 132 | public static function debug( $message, $data = null ) { |
| 133 | $msg = ( new self( 'live', MWAI_STREAM_TYPES['DEBUG'] ) ) |
| 134 | ->set_content( $message ); |
| 135 | |
| 136 | if ( $data ) { |
| 137 | $msg->set_metadata( 'debug_data', $data ); |
| 138 | } |
| 139 | |
| 140 | return $msg; |
| 141 | } |
| 142 | |
| 143 | public static function error( $message ) { |
| 144 | return new self( 'error', null ); |
| 145 | } |
| 146 | |
| 147 | public static function end( $data ) { |
| 148 | return new self( 'end', null ); |
| 149 | } |
| 150 | |
| 151 | // Standardized event helpers for consistent messaging |
| 152 | |
| 153 | public static function request_sent() { |
| 154 | return self::status( 'Request sent...' ); |
| 155 | } |
| 156 | |
| 157 | public static function generating_response() { |
| 158 | return self::status( 'Generating response...' ); |
| 159 | } |
| 160 | |
| 161 | public static function response_completed() { |
| 162 | return self::status( 'Response completed.' ); |
| 163 | } |
| 164 | |
| 165 | public static function request_completed( $duration ) { |
| 166 | return self::status( "Request completed in $duration." ); |
| 167 | } |
| 168 | |
| 169 | public static function stream_completed() { |
| 170 | return self::status( 'Stream completed.' ); |
| 171 | } |
| 172 | |
| 173 | public static function mcp_discovery( $server_count, $tool_count ) { |
| 174 | return ( new self( 'live', MWAI_STREAM_TYPES['MCP_DISCOVERY'] ) ) |
| 175 | ->set_content( "Got $server_count MCP server(s) and $tool_count tool(s)." ) |
| 176 | ->set_metadata( 'server_count', $server_count ) |
| 177 | ->set_metadata( 'tool_count', $tool_count ); |
| 178 | } |
| 179 | |
| 180 | public static function mcp_calling( $tool_name, $tool_id = null, $args = null ) { |
| 181 | $msg = ( new self( 'live', 'mcp_tool_call' ) ) |
| 182 | ->set_content( "Calling $tool_name..." ) |
| 183 | ->set_metadata( 'tool_name', $tool_name ) |
| 184 | ->set_metadata( 'is_mcp', true ); |
| 185 | |
| 186 | if ( $tool_id ) { |
| 187 | $msg->set_metadata( 'tool_id', $tool_id ); |
| 188 | } |
| 189 | |
| 190 | if ( $args ) { |
| 191 | $msg->set_metadata( 'arguments', $args ); |
| 192 | } |
| 193 | |
| 194 | return $msg; |
| 195 | } |
| 196 | |
| 197 | public static function mcp_result( $tool_name, $tool_use_id = null ) { |
| 198 | $msg = ( new self( 'live', 'mcp_tool_result' ) ) |
| 199 | ->set_content( "Got result from $tool_name." ) |
| 200 | ->set_metadata( 'tool_name', $tool_name ) |
| 201 | ->set_metadata( 'is_mcp', true ); |
| 202 | |
| 203 | if ( $tool_use_id ) { |
| 204 | $msg->set_metadata( 'tool_use_id', $tool_use_id ); |
| 205 | } |
| 206 | |
| 207 | return $msg; |
| 208 | } |
| 209 | |
| 210 | public static function function_calling( $function_name, $args = null ) { |
| 211 | $msg = ( new self( 'live', MWAI_STREAM_TYPES['TOOL_CALL'] ) ) |
| 212 | ->set_content( "Calling $function_name..." ) |
| 213 | ->set_metadata( 'tool_name', $function_name ); |
| 214 | |
| 215 | if ( $args ) { |
| 216 | $msg->set_metadata( 'arguments', $args ); |
| 217 | } |
| 218 | |
| 219 | return $msg; |
| 220 | } |
| 221 | |
| 222 | public static function function_result( $function_name ) { |
| 223 | return ( new self( 'live', MWAI_STREAM_TYPES['TOOL_RESULT'] ) ) |
| 224 | ->set_content( "Got result from $function_name." ) |
| 225 | ->set_metadata( 'tool_name', $function_name ); |
| 226 | } |
| 227 | |
| 228 | public static function embeddings( $count, $query = null, $namespace = null ) { |
| 229 | $content = $count > 0 |
| 230 | ? "Found $count relevant context(s) from embeddings." |
| 231 | : 'Searching embeddings...'; |
| 232 | |
| 233 | $msg = ( new self( 'live', MWAI_STREAM_TYPES['EMBEDDINGS'] ) ) |
| 234 | ->set_content( $content ) |
| 235 | ->set_metadata( 'count', $count ); |
| 236 | |
| 237 | if ( $query ) { |
| 238 | $msg->set_metadata( 'query', $query ); |
| 239 | } |
| 240 | |
| 241 | if ( $namespace ) { |
| 242 | $msg->set_metadata( 'namespace', $namespace ); |
| 243 | } |
| 244 | |
| 245 | return $msg; |
| 246 | } |
| 247 | } |
| 248 |