PluginProbe
ZIP AI – AI Website Builder & AI Agent (Beta) / 0.0.4
ZIP AI – AI Website Builder & AI Agent (Beta) v0.0.4
0.0.10 0.0.9 trunk 0.0.4 0.0.5 0.0.6 0.0.7 0.0.8
zip-ai / loader.php

loader.php in ZIP AI – AI Website Builder & AI Agent (Beta) 0.0.4, at loader.php

313 lines 8.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Plugin Class.
4 *
5 * @package zip-ai
6 * @since 0.0.1
7 */
8
9 namespace ZipAI;
10
11 // Exit if accessed directly.
12 if ( ! defined( 'ABSPATH' ) ) {
13 exit;
14 }
15
16 use ZipAI\Classes\Core\Container;
17 use ZipAI\Classes\Providers\Core_Service_Provider;
18 use ZipAI\Classes\Providers\Abilities_Service_Provider;
19 use ZipAI\Classes\Cli\CLI_Commands;
20 use ZipAI\Classes\Core\Helper;
21
22 /**
23 * Plugin Class
24 *
25 * @since 0.0.1
26 */
27 class Plugin {
28
29 /**
30 * Instance
31 *
32 * @access private
33 * @var object Class Instance.
34 * @since 0.0.1
35 */
36 private static $instance;
37
38 /**
39 * The dependency injection container.
40 *
41 * @var Container
42 */
43 protected $container;
44
45 /**
46 * Service Providers.
47 *
48 * @var array
49 */
50 protected $providers = array();
51
52 /**
53 * Initiator
54 *
55 * @since 0.0.1
56 * @return object initialized object of class.
57 */
58 public static function get_instance() {
59 if ( ! isset( self::$instance ) ) {
60 self::$instance = new self();
61 }
62 return self::$instance;
63 }
64
65 /**
66 * Constructor
67 *
68 * @since 0.0.1
69 */
70 public function __construct() {
71 $this->container = new Container();
72
73 $this->define_constants();
74
75 // Register Services.
76 $this->register_services();
77
78 // Boot Services.
79 add_action( 'plugins_loaded', array( $this, 'boot_services' ), 5 );
80
81 $this->setup_activation_hooks();
82 $this->register_cli_commands();
83
84 // Translations: WordPress.org auto-loads the plugin text domain
85 // on-demand since 4.6, so we no longer call
86 // `load_plugin_textdomain()` explicitly. Shipped `.pot` lives in
87 // `/languages/zip-ai.pot`; `.mo` files are delivered by
88 // GlotPress via the standard plugin update channel.
89
90 // Site scanner — event-driven memory enrichment (after auth).
91 // \ZipAI\Classes\Core\Site_Scanner::register_hooks(); // TODO: class not yet committed.
92
93 // Privacy policy disclosure (WordPress Guideline 7).
94 add_action( 'admin_init', array( $this, 'add_privacy_policy_content' ) );
95 }
96
97 /**
98 * Register Service Providers.
99 */
100 private function register_services() {
101 $this->providers[] = new Core_Service_Provider( $this->container );
102 $this->providers[] = new Abilities_Service_Provider( $this->container );
103
104 foreach ( $this->providers as $provider ) {
105 $provider->register();
106 }
107 }
108
109 /**
110 * Boot Service Providers.
111 */
112 public function boot_services() {
113 $this->load_vendor_dependencies();
114
115 foreach ( $this->providers as $provider ) {
116 $provider->boot();
117 }
118 }
119
120 /**
121 * Define the required constants.
122 *
123 * @since 0.0.1
124 * @return void
125 */
126 public function define_constants() {
127 define( 'ZIP_AI_FILE', __DIR__ . '/zip-ai.php' );
128 define( 'ZIP_AI_DIR', plugin_dir_path( ZIP_AI_FILE ) );
129 define( 'ZIP_AI_URL', plugins_url( '/', ZIP_AI_FILE ) );
130 define( 'ZIP_AI_VERSION', '0.0.4' );
131 define( 'ZIP_AI_MENU_SLUG', 'zip-ai' );
132
133 // Base URL for Zip AI credit server (Laravel app).
134 if ( ! defined( 'ZIP_AI_BASE_URL' ) ) {
135 define( 'ZIP_AI_BASE_URL', 'https://credits.startertemplates.com' );
136 }
137
138 if ( ! defined( 'ZIP_AI_MIDDLEWARE' ) ) {
139 define( 'ZIP_AI_MIDDLEWARE', 'https://app.zipwp.com/auth/' );
140 }
141
142 if ( ! defined( 'ZIP_AI_API_BASE' ) ) {
143 define( 'ZIP_AI_API_BASE', 'https://api.zipwp.com/api/' );
144 }
145
146 // API endpoint for credit server.
147 if ( ! defined( 'ZIP_AI_CREDIT_SERVER_API' ) ) {
148 define( 'ZIP_AI_CREDIT_SERVER_API', ZIP_AI_BASE_URL . '/api/' );
149 }
150 }
151
152 /**
153 * Load vendor dependencies (mcp-adapter).
154 *
155 * @since 0.0.1
156 * @return void
157 */
158 private function load_vendor_dependencies() {
159 // Boot the upstream `wordpress/mcp-adapter` library directly via its
160 // Plugin singleton. We skip its own `mcp-adapter.php` bootstrap because
161 // that file (a) defines `WP_MCP_*` constants that conflict with the
162 // reserved `WP_` prefix and (b) runs its own Autoloader which expects a
163 // nested `vendor/autoload.php` that does not exist after Composer
164 // flattens dependencies. Our parent classmap (composer.json) already
165 // includes every `\WP\MCP\*` class via PSR-4, so calling
166 // `Plugin::instance()` triggers the library's setup directly.
167 if ( class_exists( \WP\MCP\Plugin::class ) ) {
168 \WP\MCP\Plugin::instance();
169 }
170 }
171
172 /**
173 * Setup plugin activation and deactivation hooks.
174 *
175 * @since 0.0.1
176 * @return void
177 */
178 public function setup_activation_hooks() {
179 register_activation_hook( ZIP_AI_FILE, array( $this, 'plugin_activated' ) );
180 register_deactivation_hook( ZIP_AI_FILE, array( $this, 'plugin_deactivated' ) );
181 }
182
183 /**
184 * Plugin activation callback.
185 *
186 * @since 0.0.1
187 * @return void
188 */
189 public function plugin_activated() {
190 // Add the required capability to administrator role.
191 // HMAC shared-secret registration with the remote credit server is
192 // deferred until the user explicitly authenticates (see
193 // AJAX_Handlers::zip_ai_save_auth_settings). Nothing is sent to any
194 // external service on activation.
195 $this->add_plugin_capabilities();
196 }
197
198 /**
199 * Plugin deactivation callback.
200 *
201 * @since 0.0.1
202 * @return void
203 */
204 public function plugin_deactivated() {
205 // Remove the plugin capabilities from all roles.
206 $this->remove_plugin_capabilities();
207
208 // Clear scheduled site scan.
209 \ZipAI\Classes\Core\Site_Scanner::unschedule();
210 }
211
212 /**
213 * Suggest privacy policy content per WordPress Guideline 7.
214 *
215 * Discloses what data is sent to the Zip AI SaaS platform.
216 *
217 * @since 0.0.1
218 * @return void
219 */
220 public function add_privacy_policy_content() {
221 $policy_text = '<h2>Zip AI</h2>
222 <p>This site uses the Zip AI plugin, which connects to a cloud-based AI service operated by Starter Templates (Starter Templates, a Brainstorm Force product).</p>
223
224 <h3>What data is collected</h3>
225 <p>When authenticated and actively using Zip AI, the following data may be sent to our servers:</p>
226 <ul>
227 <li><strong>Chat messages</strong> — Messages you send to the AI assistant and the assistant\'s responses.</li>
228 <li><strong>Site structure data</strong> — Page titles, post counts, active plugin names, active theme name, and content categories. This helps Zip AI understand your site and provide relevant suggestions.</li>
229 <li><strong>Site identity</strong> — Site title, tagline, language, and domain name.</li>
230 <li><strong>E-commerce data</strong> (if applicable) — Product counts, product categories, currency, and whether reviews are enabled. No individual product details, prices, or customer data is sent.</li>
231 </ul>
232
233 <h3>What data is NOT collected</h3>
234 <ul>
235 <li>Page or post content/body text</li>
236 <li>Customer or visitor personal information</li>
237 <li>Passwords, payment details, or financial data</li>
238 <li>Email addresses of site visitors</li>
239 <li>Analytics or traffic data</li>
240 </ul>
241
242 <h3>How data is used</h3>
243 <p>Data is used solely to power the AI assistant\'s responses and to build a memory of your site preferences so you don\'t have to repeat yourself across conversations. You can clear all stored memory at any time via the "Clear Site Memory" option in the Zip AI menu.</p>
244
245 <h3>Data retention</h3>
246 <p>Chat messages and memory data are stored on our servers for as long as your account is active. You can request deletion at any time by clearing your site memory or contacting support.</p>
247
248 <h3>Third-party services</h3>
249 <p>Zip AI uses AI language models (such as Google Gemini and Anthropic Claude) to process your messages. Your messages may be sent to these providers for processing. Please refer to their respective privacy policies:</p>
250 <ul>
251 <li><a href="https://policies.google.com/privacy">Google Privacy Policy</a></li>
252 <li><a href="https://www.anthropic.com/privacy">Anthropic Privacy Policy</a></li>
253 </ul>
254
255 <p>For more information, please see our <a href="https://store.brainstormforce.com/privacy-policy/">Privacy Policy</a>.</p>';
256
257 wp_add_privacy_policy_content( 'Zip AI', $policy_text );
258 }
259
260 /**
261 * Add required capabilities to administrator role.
262 *
263 * @since 0.0.1
264 * @return void
265 */
266 private function add_plugin_capabilities() {
267 // Get the administrator role.
268 $admin_role = get_role( 'administrator' );
269
270 if ( $admin_role ) {
271 // Add the required capability for ZipWP MCP management.
272 $admin_role->add_cap( 'manage_zip_ai_assistant', true );
273 }
274 }
275
276 /**
277 * Remove plugin capabilities from all roles.
278 *
279 * @since 0.0.1
280 * @return void
281 */
282 private function remove_plugin_capabilities() {
283 // Get all roles.
284 $roles = wp_roles();
285
286 // Remove the capability from all roles that have it.
287 foreach ( $roles->role_objects as $role ) {
288 if ( $role->has_cap( 'manage_zip_ai_assistant' ) ) {
289 $role->remove_cap( 'manage_zip_ai_assistant' );
290 }
291 }
292 }
293
294 /**
295 * Register WP-CLI commands.
296 *
297 * @since 0.0.1
298 * @return void
299 */
300 private function register_cli_commands() {
301 if ( ! defined( 'WP_CLI' ) || ! WP_CLI ) {
302 return;
303 }
304
305 \WP_CLI::add_command( 'zip-ai', CLI_Commands::class );
306 }
307 }
308
309 /**
310 * Kicking this off by calling 'get_instance()' method
311 */
312 Plugin::get_instance();
313