> */ public static function get_builtin_sections(): array { return [ [ 'id' => 'albert/privacy', 'title' => __( 'Privacy', 'albert-ai-butler' ), 'priority' => 60, 'icon' => 'privacy', 'description' => __( 'Control how customer and user personal data (names, emails, phone numbers, addresses) is shared with AI assistants. Payment and card data is always removed, regardless of this setting.', 'albert-ai-butler' ), 'fields' => [ [ 'id' => 'mode', 'type' => 'select', 'label' => __( 'Privacy mode', 'albert-ai-butler' ), 'description' => __( 'Strict: personal data is always anonymised. Balanced (recommended): anonymised by default, but an authorised request can reveal it. Off: personal data is not anonymised.', 'albert-ai-butler' ), 'default' => PrivacyMode::Balanced->value, 'options' => [ PrivacyMode::Strict->value => __( 'Strict — always anonymise personal data', 'albert-ai-butler' ), PrivacyMode::Balanced->value => __( 'Balanced — anonymise by default (recommended)', 'albert-ai-butler' ), PrivacyMode::Off->value => __( 'Off — do not anonymise personal data', 'albert-ai-butler' ), ], 'sanitize_callback' => [ PrivacyMode::class, 'sanitize' ], ], ], ], [ // Always last — add-ons sit between the shared Settings card (50) and Licenses (9000). 'id' => 'albert/licenses', 'title' => __( 'Licenses', 'albert-ai-butler' ), 'priority' => 9000, 'icon' => 'admin-network', 'fields' => [ [ 'id' => 'licenses_table', 'type' => 'custom', 'label' => '', 'render_callback' => [ self::class, 'render_licenses_block' ], 'sanitize_callback' => '__return_null', ], ], ], ]; } /** * Render the licenses block (table or empty state). * * Delegates to {@see Settings} for the table/empty-state markup so the * AJAX refresh handler keeps a single source of truth. * * @since 1.1.0 * * @param array $field Field definition (unused). * @param mixed $current_value Current value (unused). * * @return void */ public static function render_licenses_block( array $field, $current_value ): void { unset( $field, $current_value ); $has_addons = class_exists( '\Albert\Abstracts\AbstractAddon' ) && ! empty( \Albert\Abstracts\AbstractAddon::get_registered_addons() ); if ( $has_addons ) { ?>