PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 3.1.0
AI Engine – The Chatbot, AI Framework & MCP for WordPress v3.1.0
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 1 year ago engines 9 months ago exceptions 1 year ago modules 9 months ago query 10 months ago rest 10 months ago services 9 months ago admin.php 9 months ago api.php 10 months ago core.php 9 months ago discussion.php 1 year ago event.php 1 year ago init.php 1 year ago logging.php 1 year ago reply.php 10 months ago rest.php 9 months ago
admin.php
381 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
260 // Cache override: Force cache refresh when ?mwai_cache=1 is in URL
261 if ( isset( $_GET['mwai_cache'] ) ) {
262 $cache_buster = time(); // Use current timestamp for guaranteed cache bust
263 }
264
265 wp_register_script( 'mwai-vendor', MWAI_URL . 'app/vendor.js', null, $cache_buster );
266
267 // Base dependencies
268 $deps = [ 'mwai-vendor', 'wp-element', 'wp-components', 'wp-plugins', 'wp-i18n' ];
269
270 // Check if we're on AI Engine admin pages
271 $is_ai_engine_page = $current_screen && (
272 strpos( $current_screen->id, 'mwai_settings' ) !== false ||
273 strpos( $current_screen->id, 'meowapps_page_mwai' ) !== false ||
274 $current_screen->id === 'meowapps_page_mwai_settings' ||
275 $current_screen->id === 'meowapps_page_mwai-ui' ||
276 strpos( $current_screen->id, 'meowapps' ) !== false && strpos( $_GET['page'] ?? '', 'mwai' ) !== false
277 );
278
279 // Only add wp-edit-post on actual post/page editor screens, not on AI Engine admin pages
280 $is_post_editor = $current_screen && in_array( $current_screen->base, [ 'post', 'page' ] );
281 if ( $is_post_editor ) {
282 $deps[] = 'wp-edit-post';
283 }
284
285 // Load block editor deps if:
286 // 1. We're on AI Engine admin pages (Forms.js component is always imported by Settings.js) OR
287 // 2. We are on a block editor screen (Edit Post)
288 $forms_module_enabled = $this->core->get_option( 'module_forms' );
289 $load_forms_editor = $forms_module_enabled && $this->core->get_option( 'forms_editor' );
290 $on_block_editor = function_exists( 'wp_should_load_block_editor_scripts_and_styles' ) && wp_should_load_block_editor_scripts_and_styles();
291
292 // Always load block editor deps on AI Engine admin pages because Forms.js is always imported
293 if ( $is_ai_engine_page || $on_block_editor ) {
294 $deps = array_merge( $deps, [ 'wp-blocks', 'wp-block-editor', 'wp-format-library', 'wp-block-library', 'wp-editor' ] );
295 }
296
297 wp_register_script( 'mwai', MWAI_URL . 'app/index.js', $deps, $cache_buster );
298 wp_enqueue_script( 'mwai' );
299
300 // Ensure core editor styles are available for embedded block editor UIs
301 // This helps Popovers, Inspector, and toolbars match Gutenberg styling
302 if ( function_exists( 'wp_enqueue_style' ) ) {
303 // Only load wp-edit-post styles on actual post/page editor screens
304 if ( $is_post_editor ) {
305 @wp_enqueue_style( 'wp-edit-post' );
306 }
307 @wp_enqueue_style( 'wp-components' );
308
309 // Load block editor styles if we're on AI Engine pages or on block editor
310 if ( $is_ai_engine_page || $on_block_editor ) {
311 @wp_enqueue_style( 'wp-block-editor' );
312 @wp_enqueue_style( 'wp-block-library' );
313 }
314 }
315 // Make sure core blocks and format tools are registered/available
316 if ( function_exists( 'wp_enqueue_script' ) ) {
317 if ( $is_ai_engine_page || $on_block_editor ) {
318 @wp_enqueue_script( 'wp-format-library' );
319 @wp_enqueue_script( 'wp-block-library' );
320 @wp_enqueue_script( 'wp-editor' );
321 }
322 }
323
324 // The MD5 of the translation file built by WP uses app/i18n.js instead of app/index.js
325 add_filter( 'load_script_translation_file', function ( $file, $handle, $domain ) {
326 if ( $domain !== 'ai-engine' ) {
327 return $file;
328 }
329 $file = str_replace( md5( 'app/index.js' ), md5( 'app/i18n.js' ), $file );
330 return $file;
331 }, 10, 3 );
332
333 // This is useless for AI Engine, but it avoids issues when themes and plugin calls
334 // wp_enqueue_media too late (usually, they call it in the footer). Until someone
335 // figures out what the issue is, let's load it here.
336 wp_enqueue_media();
337
338 wp_set_script_translations( 'mwai', 'ai-engine' );
339
340 // Prepare localization data
341 $localize_data = [
342 'api_url' => get_rest_url( null, 'mwai/v1' ),
343 'rest_url' => get_rest_url(),
344 'plugin_url' => MWAI_URL,
345 'user_data' => $this->core->get_user_data(),
346 'prefix' => MWAI_PREFIX,
347 'domain' => MWAI_DOMAIN,
348 'is_pro' => class_exists( 'MeowPro_MWAI_Core' ),
349 'is_registered' => !!$this->is_registered(),
350 'rest_nonce' => wp_create_nonce( 'wp_rest' ),
351 'session' => $this->core->get_session_id(),
352 'options' => $this->core->get_all_options(),
353 'chatbots' => $this->core->get_chatbots(),
354 'themes' => $this->core->get_themes(),
355 'stream' => $this->core->get_option( 'ai_streaming' ),
356 'cache_buster' => $cache_buster, // Pass cache buster for lazy-loaded chunks
357 ];
358
359 wp_localize_script( 'mwai', 'mwai', $localize_data );
360 }
361
362 public function is_registered() {
363 return apply_filters( MWAI_PREFIX . '_meowapps_is_registered', false, MWAI_PREFIX );
364 }
365
366 public function app_menu() {
367 add_submenu_page(
368 'meowapps-main-menu',
369 'AI Engine',
370 'AI Engine',
371 'manage_options',
372 'mwai_settings',
373 [ $this, 'admin_settings' ]
374 );
375 }
376
377 public function admin_settings() {
378 echo '<div id="mwai-admin-settings"></div>';
379 }
380 }
381