PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 3.0.5
AI Engine – The Chatbot, AI Framework & MCP for WordPress v3.0.5
3.5.7 3.5.6 3.5.5 3.5.4 3.5.3 3.5.2 3.5.1 3.5.0 3.4.9 3.4.8 3.4.7 0.2.1 1.6.91 0.2.2 1.6.92 0.2.3 1.6.93 0.2.4 1.6.94 0.2.5 1.6.95 0.2.6 1.6.96 0.2.7 1.6.97 0.2.8 1.6.98 0.2.9 1.6.99 0.3.0 1.7.0 0.3.1 1.7.1 0.3.2 1.7.2 0.3.3 1.7.3 0.3.4 1.7.4 0.3.5 1.7.5 0.3.6 1.7.6 0.4.0 1.7.7 0.4.1 1.7.8 0.4.2 1.7.9 0.4.3 1.8.0 0.4.4 1.8.1 0.4.5 1.8.2 0.4.6 1.8.3 0.4.7 1.8.4 0.4.8 1.8.5 0.4.9 1.8.6 0.5.0 1.8.7 0.5.1 1.8.8 0.5.2 1.8.9 0.5.3 1.9.0 0.5.4 1.9.1 0.5.5 1.9.2 0.5.6 1.9.3 0.5.7 1.9.4 0.5.8 1.9.5 0.5.9 1.9.6 0.6.0 1.9.7 0.6.1 1.9.8 0.6.2 1.9.81 0.6.3 1.9.82 0.6.4 1.9.83 0.6.5 1.9.84 0.6.6 1.9.85 0.6.7 1.9.86 0.6.8 1.9.87 0.6.9 1.9.88 0.7.0 1.9.89 0.7.1 1.9.90 0.7.2 1.9.91 0.7.3 1.9.92 0.7.4 1.9.93 0.7.5 1.9.94 0.7.6 1.9.95 0.7.7 1.9.96 0.7.8 1.9.97 0.7.9 1.9.98 0.8.0 1.9.99 0.8.1 2.0.0 0.8.2 2.0.1 0.8.3 2.0.2 0.8.4 2.0.3 0.8.5 2.0.4 0.8.6 2.0.5 0.8.7 2.0.6 0.8.8 2.0.7 0.8.9 2.0.8 0.9.0 2.0.9 0.9.2 2.1.0 0.9.3 2.1.1 0.9.4 2.1.2 0.9.5 2.1.3 0.9.6 2.1.4 0.9.7 2.1.5 0.9.8 2.1.6 0.9.81 2.1.7 0.9.82 2.1.8 0.9.83 2.1.9 0.9.84 2.2.0 0.9.85 2.2.1 0.9.86 2.2.2 0.9.87 2.2.3 0.9.88 2.2.4 0.9.89 2.2.5 0.9.9 2.2.51 0.9.91 2.2.52 0.9.92 2.2.53 0.9.93 2.2.54 0.9.94 2.2.56 0.9.95 2.2.57 0.9.96 2.2.6 0.9.97 2.2.60 0.9.98 2.2.61 0.9.99 2.2.62 1.0.0 2.2.63 1.0.01 2.2.70 1.0.1 2.2.80 1.0.2 2.2.81 1.0.3 2.2.90 1.0.4 2.2.91 1.0.5 2.2.92 1.0.6 2.2.93 1.0.7 2.2.94 1.0.8 2.2.95 1.0.9 2.3.0 1.1.0 2.3.1 1.1.1 2.3.2 1.1.2 2.3.3 1.1.3 2.3.4 1.1.4 2.3.5 1.1.5 2.3.6 1.1.6 2.3.7 1.1.7 2.3.8 1.1.8 2.3.9 1.1.9 2.4.0 1.2.0 2.4.1 1.2.1 2.4.2 1.2.2 2.4.3 1.2.21 2.4.4 1.2.3 2.4.5 1.2.30 2.4.6 1.3.0 2.4.7 1.3.1 2.4.8 1.3.2 2.4.9 1.3.3 2.5.0 1.3.31 2.5.1 1.3.32 2.5.2 1.3.33 2.5.3 1.3.34 2.5.4 1.3.35 2.5.5 1.3.36 2.5.6 1.3.37 2.5.7 1.3.38 2.5.8 1.3.39 2.5.9 1.3.40 2.6.0 1.3.41 2.6.1 1.3.42 2.6.2 1.3.43 2.6.3 1.3.44 2.6.5 1.3.45 2.6.6 1.3.46 2.6.7 1.3.47 2.6.8 1.3.48 2.6.9 1.3.49 2.7.0 1.3.50 2.7.1 1.3.51 2.7.2 1.3.52 2.7.3 1.3.53 2.7.4 1.3.54 2.7.5 1.3.56 2.7.6 1.3.57 2.7.7 1.3.58 2.7.8 1.3.59 2.7.9 1.3.60 2.8.0 1.3.61 2.8.1 1.3.62 2.8.2 1.3.63 2.8.3 1.3.64 2.8.4 1.3.65 2.8.5 1.3.66 2.8.6 1.3.67 2.8.7 1.3.68 2.8.8 1.3.69 2.8.9 1.3.70 2.9.0 1.3.71 2.9.1 1.3.72 2.9.2 1.3.73 2.9.3 1.3.74 2.9.4 1.3.75 2.9.5 1.3.76 2.9.6 1.3.77 2.9.7 1.3.78 2.9.8 1.3.79 2.9.9 1.3.80 3.0.0 1.3.81 3.0.1 1.3.82 3.0.2 1.3.83 3.0.3 1.3.84 3.0.4 1.3.85 3.0.5 1.3.86 3.0.6 1.3.87 3.0.7 1.3.88 3.0.8 1.3.89 3.0.9 1.3.90 3.1.0 1.3.91 3.1.1 1.3.92 3.1.2 1.3.93 3.1.3 1.3.94 3.1.4 1.3.95 3.1.5 1.3.96 3.1.6 1.3.97 3.1.7 1.3.98 3.1.8 1.3.99 3.1.9 1.4.0 3.2.0 1.4.1 3.2.1 1.4.2 3.2.2 1.4.3 3.2.3 1.4.4 3.2.4 1.4.5 3.2.5 1.4.6 3.2.6 1.4.7 3.2.7 1.4.8 3.2.8 1.4.9 3.2.9 1.5.0 3.3.0 1.5.1 3.3.1 1.5.2 3.3.2 1.5.3 3.3.3 1.5.4 3.3.4 1.5.5 3.3.5 1.5.6 3.3.6 1.5.7 3.3.7 1.5.8 3.3.8 1.5.9 3.3.9 1.6.0 3.4.0 1.6.1 3.4.1 1.6.2 3.4.2 1.6.3 3.4.3 1.6.5 3.4.4 1.6.51 3.4.5 1.6.52 3.4.6 1.6.53 1.6.54 1.6.55 1.6.56 1.6.57 1.6.58 1.6.59 1.6.60 1.6.61 1.6.62 1.6.63 1.6.64 1.6.65 1.6.66 1.6.67 1.6.68 trunk 1.6.69 0.0.1 1.6.70 0.0.2 1.6.71 0.0.3 1.6.72 0.0.4 1.6.73 0.0.5 1.6.74 0.0.6 1.6.75 0.0.7 1.6.76 0.0.8 1.6.77 0.0.9 1.6.78 0.1.0 1.6.79 0.1.1 1.6.81 0.1.2 1.6.82 0.1.3 1.6.83 0.1.4 1.6.84 0.1.5 1.6.85 0.1.6 1.6.86 0.1.7 1.6.87 0.1.8 1.6.88 0.1.9 1.6.89 0.2.0 1.6.90
ai-engine / classes / admin.php
ai-engine / classes Last commit date
data 11 months ago engines 10 months ago exceptions 11 months ago modules 10 months ago query 10 months ago rest 10 months ago services 10 months ago admin.php 10 months ago api.php 10 months ago core.php 10 months ago discussion.php 11 months ago event.php 11 months ago init.php 11 months ago logging.php 11 months ago reply.php 10 months ago rest.php 10 months ago
admin.php
379 lines
1 <?php
2
3 class Meow_MWAI_Admin extends MeowCommon_Admin {
4 public $core;
5 public $contentGeneratorEnabled;
6 public $imagesGeneratorEnabled;
7 public $playgroundEnabled;
8 public $suggestionsEnabled;
9
10 public function __construct( $core ) {
11 $this->core = $core;
12 parent::__construct( MWAI_PREFIX, MWAI_ENTRY, MWAI_DOMAIN, class_exists( 'MeowPro_MWAI_Core' ) );
13 if ( is_admin() ) {
14 $this->contentGeneratorEnabled = $this->core->get_option( 'module_generator_content' );
15 $this->imagesGeneratorEnabled = $this->core->get_option( 'module_generator_images' );
16 $this->playgroundEnabled = $this->core->get_option( 'module_playground' );
17 $can_access_settings = $this->core->can_access_settings();
18 $can_access_features = $this->core->can_access_features();
19
20 if ( $can_access_settings || $can_access_features ) {
21 add_action( 'admin_enqueue_scripts', [ $this, 'admin_enqueue_scripts' ] );
22 }
23
24 if ( $can_access_settings ) {
25 add_action( 'admin_menu', [ $this, 'app_menu' ] );
26 }
27
28 if ( $can_access_features ) {
29 add_action( 'admin_menu', [ $this, 'admin_menu' ] );
30
31 // Only if the Suggestions are enabled.
32 $this->suggestionsEnabled = $this->core->get_option( 'module_suggestions' );
33 if ( $this->suggestionsEnabled ) {
34 add_filter( 'post_row_actions', [ $this, 'post_row_actions' ], 10, 2 );
35 add_filter( 'page_row_actions', [ $this, 'post_row_actions' ], 10, 2 );
36 }
37
38 if ( $this->imagesGeneratorEnabled ) {
39 add_filter( 'media_row_actions', [ $this, 'media_row_actions' ], 10, 2 );
40 }
41
42 add_action( 'admin_footer', [ $this, 'admin_footer' ] );
43 }
44 }
45 }
46
47 public function admin_menu() {
48
49 // Generate New (under Posts)
50 if ( $this->contentGeneratorEnabled ) {
51 add_submenu_page(
52 'edit.php',
53 'Generate New',
54 'Generate New',
55 'read',
56 'mwai_content_generator',
57 [ $this, 'ai_content_generator' ],
58 2
59 );
60 }
61
62 // In Tools
63 if ( $this->playgroundEnabled ) {
64 add_management_page(
65 'Playground',
66 __( 'Playground', 'ai-engine' ),
67 'read',
68 'mwai_dashboard',
69 [ $this, 'ai_playground' ]
70 );
71 }
72 if ( $this->contentGeneratorEnabled ) {
73 add_management_page(
74 'Generate Content',
75 'Generate Content',
76 'read',
77 'mwai_content_generator',
78 [ $this, 'ai_content_generator' ]
79 );
80 }
81 if ( $this->imagesGeneratorEnabled ) {
82 add_management_page(
83 'Generate Images',
84 'Generate Images',
85 'read',
86 'mwai_images_generator',
87 [ $this, 'ai_image_generator' ]
88 );
89 }
90
91 // In the Admin Bar:
92 add_action( 'admin_bar_menu', [ $this, 'admin_bar_menu' ], 100 );
93 }
94
95 public function admin_bar_menu( $wp_admin_bar ) {
96
97 $admin_bar = $this->core->get_option( 'admin_bar' );
98 $settings = isset( $admin_bar['settings'] ) && $admin_bar['settings'];
99 $playground = isset( $admin_bar['playground'] ) && $admin_bar['playground'];
100 $content_generator = isset( $admin_bar['content_generator'] ) && $admin_bar['content_generator'];
101 $images_generator = isset( $admin_bar['images_generator'] ) && $admin_bar['images_generator'];
102
103 if ( $settings ) {
104 $wp_admin_bar->add_node( [
105 'id' => 'mwai-settings',
106 'title' => '<span class="ab-icon dashicons-before dashicons-admin-settings" style="top: 2px;"></span>' . __( 'AI Engine', 'ai-engine' ),
107 'href' => admin_url( 'admin.php?page=mwai_settings' ),
108 'meta' => [ 'class' => 'mwai-settings' ],
109 ] );
110 }
111
112 if ( $content_generator ) {
113 $wp_admin_bar->add_node( [
114 'id' => 'mwai-content-generator',
115 'title' => MWAI_IMG_WAND_HTML . __( 'Content', 'ai-engine' ),
116 'href' => admin_url( 'tools.php?page=mwai_content_generator' ),
117 'meta' => [ 'class' => 'mwai-content-generator' ],
118 ] );
119 }
120 if ( $images_generator ) {
121 $wp_admin_bar->add_node( [
122 'id' => 'mwai-image-generator',
123 'title' => MWAI_IMG_WAND_HTML . __( 'Images', 'ai-engine' ),
124 'href' => admin_url( 'tools.php?page=mwai_images_generator' ),
125 'meta' => [ 'class' => 'mwai-images-generator' ],
126 ] );
127 }
128
129 // The Global Magic Wand
130 // if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
131 // $wp_admin_bar->add_node( array(
132 // 'id' => 'mwai-debug',
133 // 'title' => MWAI_IMG_WAND_HTML . __( 'Magic Wand', 'ai-engine' ),
134 // //'href' => admin_url( 'tools.php?page=mwai_debug' ),
135 // 'meta' => array( 'class' => 'mwai-debug' ),
136 // ) );
137 // }
138
139 if ( $playground ) {
140 $wp_admin_bar->add_node( [
141 'id' => 'mwai-playground',
142 'title' => MWAI_IMG_WAND_HTML . __( 'Playground', 'ai-engine' ),
143 'href' => admin_url( 'tools.php?page=mwai_dashboard' ),
144 'meta' => [ 'class' => 'mwai-playground' ],
145 ] );
146 }
147 }
148
149 public function ai_playground() {
150 echo '<div id="mwai-playground"></div>';
151 }
152
153 public function ai_content_generator() {
154 echo '<div id="mwai-content-generator"></div>';
155 }
156
157 public function ai_image_generator() {
158 echo '<div id="mwai-image-generator"></div>';
159 }
160
161 public function post_row_actions( $actions, $post ) {
162 $actions['ai_magic_wand'] = '<span class="mwai-magic-wand-action" data-id="' . $post->ID . '" data-title="' . esc_attr( $post->post_title ) . '">
163 <a href="#" class="mwai-magic-wand-trigger">' . MWAI_IMG_WAND_HTML_XS . ' ' . __( 'Magic Wand', 'ai-engine' ) . '</a>
164 <div class="mwai-magic-wand-dropdown" style="display: none;">
165 <a class="mwai-link-title" href="#" data-id="' . $post->ID . '" data-title="' . esc_attr( $post->post_title ) . '">
166 <span class="dashicons dashicons-edit" style="font-size: 14px; line-height: 1.4; margin-right: 4px; pointer-events: none;"></span>' . __( 'Generate Title', 'ai-engine' ) . '
167 </a>
168 <a class="mwai-link-excerpt" href="#" data-id="' . $post->ID . '" data-title="' . esc_attr( $post->post_title ) . '">
169 <span class="dashicons dashicons-text" style="font-size: 14px; line-height: 1.4; margin-right: 4px; pointer-events: none;"></span>' . __( 'Generate Excerpt', 'ai-engine' ) . '
170 </a>
171 </div>
172 </span>';
173 return $actions;
174 }
175
176 public function media_row_actions( $actions, $post ) {
177 if ( strpos( $post->post_mime_type, 'image/' ) === 0 ) {
178 $url = admin_url( 'tools.php?page=mwai_images_generator&editId=' . $post->ID );
179 $actions['mwai_remix'] = '<a href="' . $url . '">' . MWAI_IMG_WAND_HTML_XS . ' ' . __( 'Edit', 'ai-engine' ) . '</a>';
180 }
181 return $actions;
182 }
183
184 public function admin_footer() {
185 // Don't add our admin footer div on the Site Editor
186 $current_screen = get_current_screen();
187 if ( $current_screen && $current_screen->base === 'site-editor' ) {
188 return;
189 }
190 echo '<div id="mwai-admin-postsList"></div>';
191
192 // Add CSS for Magic Wand dropdown
193 ?>
194 <style>
195 .mwai-magic-wand-action {
196 position: relative;
197 display: inline-block;
198 }
199
200 .mwai-magic-wand-trigger {
201 text-decoration: none;
202 }
203
204 .mwai-magic-wand-dropdown {
205 position: absolute;
206 top: 100%;
207 left: 0;
208 background: #fff;
209 border: 1px solid #c3c4c7;
210 border-radius: 4px;
211 box-shadow: 0 2px 5px rgba(0,0,0,0.15);
212 min-width: 150px;
213 z-index: 1000;
214 margin-top: 4px;
215 }
216
217 .mwai-magic-wand-dropdown a {
218 display: flex;
219 align-items: center;
220 padding: 8px 12px;
221 text-decoration: none;
222 color: #2271b1;
223 border-bottom: 1px solid #f0f0f1;
224 white-space: nowrap;
225 }
226
227 .mwai-magic-wand-dropdown a .dashicons {
228 width: 16px;
229 height: 16px;
230 font-size: 14px;
231 }
232
233 .mwai-magic-wand-dropdown a:last-child {
234 border-bottom: none;
235 }
236
237 .mwai-magic-wand-dropdown a:hover {
238 background: #f0f6fc;
239 color: #135e96;
240 }
241
242 /* Ensure dropdown stays visible when hovering over it */
243 .mwai-magic-wand-action:hover .mwai-magic-wand-dropdown {
244 display: block !important;
245 }
246 </style>
247 <?php
248 }
249
250 public function admin_enqueue_scripts() {
251 // Don't load our scripts on the Site Editor to avoid conflicts
252 $current_screen = get_current_screen();
253 if ( $current_screen && $current_screen->base === 'site-editor' ) {
254 return;
255 }
256
257 $physical_file = MWAI_PATH . '/app/index.js';
258 $cache_buster = file_exists( $physical_file ) ? filemtime( $physical_file ) : MWAI_VERSION;
259 wp_register_script( 'mwai-vendor', MWAI_URL . 'app/vendor.js', null, $cache_buster );
260
261 // Base dependencies
262 $deps = [ 'mwai-vendor', 'wp-element', 'wp-components', 'wp-plugins', 'wp-i18n' ];
263
264 // Check if we're on AI Engine admin pages
265 // Debug: Log the current screen ID to help identify the correct page
266 if ( $current_screen && $this->core->get_option( 'server_debug_mode' ) ) {
267 error_log( '[AI Engine] Current screen ID: ' . $current_screen->id . ', Base: ' . $current_screen->base );
268 }
269
270 $is_ai_engine_page = $current_screen && (
271 strpos( $current_screen->id, 'mwai_settings' ) !== false ||
272 strpos( $current_screen->id, 'meowapps_page_mwai' ) !== false ||
273 $current_screen->id === 'meowapps_page_mwai_settings' ||
274 $current_screen->id === 'meowapps_page_mwai-ui' ||
275 strpos( $current_screen->id, 'meowapps' ) !== false && strpos( $_GET['page'] ?? '', 'mwai' ) !== false
276 );
277
278 // Only add wp-edit-post on actual post/page editor screens, not on AI Engine admin pages
279 $is_post_editor = $current_screen && in_array( $current_screen->base, [ 'post', 'page' ] );
280 if ( $is_post_editor ) {
281 $deps[] = 'wp-edit-post';
282 }
283
284 // Load block editor deps if:
285 // 1. We're on AI Engine admin pages (Forms.js component is always imported by Settings.js) OR
286 // 2. We are on a block editor screen (Edit Post)
287 $forms_module_enabled = $this->core->get_option( 'module_forms' );
288 $load_forms_editor = $forms_module_enabled && $this->core->get_option( 'forms_editor' );
289 $on_block_editor = function_exists( 'wp_should_load_block_editor_scripts_and_styles' ) && wp_should_load_block_editor_scripts_and_styles();
290
291 // Always load block editor deps on AI Engine admin pages because Forms.js is always imported
292 if ( $is_ai_engine_page || $on_block_editor ) {
293 $deps = array_merge( $deps, [ 'wp-blocks', 'wp-block-editor', 'wp-format-library', 'wp-block-library', 'wp-editor' ] );
294 }
295
296 wp_register_script( 'mwai', MWAI_URL . 'app/index.js', $deps, $cache_buster );
297 wp_enqueue_script( 'mwai' );
298
299 // Ensure core editor styles are available for embedded block editor UIs
300 // This helps Popovers, Inspector, and toolbars match Gutenberg styling
301 if ( function_exists( 'wp_enqueue_style' ) ) {
302 // Only load wp-edit-post styles on actual post/page editor screens
303 if ( $is_post_editor ) {
304 @wp_enqueue_style( 'wp-edit-post' );
305 }
306 @wp_enqueue_style( 'wp-components' );
307
308 // Load block editor styles if we're on AI Engine pages or on block editor
309 if ( $is_ai_engine_page || $on_block_editor ) {
310 @wp_enqueue_style( 'wp-block-editor' );
311 @wp_enqueue_style( 'wp-block-library' );
312 }
313 }
314 // Make sure core blocks and format tools are registered/available
315 if ( function_exists( 'wp_enqueue_script' ) ) {
316 if ( $is_ai_engine_page || $on_block_editor ) {
317 @wp_enqueue_script( 'wp-format-library' );
318 @wp_enqueue_script( 'wp-block-library' );
319 @wp_enqueue_script( 'wp-editor' );
320 }
321 }
322
323 // The MD5 of the translation file built by WP uses app/i18n.js instead of app/index.js
324 add_filter( 'load_script_translation_file', function ( $file, $handle, $domain ) {
325 if ( $domain !== 'ai-engine' ) {
326 return $file;
327 }
328 $file = str_replace( md5( 'app/index.js' ), md5( 'app/i18n.js' ), $file );
329 return $file;
330 }, 10, 3 );
331
332 // This is useless for AI Engine, but it avoids issues when themes and plugin calls
333 // wp_enqueue_media too late (usually, they call it in the footer). Until someone
334 // figures out what the issue is, let's load it here.
335 wp_enqueue_media();
336
337 wp_set_script_translations( 'mwai', 'ai-engine' );
338
339 // Prepare localization data
340 $localize_data = [
341 'api_url' => get_rest_url( null, 'mwai/v1' ),
342 'rest_url' => get_rest_url(),
343 'plugin_url' => MWAI_URL,
344 'user_data' => $this->core->get_user_data(),
345 'prefix' => MWAI_PREFIX,
346 'domain' => MWAI_DOMAIN,
347 'is_pro' => class_exists( 'MeowPro_MWAI_Core' ),
348 'is_registered' => !!$this->is_registered(),
349 'rest_nonce' => wp_create_nonce( 'wp_rest' ),
350 'session' => $this->core->get_session_id(),
351 'options' => $this->core->get_all_options(),
352 'chatbots' => $this->core->get_chatbots(),
353 'themes' => $this->core->get_themes(),
354 'stream' => $this->core->get_option( 'ai_streaming' ),
355 ];
356
357 wp_localize_script( 'mwai', 'mwai', $localize_data );
358 }
359
360 public function is_registered() {
361 return apply_filters( MWAI_PREFIX . '_meowapps_is_registered', false, MWAI_PREFIX );
362 }
363
364 public function app_menu() {
365 add_submenu_page(
366 'meowapps-main-menu',
367 'AI Engine',
368 'AI Engine',
369 'manage_options',
370 'mwai_settings',
371 [ $this, 'admin_settings' ]
372 );
373 }
374
375 public function admin_settings() {
376 echo '<div id="mwai-admin-settings"></div>';
377 }
378 }
379