| @@ -346,8 +346,16 @@ | ||
| 346 | 346 | : array(); |
| 347 | 347 | $server_file_openers = function_exists( 'openstation_build_file_openers_payload' ) |
| 348 | 348 | ? openstation_build_file_openers_payload() |
| 349 | 349 | : array(); |
| 350 | + // Entries in the menu payload carry dependency handles; their | |
| 351 | + // payloads ride once in `scriptDepPayloads` (GH#892). The file | |
| 352 | + // lists stay whole: no sync module reads them on the client, and | |
| 353 | + // compacting them here was the only write to the map after the | |
| 354 | + // menu payload froze its own, so a refresh could not match it. | |
| 355 | + $script_dep_payloads = isset( $menu_payload['scriptDepPayloads'] ) | |
| 356 | + ? (array) $menu_payload['scriptDepPayloads'] | |
| 357 | + : array(); | |
| 350 | 358 | $user_file_associations = function_exists( 'openstation_get_user_file_associations' ) |
| 351 | 359 | ? openstation_get_user_file_associations( get_current_user_id() ) |
| 352 | 360 | : array(); |
| 353 | 361 | $server_wallpaper_menu_items = function_exists( 'openstation_build_wallpaper_menu_items' ) |
| @@ -561,8 +569,11 @@ | ||
| 561 | 569 | 'serverDesktopThemes' => $server_desktop_themes, |
| 562 | 570 | 'desktopIcons' => $desktop_icons, |
| 563 | 571 | 'serverFileTypes' => $server_file_types, |
| 564 | 572 | 'serverFileOpeners' => $server_file_openers, |
| 573 | + // Handle => dependency payload for every `scriptDeps` list in | |
| 574 | + // this config; see `openstation_compact_script_deps()`. | |
| 575 | + 'scriptDepPayloads' => (object) $script_dep_payloads, | |
| 565 | 576 | 'userFileAssociations' => $user_file_associations, |
| 566 | 577 | 'filesUrl' => esc_url_raw( rest_url( 'desktop-mode/v1/files' ) ), |
| 567 | 578 | // Pinned-notes REST base (`includes/notes/rest.php`). The |
| 568 | 579 | // notes layer boots only when this is present. |
| @@ -721,34 +732,8 @@ | ||
| 721 | 732 | // Site-wide games kill switch (Extended options). Exposed to |
| 722 | 733 | // every user — the shell skips the challenges Heartbeat |
| 723 | 734 | // channel when the framework is off. |
| 724 | 735 | 'gamesEnabled' => openstation_games_enabled(), |
| 725 | - // Comments-window AI moderation toggle — surfaced at the | |
| 726 | - // shell level so the OS Settings → Features tab can render | |
| 727 | - // the toggle without depending on the Comments window | |
| 728 | - // being registered for this user. URL is the same | |
| 729 | - // endpoint the comments-window config exposes; state is | |
| 730 | - // `null` for non-admins (the UI hides the row entirely). | |
| 731 | - 'commentsAiUrl' => esc_url_raw( rest_url( 'desktop-mode/v1/comments/ai-settings' ) ), | |
| 732 | - // Non-null only for admins on a site where the Core AI stack is | |
| 733 | - // present. Comment scoring routes through the AI Client (WP 7.0+), | |
| 734 | - // so on older WordPress the whole row is hidden — same as the | |
| 735 | - // assistant toggle — rather than shown disabled pointing at a | |
| 736 | - // Settings → Connectors screen that doesn't exist there. | |
| 737 | - 'commentsAi' => ( | |
| 738 | - current_user_can( 'manage_options' ) | |
| 739 | - && function_exists( 'openstation_ai_is_available' ) | |
| 740 | - && openstation_ai_is_available() | |
| 741 | - ) | |
| 742 | - ? array( | |
| 743 | - 'enabled' => function_exists( 'openstation_comments_ai_is_enabled' ) | |
| 744 | - ? openstation_comments_ai_is_enabled() | |
| 745 | - : false, | |
| 746 | - 'providerConfigured' => function_exists( 'openstation_comments_ai_provider_configured' ) | |
| 747 | - ? openstation_comments_ai_provider_configured() | |
| 748 | - : false, | |
| 749 | - ) | |
| 750 | - : null, | |
| 751 | 736 | 'currentUserIsAdmin' => current_user_can( 'manage_options' ), |
| 752 | 737 | // Null on single-site installs; its `networkAdmin` null |
| 753 | 738 | // without `manage_network`, which is what keeps the dock |
| 754 | 739 | // tile from registering. |
| @@ -758,8 +743,10 @@ | ||
| 758 | 743 | 'fromPortalIntent' => $from_portal_intent, |
| 759 | 744 | // One-shot like the boot target: a switch from another |
| 760 | 745 | // site's overview lands in this one's. |
| 761 | 746 | 'landInOverview' => openstation_shell_lands_in_overview(), |
| 747 | + 'arrivalDirection' => openstation_shell_arrival_direction(), | |
| 748 | + 'hopLinkOffer' => function_exists( 'openstation_network_link_offer' ) ? openstation_network_link_offer() : null, | |
| 762 | 749 | 'pwa' => array( |
| 763 | 750 | 'manifestUrl' => esc_url_raw( openstation_pwa_manifest_url() ), |
| 764 | 751 | 'swUrl' => esc_url_raw( openstation_pwa_sw_url() ), |
| 765 | 752 | // Extensionless retry target for hosts whose nginx 404s |