Plugin Directory

Changeset 3800467


Ignore:
Timestamp:
11/13/2026 01:19:01 PM (less than one hour ago)
Author:
dotrex
Message:

Release 1.1.0

Location:
llamly
Files:
466 added
20 edited
1 copied

Legend:

Unmodified
Added
Removed
  • llamly/tags/1.1.0/THIRD-PARTY-NOTICES.txt

    r3788333 r3800467  
    5555THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    5656
     57## Freemius WordPress SDK 2.13.5 (GPL-3.0)
     58
     59`vendor/freemius/wordpress-sdk/` is the [Freemius WordPress SDK](https://github.com/Freemius/wordpress-sdk) 2.13.5 (tag `2.13.5`, commit `0875c4ee3c941572f44d60cb2a687c54295db3d7`), Copyright (c) 2015, Freemius, Inc., licensed under the GNU General Public License version 3. It is bundled unchanged, exactly as the upstream tag exports it, with its full license text in `vendor/freemius/wordpress-sdk/LICENSE.txt`; `tools/freemius-sdk.lock` in the source repository records the SHA256 of every file. Llamly uses it only for the optional, opt-in usage statistics and the Llamly Pro add-on (readme, External services). Because Llamly is GPL-2.0-or-later, the plugin as distributed with this SDK is covered by GPL-3.0.
     60
     61The SDK carries its own notices for the code it bundles: the Freemius PHP API client in `includes/sdk/` (GPL-2.0, `includes/sdk/LICENSE.txt`); `assets/js/pricing/freemius-pricing.js`, whose bundled libraries (React and others under the MIT License, Font Awesome Free 5.15.4: icons CC BY 4.0, fonts SIL OFL 1.1, code MIT) are listed in `assets/js/pricing/freemius-pricing.js.LICENSE.txt`; `assets/js/nojquery.ba-postmessage.js` by Ben Alman (dual MIT and GPL). Those files are kept as shipped upstream; files without their own notice are covered by the SDK's GPL-3.0.
     62
    5763## Llamly marks
    5864
  • llamly/tags/1.1.0/assets/free/css/about.css

    r3788333 r3800467  
    2626.about-cap__name { font-weight: 500; flex: 1; min-width: 0; }
    2727.about-cap__n { color: var(--ll-text-2); font-size: var(--ll-fs-sm); font-variant-numeric: tabular-nums; }
     28.about-pro { padding: var(--ll-5) var(--ll-6); display: flex; flex-direction: column; align-items: flex-start; gap: var(--ll-3); }
     29.about-pro p { margin: 0; }
    2830.about-links { display: flex; flex-wrap: wrap; gap: var(--ll-3) var(--ll-8); padding: var(--ll-5) var(--ll-6); border-bottom: 1px solid var(--ll-border); }
    2931.about-links a { display: inline-flex; align-items: center; gap: var(--ll-2); font-weight: 600; text-decoration: none; }
  • llamly/tags/1.1.0/assets/free/js/admin.js

    r3788333 r3800467  
    19851985        }
    19861986
     1987        /** The one place in Llamly that points to Llamly Pro (LLP-455). Nothing in Llamly is locked; hidden while Llamly Pro is active. */
     1988        function proSection() {
     1989                const pro = config.pro || {};
     1990                if (pro.active) return '';
     1991                const url = typeof pro.url === 'string' && pro.url.indexOf('https://') === 0 ? pro.url : '';
     1992                return '<section id="llamly-pro" data-pro><div class="ll-section-head"><div><h2 class="ll-section-title">' +
     1993                        esc(__('Llamly Pro', 'llamly')) + '</h2><p class="ll-section-desc">' +
     1994                        esc(__('Everything on these screens is free and stays free.', 'llamly')) + '</p></div></div>' +
     1995                        '<div class="ll-card about-pro"><p>' +
     1996                        esc(__('Llamly Pro is a separate add-on with extra modules for your agent. The first one, Llamly Builder, builds pages in Elementor and in the block editor.',
     1997                        'llamly')) + '</p>' + (url ? '<a class="ll-btn" href="' + esc(url) + '" target="_blank" rel="noopener noreferrer">' +
     1998                        esc(__('Learn about Llamly Pro', 'llamly')) + icon('external-link') + '</a>' : '<p class="ll-faint">' +
     1999                        esc(__('Coming soon.', 'llamly')) + '</p>') + '</div></section>';
     2000        }
     2001
    19872002        tabs.about = {
    19882003                label: __('About', 'llamly'),
    … …  
    20392054                                        '</section>' +
    20402055                                modulesSection() +
     2056                                proSection() +
    20412057                                '<section><div class="ll-section-head"><div><h2 class="ll-section-title">' + esc(__('Help', 'llamly')) + '</h2></div></div><div class="ll-card">' +
    20422058                                (help.length ? '<div class="about-links">' + help.map((l) => '<a href="' + esc(l[0]) +
  • llamly/tags/1.1.0/languages/llamly.pot

    r3788333 r3800467  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: Llamly 1.0.2\n"
     5"Project-Id-Version: Llamly 1.1.0\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/llamly\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-10-26T10:12:35-03:00\n"
     12"POT-Creation-Date: 2026-11-11T09:37:34-03:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.12.0\n"
    … …  
    2727#. Author of the plugin
    2828#: llamly.php
    29 #: src/Free/Admin/AdminPage.php:99
    30 #: src/Free/Admin/AdminPage.php:100
    31 #: src/Free/Admin/AdminPage.php:203
     29#: src/Free/Admin/AdminPage.php:129
     30#: src/Free/Admin/AdminPage.php:130
     31#: src/Free/Admin/AdminPage.php:234
    3232#: src/Free/Core/Abilities.php:40
    3333msgid "Llamly"
    … …  
    196196msgstr ""
    197197
    198 #: src/Free/Admin/AdminPage.php:169
     198#: src/Free/Admin/AdminPage.php:57
     199#: assets/free/js/admin.js:1993
     200msgid "Llamly Pro"
     201msgstr ""
     202
     203#: src/Free/Admin/AdminPage.php:200
    199204msgid "Llamly is ready."
    200205msgstr ""
    201206
    202 #: src/Free/Admin/AdminPage.php:170
     207#: src/Free/Admin/AdminPage.php:201
    203208msgid "Connect Claude, ChatGPT or another AI app to this site. It takes about a minute."
    204209msgstr ""
    205210
    206 #: src/Free/Admin/AdminPage.php:171
     211#: src/Free/Admin/AdminPage.php:202
    207212msgid "Connect an app"
    208213msgstr ""
    209214
    210 #: src/Free/Admin/AdminPage.php:172
     215#: src/Free/Admin/AdminPage.php:203
    211216msgid "Dismiss"
    212217msgstr ""
    213218
    214 #: src/Free/Admin/AdminPage.php:178
     219#: src/Free/Admin/AdminPage.php:209
    215220msgid "You do not have permission to dismiss this notice."
    216221msgstr ""
    217222
    218 #: src/Free/Admin/AdminPage.php:189
     223#: src/Free/Admin/AdminPage.php:220
    219224msgid "You do not have permission to access Llamly."
    220225msgstr ""
    221226
    222 #: src/Free/Admin/AdminPage.php:192
     227#: src/Free/Admin/AdminPage.php:223
    223228msgid "Llamly setup"
    224229msgstr ""
    225230
    226 #: src/Free/Admin/AdminPage.php:193
     231#: src/Free/Admin/AdminPage.php:224
    227232msgid "The required database tables are not ready. Retry the schema check before connecting clients."
    228233msgstr ""
    229234
    230 #: src/Free/Admin/AdminPage.php:197
     235#: src/Free/Admin/AdminPage.php:228
    231236msgid "Verify database setup"
    232237msgstr ""
    233238
    234 #: src/Free/Admin/AdminPage.php:226
     239#: src/Free/Admin/AdminPage.php:257
    235240msgid "You do not have permission to update Llamly."
    236241msgstr ""
    … …  
    763768#: src/Free/Auth/Authenticator.php:36
    764769#: src/Free/Auth/Authenticator.php:41
     770#: src/Free/Mcp/Protocol.php:63
    765771msgid "A valid Bearer token is required."
    766772msgstr ""
    … …  
    886892
    887893#: src/Free/Auth/OAuthRedirectPolicy.php:79
    888 #: assets/free/js/admin.js:2206
     894#: assets/free/js/admin.js:2222
    889895msgid "A desktop or terminal app"
    890896msgstr ""
    891897
    892 #: src/Free/Auth/OAuthServer.php:64
     898#: src/Free/Auth/OAuthServer.php:71
    893899msgid "Llamly is not ready to register clients."
    894900msgstr ""
    895901
    896 #: src/Free/Auth/OAuthServer.php:67
     902#: src/Free/Auth/OAuthServer.php:74
    897903msgid "New OAuth connections are closed. An administrator can open a 30-minute registration window in Llamly."
    898904msgstr ""
    899905
    900 #: src/Free/Auth/OAuthServer.php:71
     906#: src/Free/Auth/OAuthServer.php:78
    901907msgid "Too many client registration requests."
    902908msgstr ""
    903909
    904 #: src/Free/Auth/OAuthServer.php:76
     910#: src/Free/Auth/OAuthServer.php:83
    905911msgid "Send a JSON client registration request."
    906912msgstr ""
    907913
    908 #: src/Free/Auth/OAuthServer.php:80
     914#: src/Free/Auth/OAuthServer.php:87
    909915msgid "Register between one and ten redirect URIs."
    910916msgstr ""
    911917
    912 #: src/Free/Auth/OAuthServer.php:84
     918#: src/Free/Auth/OAuthServer.php:91
    913919msgid "Every redirect URI must be a string."
    914920msgstr ""
    915921
    916 #: src/Free/Auth/OAuthServer.php:91
     922#: src/Free/Auth/OAuthServer.php:98
    917923msgid "No redirect URI satisfies the site redirect-host policy."
    918924msgstr ""
    919925
    920 #: src/Free/Auth/OAuthServer.php:100
     926#: src/Free/Auth/OAuthServer.php:107
    921927msgid "Only authorization-code clients with PKCE are supported."
    922928msgstr ""
    923929
    924 #: src/Free/Auth/OAuthServer.php:103
     930#: src/Free/Auth/OAuthServer.php:110
    925931msgid "Public clients must use token_endpoint_auth_method=none and PKCE."
    926932msgstr ""
    927933
    928 #: src/Free/Auth/OAuthServer.php:106
     934#: src/Free/Auth/OAuthServer.php:113
    929935msgid "The client name must be a string."
    930936msgstr ""
    931937
    932 #: src/Free/Auth/OAuthServer.php:113
     938#: src/Free/Auth/OAuthServer.php:120
    933939msgid "A secure client ID could not be created."
    934940msgstr ""
    935941
    936 #: src/Free/Auth/OAuthServer.php:121
     942#: src/Free/Auth/OAuthServer.php:128
    937943msgid "The client registration lock is unavailable."
    938944msgstr ""
    939945
    940 #: src/Free/Auth/OAuthServer.php:125
     946#: src/Free/Auth/OAuthServer.php:132
    941947msgid "The client registration transaction could not start."
    942948msgstr ""
    943949
    944 #: src/Free/Auth/OAuthServer.php:130
     950#: src/Free/Auth/OAuthServer.php:137
    945951msgid "The client registration limit could not be checked."
    946952msgstr ""
    947953
    948 #: src/Free/Auth/OAuthServer.php:134
     954#: src/Free/Auth/OAuthServer.php:141
    949955msgid "This site has reached its limit of 100 active OAuth clients. Revoke an unused client before registering another."
    950956msgstr ""
    951957
    952 #: src/Free/Auth/OAuthServer.php:151
     958#: src/Free/Auth/OAuthServer.php:158
    953959msgid "The client registration could not be stored with its audit record."
    954960msgstr ""
    955961
    956 #: src/Free/Auth/OAuthServer.php:199
     962#: src/Free/Auth/OAuthServer.php:206
    957963msgid "Llamly is not ready to accept new connections on this site."
    958964msgstr ""
    959965
    960 #: src/Free/Auth/OAuthServer.php:199
     966#: src/Free/Auth/OAuthServer.php:206
    961967msgid "Ask an administrator to check that the MCP server is turned on in Llamly > Settings."
    962968msgstr ""
    963969
    964 #: src/Free/Auth/OAuthServer.php:203
     970#: src/Free/Auth/OAuthServer.php:210
    965971msgid "This connection request is invalid."
    966972msgstr ""
    967973
    968 #: src/Free/Auth/OAuthServer.php:203
    969 #: src/Free/Auth/OAuthServer.php:374
     974#: src/Free/Auth/OAuthServer.php:210
    970975#: src/Free/Auth/OAuthServer.php:381
    971 #: src/Free/Auth/OAuthServer.php:385
     976#: src/Free/Auth/OAuthServer.php:388
     977#: src/Free/Auth/OAuthServer.php:392
    972978msgid "Go back to the app and start the connection again."
    973979msgstr ""
    974980
    975 #: src/Free/Auth/OAuthServer.php:271
     981#: src/Free/Auth/OAuthServer.php:278
    976982msgid "An administrator must approve this connection."
    977983msgstr ""
    978984
    979 #: src/Free/Auth/OAuthServer.php:271
     985#: src/Free/Auth/OAuthServer.php:278
    980986msgid "New connections are turned off on this site. Sign in as an administrator to approve it, or ask an administrator to turn on new connections for 30 minutes in Llamly > Connections."
    981987msgstr ""
    982988
    983 #: src/Free/Auth/OAuthServer.php:282
     989#: src/Free/Auth/OAuthServer.php:289
    984990msgid "Your account cannot approve this connection."
    985991msgstr ""
    986992
    987 #: src/Free/Auth/OAuthServer.php:282
     993#: src/Free/Auth/OAuthServer.php:289
     994#: src/Free/Auth/OAuthServer.php:395
     995#: src/Free/Auth/OAuthServer.php:398
     996msgid "Sign in with an account that can edit this site, or ask an administrator to connect the app."
     997msgstr ""
     998
     999#: src/Free/Auth/OAuthServer.php:381
     1000msgid "This consent form expired."
     1001msgstr ""
     1002
    9881003#: src/Free/Auth/OAuthServer.php:388
    989 #: src/Free/Auth/OAuthServer.php:391
    990 msgid "Sign in with an account that can edit this site, or ask an administrator to connect the app."
    991 msgstr ""
    992 
    993 #: src/Free/Auth/OAuthServer.php:374
    994 msgid "This consent form expired."
    995 msgstr ""
    996 
    997 #: src/Free/Auth/OAuthServer.php:381
    9981004msgid "Choose whether to approve or refuse this connection."
    9991005msgstr ""
    10001006
    1001 #: src/Free/Auth/OAuthServer.php:388
     1007#: src/Free/Auth/OAuthServer.php:395
    10021008msgid "Your WordPress user cannot grant read access."
    10031009msgstr ""
    10041010
    1005 #: src/Free/Auth/OAuthServer.php:391
     1011#: src/Free/Auth/OAuthServer.php:398
    10061012msgid "Your WordPress user cannot grant write access."
    10071013msgstr ""
    10081014
    1009 #: src/Free/Auth/OAuthServer.php:395
    1010 #: assets/free/js/admin.js:2753
     1015#: src/Free/Auth/OAuthServer.php:402
     1016#: assets/free/js/admin.js:2769
    10111017msgid "Try again in a moment."
    10121018msgstr ""
    10131019
    1014 #: src/Free/Auth/OAuthServer.php:404
     1020#: src/Free/Auth/OAuthServer.php:411
    10151021msgid "Select at least one requested permission."
    10161022msgstr ""
    10171023
    1018 #: src/Free/Auth/OAuthServer.php:413
     1024#: src/Free/Auth/OAuthServer.php:420
    10191025msgid "Select only permissions requested by this client."
    10201026msgstr ""
    10211027
    1022 #: src/Free/Auth/OAuthServer.php:438
     1028#: src/Free/Auth/OAuthServer.php:445
    10231029msgid "The OAuth request is invalid or uses an unsupported resource, redirect, or PKCE method."
    10241030msgstr ""
    10251031
    1026 #: src/Free/Auth/OAuthServer.php:447
     1032#: src/Free/Auth/OAuthServer.php:454
    10271033msgid "The client or exact redirect URI is not registered."
    10281034msgstr ""
    10291035
    1030 #: src/Free/Auth/OAuthServer.php:452
     1036#: src/Free/Auth/OAuthServer.php:459
    10311037msgid "The client requested an unsupported Llamly scope."
    10321038msgstr ""
    10331039
    1034 #: src/Free/Auth/OAuthServer.php:474
     1040#: src/Free/Auth/OAuthServer.php:481
    10351041msgid "A secure authorization code could not be created."
    10361042msgstr ""
    10371043
    1038 #: src/Free/Auth/OAuthServer.php:479
     1044#: src/Free/Auth/OAuthServer.php:486
    10391045msgid "The authorization grant transaction could not start."
    10401046msgstr ""
    10411047
    1042 #: src/Free/Auth/OAuthServer.php:510
     1048#: src/Free/Auth/OAuthServer.php:517
    10431049msgid "The authorization grant and its audit record could not be stored."
    10441050msgstr ""
    10451051
    1046 #: src/Free/Auth/OAuthServer.php:526
     1052#: src/Free/Auth/OAuthServer.php:533
    10471053msgid "Send OAuth token parameters."
    10481054msgstr ""
    10491055
    1050 #: src/Free/Auth/OAuthServer.php:534
     1056#: src/Free/Auth/OAuthServer.php:541
    10511057msgid "Only authorization_code and refresh_token grants are supported."
    10521058msgstr ""
    10531059
    1054 #: src/Free/Auth/OAuthServer.php:559
     1060#: src/Free/Auth/OAuthServer.php:566
    10551061msgid "The authorization code, PKCE verifier, redirect, or resource is invalid."
    10561062msgstr ""
    10571063
    1058 #: src/Free/Auth/OAuthServer.php:563
     1064#: src/Free/Auth/OAuthServer.php:570
    10591065msgid "The authorization-code transaction could not start."
    10601066msgstr ""
    10611067
    1062 #: src/Free/Auth/OAuthServer.php:577
     1068#: src/Free/Auth/OAuthServer.php:584
    10631069msgid "The authorization-code record could not be read."
    10641070msgstr ""
    10651071
    1066 #: src/Free/Auth/OAuthServer.php:581
     1072#: src/Free/Auth/OAuthServer.php:588
    10671073msgid "The authorization code was already used; tokens issued from it have been revoked."
    10681074msgstr ""
    10691075
    1070 #: src/Free/Auth/OAuthServer.php:590
     1076#: src/Free/Auth/OAuthServer.php:597
    10711077msgid "The authorization code is invalid, expired, or already used."
    10721078msgstr ""
    10731079
    1074 #: src/Free/Auth/OAuthServer.php:595
     1080#: src/Free/Auth/OAuthServer.php:602
    10751081msgid "The PKCE verifier does not match the authorization request."
    10761082msgstr ""
    10771083
    1078 #: src/Free/Auth/OAuthServer.php:606
     1084#: src/Free/Auth/OAuthServer.php:613
    10791085msgid "The authorization code was already consumed."
    10801086msgstr ""
    10811087
    1082 #: src/Free/Auth/OAuthServer.php:616
     1088#: src/Free/Auth/OAuthServer.php:623
    10831089msgid "The token response could not be saved with its audit record."
    10841090msgstr ""
    10851091
    1086 #: src/Free/Auth/OAuthServer.php:629
     1092#: src/Free/Auth/OAuthServer.php:636
    10871093msgid "The refresh token, client, or resource is invalid."
    10881094msgstr ""
    10891095
    1090 #: src/Free/Auth/OAuthServer.php:633
     1096#: src/Free/Auth/OAuthServer.php:640
    10911097msgid "The refresh-token transaction could not start."
    10921098msgstr ""
    10931099
    1094 #: src/Free/Auth/OAuthServer.php:647
     1100#: src/Free/Auth/OAuthServer.php:654
    10951101msgid "The refresh-token record could not be read."
    10961102msgstr ""
    10971103
    1098 #: src/Free/Auth/OAuthServer.php:651
     1104#: src/Free/Auth/OAuthServer.php:658
    10991105msgid "Refresh token reuse was detected; the token family has been revoked."
    11001106msgstr ""
    11011107
    1102 #: src/Free/Auth/OAuthServer.php:659
     1108#: src/Free/Auth/OAuthServer.php:666
    11031109msgid "The refresh token is invalid, expired, or revoked."
    11041110msgstr ""
    11051111
    1106 #: src/Free/Auth/OAuthServer.php:669
     1112#: src/Free/Auth/OAuthServer.php:676
    11071113msgid "The refresh token was already consumed."
    11081114msgstr ""
    11091115
    1110 #: src/Free/Auth/OAuthServer.php:675
     1116#: src/Free/Auth/OAuthServer.php:682
    11111117msgid "The refreshed token pair could not be saved with its audit record."
    11121118msgstr ""
    11131119
    1114 #: src/Free/Auth/OAuthServer.php:695
     1120#: src/Free/Auth/OAuthServer.php:702
    11151121msgid "Token reuse was detected, but revocation could not be saved."
    11161122msgstr ""
    11171123
    1118 #: src/Free/Auth/OAuthServer.php:704
     1124#: src/Free/Auth/OAuthServer.php:711
    11191125msgid "Token reuse was detected, but revocation could not be committed with its audit record."
    11201126msgstr ""
    11211127
    1122 #: src/Free/Auth/OAuthServer.php:717
     1128#: src/Free/Auth/OAuthServer.php:724
    11231129msgid "Secure access tokens could not be created."
    11241130msgstr ""
    11251131
    1126 #: src/Free/Auth/OAuthServer.php:725
     1132#: src/Free/Auth/OAuthServer.php:732
    11271133msgid "The grant does not contain a valid scope."
    11281134msgstr ""
    11291135
    1130 #: src/Free/Auth/OAuthServer.php:754
     1136#: src/Free/Auth/OAuthServer.php:761
    11311137msgid "The token pair could not be stored."
    11321138msgstr ""
    11331139
    1134 #: src/Free/Auth/OAuthServer.php:784
     1140#: src/Free/Auth/OAuthServer.php:791
    11351141msgid "The revocation transaction could not start."
    11361142msgstr ""
    11371143
    1138 #: src/Free/Auth/OAuthServer.php:794
     1144#: src/Free/Auth/OAuthServer.php:801
    11391145msgid "The token record could not be read."
    11401146msgstr ""
    11411147
    1142 #: src/Free/Auth/OAuthServer.php:804
     1148#: src/Free/Auth/OAuthServer.php:811
    11431149msgid "The grant could not be revoked."
    11441150msgstr ""
    11451151
    1146 #: src/Free/Auth/OAuthServer.php:881
     1152#: src/Free/Auth/OAuthServer.php:888
    11471153msgid "Llamly is not ready to authorize new clients."
    11481154msgstr ""
    … …  
    11921198msgstr ""
    11931199
    1194 #: src/Free/Core/Plugin.php:247
     1200#: src/Free/Core/Plugin.php:246
    11951201msgid "You are not allowed to do this."
    11961202msgstr ""
    11971203
     1204#: src/Free/Core/Plugin.php:364
     1205msgid "Llamly database setup is incomplete. MCP requests and the admin interface are paused until the schema is verified."
     1206msgstr ""
     1207
     1208#. translators: %s: internal error code.
    11981209#: src/Free/Core/Plugin.php:365
    1199 msgid "Llamly database setup is incomplete. MCP requests and the admin interface are paused until the schema is verified."
    1200 msgstr ""
    1201 
    1202 #. translators: %s: internal error code.
    1203 #: src/Free/Core/Plugin.php:366
    12041210#, php-format
    12051211msgid "Last error: %s"
    12061212msgstr ""
    12071213
    1208 #: src/Free/Core/Plugin.php:371
     1214#: src/Free/Core/Plugin.php:370
    12091215msgid "Continue without a backup"
    12101216msgstr ""
    … …  
    13971403#: src/Free/History/Adapters/GlobalStylesObject.php:285
    13981404#: src/Free/History/Engine.php:1644
    1399 #: assets/free/js/admin.js:2082
     1405#: assets/free/js/admin.js:2098
    14001406msgid "Global styles"
    14011407msgstr ""
    … …  
    14641470msgstr ""
    14651471
    1466 #: src/Free/History/Adapters/MediaObject.php:325
     1472#: src/Free/History/Adapters/MediaObject.php:326
    14671473msgid "WordPress did not delete the media item."
    14681474msgstr ""
    14691475
    1470 #: src/Free/History/Adapters/MediaObject.php:367
     1476#: src/Free/History/Adapters/MediaObject.php:368
    14711477msgid "The retained files of this media item are no longer available, so it cannot be restored."
    14721478msgstr ""
    14731479
    1474 #: src/Free/History/Adapters/MediaObject.php:371
     1480#: src/Free/History/Adapters/MediaObject.php:372
    14751481#: src/Free/History/RawRows.php:102
    14761482msgid "Another item now uses the original identifier, so it cannot be restored."
    14771483msgstr ""
    14781484
    1479 #: src/Free/History/Adapters/MediaObject.php:385
     1485#: src/Free/History/Adapters/MediaObject.php:386
    14801486msgid "The files of this media item changed, so its details cannot be restored."
    14811487msgstr ""
    14821488
    1483 #: src/Free/History/Adapters/MediaObject.php:390
     1489#: src/Free/History/Adapters/MediaObject.php:391
    14841490msgid "The media row could not be restored."
    14851491msgstr ""
    14861492
    1487 #: src/Free/History/Adapters/MediaObject.php:406
     1493#: src/Free/History/Adapters/MediaObject.php:407
    14881494msgid "The media item now has files the upload did not create, so the upload cannot be undone."
    14891495msgstr ""
    14901496
    1491 #: src/Free/History/Adapters/MediaObject.php:419
     1497#: src/Free/History/Adapters/MediaObject.php:420
    14921498msgid "A post that used this media item as featured image now has another featured image."
    14931499msgstr ""
    14941500
    1495 #: src/Free/History/Adapters/MediaObject.php:425
     1501#: src/Free/History/Adapters/MediaObject.php:426
    14961502msgid "The site icon was changed after this media item was removed."
    14971503msgstr ""
    14981504
    1499 #: src/Free/History/Adapters/MediaObject.php:431
     1505#: src/Free/History/Adapters/MediaObject.php:432
    15001506msgid "The site logo was changed after this media item was removed."
    15011507msgstr ""
    15021508
    1503 #: src/Free/History/Adapters/MediaObject.php:438
     1509#: src/Free/History/Adapters/MediaObject.php:439
    15041510msgid "The logo, header or background image of the theme was changed after this media item was removed."
    15051511msgstr ""
    15061512
    1507 #: src/Free/History/Adapters/MediaObject.php:457
     1513#: src/Free/History/Adapters/MediaObject.php:458
    15081514msgid "A featured image link could not be restored."
    15091515msgstr ""
    15101516
    1511 #: src/Free/History/Adapters/MediaObject.php:475
     1517#: src/Free/History/Adapters/MediaObject.php:477
    15121518msgid "A journaled theme setting could not be read."
    15131519msgstr ""
    15141520
    1515 #: src/Free/History/Adapters/MediaObject.php:492
     1521#: src/Free/History/Adapters/MediaObject.php:494
    15161522msgid "A term used by this media item no longer exists."
    15171523msgstr ""
    15181524
    1519 #: src/Free/History/Adapters/MediaObject.php:502
    1520 #: src/Free/History/Adapters/MediaObject.php:507
     1525#: src/Free/History/Adapters/MediaObject.php:504
     1526#: src/Free/History/Adapters/MediaObject.php:509
    15211527msgid "Media terms could not be restored."
    15221528msgstr ""
    15231529
    1524 #: src/Free/History/Adapters/MediaObject.php:607
     1530#: src/Free/History/Adapters/MediaObject.php:609
    15251531#: src/Free/History/Adapters/PostObject.php:587
    15261532#: src/Free/History/Engine.php:1652
    … …  
    15281534msgstr ""
    15291535
    1530 #: src/Free/History/Adapters/MediaObject.php:714
     1536#: src/Free/History/Adapters/MediaObject.php:716
    15311537msgid "The file is empty."
    15321538msgstr ""
    15331539
    15341540#. translators: %s: maximum upload size, formatted.
    1535 #: src/Free/History/Adapters/MediaObject.php:717
     1541#: src/Free/History/Adapters/MediaObject.php:719
    15361542#, php-format
    15371543msgid "The file is larger than the upload limit of %s."
    15381544msgstr ""
    15391545
    1540 #: src/Free/History/Adapters/MediaObject.php:730
     1546#: src/Free/History/Adapters/MediaObject.php:732
    15411547msgid "This file type is not allowed or its content does not match its extension."
    15421548msgstr ""
    15431549
    1544 #: src/Free/History/Adapters/MediaObject.php:735
     1550#: src/Free/History/Adapters/MediaObject.php:737
    15451551msgid "The file contains markup or code and is not accepted as media."
    15461552msgstr ""
    15471553
    1548 #: src/Free/History/Adapters/MediaObject.php:761
     1554#: src/Free/History/Adapters/MediaObject.php:763
    15491555msgid "Use a plain file name of 1 to 200 characters without folders."
    15501556msgstr ""
    15511557
    1552 #: src/Free/History/Adapters/MediaObject.php:770
     1558#: src/Free/History/Adapters/MediaObject.php:772
    15531559msgid "Hidden files and server configuration files are not accepted."
    15541560msgstr ""
    15551561
    1556 #: src/Free/History/Adapters/MediaObject.php:774
     1562#: src/Free/History/Adapters/MediaObject.php:776
    15571563msgid "The file name needs an extension."
    15581564msgstr ""
    15591565
    1560 #: src/Free/History/Adapters/MediaObject.php:778
     1566#: src/Free/History/Adapters/MediaObject.php:780
    15611567msgid "Executable, script, markup and SVG files (also as a double extension) are not accepted."
    15621568msgstr ""
    … …  
    15701576msgstr ""
    15711577
    1572 #: src/Free/History/Adapters/MenuObject.php:139
     1578#: src/Free/History/Adapters/MenuObject.php:140
    15731579msgid "The automatic page setting of the menu could not be saved."
    15741580msgstr ""
    15751581
    1576 #: src/Free/History/Adapters/MenuObject.php:159
    1577 #: src/Free/History/Adapters/MenuObject.php:476
     1582#: src/Free/History/Adapters/MenuObject.php:160
     1583#: src/Free/History/Adapters/MenuObject.php:477
    15781584#: src/Free/Tools/MenuTools.php:148
    15791585#: src/Free/Tools/MenuTools.php:369
    … …  
    15811587msgstr ""
    15821588
    1583 #: src/Free/History/Adapters/MenuObject.php:162
     1589#: src/Free/History/Adapters/MenuObject.php:163
    15841590msgid "This menu has too many items to delete reversibly."
    15851591msgstr ""
    15861592
    1587 #: src/Free/History/Adapters/MenuObject.php:185
     1593#: src/Free/History/Adapters/MenuObject.php:186
    15881594msgid "This menu carries protected metadata that cannot be journaled, so it cannot be changed reversibly."
    15891595msgstr ""
    15901596
    15911597#. translators: %d: maximum number of menu items.
    1592 #: src/Free/History/Adapters/MenuObject.php:203
     1598#: src/Free/History/Adapters/MenuObject.php:204
    15931599#: src/Free/Tools/MenuTools.php:323
    15941600#, php-format
    … …  
    15971603
    15981604#. translators: %d: maximum nesting depth.
    1599 #: src/Free/History/Adapters/MenuObject.php:210
     1605#: src/Free/History/Adapters/MenuObject.php:211
    16001606#: src/Free/Tools/MenuTools.php:320
    16011607#, php-format
    … …  
    16031609msgstr ""
    16041610
    1605 #: src/Free/History/Adapters/MenuObject.php:214
     1611#: src/Free/History/Adapters/MenuObject.php:215
    16061612msgid "invalid parent reference."
    16071613msgstr ""
    16081614
    1609 #: src/Free/History/Adapters/MenuObject.php:220
     1615#: src/Free/History/Adapters/MenuObject.php:221
    16101616msgid "db_id is not an item of this menu."
    16111617msgstr ""
    16121618
    1613 #: src/Free/History/Adapters/MenuObject.php:223
     1619#: src/Free/History/Adapters/MenuObject.php:224
    16141620msgid "the same db_id appears twice."
    16151621msgstr ""
    16161622
    1617 #: src/Free/History/Adapters/MenuObject.php:250
     1623#: src/Free/History/Adapters/MenuObject.php:251
    16181624msgid "unknown item type."
    16191625msgstr ""
    16201626
    1621 #: src/Free/History/Adapters/MenuObject.php:259
     1627#: src/Free/History/Adapters/MenuObject.php:260
    16221628msgid "the URL must use http, https, mailto or tel (or be relative)."
    16231629msgstr ""
    16241630
    1625 #: src/Free/History/Adapters/MenuObject.php:262
     1631#: src/Free/History/Adapters/MenuObject.php:263
    16261632msgid "a custom link needs a url."
    16271633msgstr ""
    16281634
    1629 #: src/Free/History/Adapters/MenuObject.php:265
     1635#: src/Free/History/Adapters/MenuObject.php:266
    16301636msgid "a custom link needs a title."
    16311637msgstr ""
    16321638
    1633 #: src/Free/History/Adapters/MenuObject.php:273
     1639#: src/Free/History/Adapters/MenuObject.php:274
    16341640msgid "object must be a public post type."
    16351641msgstr ""
    16361642
    1637 #: src/Free/History/Adapters/MenuObject.php:276
     1643#: src/Free/History/Adapters/MenuObject.php:277
    16381644msgid "object_id is not an existing item of that post type."
    16391645msgstr ""
    16401646
    1641 #: src/Free/History/Adapters/MenuObject.php:279
     1647#: src/Free/History/Adapters/MenuObject.php:280
    16421648msgid "the connected user cannot read the target item."
    16431649msgstr ""
    16441650
    1645 #: src/Free/History/Adapters/MenuObject.php:283
     1651#: src/Free/History/Adapters/MenuObject.php:284
    16461652msgid "object must be a taxonomy that menus can link to."
    16471653msgstr ""
    16481654
    1649 #: src/Free/History/Adapters/MenuObject.php:287
     1655#: src/Free/History/Adapters/MenuObject.php:288
    16501656msgid "object_id is not an existing term of that taxonomy."
    16511657msgstr ""
    16521658
    1653 #: src/Free/History/Adapters/MenuObject.php:292
     1659#: src/Free/History/Adapters/MenuObject.php:293
    16541660msgid "object must be a post type with an archive."
    16551661msgstr ""
    16561662
    1657 #: src/Free/History/Adapters/MenuObject.php:298
     1663#: src/Free/History/Adapters/MenuObject.php:299
    16581664msgid "target must be empty or _blank."
    16591665msgstr ""
    16601666
    1661 #: src/Free/History/Adapters/MenuObject.php:359
     1667#: src/Free/History/Adapters/MenuObject.php:360
    16621668msgid "The menu could not be read from the database."
    16631669msgstr ""
    16641670
    1665 #: src/Free/History/Adapters/MenuObject.php:366
     1671#: src/Free/History/Adapters/MenuObject.php:367
    16661672msgid "The menu metadata could not be read from the database."
    16671673msgstr ""
    16681674
    1669 #: src/Free/History/Adapters/MenuObject.php:374
     1675#: src/Free/History/Adapters/MenuObject.php:375
    16701676msgid "The menu items could not be read from the database."
    16711677msgstr ""
    16721678
    1673 #: src/Free/History/Adapters/MenuObject.php:420
     1679#: src/Free/History/Adapters/MenuObject.php:421
    16741680msgid "The menu item metadata could not be read from the database."
    16751681msgstr ""
    16761682
    1677 #: src/Free/History/Adapters/MenuObject.php:462
     1683#: src/Free/History/Adapters/MenuObject.php:463
    16781684#: src/Free/History/Adapters/TermObject.php:234
    16791685msgid "The creation marker could not be stored."
    16801686msgstr ""
    16811687
    1682 #: src/Free/History/Adapters/MenuObject.php:506
     1688#: src/Free/History/Adapters/MenuObject.php:507
    16831689msgid "Unknown menu operation."
    16841690msgstr ""
    16851691
    16861692#. translators: %s: menu location slug.
    1687 #: src/Free/History/Adapters/MenuObject.php:527
     1693#: src/Free/History/Adapters/MenuObject.php:528
    16881694#, php-format
    16891695msgid "The theme does not register the menu location \"%s\"."
    16901696msgstr ""
    16911697
    1692 #: src/Free/History/Adapters/MenuObject.php:556
     1698#: src/Free/History/Adapters/MenuObject.php:557
    16931699msgid "This menu has too many items to rewrite reversibly."
    16941700msgstr ""
    16951701
    1696 #: src/Free/History/Adapters/MenuObject.php:598
     1702#: src/Free/History/Adapters/MenuObject.php:599
    16971703msgid "WordPress did not save a menu item."
    16981704msgstr ""
    16991705
    1700 #: src/Free/History/Adapters/MenuObject.php:606
     1706#: src/Free/History/Adapters/MenuObject.php:607
    17011707msgid "WordPress did not remove a menu item."
    17021708msgstr ""
    17031709
    1704 #: src/Free/History/Adapters/MenuObject.php:618
     1710#: src/Free/History/Adapters/MenuObject.php:619
    17051711msgid "The menu order could not be saved."
    17061712msgstr ""
    17071713
    1708 #: src/Free/History/Adapters/MenuObject.php:655
     1714#: src/Free/History/Adapters/MenuObject.php:656
    17091715msgid "WordPress did not delete the menu."
    17101716msgstr ""
    17111717
    1712 #: src/Free/History/Adapters/MenuObject.php:662
     1718#: src/Free/History/Adapters/MenuObject.php:663
    17131719msgid "WordPress left menu items behind, so the delete was cancelled."
    17141720msgstr ""
    17151721
    1716 #: src/Free/History/Adapters/MenuObject.php:688
     1722#: src/Free/History/Adapters/MenuObject.php:689
    17171723msgid "Another menu now uses this slug."
    17181724msgstr ""
    17191725
    1720 #: src/Free/History/Adapters/MenuObject.php:695
     1726#: src/Free/History/Adapters/MenuObject.php:696
    17211727msgid "Leftover relationships already use this menu identifier."
    17221728msgstr ""
    17231729
    1724 #: src/Free/History/Adapters/MenuObject.php:700
     1730#: src/Free/History/Adapters/MenuObject.php:701
    17251731msgid "The menu was recreated with another identifier."
    17261732msgstr ""
    17271733
    1728 #: src/Free/History/Adapters/MenuObject.php:705
     1734#: src/Free/History/Adapters/MenuObject.php:706
    17291735msgid "The menu rows could not be restored."
    17301736msgstr ""
    17311737
    1732 #: src/Free/History/Adapters/MenuObject.php:736
     1738#: src/Free/History/Adapters/MenuObject.php:737
    17331739msgid "A menu item could not be restored."
    17341740msgstr ""
    17351741
    1736 #: src/Free/History/Adapters/MenuObject.php:742
     1742#: src/Free/History/Adapters/MenuObject.php:743
    17371743msgid "Leftover relationships already use a menu item identifier."
    17381744msgstr ""
    17391745
    1740 #: src/Free/History/Adapters/MenuObject.php:749
     1746#: src/Free/History/Adapters/MenuObject.php:750
    17411747msgid "A menu item relationship could not be restored."
    17421748msgstr ""
    17431749
    1744 #: src/Free/History/Adapters/MenuObject.php:774
     1750#: src/Free/History/Adapters/MenuObject.php:775
    17451751msgid "A menu item could not be removed."
    17461752msgstr ""
    17471753
    1748 #: src/Free/History/Adapters/MenuObject.php:833
     1754#: src/Free/History/Adapters/MenuObject.php:834
    17491755msgid "The active theme changed, so the menu locations cannot be restored."
    17501756msgstr ""
    17511757
    17521758#. translators: %s: menu location slug.
    1753 #: src/Free/History/Adapters/MenuObject.php:856
     1759#: src/Free/History/Adapters/MenuObject.php:857
    17541760#, php-format
    17551761msgid "The menu location \"%s\" is now used by another menu."
    17561762msgstr ""
    17571763
    1758 #: src/Free/History/Adapters/MenuObject.php:998
     1764#: src/Free/History/Adapters/MenuObject.php:999
    17591765#: src/Free/History/Engine.php:1646
    17601766msgid "(menu)"
    17611767msgstr ""
    17621768
    1763 #: src/Free/History/Adapters/MenuObject.php:1066
     1769#: src/Free/History/Adapters/MenuObject.php:1067
    17641770msgid "The active theme is a block theme and does not display classic menus; its navigation lives in wp_navigation posts."
    17651771msgstr ""
    … …  
    17691775msgstr ""
    17701776
    1771 #: src/Free/History/Adapters/OptionObject.php:97
     1777#: src/Free/History/Adapters/OptionObject.php:98
    17721778msgid "WordPress did not save the option."
    17731779msgstr ""
    17741780
    1775 #: src/Free/History/Adapters/OptionObject.php:109
     1781#: src/Free/History/Adapters/OptionObject.php:110
    17761782msgid "The option snapshot does not match this option."
    17771783msgstr ""
    17781784
    1779 #: src/Free/History/Adapters/OptionObject.php:115
     1785#: src/Free/History/Adapters/OptionObject.php:116
    17801786msgid "The option could not be removed."
    17811787msgstr ""
    17821788
    1783 #: src/Free/History/Adapters/OptionObject.php:131
     1789#: src/Free/History/Adapters/OptionObject.php:132
    17841790msgid "The option row could not be restored."
    17851791msgstr ""
    17861792
    1787 #: src/Free/History/Adapters/OptionObject.php:173
     1793#: src/Free/History/Adapters/OptionObject.php:174
    17881794#: src/Free/History/Engine.php:1648
    1789 #: assets/free/js/admin.js:2205
     1795#: assets/free/js/admin.js:2221
    17901796msgid "Site option"
    17911797msgstr ""
    … …  
    20872093#: src/Free/History/Adapters/TermObject.php:570
    20882094#: src/Free/History/Engine.php:1656
    2089 #: assets/free/js/admin.js:2205
     2095#: assets/free/js/admin.js:2221
    20902096msgid "(unnamed term)"
    20912097msgstr ""
    … …  
    27722778msgstr ""
    27732779
    2774 #: src/Free/Mcp/Endpoint.php:45
     2780#: src/Free/Mcp/Endpoint.php:77
     2781msgid "The access token is not issued for this MCP endpoint."
     2782msgstr ""
     2783
     2784#: src/Free/Mcp/Endpoint.php:156
    27752785msgid "Llamly is updating its database. Try again in a few seconds."
    27762786msgstr ""
    27772787
    2778 #: src/Free/Mcp/Protocol.php:51
    2779 msgid "The access token is not issued for this MCP endpoint."
    2780 msgstr ""
    2781 
    2782 #: src/Free/Mcp/Protocol.php:55
     2788#: src/Free/Mcp/Protocol.php:67
    27832789msgid "The requested MCP protocol version is not supported."
    27842790msgstr ""
    27852791
    2786 #: src/Free/Mcp/Protocol.php:335
     2792#: src/Free/Mcp/Protocol.php:347
    27872793msgid "Connect with an OAuth connector or a scoped Bearer key. Keys are shown only once. Verify client calls in Activity and revoke a key to deny the next request."
    27882794msgstr ""
    27892795
    2790 #: src/Free/Mcp/Protocol.php:336
     2796#: src/Free/Mcp/Protocol.php:348
    27912797msgid "Use read-only access unless writing is needed. Every write must have a durable journal entry, pass the WordPress user capability check, and include the current post revision hash. If storage or concurrency checks fail, Llamly stops before reporting success."
    27922798msgstr ""
    27932799
    2794 #: src/Free/Mcp/Protocol.php:352
     2800#: src/Free/Mcp/Protocol.php:364
    27952801msgid "Review available draft posts without changing them."
    27962802msgstr ""
    27972803
    2798 #: src/Free/Mcp/Protocol.php:362
     2804#: src/Free/Mcp/Protocol.php:374
    27992805msgid "Review posts that are accessible to this connection."
    28002806msgstr ""
    28012807
    2802 #: src/Free/Mcp/Protocol.php:371
     2808#: src/Free/Mcp/Protocol.php:383
    28032809msgid "Connection and access"
    28042810msgstr ""
    28052811
    2806 #: src/Free/Mcp/Protocol.php:372
     2812#: src/Free/Mcp/Protocol.php:384
    28072813msgid "Writing safety"
    28082814msgstr ""
    … …  
    35533559msgstr ""
    35543560
    3555 #: src/Free/Tools/UserTools.php:58
     3561#: src/Free/Tools/UserTools.php:60
    35563562msgid "Unknown role."
    35573563msgstr ""
    35583564
    3559 #: src/Free/Tools/UserTools.php:90
     3565#: src/Free/Tools/UserTools.php:93
    35603566msgid "Send exactly one of user_id, login or email."
    35613567msgstr ""
    35623568
    3563 #: src/Free/Tools/UserTools.php:98
     3569#: src/Free/Tools/UserTools.php:101
    35643570msgid "The user was not found."
    35653571msgstr ""
    35663572
    3567 #: src/Free/Tools/UserTools.php:102
     3573#: src/Free/Tools/UserTools.php:105
    35683574msgid "The connected user cannot view this user's profile."
    35693575msgstr ""
    … …  
    40014007#: assets/free/js/admin.js:449
    40024008#: assets/free/js/admin.js:1528
    4003 #: assets/free/js/admin.js:2295
     4009#: assets/free/js/admin.js:2311
    40044010msgid "Try again"
    40054011msgstr ""
    … …  
    40484054
    40494055#: assets/free/js/admin.js:517
    4050 #: assets/free/js/admin.js:2080
     4056#: assets/free/js/admin.js:2096
    40514057msgid "Media"
    40524058msgstr ""
    … …  
    46214627#. translators: %d: number of tools.
    46224628#: assets/free/js/admin.js:947
    4623 #: assets/free/js/admin.js:2006
     4629#: assets/free/js/admin.js:2021
    46244630#, js-format
    46254631msgid "%d tool"
    … …  
    50265032#: assets/free/js/admin.js:1366
    50275033#: assets/free/js/admin.js:1598
    5028 #: assets/free/js/admin.js:2172
    5029 #: assets/free/js/admin.js:2664
     5034#: assets/free/js/admin.js:2188
     5035#: assets/free/js/admin.js:2680
    50305036msgid "Try again."
    50315037msgstr ""
    … …  
    51745180
    51755181#: assets/free/js/admin.js:1451
    5176 #: assets/free/js/admin.js:2516
     5182#: assets/free/js/admin.js:2532
    51775183msgid "Change undone"
    51785184msgstr ""
    51795185
    51805186#: assets/free/js/admin.js:1451
    5181 #: assets/free/js/admin.js:2517
    5182 #: assets/free/js/admin.js:2520
     5187#: assets/free/js/admin.js:2533
     5188#: assets/free/js/admin.js:2536
    51835189msgid "Change redone"
    51845190msgstr ""
    … …  
    52955301
    52965302#: assets/free/js/admin.js:1534
    5297 #: assets/free/js/admin.js:2301
     5303#: assets/free/js/admin.js:2317
    52985304msgid "Nothing found"
    52995305msgstr ""
    … …  
    53045310
    53055311#: assets/free/js/admin.js:1535
    5306 #: assets/free/js/admin.js:2302
     5312#: assets/free/js/admin.js:2318
    53075313msgid "Clear filters"
    53085314msgstr ""
    … …  
    53305336#. translators: %s: connection name.
    53315337#: assets/free/js/admin.js:1560
    5332 #: assets/free/js/admin.js:2336
     5338#: assets/free/js/admin.js:2352
    53335339msgid "All connections"
    53345340msgstr ""
    … …  
    53365342#. translators: %s: connection name.
    53375343#: assets/free/js/admin.js:1561
    5338 #: assets/free/js/admin.js:2331
     5344#: assets/free/js/admin.js:2347
    53395345#, js-format
    53405346msgid "%s (revoked)"
    … …  
    53475353
    53485354#: assets/free/js/admin.js:1571
    5349 #: assets/free/js/admin.js:2359
     5355#: assets/free/js/admin.js:2375
    53505356msgid "Filter by connection"
    53515357msgstr ""
    … …  
    55735579
    55745580#: assets/free/js/admin.js:1801
    5575 #: assets/free/js/admin.js:2199
    5576 #: assets/free/js/admin.js:2508
     5581#: assets/free/js/admin.js:2215
     5582#: assets/free/js/admin.js:2524
    55775583msgid "Undo"
    55785584msgstr ""
    … …  
    58405846msgstr ""
    58415847
    5842 #: assets/free/js/admin.js:1988
     5848#: assets/free/js/admin.js:1994
     5849msgid "Everything on these screens is free and stays free."
     5850msgstr ""
     5851
     5852#: assets/free/js/admin.js:1996
     5853msgid "Llamly Pro is a separate add-on with extra modules for your agent. The first one, Llamly Builder, builds pages in Elementor and in the block editor."
     5854msgstr ""
     5855
     5856#: assets/free/js/admin.js:1998
     5857msgid "Learn about Llamly Pro"
     5858msgstr ""
     5859
     5860#: assets/free/js/admin.js:1999
     5861msgid "Coming soon."
     5862msgstr ""
     5863
     5864#: assets/free/js/admin.js:2003
    58435865msgid "About"
    58445866msgstr ""
    58455867
    5846 #: assets/free/js/admin.js:2001
     5868#: assets/free/js/admin.js:2016
    58475869msgid "MCP endpoint"
    58485870msgstr ""
    58495871
    5850 #: assets/free/js/admin.js:2001
     5872#: assets/free/js/admin.js:2016
    58515873msgid "Theme"
    58525874msgstr ""
    58535875
    5854 #: assets/free/js/admin.js:2002
    5855 #: assets/free/js/admin.js:2020
     5876#: assets/free/js/admin.js:2017
     5877#: assets/free/js/admin.js:2035
    58565878msgid "Documentation"
    58575879msgstr ""
    58585880
    5859 #: assets/free/js/admin.js:2003
     5881#: assets/free/js/admin.js:2018
    58605882msgid "Support forum on WordPress.org"
    58615883msgstr ""
    58625884
    5863 #: assets/free/js/admin.js:2003
     5885#: assets/free/js/admin.js:2018
    58645886msgid "Report a problem"
    58655887msgstr ""
    58665888
    58675889#. translators: %d: number of site areas.
    5868 #: assets/free/js/admin.js:2008
     5890#: assets/free/js/admin.js:2023
    58695891#, js-format
    58705892msgid "%d area"
    … …  
    58745896
    58755897#. translators: 1: "N tools", 2: "N areas".
    5876 #: assets/free/js/admin.js:2010
     5898#: assets/free/js/admin.js:2025
    58775899#, js-format
    58785900msgid "%1$s in %2$s of the site."
    58795901msgstr ""
    58805902
    5881 #: assets/free/js/admin.js:2013
     5903#: assets/free/js/admin.js:2028
    58825904msgid "Llamly turns your WordPress into an MCP server"
    58835905msgstr ""
    58845906
    5885 #: assets/free/js/admin.js:2015
     5907#: assets/free/js/admin.js:2030
    58865908msgid "AI agents read and edit the site with the permissions you give them. Almost every change stays in the history and can be undone."
    58875909msgstr ""
    58885910
    5889 #: assets/free/js/admin.js:2018
    5890 #: assets/free/js/admin.js:2353
     5911#: assets/free/js/admin.js:2033
     5912#: assets/free/js/admin.js:2369
    58915913msgid "Connect an agent"
    58925914msgstr ""
    58935915
    5894 #: assets/free/js/admin.js:2021
     5916#: assets/free/js/admin.js:2036
    58955917msgid "Getting started"
    58965918msgstr ""
    58975919
    5898 #: assets/free/js/admin.js:2025
     5920#: assets/free/js/admin.js:2040
    58995921msgid "Try asking"
    59005922msgstr ""
    59015923
    5902 #: assets/free/js/admin.js:2026
     5924#: assets/free/js/admin.js:2041
    59035925msgid "Click to copy and paste it into the conversation with your agent."
    59045926msgstr ""
    59055927
    5906 #: assets/free/js/admin.js:2030
     5928#: assets/free/js/admin.js:2045
    59075929msgid "What Llamly can do"
    59085930msgstr ""
    59095931
    5910 #: assets/free/js/admin.js:2032
     5932#: assets/free/js/admin.js:2047
    59115933msgid "Writing is paused on this site; that's why only read tools are shown."
    59125934msgstr ""
    59135935
    5914 #: assets/free/js/admin.js:2036
     5936#: assets/free/js/admin.js:2051
    59155937msgid "The tool catalog is unavailable right now."
    59165938msgstr ""
    59175939
    5918 #: assets/free/js/admin.js:2038
     5940#: assets/free/js/admin.js:2053
    59195941msgid "Elementor detected. In Free, Elementor pages are outside the agent's write reach."
    59205942msgstr ""
    59215943
    5922 #: assets/free/js/admin.js:2041
     5944#: assets/free/js/admin.js:2057
    59235945msgid "Help"
    59245946msgstr ""
    59255947
    5926 #: assets/free/js/admin.js:2045
     5948#: assets/free/js/admin.js:2061
    59275949msgid "System information"
    59285950msgstr ""
    59295951
    5930 #: assets/free/js/admin.js:2046
     5952#: assets/free/js/admin.js:2062
    59315953msgid "Copy information"
    59325954msgstr ""
    59335955
    5934 #: assets/free/js/admin.js:2051
     5956#: assets/free/js/admin.js:2067
    59355957msgid "Prompt copied."
    59365958msgstr ""
    59375959
    5938 #: assets/free/js/admin.js:2053
     5960#: assets/free/js/admin.js:2069
    59395961msgid "Information copied."
    59405962msgstr ""
    59415963
    5942 #: assets/free/js/admin.js:2062
     5964#: assets/free/js/admin.js:2078
    59435965msgid "Created a post"
    59445966msgstr ""
    59455967
    5946 #: assets/free/js/admin.js:2062
     5968#: assets/free/js/admin.js:2078
    59475969msgid "Edited a post"
    59485970msgstr ""
    59495971
    5950 #: assets/free/js/admin.js:2063
     5972#: assets/free/js/admin.js:2079
    59515973msgid "Removed a post"
    59525974msgstr ""
    59535975
    5954 #: assets/free/js/admin.js:2063
     5976#: assets/free/js/admin.js:2079
    59555977msgid "Created a draft"
    59565978msgstr ""
    59575979
    5958 #: assets/free/js/admin.js:2064
     5980#: assets/free/js/admin.js:2080
    59595981msgid "Edited a draft"
    59605982msgstr ""
    59615983
    5962 #: assets/free/js/admin.js:2065
     5984#: assets/free/js/admin.js:2081
    59635985msgid "Restored a revision"
    59645986msgstr ""
    59655987
    5966 #: assets/free/js/admin.js:2065
     5988#: assets/free/js/admin.js:2081
    59675989msgid "Created a term"
    59685990msgstr ""
    59695991
    5970 #: assets/free/js/admin.js:2066
     5992#: assets/free/js/admin.js:2082
    59715993msgid "Edited a term"
    59725994msgstr ""
    59735995
    5974 #: assets/free/js/admin.js:2066
     5996#: assets/free/js/admin.js:2082
    59755997msgid "Deleted a term"
    59765998msgstr ""
    59775999
    5978 #: assets/free/js/admin.js:2067
     6000#: assets/free/js/admin.js:2083
    59796001msgid "Uploaded media"
    59806002msgstr ""
    59816003
    5982 #: assets/free/js/admin.js:2068
     6004#: assets/free/js/admin.js:2084
    59836005msgid "Edited media"
    59846006msgstr ""
    59856007
    5986 #: assets/free/js/admin.js:2068
     6008#: assets/free/js/admin.js:2084
    59876009msgid "Deleted media"
    59886010msgstr ""
    59896011
    5990 #: assets/free/js/admin.js:2069
     6012#: assets/free/js/admin.js:2085
    59916013msgid "Created a menu"
    59926014msgstr ""
    59936015
    5994 #: assets/free/js/admin.js:2069
     6016#: assets/free/js/admin.js:2085
    59956017msgid "Edited a menu"
    59966018msgstr ""
    59976019
    5998 #: assets/free/js/admin.js:2070
     6020#: assets/free/js/admin.js:2086
    59996021msgid "Deleted a menu"
    60006022msgstr ""
    60016023
    6002 #: assets/free/js/admin.js:2070
     6024#: assets/free/js/admin.js:2086
    60036025msgid "Reorganized the menu items"
    60046026msgstr ""
    60056027
    6006 #: assets/free/js/admin.js:2071
     6028#: assets/free/js/admin.js:2087
    60076029msgid "Created a comment"
    60086030msgstr ""
    60096031
    6010 #: assets/free/js/admin.js:2071
     6032#: assets/free/js/admin.js:2087
    60116033msgid "Edited a comment"
    60126034msgstr ""
    60136035
    6014 #: assets/free/js/admin.js:2072
     6036#: assets/free/js/admin.js:2088
    60156037msgid "Deleted a comment"
    60166038msgstr ""
    60176039
    6018 #: assets/free/js/admin.js:2073
     6040#: assets/free/js/admin.js:2089
    60196041msgid "Changed a site setting"
    60206042msgstr ""
    60216043
    6022 #: assets/free/js/admin.js:2074
     6044#: assets/free/js/admin.js:2090
    60236045msgid "Edited blocks"
    60246046msgstr ""
    60256047
    6026 #: assets/free/js/admin.js:2074
     6048#: assets/free/js/admin.js:2090
    60276049msgid "Created a pattern"
    60286050msgstr ""
    60296051
    6030 #: assets/free/js/admin.js:2075
     6052#: assets/free/js/admin.js:2091
    60316053msgid "Edited a pattern"
    60326054msgstr ""
    60336055
    6034 #: assets/free/js/admin.js:2075
     6056#: assets/free/js/admin.js:2091
    60356057msgid "Deleted a pattern"
    60366058msgstr ""
    60376059
    6038 #: assets/free/js/admin.js:2076
     6060#: assets/free/js/admin.js:2092
    60396061msgid "Saved a template"
    60406062msgstr ""
    60416063
    6042 #: assets/free/js/admin.js:2076
     6064#: assets/free/js/admin.js:2092
    60436065msgid "Reset the template to the original"
    60446066msgstr ""
    60456067
    6046 #: assets/free/js/admin.js:2077
     6068#: assets/free/js/admin.js:2093
    60476069msgid "Changed the global styles"
    60486070msgstr ""
    60496071
    6050 #: assets/free/js/admin.js:2079
     6072#: assets/free/js/admin.js:2095
    60516073msgid "Post"
    60526074msgstr ""
    60536075
    6054 #: assets/free/js/admin.js:2079
     6076#: assets/free/js/admin.js:2095
    60556077msgid "Page"
    60566078msgstr ""
    60576079
    6058 #: assets/free/js/admin.js:2079
     6080#: assets/free/js/admin.js:2095
    60596081msgid "Term"
    60606082msgstr ""
    60616083
    6062 #: assets/free/js/admin.js:2080
     6084#: assets/free/js/admin.js:2096
    60636085msgid "Menu"
    60646086msgstr ""
    60656087
    6066 #: assets/free/js/admin.js:2080
     6088#: assets/free/js/admin.js:2096
    60676089msgid "Comment"
    60686090msgstr ""
    60696091
    6070 #: assets/free/js/admin.js:2081
     6092#: assets/free/js/admin.js:2097
    60716093msgid "User"
    60726094msgstr ""
    60736095
    6074 #: assets/free/js/admin.js:2081
     6096#: assets/free/js/admin.js:2097
    60756097msgid "Site setting"
    60766098msgstr ""
    60776099
    6078 #: assets/free/js/admin.js:2081
     6100#: assets/free/js/admin.js:2097
    60796101msgid "Block pattern"
    60806102msgstr ""
    60816103
    6082 #: assets/free/js/admin.js:2082
     6104#: assets/free/js/admin.js:2098
    60836105msgid "Template"
    60846106msgstr ""
    60856107
    6086 #: assets/free/js/admin.js:2084
     6108#: assets/free/js/admin.js:2100
    60876109msgctxt "changed field"
    60886110msgid "title"
    60896111msgstr ""
    60906112
    6091 #: assets/free/js/admin.js:2084
     6113#: assets/free/js/admin.js:2100
    60926114msgctxt "changed field"
    60936115msgid "content"
    60946116msgstr ""
    60956117
    6096 #: assets/free/js/admin.js:2085
     6118#: assets/free/js/admin.js:2101
    60976119msgctxt "changed field"
    60986120msgid "excerpt"
    60996121msgstr ""
    61006122
    6101 #: assets/free/js/admin.js:2085
     6123#: assets/free/js/admin.js:2101
    61026124msgctxt "changed field"
    61036125msgid "status"
    61046126msgstr ""
    61056127
    6106 #: assets/free/js/admin.js:2086
    6107 #: assets/free/js/admin.js:2089
     6128#: assets/free/js/admin.js:2102
     6129#: assets/free/js/admin.js:2105
    61086130msgctxt "changed field"
    61096131msgid "slug"
    61106132msgstr ""
    61116133
    6112 #: assets/free/js/admin.js:2086
     6134#: assets/free/js/admin.js:2102
    61136135msgctxt "changed field"
    61146136msgid "date"
    61156137msgstr ""
    61166138
    6117 #: assets/free/js/admin.js:2087
     6139#: assets/free/js/admin.js:2103
    61186140msgctxt "changed field"
    61196141msgid "parent page"
    61206142msgstr ""
    61216143
    6122 #: assets/free/js/admin.js:2087
     6144#: assets/free/js/admin.js:2103
    61236145msgctxt "changed field"
    61246146msgid "order"
    61256147msgstr ""
    61266148
    6127 #: assets/free/js/admin.js:2088
     6149#: assets/free/js/admin.js:2104
    61286150msgctxt "changed field"
    61296151msgid "author"
    61306152msgstr ""
    61316153
    6132 #: assets/free/js/admin.js:2088
     6154#: assets/free/js/admin.js:2104
    61336155msgctxt "changed field"
    61346156msgid "type"
    61356157msgstr ""
    61366158
    6137 #: assets/free/js/admin.js:2088
     6159#: assets/free/js/admin.js:2104
    61386160msgctxt "changed field"
    61396161msgid "name"
    61406162msgstr ""
    61416163
    6142 #: assets/free/js/admin.js:2089
     6164#: assets/free/js/admin.js:2105
    61436165msgctxt "changed field"
    61446166msgid "description"
    61456167msgstr ""
    61466168
    6147 #: assets/free/js/admin.js:2090
     6169#: assets/free/js/admin.js:2106
    61486170msgctxt "changed field"
    61496171msgid "value"
    61506172msgstr ""
    61516173
    6152 #: assets/free/js/admin.js:2090
     6174#: assets/free/js/admin.js:2106
    61536175msgctxt "changed field"
    61546176msgid "alt text"
    61556177msgstr ""
    61566178
    6157 #: assets/free/js/admin.js:2091
     6179#: assets/free/js/admin.js:2107
    61586180msgctxt "changed field"
    61596181msgid "caption"
    61606182msgstr ""
    61616183
    6162 #: assets/free/js/admin.js:2094
     6184#: assets/free/js/admin.js:2110
    61636185msgid "Force undid"
    61646186msgstr ""
    61656187
    6166 #: assets/free/js/admin.js:2095
    6167 #: assets/free/js/admin.js:2238
     6188#: assets/free/js/admin.js:2111
     6189#: assets/free/js/admin.js:2254
    61686190msgid "Undid a change"
    61696191msgstr ""
    61706192
    6171 #: assets/free/js/admin.js:2096
    6172 #: assets/free/js/admin.js:2238
     6193#: assets/free/js/admin.js:2112
     6194#: assets/free/js/admin.js:2254
    61736195msgid "Redid a change"
    61746196msgstr ""
    61756197
    6176 #: assets/free/js/admin.js:2097
     6198#: assets/free/js/admin.js:2113
    61776199msgid "Created an item"
    61786200msgstr ""
    61796201
    6180 #: assets/free/js/admin.js:2098
     6202#: assets/free/js/admin.js:2114
    61816203msgid "Removed an item"
    61826204msgstr ""
    61836205
    6184 #: assets/free/js/admin.js:2099
     6206#: assets/free/js/admin.js:2115
    61856207msgid "Changed the content"
    61866208msgstr ""
    61876209
    61886210#. translators: %d: number of custom fields.
    6189 #: assets/free/js/admin.js:2108
     6211#: assets/free/js/admin.js:2124
    61906212#, js-format
    61916213msgid "%d custom field"
    … …  
    61946216msgstr[1] ""
    61956217
    6196 #: assets/free/js/admin.js:2109
     6218#: assets/free/js/admin.js:2125
    61976219msgid "categories and tags"
    61986220msgstr ""
    61996221
    62006222#. translators: %s: comma-separated list of changed fields.
    6201 #: assets/free/js/admin.js:2111
     6223#: assets/free/js/admin.js:2127
    62026224#, js-format
    62036225msgid "Changed: %s"
    62046226msgstr ""
    62056227
    6206 #: assets/free/js/admin.js:2123
     6228#: assets/free/js/admin.js:2139
    62076229msgid "Becomes visible to the public"
    62086230msgstr ""
    62096231
    6210 #: assets/free/js/admin.js:2123
     6232#: assets/free/js/admin.js:2139
    62116233msgid "Sensitive data"
    62126234msgstr ""
    62136235
    6214 #: assets/free/js/admin.js:2124
     6236#: assets/free/js/admin.js:2140
    62156237msgid "Removes or replaces content"
    62166238msgstr ""
    62176239
    6218 #: assets/free/js/admin.js:2127
     6240#: assets/free/js/admin.js:2143
    62196241msgid "Pings, feeds, sitemaps, caches and webhooks of third parties are not undone."
    62206242msgstr ""
    62216243
    6222 #: assets/free/js/admin.js:2129
     6244#: assets/free/js/admin.js:2145
    62236245msgid "Pages that embed this synced pattern change for visitors."
    62246246msgstr ""
    62256247
    6226 #: assets/free/js/admin.js:2130
     6248#: assets/free/js/admin.js:2146
    62276249msgid "The whole site changes for visitors; page caches and CDNs are not purged."
    62286250msgstr ""
    62296251
    6230 #: assets/free/js/admin.js:2132
     6252#: assets/free/js/admin.js:2148
    62316253msgid "Every page rendered with this template changes for visitors; page caches and CDNs are not purged."
    62326254msgstr ""
    62336255
    6234 #: assets/free/js/admin.js:2134
     6256#: assets/free/js/admin.js:2150
    62356257msgid "CDN, page and image caches and third-party copies of the file are not undone."
    62366258msgstr ""
    62376259
    6238 #: assets/free/js/admin.js:2136
     6260#: assets/free/js/admin.js:2152
    62396261msgid "Page caches, search engines and feeds may keep the previous value."
    62406262msgstr ""
    62416263
    6242 #: assets/free/js/admin.js:2138
     6264#: assets/free/js/admin.js:2154
    62436265msgctxt "changes filter"
    62446266msgid "All"
    62456267msgstr ""
    62466268
    6247 #: assets/free/js/admin.js:2138
     6269#: assets/free/js/admin.js:2154
    62486270msgctxt "changes filter"
    62496271msgid "Active"
    62506272msgstr ""
    62516273
    6252 #: assets/free/js/admin.js:2139
     6274#: assets/free/js/admin.js:2155
    62536275msgctxt "changes filter"
    62546276msgid "Undone"
    62556277msgstr ""
    62566278
    6257 #: assets/free/js/admin.js:2139
     6279#: assets/free/js/admin.js:2155
    62586280msgctxt "changes filter"
    62596281msgid "Not reversible"
    62606282msgstr ""
    62616283
    6262 #: assets/free/js/admin.js:2186
     6284#: assets/free/js/admin.js:2202
    62636285msgctxt "change state"
    62646286msgid "Undone"
    62656287msgstr ""
    62666288
    6267 #: assets/free/js/admin.js:2187
     6289#: assets/free/js/admin.js:2203
    62686290msgid "Conflict"
    62696291msgstr ""
    62706292
    6271 #: assets/free/js/admin.js:2188
     6293#: assets/free/js/admin.js:2204
    62726294msgctxt "change state"
    62736295msgid "Not reversible"
    62746296msgstr ""
    62756297
    6276 #: assets/free/js/admin.js:2189
     6298#: assets/free/js/admin.js:2205
    62776299msgid "Recovery needed"
    62786300msgstr ""
    62796301
    6280 #: assets/free/js/admin.js:2190
     6302#: assets/free/js/admin.js:2206
    62816303msgid "In progress"
    62826304msgstr ""
    62836305
    6284 #: assets/free/js/admin.js:2191
     6306#: assets/free/js/admin.js:2207
    62856307msgid "Add-on inactive"
    62866308msgstr ""
    62876309
    6288 #: assets/free/js/admin.js:2198
     6310#: assets/free/js/admin.js:2214
    62896311msgid "Review and release"
    62906312msgstr ""
    62916313
    6292 #: assets/free/js/admin.js:2200
    6293 #: assets/free/js/admin.js:2508
    6294 #: assets/free/js/admin.js:2516
     6314#: assets/free/js/admin.js:2216
     6315#: assets/free/js/admin.js:2524
     6316#: assets/free/js/admin.js:2532
    62956317msgid "Redo"
    62966318msgstr ""
    62976319
    6298 #: assets/free/js/admin.js:2201
     6320#: assets/free/js/admin.js:2217
    62996321msgid "Review"
    63006322msgstr ""
    63016323
    63026324#. translators: 1: summary of the original change, 2: when it happened ("today, 14:00").
    6303 #: assets/free/js/admin.js:2223
     6325#: assets/free/js/admin.js:2239
    63046326#, js-format
    63056327msgid "Redoes “%1$s” from %2$s"
    63066328msgstr ""
    63076329
    6308 #: assets/free/js/admin.js:2223
     6330#: assets/free/js/admin.js:2239
    63096331#, js-format
    63106332msgid "Redoes “%s”"
    … …  
    63126334
    63136335#. translators: 1: summary of the original change, 2: when it happened ("today, 14:00").
    6314 #: assets/free/js/admin.js:2227
     6336#: assets/free/js/admin.js:2243
    63156337#, js-format
    63166338msgid "Undoes “%1$s” from %2$s"
    63176339msgstr ""
    63186340
    6319 #: assets/free/js/admin.js:2227
     6341#: assets/free/js/admin.js:2243
    63206342#, js-format
    63216343msgid "Undoes “%s”"
    … …  
    63236345
    63246346#. translators: 1: summary of the original change, 2: when it happened ("today, 14:00").
    6325 #: assets/free/js/admin.js:2230
     6347#: assets/free/js/admin.js:2246
    63266348#, js-format
    63276349msgid "Reverted “%1$s” from %2$s over newer edits."
    63286350msgstr ""
    63296351
    6330 #: assets/free/js/admin.js:2231
     6352#: assets/free/js/admin.js:2247
    63316353#, js-format
    63326354msgid "Reverted “%s” over newer edits."
    63336355msgstr ""
    63346356
    6335 #: assets/free/js/admin.js:2232
     6357#: assets/free/js/admin.js:2248
    63366358msgid "Undoing this change brings back what was replaced."
    63376359msgstr ""
    63386360
    63396361#. translators: 1: relative time ("5 minutes ago"), 2: who undid it.
    6340 #: assets/free/js/admin.js:2244
     6362#: assets/free/js/admin.js:2260
    63416363#, js-format
    63426364msgid "Undone %1$s by %2$s"
    63436365msgstr ""
    63446366
    6345 #: assets/free/js/admin.js:2245
    6346 #: assets/free/js/admin.js:2248
     6367#: assets/free/js/admin.js:2261
     6368#: assets/free/js/admin.js:2264
    63476369msgid "someone"
    63486370msgstr ""
    63496371
    63506372#. translators: 1: relative time ("5 minutes ago"), 2: who redid it.
    6351 #: assets/free/js/admin.js:2247
     6373#: assets/free/js/admin.js:2263
    63526374#, js-format
    63536375msgid "Redone %1$s by %2$s"
    63546376msgstr ""
    63556377
    6356 #: assets/free/js/admin.js:2271
    6357 #: assets/free/js/admin.js:2548
     6378#: assets/free/js/admin.js:2287
     6379#: assets/free/js/admin.js:2564
    63586380msgid "Undo batch"
    63596381msgstr ""
    63606382
    63616383#. translators: %d: number of changes in the batch.
    6362 #: assets/free/js/admin.js:2275
     6384#: assets/free/js/admin.js:2291
    63636385#, js-format
    63646386msgid "Batch of %d change"
    … …  
    63676389msgstr[1] ""
    63686390
    6369 #: assets/free/js/admin.js:2279
     6391#: assets/free/js/admin.js:2295
    63706392#, js-format
    63716393msgid "%1$d of %2$d change shown. The others are outside the current filters."
    … …  
    63756397
    63766398#. translators: 1: number of changes already undone, 2: total changes in the batch.
    6377 #: assets/free/js/admin.js:2283
     6399#: assets/free/js/admin.js:2299
    63786400#, js-format
    63796401msgid "%1$d of %2$d already undone"
    … …  
    63826404msgstr[1] ""
    63836405
    6384 #: assets/free/js/admin.js:2287
     6406#: assets/free/js/admin.js:2303
    63856407#, js-format
    63866408msgid "%d item"
    … …  
    63896411msgstr[1] ""
    63906412
    6391 #: assets/free/js/admin.js:2294
     6413#: assets/free/js/admin.js:2310
    63926414msgid "The history couldn't be loaded"
    63936415msgstr ""
    63946416
    6395 #: assets/free/js/admin.js:2297
     6417#: assets/free/js/admin.js:2313
    63966418msgid "Loading the history…"
    63976419msgstr ""
    63986420
    6399 #: assets/free/js/admin.js:2301
     6421#: assets/free/js/admin.js:2317
    64006422msgid "No change matches these filters."
    64016423msgstr ""
    64026424
    6403 #: assets/free/js/admin.js:2305
     6425#: assets/free/js/admin.js:2321
    64046426msgid "Writing through MCP is paused on this site. Undo and redo are unavailable until it comes back."
    64056427msgstr ""
    64066428
    6407 #: assets/free/js/admin.js:2340
     6429#: assets/free/js/admin.js:2356
    64086430msgid "All types"
    64096431msgstr ""
    64106432
    6411 #: assets/free/js/admin.js:2345
     6433#: assets/free/js/admin.js:2361
    64126434msgid "Change history"
    64136435msgstr ""
    64146436
    6415 #: assets/free/js/admin.js:2349
     6437#: assets/free/js/admin.js:2365
    64166438msgid "No changes yet"
    64176439msgstr ""
    64186440
    6419 #: assets/free/js/admin.js:2351
     6441#: assets/free/js/admin.js:2367
    64206442msgid "When an agent creates or edits something on the site, it shows up here with the option to undo."
    64216443msgstr ""
    64226444
    6423 #: assets/free/js/admin.js:2352
     6445#: assets/free/js/admin.js:2368
    64246446msgid "Writing through MCP is paused on this site. Reading is still available."
    64256447msgstr ""
    64266448
    6427 #: assets/free/js/admin.js:2357
     6449#: assets/free/js/admin.js:2373
    64286450msgid "Search by change or item"
    64296451msgstr ""
    64306452
    6431 #: assets/free/js/admin.js:2358
     6453#: assets/free/js/admin.js:2374
    64326454msgid "Search the history"
    64336455msgstr ""
    64346456
    6435 #: assets/free/js/admin.js:2360
     6457#: assets/free/js/admin.js:2376
    64366458msgid "Filter by item type"
    64376459msgstr ""
    64386460
    6439 #: assets/free/js/admin.js:2367
     6461#: assets/free/js/admin.js:2383
    64406462msgid "(removed)"
    64416463msgstr ""
    64426464
    6443 #: assets/free/js/admin.js:2367
     6465#: assets/free/js/admin.js:2383
    64446466msgid "(moved to the trash)"
    64456467msgstr ""
    64466468
    6447 #: assets/free/js/admin.js:2367
     6469#: assets/free/js/admin.js:2383
    64486470msgid "(deleted)"
    64496471msgstr ""
    64506472
    6451 #: assets/free/js/admin.js:2371
     6473#: assets/free/js/admin.js:2387
    64526474msgctxt "changed field"
    64536475msgid "item"
    64546476msgstr ""
    64556477
    6456 #: assets/free/js/admin.js:2396
     6478#: assets/free/js/admin.js:2412
    64576479msgid "(empty)"
    64586480msgstr ""
    64596481
    64606482#. translators: %d: number of changed lines that are not shown.
    6461 #: assets/free/js/admin.js:2416
     6483#: assets/free/js/admin.js:2432
    64626484#, js-format
    64636485msgid "…and %d more changed line"
    … …  
    64666488msgstr[1] ""
    64676489
    6468 #: assets/free/js/admin.js:2419
     6490#: assets/free/js/admin.js:2435
    64696491msgid "Changed beyond the shown excerpt."
    64706492msgstr ""
    64716493
    6472 #: assets/free/js/admin.js:2420
     6494#: assets/free/js/admin.js:2436
    64736495msgid "Incomplete diff: the value is longer than what is shown."
    64746496msgstr ""
    64756497
    6476 #: assets/free/js/admin.js:2424
     6498#: assets/free/js/admin.js:2440
    64776499msgid "Only the first changes are shown."
    64786500msgstr ""
    64796501
    6480 #: assets/free/js/admin.js:2433
     6502#: assets/free/js/admin.js:2449
    64816503msgid "Risk not given"
    64826504msgstr ""
    64836505
    6484 #: assets/free/js/admin.js:2438
     6506#: assets/free/js/admin.js:2454
    64856507msgid "Approved"
    64866508msgstr ""
    64876509
    6488 #: assets/free/js/admin.js:2440
    6489 #: assets/free/js/admin.js:2650
     6510#: assets/free/js/admin.js:2456
     6511#: assets/free/js/admin.js:2666
    64906512msgid "Reject"
    64916513msgstr ""
    64926514
    6493 #: assets/free/js/admin.js:2442
    6494 #: assets/free/js/admin.js:2647
     6515#: assets/free/js/admin.js:2458
     6516#: assets/free/js/admin.js:2663
    64956517msgid "Approve"
    64966518msgstr ""
    64976519
    6498 #: assets/free/js/admin.js:2448
     6520#: assets/free/js/admin.js:2464
    64996521#, js-format
    65006522msgid "The agent sent this request %d times. Your answer applies to all of them."
    … …  
    65026524
    65036525#. translators: %s: when the request leaves the list ("tomorrow, 14:00").
    6504 #: assets/free/js/admin.js:2451
     6526#: assets/free/js/admin.js:2467
    65056527#, js-format
    65066528msgid "Expires %s"
    65076529msgstr ""
    65086530
    6509 #: assets/free/js/admin.js:2461
     6531#: assets/free/js/admin.js:2477
    65106532#, js-format
    65116533msgid "Approved until %s. Waiting for the agent to repeat the request."
    65126534msgstr ""
    65136535
    6514 #: assets/free/js/admin.js:2466
     6536#: assets/free/js/admin.js:2482
    65156537msgid "Requests waiting for approval"
    65166538msgstr ""
    65176539
    6518 #: assets/free/js/admin.js:2468
     6540#: assets/free/js/admin.js:2484
    65196541msgid "The agent has to repeat the request after approval."
    65206542msgstr ""
    65216543
    6522 #: assets/free/js/admin.js:2501
     6544#: assets/free/js/admin.js:2517
    65236545msgid "It's recorded as a new change."
    65246546msgstr ""
    65256547
    6526 #: assets/free/js/admin.js:2503
     6548#: assets/free/js/admin.js:2519
    65276549msgid "Undo this change?"
    65286550msgstr ""
    65296551
    6530 #: assets/free/js/admin.js:2503
     6552#: assets/free/js/admin.js:2519
    65316553msgid "Redo this change?"
    65326554msgstr ""
    65336555
    6534 #: assets/free/js/admin.js:2505
     6556#: assets/free/js/admin.js:2521
    65356557msgid "Llamly checks that the item is still as the agent left it before changing it. If someone edited it since, nothing is changed."
    65366558msgstr ""
    65376559
    65386560#. translators: %d: number of other changes not listed.
    6539 #: assets/free/js/admin.js:2532
     6561#: assets/free/js/admin.js:2548
    65406562#, js-format
    65416563msgid "and %d more"
    … …  
    65456567
    65466568#. translators: %d: number of changes in the batch.
    6547 #: assets/free/js/admin.js:2536
     6569#: assets/free/js/admin.js:2552
    65486570msgid "Undo this batch?"
    65496571msgstr ""
    65506572
    6551 #: assets/free/js/admin.js:2536
     6573#: assets/free/js/admin.js:2552
    65526574#, js-format
    65536575msgid "%d change made together by the agent."
    … …  
    65576579
    65586580#. translators: %d: number of changes of the batch outside the current filters that are still to undo.
    6559 #: assets/free/js/admin.js:2541
     6581#: assets/free/js/admin.js:2557
    65606582#, js-format
    65616583msgid "%d change of this batch is outside the current filters"
    … …  
    65646586msgstr[1] ""
    65656587
    6566 #: assets/free/js/admin.js:2543
     6588#: assets/free/js/admin.js:2559
    65676589msgid "Undo batch undoes it too:"
    65686590msgid_plural "Undo batch undoes them too:"
    … …  
    65706592msgstr[1] ""
    65716593
    6572 #: assets/free/js/admin.js:2546
     6594#: assets/free/js/admin.js:2562
    65736595msgid "Llamly undoes from the newest change to the oldest. If one of them changed since, it stops there and shows what's left. Each undo is recorded as a new change."
    65746596msgstr ""
    65756597
    6576 #: assets/free/js/admin.js:2556
     6598#: assets/free/js/admin.js:2572
    65776599msgid "The change couldn't be undone."
    65786600msgstr ""
    65796601
    65806602#. translators: 1: changes undone, 2: total changes in the batch.
    6581 #: assets/free/js/admin.js:2560
     6603#: assets/free/js/admin.js:2576
    65826604msgid "Batch partly undone"
    65836605msgstr ""
    65846606
    6585 #: assets/free/js/admin.js:2560
     6607#: assets/free/js/admin.js:2576
    65866608#, js-format
    65876609msgid "%1$d of %2$d change undone."
    … …  
    65906612msgstr[1] ""
    65916613
    6592 #: assets/free/js/admin.js:2564
     6614#: assets/free/js/admin.js:2580
    65936615#, js-format
    65946616msgid "Stopped at %s"
    65956617msgstr ""
    65966618
    6597 #: assets/free/js/admin.js:2565
     6619#: assets/free/js/admin.js:2581
    65986620msgid "a change"
    65996621msgstr ""
    66006622
    66016623#. translators: %d: number of changes left in the batch.
    6602 #: assets/free/js/admin.js:2567
     6624#: assets/free/js/admin.js:2583
    66036625#, js-format
    66046626msgid "%d change of this batch is left."
    … …  
    66076629msgstr[1] ""
    66086630
    6609 #: assets/free/js/admin.js:2569
     6631#: assets/free/js/admin.js:2585
    66106632msgid "Review the item and try again. The ones already undone aren't repeated."
    66116633msgstr ""
    66126634
    6613 #: assets/free/js/admin.js:2570
     6635#: assets/free/js/admin.js:2586
    66146636msgid "Got it"
    66156637msgstr ""
    66166638
    66176639#. translators: %d: number of items undone.
    6618 #: assets/free/js/admin.js:2574
     6640#: assets/free/js/admin.js:2590
    66196641#, js-format
    66206642msgid "Batch undone (%d item)"
    … …  
    66236645msgstr[1] ""
    66246646
    6625 #: assets/free/js/admin.js:2582
     6647#: assets/free/js/admin.js:2598
    66266648msgid "Undo anyway?"
    66276649msgstr ""
    66286650
    6629 #: assets/free/js/admin.js:2583
     6651#: assets/free/js/admin.js:2599
    66306652msgid "The item goes back to how it was before this agent change. Edits made after it are replaced."
    66316653msgstr ""
    66326654
    6633 #: assets/free/js/admin.js:2585
     6655#: assets/free/js/admin.js:2601
    66346656msgid "Nothing is lost: the force undo stays in the history as a new change, and undoing it brings back the replaced state."
    66356657msgstr ""
    66366658
    6637 #: assets/free/js/admin.js:2587
    6638 #: assets/free/js/admin.js:2618
     6659#: assets/free/js/admin.js:2603
     6660#: assets/free/js/admin.js:2634
    66396661msgid "Undo anyway"
    66406662msgstr ""
    66416663
    6642 #: assets/free/js/admin.js:2595
     6664#: assets/free/js/admin.js:2611
    66436665msgid "Change force undone. You can undo it from the history."
    66446666msgstr ""
    66456667
    6646 #: assets/free/js/admin.js:2606
     6668#: assets/free/js/admin.js:2622
    66476669msgid "Review conflict"
    66486670msgstr ""
    66496671
    6650 #: assets/free/js/admin.js:2608
     6672#: assets/free/js/admin.js:2624
    66516673msgid "The item changed after this change."
    66526674msgstr ""
    66536675
    6654 #: assets/free/js/admin.js:2612
     6676#: assets/free/js/admin.js:2628
    66556677msgid "Undo anyway takes the item back to how it was before the agent change and overwrites the edit made after it. The undo stays in the history and can be undone."
    66566678msgstr ""
    66576679
    6658 #: assets/free/js/admin.js:2614
     6680#: assets/free/js/admin.js:2630
    66596681msgid "To undo, the item has to be as the agent left it. Check the item in WordPress."
    66606682msgstr ""
    66616683
    6662 #: assets/free/js/admin.js:2616
     6684#: assets/free/js/admin.js:2632
    66636685msgid "Open in WordPress"
    66646686msgstr ""
    66656687
    6666 #: assets/free/js/admin.js:2617
     6688#: assets/free/js/admin.js:2633
    66676689msgid "Keep as is"
    66686690msgstr ""
    66696691
    6670 #: assets/free/js/admin.js:2624
     6692#: assets/free/js/admin.js:2640
    66716693msgid "Accept the item's current state?"
    66726694msgstr ""
    66736695
    6674 #: assets/free/js/admin.js:2624
     6696#: assets/free/js/admin.js:2640
    66756697msgid "A change was interrupted."
    66766698msgstr ""
    66776699
    6678 #: assets/free/js/admin.js:2626
     6700#: assets/free/js/admin.js:2642
    66796701msgid "The item matches neither the previous state nor the request. Open the item in WordPress and check the saved content."
    66806702msgstr ""
    66816703
    6682 #: assets/free/js/admin.js:2628
     6704#: assets/free/js/admin.js:2644
    66836705msgid "When you accept, Llamly doesn't change the content: it closes this operation, allows new changes and invalidates editors open with the old version."
    66846706msgstr ""
    66856707
    6686 #: assets/free/js/admin.js:2630
     6708#: assets/free/js/admin.js:2646
    66876709msgid "Accept current state"
    66886710msgstr ""
    66896711
    6690 #: assets/free/js/admin.js:2635
     6712#: assets/free/js/admin.js:2651
    66916713msgid "The recovery was recorded and the item was released."
    66926714msgstr ""
    66936715
    6694 #: assets/free/js/admin.js:2642
     6716#: assets/free/js/admin.js:2658
    66956717msgid "The agent"
    66966718msgstr ""
    66976719
    6698 #: assets/free/js/admin.js:2645
     6720#: assets/free/js/admin.js:2661
    66996721msgid "Approve this request?"
    67006722msgstr ""
    67016723
    6702 #: assets/free/js/admin.js:2646
     6724#: assets/free/js/admin.js:2662
    67036725msgid "The approval is only for this request and for a limited time. The agent has to repeat the request after approval. The change goes into the history and can be undone."
    67046726msgstr ""
    67056727
    6706 #: assets/free/js/admin.js:2648
     6728#: assets/free/js/admin.js:2664
    67076729msgid "Reject this request?"
    67086730msgstr ""
    67096731
    6710 #: assets/free/js/admin.js:2649
     6732#: assets/free/js/admin.js:2665
    67116733msgid "Nothing is changed. If the agent repeats the same request, it gets the rejection."
    67126734msgstr ""
    67136735
    6714 #: assets/free/js/admin.js:2659
     6736#: assets/free/js/admin.js:2675
    67156737msgid "Request approved. The agent has to repeat the request."
    67166738msgstr ""
    67176739
    6718 #: assets/free/js/admin.js:2660
     6740#: assets/free/js/admin.js:2676
    67196741msgid "Request rejected."
    67206742msgstr ""
    67216743
    67226744#. translators: 1: requests answered, 2: requests that failed, 3: reason.
    6723 #: assets/free/js/admin.js:2663
     6745#: assets/free/js/admin.js:2679
    67246746#, js-format
    67256747msgid "%1$d requests were answered and %2$d failed: %3$s"
    67266748msgstr ""
    67276749
    6728 #: assets/free/js/admin.js:2672
     6750#: assets/free/js/admin.js:2688
    67296751msgid "Activity"
    67306752msgstr ""
    67316753
    6732 #: assets/free/js/admin.js:2681
     6754#: assets/free/js/admin.js:2697
    67336755msgid "Every change made by an agent is recorded with the previous state. You can undo each change separately."
    67346756msgstr ""
  • llamly/tags/1.1.0/llamly.php

    r3788333 r3800467  
    33 * Plugin Name: Llamly MCP - AI Agent with ChatGPT & Claude
    44 * Description: Connect AI clients to WordPress through the Llamly MCP server.
    5  * Version: 1.0.3
     5 * Version: 1.1.0
    66 * Requires at least: 6.2
    77 * Requires PHP: 8.0
    … …  
    1919
    2020define('LLAMLY_FREE_PLUGIN_FILE', __FILE__);
    21 define('LLAMLY_FREE_VERSION', '1.0.3');
     21define('LLAMLY_FREE_VERSION', '1.1.0');
    2222// Writes are on by default: concurrent writes and the change journal were verified on WP 7.1 + MariaDB 10.11 and
    2323// WP 6.2 + PHP 8.0 + MySQL 8.0. A site can still pause all writes by defining this constant as false in wp-config.php.
    … …  
    4343define('LLAMLY_FREE_MODULE_API', \Llamly\Free\Modules\ModuleRegistry::API);
    4444
     45// Freemius (LLP-455): usage statistics after an explicit opt-in, and the Llamly Pro add-on. Loaded here, in the main
     46// file, so the SDK sees activation and deactivation. Without ready settings it is not loaded and nothing is defined.
     47\Llamly\Free\Freemius\Sdk::boot();
     48if (\Llamly\Free\Freemius\Sdk::instance() !== null && !function_exists('llamly_fs')) {
     49        /**
     50         * The Freemius instance of Llamly, for Freemius add-ons of Llamly (they check function_exists('llamly_fs') or wait
     51         * for the llamly_fs_loaded action). Defined only when the SDK is loaded.
     52         *
     53         * @return \Freemius
     54         */
     55        function llamly_fs() {
     56                return \Llamly\Free\Freemius\Sdk::instance();
     57        }
     58        do_action('llamly_fs_loaded');
     59}
     60
    4561register_activation_hook(__FILE__, ['\\Llamly\\Free\\Core\\Plugin', 'activate']);
    4662register_deactivation_hook(__FILE__, ['\\Llamly\\Free\\Core\\Plugin', 'deactivate']);
  • llamly/tags/1.1.0/readme.txt

    r3788333 r3800467  
    55Tested up to: 7.1
    66Requires PHP: 8.0
    7 Stable tag: 1.0.3
     7Stable tag: 1.1.0
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    1414
    1515Llamly MCP connects your WordPress site to the AI you already use: ChatGPT, Claude, Codex, Cursor and other AI agents. Ask in plain language and your agent writes, edits and organizes the site for you, with your WordPress content permissions, a full change history and undo. It is a free WordPress MCP server (Model Context Protocol) that runs inside your own site: no relay, no Llamly server in between, no Llamly account and no API key from an AI provider.
     16
     17https://www.youtube.com/watch?v=mJwEgav2r40
    1618
    1719**Use the AI subscription you already have. Keep every change reversible.**
    … …  
    2224* **Content, never administration**: the agent works with your content permissions only. Whatever your role, it never changes site settings, users, plugins, themes or code, and never writes unfiltered HTML.
    2325* **Bring your own AI**: works with ChatGPT, claude.ai, Claude Desktop, Claude Code, Codex, Cursor, OpenCode and Antigravity CLI. Llamly has no AI of its own and no usage meter: the agent you already pay for does the work.
    24 * **Your data stays on your site**: self-hosted, no account, no relay, no telemetry. Your AI app connects to your site, and Llamly never calls out.
     26* **Your data stays on your site**: self-hosted, no account, no relay. Your AI app connects to your site, and Llamly sends nothing out unless you opt in to the optional usage statistics (see External services).
    2527* **Ready in a few minutes**: a step-by-step recipe for each app with your site address already filled in, an "Add to Claude" button, and a Doctor that checks your server and tells you what to ask your host.
    2628
    … …  
    4749= Connect Claude to WordPress (claude.ai and Claude Desktop) =
    4850
     51Watch the 2-minute tutorial:
     52
     53https://www.youtube.com/watch?v=0lrDl_NwaSw
     54
    4955Click "Add to Claude" in the Llamly recipe, review the request on your site, choose read only or read and write, and click Approve access. The same connector shows up in Claude Desktop on the same account. Needs a public HTTPS address; for a site on your computer, Claude Desktop uses the local bridge shown in the recipe.
    5056
    … …  
    177183= Does Llamly send my content anywhere? =
    178184
    179 No. Llamly makes no outbound calls to Llamly or to any third-party service at runtime. The AI app you connect sends requests to your site and receives the answers; what that app does with them is governed by its own terms. The connection diagnostics in Connections (Run checks) only call your own site (loopback) to check that the REST API, the MCP endpoint and the OAuth discovery URLs answer.
     185No. Your posts, pages, media, connections, keys, logs and change journal are never sent anywhere. Llamly makes no outbound calls at runtime, except the optional usage statistics described in External services, which send nothing unless an administrator opts in. The AI app you connect sends requests to your site and receives the answers; what that app does with them is governed by its own terms. The connection diagnostics in Connections (Run checks) only call your own site (loopback) to check that the REST API, the MCP endpoint and the OAuth discovery URLs answer.
    180186
    181187= Can the agent publish or delete things without me? =
    … …  
    227233There is no Llamly server: the AI app you connect sends its requests straight to your site, and each request acts with the content permissions of the user who created the key or approved the OAuth sign-in, never administrator ones.
    228234
    229 Expired rows are removed by a daily WordPress cron event. Llamly sets no cookies on the public site, adds no tracking, and makes no external requests at runtime. Links in the admin that open claude.ai or chatgpt.com only open those sites in your browser when you click them.
     235Expired rows are removed by a daily WordPress cron event. Llamly sets no cookies on the public site and adds no tracking to it. Llamly itself makes no external requests at runtime; the only exception is the optional, opt-in usage statistics described in External services, which send nothing unless an administrator clicks "Allow & Continue". Links in the admin that open claude.ai or chatgpt.com only open those sites in your browser when you click them.
     236
     237== External services ==
     238
     239Llamly includes the Freemius SDK (https://freemius.com), which Llamly uses for optional usage statistics and, later, to offer the Llamly Pro add-on. It connects to `api.freemius.com` and `wp.freemius.com`.
     240
     241* **Before you choose, and if you skip:** the Llamly screen shows an opt-in screen once, with "Allow & Continue" and "Skip". Nothing is sent to Freemius before you click "Allow & Continue". If you click "Skip", nothing is sent and every feature of Llamly keeps working exactly the same; you can opt in later from the plugin's row on the Plugins screen.
     242* **After you click "Allow & Continue":** your browser sends the opt-in to `wp.freemius.com`, and from then on the site reports to `api.freemius.com`: your first and last name and email address as an administrator, the site URL, title and language, the WordPress, PHP, Llamly and SDK versions, Llamly events (activation, deactivation, uninstall, version updates) and the names, slugs and versions of the installed plugins and themes. The opt-in screen lists these before you agree. Freemius may then email you security and feature updates, educational content and occasional offers, as the opt-in screen says. After opting in, Llamly > Account shows what is shared and lets you opt out.
     243* **Deactivation feedback:** when you deactivate Llamly, an optional form asks why. If you send it, the reason you chose (and any text you wrote) is sent to Freemius, anonymously if you did not opt in. You can skip the form.
     244* Nothing from your posts, pages, media, connections, keys, logs or the change journal is ever sent.
     245
     246Freemius terms of service: https://freemius.com/terms/ · Freemius privacy policy: https://freemius.com/privacy/
    230247
    231248== Source code ==
    … …  
    254271== Changelog ==
    255272
     273= 1.1.0 =
     274* Optional, opt-in usage and diagnostic statistics through Freemius. Nothing is sent without an administrator's consent ("Allow & Continue" on the Llamly screen). "Skip" keeps every feature working exactly the same. See External services.
     275* About: a Llamly Pro card. Llamly Pro will be a separate add-on and is coming soon; nothing in Llamly is locked.
     276* Uninstall keeps the same rules, tells the Freemius SDK about the uninstall (sent only if you opted in or sent deactivation feedback), and also removes what the Freemius SDK stored about Llamly.
     277* Readme: tutorial videos.
     278
    256279= 1.0.3 =
    257280* The MCP endpoint checks the request origin and the caller's credential (Llamly API key or OAuth access token) in its REST permission callback, before the request reaches the MCP handler. Responses to clients are unchanged.
    … …  
    285308== Upgrade Notice ==
    286309
     310= 1.1.0 =
     311Optional, opt-in usage statistics through Freemius: nothing is sent without your consent, and Skip keeps everything working. Llamly Pro add-on coming soon.
     312
    287313= 1.0.3 =
    288314The MCP endpoint authenticates in its REST permission callback. Translations now come from translate.wordpress.org.
  • llamly/tags/1.1.0/src/Free/Admin/AdminPage.php

    r3788333 r3800467  
    2828                add_action('admin_notices', [self::class, 'renderOnboardingNotice']);
    2929                add_action('admin_post_llamly_free_dismiss_onboarding', [self::class, 'dismissOnboardingNotice']);
     30                if (defined('LLAMLY_FREE_PLUGIN_FILE')) {
     31                        add_filter('plugin_action_links_' . plugin_basename(LLAMLY_FREE_PLUGIN_FILE), [self::class, 'pluginActionLinks']);
     32                }
     33        }
     34
     35        /** Llamly Pro destination for the About card, or '' while Llamly Pro has no page yet. */
     36        private static function proUrl(): string
     37        {
     38                return \Llamly\Free\Freemius\Sdk::config()->upgradeUrl();
     39        }
     40
     41        private static function proActive(): bool
     42        {
     43                return defined('LLAMLY_PRO_VERSION');
     44        }
     45
     46        /**
     47         * Plugins screen row: a "Llamly Pro" link to the Llamly Pro card of the About tab, only once Llamly Pro has a page
     48         * and while it is not active. The card is the one place that points outside (WordPress.org guideline 11).
     49         *
     50         * @param array<string,string> $links
     51         * @return array<string,string>
     52         */
     53        public static function pluginActionLinks($links): array
     54        {
     55                $links = is_array($links) ? $links : [];
     56                if (self::proUrl() !== '' && !self::proActive() && current_user_can('manage_options')) {
     57                        $links['llamly_pro'] = '<a href="' . esc_url(admin_url('admin.php?page=' . self::MENU_SLUG . '&tab=about#llamly-pro')) . '">' . esc_html__('Llamly Pro', 'llamly') . '</a>';
     58                }
     59                return $links;
    3060        }
    3161
    … …  
    119149                }
    120150
    121                 $assetVersion = defined('LLAMLY_FREE_VERSION') ? LLAMLY_FREE_VERSION : '1.0.3';
     151                $assetVersion = defined('LLAMLY_FREE_VERSION') ? LLAMLY_FREE_VERSION : '1.1.0';
    122152                $base = LLAMLY_FREE_ASSET_URL;
    123153                foreach (['tokens', 'llamly', 'connections', 'activity', 'logs', 'settings', 'about', 'admin-app'] as $style) {
    … …  
    141171                        'exportLogsUrl' => wp_nonce_url(admin_url('admin-post.php?action=llamly_free_export_logs'), 'llamly_free_export_logs'),
    142172                        'sections' => self::sectionsForCurrentUser(),
     173                        'pro' => ['url' => esc_url_raw(self::proUrl(), ['https']), 'active' => self::proActive()],
    143174                        'site' => [
    144175                                'name' => wp_strip_all_tags(get_bloginfo('name')),
  • llamly/tags/1.1.0/src/Free/Core/Plugin.php

    r3788333 r3800467  
    316316         * Runs only when the upgrade path has a destructive step (Schema::STEPS); additive upgrades skip it.
    317317         * Copies each existing table to <table>_bak_v<old> (structure and rows) unless that backup already exists.
    318          * Older backups are pruned after a verified upgrade (Maintenance::pruneBackups); uninstall.php removes the rest.
     318         * Older backups are pruned after a verified upgrade (Maintenance::pruneBackups); uninstall (Core\Uninstall) removes the rest.
    319319         */
    320320        private static function backupTables(int $old): bool
  • llamly/tags/1.1.0/src/Free/Core/Schema.php

    r3788333 r3800467  
    4646        /**
    4747         * Tables (suffixes after {prefix}llamly_free_) of the database restore points, which 1.0.0 created and this version no
    48          * longer has. install() drops them, their upgrade backups and the work tables a restore left behind; uninstall.php too.
     48         * longer has. install() drops them, their upgrade backups and the work tables a restore left behind; uninstall (Core\Uninstall) too.
    4949         */
    5050        private const RETIRED_TABLES = ['checkpoints', 'checkpoint_chunks', 'checkpoint_restores', 'checkpoint_state'];
  • llamly/tags/1.1.0/uninstall.php

    r3788333 r3800467  
    11<?php
    22/**
    3  * Removes Llamly Free data when the plugin is deleted, only if the administrator enabled data removal.
    4  * Leaves the options of earlier experimental Llamly builds (llamly_mcp_spike_*) untouched.
     3 * Removes Llamly data when the plugin is deleted (rules in Llamly\Free\Core\Uninstall).
     4 *
     5 * WordPress runs this file instead of any uninstall hook, so it also does what the Freemius SDK's uninstall hook would:
     6 * Uninstall::onUninstall() lets the SDK report the uninstall (only for a site that opted in, or with deactivation
     7 * feedback) and fire after_uninstall, then runs the cleanup. Being a file, it runs on every delete, including a plugin
     8 * updated while inactive and a subsite-only activation on multisite, where no uninstall hook was ever registered.
    59 */
    610
    711declare(strict_types=1);
    8 
    9 // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Llamly reads and writes its own tables and locks WordPress rows inside journal transactions; a cached read would defeat the revision checks.
    10 // phpcs:disable WordPress.DB.DirectDatabaseQuery.SchemaChange -- creates, upgrades, backs up or drops only Llamly tables ({prefix}llamly_free_*).
    1112
    1213if (!defined('WP_UNINSTALL_PLUGIN')) {
    … …  
    1415}
    1516
    16 if (!defined('LLAMLY_FREE_ROOT')) {
    17         $llamlyFreeRoot = is_file(__DIR__ . '/src/Free/Core/Autoloader.php') ? __DIR__ : dirname(__DIR__);
    18         define('LLAMLY_FREE_ROOT', $llamlyFreeRoot);
    19 }
    20 require_once LLAMLY_FREE_ROOT . '/src/Free/Core/Autoloader.php';
    21 \Llamly\Free\Core\Autoloader::register();
     17require_once __DIR__ . '/llamly.php';
    2218
    23 $llamlyFreeUninstallSite = static function (): void {
    24         global $wpdb;
    25 
    26         wp_clear_scheduled_hook('llamly_free_daily_maintenance');
    27         // Unfinished uploads in parts are temporary files, never site data: always removed.
    28         wp_unschedule_hook(\Llamly\Free\Tools\MediaParts::HOOK_EXPIRE);
    29         \Llamly\Free\Tools\MediaParts::purgeAll();
    30         // Data is preserved unless an administrator explicitly enabled removal in Settings.
    31         $settings = get_option('llamly_free_settings', []);
    32         if (!is_array($settings) || ($settings['delete_data_on_uninstall'] ?? false) !== true) {
    33                 return;
    34         }
    35 
    36         foreach (\Llamly\Free\Core\Schema::tableNames() as $table) {
    37                 $wpdb->query($wpdb->prepare('DROP TABLE IF EXISTS %i', $table));
    38                 $backups = $wpdb->get_col($wpdb->prepare('SHOW TABLES LIKE %s', $wpdb->esc_like($table . '_bak_v') . '%'));
    39                 foreach ((array) $backups as $backup) {
    40                         $wpdb->query($wpdb->prepare('DROP TABLE IF EXISTS %i', (string) $backup));
    41                 }
    42         }
    43 
    44         // Tables of features that left the plugin, if an upgrade did not drop them yet.
    45         \Llamly\Free\Core\Schema::dropRetired();
    46 
    47         // Media retention copies (uploads/llamly-mcp/). Their index rows (llamly_free_mret_*) go with the options below.
    48         $llamlyFreeUploads = wp_upload_dir(null, false);
    49         $llamlyFreeBase = realpath((string) ($llamlyFreeUploads['basedir'] ?? ''));
    50         $llamlyFreeDir = $llamlyFreeBase ? realpath($llamlyFreeBase . '/llamly-mcp') : false;
    51         if ($llamlyFreeBase && $llamlyFreeDir && strpos($llamlyFreeDir, $llamlyFreeBase . DIRECTORY_SEPARATOR) === 0 && is_dir($llamlyFreeDir) && !is_link($llamlyFreeDir)) {
    52                 $llamlyFreeItems = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($llamlyFreeDir, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST);
    53                 foreach ($llamlyFreeItems as $llamlyFreeItem) {
    54                         if ($llamlyFreeItem->isDir() && !$llamlyFreeItem->isLink()) {
    55                                 \Llamly\Free\Core\Filesystem::direct()->rmdir($llamlyFreeItem->getPathname());
    56                         } else {
    57                                 wp_delete_file($llamlyFreeItem->getPathname());
    58                         }
    59                 }
    60                 \Llamly\Free\Core\Filesystem::direct()->rmdir($llamlyFreeDir);
    61         }
    62 
    63         $like = $wpdb->esc_like('llamly_free_') . '%';
    64         $timeout = $wpdb->esc_like('_transient_timeout_llamly_free_') . '%';
    65         $transient = $wpdb->esc_like('_transient_llamly_free_') . '%';
    66         $siteTimeout = $wpdb->esc_like('_site_transient_timeout_llamly_free_') . '%';
    67         $siteTransient = $wpdb->esc_like('_site_transient_llamly_free_') . '%';
    68         $wpdb->query($wpdb->prepare(
    69                 "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s",
    70                 $like,
    71                 $timeout,
    72                 $transient,
    73                 $siteTimeout,
    74                 $siteTransient
    75         ));
    76         $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE %s", $like));
    77 
    78         wp_clear_scheduled_hook('llamly_free_daily_maintenance');
    79         wp_cache_flush();
    80 };
    81 
    82 if (is_multisite()) {
    83         foreach (get_sites(['fields' => 'ids', 'number' => 0]) as $llamlyFreeBlogId) {
    84                 switch_to_blog((int) $llamlyFreeBlogId);
    85                 $llamlyFreeUninstallSite();
    86                 restore_current_blog();
    87         }
    88         global $wpdb;
    89         $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->sitemeta} WHERE meta_key LIKE %s", $wpdb->esc_like('llamly_free_') . '%'));
    90 } else {
    91         $llamlyFreeUninstallSite();
    92 }
     19// The SDK finds its instance from the hook name (uninstall_<plugin basename>), so the hook carries WordPress's basename.
     20$llamlyFreeUninstallHook = 'uninstall_' . (is_string(WP_UNINSTALL_PLUGIN) && WP_UNINSTALL_PLUGIN !== '' ? WP_UNINSTALL_PLUGIN : 'llamly/llamly.php');
     21add_action($llamlyFreeUninstallHook, ['\\Llamly\\Free\\Core\\Uninstall', 'onUninstall']);
     22do_action($llamlyFreeUninstallHook); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.DynamicHooknameFound -- WordPress core's own uninstall_<plugin> action, which the Freemius SDK listens for.
  • llamly/trunk/THIRD-PARTY-NOTICES.txt

    r3788333 r3800467  
    5555THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    5656
     57## Freemius WordPress SDK 2.13.5 (GPL-3.0)
     58
     59`vendor/freemius/wordpress-sdk/` is the [Freemius WordPress SDK](https://github.com/Freemius/wordpress-sdk) 2.13.5 (tag `2.13.5`, commit `0875c4ee3c941572f44d60cb2a687c54295db3d7`), Copyright (c) 2015, Freemius, Inc., licensed under the GNU General Public License version 3. It is bundled unchanged, exactly as the upstream tag exports it, with its full license text in `vendor/freemius/wordpress-sdk/LICENSE.txt`; `tools/freemius-sdk.lock` in the source repository records the SHA256 of every file. Llamly uses it only for the optional, opt-in usage statistics and the Llamly Pro add-on (readme, External services). Because Llamly is GPL-2.0-or-later, the plugin as distributed with this SDK is covered by GPL-3.0.
     60
     61The SDK carries its own notices for the code it bundles: the Freemius PHP API client in `includes/sdk/` (GPL-2.0, `includes/sdk/LICENSE.txt`); `assets/js/pricing/freemius-pricing.js`, whose bundled libraries (React and others under the MIT License, Font Awesome Free 5.15.4: icons CC BY 4.0, fonts SIL OFL 1.1, code MIT) are listed in `assets/js/pricing/freemius-pricing.js.LICENSE.txt`; `assets/js/nojquery.ba-postmessage.js` by Ben Alman (dual MIT and GPL). Those files are kept as shipped upstream; files without their own notice are covered by the SDK's GPL-3.0.
     62
    5763## Llamly marks
    5864
  • llamly/trunk/assets/free/css/about.css

    r3788333 r3800467  
    2626.about-cap__name { font-weight: 500; flex: 1; min-width: 0; }
    2727.about-cap__n { color: var(--ll-text-2); font-size: var(--ll-fs-sm); font-variant-numeric: tabular-nums; }
     28.about-pro { padding: var(--ll-5) var(--ll-6); display: flex; flex-direction: column; align-items: flex-start; gap: var(--ll-3); }
     29.about-pro p { margin: 0; }
    2830.about-links { display: flex; flex-wrap: wrap; gap: var(--ll-3) var(--ll-8); padding: var(--ll-5) var(--ll-6); border-bottom: 1px solid var(--ll-border); }
    2931.about-links a { display: inline-flex; align-items: center; gap: var(--ll-2); font-weight: 600; text-decoration: none; }
  • llamly/trunk/assets/free/js/admin.js

    r3788333 r3800467  
    19851985        }
    19861986
     1987        /** The one place in Llamly that points to Llamly Pro (LLP-455). Nothing in Llamly is locked; hidden while Llamly Pro is active. */
     1988        function proSection() {
     1989                const pro = config.pro || {};
     1990                if (pro.active) return '';
     1991                const url = typeof pro.url === 'string' && pro.url.indexOf('https://') === 0 ? pro.url : '';
     1992                return '<section id="llamly-pro" data-pro><div class="ll-section-head"><div><h2 class="ll-section-title">' +
     1993                        esc(__('Llamly Pro', 'llamly')) + '</h2><p class="ll-section-desc">' +
     1994                        esc(__('Everything on these screens is free and stays free.', 'llamly')) + '</p></div></div>' +
     1995                        '<div class="ll-card about-pro"><p>' +
     1996                        esc(__('Llamly Pro is a separate add-on with extra modules for your agent. The first one, Llamly Builder, builds pages in Elementor and in the block editor.',
     1997                        'llamly')) + '</p>' + (url ? '<a class="ll-btn" href="' + esc(url) + '" target="_blank" rel="noopener noreferrer">' +
     1998                        esc(__('Learn about Llamly Pro', 'llamly')) + icon('external-link') + '</a>' : '<p class="ll-faint">' +
     1999                        esc(__('Coming soon.', 'llamly')) + '</p>') + '</div></section>';
     2000        }
     2001
    19872002        tabs.about = {
    19882003                label: __('About', 'llamly'),
    … …  
    20392054                                        '</section>' +
    20402055                                modulesSection() +
     2056                                proSection() +
    20412057                                '<section><div class="ll-section-head"><div><h2 class="ll-section-title">' + esc(__('Help', 'llamly')) + '</h2></div></div><div class="ll-card">' +
    20422058                                (help.length ? '<div class="about-links">' + help.map((l) => '<a href="' + esc(l[0]) +
  • llamly/trunk/languages/llamly.pot

    r3788333 r3800467  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: Llamly 1.0.2\n"
     5"Project-Id-Version: Llamly 1.1.0\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/llamly\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-10-26T10:12:35-03:00\n"
     12"POT-Creation-Date: 2026-11-11T09:37:34-03:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.12.0\n"
    … …  
    2727#. Author of the plugin
    2828#: llamly.php
    29 #: src/Free/Admin/AdminPage.php:99
    30 #: src/Free/Admin/AdminPage.php:100
    31 #: src/Free/Admin/AdminPage.php:203
     29#: src/Free/Admin/AdminPage.php:129
     30#: src/Free/Admin/AdminPage.php:130
     31#: src/Free/Admin/AdminPage.php:234
    3232#: src/Free/Core/Abilities.php:40
    3333msgid "Llamly"
    … …  
    196196msgstr ""
    197197
    198 #: src/Free/Admin/AdminPage.php:169
     198#: src/Free/Admin/AdminPage.php:57
     199#: assets/free/js/admin.js:1993
     200msgid "Llamly Pro"
     201msgstr ""
     202
     203#: src/Free/Admin/AdminPage.php:200
    199204msgid "Llamly is ready."
    200205msgstr ""
    201206
    202 #: src/Free/Admin/AdminPage.php:170
     207#: src/Free/Admin/AdminPage.php:201
    203208msgid "Connect Claude, ChatGPT or another AI app to this site. It takes about a minute."
    204209msgstr ""
    205210
    206 #: src/Free/Admin/AdminPage.php:171
     211#: src/Free/Admin/AdminPage.php:202
    207212msgid "Connect an app"
    208213msgstr ""
    209214
    210 #: src/Free/Admin/AdminPage.php:172
     215#: src/Free/Admin/AdminPage.php:203
    211216msgid "Dismiss"
    212217msgstr ""
    213218
    214 #: src/Free/Admin/AdminPage.php:178
     219#: src/Free/Admin/AdminPage.php:209
    215220msgid "You do not have permission to dismiss this notice."
    216221msgstr ""
    217222
    218 #: src/Free/Admin/AdminPage.php:189
     223#: src/Free/Admin/AdminPage.php:220
    219224msgid "You do not have permission to access Llamly."
    220225msgstr ""
    221226
    222 #: src/Free/Admin/AdminPage.php:192
     227#: src/Free/Admin/AdminPage.php:223
    223228msgid "Llamly setup"
    224229msgstr ""
    225230
    226 #: src/Free/Admin/AdminPage.php:193
     231#: src/Free/Admin/AdminPage.php:224
    227232msgid "The required database tables are not ready. Retry the schema check before connecting clients."
    228233msgstr ""
    229234
    230 #: src/Free/Admin/AdminPage.php:197
     235#: src/Free/Admin/AdminPage.php:228
    231236msgid "Verify database setup"
    232237msgstr ""
    233238
    234 #: src/Free/Admin/AdminPage.php:226
     239#: src/Free/Admin/AdminPage.php:257
    235240msgid "You do not have permission to update Llamly."
    236241msgstr ""
    … …  
    763768#: src/Free/Auth/Authenticator.php:36
    764769#: src/Free/Auth/Authenticator.php:41
     770#: src/Free/Mcp/Protocol.php:63
    765771msgid "A valid Bearer token is required."
    766772msgstr ""
    … …  
    886892
    887893#: src/Free/Auth/OAuthRedirectPolicy.php:79
    888 #: assets/free/js/admin.js:2206
     894#: assets/free/js/admin.js:2222
    889895msgid "A desktop or terminal app"
    890896msgstr ""
    891897
    892 #: src/Free/Auth/OAuthServer.php:64
     898#: src/Free/Auth/OAuthServer.php:71
    893899msgid "Llamly is not ready to register clients."
    894900msgstr ""
    895901
    896 #: src/Free/Auth/OAuthServer.php:67
     902#: src/Free/Auth/OAuthServer.php:74
    897903msgid "New OAuth connections are closed. An administrator can open a 30-minute registration window in Llamly."
    898904msgstr ""
    899905
    900 #: src/Free/Auth/OAuthServer.php:71
     906#: src/Free/Auth/OAuthServer.php:78
    901907msgid "Too many client registration requests."
    902908msgstr ""
    903909
    904 #: src/Free/Auth/OAuthServer.php:76
     910#: src/Free/Auth/OAuthServer.php:83
    905911msgid "Send a JSON client registration request."
    906912msgstr ""
    907913
    908 #: src/Free/Auth/OAuthServer.php:80
     914#: src/Free/Auth/OAuthServer.php:87
    909915msgid "Register between one and ten redirect URIs."
    910916msgstr ""
    911917
    912 #: src/Free/Auth/OAuthServer.php:84
     918#: src/Free/Auth/OAuthServer.php:91
    913919msgid "Every redirect URI must be a string."
    914920msgstr ""
    915921
    916 #: src/Free/Auth/OAuthServer.php:91
     922#: src/Free/Auth/OAuthServer.php:98
    917923msgid "No redirect URI satisfies the site redirect-host policy."
    918924msgstr ""
    919925
    920 #: src/Free/Auth/OAuthServer.php:100
     926#: src/Free/Auth/OAuthServer.php:107
    921927msgid "Only authorization-code clients with PKCE are supported."
    922928msgstr ""
    923929
    924 #: src/Free/Auth/OAuthServer.php:103
     930#: src/Free/Auth/OAuthServer.php:110
    925931msgid "Public clients must use token_endpoint_auth_method=none and PKCE."
    926932msgstr ""
    927933
    928 #: src/Free/Auth/OAuthServer.php:106
     934#: src/Free/Auth/OAuthServer.php:113
    929935msgid "The client name must be a string."
    930936msgstr ""
    931937
    932 #: src/Free/Auth/OAuthServer.php:113
     938#: src/Free/Auth/OAuthServer.php:120
    933939msgid "A secure client ID could not be created."
    934940msgstr ""
    935941
    936 #: src/Free/Auth/OAuthServer.php:121
     942#: src/Free/Auth/OAuthServer.php:128
    937943msgid "The client registration lock is unavailable."
    938944msgstr ""
    939945
    940 #: src/Free/Auth/OAuthServer.php:125
     946#: src/Free/Auth/OAuthServer.php:132
    941947msgid "The client registration transaction could not start."
    942948msgstr ""
    943949
    944 #: src/Free/Auth/OAuthServer.php:130
     950#: src/Free/Auth/OAuthServer.php:137
    945951msgid "The client registration limit could not be checked."
    946952msgstr ""
    947953
    948 #: src/Free/Auth/OAuthServer.php:134
     954#: src/Free/Auth/OAuthServer.php:141
    949955msgid "This site has reached its limit of 100 active OAuth clients. Revoke an unused client before registering another."
    950956msgstr ""
    951957
    952 #: src/Free/Auth/OAuthServer.php:151
     958#: src/Free/Auth/OAuthServer.php:158
    953959msgid "The client registration could not be stored with its audit record."
    954960msgstr ""
    955961
    956 #: src/Free/Auth/OAuthServer.php:199
     962#: src/Free/Auth/OAuthServer.php:206
    957963msgid "Llamly is not ready to accept new connections on this site."
    958964msgstr ""
    959965
    960 #: src/Free/Auth/OAuthServer.php:199
     966#: src/Free/Auth/OAuthServer.php:206
    961967msgid "Ask an administrator to check that the MCP server is turned on in Llamly > Settings."
    962968msgstr ""
    963969
    964 #: src/Free/Auth/OAuthServer.php:203
     970#: src/Free/Auth/OAuthServer.php:210
    965971msgid "This connection request is invalid."
    966972msgstr ""
    967973
    968 #: src/Free/Auth/OAuthServer.php:203
    969 #: src/Free/Auth/OAuthServer.php:374
     974#: src/Free/Auth/OAuthServer.php:210
    970975#: src/Free/Auth/OAuthServer.php:381
    971 #: src/Free/Auth/OAuthServer.php:385
     976#: src/Free/Auth/OAuthServer.php:388
     977#: src/Free/Auth/OAuthServer.php:392
    972978msgid "Go back to the app and start the connection again."
    973979msgstr ""
    974980
    975 #: src/Free/Auth/OAuthServer.php:271
     981#: src/Free/Auth/OAuthServer.php:278
    976982msgid "An administrator must approve this connection."
    977983msgstr ""
    978984
    979 #: src/Free/Auth/OAuthServer.php:271
     985#: src/Free/Auth/OAuthServer.php:278
    980986msgid "New connections are turned off on this site. Sign in as an administrator to approve it, or ask an administrator to turn on new connections for 30 minutes in Llamly > Connections."
    981987msgstr ""
    982988
    983 #: src/Free/Auth/OAuthServer.php:282
     989#: src/Free/Auth/OAuthServer.php:289
    984990msgid "Your account cannot approve this connection."
    985991msgstr ""
    986992
    987 #: src/Free/Auth/OAuthServer.php:282
     993#: src/Free/Auth/OAuthServer.php:289
     994#: src/Free/Auth/OAuthServer.php:395
     995#: src/Free/Auth/OAuthServer.php:398
     996msgid "Sign in with an account that can edit this site, or ask an administrator to connect the app."
     997msgstr ""
     998
     999#: src/Free/Auth/OAuthServer.php:381
     1000msgid "This consent form expired."
     1001msgstr ""
     1002
    9881003#: src/Free/Auth/OAuthServer.php:388
    989 #: src/Free/Auth/OAuthServer.php:391
    990 msgid "Sign in with an account that can edit this site, or ask an administrator to connect the app."
    991 msgstr ""
    992 
    993 #: src/Free/Auth/OAuthServer.php:374
    994 msgid "This consent form expired."
    995 msgstr ""
    996 
    997 #: src/Free/Auth/OAuthServer.php:381
    9981004msgid "Choose whether to approve or refuse this connection."
    9991005msgstr ""
    10001006
    1001 #: src/Free/Auth/OAuthServer.php:388
     1007#: src/Free/Auth/OAuthServer.php:395
    10021008msgid "Your WordPress user cannot grant read access."
    10031009msgstr ""
    10041010
    1005 #: src/Free/Auth/OAuthServer.php:391
     1011#: src/Free/Auth/OAuthServer.php:398
    10061012msgid "Your WordPress user cannot grant write access."
    10071013msgstr ""
    10081014
    1009 #: src/Free/Auth/OAuthServer.php:395
    1010 #: assets/free/js/admin.js:2753
     1015#: src/Free/Auth/OAuthServer.php:402
     1016#: assets/free/js/admin.js:2769
    10111017msgid "Try again in a moment."
    10121018msgstr ""
    10131019
    1014 #: src/Free/Auth/OAuthServer.php:404
     1020#: src/Free/Auth/OAuthServer.php:411
    10151021msgid "Select at least one requested permission."
    10161022msgstr ""
    10171023
    1018 #: src/Free/Auth/OAuthServer.php:413
     1024#: src/Free/Auth/OAuthServer.php:420
    10191025msgid "Select only permissions requested by this client."
    10201026msgstr ""
    10211027
    1022 #: src/Free/Auth/OAuthServer.php:438
     1028#: src/Free/Auth/OAuthServer.php:445
    10231029msgid "The OAuth request is invalid or uses an unsupported resource, redirect, or PKCE method."
    10241030msgstr ""
    10251031
    1026 #: src/Free/Auth/OAuthServer.php:447
     1032#: src/Free/Auth/OAuthServer.php:454
    10271033msgid "The client or exact redirect URI is not registered."
    10281034msgstr ""
    10291035
    1030 #: src/Free/Auth/OAuthServer.php:452
     1036#: src/Free/Auth/OAuthServer.php:459
    10311037msgid "The client requested an unsupported Llamly scope."
    10321038msgstr ""
    10331039
    1034 #: src/Free/Auth/OAuthServer.php:474
     1040#: src/Free/Auth/OAuthServer.php:481
    10351041msgid "A secure authorization code could not be created."
    10361042msgstr ""
    10371043
    1038 #: src/Free/Auth/OAuthServer.php:479
     1044#: src/Free/Auth/OAuthServer.php:486
    10391045msgid "The authorization grant transaction could not start."
    10401046msgstr ""
    10411047
    1042 #: src/Free/Auth/OAuthServer.php:510
     1048#: src/Free/Auth/OAuthServer.php:517
    10431049msgid "The authorization grant and its audit record could not be stored."
    10441050msgstr ""
    10451051
    1046 #: src/Free/Auth/OAuthServer.php:526
     1052#: src/Free/Auth/OAuthServer.php:533
    10471053msgid "Send OAuth token parameters."
    10481054msgstr ""
    10491055
    1050 #: src/Free/Auth/OAuthServer.php:534
     1056#: src/Free/Auth/OAuthServer.php:541
    10511057msgid "Only authorization_code and refresh_token grants are supported."
    10521058msgstr ""
    10531059
    1054 #: src/Free/Auth/OAuthServer.php:559
     1060#: src/Free/Auth/OAuthServer.php:566
    10551061msgid "The authorization code, PKCE verifier, redirect, or resource is invalid."
    10561062msgstr ""
    10571063
    1058 #: src/Free/Auth/OAuthServer.php:563
     1064#: src/Free/Auth/OAuthServer.php:570
    10591065msgid "The authorization-code transaction could not start."
    10601066msgstr ""
    10611067
    1062 #: src/Free/Auth/OAuthServer.php:577
     1068#: src/Free/Auth/OAuthServer.php:584
    10631069msgid "The authorization-code record could not be read."
    10641070msgstr ""
    10651071
    1066 #: src/Free/Auth/OAuthServer.php:581
     1072#: src/Free/Auth/OAuthServer.php:588
    10671073msgid "The authorization code was already used; tokens issued from it have been revoked."
    10681074msgstr ""
    10691075
    1070 #: src/Free/Auth/OAuthServer.php:590
     1076#: src/Free/Auth/OAuthServer.php:597
    10711077msgid "The authorization code is invalid, expired, or already used."
    10721078msgstr ""
    10731079
    1074 #: src/Free/Auth/OAuthServer.php:595
     1080#: src/Free/Auth/OAuthServer.php:602
    10751081msgid "The PKCE verifier does not match the authorization request."
    10761082msgstr ""
    10771083
    1078 #: src/Free/Auth/OAuthServer.php:606
     1084#: src/Free/Auth/OAuthServer.php:613
    10791085msgid "The authorization code was already consumed."
    10801086msgstr ""
    10811087
    1082 #: src/Free/Auth/OAuthServer.php:616
     1088#: src/Free/Auth/OAuthServer.php:623
    10831089msgid "The token response could not be saved with its audit record."
    10841090msgstr ""
    10851091
    1086 #: src/Free/Auth/OAuthServer.php:629
     1092#: src/Free/Auth/OAuthServer.php:636
    10871093msgid "The refresh token, client, or resource is invalid."
    10881094msgstr ""
    10891095
    1090 #: src/Free/Auth/OAuthServer.php:633
     1096#: src/Free/Auth/OAuthServer.php:640
    10911097msgid "The refresh-token transaction could not start."
    10921098msgstr ""
    10931099
    1094 #: src/Free/Auth/OAuthServer.php:647
     1100#: src/Free/Auth/OAuthServer.php:654
    10951101msgid "The refresh-token record could not be read."
    10961102msgstr ""
    10971103
    1098 #: src/Free/Auth/OAuthServer.php:651
     1104#: src/Free/Auth/OAuthServer.php:658
    10991105msgid "Refresh token reuse was detected; the token family has been revoked."
    11001106msgstr ""
    11011107
    1102 #: src/Free/Auth/OAuthServer.php:659
     1108#: src/Free/Auth/OAuthServer.php:666
    11031109msgid "The refresh token is invalid, expired, or revoked."
    11041110msgstr ""
    11051111
    1106 #: src/Free/Auth/OAuthServer.php:669
     1112#: src/Free/Auth/OAuthServer.php:676
    11071113msgid "The refresh token was already consumed."
    11081114msgstr ""
    11091115
    1110 #: src/Free/Auth/OAuthServer.php:675
     1116#: src/Free/Auth/OAuthServer.php:682
    11111117msgid "The refreshed token pair could not be saved with its audit record."
    11121118msgstr ""
    11131119
    1114 #: src/Free/Auth/OAuthServer.php:695
     1120#: src/Free/Auth/OAuthServer.php:702
    11151121msgid "Token reuse was detected, but revocation could not be saved."
    11161122msgstr ""
    11171123
    1118 #: src/Free/Auth/OAuthServer.php:704
     1124#: src/Free/Auth/OAuthServer.php:711
    11191125msgid "Token reuse was detected, but revocation could not be committed with its audit record."
    11201126msgstr ""
    11211127
    1122 #: src/Free/Auth/OAuthServer.php:717
     1128#: src/Free/Auth/OAuthServer.php:724
    11231129msgid "Secure access tokens could not be created."
    11241130msgstr ""
    11251131
    1126 #: src/Free/Auth/OAuthServer.php:725
     1132#: src/Free/Auth/OAuthServer.php:732
    11271133msgid "The grant does not contain a valid scope."
    11281134msgstr ""
    11291135
    1130 #: src/Free/Auth/OAuthServer.php:754
     1136#: src/Free/Auth/OAuthServer.php:761
    11311137msgid "The token pair could not be stored."
    11321138msgstr ""
    11331139
    1134 #: src/Free/Auth/OAuthServer.php:784
     1140#: src/Free/Auth/OAuthServer.php:791
    11351141msgid "The revocation transaction could not start."
    11361142msgstr ""
    11371143
    1138 #: src/Free/Auth/OAuthServer.php:794
     1144#: src/Free/Auth/OAuthServer.php:801
    11391145msgid "The token record could not be read."
    11401146msgstr ""
    11411147
    1142 #: src/Free/Auth/OAuthServer.php:804
     1148#: src/Free/Auth/OAuthServer.php:811
    11431149msgid "The grant could not be revoked."
    11441150msgstr ""
    11451151
    1146 #: src/Free/Auth/OAuthServer.php:881
     1152#: src/Free/Auth/OAuthServer.php:888
    11471153msgid "Llamly is not ready to authorize new clients."
    11481154msgstr ""
    … …  
    11921198msgstr ""
    11931199
    1194 #: src/Free/Core/Plugin.php:247
     1200#: src/Free/Core/Plugin.php:246
    11951201msgid "You are not allowed to do this."
    11961202msgstr ""
    11971203
     1204#: src/Free/Core/Plugin.php:364
     1205msgid "Llamly database setup is incomplete. MCP requests and the admin interface are paused until the schema is verified."
     1206msgstr ""
     1207
     1208#. translators: %s: internal error code.
    11981209#: src/Free/Core/Plugin.php:365
    1199 msgid "Llamly database setup is incomplete. MCP requests and the admin interface are paused until the schema is verified."
    1200 msgstr ""
    1201 
    1202 #. translators: %s: internal error code.
    1203 #: src/Free/Core/Plugin.php:366
    12041210#, php-format
    12051211msgid "Last error: %s"
    12061212msgstr ""
    12071213
    1208 #: src/Free/Core/Plugin.php:371
     1214#: src/Free/Core/Plugin.php:370
    12091215msgid "Continue without a backup"
    12101216msgstr ""
    … …  
    13971403#: src/Free/History/Adapters/GlobalStylesObject.php:285
    13981404#: src/Free/History/Engine.php:1644
    1399 #: assets/free/js/admin.js:2082
     1405#: assets/free/js/admin.js:2098
    14001406msgid "Global styles"
    14011407msgstr ""
    … …  
    14641470msgstr ""
    14651471
    1466 #: src/Free/History/Adapters/MediaObject.php:325
     1472#: src/Free/History/Adapters/MediaObject.php:326
    14671473msgid "WordPress did not delete the media item."
    14681474msgstr ""
    14691475
    1470 #: src/Free/History/Adapters/MediaObject.php:367
     1476#: src/Free/History/Adapters/MediaObject.php:368
    14711477msgid "The retained files of this media item are no longer available, so it cannot be restored."
    14721478msgstr ""
    14731479
    1474 #: src/Free/History/Adapters/MediaObject.php:371
     1480#: src/Free/History/Adapters/MediaObject.php:372
    14751481#: src/Free/History/RawRows.php:102
    14761482msgid "Another item now uses the original identifier, so it cannot be restored."
    14771483msgstr ""
    14781484
    1479 #: src/Free/History/Adapters/MediaObject.php:385
     1485#: src/Free/History/Adapters/MediaObject.php:386
    14801486msgid "The files of this media item changed, so its details cannot be restored."
    14811487msgstr ""
    14821488
    1483 #: src/Free/History/Adapters/MediaObject.php:390
     1489#: src/Free/History/Adapters/MediaObject.php:391
    14841490msgid "The media row could not be restored."
    14851491msgstr ""
    14861492
    1487 #: src/Free/History/Adapters/MediaObject.php:406
     1493#: src/Free/History/Adapters/MediaObject.php:407
    14881494msgid "The media item now has files the upload did not create, so the upload cannot be undone."
    14891495msgstr ""
    14901496
    1491 #: src/Free/History/Adapters/MediaObject.php:419
     1497#: src/Free/History/Adapters/MediaObject.php:420
    14921498msgid "A post that used this media item as featured image now has another featured image."
    14931499msgstr ""
    14941500
    1495 #: src/Free/History/Adapters/MediaObject.php:425
     1501#: src/Free/History/Adapters/MediaObject.php:426
    14961502msgid "The site icon was changed after this media item was removed."
    14971503msgstr ""
    14981504
    1499 #: src/Free/History/Adapters/MediaObject.php:431
     1505#: src/Free/History/Adapters/MediaObject.php:432
    15001506msgid "The site logo was changed after this media item was removed."
    15011507msgstr ""
    15021508
    1503 #: src/Free/History/Adapters/MediaObject.php:438
     1509#: src/Free/History/Adapters/MediaObject.php:439
    15041510msgid "The logo, header or background image of the theme was changed after this media item was removed."
    15051511msgstr ""
    15061512
    1507 #: src/Free/History/Adapters/MediaObject.php:457
     1513#: src/Free/History/Adapters/MediaObject.php:458
    15081514msgid "A featured image link could not be restored."
    15091515msgstr ""
    15101516
    1511 #: src/Free/History/Adapters/MediaObject.php:475
     1517#: src/Free/History/Adapters/MediaObject.php:477
    15121518msgid "A journaled theme setting could not be read."
    15131519msgstr ""
    15141520
    1515 #: src/Free/History/Adapters/MediaObject.php:492
     1521#: src/Free/History/Adapters/MediaObject.php:494
    15161522msgid "A term used by this media item no longer exists."
    15171523msgstr ""
    15181524
    1519 #: src/Free/History/Adapters/MediaObject.php:502
    1520 #: src/Free/History/Adapters/MediaObject.php:507
     1525#: src/Free/History/Adapters/MediaObject.php:504
     1526#: src/Free/History/Adapters/MediaObject.php:509
    15211527msgid "Media terms could not be restored."
    15221528msgstr ""
    15231529
    1524 #: src/Free/History/Adapters/MediaObject.php:607
     1530#: src/Free/History/Adapters/MediaObject.php:609
    15251531#: src/Free/History/Adapters/PostObject.php:587
    15261532#: src/Free/History/Engine.php:1652
    … …  
    15281534msgstr ""
    15291535
    1530 #: src/Free/History/Adapters/MediaObject.php:714
     1536#: src/Free/History/Adapters/MediaObject.php:716
    15311537msgid "The file is empty."
    15321538msgstr ""
    15331539
    15341540#. translators: %s: maximum upload size, formatted.
    1535 #: src/Free/History/Adapters/MediaObject.php:717
     1541#: src/Free/History/Adapters/MediaObject.php:719
    15361542#, php-format
    15371543msgid "The file is larger than the upload limit of %s."
    15381544msgstr ""
    15391545
    1540 #: src/Free/History/Adapters/MediaObject.php:730
     1546#: src/Free/History/Adapters/MediaObject.php:732
    15411547msgid "This file type is not allowed or its content does not match its extension."
    15421548msgstr ""
    15431549
    1544 #: src/Free/History/Adapters/MediaObject.php:735
     1550#: src/Free/History/Adapters/MediaObject.php:737
    15451551msgid "The file contains markup or code and is not accepted as media."
    15461552msgstr ""
    15471553
    1548 #: src/Free/History/Adapters/MediaObject.php:761
     1554#: src/Free/History/Adapters/MediaObject.php:763
    15491555msgid "Use a plain file name of 1 to 200 characters without folders."
    15501556msgstr ""
    15511557
    1552 #: src/Free/History/Adapters/MediaObject.php:770
     1558#: src/Free/History/Adapters/MediaObject.php:772
    15531559msgid "Hidden files and server configuration files are not accepted."
    15541560msgstr ""
    15551561
    1556 #: src/Free/History/Adapters/MediaObject.php:774
     1562#: src/Free/History/Adapters/MediaObject.php:776
    15571563msgid "The file name needs an extension."
    15581564msgstr ""
    15591565
    1560 #: src/Free/History/Adapters/MediaObject.php:778
     1566#: src/Free/History/Adapters/MediaObject.php:780
    15611567msgid "Executable, script, markup and SVG files (also as a double extension) are not accepted."
    15621568msgstr ""
    … …  
    15701576msgstr ""
    15711577
    1572 #: src/Free/History/Adapters/MenuObject.php:139
     1578#: src/Free/History/Adapters/MenuObject.php:140
    15731579msgid "The automatic page setting of the menu could not be saved."
    15741580msgstr ""
    15751581
    1576 #: src/Free/History/Adapters/MenuObject.php:159
    1577 #: src/Free/History/Adapters/MenuObject.php:476
     1582#: src/Free/History/Adapters/MenuObject.php:160
     1583#: src/Free/History/Adapters/MenuObject.php:477
    15781584#: src/Free/Tools/MenuTools.php:148
    15791585#: src/Free/Tools/MenuTools.php:369
    … …  
    15811587msgstr ""
    15821588
    1583 #: src/Free/History/Adapters/MenuObject.php:162
     1589#: src/Free/History/Adapters/MenuObject.php:163
    15841590msgid "This menu has too many items to delete reversibly."
    15851591msgstr ""
    15861592
    1587 #: src/Free/History/Adapters/MenuObject.php:185
     1593#: src/Free/History/Adapters/MenuObject.php:186
    15881594msgid "This menu carries protected metadata that cannot be journaled, so it cannot be changed reversibly."
    15891595msgstr ""
    15901596
    15911597#. translators: %d: maximum number of menu items.
    1592 #: src/Free/History/Adapters/MenuObject.php:203
     1598#: src/Free/History/Adapters/MenuObject.php:204
    15931599#: src/Free/Tools/MenuTools.php:323
    15941600#, php-format
    … …  
    15971603
    15981604#. translators: %d: maximum nesting depth.
    1599 #: src/Free/History/Adapters/MenuObject.php:210
     1605#: src/Free/History/Adapters/MenuObject.php:211
    16001606#: src/Free/Tools/MenuTools.php:320
    16011607#, php-format
    … …  
    16031609msgstr ""
    16041610
    1605 #: src/Free/History/Adapters/MenuObject.php:214
     1611#: src/Free/History/Adapters/MenuObject.php:215
    16061612msgid "invalid parent reference."
    16071613msgstr ""
    16081614
    1609 #: src/Free/History/Adapters/MenuObject.php:220
     1615#: src/Free/History/Adapters/MenuObject.php:221
    16101616msgid "db_id is not an item of this menu."
    16111617msgstr ""
    16121618
    1613 #: src/Free/History/Adapters/MenuObject.php:223
     1619#: src/Free/History/Adapters/MenuObject.php:224
    16141620msgid "the same db_id appears twice."
    16151621msgstr ""
    16161622
    1617 #: src/Free/History/Adapters/MenuObject.php:250
     1623#: src/Free/History/Adapters/MenuObject.php:251
    16181624msgid "unknown item type."
    16191625msgstr ""
    16201626
    1621 #: src/Free/History/Adapters/MenuObject.php:259
     1627#: src/Free/History/Adapters/MenuObject.php:260
    16221628msgid "the URL must use http, https, mailto or tel (or be relative)."
    16231629msgstr ""
    16241630
    1625 #: src/Free/History/Adapters/MenuObject.php:262
     1631#: src/Free/History/Adapters/MenuObject.php:263
    16261632msgid "a custom link needs a url."
    16271633msgstr ""
    16281634
    1629 #: src/Free/History/Adapters/MenuObject.php:265
     1635#: src/Free/History/Adapters/MenuObject.php:266
    16301636msgid "a custom link needs a title."
    16311637msgstr ""
    16321638
    1633 #: src/Free/History/Adapters/MenuObject.php:273
     1639#: src/Free/History/Adapters/MenuObject.php:274
    16341640msgid "object must be a public post type."
    16351641msgstr ""
    16361642
    1637 #: src/Free/History/Adapters/MenuObject.php:276
     1643#: src/Free/History/Adapters/MenuObject.php:277
    16381644msgid "object_id is not an existing item of that post type."
    16391645msgstr ""
    16401646
    1641 #: src/Free/History/Adapters/MenuObject.php:279
     1647#: src/Free/History/Adapters/MenuObject.php:280
    16421648msgid "the connected user cannot read the target item."
    16431649msgstr ""
    16441650
    1645 #: src/Free/History/Adapters/MenuObject.php:283
     1651#: src/Free/History/Adapters/MenuObject.php:284
    16461652msgid "object must be a taxonomy that menus can link to."
    16471653msgstr ""
    16481654
    1649 #: src/Free/History/Adapters/MenuObject.php:287
     1655#: src/Free/History/Adapters/MenuObject.php:288
    16501656msgid "object_id is not an existing term of that taxonomy."
    16511657msgstr ""
    16521658
    1653 #: src/Free/History/Adapters/MenuObject.php:292
     1659#: src/Free/History/Adapters/MenuObject.php:293
    16541660msgid "object must be a post type with an archive."
    16551661msgstr ""
    16561662
    1657 #: src/Free/History/Adapters/MenuObject.php:298
     1663#: src/Free/History/Adapters/MenuObject.php:299
    16581664msgid "target must be empty or _blank."
    16591665msgstr ""
    16601666
    1661 #: src/Free/History/Adapters/MenuObject.php:359
     1667#: src/Free/History/Adapters/MenuObject.php:360
    16621668msgid "The menu could not be read from the database."
    16631669msgstr ""
    16641670
    1665 #: src/Free/History/Adapters/MenuObject.php:366
     1671#: src/Free/History/Adapters/MenuObject.php:367
    16661672msgid "The menu metadata could not be read from the database."
    16671673msgstr ""
    16681674
    1669 #: src/Free/History/Adapters/MenuObject.php:374
     1675#: src/Free/History/Adapters/MenuObject.php:375
    16701676msgid "The menu items could not be read from the database."
    16711677msgstr ""
    16721678
    1673 #: src/Free/History/Adapters/MenuObject.php:420
     1679#: src/Free/History/Adapters/MenuObject.php:421
    16741680msgid "The menu item metadata could not be read from the database."
    16751681msgstr ""
    16761682
    1677 #: src/Free/History/Adapters/MenuObject.php:462
     1683#: src/Free/History/Adapters/MenuObject.php:463
    16781684#: src/Free/History/Adapters/TermObject.php:234
    16791685msgid "The creation marker could not be stored."
    16801686msgstr ""
    16811687
    1682 #: src/Free/History/Adapters/MenuObject.php:506
     1688#: src/Free/History/Adapters/MenuObject.php:507
    16831689msgid "Unknown menu operation."
    16841690msgstr ""
    16851691
    16861692#. translators: %s: menu location slug.
    1687 #: src/Free/History/Adapters/MenuObject.php:527
     1693#: src/Free/History/Adapters/MenuObject.php:528
    16881694#, php-format
    16891695msgid "The theme does not register the menu location \"%s\"."
    16901696msgstr ""
    16911697
    1692 #: src/Free/History/Adapters/MenuObject.php:556
     1698#: src/Free/History/Adapters/MenuObject.php:557
    16931699msgid "This menu has too many items to rewrite reversibly."
    16941700msgstr ""
    16951701
    1696 #: src/Free/History/Adapters/MenuObject.php:598
     1702#: src/Free/History/Adapters/MenuObject.php:599
    16971703msgid "WordPress did not save a menu item."
    16981704msgstr ""
    16991705
    1700 #: src/Free/History/Adapters/MenuObject.php:606
     1706#: src/Free/History/Adapters/MenuObject.php:607
    17011707msgid "WordPress did not remove a menu item."
    17021708msgstr ""
    17031709
    1704 #: src/Free/History/Adapters/MenuObject.php:618
     1710#: src/Free/History/Adapters/MenuObject.php:619
    17051711msgid "The menu order could not be saved."
    17061712msgstr ""
    17071713
    1708 #: src/Free/History/Adapters/MenuObject.php:655
     1714#: src/Free/History/Adapters/MenuObject.php:656
    17091715msgid "WordPress did not delete the menu."
    17101716msgstr ""
    17111717
    1712 #: src/Free/History/Adapters/MenuObject.php:662
     1718#: src/Free/History/Adapters/MenuObject.php:663
    17131719msgid "WordPress left menu items behind, so the delete was cancelled."
    17141720msgstr ""
    17151721
    1716 #: src/Free/History/Adapters/MenuObject.php:688
     1722#: src/Free/History/Adapters/MenuObject.php:689
    17171723msgid "Another menu now uses this slug."
    17181724msgstr ""
    17191725
    1720 #: src/Free/History/Adapters/MenuObject.php:695
     1726#: src/Free/History/Adapters/MenuObject.php:696
    17211727msgid "Leftover relationships already use this menu identifier."
    17221728msgstr ""
    17231729
    1724 #: src/Free/History/Adapters/MenuObject.php:700
     1730#: src/Free/History/Adapters/MenuObject.php:701
    17251731msgid "The menu was recreated with another identifier."
    17261732msgstr ""
    17271733
    1728 #: src/Free/History/Adapters/MenuObject.php:705
     1734#: src/Free/History/Adapters/MenuObject.php:706
    17291735msgid "The menu rows could not be restored."
    17301736msgstr ""
    17311737
    1732 #: src/Free/History/Adapters/MenuObject.php:736
     1738#: src/Free/History/Adapters/MenuObject.php:737
    17331739msgid "A menu item could not be restored."
    17341740msgstr ""
    17351741
    1736 #: src/Free/History/Adapters/MenuObject.php:742
     1742#: src/Free/History/Adapters/MenuObject.php:743
    17371743msgid "Leftover relationships already use a menu item identifier."
    17381744msgstr ""
    17391745
    1740 #: src/Free/History/Adapters/MenuObject.php:749
     1746#: src/Free/History/Adapters/MenuObject.php:750
    17411747msgid "A menu item relationship could not be restored."
    17421748msgstr ""
    17431749
    1744 #: src/Free/History/Adapters/MenuObject.php:774
     1750#: src/Free/History/Adapters/MenuObject.php:775
    17451751msgid "A menu item could not be removed."
    17461752msgstr ""
    17471753
    1748 #: src/Free/History/Adapters/MenuObject.php:833
     1754#: src/Free/History/Adapters/MenuObject.php:834
    17491755msgid "The active theme changed, so the menu locations cannot be restored."
    17501756msgstr ""
    17511757
    17521758#. translators: %s: menu location slug.
    1753 #: src/Free/History/Adapters/MenuObject.php:856
     1759#: src/Free/History/Adapters/MenuObject.php:857
    17541760#, php-format
    17551761msgid "The menu location \"%s\" is now used by another menu."
    17561762msgstr ""
    17571763
    1758 #: src/Free/History/Adapters/MenuObject.php:998
     1764#: src/Free/History/Adapters/MenuObject.php:999
    17591765#: src/Free/History/Engine.php:1646
    17601766msgid "(menu)"
    17611767msgstr ""
    17621768
    1763 #: src/Free/History/Adapters/MenuObject.php:1066
     1769#: src/Free/History/Adapters/MenuObject.php:1067
    17641770msgid "The active theme is a block theme and does not display classic menus; its navigation lives in wp_navigation posts."
    17651771msgstr ""
    … …  
    17691775msgstr ""
    17701776
    1771 #: src/Free/History/Adapters/OptionObject.php:97
     1777#: src/Free/History/Adapters/OptionObject.php:98
    17721778msgid "WordPress did not save the option."
    17731779msgstr ""
    17741780
    1775 #: src/Free/History/Adapters/OptionObject.php:109
     1781#: src/Free/History/Adapters/OptionObject.php:110
    17761782msgid "The option snapshot does not match this option."
    17771783msgstr ""
    17781784
    1779 #: src/Free/History/Adapters/OptionObject.php:115
     1785#: src/Free/History/Adapters/OptionObject.php:116
    17801786msgid "The option could not be removed."
    17811787msgstr ""
    17821788
    1783 #: src/Free/History/Adapters/OptionObject.php:131
     1789#: src/Free/History/Adapters/OptionObject.php:132
    17841790msgid "The option row could not be restored."
    17851791msgstr ""
    17861792
    1787 #: src/Free/History/Adapters/OptionObject.php:173
     1793#: src/Free/History/Adapters/OptionObject.php:174
    17881794#: src/Free/History/Engine.php:1648
    1789 #: assets/free/js/admin.js:2205
     1795#: assets/free/js/admin.js:2221
    17901796msgid "Site option"
    17911797msgstr ""
    … …  
    20872093#: src/Free/History/Adapters/TermObject.php:570
    20882094#: src/Free/History/Engine.php:1656
    2089 #: assets/free/js/admin.js:2205
     2095#: assets/free/js/admin.js:2221
    20902096msgid "(unnamed term)"
    20912097msgstr ""
    … …  
    27722778msgstr ""
    27732779
    2774 #: src/Free/Mcp/Endpoint.php:45
     2780#: src/Free/Mcp/Endpoint.php:77
     2781msgid "The access token is not issued for this MCP endpoint."
     2782msgstr ""
     2783
     2784#: src/Free/Mcp/Endpoint.php:156
    27752785msgid "Llamly is updating its database. Try again in a few seconds."
    27762786msgstr ""
    27772787
    2778 #: src/Free/Mcp/Protocol.php:51
    2779 msgid "The access token is not issued for this MCP endpoint."
    2780 msgstr ""
    2781 
    2782 #: src/Free/Mcp/Protocol.php:55
     2788#: src/Free/Mcp/Protocol.php:67
    27832789msgid "The requested MCP protocol version is not supported."
    27842790msgstr ""
    27852791
    2786 #: src/Free/Mcp/Protocol.php:335
     2792#: src/Free/Mcp/Protocol.php:347
    27872793msgid "Connect with an OAuth connector or a scoped Bearer key. Keys are shown only once. Verify client calls in Activity and revoke a key to deny the next request."
    27882794msgstr ""
    27892795
    2790 #: src/Free/Mcp/Protocol.php:336
     2796#: src/Free/Mcp/Protocol.php:348
    27912797msgid "Use read-only access unless writing is needed. Every write must have a durable journal entry, pass the WordPress user capability check, and include the current post revision hash. If storage or concurrency checks fail, Llamly stops before reporting success."
    27922798msgstr ""
    27932799
    2794 #: src/Free/Mcp/Protocol.php:352
     2800#: src/Free/Mcp/Protocol.php:364
    27952801msgid "Review available draft posts without changing them."
    27962802msgstr ""
    27972803
    2798 #: src/Free/Mcp/Protocol.php:362
     2804#: src/Free/Mcp/Protocol.php:374
    27992805msgid "Review posts that are accessible to this connection."
    28002806msgstr ""
    28012807
    2802 #: src/Free/Mcp/Protocol.php:371
     2808#: src/Free/Mcp/Protocol.php:383
    28032809msgid "Connection and access"
    28042810msgstr ""
    28052811
    2806 #: src/Free/Mcp/Protocol.php:372
     2812#: src/Free/Mcp/Protocol.php:384
    28072813msgid "Writing safety"
    28082814msgstr ""
    … …  
    35533559msgstr ""
    35543560
    3555 #: src/Free/Tools/UserTools.php:58
     3561#: src/Free/Tools/UserTools.php:60
    35563562msgid "Unknown role."
    35573563msgstr ""
    35583564
    3559 #: src/Free/Tools/UserTools.php:90
     3565#: src/Free/Tools/UserTools.php:93
    35603566msgid "Send exactly one of user_id, login or email."
    35613567msgstr ""
    35623568
    3563 #: src/Free/Tools/UserTools.php:98
     3569#: src/Free/Tools/UserTools.php:101
    35643570msgid "The user was not found."
    35653571msgstr ""
    35663572
    3567 #: src/Free/Tools/UserTools.php:102
     3573#: src/Free/Tools/UserTools.php:105
    35683574msgid "The connected user cannot view this user's profile."
    35693575msgstr ""
    … …  
    40014007#: assets/free/js/admin.js:449
    40024008#: assets/free/js/admin.js:1528
    4003 #: assets/free/js/admin.js:2295
     4009#: assets/free/js/admin.js:2311
    40044010msgid "Try again"
    40054011msgstr ""
    … …  
    40484054
    40494055#: assets/free/js/admin.js:517
    4050 #: assets/free/js/admin.js:2080
     4056#: assets/free/js/admin.js:2096
    40514057msgid "Media"
    40524058msgstr ""
    … …  
    46214627#. translators: %d: number of tools.
    46224628#: assets/free/js/admin.js:947
    4623 #: assets/free/js/admin.js:2006
     4629#: assets/free/js/admin.js:2021
    46244630#, js-format
    46254631msgid "%d tool"
    … …  
    50265032#: assets/free/js/admin.js:1366
    50275033#: assets/free/js/admin.js:1598
    5028 #: assets/free/js/admin.js:2172
    5029 #: assets/free/js/admin.js:2664
     5034#: assets/free/js/admin.js:2188
     5035#: assets/free/js/admin.js:2680
    50305036msgid "Try again."
    50315037msgstr ""
    … …  
    51745180
    51755181#: assets/free/js/admin.js:1451
    5176 #: assets/free/js/admin.js:2516
     5182#: assets/free/js/admin.js:2532
    51775183msgid "Change undone"
    51785184msgstr ""
    51795185
    51805186#: assets/free/js/admin.js:1451
    5181 #: assets/free/js/admin.js:2517
    5182 #: assets/free/js/admin.js:2520
     5187#: assets/free/js/admin.js:2533
     5188#: assets/free/js/admin.js:2536
    51835189msgid "Change redone"
    51845190msgstr ""
    … …  
    52955301
    52965302#: assets/free/js/admin.js:1534
    5297 #: assets/free/js/admin.js:2301
     5303#: assets/free/js/admin.js:2317
    52985304msgid "Nothing found"
    52995305msgstr ""
    … …  
    53045310
    53055311#: assets/free/js/admin.js:1535
    5306 #: assets/free/js/admin.js:2302
     5312#: assets/free/js/admin.js:2318
    53075313msgid "Clear filters"
    53085314msgstr ""
    … …  
    53305336#. translators: %s: connection name.
    53315337#: assets/free/js/admin.js:1560
    5332 #: assets/free/js/admin.js:2336
     5338#: assets/free/js/admin.js:2352
    53335339msgid "All connections"
    53345340msgstr ""
    … …  
    53365342#. translators: %s: connection name.
    53375343#: assets/free/js/admin.js:1561
    5338 #: assets/free/js/admin.js:2331
     5344#: assets/free/js/admin.js:2347
    53395345#, js-format
    53405346msgid "%s (revoked)"
    … …  
    53475353
    53485354#: assets/free/js/admin.js:1571
    5349 #: assets/free/js/admin.js:2359
     5355#: assets/free/js/admin.js:2375
    53505356msgid "Filter by connection"
    53515357msgstr ""
    … …  
    55735579
    55745580#: assets/free/js/admin.js:1801
    5575 #: assets/free/js/admin.js:2199
    5576 #: assets/free/js/admin.js:2508
     5581#: assets/free/js/admin.js:2215
     5582#: assets/free/js/admin.js:2524
    55775583msgid "Undo"
    55785584msgstr ""
    … …  
    58405846msgstr ""
    58415847
    5842 #: assets/free/js/admin.js:1988
     5848#: assets/free/js/admin.js:1994
     5849msgid "Everything on these screens is free and stays free."
     5850msgstr ""
     5851
     5852#: assets/free/js/admin.js:1996
     5853msgid "Llamly Pro is a separate add-on with extra modules for your agent. The first one, Llamly Builder, builds pages in Elementor and in the block editor."
     5854msgstr ""
     5855
     5856#: assets/free/js/admin.js:1998
     5857msgid "Learn about Llamly Pro"
     5858msgstr ""
     5859
     5860#: assets/free/js/admin.js:1999
     5861msgid "Coming soon."
     5862msgstr ""
     5863
     5864#: assets/free/js/admin.js:2003
    58435865msgid "About"
    58445866msgstr ""
    58455867
    5846 #: assets/free/js/admin.js:2001
     5868#: assets/free/js/admin.js:2016
    58475869msgid "MCP endpoint"
    58485870msgstr ""
    58495871
    5850 #: assets/free/js/admin.js:2001
     5872#: assets/free/js/admin.js:2016
    58515873msgid "Theme"
    58525874msgstr ""
    58535875
    5854 #: assets/free/js/admin.js:2002
    5855 #: assets/free/js/admin.js:2020
     5876#: assets/free/js/admin.js:2017
     5877#: assets/free/js/admin.js:2035
    58565878msgid "Documentation"
    58575879msgstr ""
    58585880
    5859 #: assets/free/js/admin.js:2003
     5881#: assets/free/js/admin.js:2018
    58605882msgid "Support forum on WordPress.org"
    58615883msgstr ""
    58625884
    5863 #: assets/free/js/admin.js:2003
     5885#: assets/free/js/admin.js:2018
    58645886msgid "Report a problem"
    58655887msgstr ""
    58665888
    58675889#. translators: %d: number of site areas.
    5868 #: assets/free/js/admin.js:2008
     5890#: assets/free/js/admin.js:2023
    58695891#, js-format
    58705892msgid "%d area"
    … …  
    58745896
    58755897#. translators: 1: "N tools", 2: "N areas".
    5876 #: assets/free/js/admin.js:2010
     5898#: assets/free/js/admin.js:2025
    58775899#, js-format
    58785900msgid "%1$s in %2$s of the site."
    58795901msgstr ""
    58805902
    5881 #: assets/free/js/admin.js:2013
     5903#: assets/free/js/admin.js:2028
    58825904msgid "Llamly turns your WordPress into an MCP server"
    58835905msgstr ""
    58845906
    5885 #: assets/free/js/admin.js:2015
     5907#: assets/free/js/admin.js:2030
    58865908msgid "AI agents read and edit the site with the permissions you give them. Almost every change stays in the history and can be undone."
    58875909msgstr ""
    58885910
    5889 #: assets/free/js/admin.js:2018
    5890 #: assets/free/js/admin.js:2353
     5911#: assets/free/js/admin.js:2033
     5912#: assets/free/js/admin.js:2369
    58915913msgid "Connect an agent"
    58925914msgstr ""
    58935915
    5894 #: assets/free/js/admin.js:2021
     5916#: assets/free/js/admin.js:2036
    58955917msgid "Getting started"
    58965918msgstr ""
    58975919
    5898 #: assets/free/js/admin.js:2025
     5920#: assets/free/js/admin.js:2040
    58995921msgid "Try asking"
    59005922msgstr ""
    59015923
    5902 #: assets/free/js/admin.js:2026
     5924#: assets/free/js/admin.js:2041
    59035925msgid "Click to copy and paste it into the conversation with your agent."
    59045926msgstr ""
    59055927
    5906 #: assets/free/js/admin.js:2030
     5928#: assets/free/js/admin.js:2045
    59075929msgid "What Llamly can do"
    59085930msgstr ""
    59095931
    5910 #: assets/free/js/admin.js:2032
     5932#: assets/free/js/admin.js:2047
    59115933msgid "Writing is paused on this site; that's why only read tools are shown."
    59125934msgstr ""
    59135935
    5914 #: assets/free/js/admin.js:2036
     5936#: assets/free/js/admin.js:2051
    59155937msgid "The tool catalog is unavailable right now."
    59165938msgstr ""
    59175939
    5918 #: assets/free/js/admin.js:2038
     5940#: assets/free/js/admin.js:2053
    59195941msgid "Elementor detected. In Free, Elementor pages are outside the agent's write reach."
    59205942msgstr ""
    59215943
    5922 #: assets/free/js/admin.js:2041
     5944#: assets/free/js/admin.js:2057
    59235945msgid "Help"
    59245946msgstr ""
    59255947
    5926 #: assets/free/js/admin.js:2045
     5948#: assets/free/js/admin.js:2061
    59275949msgid "System information"
    59285950msgstr ""
    59295951
    5930 #: assets/free/js/admin.js:2046
     5952#: assets/free/js/admin.js:2062
    59315953msgid "Copy information"
    59325954msgstr ""
    59335955
    5934 #: assets/free/js/admin.js:2051
     5956#: assets/free/js/admin.js:2067
    59355957msgid "Prompt copied."
    59365958msgstr ""
    59375959
    5938 #: assets/free/js/admin.js:2053
     5960#: assets/free/js/admin.js:2069
    59395961msgid "Information copied."
    59405962msgstr ""
    59415963
    5942 #: assets/free/js/admin.js:2062
     5964#: assets/free/js/admin.js:2078
    59435965msgid "Created a post"
    59445966msgstr ""
    59455967
    5946 #: assets/free/js/admin.js:2062
     5968#: assets/free/js/admin.js:2078
    59475969msgid "Edited a post"
    59485970msgstr ""
    59495971
    5950 #: assets/free/js/admin.js:2063
     5972#: assets/free/js/admin.js:2079
    59515973msgid "Removed a post"
    59525974msgstr ""
    59535975
    5954 #: assets/free/js/admin.js:2063
     5976#: assets/free/js/admin.js:2079
    59555977msgid "Created a draft"
    59565978msgstr ""
    59575979
    5958 #: assets/free/js/admin.js:2064
     5980#: assets/free/js/admin.js:2080
    59595981msgid "Edited a draft"
    59605982msgstr ""
    59615983
    5962 #: assets/free/js/admin.js:2065
     5984#: assets/free/js/admin.js:2081
    59635985msgid "Restored a revision"
    59645986msgstr ""
    59655987
    5966 #: assets/free/js/admin.js:2065
     5988#: assets/free/js/admin.js:2081
    59675989msgid "Created a term"
    59685990msgstr ""
    59695991
    5970 #: assets/free/js/admin.js:2066
     5992#: assets/free/js/admin.js:2082
    59715993msgid "Edited a term"
    59725994msgstr ""
    59735995
    5974 #: assets/free/js/admin.js:2066
     5996#: assets/free/js/admin.js:2082
    59755997msgid "Deleted a term"
    59765998msgstr ""
    59775999
    5978 #: assets/free/js/admin.js:2067
     6000#: assets/free/js/admin.js:2083
    59796001msgid "Uploaded media"
    59806002msgstr ""
    59816003
    5982 #: assets/free/js/admin.js:2068
     6004#: assets/free/js/admin.js:2084
    59836005msgid "Edited media"
    59846006msgstr ""
    59856007
    5986 #: assets/free/js/admin.js:2068
     6008#: assets/free/js/admin.js:2084
    59876009msgid "Deleted media"
    59886010msgstr ""
    59896011
    5990 #: assets/free/js/admin.js:2069
     6012#: assets/free/js/admin.js:2085
    59916013msgid "Created a menu"
    59926014msgstr ""
    59936015
    5994 #: assets/free/js/admin.js:2069
     6016#: assets/free/js/admin.js:2085
    59956017msgid "Edited a menu"
    59966018msgstr ""
    59976019
    5998 #: assets/free/js/admin.js:2070
     6020#: assets/free/js/admin.js:2086
    59996021msgid "Deleted a menu"
    60006022msgstr ""
    60016023
    6002 #: assets/free/js/admin.js:2070
     6024#: assets/free/js/admin.js:2086
    60036025msgid "Reorganized the menu items"
    60046026msgstr ""
    60056027
    6006 #: assets/free/js/admin.js:2071
     6028#: assets/free/js/admin.js:2087
    60076029msgid "Created a comment"
    60086030msgstr ""
    60096031
    6010 #: assets/free/js/admin.js:2071
     6032#: assets/free/js/admin.js:2087
    60116033msgid "Edited a comment"
    60126034msgstr ""
    60136035
    6014 #: assets/free/js/admin.js:2072
     6036#: assets/free/js/admin.js:2088
    60156037msgid "Deleted a comment"
    60166038msgstr ""
    60176039
    6018 #: assets/free/js/admin.js:2073
     6040#: assets/free/js/admin.js:2089
    60196041msgid "Changed a site setting"
    60206042msgstr ""
    60216043
    6022 #: assets/free/js/admin.js:2074
     6044#: assets/free/js/admin.js:2090
    60236045msgid "Edited blocks"
    60246046msgstr ""
    60256047
    6026 #: assets/free/js/admin.js:2074
     6048#: assets/free/js/admin.js:2090
    60276049msgid "Created a pattern"
    60286050msgstr ""
    60296051
    6030 #: assets/free/js/admin.js:2075
     6052#: assets/free/js/admin.js:2091
    60316053msgid "Edited a pattern"
    60326054msgstr ""
    60336055
    6034 #: assets/free/js/admin.js:2075
     6056#: assets/free/js/admin.js:2091
    60356057msgid "Deleted a pattern"
    60366058msgstr ""
    60376059
    6038 #: assets/free/js/admin.js:2076
     6060#: assets/free/js/admin.js:2092
    60396061msgid "Saved a template"
    60406062msgstr ""
    60416063
    6042 #: assets/free/js/admin.js:2076
     6064#: assets/free/js/admin.js:2092
    60436065msgid "Reset the template to the original"
    60446066msgstr ""
    60456067
    6046 #: assets/free/js/admin.js:2077
     6068#: assets/free/js/admin.js:2093
    60476069msgid "Changed the global styles"
    60486070msgstr ""
    60496071
    6050 #: assets/free/js/admin.js:2079
     6072#: assets/free/js/admin.js:2095
    60516073msgid "Post"
    60526074msgstr ""
    60536075
    6054 #: assets/free/js/admin.js:2079
     6076#: assets/free/js/admin.js:2095
    60556077msgid "Page"
    60566078msgstr ""
    60576079
    6058 #: assets/free/js/admin.js:2079
     6080#: assets/free/js/admin.js:2095
    60596081msgid "Term"
    60606082msgstr ""
    60616083
    6062 #: assets/free/js/admin.js:2080
     6084#: assets/free/js/admin.js:2096
    60636085msgid "Menu"
    60646086msgstr ""
    60656087
    6066 #: assets/free/js/admin.js:2080
     6088#: assets/free/js/admin.js:2096
    60676089msgid "Comment"
    60686090msgstr ""
    60696091
    6070 #: assets/free/js/admin.js:2081
     6092#: assets/free/js/admin.js:2097
    60716093msgid "User"
    60726094msgstr ""
    60736095
    6074 #: assets/free/js/admin.js:2081
     6096#: assets/free/js/admin.js:2097
    60756097msgid "Site setting"
    60766098msgstr ""
    60776099
    6078 #: assets/free/js/admin.js:2081
     6100#: assets/free/js/admin.js:2097
    60796101msgid "Block pattern"
    60806102msgstr ""
    60816103
    6082 #: assets/free/js/admin.js:2082
     6104#: assets/free/js/admin.js:2098
    60836105msgid "Template"
    60846106msgstr ""
    60856107
    6086 #: assets/free/js/admin.js:2084
     6108#: assets/free/js/admin.js:2100
    60876109msgctxt "changed field"
    60886110msgid "title"
    60896111msgstr ""
    60906112
    6091 #: assets/free/js/admin.js:2084
     6113#: assets/free/js/admin.js:2100
    60926114msgctxt "changed field"
    60936115msgid "content"
    60946116msgstr ""
    60956117
    6096 #: assets/free/js/admin.js:2085
     6118#: assets/free/js/admin.js:2101
    60976119msgctxt "changed field"
    60986120msgid "excerpt"
    60996121msgstr ""
    61006122
    6101 #: assets/free/js/admin.js:2085
     6123#: assets/free/js/admin.js:2101
    61026124msgctxt "changed field"
    61036125msgid "status"
    61046126msgstr ""
    61056127
    6106 #: assets/free/js/admin.js:2086
    6107 #: assets/free/js/admin.js:2089
     6128#: assets/free/js/admin.js:2102
     6129#: assets/free/js/admin.js:2105
    61086130msgctxt "changed field"
    61096131msgid "slug"
    61106132msgstr ""
    61116133
    6112 #: assets/free/js/admin.js:2086
     6134#: assets/free/js/admin.js:2102
    61136135msgctxt "changed field"
    61146136msgid "date"
    61156137msgstr ""
    61166138
    6117 #: assets/free/js/admin.js:2087
     6139#: assets/free/js/admin.js:2103
    61186140msgctxt "changed field"
    61196141msgid "parent page"
    61206142msgstr ""
    61216143
    6122 #: assets/free/js/admin.js:2087
     6144#: assets/free/js/admin.js:2103
    61236145msgctxt "changed field"
    61246146msgid "order"
    61256147msgstr ""
    61266148
    6127 #: assets/free/js/admin.js:2088
     6149#: assets/free/js/admin.js:2104
    61286150msgctxt "changed field"
    61296151msgid "author"
    61306152msgstr ""
    61316153
    6132 #: assets/free/js/admin.js:2088
     6154#: assets/free/js/admin.js:2104
    61336155msgctxt "changed field"
    61346156msgid "type"
    61356157msgstr ""
    61366158
    6137 #: assets/free/js/admin.js:2088
     6159#: assets/free/js/admin.js:2104
    61386160msgctxt "changed field"
    61396161msgid "name"
    61406162msgstr ""
    61416163
    6142 #: assets/free/js/admin.js:2089
     6164#: assets/free/js/admin.js:2105
    61436165msgctxt "changed field"
    61446166msgid "description"
    61456167msgstr ""
    61466168
    6147 #: assets/free/js/admin.js:2090
     6169#: assets/free/js/admin.js:2106
    61486170msgctxt "changed field"
    61496171msgid "value"
    61506172msgstr ""
    61516173
    6152 #: assets/free/js/admin.js:2090
     6174#: assets/free/js/admin.js:2106
    61536175msgctxt "changed field"
    61546176msgid "alt text"
    61556177msgstr ""
    61566178
    6157 #: assets/free/js/admin.js:2091
     6179#: assets/free/js/admin.js:2107
    61586180msgctxt "changed field"
    61596181msgid "caption"
    61606182msgstr ""
    61616183
    6162 #: assets/free/js/admin.js:2094
     6184#: assets/free/js/admin.js:2110
    61636185msgid "Force undid"
    61646186msgstr ""
    61656187
    6166 #: assets/free/js/admin.js:2095
    6167 #: assets/free/js/admin.js:2238
     6188#: assets/free/js/admin.js:2111
     6189#: assets/free/js/admin.js:2254
    61686190msgid "Undid a change"
    61696191msgstr ""
    61706192
    6171 #: assets/free/js/admin.js:2096
    6172 #: assets/free/js/admin.js:2238
     6193#: assets/free/js/admin.js:2112
     6194#: assets/free/js/admin.js:2254
    61736195msgid "Redid a change"
    61746196msgstr ""
    61756197
    6176 #: assets/free/js/admin.js:2097
     6198#: assets/free/js/admin.js:2113
    61776199msgid "Created an item"
    61786200msgstr ""
    61796201
    6180 #: assets/free/js/admin.js:2098
     6202#: assets/free/js/admin.js:2114
    61816203msgid "Removed an item"
    61826204msgstr ""
    61836205
    6184 #: assets/free/js/admin.js:2099
     6206#: assets/free/js/admin.js:2115
    61856207msgid "Changed the content"
    61866208msgstr ""
    61876209
    61886210#. translators: %d: number of custom fields.
    6189 #: assets/free/js/admin.js:2108
     6211#: assets/free/js/admin.js:2124
    61906212#, js-format
    61916213msgid "%d custom field"
    … …  
    61946216msgstr[1] ""
    61956217
    6196 #: assets/free/js/admin.js:2109
     6218#: assets/free/js/admin.js:2125
    61976219msgid "categories and tags"
    61986220msgstr ""
    61996221
    62006222#. translators: %s: comma-separated list of changed fields.
    6201 #: assets/free/js/admin.js:2111
     6223#: assets/free/js/admin.js:2127
    62026224#, js-format
    62036225msgid "Changed: %s"
    62046226msgstr ""
    62056227
    6206 #: assets/free/js/admin.js:2123
     6228#: assets/free/js/admin.js:2139
    62076229msgid "Becomes visible to the public"
    62086230msgstr ""
    62096231
    6210 #: assets/free/js/admin.js:2123
     6232#: assets/free/js/admin.js:2139
    62116233msgid "Sensitive data"
    62126234msgstr ""
    62136235
    6214 #: assets/free/js/admin.js:2124
     6236#: assets/free/js/admin.js:2140
    62156237msgid "Removes or replaces content"
    62166238msgstr ""
    62176239
    6218 #: assets/free/js/admin.js:2127
     6240#: assets/free/js/admin.js:2143
    62196241msgid "Pings, feeds, sitemaps, caches and webhooks of third parties are not undone."
    62206242msgstr ""
    62216243
    6222 #: assets/free/js/admin.js:2129
     6244#: assets/free/js/admin.js:2145
    62236245msgid "Pages that embed this synced pattern change for visitors."
    62246246msgstr ""
    62256247
    6226 #: assets/free/js/admin.js:2130
     6248#: assets/free/js/admin.js:2146
    62276249msgid "The whole site changes for visitors; page caches and CDNs are not purged."
    62286250msgstr ""
    62296251
    6230 #: assets/free/js/admin.js:2132
     6252#: assets/free/js/admin.js:2148
    62316253msgid "Every page rendered with this template changes for visitors; page caches and CDNs are not purged."
    62326254msgstr ""
    62336255
    6234 #: assets/free/js/admin.js:2134
     6256#: assets/free/js/admin.js:2150
    62356257msgid "CDN, page and image caches and third-party copies of the file are not undone."
    62366258msgstr ""
    62376259
    6238 #: assets/free/js/admin.js:2136
     6260#: assets/free/js/admin.js:2152
    62396261msgid "Page caches, search engines and feeds may keep the previous value."
    62406262msgstr ""
    62416263
    6242 #: assets/free/js/admin.js:2138
     6264#: assets/free/js/admin.js:2154
    62436265msgctxt "changes filter"
    62446266msgid "All"
    62456267msgstr ""
    62466268
    6247 #: assets/free/js/admin.js:2138
     6269#: assets/free/js/admin.js:2154
    62486270msgctxt "changes filter"
    62496271msgid "Active"
    62506272msgstr ""
    62516273
    6252 #: assets/free/js/admin.js:2139
     6274#: assets/free/js/admin.js:2155
    62536275msgctxt "changes filter"
    62546276msgid "Undone"
    62556277msgstr ""
    62566278
    6257 #: assets/free/js/admin.js:2139
     6279#: assets/free/js/admin.js:2155
    62586280msgctxt "changes filter"
    62596281msgid "Not reversible"
    62606282msgstr ""
    62616283
    6262 #: assets/free/js/admin.js:2186
     6284#: assets/free/js/admin.js:2202
    62636285msgctxt "change state"
    62646286msgid "Undone"
    62656287msgstr ""
    62666288
    6267 #: assets/free/js/admin.js:2187
     6289#: assets/free/js/admin.js:2203
    62686290msgid "Conflict"
    62696291msgstr ""
    62706292
    6271 #: assets/free/js/admin.js:2188
     6293#: assets/free/js/admin.js:2204
    62726294msgctxt "change state"
    62736295msgid "Not reversible"
    62746296msgstr ""
    62756297
    6276 #: assets/free/js/admin.js:2189
     6298#: assets/free/js/admin.js:2205
    62776299msgid "Recovery needed"
    62786300msgstr ""
    62796301
    6280 #: assets/free/js/admin.js:2190
     6302#: assets/free/js/admin.js:2206
    62816303msgid "In progress"
    62826304msgstr ""
    62836305
    6284 #: assets/free/js/admin.js:2191
     6306#: assets/free/js/admin.js:2207
    62856307msgid "Add-on inactive"
    62866308msgstr ""
    62876309
    6288 #: assets/free/js/admin.js:2198
     6310#: assets/free/js/admin.js:2214
    62896311msgid "Review and release"
    62906312msgstr ""
    62916313
    6292 #: assets/free/js/admin.js:2200
    6293 #: assets/free/js/admin.js:2508
    6294 #: assets/free/js/admin.js:2516
     6314#: assets/free/js/admin.js:2216
     6315#: assets/free/js/admin.js:2524
     6316#: assets/free/js/admin.js:2532
    62956317msgid "Redo"
    62966318msgstr ""
    62976319
    6298 #: assets/free/js/admin.js:2201
     6320#: assets/free/js/admin.js:2217
    62996321msgid "Review"
    63006322msgstr ""
    63016323
    63026324#. translators: 1: summary of the original change, 2: when it happened ("today, 14:00").
    6303 #: assets/free/js/admin.js:2223
     6325#: assets/free/js/admin.js:2239
    63046326#, js-format
    63056327msgid "Redoes “%1$s” from %2$s"
    63066328msgstr ""
    63076329
    6308 #: assets/free/js/admin.js:2223
     6330#: assets/free/js/admin.js:2239
    63096331#, js-format
    63106332msgid "Redoes “%s”"
    … …  
    63126334
    63136335#. translators: 1: summary of the original change, 2: when it happened ("today, 14:00").
    6314 #: assets/free/js/admin.js:2227
     6336#: assets/free/js/admin.js:2243
    63156337#, js-format
    63166338msgid "Undoes “%1$s” from %2$s"
    63176339msgstr ""
    63186340
    6319 #: assets/free/js/admin.js:2227
     6341#: assets/free/js/admin.js:2243
    63206342#, js-format
    63216343msgid "Undoes “%s”"
    … …  
    63236345
    63246346#. translators: 1: summary of the original change, 2: when it happened ("today, 14:00").
    6325 #: assets/free/js/admin.js:2230
     6347#: assets/free/js/admin.js:2246
    63266348#, js-format
    63276349msgid "Reverted “%1$s” from %2$s over newer edits."
    63286350msgstr ""
    63296351
    6330 #: assets/free/js/admin.js:2231
     6352#: assets/free/js/admin.js:2247
    63316353#, js-format
    63326354msgid "Reverted “%s” over newer edits."
    63336355msgstr ""
    63346356
    6335 #: assets/free/js/admin.js:2232
     6357#: assets/free/js/admin.js:2248
    63366358msgid "Undoing this change brings back what was replaced."
    63376359msgstr ""
    63386360
    63396361#. translators: 1: relative time ("5 minutes ago"), 2: who undid it.
    6340 #: assets/free/js/admin.js:2244
     6362#: assets/free/js/admin.js:2260
    63416363#, js-format
    63426364msgid "Undone %1$s by %2$s"
    63436365msgstr ""
    63446366
    6345 #: assets/free/js/admin.js:2245
    6346 #: assets/free/js/admin.js:2248
     6367#: assets/free/js/admin.js:2261
     6368#: assets/free/js/admin.js:2264
    63476369msgid "someone"
    63486370msgstr ""
    63496371
    63506372#. translators: 1: relative time ("5 minutes ago"), 2: who redid it.
    6351 #: assets/free/js/admin.js:2247
     6373#: assets/free/js/admin.js:2263
    63526374#, js-format
    63536375msgid "Redone %1$s by %2$s"
    63546376msgstr ""
    63556377
    6356 #: assets/free/js/admin.js:2271
    6357 #: assets/free/js/admin.js:2548
     6378#: assets/free/js/admin.js:2287
     6379#: assets/free/js/admin.js:2564
    63586380msgid "Undo batch"
    63596381msgstr ""
    63606382
    63616383#. translators: %d: number of changes in the batch.
    6362 #: assets/free/js/admin.js:2275
     6384#: assets/free/js/admin.js:2291
    63636385#, js-format
    63646386msgid "Batch of %d change"
    … …  
    63676389msgstr[1] ""
    63686390
    6369 #: assets/free/js/admin.js:2279
     6391#: assets/free/js/admin.js:2295
    63706392#, js-format
    63716393msgid "%1$d of %2$d change shown. The others are outside the current filters."
    … …  
    63756397
    63766398#. translators: 1: number of changes already undone, 2: total changes in the batch.
    6377 #: assets/free/js/admin.js:2283
     6399#: assets/free/js/admin.js:2299
    63786400#, js-format
    63796401msgid "%1$d of %2$d already undone"
    … …  
    63826404msgstr[1] ""
    63836405
    6384 #: assets/free/js/admin.js:2287
     6406#: assets/free/js/admin.js:2303
    63856407#, js-format
    63866408msgid "%d item"
    … …  
    63896411msgstr[1] ""
    63906412
    6391 #: assets/free/js/admin.js:2294
     6413#: assets/free/js/admin.js:2310
    63926414msgid "The history couldn't be loaded"
    63936415msgstr ""
    63946416
    6395 #: assets/free/js/admin.js:2297
     6417#: assets/free/js/admin.js:2313
    63966418msgid "Loading the history…"
    63976419msgstr ""
    63986420
    6399 #: assets/free/js/admin.js:2301
     6421#: assets/free/js/admin.js:2317
    64006422msgid "No change matches these filters."
    64016423msgstr ""
    64026424
    6403 #: assets/free/js/admin.js:2305
     6425#: assets/free/js/admin.js:2321
    64046426msgid "Writing through MCP is paused on this site. Undo and redo are unavailable until it comes back."
    64056427msgstr ""
    64066428
    6407 #: assets/free/js/admin.js:2340
     6429#: assets/free/js/admin.js:2356
    64086430msgid "All types"
    64096431msgstr ""
    64106432
    6411 #: assets/free/js/admin.js:2345
     6433#: assets/free/js/admin.js:2361
    64126434msgid "Change history"
    64136435msgstr ""
    64146436
    6415 #: assets/free/js/admin.js:2349
     6437#: assets/free/js/admin.js:2365
    64166438msgid "No changes yet"
    64176439msgstr ""
    64186440
    6419 #: assets/free/js/admin.js:2351
     6441#: assets/free/js/admin.js:2367
    64206442msgid "When an agent creates or edits something on the site, it shows up here with the option to undo."
    64216443msgstr ""
    64226444
    6423 #: assets/free/js/admin.js:2352
     6445#: assets/free/js/admin.js:2368
    64246446msgid "Writing through MCP is paused on this site. Reading is still available."
    64256447msgstr ""
    64266448
    6427 #: assets/free/js/admin.js:2357
     6449#: assets/free/js/admin.js:2373
    64286450msgid "Search by change or item"
    64296451msgstr ""
    64306452
    6431 #: assets/free/js/admin.js:2358
     6453#: assets/free/js/admin.js:2374
    64326454msgid "Search the history"
    64336455msgstr ""
    64346456
    6435 #: assets/free/js/admin.js:2360
     6457#: assets/free/js/admin.js:2376
    64366458msgid "Filter by item type"
    64376459msgstr ""
    64386460
    6439 #: assets/free/js/admin.js:2367
     6461#: assets/free/js/admin.js:2383
    64406462msgid "(removed)"
    64416463msgstr ""
    64426464
    6443 #: assets/free/js/admin.js:2367
     6465#: assets/free/js/admin.js:2383
    64446466msgid "(moved to the trash)"
    64456467msgstr ""
    64466468
    6447 #: assets/free/js/admin.js:2367
     6469#: assets/free/js/admin.js:2383
    64486470msgid "(deleted)"
    64496471msgstr ""
    64506472
    6451 #: assets/free/js/admin.js:2371
     6473#: assets/free/js/admin.js:2387
    64526474msgctxt "changed field"
    64536475msgid "item"
    64546476msgstr ""
    64556477
    6456 #: assets/free/js/admin.js:2396
     6478#: assets/free/js/admin.js:2412
    64576479msgid "(empty)"
    64586480msgstr ""
    64596481
    64606482#. translators: %d: number of changed lines that are not shown.
    6461 #: assets/free/js/admin.js:2416
     6483#: assets/free/js/admin.js:2432
    64626484#, js-format
    64636485msgid "…and %d more changed line"
    … …  
    64666488msgstr[1] ""
    64676489
    6468 #: assets/free/js/admin.js:2419
     6490#: assets/free/js/admin.js:2435
    64696491msgid "Changed beyond the shown excerpt."
    64706492msgstr ""
    64716493
    6472 #: assets/free/js/admin.js:2420
     6494#: assets/free/js/admin.js:2436
    64736495msgid "Incomplete diff: the value is longer than what is shown."
    64746496msgstr ""
    64756497
    6476 #: assets/free/js/admin.js:2424
     6498#: assets/free/js/admin.js:2440
    64776499msgid "Only the first changes are shown."
    64786500msgstr ""
    64796501
    6480 #: assets/free/js/admin.js:2433
     6502#: assets/free/js/admin.js:2449
    64816503msgid "Risk not given"
    64826504msgstr ""
    64836505
    6484 #: assets/free/js/admin.js:2438
     6506#: assets/free/js/admin.js:2454
    64856507msgid "Approved"
    64866508msgstr ""
    64876509
    6488 #: assets/free/js/admin.js:2440
    6489 #: assets/free/js/admin.js:2650
     6510#: assets/free/js/admin.js:2456
     6511#: assets/free/js/admin.js:2666
    64906512msgid "Reject"
    64916513msgstr ""
    64926514
    6493 #: assets/free/js/admin.js:2442
    6494 #: assets/free/js/admin.js:2647
     6515#: assets/free/js/admin.js:2458
     6516#: assets/free/js/admin.js:2663
    64956517msgid "Approve"
    64966518msgstr ""
    64976519
    6498 #: assets/free/js/admin.js:2448
     6520#: assets/free/js/admin.js:2464
    64996521#, js-format
    65006522msgid "The agent sent this request %d times. Your answer applies to all of them."
    … …  
    65026524
    65036525#. translators: %s: when the request leaves the list ("tomorrow, 14:00").
    6504 #: assets/free/js/admin.js:2451
     6526#: assets/free/js/admin.js:2467
    65056527#, js-format
    65066528msgid "Expires %s"
    65076529msgstr ""
    65086530
    6509 #: assets/free/js/admin.js:2461
     6531#: assets/free/js/admin.js:2477
    65106532#, js-format
    65116533msgid "Approved until %s. Waiting for the agent to repeat the request."
    65126534msgstr ""
    65136535
    6514 #: assets/free/js/admin.js:2466
     6536#: assets/free/js/admin.js:2482
    65156537msgid "Requests waiting for approval"
    65166538msgstr ""
    65176539
    6518 #: assets/free/js/admin.js:2468
     6540#: assets/free/js/admin.js:2484
    65196541msgid "The agent has to repeat the request after approval."
    65206542msgstr ""
    65216543
    6522 #: assets/free/js/admin.js:2501
     6544#: assets/free/js/admin.js:2517
    65236545msgid "It's recorded as a new change."
    65246546msgstr ""
    65256547
    6526 #: assets/free/js/admin.js:2503
     6548#: assets/free/js/admin.js:2519
    65276549msgid "Undo this change?"
    65286550msgstr ""
    65296551
    6530 #: assets/free/js/admin.js:2503
     6552#: assets/free/js/admin.js:2519
    65316553msgid "Redo this change?"
    65326554msgstr ""
    65336555
    6534 #: assets/free/js/admin.js:2505
     6556#: assets/free/js/admin.js:2521
    65356557msgid "Llamly checks that the item is still as the agent left it before changing it. If someone edited it since, nothing is changed."
    65366558msgstr ""
    65376559
    65386560#. translators: %d: number of other changes not listed.
    6539 #: assets/free/js/admin.js:2532
     6561#: assets/free/js/admin.js:2548
    65406562#, js-format
    65416563msgid "and %d more"
    … …  
    65456567
    65466568#. translators: %d: number of changes in the batch.
    6547 #: assets/free/js/admin.js:2536
     6569#: assets/free/js/admin.js:2552
    65486570msgid "Undo this batch?"
    65496571msgstr ""
    65506572
    6551 #: assets/free/js/admin.js:2536
     6573#: assets/free/js/admin.js:2552
    65526574#, js-format
    65536575msgid "%d change made together by the agent."
    … …  
    65576579
    65586580#. translators: %d: number of changes of the batch outside the current filters that are still to undo.
    6559 #: assets/free/js/admin.js:2541
     6581#: assets/free/js/admin.js:2557
    65606582#, js-format
    65616583msgid "%d change of this batch is outside the current filters"
    … …  
    65646586msgstr[1] ""
    65656587
    6566 #: assets/free/js/admin.js:2543
     6588#: assets/free/js/admin.js:2559
    65676589msgid "Undo batch undoes it too:"
    65686590msgid_plural "Undo batch undoes them too:"
    … …  
    65706592msgstr[1] ""
    65716593
    6572 #: assets/free/js/admin.js:2546
     6594#: assets/free/js/admin.js:2562
    65736595msgid "Llamly undoes from the newest change to the oldest. If one of them changed since, it stops there and shows what's left. Each undo is recorded as a new change."
    65746596msgstr ""
    65756597
    6576 #: assets/free/js/admin.js:2556
     6598#: assets/free/js/admin.js:2572
    65776599msgid "The change couldn't be undone."
    65786600msgstr ""
    65796601
    65806602#. translators: 1: changes undone, 2: total changes in the batch.
    6581 #: assets/free/js/admin.js:2560
     6603#: assets/free/js/admin.js:2576
    65826604msgid "Batch partly undone"
    65836605msgstr ""
    65846606
    6585 #: assets/free/js/admin.js:2560
     6607#: assets/free/js/admin.js:2576
    65866608#, js-format
    65876609msgid "%1$d of %2$d change undone."
    … …  
    65906612msgstr[1] ""
    65916613
    6592 #: assets/free/js/admin.js:2564
     6614#: assets/free/js/admin.js:2580
    65936615#, js-format
    65946616msgid "Stopped at %s"
    65956617msgstr ""
    65966618
    6597 #: assets/free/js/admin.js:2565
     6619#: assets/free/js/admin.js:2581
    65986620msgid "a change"
    65996621msgstr ""
    66006622
    66016623#. translators: %d: number of changes left in the batch.
    6602 #: assets/free/js/admin.js:2567
     6624#: assets/free/js/admin.js:2583
    66036625#, js-format
    66046626msgid "%d change of this batch is left."
    … …  
    66076629msgstr[1] ""
    66086630
    6609 #: assets/free/js/admin.js:2569
     6631#: assets/free/js/admin.js:2585
    66106632msgid "Review the item and try again. The ones already undone aren't repeated."
    66116633msgstr ""
    66126634
    6613 #: assets/free/js/admin.js:2570
     6635#: assets/free/js/admin.js:2586
    66146636msgid "Got it"
    66156637msgstr ""
    66166638
    66176639#. translators: %d: number of items undone.
    6618 #: assets/free/js/admin.js:2574
     6640#: assets/free/js/admin.js:2590
    66196641#, js-format
    66206642msgid "Batch undone (%d item)"
    … …  
    66236645msgstr[1] ""
    66246646
    6625 #: assets/free/js/admin.js:2582
     6647#: assets/free/js/admin.js:2598
    66266648msgid "Undo anyway?"
    66276649msgstr ""
    66286650
    6629 #: assets/free/js/admin.js:2583
     6651#: assets/free/js/admin.js:2599
    66306652msgid "The item goes back to how it was before this agent change. Edits made after it are replaced."
    66316653msgstr ""
    66326654
    6633 #: assets/free/js/admin.js:2585
     6655#: assets/free/js/admin.js:2601
    66346656msgid "Nothing is lost: the force undo stays in the history as a new change, and undoing it brings back the replaced state."
    66356657msgstr ""
    66366658
    6637 #: assets/free/js/admin.js:2587
    6638 #: assets/free/js/admin.js:2618
     6659#: assets/free/js/admin.js:2603
     6660#: assets/free/js/admin.js:2634
    66396661msgid "Undo anyway"
    66406662msgstr ""
    66416663
    6642 #: assets/free/js/admin.js:2595
     6664#: assets/free/js/admin.js:2611
    66436665msgid "Change force undone. You can undo it from the history."
    66446666msgstr ""
    66456667
    6646 #: assets/free/js/admin.js:2606
     6668#: assets/free/js/admin.js:2622
    66476669msgid "Review conflict"
    66486670msgstr ""
    66496671
    6650 #: assets/free/js/admin.js:2608
     6672#: assets/free/js/admin.js:2624
    66516673msgid "The item changed after this change."
    66526674msgstr ""
    66536675
    6654 #: assets/free/js/admin.js:2612
     6676#: assets/free/js/admin.js:2628
    66556677msgid "Undo anyway takes the item back to how it was before the agent change and overwrites the edit made after it. The undo stays in the history and can be undone."
    66566678msgstr ""
    66576679
    6658 #: assets/free/js/admin.js:2614
     6680#: assets/free/js/admin.js:2630
    66596681msgid "To undo, the item has to be as the agent left it. Check the item in WordPress."
    66606682msgstr ""
    66616683
    6662 #: assets/free/js/admin.js:2616
     6684#: assets/free/js/admin.js:2632
    66636685msgid "Open in WordPress"
    66646686msgstr ""
    66656687
    6666 #: assets/free/js/admin.js:2617
     6688#: assets/free/js/admin.js:2633
    66676689msgid "Keep as is"
    66686690msgstr ""
    66696691
    6670 #: assets/free/js/admin.js:2624
     6692#: assets/free/js/admin.js:2640
    66716693msgid "Accept the item's current state?"
    66726694msgstr ""
    66736695
    6674 #: assets/free/js/admin.js:2624
     6696#: assets/free/js/admin.js:2640
    66756697msgid "A change was interrupted."
    66766698msgstr ""
    66776699
    6678 #: assets/free/js/admin.js:2626
     6700#: assets/free/js/admin.js:2642
    66796701msgid "The item matches neither the previous state nor the request. Open the item in WordPress and check the saved content."
    66806702msgstr ""
    66816703
    6682 #: assets/free/js/admin.js:2628
     6704#: assets/free/js/admin.js:2644
    66836705msgid "When you accept, Llamly doesn't change the content: it closes this operation, allows new changes and invalidates editors open with the old version."
    66846706msgstr ""
    66856707
    6686 #: assets/free/js/admin.js:2630
     6708#: assets/free/js/admin.js:2646
    66876709msgid "Accept current state"
    66886710msgstr ""
    66896711
    6690 #: assets/free/js/admin.js:2635
     6712#: assets/free/js/admin.js:2651
    66916713msgid "The recovery was recorded and the item was released."
    66926714msgstr ""
    66936715
    6694 #: assets/free/js/admin.js:2642
     6716#: assets/free/js/admin.js:2658
    66956717msgid "The agent"
    66966718msgstr ""
    66976719
    6698 #: assets/free/js/admin.js:2645
     6720#: assets/free/js/admin.js:2661
    66996721msgid "Approve this request?"
    67006722msgstr ""
    67016723
    6702 #: assets/free/js/admin.js:2646
     6724#: assets/free/js/admin.js:2662
    67036725msgid "The approval is only for this request and for a limited time. The agent has to repeat the request after approval. The change goes into the history and can be undone."
    67046726msgstr ""
    67056727
    6706 #: assets/free/js/admin.js:2648
     6728#: assets/free/js/admin.js:2664
    67076729msgid "Reject this request?"
    67086730msgstr ""
    67096731
    6710 #: assets/free/js/admin.js:2649
     6732#: assets/free/js/admin.js:2665
    67116733msgid "Nothing is changed. If the agent repeats the same request, it gets the rejection."
    67126734msgstr ""
    67136735
    6714 #: assets/free/js/admin.js:2659
     6736#: assets/free/js/admin.js:2675
    67156737msgid "Request approved. The agent has to repeat the request."
    67166738msgstr ""
    67176739
    6718 #: assets/free/js/admin.js:2660
     6740#: assets/free/js/admin.js:2676
    67196741msgid "Request rejected."
    67206742msgstr ""
    67216743
    67226744#. translators: 1: requests answered, 2: requests that failed, 3: reason.
    6723 #: assets/free/js/admin.js:2663
     6745#: assets/free/js/admin.js:2679
    67246746#, js-format
    67256747msgid "%1$d requests were answered and %2$d failed: %3$s"
    67266748msgstr ""
    67276749
    6728 #: assets/free/js/admin.js:2672
     6750#: assets/free/js/admin.js:2688
    67296751msgid "Activity"
    67306752msgstr ""
    67316753
    6732 #: assets/free/js/admin.js:2681
     6754#: assets/free/js/admin.js:2697
    67336755msgid "Every change made by an agent is recorded with the previous state. You can undo each change separately."
    67346756msgstr ""
  • llamly/trunk/llamly.php

    r3788333 r3800467  
    33 * Plugin Name: Llamly MCP - AI Agent with ChatGPT & Claude
    44 * Description: Connect AI clients to WordPress through the Llamly MCP server.
    5  * Version: 1.0.3
     5 * Version: 1.1.0
    66 * Requires at least: 6.2
    77 * Requires PHP: 8.0
    … …  
    1919
    2020define('LLAMLY_FREE_PLUGIN_FILE', __FILE__);
    21 define('LLAMLY_FREE_VERSION', '1.0.3');
     21define('LLAMLY_FREE_VERSION', '1.1.0');
    2222// Writes are on by default: concurrent writes and the change journal were verified on WP 7.1 + MariaDB 10.11 and
    2323// WP 6.2 + PHP 8.0 + MySQL 8.0. A site can still pause all writes by defining this constant as false in wp-config.php.
    … …  
    4343define('LLAMLY_FREE_MODULE_API', \Llamly\Free\Modules\ModuleRegistry::API);
    4444
     45// Freemius (LLP-455): usage statistics after an explicit opt-in, and the Llamly Pro add-on. Loaded here, in the main
     46// file, so the SDK sees activation and deactivation. Without ready settings it is not loaded and nothing is defined.
     47\Llamly\Free\Freemius\Sdk::boot();
     48if (\Llamly\Free\Freemius\Sdk::instance() !== null && !function_exists('llamly_fs')) {
     49        /**
     50         * The Freemius instance of Llamly, for Freemius add-ons of Llamly (they check function_exists('llamly_fs') or wait
     51         * for the llamly_fs_loaded action). Defined only when the SDK is loaded.
     52         *
     53         * @return \Freemius
     54         */
     55        function llamly_fs() {
     56                return \Llamly\Free\Freemius\Sdk::instance();
     57        }
     58        do_action('llamly_fs_loaded');
     59}
     60
    4561register_activation_hook(__FILE__, ['\\Llamly\\Free\\Core\\Plugin', 'activate']);
    4662register_deactivation_hook(__FILE__, ['\\Llamly\\Free\\Core\\Plugin', 'deactivate']);
  • llamly/trunk/readme.txt

    r3788333 r3800467  
    55Tested up to: 7.1
    66Requires PHP: 8.0
    7 Stable tag: 1.0.3
     7Stable tag: 1.1.0
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    1414
    1515Llamly MCP connects your WordPress site to the AI you already use: ChatGPT, Claude, Codex, Cursor and other AI agents. Ask in plain language and your agent writes, edits and organizes the site for you, with your WordPress content permissions, a full change history and undo. It is a free WordPress MCP server (Model Context Protocol) that runs inside your own site: no relay, no Llamly server in between, no Llamly account and no API key from an AI provider.
     16
     17https://www.youtube.com/watch?v=mJwEgav2r40
    1618
    1719**Use the AI subscription you already have. Keep every change reversible.**
    … …  
    2224* **Content, never administration**: the agent works with your content permissions only. Whatever your role, it never changes site settings, users, plugins, themes or code, and never writes unfiltered HTML.
    2325* **Bring your own AI**: works with ChatGPT, claude.ai, Claude Desktop, Claude Code, Codex, Cursor, OpenCode and Antigravity CLI. Llamly has no AI of its own and no usage meter: the agent you already pay for does the work.
    24 * **Your data stays on your site**: self-hosted, no account, no relay, no telemetry. Your AI app connects to your site, and Llamly never calls out.
     26* **Your data stays on your site**: self-hosted, no account, no relay. Your AI app connects to your site, and Llamly sends nothing out unless you opt in to the optional usage statistics (see External services).
    2527* **Ready in a few minutes**: a step-by-step recipe for each app with your site address already filled in, an "Add to Claude" button, and a Doctor that checks your server and tells you what to ask your host.
    2628
    … …  
    4749= Connect Claude to WordPress (claude.ai and Claude Desktop) =
    4850
     51Watch the 2-minute tutorial:
     52
     53https://www.youtube.com/watch?v=0lrDl_NwaSw
     54
    4955Click "Add to Claude" in the Llamly recipe, review the request on your site, choose read only or read and write, and click Approve access. The same connector shows up in Claude Desktop on the same account. Needs a public HTTPS address; for a site on your computer, Claude Desktop uses the local bridge shown in the recipe.
    5056
    … …  
    177183= Does Llamly send my content anywhere? =
    178184
    179 No. Llamly makes no outbound calls to Llamly or to any third-party service at runtime. The AI app you connect sends requests to your site and receives the answers; what that app does with them is governed by its own terms. The connection diagnostics in Connections (Run checks) only call your own site (loopback) to check that the REST API, the MCP endpoint and the OAuth discovery URLs answer.
     185No. Your posts, pages, media, connections, keys, logs and change journal are never sent anywhere. Llamly makes no outbound calls at runtime, except the optional usage statistics described in External services, which send nothing unless an administrator opts in. The AI app you connect sends requests to your site and receives the answers; what that app does with them is governed by its own terms. The connection diagnostics in Connections (Run checks) only call your own site (loopback) to check that the REST API, the MCP endpoint and the OAuth discovery URLs answer.
    180186
    181187= Can the agent publish or delete things without me? =
    … …  
    227233There is no Llamly server: the AI app you connect sends its requests straight to your site, and each request acts with the content permissions of the user who created the key or approved the OAuth sign-in, never administrator ones.
    228234
    229 Expired rows are removed by a daily WordPress cron event. Llamly sets no cookies on the public site, adds no tracking, and makes no external requests at runtime. Links in the admin that open claude.ai or chatgpt.com only open those sites in your browser when you click them.
     235Expired rows are removed by a daily WordPress cron event. Llamly sets no cookies on the public site and adds no tracking to it. Llamly itself makes no external requests at runtime; the only exception is the optional, opt-in usage statistics described in External services, which send nothing unless an administrator clicks "Allow & Continue". Links in the admin that open claude.ai or chatgpt.com only open those sites in your browser when you click them.
     236
     237== External services ==
     238
     239Llamly includes the Freemius SDK (https://freemius.com), which Llamly uses for optional usage statistics and, later, to offer the Llamly Pro add-on. It connects to `api.freemius.com` and `wp.freemius.com`.
     240
     241* **Before you choose, and if you skip:** the Llamly screen shows an opt-in screen once, with "Allow & Continue" and "Skip". Nothing is sent to Freemius before you click "Allow & Continue". If you click "Skip", nothing is sent and every feature of Llamly keeps working exactly the same; you can opt in later from the plugin's row on the Plugins screen.
     242* **After you click "Allow & Continue":** your browser sends the opt-in to `wp.freemius.com`, and from then on the site reports to `api.freemius.com`: your first and last name and email address as an administrator, the site URL, title and language, the WordPress, PHP, Llamly and SDK versions, Llamly events (activation, deactivation, uninstall, version updates) and the names, slugs and versions of the installed plugins and themes. The opt-in screen lists these before you agree. Freemius may then email you security and feature updates, educational content and occasional offers, as the opt-in screen says. After opting in, Llamly > Account shows what is shared and lets you opt out.
     243* **Deactivation feedback:** when you deactivate Llamly, an optional form asks why. If you send it, the reason you chose (and any text you wrote) is sent to Freemius, anonymously if you did not opt in. You can skip the form.
     244* Nothing from your posts, pages, media, connections, keys, logs or the change journal is ever sent.
     245
     246Freemius terms of service: https://freemius.com/terms/ · Freemius privacy policy: https://freemius.com/privacy/
    230247
    231248== Source code ==
    … …  
    254271== Changelog ==
    255272
     273= 1.1.0 =
     274* Optional, opt-in usage and diagnostic statistics through Freemius. Nothing is sent without an administrator's consent ("Allow & Continue" on the Llamly screen). "Skip" keeps every feature working exactly the same. See External services.
     275* About: a Llamly Pro card. Llamly Pro will be a separate add-on and is coming soon; nothing in Llamly is locked.
     276* Uninstall keeps the same rules, tells the Freemius SDK about the uninstall (sent only if you opted in or sent deactivation feedback), and also removes what the Freemius SDK stored about Llamly.
     277* Readme: tutorial videos.
     278
    256279= 1.0.3 =
    257280* The MCP endpoint checks the request origin and the caller's credential (Llamly API key or OAuth access token) in its REST permission callback, before the request reaches the MCP handler. Responses to clients are unchanged.
    … …  
    285308== Upgrade Notice ==
    286309
     310= 1.1.0 =
     311Optional, opt-in usage statistics through Freemius: nothing is sent without your consent, and Skip keeps everything working. Llamly Pro add-on coming soon.
     312
    287313= 1.0.3 =
    288314The MCP endpoint authenticates in its REST permission callback. Translations now come from translate.wordpress.org.
  • llamly/trunk/src/Free/Admin/AdminPage.php

    r3788333 r3800467  
    2828                add_action('admin_notices', [self::class, 'renderOnboardingNotice']);
    2929                add_action('admin_post_llamly_free_dismiss_onboarding', [self::class, 'dismissOnboardingNotice']);
     30                if (defined('LLAMLY_FREE_PLUGIN_FILE')) {
     31                        add_filter('plugin_action_links_' . plugin_basename(LLAMLY_FREE_PLUGIN_FILE), [self::class, 'pluginActionLinks']);
     32                }
     33        }
     34
     35        /** Llamly Pro destination for the About card, or '' while Llamly Pro has no page yet. */
     36        private static function proUrl(): string
     37        {
     38                return \Llamly\Free\Freemius\Sdk::config()->upgradeUrl();
     39        }
     40
     41        private static function proActive(): bool
     42        {
     43                return defined('LLAMLY_PRO_VERSION');
     44        }
     45
     46        /**
     47         * Plugins screen row: a "Llamly Pro" link to the Llamly Pro card of the About tab, only once Llamly Pro has a page
     48         * and while it is not active. The card is the one place that points outside (WordPress.org guideline 11).
     49         *
     50         * @param array<string,string> $links
     51         * @return array<string,string>
     52         */
     53        public static function pluginActionLinks($links): array
     54        {
     55                $links = is_array($links) ? $links : [];
     56                if (self::proUrl() !== '' && !self::proActive() && current_user_can('manage_options')) {
     57                        $links['llamly_pro'] = '<a href="' . esc_url(admin_url('admin.php?page=' . self::MENU_SLUG . '&tab=about#llamly-pro')) . '">' . esc_html__('Llamly Pro', 'llamly') . '</a>';
     58                }
     59                return $links;
    3060        }
    3161
    … …  
    119149                }
    120150
    121                 $assetVersion = defined('LLAMLY_FREE_VERSION') ? LLAMLY_FREE_VERSION : '1.0.3';
     151                $assetVersion = defined('LLAMLY_FREE_VERSION') ? LLAMLY_FREE_VERSION : '1.1.0';
    122152                $base = LLAMLY_FREE_ASSET_URL;
    123153                foreach (['tokens', 'llamly', 'connections', 'activity', 'logs', 'settings', 'about', 'admin-app'] as $style) {
    … …  
    141171                        'exportLogsUrl' => wp_nonce_url(admin_url('admin-post.php?action=llamly_free_export_logs'), 'llamly_free_export_logs'),
    142172                        'sections' => self::sectionsForCurrentUser(),
     173                        'pro' => ['url' => esc_url_raw(self::proUrl(), ['https']), 'active' => self::proActive()],
    143174                        'site' => [
    144175                                'name' => wp_strip_all_tags(get_bloginfo('name')),
  • llamly/trunk/src/Free/Core/Plugin.php

    r3788333 r3800467  
    316316         * Runs only when the upgrade path has a destructive step (Schema::STEPS); additive upgrades skip it.
    317317         * Copies each existing table to <table>_bak_v<old> (structure and rows) unless that backup already exists.
    318          * Older backups are pruned after a verified upgrade (Maintenance::pruneBackups); uninstall.php removes the rest.
     318         * Older backups are pruned after a verified upgrade (Maintenance::pruneBackups); uninstall (Core\Uninstall) removes the rest.
    319319         */
    320320        private static function backupTables(int $old): bool
  • llamly/trunk/src/Free/Core/Schema.php

    r3788333 r3800467  
    4646        /**
    4747         * Tables (suffixes after {prefix}llamly_free_) of the database restore points, which 1.0.0 created and this version no
    48          * longer has. install() drops them, their upgrade backups and the work tables a restore left behind; uninstall.php too.
     48         * longer has. install() drops them, their upgrade backups and the work tables a restore left behind; uninstall (Core\Uninstall) too.
    4949         */
    5050        private const RETIRED_TABLES = ['checkpoints', 'checkpoint_chunks', 'checkpoint_restores', 'checkpoint_state'];
  • llamly/trunk/uninstall.php

    r3788333 r3800467  
    11<?php
    22/**
    3  * Removes Llamly Free data when the plugin is deleted, only if the administrator enabled data removal.
    4  * Leaves the options of earlier experimental Llamly builds (llamly_mcp_spike_*) untouched.
     3 * Removes Llamly data when the plugin is deleted (rules in Llamly\Free\Core\Uninstall).
     4 *
     5 * WordPress runs this file instead of any uninstall hook, so it also does what the Freemius SDK's uninstall hook would:
     6 * Uninstall::onUninstall() lets the SDK report the uninstall (only for a site that opted in, or with deactivation
     7 * feedback) and fire after_uninstall, then runs the cleanup. Being a file, it runs on every delete, including a plugin
     8 * updated while inactive and a subsite-only activation on multisite, where no uninstall hook was ever registered.
    59 */
    610
    711declare(strict_types=1);
    8 
    9 // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- Llamly reads and writes its own tables and locks WordPress rows inside journal transactions; a cached read would defeat the revision checks.
    10 // phpcs:disable WordPress.DB.DirectDatabaseQuery.SchemaChange -- creates, upgrades, backs up or drops only Llamly tables ({prefix}llamly_free_*).
    1112
    1213if (!defined('WP_UNINSTALL_PLUGIN')) {
    … …  
    1415}
    1516
    16 if (!defined('LLAMLY_FREE_ROOT')) {
    17         $llamlyFreeRoot = is_file(__DIR__ . '/src/Free/Core/Autoloader.php') ? __DIR__ : dirname(__DIR__);
    18         define('LLAMLY_FREE_ROOT', $llamlyFreeRoot);
    19 }
    20 require_once LLAMLY_FREE_ROOT . '/src/Free/Core/Autoloader.php';
    21 \Llamly\Free\Core\Autoloader::register();
     17require_once __DIR__ . '/llamly.php';
    2218
    23 $llamlyFreeUninstallSite = static function (): void {
    24         global $wpdb;
    25 
    26         wp_clear_scheduled_hook('llamly_free_daily_maintenance');
    27         // Unfinished uploads in parts are temporary files, never site data: always removed.
    28         wp_unschedule_hook(\Llamly\Free\Tools\MediaParts::HOOK_EXPIRE);
    29         \Llamly\Free\Tools\MediaParts::purgeAll();
    30         // Data is preserved unless an administrator explicitly enabled removal in Settings.
    31         $settings = get_option('llamly_free_settings', []);
    32         if (!is_array($settings) || ($settings['delete_data_on_uninstall'] ?? false) !== true) {
    33                 return;
    34         }
    35 
    36         foreach (\Llamly\Free\Core\Schema::tableNames() as $table) {
    37                 $wpdb->query($wpdb->prepare('DROP TABLE IF EXISTS %i', $table));
    38                 $backups = $wpdb->get_col($wpdb->prepare('SHOW TABLES LIKE %s', $wpdb->esc_like($table . '_bak_v') . '%'));
    39                 foreach ((array) $backups as $backup) {
    40                         $wpdb->query($wpdb->prepare('DROP TABLE IF EXISTS %i', (string) $backup));
    41                 }
    42         }
    43 
    44         // Tables of features that left the plugin, if an upgrade did not drop them yet.
    45         \Llamly\Free\Core\Schema::dropRetired();
    46 
    47         // Media retention copies (uploads/llamly-mcp/). Their index rows (llamly_free_mret_*) go with the options below.
    48         $llamlyFreeUploads = wp_upload_dir(null, false);
    49         $llamlyFreeBase = realpath((string) ($llamlyFreeUploads['basedir'] ?? ''));
    50         $llamlyFreeDir = $llamlyFreeBase ? realpath($llamlyFreeBase . '/llamly-mcp') : false;
    51         if ($llamlyFreeBase && $llamlyFreeDir && strpos($llamlyFreeDir, $llamlyFreeBase . DIRECTORY_SEPARATOR) === 0 && is_dir($llamlyFreeDir) && !is_link($llamlyFreeDir)) {
    52                 $llamlyFreeItems = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($llamlyFreeDir, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST);
    53                 foreach ($llamlyFreeItems as $llamlyFreeItem) {
    54                         if ($llamlyFreeItem->isDir() && !$llamlyFreeItem->isLink()) {
    55                                 \Llamly\Free\Core\Filesystem::direct()->rmdir($llamlyFreeItem->getPathname());
    56                         } else {
    57                                 wp_delete_file($llamlyFreeItem->getPathname());
    58                         }
    59                 }
    60                 \Llamly\Free\Core\Filesystem::direct()->rmdir($llamlyFreeDir);
    61         }
    62 
    63         $like = $wpdb->esc_like('llamly_free_') . '%';
    64         $timeout = $wpdb->esc_like('_transient_timeout_llamly_free_') . '%';
    65         $transient = $wpdb->esc_like('_transient_llamly_free_') . '%';
    66         $siteTimeout = $wpdb->esc_like('_site_transient_timeout_llamly_free_') . '%';
    67         $siteTransient = $wpdb->esc_like('_site_transient_llamly_free_') . '%';
    68         $wpdb->query($wpdb->prepare(
    69                 "DELETE FROM {$wpdb->options} WHERE option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s OR option_name LIKE %s",
    70                 $like,
    71                 $timeout,
    72                 $transient,
    73                 $siteTimeout,
    74                 $siteTransient
    75         ));
    76         $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE %s", $like));
    77 
    78         wp_clear_scheduled_hook('llamly_free_daily_maintenance');
    79         wp_cache_flush();
    80 };
    81 
    82 if (is_multisite()) {
    83         foreach (get_sites(['fields' => 'ids', 'number' => 0]) as $llamlyFreeBlogId) {
    84                 switch_to_blog((int) $llamlyFreeBlogId);
    85                 $llamlyFreeUninstallSite();
    86                 restore_current_blog();
    87         }
    88         global $wpdb;
    89         $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->sitemeta} WHERE meta_key LIKE %s", $wpdb->esc_like('llamly_free_') . '%'));
    90 } else {
    91         $llamlyFreeUninstallSite();
    92 }
     19// The SDK finds its instance from the hook name (uninstall_<plugin basename>), so the hook carries WordPress's basename.
     20$llamlyFreeUninstallHook = 'uninstall_' . (is_string(WP_UNINSTALL_PLUGIN) && WP_UNINSTALL_PLUGIN !== '' ? WP_UNINSTALL_PLUGIN : 'llamly/llamly.php');
     21add_action($llamlyFreeUninstallHook, ['\\Llamly\\Free\\Core\\Uninstall', 'onUninstall']);
     22do_action($llamlyFreeUninstallHook); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals.DynamicHooknameFound -- WordPress core's own uninstall_<plugin> action, which the Freemius SDK listens for.
Note: See TracChangeset for help on using the changeset viewer.