/** * Shared ambient declarations for every window payload localized by the PHP * side (wp_localize_script / inline bootstrap) and consumed by the React * entries (improvement-plan P2-2.4). * * This file is the ONLY place `interface Window` is augmented — per-entry * `declare global` blocks were removed because their duplicate (and sometimes * conflicting, see `wpApiSettings`) declarations caused TS2687/TS2717 errors. * * The file is ambient (no top-level imports/exports), so every interface * declared here is globally visible without imports. */ interface LlmagnetWooCommerceData { active: boolean; version: string | null; product_count: number; currency: string; currency_symbol: string; } interface LlmagnetPostType { name: string; label: string; } interface LlmagnetImageData { id: number; url: string; preview_url: string; width?: number; height?: number; } interface LlmagnetGeneratorSettings { post_types: string[]; full_content: boolean; days_to_include: number; delete_on_uninstall: boolean; llm_response_images?: Array<{ id: number; position: 'before' | 'after'; }>; /** Old single-image fields kept for backward compatibility. */ llm_response_image_id?: number; llm_response_image_position?: 'before' | 'after'; } interface LlmagnetOnboardingPayload { steps: { first_llm_visit: boolean; llms_txt: boolean; email_reports: boolean; robots_txt: boolean; }; completed: boolean; dismissed: boolean; step_links: { first_llm_visit: string; llms_txt: string; email_reports: string; robots_txt: string; }; step_prompts: { first_llm_visit_primary: string; first_llm_visit_secondary: string; }; site_url: string; } /** Mixpanel bootstrap context echoed by several payloads (lib/mixpanel.ts). */ type LlmagnetAnalyticsContext = import('../lib/mixpanel').AnalyticsData; interface LlmagnetDashboardData { ajaxUrl: string; nonce: string; rootPath: string; lastGenerated: string | null; llmsTxtExists: boolean; llmsTxtUrl: string; llmsTxtSize?: string; postsCount: number; markdownCount: number; imageCount: number; itemsInLlms: number; totalAllPostTypes: number; botVisits30Days: number; botClicks30Days: number; imagesWithoutAlt: Array<{ id: number; url: string; type: string; post_id: number; post_title: string; preview_url: string; }>; settings: LlmagnetGeneratorSettings; postTypes: LlmagnetPostType[]; imageData?: LlmagnetImageData | null; pluginVersion: string; wordpressVersion: string; pluginUrl: string; /** Greeting name for onboarding (first + last, or WP username) */ onboardingUserDisplayName?: string; woocommerce?: LlmagnetWooCommerceData; commerceAvailable?: boolean; onboarding?: LlmagnetOnboardingPayload; analyticsData?: LlmagnetAnalyticsContext; /** Saved overview star rating for the current admin user (1–5, or 0 if unset). */ overviewStarRating?: number; } interface LlmagnetAnalyticsPageData { ajaxUrl: string; nonce: string; apiRoot: string; apiNamespace: string; reportEmail: string; pluginVersion: string; wordpressVersion: string; pluginUrl: string; analyticsData?: LlmagnetAnalyticsContext; } interface LlmagnetPagesData { ajaxUrl: string; nonce: string; pluginUrl: string; analyticsData?: LlmagnetAnalyticsContext; } interface LlmagnetProductsData { ajaxUrl: string; nonce: string; pluginUrl: string; woocommerce?: LlmagnetWooCommerceData; analyticsData?: LlmagnetAnalyticsContext; } interface LlmagnetBotAnalyticsData { ajaxUrl: string; nonce: string; pluginUrl: string; analyticsData?: LlmagnetAnalyticsContext; } interface LlmagnetReportsData { ajaxUrl: string; nonce: string; pluginUrl: string; analyticsData?: LlmagnetAnalyticsContext; proActive?: boolean; proModules?: { email_reports?: boolean; event_alerts?: boolean; }; } interface LlmagnetContentSettingsData { ajaxUrl: string; nonce: string; pluginUrl: string; settings: LlmagnetGeneratorSettings & { include_images?: boolean; llms_txt_custom_intro?: string; llms_txt_show_excerpts?: boolean; llms_txt_excerpt_length?: number; llms_txt_max_per_section?: number; llms_txt_show_prices?: boolean; llms_txt_group_by_type?: boolean; llms_txt_show_author?: boolean; generate_full?: boolean; llms_full_max_posts?: number; }; postTypes: LlmagnetPostType[]; llmsTxtPreview?: string; llmsTxtUrl?: string; wooCommerceActive?: boolean; commerceAvailable?: boolean; llmsFullAvailable?: boolean; exportImagesAvailable?: boolean; llmsFullInfo?: { exists: boolean; size: number; size_formatted: string; post_count: number; warning: number | null; }; robotsTxtStatus?: { has_physical_file: boolean; has_llms_reference: boolean; injection_method: 'filter' | 'file' | 'none'; robots_txt_url: string; }; analyticsData?: LlmagnetAnalyticsContext; } interface LlmagnetSchemaData { ajaxUrl: string; nonce: string; pluginUrl: string; siteName: string; siteUrl: string; siteLogoUrl?: string; analyticsData?: LlmagnetAnalyticsContext; wooCommerceActive: boolean; publishedGraph: Record | null; draftGraph?: Record | null; savedWizard?: Record | null; canFix: boolean; canStoreSchema: boolean; restNamespace: string; elementorActive?: boolean; seoSchemaOwner?: string | null; } interface LlmagnetSystemInfoData { wordpressVersion: string; pluginVersion: string; pluginUrl?: string; rootPath: string; llmsTxtExists: boolean; llmsTxtSize?: string; postsCount: number; markdownCount: number; imageCount: number; lastGenerated: string | null; analyticsData?: LlmagnetAnalyticsContext; } interface LlmagnetMcpData { ajaxUrl: string; nonce: string; pluginUrl: string; siteName: string; analyticsData?: LlmagnetAnalyticsContext; restNamespace: string; } interface LlmagnetAgentReadyData { ajaxUrl: string; nonce: string; pluginUrl: string; siteName: string; analyticsData?: LlmagnetAnalyticsContext; restNamespace: string; } interface LlmagnetElementorData { postId: number; postType: string; restRoot: string; restNamespace: string; restNonce: string; drawerUrl: string; pluginUrl: string; isRtl: boolean; i18n: { buttonLabel: string; scoreLabel: string; noScore: string; unsavedNotice: string; dismiss: string; }; } /** Legacy LLMs.txt settings screen payload (src/App.tsx via main.tsx). */ interface LlmagnetLlmsTxtAdminData { ajaxUrl: string; nonce: string; rootPath: string; lastGenerated: string | null; pluginUrl: string; settings: LlmagnetGeneratorSettings; postTypes: LlmagnetPostType[]; imageData?: LlmagnetImageData | null; analyticsData?: LlmagnetAnalyticsContext; } interface LlmagnetAdminShellData { wpPage: string; globals: Record; /** Direct plugin URL to assets/react-build/js/ (trailing slash). */ assetsBaseUrl?: string; /** wp_page slug => direct entry bundle URL (from PHP). */ pageScripts?: Record; /** Stable shared chunk filenames => direct URLs. */ sharedChunks?: Record; version?: string; } /** * WordPress admin globals we touch: `wp.media` (media library picker) and * `wp.i18n` (translations — consumed via the fallback-safe src/lib/i18n.ts). */ interface LlmagnetWpGlobal { media?: any; i18n?: { __: (text: string, domain?: string) => string; _x: (text: string, context: string, domain?: string) => string; _n: (single: string, plural: string, number: number, domain?: string) => string; _nx: (single: string, plural: string, number: number, context: string, domain?: string) => string; sprintf: (format: string, ...args: Array) => string; isRTL?: () => boolean; setLocaleData?: (data: Record, domain?: string) => void; }; [key: string]: any; } /** `wp` is also reachable as a bare global in wp-admin (image selectors). */ declare var wp: LlmagnetWpGlobal | undefined; /** Sidebar items. Free PHP leaves this unset; a non-empty list replaces the built-in menu. */ interface LlmagnetAdminNavItem { id: string; label: string; slug: string; } /** Optional top-bar badge. Free PHP leaves this unset. */ interface LlmagnetTopBarBadge { label: string; href: string; } /** Optional content-settings controls. Free PHP does not set exportImages. */ interface LlmagnetContentSettingsExtras { exportImages?: boolean; } /** Optional agent-ready toggle list. When set, it replaces the free default toggles. */ interface LlmagnetAgentReadyToggle { key: string; label: string; description: string; implemented?: boolean; } interface Window { /** REST API root + nonce localized by WP core / the plugin enqueue logic. */ wpApiSettings?: { root: string; nonce: string; }; wp?: LlmagnetWpGlobal; /** Chart.js UMD global (loaded for the bot-analytics charts). */ Chart: any; /** Elementor editor global (only inside the Elementor editor). */ elementor?: any; llmagnetAdminShell?: LlmagnetAdminShellData; llmagnetAdminNav?: LlmagnetAdminNavItem[]; llmagnetTopBarBadge?: LlmagnetTopBarBadge; llmagnetContentSettingsExtras?: LlmagnetContentSettingsExtras; llmagnetAgentReadyToggles?: LlmagnetAgentReadyToggle[]; llmagnetDashboardData: LlmagnetDashboardData; llmagnetAnalyticsData: LlmagnetAnalyticsPageData; llmagnetPagesData: LlmagnetPagesData; llmagnetProductsData: LlmagnetProductsData; llmagnetBotAnalyticsData: LlmagnetBotAnalyticsData; llmagnetReportsData: LlmagnetReportsData; llmagnetContentSettingsData: LlmagnetContentSettingsData; llmagnetSchemaData: LlmagnetSchemaData; llmagnetSystemInfoData: LlmagnetSystemInfoData; llmagnetMcpData?: LlmagnetMcpData; llmagnetAgentReadyData?: LlmagnetAgentReadyData; llmagnetElementorData?: LlmagnetElementorData; llmagnetLlmsTxtAdmin: LlmagnetLlmsTxtAdminData; llmagnetWidgetData?: import('../components/wp-dashboard-widget').WidgetData; llmagnetEditorData?: import('../components/editor/editor-data').LlmagnetEditorData; }