<?php
/** Geführte Verbindungseinrichtung im WordPress-Backend. */

if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

function wpagent_companion_connection_menu(): void {
	add_submenu_page(
		'wpagently',
		__( 'Agent verbinden', 'wp-agent-companion' ),
		__( 'Agent verbinden', 'wp-agent-companion' ),
		'manage_options',
		'wpagently-connect',
		'wpagent_companion_connection_page'
	);
}
add_action( 'admin_menu', 'wpagent_companion_connection_menu', 20 );

function wpagent_companion_connection_create_user(): void {
	if ( ! current_user_can( 'create_users' ) ) {
		wp_die( esc_html__( 'Keine Berechtigung.', 'wp-agent-companion' ) );
	}
	check_admin_referer( 'wpagent_companion_connection_create_user' );
	$result = wpagent_companion_create_bot_user();
	if ( is_wp_error( $result ) ) {
		wp_die( esc_html( $result->get_error_message() ), esc_html__( 'Agent-Nutzer konnte nicht erstellt werden.', 'wp-agent-companion' ), array( 'response' => 400 ) );
	}
	$args = array( 'page' => 'wpagently-connect', 'created_user' => $result['id'] );
	if ( wpagent_gravity_available() ) {
		$grant                  = wpagent_gravity_set_user_access( (int) $result['id'], true );
		$args['gravity_access'] = is_wp_error( $grant ) ? 'error' : 'enabled';
	}
	if ( wpagent_fluent_forms_available() ) {
		$grant                       = wpagent_fluent_forms_set_user_access( (int) $result['id'], true );
		$args['fluent_forms_access'] = is_wp_error( $grant ) ? 'error' : 'enabled';
	}
	if ( wpagent_formidable_available() ) {
		$grant                       = wpagent_formidable_set_user_access( (int) $result['id'], true );
		$args['formidable_access']   = is_wp_error( $grant ) ? 'error' : 'enabled';
	}
	$wpforms_status = wpagent_companion_wpforms_integration_status();
	if ( ! empty( $wpforms_status['registered_forms'] ) ) {
		$grant                  = wpagent_companion_wpforms_set_user_access( (int) $result['id'], 'forms', true );
		$args['wpforms_access'] = is_wp_error( $grant ) ? 'error' : 'enabled';
	}
	$ninjaforms_status = wpagent_companion_ninjaforms_integration_status();
	if ( ! empty( $ninjaforms_status['registered_forms'] ) ) {
		$grant                     = wpagent_companion_ninjaforms_set_user_access( (int) $result['id'], 'forms', true );
		$args['ninjaforms_access'] = is_wp_error( $grant ) ? 'error' : 'enabled';
	}
	wp_safe_redirect( add_query_arg( $args, admin_url( 'admin.php' ) ) );
	exit;
}
add_action( 'admin_post_wpagently_connection_create_user', 'wpagent_companion_connection_create_user' );

function wpagent_companion_connection_download(): void {
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_die( esc_html__( 'Keine Berechtigung.', 'wp-agent-companion' ) );
	}
	check_admin_referer( 'wpagent_companion_connection_download' );
	$user_id = isset( $_POST['connection_user'] ) ? absint( $_POST['connection_user'] ) : 0;
	$client  = isset( $_POST['connection_client'] ) ? sanitize_key( wp_unslash( $_POST['connection_client'] ) ) : '';
	$label   = isset( $_POST['connection_label'] ) ? sanitize_text_field( wp_unslash( $_POST['connection_label'] ) ) : '';
	$bundle  = wpagent_companion_create_connection_bundle( $user_id, $client, $label );
	if ( is_wp_error( $bundle ) ) {
		wp_die( esc_html( $bundle->get_error_message() ), esc_html__( 'Verbindung konnte nicht erstellt werden.', 'wp-agent-companion' ), array( 'response' => 400 ) );
	}

	nocache_headers();
	header( 'Content-Type: ' . $bundle['content_type'] . ( 'application/zip' === $bundle['content_type'] ? '' : '; charset=utf-8' ) );
	header( 'Content-Disposition: attachment; filename="' . $bundle['filename'] . '"' );
	header( 'X-Content-Type-Options: nosniff' );
	echo $bundle['content']; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Absichtlicher Datei-Download.
	exit;
}
add_action( 'admin_post_wpagently_connection_download', 'wpagent_companion_connection_download' );

function wpagent_companion_connection_revoke_handler(): void {
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_die( esc_html__( 'Keine Berechtigung.', 'wp-agent-companion' ) );
	}
	check_admin_referer( 'wpagent_companion_connection_revoke' );
	$id     = isset( $_POST['connection_id'] ) ? sanitize_text_field( wp_unslash( $_POST['connection_id'] ) ) : '';
	$result = wpagent_companion_revoke_connection( $id );
	if ( is_wp_error( $result ) ) {
		wp_die( esc_html( $result->get_error_message() ), esc_html__( 'Verbindung konnte nicht widerrufen werden.', 'wp-agent-companion' ), array( 'response' => 400 ) );
	}
	wp_safe_redirect( add_query_arg( array( 'page' => 'wpagently-connect', 'revoked' => '1' ), admin_url( 'admin.php' ) ) );
	exit;
}
add_action( 'admin_post_wpagently_connection_revoke', 'wpagent_companion_connection_revoke_handler' );

function wpagent_companion_connection_uninstall_cleanup_handler(): void {
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_die( esc_html__( 'Keine Berechtigung.', 'wp-agent-companion' ) );
	}
	check_admin_referer( 'wpagent_companion_connection_uninstall_cleanup' );
	$submitted = isset( $_POST['uninstall_cleanup'] ) ? wp_unslash( $_POST['uninstall_cleanup'] ) : array();
	if ( ! is_array( $submitted ) ) {
		wp_die( esc_html__( 'Ungültige Bereinigungseinstellung.', 'wp-agent-companion' ), '', array( 'response' => 400 ) );
	}
	$preferences = array(
		'oauth'                 => isset( $submitted['oauth'] ) && '1' === (string) $submitted['oauth'],
		'application_passwords' => isset( $submitted['application_passwords'] ) && '1' === (string) $submitted['application_passwords'],
		'skills'                => isset( $submitted['skills'] ) && '1' === (string) $submitted['skills'],
		'memory'                => isset( $submitted['memory'] ) && '1' === (string) $submitted['memory'],
	);
	update_option( WPAGENT_COMPANION_OPT_UNINSTALL_CLEANUP, $preferences, false );
	if ( wpagent_companion_uninstall_cleanup_preferences() !== $preferences ) {
		wp_die( esc_html__( 'Die Bereinigungseinstellung konnte nicht sicher gespeichert werden.', 'wp-agent-companion' ), '', array( 'response' => 500 ) );
	}
	wp_safe_redirect( add_query_arg( array( 'page' => 'wpagently-connect', 'uninstall_cleanup' => 'saved' ), admin_url( 'admin.php' ) ) );
	exit;
}
add_action( 'admin_post_wpagently_connection_uninstall_cleanup', 'wpagent_companion_connection_uninstall_cleanup_handler' );

function wpagent_companion_oauth_rate_reset_handler(): void {
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_die( esc_html__( 'Keine Berechtigung.', 'wp-agent-companion' ) );
	}
	check_admin_referer( 'wpagent_companion_oauth_rate_reset' );
	$result = wpagent_companion_oauth_reset_public_rate_limits();
	if ( is_wp_error( $result ) ) {
		$data   = $result->get_error_data();
		$status = is_array( $data ) ? absint( $data['status'] ?? 500 ) : 500;
		wp_die( esc_html( $result->get_error_message() ), esc_html__( 'OAuth-Anfragelimits konnten nicht zurückgesetzt werden.', 'wp-agent-companion' ), array( 'response' => $status ?: 500 ) );
	}
	wp_safe_redirect( add_query_arg( array( 'page' => 'wpagently-connect', 'oauth_rate_reset' => '1' ), admin_url( 'admin.php' ) ) );
	exit;
}
add_action( 'admin_post_wpagently_oauth_rate_reset', 'wpagent_companion_oauth_rate_reset_handler' );

function wpagent_companion_support_report_download(): void {
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_die( esc_html__( 'Keine Berechtigung.', 'wp-agent-companion' ) );
	}
	check_admin_referer( 'wpagent_companion_support_report' );
	$content = wp_json_encode( wpagent_companion_support_report(), JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES ) . "\n";
	nocache_headers();
	header( 'Content-Type: application/json; charset=utf-8' );
	header( 'Content-Disposition: attachment; filename="wpagently-support-report.json"' );
	header( 'X-Content-Type-Options: nosniff' );
	echo $content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- Absichtlicher JSON-Download.
	exit;
}
add_action( 'admin_post_wpagently_support_report', 'wpagent_companion_support_report_download' );

