Plugin Directory

Changeset 3791563


Ignore:
Timestamp:
11/08/2026 09:55:07 PM (less than one hour ago)
Author:
videowhisper
Message:

Release 1.21.0: preserve reviewed builder content tools, selective definition review and translation publication setup

Location:
videowhisper-site-manager
Files:
14 edited
1 copied

Legend:

Unmodified
Added
Removed
  • videowhisper-site-manager/tags/1.21.0/includes/actions/class-ai-action-registry.php

    r3786440 r3791563  
    131131                unset( $action );
    132132
     133                $actions = VWSM_Tool_Access::reviewed_content_actions( $actions );
    133134                $actions = VWSM_User_Tool_Access::filter_actions( VWSM_Tool_Access::filter_actions( $actions ) );
    134135                return $apply_grants ? VWSM_Relay_Permissions::filter_actions( VWSM_Native_Abilities::filter_actions( VWSM_Tool_Grants::filter_actions( $actions ) ) ) : $actions;
  • videowhisper-site-manager/tags/1.21.0/includes/admin/class-vwsm-quick-setup.php

    r3789255 r3791563  
    220220                        )
    221221                ) . '">' . esc_html__( 'Native Abilities and connection approvals', 'videowhisper-site-manager' ) . '</a></p>';
     222                if ( class_exists( 'VWML_Settings' ) ) {
     223                        echo '<p><a href="' . esc_url( admin_url( 'admin.php?page=vwml-settings#vwml-integrations' ) ) . '">' . esc_html__( 'Enable Translator drafting and publication', 'videowhisper-site-manager' ) . '</a> — ' . esc_html__( 'Translation also requires these two Translator integration switches. Develop includes supported administrator tools after review; it retains personal exclusions and explicit connection restrictions.', 'videowhisper-site-manager' ) . '</p>'; }
    222224                echo '<p><a href="' . esc_url( VWSM_Admin_Guide::help_url( 'permissions' ) ) . '">' . esc_html__( 'Optional features and integration setup', 'videowhisper-site-manager' ) . '</a></p></details>';
    223225        }
  • videowhisper-site-manager/tags/1.21.0/includes/class-vwsm-tool-access.php

    r3786440 r3791563  
    3333                add_action( 'admin_bar_menu', array( __CLASS__, 'toolbar' ), 96 );
    3434                add_action( 'admin_post_vwsm_tool_access_prepare', array( __CLASS__, 'prepare_post' ) );
     35                add_action( 'admin_post_vwsm_tool_access_selected', array( __CLASS__, 'selected_post' ) );
    3536                add_action( 'admin_post_vwsm_tool_access_apply', array( __CLASS__, 'apply_post' ) );
    3637                add_action( 'vwsm_settings_form_content_rows', array( __CLASS__, 'settings_link' ) );
    … …  
    6566                $fields['feature_contract'] = self::feature_signature();
    6667                return self::digest( $fields );
     68        }
     69        /** Native review records the content ceiling, including admin-only registrations. */
     70        private static function content_contracts( $names, $catalog ) {
     71                $out = array();
     72                foreach ( $names as $name ) {
     73                        $a = $catalog[ $name ] ?? array();
     74                        $domain = $a['permission_context']['content_domain'] ?? null;
     75                        if ( ! is_array( $domain ) ) { continue; }
     76                        $enums = array();
     77                        $properties = (array) ( $a['inputSchema']['properties'] ?? array() );
     78                        foreach ( array( 'type', 'post_type', 'taxonomy' ) as $field ) {
     79                                $property = (array) ( $properties[ $field ] ?? array() );
     80                                $values = $property['enum'] ?? null;
     81                                if ( is_array( $values ) ) { $enums[ $field ] = $values; }
     82                        }
     83                        $out[ $name ] = array( 'domain' => $domain, 'enums' => $enums );
     84                }
     85                return $out;
     86        }
     87        /**
     88         * A runtime may omit builder types registered only in wp-admin. Keep the
     89         * reviewed declaration when runtime scope is a subset; services still enforce
     90         * actual enabled types. Any added type/taxonomy or other contract change fails
     91         * the normal fingerprint check. Existing policies gain nothing on upgrade.
     92         */
     93        public static function reviewed_content_actions( $actions ) {
     94                if ( self::$preview ) { return $actions; }
     95                $p = self::selection();
     96                $contracts = $p['content_contracts'] ?? array();
     97                if ( $p['legacy'] || ! is_array( $contracts ) ) { return $actions; }
     98                foreach ( $actions as $name => $a ) {
     99                        $saved = $contracts[ $name ] ?? null;
     100                        $domain = $a['permission_context']['content_domain'] ?? null;
     101                        if ( ! is_array( $saved ) || ! self::valid_content_domain( $saved['domain'] ?? null ) || ! is_array( $saved['enums'] ?? null ) || ! self::valid_content_domain( $domain ) ) { continue; }
     102                        $subset = true;
     103                        foreach ( $domain as $type => $taxonomies ) {
     104                                if ( ! is_array( $taxonomies ) || ! isset( $saved['domain'][ $type ] ) || ! is_array( $saved['domain'][ $type ] ) || array_diff( $taxonomies, $saved['domain'][ $type ] ) ) { $subset = false; break; }
     105                        }
     106                        $next = $a;
     107                        foreach ( $saved['enums'] as $field => $values ) {
     108                                $current = $a['inputSchema']['properties'][ $field ]['enum'] ?? null;
     109                                if ( ! in_array( $field, array( 'type', 'post_type', 'taxonomy' ), true ) || ! is_array( $values ) || count( array_filter( $values, 'is_string' ) ) !== count( $values ) || ! is_array( $current ) || count( array_filter( $current, 'is_string' ) ) !== count( $current ) || array_diff( $current, $values ) ) { $subset = false; break; }
     110                                $next['inputSchema']['properties'][ $field ]['enum'] = $values;
     111                        }
     112                        if ( $subset ) {
     113                                $next['permission_context']['content_domain'] = $saved['domain'];
     114                                // The stored exact fingerprint authenticates the entire projected contract.
     115                                if ( isset( $p['tools'][ $name ] ) && is_string( $p['tools'][ $name ] ) && hash_equals( $p['tools'][ $name ], self::fingerprint( $next ) ) ) { $actions[ $name ] = $next; }
     116                        }
     117                }
     118                return $actions;
     119        }
     120        private static function valid_content_domain( $domain ) {
     121                if ( ! is_array( $domain ) || count( $domain ) > 1000 ) { return false; }
     122                foreach ( $domain as $type => $taxonomies ) {
     123                        if ( ! is_string( $type ) || ! is_array( $taxonomies ) || count( $taxonomies ) > 1000 || count( array_filter( $taxonomies, 'is_string' ) ) !== count( $taxonomies ) ) { return false; }
     124                }
     125                return true;
    67126        }
    68127        /** Missing policy preserves upgrades; malformed configured policy is closed. */
    … …  
    380439                }
    381440                return $response;
     441        }
     442        /** Selected contract updates retain every unselected fingerprint and policy constraint. */
     443        public static function prepare_selected( $group, $names ) {
     444                if ( ! self::native() || ! in_array( $group, array( 'admins', 'others' ), true ) || ! is_array( $names ) || ! $names || count( $names ) > 100 || count( array_filter( $names, 'is_string' ) ) !== count( $names ) ) {
     445                        return self::error( __( 'Choose supported tools in a native administrator session.', 'videowhisper-site-manager' ) ); }
     446                $prior   = self::policy();
     447                $p       = self::selection( $group );
     448                $catalog = self::supported();
     449                if ( ! is_array( $prior ) || ! isset( $prior['groups'][ $group ] ) || $p['legacy'] || 'disabled' === $p['mode'] ) {
     450                        return self::error( __( 'Review a role preset before updating individual tool definitions.', 'videowhisper-site-manager' ) ); }
     451                $groups = $prior['groups'];
     452                foreach ( array_unique( $names ) as $name ) {
     453                        if ( ! isset( $catalog[ $name ] ) || ! self::selected_allowed( $p, $group, $name, $catalog[ $name ] ) ) {
     454                                return self::error( __( 'A selected definition exceeds the current role constraints. Review the role policy separately.', 'videowhisper-site-manager' ) ); }
     455                        $groups[ $group ]['tools'][ $name ] = self::fingerprint( $catalog[ $name ] );
     456                }
     457                if ( count( $groups[ $group ]['tools'] ) > VWSM_Tool_Grants::MAX_TOOLS ) {
     458                        return self::error( __( 'Invalid tool selection.', 'videowhisper-site-manager' ) ); }
     459                ksort( $groups[ $group ]['tools'] );
     460                $groups[ $group ]['content_contracts'] = array_merge( is_array( $p['content_contracts'] ?? null ) ? $p['content_contracts'] : array(), self::content_contracts( $names, $catalog ) );
     461                $id = wp_generate_uuid4();
     462                $r  = array(
     463                        'id' => $id, 'operator' => get_current_user_id(), 'blog' => get_current_blog_id(),
     464                        'session' => self::digest( wp_get_session_token() ), 'expires' => time() + 600,
     465                        'prior' => self::digest( $prior ),
     466                        'settings' => self::digest( array( get_option( 'vwsm_settings', array() ), get_option( 'vwsm_permission_epoch', '' ) ) ),
     467                        'catalog' => self::digest( $catalog ), 'groups' => $groups,
     468                        'relay_review_required' => self::relay_review_required(),
     469                        'selected_updates' => array( $group => array_values( array_unique( $names ) ) ),
     470                );
     471                set_transient( 'vwsm_tool_review_' . $id, $r, 600 );
     472                return $r;
     473        }
     474        private static function selected_allowed( $p, $group, $name, $action ) {
     475                if ( $p['legacy'] || 'disabled' === $p['mode'] || ( 'custom' !== $p['mode'] && ! self::mode_allows( $p['mode'], $name, $action, $group ) ) || ( $p['draft_only'] && ! self::mode_allows( 'drafts', $name, $action, $group ) ) ) {
     476                        return false; }
     477                $risk = self::risk( $name, $action );
     478                return ! ( ( 'others' === $group && ( 'mcp:admin' === $action['required_scope'] || ( ! $action['read_only'] && 'safe' !== $risk ) ) ) || ( 'developer' === $risk && 'developer' !== $p['level'] ) || ( 'power' === $risk && 'safe' === $p['level'] ) );
    382479        }
    383480        /** Exact native review; raw settings digest detects concurrent configuration changes. */
    … …  
    438535                                'tools'      => $tools,
    439536                                'features'   => 'disabled' !== $mode,
     537                                'content_contracts' => self::content_contracts( $names, $catalog ),
    440538                        );
    441539                }
    … …  
    513611                echo '<tr><th>' . esc_html__( 'Tool access', 'videowhisper-site-manager' ) . '</th><td><a href="' . esc_url( self::url() ) . '">' . esc_html__( 'Review role presets and individual tools', 'videowhisper-site-manager' ) . '</a><p class="description">' . esc_html__( 'Reviewed role presets may enable API feature switches for that group. Site Read Only, publication controls, connection approvals and WordPress permissions still apply.', 'videowhisper-site-manager' ) . '</p></td></tr>'; }
    514612        public static function prepare_post() {
     613                self::require_post();
    515614                check_admin_referer( 'vwsm_tool_access_prepare' );
    516615                $modes    = isset( $_POST['modes'] ) && is_array( $_POST['modes'] ) ? wp_unslash( $_POST['modes'] ) : null;
    … …  
    532631        }
    533632        public static function apply_post() {
     633                self::require_post();
    534634                check_admin_referer( 'vwsm_tool_access_apply' );
    535635                $id = isset( $_POST['review'] ) && is_string( $_POST['review'] ) ? wp_unslash( $_POST['review'] ) : '';
    … …  
    541641                wp_safe_redirect( self::url( array( 'saved' => 1 ) ) );
    542642                exit;
     643        }
     644        private static function require_post() {
     645                if ( 'POST' !== ( $_SERVER['REQUEST_METHOD'] ?? '' ) ) {
     646                        wp_die( esc_html__( 'Use the reviewed POST form for this action.', 'videowhisper-site-manager' ), '', array( 'response' => 405 ) ); }
     647        }
     648        public static function selected_post() {
     649                self::require_post();
     650                check_admin_referer( 'vwsm_tool_access_selected' );
     651                $group = isset( $_POST['group'] ) && is_string( $_POST['group'] ) ? wp_unslash( $_POST['group'] ) : '';
     652                $names = isset( $_POST['selected_definitions'] ) && is_array( $_POST['selected_definitions'] ) ? wp_unslash( $_POST['selected_definitions'] ) : array();
     653                $r = self::prepare_selected( $group, $names );
     654                if ( is_wp_error( $r ) ) {
     655                        wp_die( esc_html( $r->get_error_message() ), '', array( 'response' => 409 ) ); }
     656                wp_safe_redirect( self::url( array( 'review' => $r['id'] ) ) );
     657                exit;
     658        }
     659        private static function selected_form() {
     660                $catalog = self::supported();
     661                echo '<details id="vwsm-selected-definitions"><summary>' . esc_html__( 'Review selected new or changed definitions', 'videowhisper-site-manager' ) . '</summary><p>' . esc_html__( 'Update only the checked definitions. Keep the current preset, draft limits, other role groups, unselected fingerprints, personal restrictions and connection/package approvals. Unselected stale tools remain unavailable.', 'videowhisper-site-manager' ) . '</p>';
     662                foreach ( array( 'admins', 'others' ) as $group ) {
     663                        $p = self::selection( $group );
     664                        $candidates = array_filter( $catalog, static function ( $a, $name ) use ( $p, $group ) {
     665                                return self::selected_allowed( $p, $group, $name, $a ) && ( ! isset( $p['tools'][ $name ] ) || ! hash_equals( $p['tools'][ $name ], self::fingerprint( $a ) ) );
     666                        }, ARRAY_FILTER_USE_BOTH );
     667                        if ( ! $candidates ) {
     668                                continue; }
     669                        echo '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '"><input type="hidden" name="action" value="vwsm_tool_access_selected"><input type="hidden" name="group" value="' . esc_attr( $group ) . '"><h3>' . esc_html( 'admins' === $group ? __( 'Admins', 'videowhisper-site-manager' ) : __( 'Other Roles', 'videowhisper-site-manager' ) ) . '</h3>';
     670                        wp_nonce_field( 'vwsm_tool_access_selected' );
     671                        foreach ( $candidates as $name => $a ) {
     672                                echo '<p><label><input type="checkbox" name="selected_definitions[]" value="' . esc_attr( $name ) . '"> <code>' . esc_html( $name ) . '</code> — ' . esc_html( wp_html_excerpt( wp_strip_all_tags( $a['description'] ), 180 ) ) . '</label></p>'; }
     673                        submit_button( __( 'Review selected definitions', 'videowhisper-site-manager' ), 'secondary' );
     674                        echo '</form>';
     675                }
     676                echo '</details>';
    543677        }
    544678        /** Quick selector is also used on Activate; forms never nest. */
    … …  
    634768                        echo '<div class="notice notice-error"><p>' . esc_html__( 'The review expired. Prepare it again.', 'videowhisper-site-manager' ) . '</p></div>'; }
    635769                if ( $r ) {
     770                        if ( isset( $r['selected_updates'] ) ) {
     771                                echo '<p><strong>' . esc_html__( 'Only these tool definitions will change:', 'videowhisper-site-manager' ) . '</strong> <code>' . esc_html( implode( ', ', array_merge( ...array_values( $r['selected_updates'] ) ) ) ) . '</code></p><p>' . esc_html__( 'All other role constraints and unselected fingerprints are retained.', 'videowhisper-site-manager' ) . '</p>'; }
    636772                        echo '<p><strong>' . esc_html__( 'Relay approval mode', 'videowhisper-site-manager' ) . '</strong>: ' . esc_html( $r['relay_review_required'] ? __( 'Require an administrator review for each account and relay client.', 'videowhisper-site-manager' ) : __( 'Use reviewed role presets; no extra per-client admin step. Custom, Read Only, Safe Drafts and revoked policies stay restrictive. Existing Full policies, including partial Full selections, will follow the current reviewed role preset.', 'videowhisper-site-manager' ) ) . '</p>';
    637773                        echo '<h2>' . esc_html__( 'Review role access', 'videowhisper-site-manager' ) . '</h2><table class="widefat striped"><thead><tr><th>' . esc_html__( 'Group', 'videowhisper-site-manager' ) . '</th><th>' . esc_html__( 'Current → proposed', 'videowhisper-site-manager' ) . '</th><th>' . esc_html__( 'Tools and constraints', 'videowhisper-site-manager' ) . '</th></tr></thead><tbody>';
    … …  
    647783                if ( isset( $_GET['saved'] ) ) {
    648784                        echo '<div class="notice notice-success"><p>' . esc_html__( 'Tool access saved. Existing client records and package allowlists were retained; the reviewed relay approval mode now applies.', 'videowhisper-site-manager' ) . '</p></div>'; }
     785                $stale = false;
     786                foreach ( self::supported() as $name => $a ) {
     787                        foreach ( array( 'admins', 'others' ) as $group ) {
     788                                $p = self::selection( $group );
     789                                if ( isset( $p['tools'][ $name ] ) && ! hash_equals( $p['tools'][ $name ], self::fingerprint( $a ) ) ) {
     790                                        $stale = true; }
     791                        }
     792                }
     793                if ( $stale ) {
     794                        echo '<div class="notice notice-warning"><p>' . esc_html__( 'Some selected definitions changed and are unavailable. Review only the needed definitions below to retain unrelated permissions.', 'videowhisper-site-manager' ) . ' <a href="#vwsm-selected-definitions">' . esc_html__( 'Review changed definitions', 'videowhisper-site-manager' ) . '</a></p></div>'; }
    649795                self::quick( true );
     796                self::selected_form();
    650797                echo '<details style="margin-top:24px"><summary>' . esc_html__( 'How presets and approvals work', 'videowhisper-site-manager' ) . '</summary><p>' . esc_html__( 'Disabled blocks Site Manager tools. Read exposes reads. Draft allows unpublished content and private review proposals. Write adds routine edits, taxonomy changes, recoverable trash and own-action rollback when a snapshot exists. Admin adds routine site administration; Develop adds high-risk code and package operations. Admin and Develop are admin-only. Custom retains draft protection and requires review for each new or changed tool. WordPress core REST access from an Application Password is outside this plugin policy.', 'videowhisper-site-manager' ) . '</p><p>' . esc_html__( 'This table lists supported metadata for installed integrations. A checked tool is an availability ceiling, not proof that the current connection can execute it. Native Abilities, relay consent, account plans, object capabilities and package allowlists may narrow it further. No arbitrary code executor is provided.', 'videowhisper-site-manager' ) . '</p>';
    651798                do_action( 'vwsm_tool_access_help' );
  • videowhisper-site-manager/tags/1.21.0/includes/class-vwsm-translation-tools.php

    r3791171 r3791563  
    133133        public static function can_publish() {
    134134                return ! VWSM_Tool_Grants::is_safe_drafts() && VWSM_Tool_Access::publication_enabled() && ! empty( VWSM_Access_Control::get_settings()['allow_publish'] ); }
     135        /** Explain configuration separately from per-object publication readiness. */
     136        public static function publication_readiness() {
     137                $translator = ( new VWML_Settings() )->get();
     138                $site = VWSM_Access_Control::get_settings();
     139                $admin = current_user_can( 'manage_options' );
     140                $tools = VWSM_AI_Action_Registry::get_actions();
     141                $checks = array(
     142                        'integration_drafting' => ! empty( $translator['integration_enabled'] ),
     143                        'integration_publication' => ! empty( $translator['integration_publish'] ),
     144                        'site_editing' => empty( $site['read_only'] ),
     145                        'site_publication' => ! empty( $site['allow_publish'] ),
     146                        'permission_mode_publication' => self::can_publish(),
     147                        'publish_tool_approved' => isset( $tools['translation_publish'] ) || isset( $tools['translation_admin_publish'] ),
     148                );
     149                return array(
     150                        'configuration_ready' => ! in_array( false, $checks, true ),
     151                        'checks' => $checks,
     152                        'translator_settings_url' => $admin ? admin_url( 'admin.php?page=vwml-settings#vwml-integrations' ) : '',
     153                        'site_setup_url' => $admin ? VWSM_Onboarding_Approvals::url( array( 'activation_section' => 'finish' ) ) : '',
     154                        'tool_access_url' => $admin ? VWSM_Tool_Access::url() : '',
     155                        'guidance' => __( 'An administrator enables integration drafting and publication in Translator Settings, then allows editing and direct publishing in Site Manager Quick setup and reviews the role tools. Develop includes supported administrator tools after review; explicit client restrictions and personal exclusions remain in force. Ask the administrator to review the current connection if its publish tool is missing. Each translation still needs an editable original, a complete current draft and resolved protection review.', 'videowhisper-site-manager' ),
     156                );
     157        }
    135158        /**
    136159         * Declare versioned tools only when the owning integration is available.
    … …  
    305328                                        'integration_enabled'      => VWML_API::enabled(),
    306329                                        'publication_enabled'      => ! empty( ( new VWML_Settings() )->get()['integration_publish'] ) && self::can_publish(),
     330                                        'publication_readiness'    => self::publication_readiness(),
    307331                                        'administration_available' => VWML_API::admin(),
    308332                                        'setup_url'                => current_user_can( 'manage_options' ) ? admin_url( 'admin.php?page=vwml-settings#vwml-integrations' ) : '',
    … …  
    327351                                return self::with_editorial_action( $action, 'route_propose', static fn() => method_exists( 'VWML_API', 'propose_route' ) ? VWML_API::propose_route( $args['post_id'], $args['locale'], $args['path'], $args['version'], $args['source_hash'] ) : VWML_API::error() );
    328352                        case 'translation_publish':
    329                                 return self::with_editorial_action( $action, 'publish', static fn() => self::can_publish() ? VWML_API::publish( $args['post_id'], $args['locale'], $args['source_hash'], $args['version'], false, true ) : VWML_API::error() );
     353                                return self::with_editorial_action( $action, 'publish', static fn() => self::can_publish() ? VWML_API::publish( $args['post_id'], $args['locale'], $args['source_hash'], $args['version'], false, true ) : new WP_Error( 'vwsm_translation_publication_setup', __( 'Translation publication is disabled by a current permission or setting. Ask an administrator to review the publication readiness checklist.', 'videowhisper-site-manager' ), array( 'status' => 403, 'publication_readiness' => self::publication_readiness() ) ) );
    330354                }
    331355                return VWML_API::error();
  • videowhisper-site-manager/tags/1.21.0/languages/videowhisper-site-manager.pot

    r3791171 r3791563  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: VideoWhisper Site Manager for ChatGPT, Claude, Codex, Grok 1.20.0\n"
     5"Project-Id-Version: VideoWhisper Site Manager for ChatGPT, Claude, Codex, Grok 1.21.0\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/videowhisper-site-manager\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    … …  
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2026-11-08T12:06:44+00:00\n"
     12"POT-Creation-Date: 2026-11-08T20:50:15+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.12.0\n"
    … …  
    4040msgstr ""
    4141
    42 #: includes/actions/class-ai-action-registry.php:141
     42#: includes/actions/class-ai-action-registry.php:142
    4343msgid "The tool must match the route."
    4444msgstr ""
    4545
    46 #: includes/actions/class-ai-action-registry.php:145
     46#: includes/actions/class-ai-action-registry.php:146
    4747#: includes/class-access-control.php:212
    4848#: includes/mcp/class-mcp-server.php:560
    … …  
    5050msgstr ""
    5151
    52 #: includes/actions/class-ai-action-registry.php:148
     52#: includes/actions/class-ai-action-registry.php:149
    5353msgid "The action does not belong to this route."
    5454msgstr ""
    … …  
    530530#: includes/admin/class-vwsm-quick-setup.php:135
    531531#: includes/admin/class-vwsm-quick-setup.php:158
    532 #: includes/class-vwsm-tool-access.php:629
     532#: includes/class-vwsm-tool-access.php:763
    533533#: includes/services/class-vwsm-editorial-workflow.php:308
    534534msgid "Native administrator access is required."
    … …  
    12231223#. translators: %1$s: tool identifier, %2$s: capability group label.
    12241224#: includes/admin/class-vwsm-quick-setup.php:195
    1225 #: includes/admin/class-vwsm-quick-setup.php:235
     1225#: includes/admin/class-vwsm-quick-setup.php:237
    12261226#: includes/class-vwsm-relay-review.php:388
    1227 #: includes/class-vwsm-tool-access.php:557
    1228 #: includes/class-vwsm-tool-access.php:586
    1229 #: includes/class-vwsm-tool-access.php:592
    1230 #: includes/class-vwsm-tool-access.php:619
    1231 #: includes/class-vwsm-tool-access.php:639
     1227#: includes/class-vwsm-tool-access.php:669
     1228#: includes/class-vwsm-tool-access.php:691
     1229#: includes/class-vwsm-tool-access.php:720
     1230#: includes/class-vwsm-tool-access.php:726
     1231#: includes/class-vwsm-tool-access.php:753
     1232#: includes/class-vwsm-tool-access.php:775
    12321233msgid "Admins"
    12331234msgstr ""
    … …  
    12361237#. translators: %1$s: tool identifier, %2$s: capability group label.
    12371238#: includes/admin/class-vwsm-quick-setup.php:196
    1238 #: includes/admin/class-vwsm-quick-setup.php:235
     1239#: includes/admin/class-vwsm-quick-setup.php:237
    12391240#: includes/class-vwsm-relay-review.php:388
    1240 #: includes/class-vwsm-tool-access.php:558
    1241 #: includes/class-vwsm-tool-access.php:586
    1242 #: includes/class-vwsm-tool-access.php:592
    1243 #: includes/class-vwsm-tool-access.php:619
    1244 #: includes/class-vwsm-tool-access.php:639
     1241#: includes/class-vwsm-tool-access.php:669
     1242#: includes/class-vwsm-tool-access.php:692
     1243#: includes/class-vwsm-tool-access.php:720
     1244#: includes/class-vwsm-tool-access.php:726
     1245#: includes/class-vwsm-tool-access.php:753
     1246#: includes/class-vwsm-tool-access.php:775
    12451247msgid "Other Roles"
    12461248msgstr ""
    … …  
    12671269
    12681270#: includes/admin/class-vwsm-quick-setup.php:210
    1269 #: includes/class-vwsm-tool-access.php:570
     1271#: includes/class-vwsm-tool-access.php:704
    12701272msgid "Require an extra administrator review for each relay client"
    12711273msgstr ""
    … …  
    12841286
    12851287#: includes/admin/class-vwsm-quick-setup.php:213
    1286 #: includes/admin/class-vwsm-quick-setup.php:231
     1288#: includes/admin/class-vwsm-quick-setup.php:233
    12871289msgid "Review activation"
    12881290msgstr ""
    … …  
    13001302msgstr ""
    13011303
    1302 #: includes/admin/class-vwsm-quick-setup.php:222
     1304#: includes/admin/class-vwsm-quick-setup.php:223
     1305msgid "Enable Translator drafting and publication"
     1306msgstr ""
     1307
     1308#: includes/admin/class-vwsm-quick-setup.php:223
     1309msgid "Translation also requires these two Translator integration switches. Develop includes supported administrator tools after review; it retains personal exclusions and explicit connection restrictions."
     1310msgstr ""
     1311
     1312#: includes/admin/class-vwsm-quick-setup.php:224
    13031313msgid "Optional features and integration setup"
    13041314msgstr ""
    13051315
    1306 #: includes/admin/class-vwsm-quick-setup.php:231
     1316#: includes/admin/class-vwsm-quick-setup.php:233
    13071317msgid "Setting"
    13081318msgstr ""
    13091319
    1310 #: includes/admin/class-vwsm-quick-setup.php:231
    1311 #: includes/class-vwsm-tool-access.php:637
     1320#: includes/admin/class-vwsm-quick-setup.php:233
     1321#: includes/class-vwsm-tool-access.php:773
    13121322msgid "Current → proposed"
    13131323msgstr ""
    13141324
    13151325#. translators: 1: Current mode, 2: Proposed mode, 3: Number of tools.
    1316 #: includes/admin/class-vwsm-quick-setup.php:235
     1326#: includes/admin/class-vwsm-quick-setup.php:237
    13171327#, php-format
    13181328msgid "%1$s → %2$s · Selected tools: %3$d"
    … …  
    13201330
    13211331#. translators: 1: Current mode, 2: Proposed mode, 3: Number of tools.
    1322 #: includes/admin/class-vwsm-quick-setup.php:235
     1332#: includes/admin/class-vwsm-quick-setup.php:237
    13231333msgid "Existing settings"
    13241334msgstr ""
    13251335
    13261336#. translators: 1: Current mode, 2: Proposed mode, 3: Number of tools.
    1327 #: includes/admin/class-vwsm-quick-setup.php:235
     1337#: includes/admin/class-vwsm-quick-setup.php:237
    13281338msgid "Exact tools"
    13291339msgstr ""
    13301340
    1331 #: includes/admin/class-vwsm-quick-setup.php:237
     1341#: includes/admin/class-vwsm-quick-setup.php:239
    13321342msgid "Allowed roles"
    13331343msgstr ""
    13341344
    1335 #: includes/admin/class-vwsm-quick-setup.php:237
     1345#: includes/admin/class-vwsm-quick-setup.php:239
    13361346msgid "AI/SI editing"
    13371347msgstr ""
    13381348
    1339 #: includes/admin/class-vwsm-quick-setup.php:237
     1349#: includes/admin/class-vwsm-quick-setup.php:239
    13401350msgid "Direct publishing"
    13411351msgstr ""
    13421352
    1343 #: includes/admin/class-vwsm-quick-setup.php:237
     1353#: includes/admin/class-vwsm-quick-setup.php:239
    13441354msgid "Extra relay-client admin review"
    13451355msgstr ""
    13461356
    1347 #: includes/admin/class-vwsm-quick-setup.php:239
    1348 #: includes/admin/class-vwsm-quick-setup.php:240
     1357#: includes/admin/class-vwsm-quick-setup.php:241
     1358#: includes/admin/class-vwsm-quick-setup.php:242
    13491359msgid "On"
    13501360msgstr ""
    13511361
    1352 #: includes/admin/class-vwsm-quick-setup.php:239
    1353 #: includes/admin/class-vwsm-quick-setup.php:240
     1362#: includes/admin/class-vwsm-quick-setup.php:241
     1363#: includes/admin/class-vwsm-quick-setup.php:242
    13541364msgid "Off"
    13551365msgstr ""
    13561366
    1357 #: includes/admin/class-vwsm-quick-setup.php:244
     1367#: includes/admin/class-vwsm-quick-setup.php:246
    13581368msgid "Preset-based relay access"
    13591369msgstr ""
    13601370
    1361 #: includes/admin/class-vwsm-quick-setup.php:244
     1371#: includes/admin/class-vwsm-quick-setup.php:246
    13621372msgid "Existing Full client policies will follow the reviewed role preset, including Full policies with a previously partial tool selection. Custom, Read Only, Safe Drafts and revoked client policies remain restrictive. Personal exclusions are retained."
    13631373msgstr ""
    13641374
    1365 #: includes/admin/class-vwsm-quick-setup.php:245
     1375#: includes/admin/class-vwsm-quick-setup.php:247
    13661376msgid "These changes affect site/role availability. Client scopes, explicit restricted or revoked grants, personal exclusions, native Abilities and exact package approvals remain separate. No credential or customer record is changed."
    13671377msgstr ""
    13681378
    1369 #: includes/admin/class-vwsm-quick-setup.php:247
     1379#: includes/admin/class-vwsm-quick-setup.php:249
    13701380msgid "I reviewed these exact site and role changes."
    13711381msgstr ""
    13721382
    1373 #: includes/admin/class-vwsm-quick-setup.php:248
     1383#: includes/admin/class-vwsm-quick-setup.php:250
    13741384msgid "Activate and continue"
    13751385msgstr ""
    13761386
    1377 #: includes/admin/class-vwsm-quick-setup.php:249
     1387#: includes/admin/class-vwsm-quick-setup.php:251
    13781388msgid "Back to setup"
    13791389msgstr ""
    … …  
    24882498#: includes/admin/views/native-abilities-page.php:70
    24892499#: includes/class-vwsm-local-oauth.php:940
    2490 #: includes/class-vwsm-tool-access.php:46
    2491 #: includes/class-vwsm-tool-access.php:606
     2500#: includes/class-vwsm-tool-access.php:47
     2501#: includes/class-vwsm-tool-access.php:740
    24922502msgid "Read"
    24932503msgstr ""
    … …  
    53515361#: includes/class-vwsm-local-oauth.php:539
    53525362#: includes/class-vwsm-local-oauth.php:918
    5353 #: includes/class-vwsm-tool-access.php:51
     5363#: includes/class-vwsm-tool-access.php:52
    53545364#: includes/class-vwsm-user-tool-access.php:32
    53555365msgid "Custom"
    … …  
    54995509#: includes/class-vwsm-local-oauth.php:940
    55005510#: includes/class-vwsm-relay-review.php:61
    5501 #: includes/class-vwsm-tool-access.php:48
     5511#: includes/class-vwsm-tool-access.php:49
    55025512msgid "Write"
    55035513msgstr ""
    … …  
    56545664
    56555665#: includes/class-vwsm-native-abilities.php:484
    5656 #: includes/class-vwsm-tool-access.php:652
     5666#: includes/class-vwsm-tool-access.php:799
    56575667msgid "Native Abilities"
    56585668msgstr ""
    … …  
    57245734#: includes/class-vwsm-relay-review.php:16
    57255735#: includes/class-vwsm-relay-review.php:60
    5726 #: includes/class-vwsm-tool-access.php:47
     5736#: includes/class-vwsm-tool-access.php:48
    57275737#: includes/class-vwsm-user-tool-access.php:24
    57285738msgid "Draft"
    … …  
    57475757#: includes/class-vwsm-relay-review.php:28
    57485758#: includes/class-vwsm-relay-review.php:36
    5749 #: includes/class-vwsm-tool-access.php:386
     5759#: includes/class-vwsm-tool-access.php:483
    57505760msgid "Native administrator review is required."
    57515761msgstr ""
    … …  
    57735783
    57745784#: includes/class-vwsm-relay-review.php:58
    5775 #: includes/class-vwsm-tool-access.php:45
     5785#: includes/class-vwsm-tool-access.php:46
    57765786#: includes/class-vwsm-user-tool-access.php:22
    57775787msgid "Disabled"
    … …  
    57795789
    57805790#: includes/class-vwsm-relay-review.php:64
    5781 #: includes/class-vwsm-tool-access.php:49
     5791#: includes/class-vwsm-tool-access.php:50
    57825792#: includes/class-vwsm-user-tool-access.php:29
    57835793msgid "Admin"
    … …  
    57855795
    57865796#: includes/class-vwsm-relay-review.php:65
    5787 #: includes/class-vwsm-tool-access.php:50
    5788 #: includes/class-vwsm-tool-access.php:609
     5797#: includes/class-vwsm-tool-access.php:51
     5798#: includes/class-vwsm-tool-access.php:743
    57895799#: includes/class-vwsm-user-tool-access.php:30
    57905800msgid "Develop"
    … …  
    60326042msgstr ""
    60336043
    6034 #: includes/class-vwsm-tool-access.php:371
     6044#: includes/class-vwsm-tool-access.php:430
    60356045msgid "This tool is disabled by the site Tool access policy. Ask an administrator to review Tool access."
    60366046msgstr ""
    60376047
    6038 #: includes/class-vwsm-tool-access.php:388
     6048#: includes/class-vwsm-tool-access.php:445
     6049msgid "Choose supported tools in a native administrator session."
     6050msgstr ""
     6051
     6052#: includes/class-vwsm-tool-access.php:450
     6053msgid "Review a role preset before updating individual tool definitions."
     6054msgstr ""
     6055
     6056#: includes/class-vwsm-tool-access.php:454
     6057msgid "A selected definition exceeds the current role constraints. Review the role policy separately."
     6058msgstr ""
     6059
     6060#: includes/class-vwsm-tool-access.php:458
     6061#: includes/class-vwsm-tool-access.php:517
     6062msgid "Invalid tool selection."
     6063msgstr ""
     6064
     6065#: includes/class-vwsm-tool-access.php:485
    60396066msgid "Invalid relay review mode."
    60406067msgstr ""
    60416068
    6042 #: includes/class-vwsm-tool-access.php:397
     6069#: includes/class-vwsm-tool-access.php:494
    60436070msgid "Invalid feature selection."
    60446071msgstr ""
    60456072
    6046 #: includes/class-vwsm-tool-access.php:404
     6073#: includes/class-vwsm-tool-access.php:501
    60476074msgid "Choose a supported mode for each group."
    60486075msgstr ""
    60496076
    6050 #: includes/class-vwsm-tool-access.php:420
    6051 msgid "Invalid tool selection."
    6052 msgstr ""
    6053 
    6054 #: includes/class-vwsm-tool-access.php:424
     6077#: includes/class-vwsm-tool-access.php:521
    60556078msgid "A selected tool is unavailable for this group or draft constraint. Refresh the table and review again."
    60566079msgstr ""
    60576080
    6058 #: includes/class-vwsm-tool-access.php:443
     6081#: includes/class-vwsm-tool-access.php:541
    60596082msgid "Choose a preset or review a Custom tool selection for both groups before using preset-based relay access."
    60606083msgstr ""
    60616084
    6062 #: includes/class-vwsm-tool-access.php:471
     6085#: includes/class-vwsm-tool-access.php:569
    60636086msgid "The review expired or settings/tools changed. Prepare a fresh review."
    60646087msgstr ""
    60656088
    6066 #: includes/class-vwsm-tool-access.php:473
     6089#: includes/class-vwsm-tool-access.php:571
    60676090msgid "This review has already been used."
    60686091msgstr ""
    60696092
    6070 #: includes/class-vwsm-tool-access.php:494
     6093#: includes/class-vwsm-tool-access.php:592
    60716094msgid "Another administrator changed the policy. Review again."
    60726095msgstr ""
    60736096
    6074 #: includes/class-vwsm-tool-access.php:499
    6075 #: includes/class-vwsm-tool-access.php:507
    6076 #: includes/class-vwsm-tool-access.php:513
    6077 #: includes/class-vwsm-tool-access.php:630
     6097#: includes/class-vwsm-tool-access.php:597
     6098#: includes/class-vwsm-tool-access.php:605
     6099#: includes/class-vwsm-tool-access.php:611
     6100#: includes/class-vwsm-tool-access.php:764
    60786101msgid "Tool access"
    60796102msgstr ""
    60806103
    6081 #: includes/class-vwsm-tool-access.php:513
     6104#: includes/class-vwsm-tool-access.php:611
    60826105msgid "Review role presets and individual tools"
    60836106msgstr ""
    60846107
    6085 #: includes/class-vwsm-tool-access.php:513
     6108#: includes/class-vwsm-tool-access.php:611
    60866109msgid "Reviewed role presets may enable API feature switches for that group. Site Read Only, publication controls, connection approvals and WordPress permissions still apply."
    60876110msgstr ""
    60886111
    6089 #: includes/class-vwsm-tool-access.php:537
     6112#: includes/class-vwsm-tool-access.php:637
    60906113msgid "Confirm the reviewed policy first."
    60916114msgstr ""
    60926115
    6093 #: includes/class-vwsm-tool-access.php:552
     6116#: includes/class-vwsm-tool-access.php:646
     6117msgid "Use the reviewed POST form for this action."
     6118msgstr ""
     6119
     6120#: includes/class-vwsm-tool-access.php:661
     6121msgid "Review selected new or changed definitions"
     6122msgstr ""
     6123
     6124#: includes/class-vwsm-tool-access.php:661
     6125msgid "Update only the checked definitions. Keep the current preset, draft limits, other role groups, unselected fingerprints, personal restrictions and connection/package approvals. Unselected stale tools remain unavailable."
     6126msgstr ""
     6127
     6128#: includes/class-vwsm-tool-access.php:673
     6129msgid "Review selected definitions"
     6130msgstr ""
     6131
     6132#: includes/class-vwsm-tool-access.php:686
    60946133msgid "Site Read Only is on."
    60956134msgstr ""
    60966135
    6097 #: includes/class-vwsm-tool-access.php:552
     6136#: includes/class-vwsm-tool-access.php:686
    60986137msgid "Write presets remain blocked until editing is unlocked. Presets never override the site publishing switch."
    60996138msgstr ""
    61006139
    6101 #: includes/class-vwsm-tool-access.php:552
     6140#: includes/class-vwsm-tool-access.php:686
    61026141msgid "Review site editing controls"
    61036142msgstr ""
    61046143
    6105 #: includes/class-vwsm-tool-access.php:555
     6144#: includes/class-vwsm-tool-access.php:689
    61066145msgid "Role presets"
    61076146msgstr ""
    61086147
    6109 #: includes/class-vwsm-tool-access.php:555
     6148#: includes/class-vwsm-tool-access.php:689
    61106149msgid "Choose the tools available to each group, then review before saving. Client scopes and explicit connection restrictions still apply."
    61116150msgstr ""
    61126151
    6113 #: includes/class-vwsm-tool-access.php:570
     6152#: includes/class-vwsm-tool-access.php:704
    61146153msgid "Extra client admin review (optional)"
    61156154msgstr ""
    61166155
    6117 #: includes/class-vwsm-tool-access.php:570
     6156#: includes/class-vwsm-tool-access.php:704
    61186157msgid "Optional. When off, eligible connections use the reviewed role preset. Custom, Read Only, Safe Drafts and revoked client policies stay restrictive. Existing Full policies follow the role preset, including Full policies with a previously partial tool selection. Your AI app may request its own tool approval."
    61196158msgstr ""
    61206159
    6121 #: includes/class-vwsm-tool-access.php:571
     6160#: includes/class-vwsm-tool-access.php:705
    61226161msgid "Presets configure API features for the selected tools. Saved credentials, allowed roles, media source hosts, SEO provider and package approvals are retained. Other Roles still need an enabled AI role and the relevant WordPress capabilities."
    61236162msgstr ""
    61246163
    6125 #: includes/class-vwsm-tool-access.php:573
    6126 #: includes/class-vwsm-tool-access.php:575
     6164#: includes/class-vwsm-tool-access.php:707
     6165#: includes/class-vwsm-tool-access.php:709
    61276166#: includes/services/class-vwsm-search-evidence.php:265
    61286167msgid "Review tool access"
    61296168msgstr ""
    61306169
    6131 #: includes/class-vwsm-tool-access.php:576
     6170#: includes/class-vwsm-tool-access.php:710
    61326171msgid "View all tools"
    61336172msgstr ""
    61346173
    6135 #: includes/class-vwsm-tool-access.php:584
     6174#: includes/class-vwsm-tool-access.php:718
    61366175msgid "Select tools by feature"
    61376176msgstr ""
    61386177
    6139 #: includes/class-vwsm-tool-access.php:592
     6178#: includes/class-vwsm-tool-access.php:726
    61406179msgid "Supported tools"
    61416180msgstr ""
    61426181
    6143 #: includes/class-vwsm-tool-access.php:592
     6182#: includes/class-vwsm-tool-access.php:726
    61446183msgid "Changing a checkbox selects Custom for that group. Draft-only protection is retained when customizing Draft. Availability also depends on installed integrations, enabled features and the connected account."
    61456184msgstr ""
    61466185
    6147 #: includes/class-vwsm-tool-access.php:592
     6186#: includes/class-vwsm-tool-access.php:726
    61486187msgid "Filter tools"
    61496188msgstr ""
    61506189
    6151 #: includes/class-vwsm-tool-access.php:592
     6190#: includes/class-vwsm-tool-access.php:726
    61526191msgid "Tool and description"
    61536192msgstr ""
    61546193
    6155 #: includes/class-vwsm-tool-access.php:592
     6194#: includes/class-vwsm-tool-access.php:726
    61566195msgid "Group / risk"
    61576196msgstr ""
    61586197
    6159 #: includes/class-vwsm-tool-access.php:592
     6198#: includes/class-vwsm-tool-access.php:726
    61606199msgid "Presets"
    61616200msgstr ""
    61626201
    6163 #: includes/class-vwsm-tool-access.php:604
     6202#: includes/class-vwsm-tool-access.php:738
    61646203msgid "Details"
    61656204msgstr ""
    61666205
    6167 #: includes/class-vwsm-tool-access.php:607
     6206#: includes/class-vwsm-tool-access.php:741
    61686207msgid "Routine write"
    61696208msgstr ""
    61706209
    6171 #: includes/class-vwsm-tool-access.php:608
     6210#: includes/class-vwsm-tool-access.php:742
    61726211msgid "Administration"
    61736212msgstr ""
    61746213
    6175 #: includes/class-vwsm-tool-access.php:611
     6214#: includes/class-vwsm-tool-access.php:745
    61766215msgid "Available before connection review"
    61776216msgstr ""
    61786217
    6179 #: includes/class-vwsm-tool-access.php:611
     6218#: includes/class-vwsm-tool-access.php:745
    61806219msgid "Feature or approval required"
    61816220msgstr ""
    61826221
    61836222#. translators: %1$s: tool identifier, %2$s: capability group label.
    6184 #: includes/class-vwsm-tool-access.php:619
     6223#: includes/class-vwsm-tool-access.php:753
    61856224#, php-format
    61866225msgid "Enable %1$s for %2$s"
    61876226msgstr ""
    61886227
    6189 #: includes/class-vwsm-tool-access.php:630
     6228#: includes/class-vwsm-tool-access.php:764
    61906229msgid "Continue onboarding"
    61916230msgstr ""
    61926231
    6193 #: includes/class-vwsm-tool-access.php:634
     6232#: includes/class-vwsm-tool-access.php:768
    61946233msgid "The review expired. Prepare it again."
    61956234msgstr ""
    61966235
    6197 #: includes/class-vwsm-tool-access.php:636
     6236#: includes/class-vwsm-tool-access.php:771
     6237msgid "Only these tool definitions will change:"
     6238msgstr ""
     6239
     6240#: includes/class-vwsm-tool-access.php:771
     6241msgid "All other role constraints and unselected fingerprints are retained."
     6242msgstr ""
     6243
     6244#: includes/class-vwsm-tool-access.php:772
    61986245msgid "Relay approval mode"
    61996246msgstr ""
    62006247
    6201 #: includes/class-vwsm-tool-access.php:636
     6248#: includes/class-vwsm-tool-access.php:772
    62026249msgid "Require an administrator review for each account and relay client."
    62036250msgstr ""
    62046251
    6205 #: includes/class-vwsm-tool-access.php:636
     6252#: includes/class-vwsm-tool-access.php:772
    62066253msgid "Use reviewed role presets; no extra per-client admin step. Custom, Read Only, Safe Drafts and revoked policies stay restrictive. Existing Full policies, including partial Full selections, will follow the current reviewed role preset."
    62076254msgstr ""
    62086255
    6209 #: includes/class-vwsm-tool-access.php:637
     6256#: includes/class-vwsm-tool-access.php:773
    62106257msgid "Review role access"
    62116258msgstr ""
    62126259
    6213 #: includes/class-vwsm-tool-access.php:637
     6260#: includes/class-vwsm-tool-access.php:773
    62146261msgid "Group"
    62156262msgstr ""
    62166263
    6217 #: includes/class-vwsm-tool-access.php:637
     6264#: includes/class-vwsm-tool-access.php:773
    62186265msgid "Tools and constraints"
    62196266msgstr ""
    62206267
    6221 #: includes/class-vwsm-tool-access.php:639
     6268#: includes/class-vwsm-tool-access.php:775
    62226269msgid "Review exact selection"
    62236270msgstr ""
    62246271
    6225 #: includes/class-vwsm-tool-access.php:639
     6272#: includes/class-vwsm-tool-access.php:775
    62266273msgid "Draft-only execution retained."
    62276274msgstr ""
    62286275
    6229 #: includes/class-vwsm-tool-access.php:639
     6276#: includes/class-vwsm-tool-access.php:775
    62306277msgid "Selected write tools may affect public content."
    62316278msgstr ""
    62326279
    6233 #: includes/class-vwsm-tool-access.php:639
     6280#: includes/class-vwsm-tool-access.php:775
    62346281msgid "API switches follow the selected tools for this group; site Read Only and publication controls remain authoritative."
    62356282msgstr ""
    62366283
    6237 #: includes/class-vwsm-tool-access.php:639
     6284#: includes/class-vwsm-tool-access.php:775
    62386285msgid "Existing feature switches continue to apply."
    62396286msgstr ""
    62406287
    6241 #: includes/class-vwsm-tool-access.php:641
     6288#: includes/class-vwsm-tool-access.php:777
    62426289msgid "API feature switches"
    62436290msgstr ""
    62446291
    6245 #: includes/class-vwsm-tool-access.php:641
     6292#: includes/class-vwsm-tool-access.php:777
    62466293msgid "Selected tools determine their API feature switches. Read blocks writes; Draft blocks publication. Write permits own-action recovery. Admin enables routine administration and other-author content. Cross-user log recovery still needs its separate Admin scope setting. Only Develop enables protected metadata and host-allowlisted executable HTML for administrators with unfiltered_html. Source hosts and package approvals remain separate."
    62476294msgstr ""
    62486295
    6249 #: includes/class-vwsm-tool-access.php:641
     6296#: includes/class-vwsm-tool-access.php:777
    62506297msgid "Admin can change site settings and apply separately approved updates. Develop additionally permits executable HTML, protected metadata and separately approved executable packages. Use these modes only with trusted administrators and a restorable backup."
    62516298msgstr ""
    62526299
    6253 #: includes/class-vwsm-tool-access.php:643
     6300#: includes/class-vwsm-tool-access.php:779
    62546301msgid "I reviewed these tools and their public/code effects."
    62556302msgstr ""
    62566303
    6257 #: includes/class-vwsm-tool-access.php:644
     6304#: includes/class-vwsm-tool-access.php:780
    62586305msgid "Apply reviewed tool access"
    62596306msgstr ""
    62606307
    6261 #: includes/class-vwsm-tool-access.php:648
     6308#: includes/class-vwsm-tool-access.php:784
    62626309msgid "Tool access saved. Existing client records and package allowlists were retained; the reviewed relay approval mode now applies."
    62636310msgstr ""
    62646311
    6265 #: includes/class-vwsm-tool-access.php:650
     6312#: includes/class-vwsm-tool-access.php:794
     6313msgid "Some selected definitions changed and are unavailable. Review only the needed definitions below to retain unrelated permissions."
     6314msgstr ""
     6315
     6316#: includes/class-vwsm-tool-access.php:794
     6317msgid "Review changed definitions"
     6318msgstr ""
     6319
     6320#: includes/class-vwsm-tool-access.php:797
    62666321msgid "How presets and approvals work"
    62676322msgstr ""
    62686323
    6269 #: includes/class-vwsm-tool-access.php:650
     6324#: includes/class-vwsm-tool-access.php:797
    62706325msgid "Disabled blocks Site Manager tools. Read exposes reads. Draft allows unpublished content and private review proposals. Write adds routine edits, taxonomy changes, recoverable trash and own-action rollback when a snapshot exists. Admin adds routine site administration; Develop adds high-risk code and package operations. Admin and Develop are admin-only. Custom retains draft protection and requires review for each new or changed tool. WordPress core REST access from an Application Password is outside this plugin policy."
    62716326msgstr ""
    62726327
    6273 #: includes/class-vwsm-tool-access.php:650
     6328#: includes/class-vwsm-tool-access.php:797
    62746329msgid "This table lists supported metadata for installed integrations. A checked tool is an availability ceiling, not proof that the current connection can execute it. Native Abilities, relay consent, account plans, object capabilities and package allowlists may narrow it further. No arbitrary code executor is provided."
    62756330msgstr ""
    62766331
    6277 #: includes/class-vwsm-tool-access.php:652
     6332#: includes/class-vwsm-tool-access.php:799
    62786333msgid "Review connection permissions"
    62796334msgstr ""
    … …  
    63876442msgstr ""
    63886443
    6389 #: includes/class-vwsm-translation-tools.php:158
     6444#: includes/class-vwsm-translation-tools.php:155
     6445msgid "An administrator enables integration drafting and publication in Translator Settings, then allows editing and direct publishing in Site Manager Quick setup and reviews the role tools. Develop includes supported administrator tools after review; explicit client restrictions and personal exclusions remain in force. Ask the administrator to review the current connection if its publish tool is missing. Each translation still needs an editable original, a complete current draft and resolved protection review."
     6446msgstr ""
     6447
     6448#: includes/class-vwsm-translation-tools.php:181
    63906449msgid "List available translation languages and their configuration revision."
    63916450msgstr ""
    63926451
    6393 #: includes/class-vwsm-translation-tools.php:159
     6452#: includes/class-vwsm-translation-tools.php:182
    63946453msgid "List your own editable public Posts and Pages and translation statuses."
    63956454msgstr ""
    63966455
    6397 #: includes/class-vwsm-translation-tools.php:161
     6456#: includes/class-vwsm-translation-tools.php:184
    63986457msgid "Read bounded translation text from your own public Post or Page in an available language."
    63996458msgstr ""
    64006459
    6401 #: includes/class-vwsm-translation-tools.php:170
     6460#: includes/class-vwsm-translation-tools.php:193
    64026461msgid "Validate translated plain-text units and save a private translation draft without changing public content."
    64036462msgstr ""
    64046463
    6405 #: includes/class-vwsm-translation-tools.php:189
     6464#: includes/class-vwsm-translation-tools.php:212
    64066465msgid "Read your translation draft, exact source and target versions, and native review link."
    64076466msgstr ""
    64086467
    6409 #: includes/class-vwsm-translation-tools.php:198
     6468#: includes/class-vwsm-translation-tools.php:221
    64106469msgid "Publish your existing translation draft only when source/version and configured publication permissions match."
    64116470msgstr ""
    64126471
    6413 #: includes/class-vwsm-translation-tools.php:210
     6472#: includes/class-vwsm-translation-tools.php:233
    64146473msgid "Replace private progress notes for your translation after reading its notes version. Empty text clears the note; no page or translation is published."
    64156474msgstr ""
    64166475
    6417 #: includes/class-vwsm-translation-tools.php:223
     6476#: includes/class-vwsm-translation-tools.php:246
    64186477msgid "Check translation setup, publication readiness and native settings/review links before planning work. Does not enable permissions."
    64196478msgstr ""
    64206479
    6421 #: includes/class-vwsm-translation-tools.php:226
     6480#: includes/class-vwsm-translation-tools.php:249
    64226481msgid "Read bounded private source differences and section-protection status for your editable original. This does not unlock corrections or publish."
    64236482msgstr ""
    64246483
    6425 #: includes/class-vwsm-translation-tools.php:231
     6484#: includes/class-vwsm-translation-tools.php:254
    64266485msgid "Publish a reviewed translation and its local URL proposal using current versions and publication permissions. Earlier public paths remain aliases."
    64276486msgstr ""
    64286487
    6429 #: includes/class-vwsm-translation-tools.php:233
     6488#: includes/class-vwsm-translation-tools.php:256
    64306489msgid "Save a private local language-URL proposal for your translation. Normal separate publication applies it and retains public aliases; collisions fail closed."
    64316490msgstr ""
    64326491
    6433 #: includes/class-vwsm-translation-tools.php:274
     6492#: includes/class-vwsm-translation-tools.php:297
    64346493msgid "Local translation drafts and permission-controlled publication. Own content only; administrators use separately reviewed Pro tools for other authors and site elements."
    64356494msgstr ""
    64366495
    6437 #: includes/class-vwsm-translation-tools.php:289
     6496#: includes/class-vwsm-translation-tools.php:312
    64386497msgid "Translation access denied."
    64396498msgstr ""
    64406499
    6441 #: includes/class-vwsm-translation-tools.php:310
     6500#: includes/class-vwsm-translation-tools.php:334
    64426501msgid "Check setup, list languages, read your content and notes, get translation context, translate plain-text units, save a draft, update progress notes and review. Publish only when current permissions allow. Site-wide language management requires separately approved Pro administration tools."
     6502msgstr ""
     6503
     6504#: includes/class-vwsm-translation-tools.php:353
     6505msgid "Translation publication is disabled by a current permission or setting. Ask an administrator to review the publication readiness checklist."
    64436506msgstr ""
    64446507
  • videowhisper-site-manager/tags/1.21.0/readme.txt

    r3791171 r3791563  
    327327
    328328== Changelog ==
     329
     330= 1.21.0 =
     331* Keep reviewed content tools available when page builders register a narrower API content inventory; new content scope still needs native review.
     332* Review only selected new or changed tool definitions without replacing other approvals.
     333* Explain translation publication prerequisites and link directly to the relevant settings.
     334
    329335
    330336= 1.20.0 =
  • videowhisper-site-manager/tags/1.21.0/videowhisper-site-manager.php

    r3791171 r3791563  
    33 * Plugin Name: VideoWhisper Site Manager for ChatGPT, Claude, Codex, Grok
    44 * Description: Manage WordPress with your AI assistant and own account. Optional hosted relay: multiple sites from one connection and agent session.
    5  * Version: 1.20.0
     5 * Version: 1.21.0
    66 * Requires at least: 6.9
    77 * Requires PHP: 8.2
    … …  
    2020}
    2121
    22 define( 'VWSM_VERSION', '1.20.0' );
     22define( 'VWSM_VERSION', '1.21.0' );
    2323define( 'VWSM_IMAGE_SEO_CORE', 1 );
    2424define( 'VWSM_LOCAL_OAUTH_CORE', 1 );
  • videowhisper-site-manager/trunk/includes/actions/class-ai-action-registry.php

    r3786440 r3791563  
    131131                unset( $action );
    132132
     133                $actions = VWSM_Tool_Access::reviewed_content_actions( $actions );
    133134                $actions = VWSM_User_Tool_Access::filter_actions( VWSM_Tool_Access::filter_actions( $actions ) );
    134135                return $apply_grants ? VWSM_Relay_Permissions::filter_actions( VWSM_Native_Abilities::filter_actions( VWSM_Tool_Grants::filter_actions( $actions ) ) ) : $actions;
  • videowhisper-site-manager/trunk/includes/admin/class-vwsm-quick-setup.php

    r3789255 r3791563  
    220220                        )
    221221                ) . '">' . esc_html__( 'Native Abilities and connection approvals', 'videowhisper-site-manager' ) . '</a></p>';
     222                if ( class_exists( 'VWML_Settings' ) ) {
     223                        echo '<p><a href="' . esc_url( admin_url( 'admin.php?page=vwml-settings#vwml-integrations' ) ) . '">' . esc_html__( 'Enable Translator drafting and publication', 'videowhisper-site-manager' ) . '</a> — ' . esc_html__( 'Translation also requires these two Translator integration switches. Develop includes supported administrator tools after review; it retains personal exclusions and explicit connection restrictions.', 'videowhisper-site-manager' ) . '</p>'; }
    222224                echo '<p><a href="' . esc_url( VWSM_Admin_Guide::help_url( 'permissions' ) ) . '">' . esc_html__( 'Optional features and integration setup', 'videowhisper-site-manager' ) . '</a></p></details>';
    223225        }
  • videowhisper-site-manager/trunk/includes/class-vwsm-tool-access.php

    r3786440 r3791563  
    3333                add_action( 'admin_bar_menu', array( __CLASS__, 'toolbar' ), 96 );
    3434                add_action( 'admin_post_vwsm_tool_access_prepare', array( __CLASS__, 'prepare_post' ) );
     35                add_action( 'admin_post_vwsm_tool_access_selected', array( __CLASS__, 'selected_post' ) );
    3536                add_action( 'admin_post_vwsm_tool_access_apply', array( __CLASS__, 'apply_post' ) );
    3637                add_action( 'vwsm_settings_form_content_rows', array( __CLASS__, 'settings_link' ) );
    … …  
    6566                $fields['feature_contract'] = self::feature_signature();
    6667                return self::digest( $fields );
     68        }
     69        /** Native review records the content ceiling, including admin-only registrations. */
     70        private static function content_contracts( $names, $catalog ) {
     71                $out = array();
     72                foreach ( $names as $name ) {
     73                        $a = $catalog[ $name ] ?? array();
     74                        $domain = $a['permission_context']['content_domain'] ?? null;
     75                        if ( ! is_array( $domain ) ) { continue; }
     76                        $enums = array();
     77                        $properties = (array) ( $a['inputSchema']['properties'] ?? array() );
     78                        foreach ( array( 'type', 'post_type', 'taxonomy' ) as $field ) {
     79                                $property = (array) ( $properties[ $field ] ?? array() );
     80                                $values = $property['enum'] ?? null;
     81                                if ( is_array( $values ) ) { $enums[ $field ] = $values; }
     82                        }
     83                        $out[ $name ] = array( 'domain' => $domain, 'enums' => $enums );
     84                }
     85                return $out;
     86        }
     87        /**
     88         * A runtime may omit builder types registered only in wp-admin. Keep the
     89         * reviewed declaration when runtime scope is a subset; services still enforce
     90         * actual enabled types. Any added type/taxonomy or other contract change fails
     91         * the normal fingerprint check. Existing policies gain nothing on upgrade.
     92         */
     93        public static function reviewed_content_actions( $actions ) {
     94                if ( self::$preview ) { return $actions; }
     95                $p = self::selection();
     96                $contracts = $p['content_contracts'] ?? array();
     97                if ( $p['legacy'] || ! is_array( $contracts ) ) { return $actions; }
     98                foreach ( $actions as $name => $a ) {
     99                        $saved = $contracts[ $name ] ?? null;
     100                        $domain = $a['permission_context']['content_domain'] ?? null;
     101                        if ( ! is_array( $saved ) || ! self::valid_content_domain( $saved['domain'] ?? null ) || ! is_array( $saved['enums'] ?? null ) || ! self::valid_content_domain( $domain ) ) { continue; }
     102                        $subset = true;
     103                        foreach ( $domain as $type => $taxonomies ) {
     104                                if ( ! is_array( $taxonomies ) || ! isset( $saved['domain'][ $type ] ) || ! is_array( $saved['domain'][ $type ] ) || array_diff( $taxonomies, $saved['domain'][ $type ] ) ) { $subset = false; break; }
     105                        }
     106                        $next = $a;
     107                        foreach ( $saved['enums'] as $field => $values ) {
     108                                $current = $a['inputSchema']['properties'][ $field ]['enum'] ?? null;
     109                                if ( ! in_array( $field, array( 'type', 'post_type', 'taxonomy' ), true ) || ! is_array( $values ) || count( array_filter( $values, 'is_string' ) ) !== count( $values ) || ! is_array( $current ) || count( array_filter( $current, 'is_string' ) ) !== count( $current ) || array_diff( $current, $values ) ) { $subset = false; break; }
     110                                $next['inputSchema']['properties'][ $field ]['enum'] = $values;
     111                        }
     112                        if ( $subset ) {
     113                                $next['permission_context']['content_domain'] = $saved['domain'];
     114                                // The stored exact fingerprint authenticates the entire projected contract.
     115                                if ( isset( $p['tools'][ $name ] ) && is_string( $p['tools'][ $name ] ) && hash_equals( $p['tools'][ $name ], self::fingerprint( $next ) ) ) { $actions[ $name ] = $next; }
     116                        }
     117                }
     118                return $actions;
     119        }
     120        private static function valid_content_domain( $domain ) {
     121                if ( ! is_array( $domain ) || count( $domain ) > 1000 ) { return false; }
     122                foreach ( $domain as $type => $taxonomies ) {
     123                        if ( ! is_string( $type ) || ! is_array( $taxonomies ) || count( $taxonomies ) > 1000 || count( array_filter( $taxonomies, 'is_string' ) ) !== count( $taxonomies ) ) { return false; }
     124                }
     125                return true;
    67126        }
    68127        /** Missing policy preserves upgrades; malformed configured policy is closed. */
    … …  
    380439                }
    381440                return $response;
     441        }
     442        /** Selected contract updates retain every unselected fingerprint and policy constraint. */
     443        public static function prepare_selected( $group, $names ) {
     444                if ( ! self::native() || ! in_array( $group, array( 'admins', 'others' ), true ) || ! is_array( $names ) || ! $names || count( $names ) > 100 || count( array_filter( $names, 'is_string' ) ) !== count( $names ) ) {
     445                        return self::error( __( 'Choose supported tools in a native administrator session.', 'videowhisper-site-manager' ) ); }
     446                $prior   = self::policy();
     447                $p       = self::selection( $group );
     448                $catalog = self::supported();
     449                if ( ! is_array( $prior ) || ! isset( $prior['groups'][ $group ] ) || $p['legacy'] || 'disabled' === $p['mode'] ) {
     450                        return self::error( __( 'Review a role preset before updating individual tool definitions.', 'videowhisper-site-manager' ) ); }
     451                $groups = $prior['groups'];
     452                foreach ( array_unique( $names ) as $name ) {
     453                        if ( ! isset( $catalog[ $name ] ) || ! self::selected_allowed( $p, $group, $name, $catalog[ $name ] ) ) {
     454                                return self::error( __( 'A selected definition exceeds the current role constraints. Review the role policy separately.', 'videowhisper-site-manager' ) ); }
     455                        $groups[ $group ]['tools'][ $name ] = self::fingerprint( $catalog[ $name ] );
     456                }
     457                if ( count( $groups[ $group ]['tools'] ) > VWSM_Tool_Grants::MAX_TOOLS ) {
     458                        return self::error( __( 'Invalid tool selection.', 'videowhisper-site-manager' ) ); }
     459                ksort( $groups[ $group ]['tools'] );
     460                $groups[ $group ]['content_contracts'] = array_merge( is_array( $p['content_contracts'] ?? null ) ? $p['content_contracts'] : array(), self::content_contracts( $names, $catalog ) );
     461                $id = wp_generate_uuid4();
     462                $r  = array(
     463                        'id' => $id, 'operator' => get_current_user_id(), 'blog' => get_current_blog_id(),
     464                        'session' => self::digest( wp_get_session_token() ), 'expires' => time() + 600,
     465                        'prior' => self::digest( $prior ),
     466                        'settings' => self::digest( array( get_option( 'vwsm_settings', array() ), get_option( 'vwsm_permission_epoch', '' ) ) ),
     467                        'catalog' => self::digest( $catalog ), 'groups' => $groups,
     468                        'relay_review_required' => self::relay_review_required(),
     469                        'selected_updates' => array( $group => array_values( array_unique( $names ) ) ),
     470                );
     471                set_transient( 'vwsm_tool_review_' . $id, $r, 600 );
     472                return $r;
     473        }
     474        private static function selected_allowed( $p, $group, $name, $action ) {
     475                if ( $p['legacy'] || 'disabled' === $p['mode'] || ( 'custom' !== $p['mode'] && ! self::mode_allows( $p['mode'], $name, $action, $group ) ) || ( $p['draft_only'] && ! self::mode_allows( 'drafts', $name, $action, $group ) ) ) {
     476                        return false; }
     477                $risk = self::risk( $name, $action );
     478                return ! ( ( 'others' === $group && ( 'mcp:admin' === $action['required_scope'] || ( ! $action['read_only'] && 'safe' !== $risk ) ) ) || ( 'developer' === $risk && 'developer' !== $p['level'] ) || ( 'power' === $risk && 'safe' === $p['level'] ) );
    382479        }
    383480        /** Exact native review; raw settings digest detects concurrent configuration changes. */
    … …  
    438535                                'tools'      => $tools,
    439536                                'features'   => 'disabled' !== $mode,
     537                                'content_contracts' => self::content_contracts( $names, $catalog ),
    440538                        );
    441539                }
    … …  
    513611                echo '<tr><th>' . esc_html__( 'Tool access', 'videowhisper-site-manager' ) . '</th><td><a href="' . esc_url( self::url() ) . '">' . esc_html__( 'Review role presets and individual tools', 'videowhisper-site-manager' ) . '</a><p class="description">' . esc_html__( 'Reviewed role presets may enable API feature switches for that group. Site Read Only, publication controls, connection approvals and WordPress permissions still apply.', 'videowhisper-site-manager' ) . '</p></td></tr>'; }
    514612        public static function prepare_post() {
     613                self::require_post();
    515614                check_admin_referer( 'vwsm_tool_access_prepare' );
    516615                $modes    = isset( $_POST['modes'] ) && is_array( $_POST['modes'] ) ? wp_unslash( $_POST['modes'] ) : null;
    … …  
    532631        }
    533632        public static function apply_post() {
     633                self::require_post();
    534634                check_admin_referer( 'vwsm_tool_access_apply' );
    535635                $id = isset( $_POST['review'] ) && is_string( $_POST['review'] ) ? wp_unslash( $_POST['review'] ) : '';
    … …  
    541641                wp_safe_redirect( self::url( array( 'saved' => 1 ) ) );
    542642                exit;
     643        }
     644        private static function require_post() {
     645                if ( 'POST' !== ( $_SERVER['REQUEST_METHOD'] ?? '' ) ) {
     646                        wp_die( esc_html__( 'Use the reviewed POST form for this action.', 'videowhisper-site-manager' ), '', array( 'response' => 405 ) ); }
     647        }
     648        public static function selected_post() {
     649                self::require_post();
     650                check_admin_referer( 'vwsm_tool_access_selected' );
     651                $group = isset( $_POST['group'] ) && is_string( $_POST['group'] ) ? wp_unslash( $_POST['group'] ) : '';
     652                $names = isset( $_POST['selected_definitions'] ) && is_array( $_POST['selected_definitions'] ) ? wp_unslash( $_POST['selected_definitions'] ) : array();
     653                $r = self::prepare_selected( $group, $names );
     654                if ( is_wp_error( $r ) ) {
     655                        wp_die( esc_html( $r->get_error_message() ), '', array( 'response' => 409 ) ); }
     656                wp_safe_redirect( self::url( array( 'review' => $r['id'] ) ) );
     657                exit;
     658        }
     659        private static function selected_form() {
     660                $catalog = self::supported();
     661                echo '<details id="vwsm-selected-definitions"><summary>' . esc_html__( 'Review selected new or changed definitions', 'videowhisper-site-manager' ) . '</summary><p>' . esc_html__( 'Update only the checked definitions. Keep the current preset, draft limits, other role groups, unselected fingerprints, personal restrictions and connection/package approvals. Unselected stale tools remain unavailable.', 'videowhisper-site-manager' ) . '</p>';
     662                foreach ( array( 'admins', 'others' ) as $group ) {
     663                        $p = self::selection( $group );
     664                        $candidates = array_filter( $catalog, static function ( $a, $name ) use ( $p, $group ) {
     665                                return self::selected_allowed( $p, $group, $name, $a ) && ( ! isset( $p['tools'][ $name ] ) || ! hash_equals( $p['tools'][ $name ], self::fingerprint( $a ) ) );
     666                        }, ARRAY_FILTER_USE_BOTH );
     667                        if ( ! $candidates ) {
     668                                continue; }
     669                        echo '<form method="post" action="' . esc_url( admin_url( 'admin-post.php' ) ) . '"><input type="hidden" name="action" value="vwsm_tool_access_selected"><input type="hidden" name="group" value="' . esc_attr( $group ) . '"><h3>' . esc_html( 'admins' === $group ? __( 'Admins', 'videowhisper-site-manager' ) : __( 'Other Roles', 'videowhisper-site-manager' ) ) . '</h3>';
     670                        wp_nonce_field( 'vwsm_tool_access_selected' );
     671                        foreach ( $candidates as $name => $a ) {
     672                                echo '<p><label><input type="checkbox" name="selected_definitions[]" value="' . esc_attr( $name ) . '"> <code>' . esc_html( $name ) . '</code> — ' . esc_html( wp_html_excerpt( wp_strip_all_tags( $a['description'] ), 180 ) ) . '</label></p>'; }
     673                        submit_button( __( 'Review selected definitions', 'videowhisper-site-manager' ), 'secondary' );
     674                        echo '</form>';
     675                }
     676                echo '</details>';
    543677        }
    544678        /** Quick selector is also used on Activate; forms never nest. */
    … …  
    634768                        echo '<div class="notice notice-error"><p>' . esc_html__( 'The review expired. Prepare it again.', 'videowhisper-site-manager' ) . '</p></div>'; }
    635769                if ( $r ) {
     770                        if ( isset( $r['selected_updates'] ) ) {
     771                                echo '<p><strong>' . esc_html__( 'Only these tool definitions will change:', 'videowhisper-site-manager' ) . '</strong> <code>' . esc_html( implode( ', ', array_merge( ...array_values( $r['selected_updates'] ) ) ) ) . '</code></p><p>' . esc_html__( 'All other role constraints and unselected fingerprints are retained.', 'videowhisper-site-manager' ) . '</p>'; }
    636772                        echo '<p><strong>' . esc_html__( 'Relay approval mode', 'videowhisper-site-manager' ) . '</strong>: ' . esc_html( $r['relay_review_required'] ? __( 'Require an administrator review for each account and relay client.', 'videowhisper-site-manager' ) : __( 'Use reviewed role presets; no extra per-client admin step. Custom, Read Only, Safe Drafts and revoked policies stay restrictive. Existing Full policies, including partial Full selections, will follow the current reviewed role preset.', 'videowhisper-site-manager' ) ) . '</p>';
    637773                        echo '<h2>' . esc_html__( 'Review role access', 'videowhisper-site-manager' ) . '</h2><table class="widefat striped"><thead><tr><th>' . esc_html__( 'Group', 'videowhisper-site-manager' ) . '</th><th>' . esc_html__( 'Current → proposed', 'videowhisper-site-manager' ) . '</th><th>' . esc_html__( 'Tools and constraints', 'videowhisper-site-manager' ) . '</th></tr></thead><tbody>';
    … …  
    647783                if ( isset( $_GET['saved'] ) ) {
    648784                        echo '<div class="notice notice-success"><p>' . esc_html__( 'Tool access saved. Existing client records and package allowlists were retained; the reviewed relay approval mode now applies.', 'videowhisper-site-manager' ) . '</p></div>'; }
     785                $stale = false;
     786                foreach ( self::supported() as $name => $a ) {
     787                        foreach ( array( 'admins', 'others' ) as $group ) {
     788                                $p = self::selection( $group );
     789                                if ( isset( $p['tools'][ $name ] ) && ! hash_equals( $p['tools'][ $name ], self::fingerprint( $a ) ) ) {
     790                                        $stale = true; }
     791                        }
     792                }
     793                if ( $stale ) {
     794                        echo '<div class="notice notice-warning"><p>' . esc_html__( 'Some selected definitions changed and are unavailable. Review only the needed definitions below to retain unrelated permissions.', 'videowhisper-site-manager' ) . ' <a href="#vwsm-selected-definitions">' . esc_html__( 'Review changed definitions', 'videowhisper-site-manager' ) . '</a></p></div>'; }
    649795                self::quick( true );
     796                self::selected_form();
    650797                echo '<details style="margin-top:24px"><summary>' . esc_html__( 'How presets and approvals work', 'videowhisper-site-manager' ) . '</summary><p>' . esc_html__( 'Disabled blocks Site Manager tools. Read exposes reads. Draft allows unpublished content and private review proposals. Write adds routine edits, taxonomy changes, recoverable trash and own-action rollback when a snapshot exists. Admin adds routine site administration; Develop adds high-risk code and package operations. Admin and Develop are admin-only. Custom retains draft protection and requires review for each new or changed tool. WordPress core REST access from an Application Password is outside this plugin policy.', 'videowhisper-site-manager' ) . '</p><p>' . esc_html__( 'This table lists supported metadata for installed integrations. A checked tool is an availability ceiling, not proof that the current connection can execute it. Native Abilities, relay consent, account plans, object capabilities and package allowlists may narrow it further. No arbitrary code executor is provided.', 'videowhisper-site-manager' ) . '</p>';
    651798                do_action( 'vwsm_tool_access_help' );
  • videowhisper-site-manager/trunk/includes/class-vwsm-translation-tools.php

    r3791171 r3791563  
    133133        public static function can_publish() {
    134134                return ! VWSM_Tool_Grants::is_safe_drafts() && VWSM_Tool_Access::publication_enabled() && ! empty( VWSM_Access_Control::get_settings()['allow_publish'] ); }
     135        /** Explain configuration separately from per-object publication readiness. */
     136        public static function publication_readiness() {
     137                $translator = ( new VWML_Settings() )->get();
     138                $site = VWSM_Access_Control::get_settings();
     139                $admin = current_user_can( 'manage_options' );
     140                $tools = VWSM_AI_Action_Registry::get_actions();
     141                $checks = array(
     142                        'integration_drafting' => ! empty( $translator['integration_enabled'] ),
     143                        'integration_publication' => ! empty( $translator['integration_publish'] ),
     144                        'site_editing' => empty( $site['read_only'] ),
     145                        'site_publication' => ! empty( $site['allow_publish'] ),
     146                        'permission_mode_publication' => self::can_publish(),
     147                        'publish_tool_approved' => isset( $tools['translation_publish'] ) || isset( $tools['translation_admin_publish'] ),
     148                );
     149                return array(
     150                        'configuration_ready' => ! in_array( false, $checks, true ),
     151                        'checks' => $checks,
     152                        'translator_settings_url' => $admin ? admin_url( 'admin.php?page=vwml-settings#vwml-integrations' ) : '',
     153                        'site_setup_url' => $admin ? VWSM_Onboarding_Approvals::url( array( 'activation_section' => 'finish' ) ) : '',
     154                        'tool_access_url' => $admin ? VWSM_Tool_Access::url() : '',
     155                        'guidance' => __( 'An administrator enables integration drafting and publication in Translator Settings, then allows editing and direct publishing in Site Manager Quick setup and reviews the role tools. Develop includes supported administrator tools after review; explicit client restrictions and personal exclusions remain in force. Ask the administrator to review the current connection if its publish tool is missing. Each translation still needs an editable original, a complete current draft and resolved protection review.', 'videowhisper-site-manager' ),
     156                );
     157        }
    135158        /**
    136159         * Declare versioned tools only when the owning integration is available.
    … …  
    305328                                        'integration_enabled'      => VWML_API::enabled(),
    306329                                        'publication_enabled'      => ! empty( ( new VWML_Settings() )->get()['integration_publish'] ) && self::can_publish(),
     330                                        'publication_readiness'    => self::publication_readiness(),
    307331                                        'administration_available' => VWML_API::admin(),
    308332                                        'setup_url'                => current_user_can( 'manage_options' ) ? admin_url( 'admin.php?page=vwml-settings#vwml-integrations' ) : '',
    … …  
    327351                                return self::with_editorial_action( $action, 'route_propose', static fn() => method_exists( 'VWML_API', 'propose_route' ) ? VWML_API::propose_route( $args['post_id'], $args['locale'], $args['path'], $args['version'], $args['source_hash'] ) : VWML_API::error() );
    328352                        case 'translation_publish':
    329                                 return self::with_editorial_action( $action, 'publish', static fn() => self::can_publish() ? VWML_API::publish( $args['post_id'], $args['locale'], $args['source_hash'], $args['version'], false, true ) : VWML_API::error() );
     353                                return self::with_editorial_action( $action, 'publish', static fn() => self::can_publish() ? VWML_API::publish( $args['post_id'], $args['locale'], $args['source_hash'], $args['version'], false, true ) : new WP_Error( 'vwsm_translation_publication_setup', __( 'Translation publication is disabled by a current permission or setting. Ask an administrator to review the publication readiness checklist.', 'videowhisper-site-manager' ), array( 'status' => 403, 'publication_readiness' => self::publication_readiness() ) ) );
    330354                }
    331355                return VWML_API::error();
  • videowhisper-site-manager/trunk/languages/videowhisper-site-manager.pot

    r3791171 r3791563  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: VideoWhisper Site Manager for ChatGPT, Claude, Codex, Grok 1.20.0\n"
     5"Project-Id-Version: VideoWhisper Site Manager for ChatGPT, Claude, Codex, Grok 1.21.0\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/videowhisper-site-manager\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    … …  
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2026-11-08T12:06:44+00:00\n"
     12"POT-Creation-Date: 2026-11-08T20:50:15+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.12.0\n"
    … …  
    4040msgstr ""
    4141
    42 #: includes/actions/class-ai-action-registry.php:141
     42#: includes/actions/class-ai-action-registry.php:142
    4343msgid "The tool must match the route."
    4444msgstr ""
    4545
    46 #: includes/actions/class-ai-action-registry.php:145
     46#: includes/actions/class-ai-action-registry.php:146
    4747#: includes/class-access-control.php:212
    4848#: includes/mcp/class-mcp-server.php:560
    … …  
    5050msgstr ""
    5151
    52 #: includes/actions/class-ai-action-registry.php:148
     52#: includes/actions/class-ai-action-registry.php:149
    5353msgid "The action does not belong to this route."
    5454msgstr ""
    … …  
    530530#: includes/admin/class-vwsm-quick-setup.php:135
    531531#: includes/admin/class-vwsm-quick-setup.php:158
    532 #: includes/class-vwsm-tool-access.php:629
     532#: includes/class-vwsm-tool-access.php:763
    533533#: includes/services/class-vwsm-editorial-workflow.php:308
    534534msgid "Native administrator access is required."
    … …  
    12231223#. translators: %1$s: tool identifier, %2$s: capability group label.
    12241224#: includes/admin/class-vwsm-quick-setup.php:195
    1225 #: includes/admin/class-vwsm-quick-setup.php:235
     1225#: includes/admin/class-vwsm-quick-setup.php:237
    12261226#: includes/class-vwsm-relay-review.php:388
    1227 #: includes/class-vwsm-tool-access.php:557
    1228 #: includes/class-vwsm-tool-access.php:586
    1229 #: includes/class-vwsm-tool-access.php:592
    1230 #: includes/class-vwsm-tool-access.php:619
    1231 #: includes/class-vwsm-tool-access.php:639
     1227#: includes/class-vwsm-tool-access.php:669
     1228#: includes/class-vwsm-tool-access.php:691
     1229#: includes/class-vwsm-tool-access.php:720
     1230#: includes/class-vwsm-tool-access.php:726
     1231#: includes/class-vwsm-tool-access.php:753
     1232#: includes/class-vwsm-tool-access.php:775
    12321233msgid "Admins"
    12331234msgstr ""
    … …  
    12361237#. translators: %1$s: tool identifier, %2$s: capability group label.
    12371238#: includes/admin/class-vwsm-quick-setup.php:196
    1238 #: includes/admin/class-vwsm-quick-setup.php:235
     1239#: includes/admin/class-vwsm-quick-setup.php:237
    12391240#: includes/class-vwsm-relay-review.php:388
    1240 #: includes/class-vwsm-tool-access.php:558
    1241 #: includes/class-vwsm-tool-access.php:586
    1242 #: includes/class-vwsm-tool-access.php:592
    1243 #: includes/class-vwsm-tool-access.php:619
    1244 #: includes/class-vwsm-tool-access.php:639
     1241#: includes/class-vwsm-tool-access.php:669
     1242#: includes/class-vwsm-tool-access.php:692
     1243#: includes/class-vwsm-tool-access.php:720
     1244#: includes/class-vwsm-tool-access.php:726
     1245#: includes/class-vwsm-tool-access.php:753
     1246#: includes/class-vwsm-tool-access.php:775
    12451247msgid "Other Roles"
    12461248msgstr ""
    … …  
    12671269
    12681270#: includes/admin/class-vwsm-quick-setup.php:210
    1269 #: includes/class-vwsm-tool-access.php:570
     1271#: includes/class-vwsm-tool-access.php:704
    12701272msgid "Require an extra administrator review for each relay client"
    12711273msgstr ""
    … …  
    12841286
    12851287#: includes/admin/class-vwsm-quick-setup.php:213
    1286 #: includes/admin/class-vwsm-quick-setup.php:231
     1288#: includes/admin/class-vwsm-quick-setup.php:233
    12871289msgid "Review activation"
    12881290msgstr ""
    … …  
    13001302msgstr ""
    13011303
    1302 #: includes/admin/class-vwsm-quick-setup.php:222
     1304#: includes/admin/class-vwsm-quick-setup.php:223
     1305msgid "Enable Translator drafting and publication"
     1306msgstr ""
     1307
     1308#: includes/admin/class-vwsm-quick-setup.php:223
     1309msgid "Translation also requires these two Translator integration switches. Develop includes supported administrator tools after review; it retains personal exclusions and explicit connection restrictions."
     1310msgstr ""
     1311
     1312#: includes/admin/class-vwsm-quick-setup.php:224
    13031313msgid "Optional features and integration setup"
    13041314msgstr ""
    13051315
    1306 #: includes/admin/class-vwsm-quick-setup.php:231
     1316#: includes/admin/class-vwsm-quick-setup.php:233
    13071317msgid "Setting"
    13081318msgstr ""
    13091319
    1310 #: includes/admin/class-vwsm-quick-setup.php:231
    1311 #: includes/class-vwsm-tool-access.php:637
     1320#: includes/admin/class-vwsm-quick-setup.php:233
     1321#: includes/class-vwsm-tool-access.php:773
    13121322msgid "Current → proposed"
    13131323msgstr ""
    13141324
    13151325#. translators: 1: Current mode, 2: Proposed mode, 3: Number of tools.
    1316 #: includes/admin/class-vwsm-quick-setup.php:235
     1326#: includes/admin/class-vwsm-quick-setup.php:237
    13171327#, php-format
    13181328msgid "%1$s → %2$s · Selected tools: %3$d"
    … …  
    13201330
    13211331#. translators: 1: Current mode, 2: Proposed mode, 3: Number of tools.
    1322 #: includes/admin/class-vwsm-quick-setup.php:235
     1332#: includes/admin/class-vwsm-quick-setup.php:237
    13231333msgid "Existing settings"
    13241334msgstr ""
    13251335
    13261336#. translators: 1: Current mode, 2: Proposed mode, 3: Number of tools.
    1327 #: includes/admin/class-vwsm-quick-setup.php:235
     1337#: includes/admin/class-vwsm-quick-setup.php:237
    13281338msgid "Exact tools"
    13291339msgstr ""
    13301340
    1331 #: includes/admin/class-vwsm-quick-setup.php:237
     1341#: includes/admin/class-vwsm-quick-setup.php:239
    13321342msgid "Allowed roles"
    13331343msgstr ""
    13341344
    1335 #: includes/admin/class-vwsm-quick-setup.php:237
     1345#: includes/admin/class-vwsm-quick-setup.php:239
    13361346msgid "AI/SI editing"
    13371347msgstr ""
    13381348
    1339 #: includes/admin/class-vwsm-quick-setup.php:237
     1349#: includes/admin/class-vwsm-quick-setup.php:239
    13401350msgid "Direct publishing"
    13411351msgstr ""
    13421352
    1343 #: includes/admin/class-vwsm-quick-setup.php:237
     1353#: includes/admin/class-vwsm-quick-setup.php:239
    13441354msgid "Extra relay-client admin review"
    13451355msgstr ""
    13461356
    1347 #: includes/admin/class-vwsm-quick-setup.php:239
    1348 #: includes/admin/class-vwsm-quick-setup.php:240
     1357#: includes/admin/class-vwsm-quick-setup.php:241
     1358#: includes/admin/class-vwsm-quick-setup.php:242
    13491359msgid "On"
    13501360msgstr ""
    13511361
    1352 #: includes/admin/class-vwsm-quick-setup.php:239
    1353 #: includes/admin/class-vwsm-quick-setup.php:240
     1362#: includes/admin/class-vwsm-quick-setup.php:241
     1363#: includes/admin/class-vwsm-quick-setup.php:242
    13541364msgid "Off"
    13551365msgstr ""
    13561366
    1357 #: includes/admin/class-vwsm-quick-setup.php:244
     1367#: includes/admin/class-vwsm-quick-setup.php:246
    13581368msgid "Preset-based relay access"
    13591369msgstr ""
    13601370
    1361 #: includes/admin/class-vwsm-quick-setup.php:244
     1371#: includes/admin/class-vwsm-quick-setup.php:246
    13621372msgid "Existing Full client policies will follow the reviewed role preset, including Full policies with a previously partial tool selection. Custom, Read Only, Safe Drafts and revoked client policies remain restrictive. Personal exclusions are retained."
    13631373msgstr ""
    13641374
    1365 #: includes/admin/class-vwsm-quick-setup.php:245
     1375#: includes/admin/class-vwsm-quick-setup.php:247
    13661376msgid "These changes affect site/role availability. Client scopes, explicit restricted or revoked grants, personal exclusions, native Abilities and exact package approvals remain separate. No credential or customer record is changed."
    13671377msgstr ""
    13681378
    1369 #: includes/admin/class-vwsm-quick-setup.php:247
     1379#: includes/admin/class-vwsm-quick-setup.php:249
    13701380msgid "I reviewed these exact site and role changes."
    13711381msgstr ""
    13721382
    1373 #: includes/admin/class-vwsm-quick-setup.php:248
     1383#: includes/admin/class-vwsm-quick-setup.php:250
    13741384msgid "Activate and continue"
    13751385msgstr ""
    13761386
    1377 #: includes/admin/class-vwsm-quick-setup.php:249
     1387#: includes/admin/class-vwsm-quick-setup.php:251
    13781388msgid "Back to setup"
    13791389msgstr ""
    … …  
    24882498#: includes/admin/views/native-abilities-page.php:70
    24892499#: includes/class-vwsm-local-oauth.php:940
    2490 #: includes/class-vwsm-tool-access.php:46
    2491 #: includes/class-vwsm-tool-access.php:606
     2500#: includes/class-vwsm-tool-access.php:47
     2501#: includes/class-vwsm-tool-access.php:740
    24922502msgid "Read"
    24932503msgstr ""
    … …  
    53515361#: includes/class-vwsm-local-oauth.php:539
    53525362#: includes/class-vwsm-local-oauth.php:918
    5353 #: includes/class-vwsm-tool-access.php:51
     5363#: includes/class-vwsm-tool-access.php:52
    53545364#: includes/class-vwsm-user-tool-access.php:32
    53555365msgid "Custom"
    … …  
    54995509#: includes/class-vwsm-local-oauth.php:940
    55005510#: includes/class-vwsm-relay-review.php:61
    5501 #: includes/class-vwsm-tool-access.php:48
     5511#: includes/class-vwsm-tool-access.php:49
    55025512msgid "Write"
    55035513msgstr ""
    … …  
    56545664
    56555665#: includes/class-vwsm-native-abilities.php:484
    5656 #: includes/class-vwsm-tool-access.php:652
     5666#: includes/class-vwsm-tool-access.php:799
    56575667msgid "Native Abilities"
    56585668msgstr ""
    … …  
    57245734#: includes/class-vwsm-relay-review.php:16
    57255735#: includes/class-vwsm-relay-review.php:60
    5726 #: includes/class-vwsm-tool-access.php:47
     5736#: includes/class-vwsm-tool-access.php:48
    57275737#: includes/class-vwsm-user-tool-access.php:24
    57285738msgid "Draft"
    … …  
    57475757#: includes/class-vwsm-relay-review.php:28
    57485758#: includes/class-vwsm-relay-review.php:36
    5749 #: includes/class-vwsm-tool-access.php:386
     5759#: includes/class-vwsm-tool-access.php:483
    57505760msgid "Native administrator review is required."
    57515761msgstr ""
    … …  
    57735783
    57745784#: includes/class-vwsm-relay-review.php:58
    5775 #: includes/class-vwsm-tool-access.php:45
     5785#: includes/class-vwsm-tool-access.php:46
    57765786#: includes/class-vwsm-user-tool-access.php:22
    57775787msgid "Disabled"
    … …  
    57795789
    57805790#: includes/class-vwsm-relay-review.php:64
    5781 #: includes/class-vwsm-tool-access.php:49
     5791#: includes/class-vwsm-tool-access.php:50
    57825792#: includes/class-vwsm-user-tool-access.php:29
    57835793msgid "Admin"
    … …  
    57855795
    57865796#: includes/class-vwsm-relay-review.php:65
    5787 #: includes/class-vwsm-tool-access.php:50
    5788 #: includes/class-vwsm-tool-access.php:609
     5797#: includes/class-vwsm-tool-access.php:51
     5798#: includes/class-vwsm-tool-access.php:743
    57895799#: includes/class-vwsm-user-tool-access.php:30
    57905800msgid "Develop"
    … …  
    60326042msgstr ""
    60336043
    6034 #: includes/class-vwsm-tool-access.php:371
     6044#: includes/class-vwsm-tool-access.php:430
    60356045msgid "This tool is disabled by the site Tool access policy. Ask an administrator to review Tool access."
    60366046msgstr ""
    60376047
    6038 #: includes/class-vwsm-tool-access.php:388
     6048#: includes/class-vwsm-tool-access.php:445
     6049msgid "Choose supported tools in a native administrator session."
     6050msgstr ""
     6051
     6052#: includes/class-vwsm-tool-access.php:450
     6053msgid "Review a role preset before updating individual tool definitions."
     6054msgstr ""
     6055
     6056#: includes/class-vwsm-tool-access.php:454
     6057msgid "A selected definition exceeds the current role constraints. Review the role policy separately."
     6058msgstr ""
     6059
     6060#: includes/class-vwsm-tool-access.php:458
     6061#: includes/class-vwsm-tool-access.php:517
     6062msgid "Invalid tool selection."
     6063msgstr ""
     6064
     6065#: includes/class-vwsm-tool-access.php:485
    60396066msgid "Invalid relay review mode."
    60406067msgstr ""
    60416068
    6042 #: includes/class-vwsm-tool-access.php:397
     6069#: includes/class-vwsm-tool-access.php:494
    60436070msgid "Invalid feature selection."
    60446071msgstr ""
    60456072
    6046 #: includes/class-vwsm-tool-access.php:404
     6073#: includes/class-vwsm-tool-access.php:501
    60476074msgid "Choose a supported mode for each group."
    60486075msgstr ""
    60496076
    6050 #: includes/class-vwsm-tool-access.php:420
    6051 msgid "Invalid tool selection."
    6052 msgstr ""
    6053 
    6054 #: includes/class-vwsm-tool-access.php:424
     6077#: includes/class-vwsm-tool-access.php:521
    60556078msgid "A selected tool is unavailable for this group or draft constraint. Refresh the table and review again."
    60566079msgstr ""
    60576080
    6058 #: includes/class-vwsm-tool-access.php:443
     6081#: includes/class-vwsm-tool-access.php:541
    60596082msgid "Choose a preset or review a Custom tool selection for both groups before using preset-based relay access."
    60606083msgstr ""
    60616084
    6062 #: includes/class-vwsm-tool-access.php:471
     6085#: includes/class-vwsm-tool-access.php:569
    60636086msgid "The review expired or settings/tools changed. Prepare a fresh review."
    60646087msgstr ""
    60656088
    6066 #: includes/class-vwsm-tool-access.php:473
     6089#: includes/class-vwsm-tool-access.php:571
    60676090msgid "This review has already been used."
    60686091msgstr ""
    60696092
    6070 #: includes/class-vwsm-tool-access.php:494
     6093#: includes/class-vwsm-tool-access.php:592
    60716094msgid "Another administrator changed the policy. Review again."
    60726095msgstr ""
    60736096
    6074 #: includes/class-vwsm-tool-access.php:499
    6075 #: includes/class-vwsm-tool-access.php:507
    6076 #: includes/class-vwsm-tool-access.php:513
    6077 #: includes/class-vwsm-tool-access.php:630
     6097#: includes/class-vwsm-tool-access.php:597
     6098#: includes/class-vwsm-tool-access.php:605
     6099#: includes/class-vwsm-tool-access.php:611
     6100#: includes/class-vwsm-tool-access.php:764
    60786101msgid "Tool access"
    60796102msgstr ""
    60806103
    6081 #: includes/class-vwsm-tool-access.php:513
     6104#: includes/class-vwsm-tool-access.php:611
    60826105msgid "Review role presets and individual tools"
    60836106msgstr ""
    60846107
    6085 #: includes/class-vwsm-tool-access.php:513
     6108#: includes/class-vwsm-tool-access.php:611
    60866109msgid "Reviewed role presets may enable API feature switches for that group. Site Read Only, publication controls, connection approvals and WordPress permissions still apply."
    60876110msgstr ""
    60886111
    6089 #: includes/class-vwsm-tool-access.php:537
     6112#: includes/class-vwsm-tool-access.php:637
    60906113msgid "Confirm the reviewed policy first."
    60916114msgstr ""
    60926115
    6093 #: includes/class-vwsm-tool-access.php:552
     6116#: includes/class-vwsm-tool-access.php:646
     6117msgid "Use the reviewed POST form for this action."
     6118msgstr ""
     6119
     6120#: includes/class-vwsm-tool-access.php:661
     6121msgid "Review selected new or changed definitions"
     6122msgstr ""
     6123
     6124#: includes/class-vwsm-tool-access.php:661
     6125msgid "Update only the checked definitions. Keep the current preset, draft limits, other role groups, unselected fingerprints, personal restrictions and connection/package approvals. Unselected stale tools remain unavailable."
     6126msgstr ""
     6127
     6128#: includes/class-vwsm-tool-access.php:673
     6129msgid "Review selected definitions"
     6130msgstr ""
     6131
     6132#: includes/class-vwsm-tool-access.php:686
    60946133msgid "Site Read Only is on."
    60956134msgstr ""
    60966135
    6097 #: includes/class-vwsm-tool-access.php:552
     6136#: includes/class-vwsm-tool-access.php:686
    60986137msgid "Write presets remain blocked until editing is unlocked. Presets never override the site publishing switch."
    60996138msgstr ""
    61006139
    6101 #: includes/class-vwsm-tool-access.php:552
     6140#: includes/class-vwsm-tool-access.php:686
    61026141msgid "Review site editing controls"
    61036142msgstr ""
    61046143
    6105 #: includes/class-vwsm-tool-access.php:555
     6144#: includes/class-vwsm-tool-access.php:689
    61066145msgid "Role presets"
    61076146msgstr ""
    61086147
    6109 #: includes/class-vwsm-tool-access.php:555
     6148#: includes/class-vwsm-tool-access.php:689
    61106149msgid "Choose the tools available to each group, then review before saving. Client scopes and explicit connection restrictions still apply."
    61116150msgstr ""
    61126151
    6113 #: includes/class-vwsm-tool-access.php:570
     6152#: includes/class-vwsm-tool-access.php:704
    61146153msgid "Extra client admin review (optional)"
    61156154msgstr ""
    61166155
    6117 #: includes/class-vwsm-tool-access.php:570
     6156#: includes/class-vwsm-tool-access.php:704
    61186157msgid "Optional. When off, eligible connections use the reviewed role preset. Custom, Read Only, Safe Drafts and revoked client policies stay restrictive. Existing Full policies follow the role preset, including Full policies with a previously partial tool selection. Your AI app may request its own tool approval."
    61196158msgstr ""
    61206159
    6121 #: includes/class-vwsm-tool-access.php:571
     6160#: includes/class-vwsm-tool-access.php:705
    61226161msgid "Presets configure API features for the selected tools. Saved credentials, allowed roles, media source hosts, SEO provider and package approvals are retained. Other Roles still need an enabled AI role and the relevant WordPress capabilities."
    61236162msgstr ""
    61246163
    6125 #: includes/class-vwsm-tool-access.php:573
    6126 #: includes/class-vwsm-tool-access.php:575
     6164#: includes/class-vwsm-tool-access.php:707
     6165#: includes/class-vwsm-tool-access.php:709
    61276166#: includes/services/class-vwsm-search-evidence.php:265
    61286167msgid "Review tool access"
    61296168msgstr ""
    61306169
    6131 #: includes/class-vwsm-tool-access.php:576
     6170#: includes/class-vwsm-tool-access.php:710
    61326171msgid "View all tools"
    61336172msgstr ""
    61346173
    6135 #: includes/class-vwsm-tool-access.php:584
     6174#: includes/class-vwsm-tool-access.php:718
    61366175msgid "Select tools by feature"
    61376176msgstr ""
    61386177
    6139 #: includes/class-vwsm-tool-access.php:592
     6178#: includes/class-vwsm-tool-access.php:726
    61406179msgid "Supported tools"
    61416180msgstr ""
    61426181
    6143 #: includes/class-vwsm-tool-access.php:592
     6182#: includes/class-vwsm-tool-access.php:726
    61446183msgid "Changing a checkbox selects Custom for that group. Draft-only protection is retained when customizing Draft. Availability also depends on installed integrations, enabled features and the connected account."
    61456184msgstr ""
    61466185
    6147 #: includes/class-vwsm-tool-access.php:592
     6186#: includes/class-vwsm-tool-access.php:726
    61486187msgid "Filter tools"
    61496188msgstr ""
    61506189
    6151 #: includes/class-vwsm-tool-access.php:592
     6190#: includes/class-vwsm-tool-access.php:726
    61526191msgid "Tool and description"
    61536192msgstr ""
    61546193
    6155 #: includes/class-vwsm-tool-access.php:592
     6194#: includes/class-vwsm-tool-access.php:726
    61566195msgid "Group / risk"
    61576196msgstr ""
    61586197
    6159 #: includes/class-vwsm-tool-access.php:592
     6198#: includes/class-vwsm-tool-access.php:726
    61606199msgid "Presets"
    61616200msgstr ""
    61626201
    6163 #: includes/class-vwsm-tool-access.php:604
     6202#: includes/class-vwsm-tool-access.php:738
    61646203msgid "Details"
    61656204msgstr ""
    61666205
    6167 #: includes/class-vwsm-tool-access.php:607
     6206#: includes/class-vwsm-tool-access.php:741
    61686207msgid "Routine write"
    61696208msgstr ""
    61706209
    6171 #: includes/class-vwsm-tool-access.php:608
     6210#: includes/class-vwsm-tool-access.php:742
    61726211msgid "Administration"
    61736212msgstr ""
    61746213
    6175 #: includes/class-vwsm-tool-access.php:611
     6214#: includes/class-vwsm-tool-access.php:745
    61766215msgid "Available before connection review"
    61776216msgstr ""
    61786217
    6179 #: includes/class-vwsm-tool-access.php:611
     6218#: includes/class-vwsm-tool-access.php:745
    61806219msgid "Feature or approval required"
    61816220msgstr ""
    61826221
    61836222#. translators: %1$s: tool identifier, %2$s: capability group label.
    6184 #: includes/class-vwsm-tool-access.php:619
     6223#: includes/class-vwsm-tool-access.php:753
    61856224#, php-format
    61866225msgid "Enable %1$s for %2$s"
    61876226msgstr ""
    61886227
    6189 #: includes/class-vwsm-tool-access.php:630
     6228#: includes/class-vwsm-tool-access.php:764
    61906229msgid "Continue onboarding"
    61916230msgstr ""
    61926231
    6193 #: includes/class-vwsm-tool-access.php:634
     6232#: includes/class-vwsm-tool-access.php:768
    61946233msgid "The review expired. Prepare it again."
    61956234msgstr ""
    61966235
    6197 #: includes/class-vwsm-tool-access.php:636
     6236#: includes/class-vwsm-tool-access.php:771
     6237msgid "Only these tool definitions will change:"
     6238msgstr ""
     6239
     6240#: includes/class-vwsm-tool-access.php:771
     6241msgid "All other role constraints and unselected fingerprints are retained."
     6242msgstr ""
     6243
     6244#: includes/class-vwsm-tool-access.php:772
    61986245msgid "Relay approval mode"
    61996246msgstr ""
    62006247
    6201 #: includes/class-vwsm-tool-access.php:636
     6248#: includes/class-vwsm-tool-access.php:772
    62026249msgid "Require an administrator review for each account and relay client."
    62036250msgstr ""
    62046251
    6205 #: includes/class-vwsm-tool-access.php:636
     6252#: includes/class-vwsm-tool-access.php:772
    62066253msgid "Use reviewed role presets; no extra per-client admin step. Custom, Read Only, Safe Drafts and revoked policies stay restrictive. Existing Full policies, including partial Full selections, will follow the current reviewed role preset."
    62076254msgstr ""
    62086255
    6209 #: includes/class-vwsm-tool-access.php:637
     6256#: includes/class-vwsm-tool-access.php:773
    62106257msgid "Review role access"
    62116258msgstr ""
    62126259
    6213 #: includes/class-vwsm-tool-access.php:637
     6260#: includes/class-vwsm-tool-access.php:773
    62146261msgid "Group"
    62156262msgstr ""
    62166263
    6217 #: includes/class-vwsm-tool-access.php:637
     6264#: includes/class-vwsm-tool-access.php:773
    62186265msgid "Tools and constraints"
    62196266msgstr ""
    62206267
    6221 #: includes/class-vwsm-tool-access.php:639
     6268#: includes/class-vwsm-tool-access.php:775
    62226269msgid "Review exact selection"
    62236270msgstr ""
    62246271
    6225 #: includes/class-vwsm-tool-access.php:639
     6272#: includes/class-vwsm-tool-access.php:775
    62266273msgid "Draft-only execution retained."
    62276274msgstr ""
    62286275
    6229 #: includes/class-vwsm-tool-access.php:639
     6276#: includes/class-vwsm-tool-access.php:775
    62306277msgid "Selected write tools may affect public content."
    62316278msgstr ""
    62326279
    6233 #: includes/class-vwsm-tool-access.php:639
     6280#: includes/class-vwsm-tool-access.php:775
    62346281msgid "API switches follow the selected tools for this group; site Read Only and publication controls remain authoritative."
    62356282msgstr ""
    62366283
    6237 #: includes/class-vwsm-tool-access.php:639
     6284#: includes/class-vwsm-tool-access.php:775
    62386285msgid "Existing feature switches continue to apply."
    62396286msgstr ""
    62406287
    6241 #: includes/class-vwsm-tool-access.php:641
     6288#: includes/class-vwsm-tool-access.php:777
    62426289msgid "API feature switches"
    62436290msgstr ""
    62446291
    6245 #: includes/class-vwsm-tool-access.php:641
     6292#: includes/class-vwsm-tool-access.php:777
    62466293msgid "Selected tools determine their API feature switches. Read blocks writes; Draft blocks publication. Write permits own-action recovery. Admin enables routine administration and other-author content. Cross-user log recovery still needs its separate Admin scope setting. Only Develop enables protected metadata and host-allowlisted executable HTML for administrators with unfiltered_html. Source hosts and package approvals remain separate."
    62476294msgstr ""
    62486295
    6249 #: includes/class-vwsm-tool-access.php:641
     6296#: includes/class-vwsm-tool-access.php:777
    62506297msgid "Admin can change site settings and apply separately approved updates. Develop additionally permits executable HTML, protected metadata and separately approved executable packages. Use these modes only with trusted administrators and a restorable backup."
    62516298msgstr ""
    62526299
    6253 #: includes/class-vwsm-tool-access.php:643
     6300#: includes/class-vwsm-tool-access.php:779
    62546301msgid "I reviewed these tools and their public/code effects."
    62556302msgstr ""
    62566303
    6257 #: includes/class-vwsm-tool-access.php:644
     6304#: includes/class-vwsm-tool-access.php:780
    62586305msgid "Apply reviewed tool access"
    62596306msgstr ""
    62606307
    6261 #: includes/class-vwsm-tool-access.php:648
     6308#: includes/class-vwsm-tool-access.php:784
    62626309msgid "Tool access saved. Existing client records and package allowlists were retained; the reviewed relay approval mode now applies."
    62636310msgstr ""
    62646311
    6265 #: includes/class-vwsm-tool-access.php:650
     6312#: includes/class-vwsm-tool-access.php:794
     6313msgid "Some selected definitions changed and are unavailable. Review only the needed definitions below to retain unrelated permissions."
     6314msgstr ""
     6315
     6316#: includes/class-vwsm-tool-access.php:794
     6317msgid "Review changed definitions"
     6318msgstr ""
     6319
     6320#: includes/class-vwsm-tool-access.php:797
    62666321msgid "How presets and approvals work"
    62676322msgstr ""
    62686323
    6269 #: includes/class-vwsm-tool-access.php:650
     6324#: includes/class-vwsm-tool-access.php:797
    62706325msgid "Disabled blocks Site Manager tools. Read exposes reads. Draft allows unpublished content and private review proposals. Write adds routine edits, taxonomy changes, recoverable trash and own-action rollback when a snapshot exists. Admin adds routine site administration; Develop adds high-risk code and package operations. Admin and Develop are admin-only. Custom retains draft protection and requires review for each new or changed tool. WordPress core REST access from an Application Password is outside this plugin policy."
    62716326msgstr ""
    62726327
    6273 #: includes/class-vwsm-tool-access.php:650
     6328#: includes/class-vwsm-tool-access.php:797
    62746329msgid "This table lists supported metadata for installed integrations. A checked tool is an availability ceiling, not proof that the current connection can execute it. Native Abilities, relay consent, account plans, object capabilities and package allowlists may narrow it further. No arbitrary code executor is provided."
    62756330msgstr ""
    62766331
    6277 #: includes/class-vwsm-tool-access.php:652
     6332#: includes/class-vwsm-tool-access.php:799
    62786333msgid "Review connection permissions"
    62796334msgstr ""
    … …  
    63876442msgstr ""
    63886443
    6389 #: includes/class-vwsm-translation-tools.php:158
     6444#: includes/class-vwsm-translation-tools.php:155
     6445msgid "An administrator enables integration drafting and publication in Translator Settings, then allows editing and direct publishing in Site Manager Quick setup and reviews the role tools. Develop includes supported administrator tools after review; explicit client restrictions and personal exclusions remain in force. Ask the administrator to review the current connection if its publish tool is missing. Each translation still needs an editable original, a complete current draft and resolved protection review."
     6446msgstr ""
     6447
     6448#: includes/class-vwsm-translation-tools.php:181
    63906449msgid "List available translation languages and their configuration revision."
    63916450msgstr ""
    63926451
    6393 #: includes/class-vwsm-translation-tools.php:159
     6452#: includes/class-vwsm-translation-tools.php:182
    63946453msgid "List your own editable public Posts and Pages and translation statuses."
    63956454msgstr ""
    63966455
    6397 #: includes/class-vwsm-translation-tools.php:161
     6456#: includes/class-vwsm-translation-tools.php:184
    63986457msgid "Read bounded translation text from your own public Post or Page in an available language."
    63996458msgstr ""
    64006459
    6401 #: includes/class-vwsm-translation-tools.php:170
     6460#: includes/class-vwsm-translation-tools.php:193
    64026461msgid "Validate translated plain-text units and save a private translation draft without changing public content."
    64036462msgstr ""
    64046463
    6405 #: includes/class-vwsm-translation-tools.php:189
     6464#: includes/class-vwsm-translation-tools.php:212
    64066465msgid "Read your translation draft, exact source and target versions, and native review link."
    64076466msgstr ""
    64086467
    6409 #: includes/class-vwsm-translation-tools.php:198
     6468#: includes/class-vwsm-translation-tools.php:221
    64106469msgid "Publish your existing translation draft only when source/version and configured publication permissions match."
    64116470msgstr ""
    64126471
    6413 #: includes/class-vwsm-translation-tools.php:210
     6472#: includes/class-vwsm-translation-tools.php:233
    64146473msgid "Replace private progress notes for your translation after reading its notes version. Empty text clears the note; no page or translation is published."
    64156474msgstr ""
    64166475
    6417 #: includes/class-vwsm-translation-tools.php:223
     6476#: includes/class-vwsm-translation-tools.php:246
    64186477msgid "Check translation setup, publication readiness and native settings/review links before planning work. Does not enable permissions."
    64196478msgstr ""
    64206479
    6421 #: includes/class-vwsm-translation-tools.php:226
     6480#: includes/class-vwsm-translation-tools.php:249
    64226481msgid "Read bounded private source differences and section-protection status for your editable original. This does not unlock corrections or publish."
    64236482msgstr ""
    64246483
    6425 #: includes/class-vwsm-translation-tools.php:231
     6484#: includes/class-vwsm-translation-tools.php:254
    64266485msgid "Publish a reviewed translation and its local URL proposal using current versions and publication permissions. Earlier public paths remain aliases."
    64276486msgstr ""
    64286487
    6429 #: includes/class-vwsm-translation-tools.php:233
     6488#: includes/class-vwsm-translation-tools.php:256
    64306489msgid "Save a private local language-URL proposal for your translation. Normal separate publication applies it and retains public aliases; collisions fail closed."
    64316490msgstr ""
    64326491
    6433 #: includes/class-vwsm-translation-tools.php:274
     6492#: includes/class-vwsm-translation-tools.php:297
    64346493msgid "Local translation drafts and permission-controlled publication. Own content only; administrators use separately reviewed Pro tools for other authors and site elements."
    64356494msgstr ""
    64366495
    6437 #: includes/class-vwsm-translation-tools.php:289
     6496#: includes/class-vwsm-translation-tools.php:312
    64386497msgid "Translation access denied."
    64396498msgstr ""
    64406499
    6441 #: includes/class-vwsm-translation-tools.php:310
     6500#: includes/class-vwsm-translation-tools.php:334
    64426501msgid "Check setup, list languages, read your content and notes, get translation context, translate plain-text units, save a draft, update progress notes and review. Publish only when current permissions allow. Site-wide language management requires separately approved Pro administration tools."
     6502msgstr ""
     6503
     6504#: includes/class-vwsm-translation-tools.php:353
     6505msgid "Translation publication is disabled by a current permission or setting. Ask an administrator to review the publication readiness checklist."
    64436506msgstr ""
    64446507
  • videowhisper-site-manager/trunk/readme.txt

    r3791171 r3791563  
    327327
    328328== Changelog ==
     329
     330= 1.21.0 =
     331* Keep reviewed content tools available when page builders register a narrower API content inventory; new content scope still needs native review.
     332* Review only selected new or changed tool definitions without replacing other approvals.
     333* Explain translation publication prerequisites and link directly to the relevant settings.
     334
    329335
    330336= 1.20.0 =
  • videowhisper-site-manager/trunk/videowhisper-site-manager.php

    r3791171 r3791563  
    33 * Plugin Name: VideoWhisper Site Manager for ChatGPT, Claude, Codex, Grok
    44 * Description: Manage WordPress with your AI assistant and own account. Optional hosted relay: multiple sites from one connection and agent session.
    5  * Version: 1.20.0
     5 * Version: 1.21.0
    66 * Requires at least: 6.9
    77 * Requires PHP: 8.2
    … …  
    2020}
    2121
    22 define( 'VWSM_VERSION', '1.20.0' );
     22define( 'VWSM_VERSION', '1.21.0' );
    2323define( 'VWSM_IMAGE_SEO_CORE', 1 );
    2424define( 'VWSM_LOCAL_OAUTH_CORE', 1 );
Note: See TracChangeset for help on using the changeset viewer.