function wpagent_companion_connection_diagnostics_handler(): void {
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_die( esc_html__( 'Keine Berechtigung.', 'wp-agent-companion' ) );
	}
	check_admin_referer( 'wpagent_companion_connection_diagnostics' );
	wpagent_companion_run_connection_diagnostics();
	wp_safe_redirect( add_query_arg( array( 'page' => 'wpagently-connect', 'diagnostics' => '1' ), admin_url( 'admin.php' ) ) );
	exit;
}
add_action( 'admin_post_wpagently_connection_diagnostics', 'wpagent_companion_connection_diagnostics_handler' );

function wpagent_companion_gravity_access_handler(): void {
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_die( esc_html__( 'Keine Berechtigung.', 'wp-agent-companion' ) );
	}
	check_admin_referer( 'wpagent_companion_gravity_access' );
	$user_id = isset( $_POST['connection_user'] ) ? absint( $_POST['connection_user'] ) : 0;
	$mode    = isset( $_POST['gravity_access_mode'] ) ? sanitize_key( wp_unslash( $_POST['gravity_access_mode'] ) ) : '';
	if ( ! in_array( $mode, array( 'enable', 'disable' ), true ) ) {
		wp_die( esc_html__( 'Ungültige Gravity-Forms-Aktion.', 'wp-agent-companion' ), '', array( 'response' => 400 ) );
	}
	$result = wpagent_gravity_set_user_access( $user_id, 'enable' === $mode );
	if ( is_wp_error( $result ) ) {
		$data   = $result->get_error_data();
		$status = is_array( $data ) ? absint( $data['status'] ?? 400 ) : 400;
		wp_die( esc_html( $result->get_error_message() ), esc_html__( 'Gravity-Forms-Rechte konnten nicht geändert werden.', 'wp-agent-companion' ), array( 'response' => $status ?: 400 ) );
	}
	wp_safe_redirect( add_query_arg( array( 'page' => 'wpagently-connect', 'gravity_access' => 'enable' === $mode ? 'enabled' : 'disabled' ), admin_url( 'admin.php' ) ) );
	exit;
}
add_action( 'admin_post_wpagently_gravity_access', 'wpagent_companion_gravity_access_handler' );

function wpagent_companion_fluent_forms_access_handler(): void {
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_die( esc_html__( 'Keine Berechtigung.', 'wp-agent-companion' ) );
	}
	check_admin_referer( 'wpagent_companion_fluent_forms_access' );
	$user_id = isset( $_POST['connection_user'] ) ? absint( $_POST['connection_user'] ) : 0;
	$mode    = isset( $_POST['fluent_forms_access_mode'] ) ? sanitize_key( wp_unslash( $_POST['fluent_forms_access_mode'] ) ) : '';
	if ( ! in_array( $mode, array( 'enable', 'disable' ), true ) ) {
		wp_die( esc_html__( 'Ungültige Fluent-Forms-Aktion.', 'wp-agent-companion' ), '', array( 'response' => 400 ) );
	}
	$result = wpagent_fluent_forms_set_user_access( $user_id, 'enable' === $mode );
	if ( is_wp_error( $result ) ) {
		$data   = $result->get_error_data();
		$status = is_array( $data ) ? absint( $data['status'] ?? 400 ) : 400;
		wp_die( esc_html( $result->get_error_message() ), esc_html__( 'Fluent-Forms-Rechte konnten nicht geändert werden.', 'wp-agent-companion' ), array( 'response' => $status ?: 400 ) );
	}
	wp_safe_redirect( add_query_arg( array( 'page' => 'wpagently-connect', 'fluent_forms_access' => 'enable' === $mode ? 'enabled' : 'disabled' ), admin_url( 'admin.php' ) ) );
	exit;
}
add_action( 'admin_post_wpagently_fluent_forms_access', 'wpagent_companion_fluent_forms_access_handler' );

function wpagent_companion_formidable_access_handler(): void {
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_die( esc_html__( 'Keine Berechtigung.', 'wp-agent-companion' ) );
	}
	check_admin_referer( 'wpagent_companion_formidable_access' );
	$user_id = isset( $_POST['connection_user'] ) ? absint( $_POST['connection_user'] ) : 0;
	$mode    = isset( $_POST['formidable_access_mode'] ) ? sanitize_key( wp_unslash( $_POST['formidable_access_mode'] ) ) : '';
	if ( ! in_array( $mode, array( 'enable', 'disable' ), true ) ) {
		wp_die( esc_html__( 'Ungültige Formidable-Forms-Aktion.', 'wp-agent-companion' ), '', array( 'response' => 400 ) );
	}
	$result = wpagent_formidable_set_user_access( $user_id, 'enable' === $mode );
	if ( is_wp_error( $result ) ) {
		$data   = $result->get_error_data();
		$status = is_array( $data ) ? absint( $data['status'] ?? 400 ) : 400;
		wp_die( esc_html( $result->get_error_message() ), esc_html__( 'Formidable-Forms-Rechte konnten nicht geändert werden.', 'wp-agent-companion' ), array( 'response' => $status ?: 400 ) );
	}
	wp_safe_redirect( add_query_arg( array( 'page' => 'wpagently-connect', 'formidable_access' => 'enable' === $mode ? 'enabled' : 'disabled' ), admin_url( 'admin.php' ) ) );
	exit;
}
add_action( 'admin_post_wpagently_formidable_access', 'wpagent_companion_formidable_access_handler' );

function wpagent_companion_fluent_entry_access_handler(): void {
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_die( esc_html__( 'Keine Berechtigung.', 'wp-agent-companion' ) );
	}
	check_admin_referer( 'wpagent_companion_fluent_entry_access' );
	$user_id = isset( $_POST['connection_user'] ) ? absint( $_POST['connection_user'] ) : 0;
	$mode    = isset( $_POST['fluent_entry_access_mode'] ) ? sanitize_key( wp_unslash( $_POST['fluent_entry_access_mode'] ) ) : '';
	if ( ! in_array( $mode, array( 'enable', 'disable' ), true ) ) {
		wp_die( esc_html__( 'Ungültige Fluent-Forms-Eintragsaktion.', 'wp-agent-companion' ), '', array( 'response' => 400 ) );
	}
	$result = wpagent_fluent_forms_set_entry_user_access( $user_id, 'enable' === $mode );
	if ( is_wp_error( $result ) ) {
		$data   = $result->get_error_data();
		$status = is_array( $data ) ? absint( $data['status'] ?? 400 ) : 400;
		wp_die( esc_html( $result->get_error_message() ), esc_html__( 'Fluent-Forms-Eintragsrechte konnten nicht geändert werden.', 'wp-agent-companion' ), array( 'response' => $status ?: 400 ) );
	}
	wp_safe_redirect( add_query_arg( array( 'page' => 'wpagently-connect', 'fluent_entry_access' => 'enable' === $mode ? 'enabled' : 'disabled' ), admin_url( 'admin.php' ) ) );
	exit;
}
add_action( 'admin_post_wpagently_fluent_entry_access', 'wpagent_companion_fluent_entry_access_handler' );

function wpagent_companion_gravity_entry_access_handler(): void {
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_die( esc_html__( 'Keine Berechtigung.', 'wp-agent-companion' ) );
	}
	check_admin_referer( 'wpagent_companion_gravity_entry_access' );
	$user_id = isset( $_POST['connection_user'] ) ? absint( $_POST['connection_user'] ) : 0;
	$mode    = isset( $_POST['gravity_entry_access_mode'] ) ? sanitize_key( wp_unslash( $_POST['gravity_entry_access_mode'] ) ) : '';
	if ( ! in_array( $mode, array( 'enable', 'disable' ), true ) ) {
		wp_die( esc_html__( 'Ungültige Gravity-Forms-Eintragsaktion.', 'wp-agent-companion' ), '', array( 'response' => 400 ) );
	}
	$result = wpagent_gravity_set_entry_user_access( $user_id, 'enable' === $mode );
	if ( is_wp_error( $result ) ) {
		$data   = $result->get_error_data();
		$status = is_array( $data ) ? absint( $data['status'] ?? 400 ) : 400;
		wp_die( esc_html( $result->get_error_message() ), esc_html__( 'Gravity-Forms-Eintragsrechte konnten nicht geändert werden.', 'wp-agent-companion' ), array( 'response' => $status ?: 400 ) );
	}
	wp_safe_redirect( add_query_arg( array( 'page' => 'wpagently-connect', 'gravity_entry_access' => 'enable' === $mode ? 'enabled' : 'disabled' ), admin_url( 'admin.php' ) ) );
	exit;
}
add_action( 'admin_post_wpagently_gravity_entry_access', 'wpagent_companion_gravity_entry_access_handler' );

function wpagent_companion_wc_order_access_handler(): void {
	if ( ! current_user_can( 'manage_options' ) ) {
		wp_die( esc_html__( 'Keine Berechtigung.', 'wp-agent-companion' ) );
	}
	check_admin_referer( 'wpagent_companion_wc_order_access' );
	$user_id = isset( $_POST['connection_user'] ) ? absint( $_POST['connection_user'] ) : 0;
	$mode    = isset( $_POST['wc_order_access_mode'] ) ? sanitize_key( wp_unslash( $_POST['wc_order_access_mode'] ) ) : '';
	if ( ! in_array( $mode, array( 'enable', 'disable' ), true ) ) {
		wp_die( esc_html__( 'Ungültige WooCommerce-Bestellaktion.', 'wp-agent-companion' ), '', array( 'response' => 400 ) );
	}
	$result = wpagent_wc_set_order_user_access( $user_id, 'enable' === $mode );
	if ( is_wp_error( $result ) ) {
		$data   = $result->get_error_data();
		$status = is_array( $data ) ? absint( $data['status'] ?? 400 ) : 400;
		wp_die( esc_html( $result->get_error_message() ), esc_html__( 'WooCommerce-Bestellrechte konnten nicht geändert werden.', 'wp-agent-companion' ), array( 'response' => $status ?: 400 ) );
	}
	wp_safe_redirect( add_query_arg( array( 'page' => 'wpagently-connect', 'wc_order_access' => 'enable' === $mode ? 'enabled' : 'disabled' ), admin_url( 'admin.php' ) ) );
	exit;
}
add_action( 'admin_post_wpagently_wc_order_access', 'wpagent_companion_wc_order_access_handler' );

function wpagent_companion_connection_admin_notice(): void {
	if ( ! current_user_can( 'manage_options' ) ) {
		return;
	}
	foreach ( wpagent_companion_connection_warnings() as $warning ) {
		printf(
			'<div class="notice notice-warning"><p><strong>%1$s</strong> %2$s <a href="%3$s">%4$s</a></p></div>',
			esc_html__( 'wpagently-Verbindung prüfen.', 'wp-agent-companion' ),
			esc_html( $warning['detail'] ),
			esc_url( admin_url( 'admin.php?page=wpagently-connect' ) ),
			esc_html__( 'Diagnose öffnen', 'wp-agent-companion' )
		);
	}
}
add_action( 'admin_notices', 'wpagent_companion_connection_admin_notice' );

function wpagent_companion_connection_page(): void {
	if ( ! current_user_can( 'manage_options' ) ) {
		return;
	}
	$users                           = wpagent_companion_connection_users( false );
	$application_password_users      = wpagent_companion_connection_users( true );
	$application_passwords_supported = function_exists( 'wp_is_application_passwords_available' )
		&& wp_is_application_passwords_available();
	$gate_open                       = wpagent_companion_gate_open();
	$selected_user_id                = isset( $_GET['created_user'] ) ? absint( $_GET['created_user'] ) : 0; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
	$connections                     = wpagent_companion_connections();
	$connection_warnings             = wpagent_companion_connection_warnings();
	$connection_diagnostics          = wpagent_companion_latest_connection_diagnostics();
	$uninstall_cleanup               = wpagent_companion_uninstall_cleanup_preferences();
	$oauth_endpoint                  = wpagent_companion_mcp_endpoint();
	$selected_client                 = isset( $_GET['connection_client'] ) ? wpagent_companion_normalize_connection_client( sanitize_key( wp_unslash( $_GET['connection_client'] ) ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Recommended
	if ( ! in_array( $selected_client, wpagent_companion_connection_clients(), true ) ) {
		$selected_client = '';
	}
	$application_password_fallback_available = '' !== $selected_client
		&& wpagent_companion_connection_client_supports_application_password( $selected_client )
		&& $application_passwords_supported
		&& ! empty( $application_password_users );
	$locations                       = array(
		'claude-code' => __( 'Claude Code: Lege .mcp.json im gewünschten Projektordner ab.', 'wp-agent-companion' ),
		'claude-desktop' => __( 'Claude Desktop: Öffne die heruntergeladene .mcpb-Datei und bestätige die lokale Erweiterung. Die Datei enthält die Zugangsdaten dieser Verbindung.', 'wp-agent-companion' ),
		'codex'    => __( 'Codex: Kopiere den Inhalt in ~/.codex/config.toml oder in .codex/config.toml eines vertrauenswürdigen Projekts.', 'wp-agent-companion' ),
		'cursor'   => __( 'Cursor: Führe den Eintrag mit ~/.cursor/mcp.json oder .cursor/mcp.json im Projekt zusammen.', 'wp-agent-companion' ),
		'windsurf' => __( 'Windsurf: Führe den Eintrag mit ~/.codeium/windsurf/mcp_config.json zusammen.', 'wp-agent-companion' ),
		'vscode'   => __( 'Visual Studio Code: Führe den Eintrag mit der MCP-Konfiguration deines Benutzerprofils oder .vscode/mcp.json im Projekt zusammen.', 'wp-agent-companion' ),
		'gemini-cli' => __( 'Gemini CLI: Führe mcpServers aus der Datei mit ~/.gemini/settings.json oder der Projektkonfiguration zusammen.', 'wp-agent-companion' ),
		'opencode' => __( 'OpenCode: Führe mcp aus der Datei mit opencode.json im gewünschten Projekt zusammen.', 'wp-agent-companion' ),
		'cline' => __( 'Cline: Führe mcpServers aus der Datei mit ~/.cline/mcp.json oder der MCP-Einstellungsdatei der Erweiterung zusammen.', 'wp-agent-companion' ),
		'roo-code' => __( 'Roo Code: Führe mcpServers aus der Datei mit der globalen mcp_settings.json oder .roo/mcp.json im Projekt zusammen.', 'wp-agent-companion' ),
		'kilo-code' => __( 'Kilo Code: Führe mcp aus der Datei mit ~/.config/kilo/kilo.json oder .kilo/kilo.json im Projekt zusammen.', 'wp-agent-companion' ),
		'zed' => __( 'Zed: Führe context_servers aus der Datei mit deiner Zed-Einstellungsdatei zusammen.', 'wp-agent-companion' ),
		'github-copilot' => __( 'GitHub Copilot: Führe mcpServers aus der Datei mit ~/.copilot/mcp-config.json, .mcp.json oder .github/mcp.json zusammen.', 'wp-agent-companion' ),
		'amazon-q' => __( 'Amazon Q: Führe mcpServers aus der Datei mit ~/.aws/amazonq/default.json oder .amazonq/default.json zusammen.', 'wp-agent-companion' ),
		'antigravity' => __( 'Antigravity: Führe mcpServers aus der Datei mit ~/.gemini/config/mcp_config.json oder ~/.gemini/antigravity/mcp_config.json zusammen. Öffne im Zweifel MCP-Server verwalten > Rohkonfiguration ansehen, weil der Pfad von der Antigravity-Version abhängt.', 'wp-agent-companion' ),
	);
	?>
	<div class="wrap wpagently-admin">
		<div class="wpagently-admin__head">
			<h1><?php esc_html_e( 'Agent verbinden', 'wp-agent-companion' ); ?></h1>
			<p><?php esc_html_e( 'Verbinde deinen MCP-Client direkt mit WordPress. Wähle unten zuerst den Client. wpagently zeigt danach die passende Authentifizierung und eine datensparsame Netzwerkdiagnose.', 'wp-agent-companion' ); ?></p>
		</div>
		<?php if ( isset( $_GET['created_user'] ) ) : // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Der dedizierte Agent-Nutzer wurde als Redakteur angelegt. Du kannst ihn jetzt unten auswählen.', 'wp-agent-companion' ); ?></p></div>
		<?php endif; ?>
		<?php if ( isset( $_GET['revoked'] ) ) : // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Die Verbindung wurde widerrufen.', 'wp-agent-companion' ); ?></p></div>
		<?php endif; ?>
		<?php if ( 'saved' === ( $_GET['uninstall_cleanup'] ?? '' ) ) : // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Die Bereinigungseinstellungen für eine spätere Deinstallation wurden gespeichert.', 'wp-agent-companion' ); ?></p></div>
		<?php endif; ?>
		<?php if ( '1' === ( $_GET['oauth_rate_reset'] ?? '' ) ) : // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Die öffentlichen OAuth-Anfragelimits wurden zurückgesetzt.', 'wp-agent-companion' ); ?></p></div>
		<?php endif; ?>
		<?php if ( isset( $_GET['gravity_access'] ) ) : // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<?php $gravity_access = sanitize_key( wp_unslash( $_GET['gravity_access'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<?php if ( 'enabled' === $gravity_access ) : ?>
				<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Der sichere Agent-Nutzer kann Gravity Forms jetzt über die nativen, verifizierten Formularfunktionen verwalten.', 'wp-agent-companion' ); ?></p></div>
			<?php elseif ( 'disabled' === $gravity_access ) : ?>
				<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Die von wpagently ergänzten Gravity-Forms-Rechte wurden entfernt. Bereits vorhandene Rollenrechte blieben erhalten.', 'wp-agent-companion' ); ?></p></div>
			<?php elseif ( 'error' === $gravity_access ) : ?>
				<div class="notice notice-warning is-dismissible"><p><?php esc_html_e( 'Der Agent-Nutzer wurde angelegt, aber die Gravity-Forms-Rechte konnten nicht automatisch ergänzt werden. Versuche es unten erneut.', 'wp-agent-companion' ); ?></p></div>
			<?php endif; ?>
		<?php endif; ?>
		<?php if ( isset( $_GET['fluent_forms_access'] ) ) : // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<?php $fluent_forms_access = sanitize_key( wp_unslash( $_GET['fluent_forms_access'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<?php if ( 'enabled' === $fluent_forms_access ) : ?>
				<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Der sichere Agent-Nutzer kann Fluent Forms jetzt über die nativen, verifizierten Formularfunktionen verwalten.', 'wp-agent-companion' ); ?></p></div>
			<?php elseif ( 'disabled' === $fluent_forms_access ) : ?>
				<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Die von wpagently ergänzten Fluent-Forms-Rechte wurden entfernt. Bereits vorhandene Nutzerrechte blieben erhalten.', 'wp-agent-companion' ); ?></p></div>
			<?php elseif ( 'error' === $fluent_forms_access ) : ?>
				<div class="notice notice-warning is-dismissible"><p><?php esc_html_e( 'Der Agent-Nutzer wurde angelegt, aber die Fluent-Forms-Rechte konnten nicht automatisch ergänzt werden. Versuche es unten erneut.', 'wp-agent-companion' ); ?></p></div>
			<?php endif; ?>
		<?php endif; ?>
		<?php if ( isset( $_GET['formidable_access'] ) ) : // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<?php $formidable_access = sanitize_key( wp_unslash( $_GET['formidable_access'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<?php if ( 'enabled' === $formidable_access ) : ?>
				<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Der sichere Agent-Nutzer kann Formidable Forms jetzt über die nativen, verifizierten Formularfunktionen verwalten.', 'wp-agent-companion' ); ?></p></div>
			<?php elseif ( 'disabled' === $formidable_access ) : ?>
				<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Die von wpagently ergänzten Formidable-Forms-Rechte wurden entfernt. Bereits vorhandene Nutzerrechte blieben erhalten.', 'wp-agent-companion' ); ?></p></div>
			<?php elseif ( 'error' === $formidable_access ) : ?>
				<div class="notice notice-warning is-dismissible"><p><?php esc_html_e( 'Der Agent-Nutzer wurde angelegt, aber die Formidable-Forms-Rechte konnten nicht automatisch ergänzt werden. Versuche es unten erneut.', 'wp-agent-companion' ); ?></p></div>
			<?php endif; ?>
		<?php endif; ?>
		<?php if ( isset( $_GET['wpforms_access'] ) ) : // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<?php $wpforms_access = sanitize_key( wp_unslash( $_GET['wpforms_access'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<?php if ( 'enabled' === $wpforms_access ) : ?>
				<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Die ausgewählten WPForms-Rechte wurden für den sicheren Agent-Nutzer aktiviert.', 'wp-agent-companion' ); ?></p></div>
			<?php elseif ( 'disabled' === $wpforms_access ) : ?>
				<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Die von wpagently ergänzten WPForms-Rechte wurden entfernt. Bereits vorhandene Nutzerrechte blieben erhalten.', 'wp-agent-companion' ); ?></p></div>
			<?php elseif ( 'error' === $wpforms_access ) : ?>
				<div class="notice notice-warning is-dismissible"><p><?php esc_html_e( 'Die WPForms-Rechte konnten nicht sicher geändert werden. Prüfe den Agent-Nutzer und versuche es erneut.', 'wp-agent-companion' ); ?></p></div>
			<?php endif; ?>
		<?php endif; ?>
		<?php if ( isset( $_GET['gravity_entry_access'] ) ) : // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<?php $gravity_entry_access = sanitize_key( wp_unslash( $_GET['gravity_entry_access'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<?php if ( 'enabled' === $gravity_entry_access ) : ?>
				<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Der sichere Agent-Nutzer kann Gravity-Forms-Einträge jetzt lesen und verifiziert bearbeiten.', 'wp-agent-companion' ); ?></p></div>
			<?php elseif ( 'disabled' === $gravity_entry_access ) : ?>
				<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Die von wpagently ergänzten Gravity-Forms-Eintragsrechte wurden entfernt. Bereits vorhandene Rollenrechte blieben erhalten.', 'wp-agent-companion' ); ?></p></div>
			<?php endif; ?>
		<?php endif; ?>
		<?php if ( isset( $_GET['fluent_entry_access'] ) ) : // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<?php $fluent_entry_access = sanitize_key( wp_unslash( $_GET['fluent_entry_access'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<?php if ( 'enabled' === $fluent_entry_access ) : ?>
				<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Der sichere Agent-Nutzer kann Fluent-Forms-Einträge jetzt datensparsam lesen und verifiziert bearbeiten.', 'wp-agent-companion' ); ?></p></div>
			<?php elseif ( 'disabled' === $fluent_entry_access ) : ?>
				<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Die von wpagently ergänzten Fluent-Forms-Eintragsrechte wurden entfernt. Bereits vorhandene Nutzerrechte blieben erhalten.', 'wp-agent-companion' ); ?></p></div>
			<?php endif; ?>
		<?php endif; ?>
		<?php if ( isset( $_GET['wc_order_access'] ) ) : // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<?php $wc_order_access = sanitize_key( wp_unslash( $_GET['wc_order_access'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended ?>
			<?php if ( 'enabled' === $wc_order_access ) : ?>
				<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Der sichere Agent-Nutzer kann WooCommerce-Bestellungen jetzt datensparsam lesen und bestätigt bearbeiten.', 'wp-agent-companion' ); ?></p></div>
			<?php elseif ( 'disabled' === $wc_order_access ) : ?>
				<div class="notice notice-success is-dismissible"><p><?php esc_html_e( 'Die von wpagently ergänzten WooCommerce-Bestellrechte wurden entfernt. Bereits vorhandene Rollenrechte blieben erhalten.', 'wp-agent-companion' ); ?></p></div>
			<?php endif; ?>
		<?php endif; ?>
		<?php foreach ( $connection_warnings as $warning ) : ?>
			<div class="notice notice-warning"><p><?php echo esc_html( $warning['detail'] ); ?></p></div>
		<?php endforeach; ?>
		<?php if ( ! $gate_open ) : ?>
			<div class="notice notice-error"><p><?php esc_html_e( 'Öffne zuerst das Companion-Gate unter wpagently > Übersicht und behebe dort alle roten Systemdiagnosen.', 'wp-agent-companion' ); ?></p></div>
		<?php else : ?>
			<h2><?php esc_html_e( '1. Sicheren Agent-Nutzer bereitstellen', 'wp-agent-companion' ); ?></h2>
			<div class="wpagently-card wpagently-card--narrow">
			<?php if ( current_user_can( 'create_users' ) ) : ?>
				<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
					<input type="hidden" name="action" value="wpagently_connection_create_user">
					<?php wp_nonce_field( 'wpagent_companion_connection_create_user' ); ?>
					<?php submit_button( __( 'Dedizierten Agent-Nutzer anlegen', 'wp-agent-companion' ), 'secondary', 'submit', false ); ?>
				</form>
				<p class="description"><?php esc_html_e( 'Dieser Nutzer erhält ausschließlich die Rolle Redakteur und ein zufälliges, nicht ausgegebenes Login-Passwort.', 'wp-agent-companion' ); ?></p>
			<?php endif; ?>
			</div>
			<?php if ( empty( $users ) ) : ?>
				<div class="notice notice-warning inline"><p><?php esc_html_e( 'Es gibt noch keinen geeigneten Nutzer. Lege oben einen dedizierten Agent-Nutzer an. Danach wird der OAuth-Endpunkt angezeigt.', 'wp-agent-companion' ); ?></p></div>
			<?php else : ?>
				<h2><?php esc_html_e( '2. Client wählen', 'wp-agent-companion' ); ?></h2>
				<div class="wpagently-card wpagently-card--narrow">
				<p><?php esc_html_e( 'Wähle zuerst den MCP-Client. Danach zeigt wpagently die passende Authentifizierung und bewertet die zuletzt gemessene Erreichbarkeit.', 'wp-agent-companion' ); ?></p>
				<form method="get" action="<?php echo esc_url( admin_url( 'admin.php' ) ); ?>">
					<input type="hidden" name="page" value="wpagently-connect">
					<label for="wpagently-connection-client"><strong><?php esc_html_e( 'Client', 'wp-agent-companion' ); ?></strong></label>
					<select id="wpagently-connection-client" name="connection_client" required>
						<option value=""><?php esc_html_e( 'Client auswählen', 'wp-agent-companion' ); ?></option>
						<?php foreach ( wpagent_companion_connection_client_labels() as $client_id => $client_label ) : ?>
							<option value="<?php echo esc_attr( $client_id ); ?>" <?php selected( $selected_client, $client_id ); ?>><?php echo esc_html( $client_label ); ?></option>
						<?php endforeach; ?>
					</select>
					<?php submit_button( __( 'Auth-Empfehlung anzeigen', 'wp-agent-companion' ), 'secondary', 'submit', false ); ?>
				</form>
				</div>
				<?php if ( '' === $selected_client ) : ?>
					<div class="notice notice-info inline"><p><?php esc_html_e( 'Noch keine Auth-Methode gewählt. Wähle zuerst einen Client aus.', 'wp-agent-companion' ); ?></p></div>
				<?php else : ?>
					<?php $auth_recommendation = wpagent_companion_connection_auth_recommendation( $selected_client, $connection_diagnostics ); ?>
					<h2><?php esc_html_e( '3. Empfohlene Authentifizierung', 'wp-agent-companion' ); ?></h2>
					<div class="wpagently-card wpagently-card--narrow">
					<?php if ( 'blocked' === $auth_recommendation['environment'] ) : ?>
						<?php if ( 'bot-protection-blocks-public-route' === $auth_recommendation['reason'] ) : ?>
							<div class="notice notice-error inline"><p><?php esc_html_e( 'Die externe Diagnose hat eine Challenge oder eine Blockade eines öffentlichen wpagently Endpunkts gesehen. OAuth und Application Password erreichen beide diesen Endpunkt und werden daher voraussichtlich scheitern. Deaktiviere keinen Bot-Schutz global. Erlaube nach Prüfung nur die erforderlichen wpagently REST und OAuth Routen mit ihren benötigten Methoden.', 'wp-agent-companion' ); ?></p></div>
						<?php else : ?>
							<div class="notice notice-error inline"><p><?php esc_html_e( 'Mindestens einer der erforderlichen öffentlichen REST Endpunkte, MCP Endpunkte oder OAuth Endpunkte war nicht erwartungsgemäß erreichbar. OAuth und Application Password können die Verbindung deshalb voraussichtlich nicht erfolgreich aufbauen. Prüfe gezielt die betreffende Route, Methode sowie CDN, Firewall und Security Plugin Regeln.', 'wp-agent-companion' ); ?></p></div>
						<?php endif; ?>
					<?php elseif ( 'unknown' === $auth_recommendation['environment'] ) : ?>
						<?php if ( 'external-diagnosis-incomplete' === $auth_recommendation['reason'] ) : ?>
							<div class="notice notice-warning inline"><p><?php esc_html_e( 'Die gespeicherte externe Diagnose deckt nicht alle erforderlichen öffentlichen Endpunkte ab. Führe sie weiter unten erneut ohne Zugangsdaten aus. Bis dahin ist die Empfehlung nur klientbezogen, nicht netzwerkverifiziert.', 'wp-agent-companion' ); ?></p></div>
						<?php else : ?>
							<div class="notice notice-warning inline"><p><?php esc_html_e( 'Es liegt noch keine externe Diagnose vor. Führe sie weiter unten ohne Zugangsdaten aus. Bis dahin ist die Empfehlung nur klientbezogen, nicht netzwerkverifiziert.', 'wp-agent-companion' ); ?></p></div>
						<?php endif; ?>
					<?php else : ?>
						<div class="notice notice-success inline"><p><?php esc_html_e( 'Alle drei geprüften öffentlichen REST Endpunkte, MCP Endpunkte und OAuth Endpunkte waren erwartungsgemäß erreichbar. Es wurde keine Challenge oder 403 oder 429 Blockade gesehen. Das ist ein Hinweis, keine dauerhafte Freigabe.', 'wp-agent-companion' ); ?></p></div>
					<?php endif; ?>
					<?php if ( 'oauth' === $auth_recommendation['recommended_auth'] ) : ?>
						<p><?php esc_html_e( 'Dieser Client kann den browsergebundenen OAuth-Flow mit PKCE verwenden. Die Freigabe erfolgt an WordPress, ein Passwort wird nicht in die Client-Konfiguration geschrieben.', 'wp-agent-companion' ); ?></p>
						<p><input class="large-text code wpagently-endpoint" type="text" readonly value="<?php echo esc_attr( $oauth_endpoint ); ?>" aria-label="<?php esc_attr_e( 'OAuth-MCP-Endpunkt', 'wp-agent-companion' ); ?>" onclick="this.select()"></p>
						<?php if ( 'codex' === $selected_client ) : ?>
							<p><?php esc_html_e( 'Registriere den Server für Codex mit dem folgenden Befehl benutzerweit. Starte danach den in der Ausgabe genannten codex mcp login Befehl. Die Registrierung speichert kein WordPress-Passwort und öffnet nicht ungefragt einen Browser.', 'wp-agent-companion' ); ?></p>
							<p><code class="wpagently-evidence">wp-agent init --agent codex --scope user --site "$WP_AGENT_SITE" --i-approve</code></p>
						<?php elseif ( 'chatgpt' === $selected_client ) : ?>
							<p><?php esc_html_e( 'ChatGPT: Aktiviere den Entwicklermodus für Apps, lege eine benutzerdefinierte App mit dieser URL an und schließe die WordPress-Anmeldung ab.', 'wp-agent-companion' ); ?></p>
						<?php elseif ( 'claude-code' === $selected_client ) : ?>
							<p><?php esc_html_e( 'Claude Code: Registriere den Server mit dem folgenden Befehl benutzerweit. Schließe danach die Browser-Freigabe in /mcp ab. Der Befehl speichert kein WordPress-Passwort.', 'wp-agent-companion' ); ?></p>
							<p><code class="wpagently-evidence">wp-agent init --agent claude --scope user --site "$WP_AGENT_SITE" --i-approve</code></p>
						<?php else : ?>
							<p><?php esc_html_e( 'Verwende die URL als entfernten HTTP-MCP-Server und schließe die vom Client gestartete Browser-Freigabe ab.', 'wp-agent-companion' ); ?></p>
						<?php endif; ?>
						<?php if ( $application_password_fallback_available ) : ?>
							<p class="description"><?php esc_html_e( 'Falls diese Client-Version noch keinen OAuth-MCP-Flow anbietet, steht darunter ein eigenes widerrufbares Application Password als Fallback bereit.', 'wp-agent-companion' ); ?></p>
						<?php endif; ?>
					<?php else : ?>
						<p><?php esc_html_e( 'Für diesen Client erstellt wpagently eine einmalig heruntergeladene lokale Konfiguration mit einem eigenen widerrufbaren Application Password im Authorization-Header.', 'wp-agent-companion' ); ?></p>
					<?php endif; ?>
					<?php if ( $application_password_fallback_available ) : ?>
						<?php if ( 'oauth' === $auth_recommendation['recommended_auth'] ) : ?><h3><?php esc_html_e( 'Fallback mit Application Password', 'wp-agent-companion' ); ?></h3><?php endif; ?>
						<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
							<input type="hidden" name="action" value="wpagently_connection_download">
							<input type="hidden" name="connection_client" value="<?php echo esc_attr( $selected_client ); ?>">
							<?php wp_nonce_field( 'wpagent_companion_connection_download' ); ?>
							<table class="form-table"><tbody>
							<tr><th><label for="connection_user"><?php esc_html_e( 'WordPress-Nutzer', 'wp-agent-companion' ); ?></label></th><td><select id="connection_user" name="connection_user" required>
							<?php foreach ( $application_password_users as $user ) : ?>
								<option value="<?php echo esc_attr( (string) $user['id'] ); ?>" <?php selected( $selected_user_id, $user['id'] ); ?>><?php echo esc_html( $user['name'] . ' (' . $user['login'] . ', ' . implode( ', ', $user['roles'] ) . ')' ); ?></option>
							<?php endforeach; ?>
							</select><p class="description"><?php esc_html_e( 'Aus Sicherheitsgründen werden Administratoren und Super-Administratoren nicht angeboten.', 'wp-agent-companion' ); ?></p></td></tr>
							<tr><th><label for="connection_label"><?php esc_html_e( 'Verbindungsname', 'wp-agent-companion' ); ?></label></th><td><input id="connection_label" name="connection_label" type="text" class="regular-text" value="wpagently" maxlength="255"></td></tr>
							</tbody></table>
							<?php submit_button( __( 'Konfiguration einmalig herunterladen', 'wp-agent-companion' ) ); ?>
						</form>
						<p><?php echo esc_html( $locations[ $selected_client ] ?? '' ); ?></p>
						<div class="notice notice-warning inline wpagently-rail--risk"><p><strong><?php esc_html_e( 'Wichtig:', 'wp-agent-companion' ); ?></strong> <?php esc_html_e( 'Die Datei enthält ein Passwort. Speichere sie nur lokal, committe sie nie und widerrufe die Verbindung hier unter Verbindungen verwalten, wenn du sie nicht mehr brauchst.', 'wp-agent-companion' ); ?></p></div>
					<?php elseif ( 'application-password' === $auth_recommendation['recommended_auth'] ) : ?>
						<div class="notice notice-info inline"><p><?php esc_html_e( 'Application Passwords sind für die verfügbaren sicheren Nutzer nicht verfügbar. Wähle einen OAuth-fähigen Client oder aktiviere Application Passwords nur nach einer bewussten Sicherheitsprüfung.', 'wp-agent-companion' ); ?></p></div>
					<?php endif; ?>
					</div>
					<h2><?php esc_html_e( '4. Verbindung prüfen', 'wp-agent-companion' ); ?></h2>
					<p><?php esc_html_e( 'Starte den Client neu und prüfe dort die MCP-Server. Wenn die Verbindung nicht startet, lies zuerst die externe Diagnose unten und prüfe punktuelle Regeln von CDN, Firewall und Security-Plugin.', 'wp-agent-companion' ); ?></p>
				<?php endif; ?>
			<?php endif; ?>
		<?php endif; ?>

		<?php wpagent_companion_wpforms_connection_controls( $users, $selected_user_id ); ?>
		<?php wpagent_companion_ninjaforms_connection_controls( $users, $selected_user_id ); ?>

		<?php if ( wpagent_gravity_available() && ! empty( $users ) ) : ?>
			<h2><?php esc_html_e( 'Gravity Forms für den Agent-Nutzer', 'wp-agent-companion' ); ?></h2>
			<p><?php esc_html_e( 'Gravity Forms verwendet eigene Rechte, die ein normaler Redakteur nicht automatisch besitzt. Aktiviere sie gezielt für den sicheren Agent-Nutzer. Beim Entfernen löscht wpagently ausschließlich Rechte, die es diesem Nutzer selbst hinzugefügt hat.', 'wp-agent-companion' ); ?></p>
			<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
				<input type="hidden" name="action" value="wpagently_gravity_access">
				<?php wp_nonce_field( 'wpagent_companion_gravity_access' ); ?>
				<label for="gravity_connection_user"><strong><?php esc_html_e( 'Sicherer Agent-Nutzer', 'wp-agent-companion' ); ?></strong></label>
				<select id="gravity_connection_user" name="connection_user" required>
					<?php foreach ( $users as $user ) : ?>
						<?php $gravity_state = wpagent_gravity_user_access( (int) $user['id'] ); ?>
						<option value="<?php echo esc_attr( (string) $user['id'] ); ?>" <?php selected( $selected_user_id, $user['id'] ); ?>><?php echo esc_html( $user['name'] . ' (' . $user['login'] . ')' . ( ! is_wp_error( $gravity_state ) && $gravity_state['enabled'] ? ' · ' . __( 'aktiv', 'wp-agent-companion' ) : '' ) ); ?></option>
					<?php endforeach; ?>
				</select>
				<p>
					<button class="button button-secondary" type="submit" name="gravity_access_mode" value="enable"><?php esc_html_e( 'Gravity-Forms-Rechte aktivieren', 'wp-agent-companion' ); ?></button>
					<button class="button" type="submit" name="gravity_access_mode" value="disable"><?php esc_html_e( 'Von wpagently ergänzte Rechte entfernen', 'wp-agent-companion' ); ?></button>
				</p>
			</form>
			<h3><?php esc_html_e( 'Gravity-Forms-Eintragsdaten', 'wp-agent-companion' ); ?></h3>
			<div class="notice notice-warning inline"><p><strong><?php esc_html_e( 'Sensible Daten:', 'wp-agent-companion' ); ?></strong> <?php esc_html_e( 'Einträge können personenbezogene Daten und Zahlungsinformationen enthalten. Aktiviere diese separaten Rechte nur, wenn der Agent Einträge tatsächlich bearbeiten soll. Sie werden beim Anlegen eines Agent-Nutzers nie automatisch vergeben.', 'wp-agent-companion' ); ?></p></div>
			<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
				<input type="hidden" name="action" value="wpagently_gravity_entry_access">
				<?php wp_nonce_field( 'wpagent_companion_gravity_entry_access' ); ?>
				<label for="gravity_entry_connection_user"><strong><?php esc_html_e( 'Sicherer Agent-Nutzer', 'wp-agent-companion' ); ?></strong></label>
				<select id="gravity_entry_connection_user" name="connection_user" required>
					<?php foreach ( $users as $user ) : ?>
						<?php $gravity_entry_state = wpagent_gravity_entry_user_access( (int) $user['id'] ); ?>
						<option value="<?php echo esc_attr( (string) $user['id'] ); ?>" <?php selected( $selected_user_id, $user['id'] ); ?>><?php echo esc_html( $user['name'] . ' (' . $user['login'] . ')' . ( ! is_wp_error( $gravity_entry_state ) && $gravity_entry_state['enabled'] ? ' · ' . __( 'aktiv', 'wp-agent-companion' ) : '' ) ); ?></option>
					<?php endforeach; ?>
				</select>
				<p>
					<button class="button button-secondary" type="submit" name="gravity_entry_access_mode" value="enable"><?php esc_html_e( 'Eintragsrechte aktivieren', 'wp-agent-companion' ); ?></button>
					<button class="button" type="submit" name="gravity_entry_access_mode" value="disable"><?php esc_html_e( 'Von wpagently ergänzte Eintragsrechte entfernen', 'wp-agent-companion' ); ?></button>
				</p>
			</form>
		<?php endif; ?>

		<?php if ( wpagent_fluent_forms_available() && ! empty( $users ) ) : ?>
			<h2><?php esc_html_e( 'Fluent Forms für den Agent-Nutzer', 'wp-agent-companion' ); ?></h2>
			<p><?php esc_html_e( 'Fluent Forms verwendet eigene Rechte, die ein normaler Redakteur nicht automatisch besitzt. Aktiviere sie gezielt für den sicheren Agent-Nutzer. Formularbezogene Einschränkungen aus Fluent Forms bleiben wirksam. Beim Entfernen löscht wpagently ausschließlich Rechte, die es diesem Nutzer selbst hinzugefügt hat.', 'wp-agent-companion' ); ?></p>
			<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
				<input type="hidden" name="action" value="wpagently_fluent_forms_access">
				<?php wp_nonce_field( 'wpagent_companion_fluent_forms_access' ); ?>
				<label for="fluent_forms_connection_user"><strong><?php esc_html_e( 'Sicherer Agent-Nutzer', 'wp-agent-companion' ); ?></strong></label>
				<select id="fluent_forms_connection_user" name="connection_user" required>
					<?php foreach ( $users as $user ) : ?>
						<?php $fluent_forms_state = wpagent_fluent_forms_user_access( (int) $user['id'] ); ?>
						<option value="<?php echo esc_attr( (string) $user['id'] ); ?>" <?php selected( $selected_user_id, $user['id'] ); ?>><?php echo esc_html( $user['name'] . ' (' . $user['login'] . ')' . ( ! is_wp_error( $fluent_forms_state ) && $fluent_forms_state['enabled'] ? ' · ' . __( 'aktiv', 'wp-agent-companion' ) : '' ) ); ?></option>
					<?php endforeach; ?>
				</select>
				<p>
					<button class="button button-secondary" type="submit" name="fluent_forms_access_mode" value="enable"><?php esc_html_e( 'Fluent-Forms-Rechte aktivieren', 'wp-agent-companion' ); ?></button>
					<button class="button" type="submit" name="fluent_forms_access_mode" value="disable"><?php esc_html_e( 'Von wpagently ergänzte Rechte entfernen', 'wp-agent-companion' ); ?></button>
				</p>
			</form>
			<h3><?php esc_html_e( 'Fluent-Forms-Eintragsdaten', 'wp-agent-companion' ); ?></h3>
			<div class="notice notice-warning inline"><p><strong><?php esc_html_e( 'Sensible Daten:', 'wp-agent-companion' ); ?></strong> <?php esc_html_e( 'Einträge können personenbezogene Daten enthalten. wpagently blendet IP-Adressen, Browserdaten, Zahlungsdaten, Transaktionen und unbekannte Metadaten aus. Aktiviere diese separaten Rechte trotzdem nur, wenn der Agent Einträge tatsächlich verwalten soll. Sie werden beim Anlegen eines Agent-Nutzers nie automatisch vergeben.', 'wp-agent-companion' ); ?></p></div>
			<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
				<input type="hidden" name="action" value="wpagently_fluent_entry_access">
				<?php wp_nonce_field( 'wpagent_companion_fluent_entry_access' ); ?>
				<label for="fluent_entry_connection_user"><strong><?php esc_html_e( 'Sicherer Agent-Nutzer', 'wp-agent-companion' ); ?></strong></label>
				<select id="fluent_entry_connection_user" name="connection_user" required>
					<?php foreach ( $users as $user ) : ?>
						<?php $fluent_entry_state = wpagent_fluent_forms_entry_user_access( (int) $user['id'] ); ?>
						<option value="<?php echo esc_attr( (string) $user['id'] ); ?>" <?php selected( $selected_user_id, $user['id'] ); ?>><?php echo esc_html( $user['name'] . ' (' . $user['login'] . ')' . ( ! is_wp_error( $fluent_entry_state ) && $fluent_entry_state['enabled'] ? ' · ' . __( 'aktiv', 'wp-agent-companion' ) : '' ) ); ?></option>
					<?php endforeach; ?>
				</select>
				<p>
					<button class="button button-secondary" type="submit" name="fluent_entry_access_mode" value="enable"><?php esc_html_e( 'Eintragsrechte aktivieren', 'wp-agent-companion' ); ?></button>
					<button class="button" type="submit" name="fluent_entry_access_mode" value="disable"><?php esc_html_e( 'Von wpagently ergänzte Eintragsrechte entfernen', 'wp-agent-companion' ); ?></button>
				</p>
			</form>
		<?php endif; ?>

		<?php if ( wpagent_formidable_available() && ! empty( $users ) ) : ?>
			<h2><?php esc_html_e( 'Formidable Forms für den Agent-Nutzer', 'wp-agent-companion' ); ?></h2>
			<p><?php esc_html_e( 'Formidable Forms verwendet eigene Rechte, die ein normaler Redakteur nicht automatisch besitzt. Aktiviere sie gezielt für den sicheren Agent-Nutzer. Beim Entfernen löscht wpagently ausschließlich Rechte, die es diesem Nutzer selbst hinzugefügt hat.', 'wp-agent-companion' ); ?></p>
			<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
				<input type="hidden" name="action" value="wpagently_formidable_access">
				<?php wp_nonce_field( 'wpagent_companion_formidable_access' ); ?>
				<label for="formidable_connection_user"><strong><?php esc_html_e( 'Sicherer Agent-Nutzer', 'wp-agent-companion' ); ?></strong></label>
				<select id="formidable_connection_user" name="connection_user" required>
					<?php foreach ( $users as $user ) : ?>
						<?php $formidable_state = wpagent_formidable_user_access( (int) $user['id'] ); ?>
						<option value="<?php echo esc_attr( (string) $user['id'] ); ?>" <?php selected( $selected_user_id, $user['id'] ); ?>><?php echo esc_html( $user['name'] . ' (' . $user['login'] . ')' . ( ! is_wp_error( $formidable_state ) && $formidable_state['enabled'] ? ' · ' . __( 'aktiv', 'wp-agent-companion' ) : '' ) ); ?></option>
					<?php endforeach; ?>
				</select>
				<p>
					<button class="button button-secondary" type="submit" name="formidable_access_mode" value="enable"><?php esc_html_e( 'Formidable-Forms-Rechte aktivieren', 'wp-agent-companion' ); ?></button>
					<button class="button" type="submit" name="formidable_access_mode" value="disable"><?php esc_html_e( 'Von wpagently ergänzte Rechte entfernen', 'wp-agent-companion' ); ?></button>
				</p>
			</form>
		<?php endif; ?>

		<?php if ( wpagent_wc_orders_available() && ! empty( $users ) ) : ?>
			<h2><?php esc_html_e( 'WooCommerce-Bestellungen für den Agent-Nutzer', 'wp-agent-companion' ); ?></h2>
			<div class="notice notice-warning inline"><p><strong><?php esc_html_e( 'Sensible Bestelldaten:', 'wp-agent-companion' ); ?></strong> <?php esc_html_e( 'Bestellungen können Namen, Adressen, Kontaktdaten, Transaktionskennungen und vertrauliche Notizen enthalten. Statusänderungen und Kundennotizen können E-Mails, Lagerbewegungen, Webhooks und Drittanbieter-Automationen auslösen. Aktiviere diese Rechte nur für einen eigens dafür vorgesehenen Agent-Nutzer. Sie werden nie automatisch vergeben.', 'wp-agent-companion' ); ?></p></div>
			<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
				<input type="hidden" name="action" value="wpagently_wc_order_access">
				<?php wp_nonce_field( 'wpagent_companion_wc_order_access' ); ?>
				<label for="wc_order_connection_user"><strong><?php esc_html_e( 'Sicherer Agent-Nutzer', 'wp-agent-companion' ); ?></strong></label>
				<select id="wc_order_connection_user" name="connection_user" required>
					<?php foreach ( $users as $user ) : ?>
						<?php $wc_order_state = wpagent_wc_order_user_access( (int) $user['id'] ); ?>
						<option value="<?php echo esc_attr( (string) $user['id'] ); ?>" <?php selected( $selected_user_id, $user['id'] ); ?>><?php echo esc_html( $user['name'] . ' (' . $user['login'] . ')' . ( ! is_wp_error( $wc_order_state ) && $wc_order_state['enabled'] ? ' · ' . __( 'aktiv', 'wp-agent-companion' ) : '' ) ); ?></option>
					<?php endforeach; ?>
				</select>
				<p>
					<button class="button button-secondary" type="submit" name="wc_order_access_mode" value="enable"><?php esc_html_e( 'Bestellrechte aktivieren', 'wp-agent-companion' ); ?></button>
					<button class="button" type="submit" name="wc_order_access_mode" value="disable"><?php esc_html_e( 'Von wpagently ergänzte Bestellrechte entfernen', 'wp-agent-companion' ); ?></button>
				</p>
			</form>
		<?php endif; ?>

		<h2><?php esc_html_e( 'Externe Verbindungsdiagnose', 'wp-agent-companion' ); ?></h2>
		<p><?php esc_html_e( 'Die Prüfung ruft die öffentliche REST-API, den MCP-Endpunkt und die OAuth-Metadaten über die Website-Adresse auf. So werden viele CDN-, Firewall- und Security-Plugin-Blockaden sichtbar. Es werden keine Zugangsdaten gesendet.', 'wp-agent-companion' ); ?></p>
		<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
			<input type="hidden" name="action" value="wpagently_connection_diagnostics">
			<?php wp_nonce_field( 'wpagent_companion_connection_diagnostics' ); ?>
			<?php submit_button( __( 'Externe Diagnose jetzt ausführen', 'wp-agent-companion' ), 'secondary', 'submit', false ); ?>
		</form>
		<?php if ( ! empty( $connection_diagnostics ) ) : ?>
			<p class="description"><?php echo esc_html( sprintf( /* translators: %s: ISO timestamp. */ __( 'Letzte Prüfung: %s', 'wp-agent-companion' ), (string) $connection_diagnostics['generated_at'] ) ); ?></p>
			<table class="widefat striped"><thead><tr><th><?php esc_html_e( 'Prüfung', 'wp-agent-companion' ); ?></th><th><?php esc_html_e( 'Ergebnis', 'wp-agent-companion' ); ?></th><th><?php esc_html_e( 'HTTP', 'wp-agent-companion' ); ?></th><th><?php esc_html_e( 'Dauer', 'wp-agent-companion' ); ?></th><th><?php esc_html_e( 'Detail', 'wp-agent-companion' ); ?></th></tr></thead><tbody>
			<?php foreach ( $connection_diagnostics['checks'] as $check ) : ?>
				<?php if ( ! is_array( $check ) ) { continue; } ?>
				<tr><td><?php echo esc_html( wpagent_companion_connection_probe_label( (string) ( $check['name'] ?? '' ) ) ); ?></td><td><span class="wpagently-badge <?php echo ! empty( $check['ok'] ) ? 'wpagently-badge--safe' : 'wpagently-badge--risk'; ?>"><?php echo esc_html( ! empty( $check['ok'] ) ? __( 'OK', 'wp-agent-companion' ) : __( 'Fehler', 'wp-agent-companion' ) ); ?></span></td><td><?php echo esc_html( (string) absint( $check['status'] ?? 0 ) ); ?></td><td><?php echo esc_html( sprintf( /* translators: %d: milliseconds. */ __( '%d ms', 'wp-agent-companion' ), absint( $check['duration_ms'] ?? 0 ) ) ); ?></td><td><?php echo esc_html( (string) ( $check['detail'] ?? '' ) ); ?></td></tr>
			<?php endforeach; ?>
			</tbody></table>
			<?php if ( ! empty( $connection_diagnostics['intermediaries'] ) ) : ?>
				<p><strong><?php esc_html_e( 'Erkannte vorgeschaltete Dienste:', 'wp-agent-companion' ); ?></strong> <?php echo esc_html( implode( ', ', array_map( 'strval', $connection_diagnostics['intermediaries'] ) ) ); ?></p>
			<?php endif; ?>
			<?php if ( ! empty( $connection_diagnostics['security_plugins'] ) ) : ?>
				<p><strong><?php esc_html_e( 'Aktive Security-Plugins:', 'wp-agent-companion' ); ?></strong> <?php echo esc_html( implode( ', ', array_map( 'strval', $connection_diagnostics['security_plugins'] ) ) ); ?>. <?php esc_html_e( 'Diese Plugins sind nicht automatisch die Ursache. Prüfe bei einem Fehler aber ihre REST- und Firewall-Regeln.', 'wp-agent-companion' ); ?></p>
			<?php endif; ?>
		<?php endif; ?>

		<h2><?php esc_html_e( 'Verbindungen verwalten', 'wp-agent-companion' ); ?></h2>
		<?php if ( empty( $connections ) ) : ?>
			<p><?php esc_html_e( 'Es wurden noch keine Verbindungen über wpagently erstellt.', 'wp-agent-companion' ); ?></p>
		<?php else : ?>
			<table class="widefat striped"><thead><tr><th><?php esc_html_e( 'Name', 'wp-agent-companion' ); ?></th><th><?php esc_html_e( 'Client', 'wp-agent-companion' ); ?></th><th><?php esc_html_e( 'Nutzer', 'wp-agent-companion' ); ?></th><th><?php esc_html_e( 'Nutzung', 'wp-agent-companion' ); ?></th><th><?php esc_html_e( 'Status', 'wp-agent-companion' ); ?></th><th><?php esc_html_e( 'Aktion', 'wp-agent-companion' ); ?></th></tr></thead><tbody>
			<?php foreach ( $connections as $connection ) : ?>
				<tr><td><?php echo esc_html( $connection['label'] ); ?><br><small><?php echo esc_html( $connection['created_at'] ); ?></small></td><td><?php echo esc_html( 'oauth' === $connection['auth_type'] ? ( wpagent_companion_oauth_rest_resource() === ( $connection['resource'] ?? '' ) ? __( 'OAuth (CLI)', 'wp-agent-companion' ) : __( 'OAuth (MCP)', 'wp-agent-companion' ) ) : $connection['client'] ); ?></td><td><?php echo esc_html( $connection['user_login'] ); ?></td><td><?php if ( '' !== (string) ( $connection['last_used'] ?? '' ) ) : ?><strong><?php esc_html_e( 'Letzte Nutzung:', 'wp-agent-companion' ); ?></strong> <?php echo esc_html( $connection['last_used'] ); ?><br><?php else : ?><span><?php esc_html_e( 'Noch keine bestätigte Nutzung.', 'wp-agent-companion' ); ?></span><br><?php endif; ?><?php if ( 'oauth' === $connection['auth_type'] && '' !== (string) ( $connection['expires_at'] ?? '' ) ) : ?><small><?php esc_html_e( 'Token gültig bis:', 'wp-agent-companion' ); ?> <?php echo esc_html( $connection['expires_at'] ); ?></small><?php endif; ?></td><td><span class="wpagently-badge <?php echo 'active' === $connection['status'] ? 'wpagently-badge--safe' : 'wpagently-badge--neutral'; ?>"><?php echo esc_html( 'active' === $connection['status'] ? __( 'Aktiv', 'wp-agent-companion' ) : __( 'Widerrufen', 'wp-agent-companion' ) ); ?></span></td><td><?php if ( 'active' === $connection['status'] ) : ?><form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>"><input type="hidden" name="action" value="wpagently_connection_revoke"><input type="hidden" name="connection_id" value="<?php echo esc_attr( $connection['id'] ); ?>"><?php wp_nonce_field( 'wpagent_companion_connection_revoke' ); ?><?php submit_button( __( 'Widerrufen', 'wp-agent-companion' ), 'delete small', 'submit', false ); ?></form><?php endif; ?></td></tr>
			<?php endforeach; ?>
			</tbody></table>
		<?php endif; ?>
		<h2><?php esc_html_e( 'OAuth-Anfragelimits', 'wp-agent-companion' ); ?></h2>
		<p><?php esc_html_e( 'Setzt ausschließlich die laufenden Zeitfenster für öffentliche OAuth-Clientregistrierungen und Device-Codes zurück. Bestehende Clients, Freigaben, Codes, Tokens und Verbindungen bleiben unverändert.', 'wp-agent-companion' ); ?></p>
		<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
			<input type="hidden" name="action" value="wpagently_oauth_rate_reset">
			<?php wp_nonce_field( 'wpagent_companion_oauth_rate_reset' ); ?>
			<?php submit_button( __( 'Öffentliche OAuth-Anfragelimits zurücksetzen', 'wp-agent-companion' ), 'secondary', 'submit', false ); ?>
		</form>
		<h2><?php esc_html_e( 'Bei Deinstallation', 'wp-agent-companion' ); ?></h2>
		<p><?php esc_html_e( 'Standardmäßig widerruft wpagently beim Löschen des Plugins die hier erzeugten Zugänge und entfernt seine gespeicherten Agent-Daten. Entferne den Haken, wenn eine bestimmte Datenart für eine spätere Neuinstallation erhalten bleiben soll.', 'wp-agent-companion' ); ?></p>
		<form method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
			<input type="hidden" name="action" value="wpagently_connection_uninstall_cleanup">
			<?php wp_nonce_field( 'wpagent_companion_connection_uninstall_cleanup' ); ?>
			<label><input type="checkbox" name="uninstall_cleanup[oauth]" value="1" <?php checked( $uninstall_cleanup['oauth'] ); ?>> <?php esc_html_e( 'OAuth-Clients, aktive Tokens und widerrufbare OAuth-Verbindungen beim Löschen entfernen', 'wp-agent-companion' ); ?></label><br>
			<label><input type="checkbox" name="uninstall_cleanup[application_passwords]" value="1" <?php checked( $uninstall_cleanup['application_passwords'] ); ?>> <?php esc_html_e( 'Von wpagently erzeugte Application Passwords beim Löschen widerrufen', 'wp-agent-companion' ); ?></label><br>
			<label><input type="checkbox" name="uninstall_cleanup[skills]" value="1" <?php checked( $uninstall_cleanup['skills'] ); ?>> <?php esc_html_e( 'Eigene Site-Skills beim Löschen entfernen', 'wp-agent-companion' ); ?></label><br>
			<label><input type="checkbox" name="uninstall_cleanup[memory]" value="1" <?php checked( $uninstall_cleanup['memory'] ); ?>> <?php esc_html_e( 'Gespeicherte Agent-Erinnerungen beim Löschen entfernen', 'wp-agent-companion' ); ?></label>
			<p class="description"><?php esc_html_e( 'Abgewählte Zugangsdaten bleiben wirksam, werden aber nicht mehr von wpagently verwaltet. Abgewählte Skills und Erinnerungen bleiben in WordPress gespeichert und stehen nach einer Neuinstallation wieder bereit.', 'wp-agent-companion' ); ?></p>
			<?php submit_button( __( 'Bereinigungseinstellungen speichern', 'wp-agent-companion' ), 'secondary', 'submit', false ); ?>
		</form>
		<form method="post" class="wpagently-form--narrow" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>"><input type="hidden" name="action" value="wpagently_support_report"><?php wp_nonce_field( 'wpagent_companion_support_report' ); ?><?php submit_button( __( 'Supportbericht ohne Zugangsdaten herunterladen', 'wp-agent-companion' ), 'secondary', 'submit', false ); ?></form>
	</div>
	<?php
}
