@local-labs-jpollock/local-cli 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/addon-dist/bin/mcp-stdio.js +2808 -0
- package/addon-dist/lib/common/constants.d.ts +22 -0
- package/addon-dist/lib/common/constants.js +26 -0
- package/addon-dist/lib/common/theme.d.ts +68 -0
- package/addon-dist/lib/common/theme.js +126 -0
- package/addon-dist/lib/common/types.d.ts +298 -0
- package/addon-dist/lib/common/types.js +6 -0
- package/addon-dist/lib/main/config/ConnectionInfo.d.ts +25 -0
- package/addon-dist/lib/main/config/ConnectionInfo.js +82 -0
- package/addon-dist/lib/main/index.d.ts +12 -0
- package/addon-dist/lib/main/index.js +3322 -0
- package/addon-dist/lib/main/mcp/McpAuth.d.ts +37 -0
- package/addon-dist/lib/main/mcp/McpAuth.js +87 -0
- package/addon-dist/lib/main/mcp/McpServer.d.ts +67 -0
- package/addon-dist/lib/main/mcp/McpServer.js +343 -0
- package/addon-dist/lib/main/mcp/tools/changePhpVersion.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/changePhpVersion.js +81 -0
- package/addon-dist/lib/main/mcp/tools/cloneSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/cloneSite.js +66 -0
- package/addon-dist/lib/main/mcp/tools/createSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/createSite.js +137 -0
- package/addon-dist/lib/main/mcp/tools/deleteSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/deleteSite.js +72 -0
- package/addon-dist/lib/main/mcp/tools/exportDatabase.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/exportDatabase.js +72 -0
- package/addon-dist/lib/main/mcp/tools/exportSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/exportSite.js +103 -0
- package/addon-dist/lib/main/mcp/tools/getLocalInfo.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/getLocalInfo.js +72 -0
- package/addon-dist/lib/main/mcp/tools/getSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/getSite.js +68 -0
- package/addon-dist/lib/main/mcp/tools/getSiteLogs.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/getSiteLogs.js +149 -0
- package/addon-dist/lib/main/mcp/tools/helpers.d.ts +59 -0
- package/addon-dist/lib/main/mcp/tools/helpers.js +179 -0
- package/addon-dist/lib/main/mcp/tools/importDatabase.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/importDatabase.js +109 -0
- package/addon-dist/lib/main/mcp/tools/importSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/importSite.js +149 -0
- package/addon-dist/lib/main/mcp/tools/index.d.ts +26 -0
- package/addon-dist/lib/main/mcp/tools/index.js +117 -0
- package/addon-dist/lib/main/mcp/tools/listBlueprints.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/listBlueprints.js +54 -0
- package/addon-dist/lib/main/mcp/tools/listServices.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/listServices.js +112 -0
- package/addon-dist/lib/main/mcp/tools/listSites.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/listSites.js +62 -0
- package/addon-dist/lib/main/mcp/tools/openAdminer.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/openAdminer.js +59 -0
- package/addon-dist/lib/main/mcp/tools/openSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/openSite.js +62 -0
- package/addon-dist/lib/main/mcp/tools/renameSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/renameSite.js +70 -0
- package/addon-dist/lib/main/mcp/tools/restartSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/restartSite.js +56 -0
- package/addon-dist/lib/main/mcp/tools/saveBlueprint.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/saveBlueprint.js +89 -0
- package/addon-dist/lib/main/mcp/tools/startSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/startSite.js +54 -0
- package/addon-dist/lib/main/mcp/tools/stopSite.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/stopSite.js +54 -0
- package/addon-dist/lib/main/mcp/tools/toggleXdebug.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/toggleXdebug.js +69 -0
- package/addon-dist/lib/main/mcp/tools/trustSsl.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/trustSsl.js +59 -0
- package/addon-dist/lib/main/mcp/tools/wpCli.d.ts +7 -0
- package/addon-dist/lib/main/mcp/tools/wpCli.js +110 -0
- package/addon-dist/lib/main.d.ts +1 -0
- package/addon-dist/lib/main.js +10 -0
- package/addon-dist/lib/renderer/index.d.ts +7 -0
- package/addon-dist/lib/renderer/index.js +479 -0
- package/addon-dist/package.json +73 -0
- package/bin/lwp.js +10 -0
- package/lib/bootstrap/index.d.ts +98 -0
- package/lib/bootstrap/index.js +493 -0
- package/lib/bootstrap/paths.d.ts +28 -0
- package/lib/bootstrap/paths.js +96 -0
- package/lib/client/GraphQLClient.d.ts +38 -0
- package/lib/client/GraphQLClient.js +71 -0
- package/lib/client/index.d.ts +4 -0
- package/lib/client/index.js +10 -0
- package/lib/formatters/index.d.ts +75 -0
- package/lib/formatters/index.js +139 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.js +1173 -0
- package/package.json +72 -0
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* change_php_version Tool
|
|
4
|
+
* Change PHP version for a site
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.changePhpVersionDefinition = void 0;
|
|
8
|
+
exports.changePhpVersion = changePhpVersion;
|
|
9
|
+
const helpers_1 = require("./helpers");
|
|
10
|
+
exports.changePhpVersionDefinition = {
|
|
11
|
+
name: 'change_php_version',
|
|
12
|
+
description: 'Change the PHP version for a site',
|
|
13
|
+
inputSchema: {
|
|
14
|
+
type: 'object',
|
|
15
|
+
properties: {
|
|
16
|
+
site: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
description: 'Site name or ID',
|
|
19
|
+
},
|
|
20
|
+
phpVersion: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
description: 'Target PHP version (e.g., "8.2.10", "8.1.27", "7.4.33")',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
required: ['site', 'phpVersion'],
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
async function changePhpVersion(args, services) {
|
|
29
|
+
const { site: siteQuery, phpVersion } = args;
|
|
30
|
+
const siteError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
|
|
31
|
+
if (siteError)
|
|
32
|
+
return siteError;
|
|
33
|
+
const phpError = (0, helpers_1.validateRequiredParam)(phpVersion, 'phpVersion');
|
|
34
|
+
if (phpError)
|
|
35
|
+
return phpError;
|
|
36
|
+
const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
|
|
37
|
+
if ('error' in siteResult)
|
|
38
|
+
return siteResult.error;
|
|
39
|
+
const { site } = siteResult;
|
|
40
|
+
try {
|
|
41
|
+
// Check if siteProvisioner service exists
|
|
42
|
+
if (!services.siteProvisioner) {
|
|
43
|
+
return {
|
|
44
|
+
content: [{ type: 'text', text: 'Site provisioner service not available' }],
|
|
45
|
+
isError: true,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Get current PHP version for messaging
|
|
49
|
+
const currentPhp = typeof site.phpVersion === 'object' ? site.phpVersion?.version : site.phpVersion;
|
|
50
|
+
// Change PHP version using siteProvisioner.swapService
|
|
51
|
+
// The service name is 'php' and role is 'php'
|
|
52
|
+
await services.siteProvisioner.swapService(site, 'php', 'php', phpVersion, true);
|
|
53
|
+
return {
|
|
54
|
+
content: [
|
|
55
|
+
{
|
|
56
|
+
type: 'text',
|
|
57
|
+
text: `Successfully changed PHP version for "${site.name}" from ${currentPhp || 'unknown'} to ${phpVersion}. Site services have been restarted.`,
|
|
58
|
+
},
|
|
59
|
+
],
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
// Provide helpful error message for version not found
|
|
64
|
+
if (error.message?.includes('not found') || error.message?.includes('not available')) {
|
|
65
|
+
return {
|
|
66
|
+
content: [
|
|
67
|
+
{
|
|
68
|
+
type: 'text',
|
|
69
|
+
text: `PHP version "${phpVersion}" not available. Use get_local_info to see available versions, or check Local preferences for installed PHP versions.`,
|
|
70
|
+
},
|
|
71
|
+
],
|
|
72
|
+
isError: true,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
content: [{ type: 'text', text: `Failed to change PHP version: ${error.message}` }],
|
|
77
|
+
isError: true,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbmdlUGhwVmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWluL21jcC90b29scy9jaGFuZ2VQaHBWZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQTZCSCw0Q0EyREM7QUFyRkQsdUNBQW1FO0FBRXRELFFBQUEsMEJBQTBCLEdBQXNCO0lBQzNELElBQUksRUFBRSxvQkFBb0I7SUFDMUIsV0FBVyxFQUFFLG1DQUFtQztJQUNoRCxXQUFXLEVBQUU7UUFDWCxJQUFJLEVBQUUsUUFBUTtRQUNkLFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsaUJBQWlCO2FBQy9CO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSx5REFBeUQ7YUFDdkU7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7S0FDakM7Q0FDRixDQUFDO0FBT0ssS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxJQUE2QixFQUM3QixRQUF1QjtJQUV2QixNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsR0FBRyxJQUF1QyxDQUFDO0lBRWhGLE1BQU0sU0FBUyxHQUFHLElBQUEsK0JBQXFCLEVBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNELElBQUksU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRWhDLE1BQU0sUUFBUSxHQUFHLElBQUEsK0JBQXFCLEVBQUMsVUFBVSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ2pFLElBQUksUUFBUTtRQUFFLE9BQU8sUUFBUSxDQUFDO0lBRTlCLE1BQU0sVUFBVSxHQUFHLElBQUEseUJBQWUsRUFBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLElBQUksT0FBTyxJQUFJLFVBQVU7UUFBRSxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDbkQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQztJQUU1QixJQUFJLENBQUM7UUFDSCwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUM5QixPQUFPO2dCQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsd0NBQXdDLEVBQUUsQ0FBQztnQkFDM0UsT0FBTyxFQUFFLElBQUk7YUFDZCxDQUFDO1FBQ0osQ0FBQztRQUVELHdDQUF3QztRQUN4QyxNQUFNLFVBQVUsR0FDZCxPQUFPLElBQUksQ0FBQyxVQUFVLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUVuRix1REFBdUQ7UUFDdkQsOENBQThDO1FBQzlDLE1BQU0sUUFBUSxDQUFDLGVBQWUsQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWpGLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLHlDQUF5QyxJQUFJLENBQUMsSUFBSSxVQUFVLFVBQVUsSUFBSSxTQUFTLE9BQU8sVUFBVSxzQ0FBc0M7aUJBQ2pKO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsc0RBQXNEO1FBQ3RELElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztZQUNyRixPQUFPO2dCQUNMLE9BQU8sRUFBRTtvQkFDUDt3QkFDRSxJQUFJLEVBQUUsTUFBTTt3QkFDWixJQUFJLEVBQUUsZ0JBQWdCLFVBQVUsdUhBQXVIO3FCQUN4SjtpQkFDRjtnQkFDRCxPQUFPLEVBQUUsSUFBSTthQUNkLENBQUM7UUFDSixDQUFDO1FBQ0QsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsaUNBQWlDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ25GLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjaGFuZ2VfcGhwX3ZlcnNpb24gVG9vbFxuICogQ2hhbmdlIFBIUCB2ZXJzaW9uIGZvciBhIHNpdGVcbiAqL1xuXG5pbXBvcnQgeyBNY3BUb29sRGVmaW5pdGlvbiwgTWNwVG9vbFJlc3VsdCwgTG9jYWxTZXJ2aWNlcyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVJlcXVpcmVkUGFyYW0sIGZpbmRTaXRlT3JFcnJvciB9IGZyb20gJy4vaGVscGVycyc7XG5cbmV4cG9ydCBjb25zdCBjaGFuZ2VQaHBWZXJzaW9uRGVmaW5pdGlvbjogTWNwVG9vbERlZmluaXRpb24gPSB7XG4gIG5hbWU6ICdjaGFuZ2VfcGhwX3ZlcnNpb24nLFxuICBkZXNjcmlwdGlvbjogJ0NoYW5nZSB0aGUgUEhQIHZlcnNpb24gZm9yIGEgc2l0ZScsXG4gIGlucHV0U2NoZW1hOiB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgc2l0ZToge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdTaXRlIG5hbWUgb3IgSUQnLFxuICAgICAgfSxcbiAgICAgIHBocFZlcnNpb246IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGFyZ2V0IFBIUCB2ZXJzaW9uIChlLmcuLCBcIjguMi4xMFwiLCBcIjguMS4yN1wiLCBcIjcuNC4zM1wiKScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFsnc2l0ZScsICdwaHBWZXJzaW9uJ10sXG4gIH0sXG59O1xuXG5pbnRlcmZhY2UgQ2hhbmdlUGhwVmVyc2lvbkFyZ3Mge1xuICBzaXRlOiBzdHJpbmc7XG4gIHBocFZlcnNpb246IHN0cmluZztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNoYW5nZVBocFZlcnNpb24oXG4gIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzZXJ2aWNlczogTG9jYWxTZXJ2aWNlc1xuKTogUHJvbWlzZTxNY3BUb29sUmVzdWx0PiB7XG4gIGNvbnN0IHsgc2l0ZTogc2l0ZVF1ZXJ5LCBwaHBWZXJzaW9uIH0gPSBhcmdzIGFzIHVua25vd24gYXMgQ2hhbmdlUGhwVmVyc2lvbkFyZ3M7XG5cbiAgY29uc3Qgc2l0ZUVycm9yID0gdmFsaWRhdGVSZXF1aXJlZFBhcmFtKHNpdGVRdWVyeSwgJ3NpdGUnKTtcbiAgaWYgKHNpdGVFcnJvcikgcmV0dXJuIHNpdGVFcnJvcjtcblxuICBjb25zdCBwaHBFcnJvciA9IHZhbGlkYXRlUmVxdWlyZWRQYXJhbShwaHBWZXJzaW9uLCAncGhwVmVyc2lvbicpO1xuICBpZiAocGhwRXJyb3IpIHJldHVybiBwaHBFcnJvcjtcblxuICBjb25zdCBzaXRlUmVzdWx0ID0gZmluZFNpdGVPckVycm9yKHNpdGVRdWVyeSwgc2VydmljZXMuc2l0ZURhdGEpO1xuICBpZiAoJ2Vycm9yJyBpbiBzaXRlUmVzdWx0KSByZXR1cm4gc2l0ZVJlc3VsdC5lcnJvcjtcbiAgY29uc3QgeyBzaXRlIH0gPSBzaXRlUmVzdWx0O1xuXG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgc2l0ZVByb3Zpc2lvbmVyIHNlcnZpY2UgZXhpc3RzXG4gICAgaWYgKCFzZXJ2aWNlcy5zaXRlUHJvdmlzaW9uZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogJ1NpdGUgcHJvdmlzaW9uZXIgc2VydmljZSBub3QgYXZhaWxhYmxlJyB9XSxcbiAgICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gR2V0IGN1cnJlbnQgUEhQIHZlcnNpb24gZm9yIG1lc3NhZ2luZ1xuICAgIGNvbnN0IGN1cnJlbnRQaHAgPVxuICAgICAgdHlwZW9mIHNpdGUucGhwVmVyc2lvbiA9PT0gJ29iamVjdCcgPyBzaXRlLnBocFZlcnNpb24/LnZlcnNpb24gOiBzaXRlLnBocFZlcnNpb247XG5cbiAgICAvLyBDaGFuZ2UgUEhQIHZlcnNpb24gdXNpbmcgc2l0ZVByb3Zpc2lvbmVyLnN3YXBTZXJ2aWNlXG4gICAgLy8gVGhlIHNlcnZpY2UgbmFtZSBpcyAncGhwJyBhbmQgcm9sZSBpcyAncGhwJ1xuICAgIGF3YWl0IHNlcnZpY2VzLnNpdGVQcm92aXNpb25lci5zd2FwU2VydmljZShzaXRlLCAncGhwJywgJ3BocCcsIHBocFZlcnNpb24sIHRydWUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICB0ZXh0OiBgU3VjY2Vzc2Z1bGx5IGNoYW5nZWQgUEhQIHZlcnNpb24gZm9yIFwiJHtzaXRlLm5hbWV9XCIgZnJvbSAke2N1cnJlbnRQaHAgfHwgJ3Vua25vd24nfSB0byAke3BocFZlcnNpb259LiBTaXRlIHNlcnZpY2VzIGhhdmUgYmVlbiByZXN0YXJ0ZWQuYCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIC8vIFByb3ZpZGUgaGVscGZ1bCBlcnJvciBtZXNzYWdlIGZvciB2ZXJzaW9uIG5vdCBmb3VuZFxuICAgIGlmIChlcnJvci5tZXNzYWdlPy5pbmNsdWRlcygnbm90IGZvdW5kJykgfHwgZXJyb3IubWVzc2FnZT8uaW5jbHVkZXMoJ25vdCBhdmFpbGFibGUnKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICAgIHRleHQ6IGBQSFAgdmVyc2lvbiBcIiR7cGhwVmVyc2lvbn1cIiBub3QgYXZhaWxhYmxlLiBVc2UgZ2V0X2xvY2FsX2luZm8gdG8gc2VlIGF2YWlsYWJsZSB2ZXJzaW9ucywgb3IgY2hlY2sgTG9jYWwgcHJlZmVyZW5jZXMgZm9yIGluc3RhbGxlZCBQSFAgdmVyc2lvbnMuYCxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBpc0Vycm9yOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogYEZhaWxlZCB0byBjaGFuZ2UgUEhQIHZlcnNpb246ICR7ZXJyb3IubWVzc2FnZX1gIH1dLFxuICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* clone_site Tool
|
|
3
|
+
* Clone an existing WordPress site
|
|
4
|
+
*/
|
|
5
|
+
import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
|
|
6
|
+
export declare const cloneSiteDefinition: McpToolDefinition;
|
|
7
|
+
export declare function cloneSite(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* clone_site Tool
|
|
4
|
+
* Clone an existing WordPress site
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.cloneSiteDefinition = void 0;
|
|
8
|
+
exports.cloneSite = cloneSite;
|
|
9
|
+
const helpers_1 = require("./helpers");
|
|
10
|
+
exports.cloneSiteDefinition = {
|
|
11
|
+
name: 'clone_site',
|
|
12
|
+
description: 'Clone an existing WordPress site to create a copy with a new name',
|
|
13
|
+
inputSchema: {
|
|
14
|
+
type: 'object',
|
|
15
|
+
properties: {
|
|
16
|
+
site: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
description: 'Site name or ID to clone',
|
|
19
|
+
},
|
|
20
|
+
new_name: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
description: 'Name for the cloned site',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
required: ['site', 'new_name'],
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
async function cloneSite(args, services) {
|
|
29
|
+
const { site: siteQuery, new_name: newName } = args;
|
|
30
|
+
const siteError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
|
|
31
|
+
if (siteError)
|
|
32
|
+
return siteError;
|
|
33
|
+
const nameError = (0, helpers_1.validateRequiredParam)(newName, 'new_name');
|
|
34
|
+
if (nameError)
|
|
35
|
+
return nameError;
|
|
36
|
+
const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
|
|
37
|
+
if ('error' in siteResult)
|
|
38
|
+
return siteResult.error;
|
|
39
|
+
const { site } = siteResult;
|
|
40
|
+
try {
|
|
41
|
+
// Check if cloneSite service exists
|
|
42
|
+
if (!services.cloneSite) {
|
|
43
|
+
return {
|
|
44
|
+
content: [{ type: 'text', text: 'Clone site service not available' }],
|
|
45
|
+
isError: true,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
// Clone the site
|
|
49
|
+
const clonedSite = await services.cloneSite(site, newName);
|
|
50
|
+
return {
|
|
51
|
+
content: [
|
|
52
|
+
{
|
|
53
|
+
type: 'text',
|
|
54
|
+
text: `Successfully cloned "${site.name}" to "${clonedSite.name}" (ID: ${clonedSite.id})`,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
catch (error) {
|
|
60
|
+
return {
|
|
61
|
+
content: [{ type: 'text', text: `Failed to clone site: ${error.message}` }],
|
|
62
|
+
isError: true,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvbmVTaXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21haW4vbWNwL3Rvb2xzL2Nsb25lU2l0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7QUE2QkgsOEJBMENDO0FBcEVELHVDQUFtRTtBQUV0RCxRQUFBLG1CQUFtQixHQUFzQjtJQUNwRCxJQUFJLEVBQUUsWUFBWTtJQUNsQixXQUFXLEVBQUUsbUVBQW1FO0lBQ2hGLFdBQVcsRUFBRTtRQUNYLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1YsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSwwQkFBMEI7YUFDeEM7WUFDRCxRQUFRLEVBQUU7Z0JBQ1IsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLDBCQUEwQjthQUN4QztTQUNGO1FBQ0QsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztLQUMvQjtDQUNGLENBQUM7QUFPSyxLQUFLLFVBQVUsU0FBUyxDQUM3QixJQUE2QixFQUM3QixRQUF1QjtJQUV2QixNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLEdBQUcsSUFBZ0MsQ0FBQztJQUVoRixNQUFNLFNBQVMsR0FBRyxJQUFBLCtCQUFxQixFQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRCxJQUFJLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUVoQyxNQUFNLFNBQVMsR0FBRyxJQUFBLCtCQUFxQixFQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM3RCxJQUFJLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUVoQyxNQUFNLFVBQVUsR0FBRyxJQUFBLHlCQUFlLEVBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqRSxJQUFJLE9BQU8sSUFBSSxVQUFVO1FBQUUsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQ25ELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxVQUFVLENBQUM7SUFFNUIsSUFBSSxDQUFDO1FBQ0gsb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDeEIsT0FBTztnQkFDTCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLENBQUM7Z0JBQ3JFLE9BQU8sRUFBRSxJQUFJO2FBQ2QsQ0FBQztRQUNKLENBQUM7UUFFRCxpQkFBaUI7UUFDakIsTUFBTSxVQUFVLEdBQUcsTUFBTSxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztRQUUzRCxPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFNO29CQUNaLElBQUksRUFBRSx3QkFBd0IsSUFBSSxDQUFDLElBQUksU0FBUyxVQUFVLENBQUMsSUFBSSxVQUFVLFVBQVUsQ0FBQyxFQUFFLEdBQUc7aUJBQzFGO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUseUJBQXlCLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzNFLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjbG9uZV9zaXRlIFRvb2xcbiAqIENsb25lIGFuIGV4aXN0aW5nIFdvcmRQcmVzcyBzaXRlXG4gKi9cblxuaW1wb3J0IHsgTWNwVG9vbERlZmluaXRpb24sIE1jcFRvb2xSZXN1bHQsIExvY2FsU2VydmljZXMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVSZXF1aXJlZFBhcmFtLCBmaW5kU2l0ZU9yRXJyb3IgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5leHBvcnQgY29uc3QgY2xvbmVTaXRlRGVmaW5pdGlvbjogTWNwVG9vbERlZmluaXRpb24gPSB7XG4gIG5hbWU6ICdjbG9uZV9zaXRlJyxcbiAgZGVzY3JpcHRpb246ICdDbG9uZSBhbiBleGlzdGluZyBXb3JkUHJlc3Mgc2l0ZSB0byBjcmVhdGUgYSBjb3B5IHdpdGggYSBuZXcgbmFtZScsXG4gIGlucHV0U2NoZW1hOiB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgc2l0ZToge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdTaXRlIG5hbWUgb3IgSUQgdG8gY2xvbmUnLFxuICAgICAgfSxcbiAgICAgIG5ld19uYW1lOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ05hbWUgZm9yIHRoZSBjbG9uZWQgc2l0ZScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFsnc2l0ZScsICduZXdfbmFtZSddLFxuICB9LFxufTtcblxuaW50ZXJmYWNlIENsb25lU2l0ZUFyZ3Mge1xuICBzaXRlOiBzdHJpbmc7XG4gIG5ld19uYW1lOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjbG9uZVNpdGUoXG4gIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzZXJ2aWNlczogTG9jYWxTZXJ2aWNlc1xuKTogUHJvbWlzZTxNY3BUb29sUmVzdWx0PiB7XG4gIGNvbnN0IHsgc2l0ZTogc2l0ZVF1ZXJ5LCBuZXdfbmFtZTogbmV3TmFtZSB9ID0gYXJncyBhcyB1bmtub3duIGFzIENsb25lU2l0ZUFyZ3M7XG5cbiAgY29uc3Qgc2l0ZUVycm9yID0gdmFsaWRhdGVSZXF1aXJlZFBhcmFtKHNpdGVRdWVyeSwgJ3NpdGUnKTtcbiAgaWYgKHNpdGVFcnJvcikgcmV0dXJuIHNpdGVFcnJvcjtcblxuICBjb25zdCBuYW1lRXJyb3IgPSB2YWxpZGF0ZVJlcXVpcmVkUGFyYW0obmV3TmFtZSwgJ25ld19uYW1lJyk7XG4gIGlmIChuYW1lRXJyb3IpIHJldHVybiBuYW1lRXJyb3I7XG5cbiAgY29uc3Qgc2l0ZVJlc3VsdCA9IGZpbmRTaXRlT3JFcnJvcihzaXRlUXVlcnksIHNlcnZpY2VzLnNpdGVEYXRhKTtcbiAgaWYgKCdlcnJvcicgaW4gc2l0ZVJlc3VsdCkgcmV0dXJuIHNpdGVSZXN1bHQuZXJyb3I7XG4gIGNvbnN0IHsgc2l0ZSB9ID0gc2l0ZVJlc3VsdDtcblxuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIGNsb25lU2l0ZSBzZXJ2aWNlIGV4aXN0c1xuICAgIGlmICghc2VydmljZXMuY2xvbmVTaXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6ICdDbG9uZSBzaXRlIHNlcnZpY2Ugbm90IGF2YWlsYWJsZScgfV0sXG4gICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIENsb25lIHRoZSBzaXRlXG4gICAgY29uc3QgY2xvbmVkU2l0ZSA9IGF3YWl0IHNlcnZpY2VzLmNsb25lU2l0ZShzaXRlLCBuZXdOYW1lKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgdGV4dDogYFN1Y2Nlc3NmdWxseSBjbG9uZWQgXCIke3NpdGUubmFtZX1cIiB0byBcIiR7Y2xvbmVkU2l0ZS5uYW1lfVwiIChJRDogJHtjbG9uZWRTaXRlLmlkfSlgLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogYEZhaWxlZCB0byBjbG9uZSBzaXRlOiAke2Vycm9yLm1lc3NhZ2V9YCB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* create_site Tool
|
|
3
|
+
* Create a new WordPress site
|
|
4
|
+
*/
|
|
5
|
+
import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
|
|
6
|
+
export declare const createSiteDefinition: McpToolDefinition;
|
|
7
|
+
export declare function createSite(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* create_site Tool
|
|
4
|
+
* Create a new WordPress site
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createSiteDefinition = void 0;
|
|
11
|
+
exports.createSite = createSite;
|
|
12
|
+
const os_1 = __importDefault(require("os"));
|
|
13
|
+
const path_1 = __importDefault(require("path"));
|
|
14
|
+
exports.createSiteDefinition = {
|
|
15
|
+
name: 'create_site',
|
|
16
|
+
description: 'Create a new WordPress site in Local',
|
|
17
|
+
inputSchema: {
|
|
18
|
+
type: 'object',
|
|
19
|
+
properties: {
|
|
20
|
+
name: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
description: 'Site name (required)',
|
|
23
|
+
},
|
|
24
|
+
domain: {
|
|
25
|
+
type: 'string',
|
|
26
|
+
description: 'Site domain (default: name.local)',
|
|
27
|
+
},
|
|
28
|
+
phpVersion: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
description: 'PHP version (e.g., "8.2.10")',
|
|
31
|
+
},
|
|
32
|
+
webServer: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
enum: ['nginx', 'apache'],
|
|
35
|
+
description: 'Web server type (default: nginx)',
|
|
36
|
+
},
|
|
37
|
+
database: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
enum: ['mysql', 'mariadb'],
|
|
40
|
+
description: 'Database type (default: mysql)',
|
|
41
|
+
},
|
|
42
|
+
wpAdmin: {
|
|
43
|
+
type: 'object',
|
|
44
|
+
properties: {
|
|
45
|
+
username: {
|
|
46
|
+
type: 'string',
|
|
47
|
+
description: 'WordPress admin username (default: admin)',
|
|
48
|
+
},
|
|
49
|
+
password: {
|
|
50
|
+
type: 'string',
|
|
51
|
+
description: 'WordPress admin password (default: password)',
|
|
52
|
+
},
|
|
53
|
+
email: {
|
|
54
|
+
type: 'string',
|
|
55
|
+
description: 'WordPress admin email (default: admin@local.test)',
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
description: 'WordPress admin credentials',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
required: ['name'],
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
async function createSite(args, services) {
|
|
65
|
+
const { name, domain, phpVersion, webServer = 'nginx', database = 'mysql', wpAdmin = {}, } = args;
|
|
66
|
+
if (!name) {
|
|
67
|
+
return {
|
|
68
|
+
content: [{ type: 'text', text: 'Error: name parameter is required' }],
|
|
69
|
+
isError: true,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Check if site with this name already exists
|
|
73
|
+
const sitesMap = services.siteData.getSites();
|
|
74
|
+
const existingSites = Object.values(sitesMap);
|
|
75
|
+
const existingSite = existingSites.find((s) => s.name.toLowerCase() === name.toLowerCase());
|
|
76
|
+
if (existingSite) {
|
|
77
|
+
return {
|
|
78
|
+
content: [{ type: 'text', text: `Error: A site named "${name}" already exists` }],
|
|
79
|
+
isError: true,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
// Build site slug (used for domain and path)
|
|
84
|
+
const siteSlug = name
|
|
85
|
+
.toLowerCase()
|
|
86
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
87
|
+
.replace(/^-|-$/g, '');
|
|
88
|
+
// Build site domain
|
|
89
|
+
const siteDomain = domain || `${siteSlug}.local`;
|
|
90
|
+
// Build site path - Local stores sites in ~/Local Sites/<site-slug>
|
|
91
|
+
const sitePath = path_1.default.join(os_1.default.homedir(), 'Local Sites', siteSlug);
|
|
92
|
+
// Build the site creation options
|
|
93
|
+
const newSiteInfo = {
|
|
94
|
+
siteName: name,
|
|
95
|
+
siteDomain: siteDomain,
|
|
96
|
+
sitePath: sitePath,
|
|
97
|
+
webServer: webServer,
|
|
98
|
+
database: database,
|
|
99
|
+
};
|
|
100
|
+
// Add PHP version if specified
|
|
101
|
+
if (phpVersion) {
|
|
102
|
+
newSiteInfo.phpVersion = phpVersion;
|
|
103
|
+
}
|
|
104
|
+
// Create the site using addSite service
|
|
105
|
+
const newSite = await services.addSite.addSite({
|
|
106
|
+
newSiteInfo,
|
|
107
|
+
wpCredentials: {
|
|
108
|
+
adminUsername: wpAdmin.username || 'admin',
|
|
109
|
+
adminPassword: wpAdmin.password || 'password',
|
|
110
|
+
adminEmail: wpAdmin.email || 'admin@local.test',
|
|
111
|
+
},
|
|
112
|
+
goToSite: false,
|
|
113
|
+
});
|
|
114
|
+
const result = {
|
|
115
|
+
success: true,
|
|
116
|
+
site: {
|
|
117
|
+
id: newSite.id,
|
|
118
|
+
name: newSite.name,
|
|
119
|
+
domain: newSite.domain,
|
|
120
|
+
path: newSite.path,
|
|
121
|
+
url: `https://${newSite.domain}`,
|
|
122
|
+
adminUrl: `https://${newSite.domain}/wp-admin`,
|
|
123
|
+
},
|
|
124
|
+
message: `Site "${name}" created successfully`,
|
|
125
|
+
};
|
|
126
|
+
return {
|
|
127
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
return {
|
|
132
|
+
content: [{ type: 'text', text: `Failed to create site: ${error.message}` }],
|
|
133
|
+
isError: true,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlU2l0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWluL21jcC90b29scy9jcmVhdGVTaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7OztBQXNFSCxnQ0EyRkM7QUEvSkQsNENBQW9CO0FBQ3BCLGdEQUF3QjtBQUdYLFFBQUEsb0JBQW9CLEdBQXNCO0lBQ3JELElBQUksRUFBRSxhQUFhO0lBQ25CLFdBQVcsRUFBRSxzQ0FBc0M7SUFDbkQsV0FBVyxFQUFFO1FBQ1gsSUFBSSxFQUFFLFFBQVE7UUFDZCxVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLHNCQUFzQjthQUNwQztZQUNELE1BQU0sRUFBRTtnQkFDTixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsbUNBQW1DO2FBQ2pEO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSw4QkFBOEI7YUFDNUM7WUFDRCxTQUFTLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQztnQkFDekIsV0FBVyxFQUFFLGtDQUFrQzthQUNoRDtZQUNELFFBQVEsRUFBRTtnQkFDUixJQUFJLEVBQUUsUUFBUTtnQkFDZCxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDO2dCQUMxQixXQUFXLEVBQUUsZ0NBQWdDO2FBQzlDO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxRQUFRO2dCQUNkLFVBQVUsRUFBRTtvQkFDVixRQUFRLEVBQUU7d0JBQ1IsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsV0FBVyxFQUFFLDJDQUEyQztxQkFDekQ7b0JBQ0QsUUFBUSxFQUFFO3dCQUNSLElBQUksRUFBRSxRQUFRO3dCQUNkLFdBQVcsRUFBRSw4Q0FBOEM7cUJBQzVEO29CQUNELEtBQUssRUFBRTt3QkFDTCxJQUFJLEVBQUUsUUFBUTt3QkFDZCxXQUFXLEVBQUUsbURBQW1EO3FCQUNqRTtpQkFDRjtnQkFDRCxXQUFXLEVBQUUsNkJBQTZCO2FBQzNDO1NBQ0Y7UUFDRCxRQUFRLEVBQUUsQ0FBQyxNQUFNLENBQUM7S0FDbkI7Q0FDRixDQUFDO0FBZUssS0FBSyxVQUFVLFVBQVUsQ0FDOUIsSUFBNkIsRUFDN0IsUUFBdUI7SUFFdkIsTUFBTSxFQUNKLElBQUksRUFDSixNQUFNLEVBQ04sVUFBVSxFQUNWLFNBQVMsR0FBRyxPQUFPLEVBQ25CLFFBQVEsR0FBRyxPQUFPLEVBQ2xCLE9BQU8sR0FBRyxFQUFFLEdBQ2IsR0FBRyxJQUFpQyxDQUFDO0lBRXRDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE9BQU87WUFDTCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLG1DQUFtQyxFQUFFLENBQUM7WUFDdEUsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVELDhDQUE4QztJQUM5QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzlDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFVLENBQUM7SUFDdkQsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUNqRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQ2pCLE9BQU87WUFDTCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixJQUFJLGtCQUFrQixFQUFFLENBQUM7WUFDakYsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksQ0FBQztRQUNILDZDQUE2QztRQUM3QyxNQUFNLFFBQVEsR0FBRyxJQUFJO2FBQ2xCLFdBQVcsRUFBRTthQUNiLE9BQU8sQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDO2FBQzNCLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFekIsb0JBQW9CO1FBQ3BCLE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxHQUFHLFFBQVEsUUFBUSxDQUFDO1FBRWpELG9FQUFvRTtRQUNwRSxNQUFNLFFBQVEsR0FBRyxjQUFJLENBQUMsSUFBSSxDQUFDLFlBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFbEUsa0NBQWtDO1FBQ2xDLE1BQU0sV0FBVyxHQUFRO1lBQ3ZCLFFBQVEsRUFBRSxJQUFJO1lBQ2QsVUFBVSxFQUFFLFVBQVU7WUFDdEIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsU0FBUyxFQUFFLFNBQVM7WUFDcEIsUUFBUSxFQUFFLFFBQVE7U0FDbkIsQ0FBQztRQUVGLCtCQUErQjtRQUMvQixJQUFJLFVBQVUsRUFBRSxDQUFDO1lBQ2YsV0FBVyxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDdEMsQ0FBQztRQUVELHdDQUF3QztRQUN4QyxNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQzdDLFdBQVc7WUFDWCxhQUFhLEVBQUU7Z0JBQ2IsYUFBYSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTztnQkFDMUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxRQUFRLElBQUksVUFBVTtnQkFDN0MsVUFBVSxFQUFFLE9BQU8sQ0FBQyxLQUFLLElBQUksa0JBQWtCO2FBQ2hEO1lBQ0QsUUFBUSxFQUFFLEtBQUs7U0FDaEIsQ0FBQyxDQUFDO1FBRUgsTUFBTSxNQUFNLEdBQUc7WUFDYixPQUFPLEVBQUUsSUFBSTtZQUNiLElBQUksRUFBRTtnQkFDSixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUU7Z0JBQ2QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO2dCQUNsQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07Z0JBQ3RCLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSTtnQkFDbEIsR0FBRyxFQUFFLFdBQVcsT0FBTyxDQUFDLE1BQU0sRUFBRTtnQkFDaEMsUUFBUSxFQUFFLFdBQVcsT0FBTyxDQUFDLE1BQU0sV0FBVzthQUMvQztZQUNELE9BQU8sRUFBRSxTQUFTLElBQUksd0JBQXdCO1NBQy9DLENBQUM7UUFFRixPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzVFLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBjcmVhdGVfc2l0ZSBUb29sXG4gKiBDcmVhdGUgYSBuZXcgV29yZFByZXNzIHNpdGVcbiAqL1xuXG5pbXBvcnQgb3MgZnJvbSAnb3MnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBNY3BUb29sRGVmaW5pdGlvbiwgTWNwVG9vbFJlc3VsdCwgTG9jYWxTZXJ2aWNlcyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTaXRlRGVmaW5pdGlvbjogTWNwVG9vbERlZmluaXRpb24gPSB7XG4gIG5hbWU6ICdjcmVhdGVfc2l0ZScsXG4gIGRlc2NyaXB0aW9uOiAnQ3JlYXRlIGEgbmV3IFdvcmRQcmVzcyBzaXRlIGluIExvY2FsJyxcbiAgaW5wdXRTY2hlbWE6IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBuYW1lOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1NpdGUgbmFtZSAocmVxdWlyZWQpJyxcbiAgICAgIH0sXG4gICAgICBkb21haW46IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2l0ZSBkb21haW4gKGRlZmF1bHQ6IG5hbWUubG9jYWwpJyxcbiAgICAgIH0sXG4gICAgICBwaHBWZXJzaW9uOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1BIUCB2ZXJzaW9uIChlLmcuLCBcIjguMi4xMFwiKScsXG4gICAgICB9LFxuICAgICAgd2ViU2VydmVyOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBlbnVtOiBbJ25naW54JywgJ2FwYWNoZSddLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1dlYiBzZXJ2ZXIgdHlwZSAoZGVmYXVsdDogbmdpbngpJyxcbiAgICAgIH0sXG4gICAgICBkYXRhYmFzZToge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZW51bTogWydteXNxbCcsICdtYXJpYWRiJ10sXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnRGF0YWJhc2UgdHlwZSAoZGVmYXVsdDogbXlzcWwpJyxcbiAgICAgIH0sXG4gICAgICB3cEFkbWluOiB7XG4gICAgICAgIHR5cGU6ICdvYmplY3QnLFxuICAgICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgICAgdXNlcm5hbWU6IHtcbiAgICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdXb3JkUHJlc3MgYWRtaW4gdXNlcm5hbWUgKGRlZmF1bHQ6IGFkbWluKScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwYXNzd29yZDoge1xuICAgICAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ1dvcmRQcmVzcyBhZG1pbiBwYXNzd29yZCAoZGVmYXVsdDogcGFzc3dvcmQpJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGVtYWlsOiB7XG4gICAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnV29yZFByZXNzIGFkbWluIGVtYWlsIChkZWZhdWx0OiBhZG1pbkBsb2NhbC50ZXN0KScsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgZGVzY3JpcHRpb246ICdXb3JkUHJlc3MgYWRtaW4gY3JlZGVudGlhbHMnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ25hbWUnXSxcbiAgfSxcbn07XG5cbmludGVyZmFjZSBDcmVhdGVTaXRlQXJncyB7XG4gIG5hbWU6IHN0cmluZztcbiAgZG9tYWluPzogc3RyaW5nO1xuICBwaHBWZXJzaW9uPzogc3RyaW5nO1xuICB3ZWJTZXJ2ZXI/OiAnbmdpbngnIHwgJ2FwYWNoZSc7XG4gIGRhdGFiYXNlPzogJ215c3FsJyB8ICdtYXJpYWRiJztcbiAgd3BBZG1pbj86IHtcbiAgICB1c2VybmFtZT86IHN0cmluZztcbiAgICBwYXNzd29yZD86IHN0cmluZztcbiAgICBlbWFpbD86IHN0cmluZztcbiAgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVNpdGUoXG4gIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzZXJ2aWNlczogTG9jYWxTZXJ2aWNlc1xuKTogUHJvbWlzZTxNY3BUb29sUmVzdWx0PiB7XG4gIGNvbnN0IHtcbiAgICBuYW1lLFxuICAgIGRvbWFpbixcbiAgICBwaHBWZXJzaW9uLFxuICAgIHdlYlNlcnZlciA9ICduZ2lueCcsXG4gICAgZGF0YWJhc2UgPSAnbXlzcWwnLFxuICAgIHdwQWRtaW4gPSB7fSxcbiAgfSA9IGFyZ3MgYXMgdW5rbm93biBhcyBDcmVhdGVTaXRlQXJncztcblxuICBpZiAoIW5hbWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogJ3RleHQnLCB0ZXh0OiAnRXJyb3I6IG5hbWUgcGFyYW1ldGVyIGlzIHJlcXVpcmVkJyB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHNpdGUgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHNcbiAgY29uc3Qgc2l0ZXNNYXAgPSBzZXJ2aWNlcy5zaXRlRGF0YS5nZXRTaXRlcygpO1xuICBjb25zdCBleGlzdGluZ1NpdGVzID0gT2JqZWN0LnZhbHVlcyhzaXRlc01hcCkgYXMgYW55W107XG4gIGNvbnN0IGV4aXN0aW5nU2l0ZSA9IGV4aXN0aW5nU2l0ZXMuZmluZCgoczogYW55KSA9PiBzLm5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgaWYgKGV4aXN0aW5nU2l0ZSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IGBFcnJvcjogQSBzaXRlIG5hbWVkIFwiJHtuYW1lfVwiIGFscmVhZHkgZXhpc3RzYCB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gQnVpbGQgc2l0ZSBzbHVnICh1c2VkIGZvciBkb21haW4gYW5kIHBhdGgpXG4gICAgY29uc3Qgc2l0ZVNsdWcgPSBuYW1lXG4gICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgLnJlcGxhY2UoL1teYS16MC05XSsvZywgJy0nKVxuICAgICAgLnJlcGxhY2UoL14tfC0kL2csICcnKTtcblxuICAgIC8vIEJ1aWxkIHNpdGUgZG9tYWluXG4gICAgY29uc3Qgc2l0ZURvbWFpbiA9IGRvbWFpbiB8fCBgJHtzaXRlU2x1Z30ubG9jYWxgO1xuXG4gICAgLy8gQnVpbGQgc2l0ZSBwYXRoIC0gTG9jYWwgc3RvcmVzIHNpdGVzIGluIH4vTG9jYWwgU2l0ZXMvPHNpdGUtc2x1Zz5cbiAgICBjb25zdCBzaXRlUGF0aCA9IHBhdGguam9pbihvcy5ob21lZGlyKCksICdMb2NhbCBTaXRlcycsIHNpdGVTbHVnKTtcblxuICAgIC8vIEJ1aWxkIHRoZSBzaXRlIGNyZWF0aW9uIG9wdGlvbnNcbiAgICBjb25zdCBuZXdTaXRlSW5mbzogYW55ID0ge1xuICAgICAgc2l0ZU5hbWU6IG5hbWUsXG4gICAgICBzaXRlRG9tYWluOiBzaXRlRG9tYWluLFxuICAgICAgc2l0ZVBhdGg6IHNpdGVQYXRoLFxuICAgICAgd2ViU2VydmVyOiB3ZWJTZXJ2ZXIsXG4gICAgICBkYXRhYmFzZTogZGF0YWJhc2UsXG4gICAgfTtcblxuICAgIC8vIEFkZCBQSFAgdmVyc2lvbiBpZiBzcGVjaWZpZWRcbiAgICBpZiAocGhwVmVyc2lvbikge1xuICAgICAgbmV3U2l0ZUluZm8ucGhwVmVyc2lvbiA9IHBocFZlcnNpb247XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBzaXRlIHVzaW5nIGFkZFNpdGUgc2VydmljZVxuICAgIGNvbnN0IG5ld1NpdGUgPSBhd2FpdCBzZXJ2aWNlcy5hZGRTaXRlLmFkZFNpdGUoe1xuICAgICAgbmV3U2l0ZUluZm8sXG4gICAgICB3cENyZWRlbnRpYWxzOiB7XG4gICAgICAgIGFkbWluVXNlcm5hbWU6IHdwQWRtaW4udXNlcm5hbWUgfHwgJ2FkbWluJyxcbiAgICAgICAgYWRtaW5QYXNzd29yZDogd3BBZG1pbi5wYXNzd29yZCB8fCAncGFzc3dvcmQnLFxuICAgICAgICBhZG1pbkVtYWlsOiB3cEFkbWluLmVtYWlsIHx8ICdhZG1pbkBsb2NhbC50ZXN0JyxcbiAgICAgIH0sXG4gICAgICBnb1RvU2l0ZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgc2l0ZToge1xuICAgICAgICBpZDogbmV3U2l0ZS5pZCxcbiAgICAgICAgbmFtZTogbmV3U2l0ZS5uYW1lLFxuICAgICAgICBkb21haW46IG5ld1NpdGUuZG9tYWluLFxuICAgICAgICBwYXRoOiBuZXdTaXRlLnBhdGgsXG4gICAgICAgIHVybDogYGh0dHBzOi8vJHtuZXdTaXRlLmRvbWFpbn1gLFxuICAgICAgICBhZG1pblVybDogYGh0dHBzOi8vJHtuZXdTaXRlLmRvbWFpbn0vd3AtYWRtaW5gLFxuICAgICAgfSxcbiAgICAgIG1lc3NhZ2U6IGBTaXRlIFwiJHtuYW1lfVwiIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5YCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogSlNPTi5zdHJpbmdpZnkocmVzdWx0LCBudWxsLCAyKSB9XSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogYEZhaWxlZCB0byBjcmVhdGUgc2l0ZTogJHtlcnJvci5tZXNzYWdlfWAgfV0sXG4gICAgICBpc0Vycm9yOiB0cnVlLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* delete_site Tool
|
|
3
|
+
* Delete a WordPress site (requires confirmation)
|
|
4
|
+
*/
|
|
5
|
+
import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
|
|
6
|
+
export declare const deleteSiteDefinition: McpToolDefinition;
|
|
7
|
+
export declare function deleteSite(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* delete_site Tool
|
|
4
|
+
* Delete a WordPress site (requires confirmation)
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.deleteSiteDefinition = void 0;
|
|
8
|
+
exports.deleteSite = deleteSite;
|
|
9
|
+
const helpers_1 = require("./helpers");
|
|
10
|
+
exports.deleteSiteDefinition = {
|
|
11
|
+
name: 'delete_site',
|
|
12
|
+
description: 'Delete a WordPress site. Requires confirm=true to prevent accidental deletion.',
|
|
13
|
+
inputSchema: {
|
|
14
|
+
type: 'object',
|
|
15
|
+
properties: {
|
|
16
|
+
site: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
description: 'Site name or ID (partial names work)',
|
|
19
|
+
},
|
|
20
|
+
confirm: {
|
|
21
|
+
type: 'boolean',
|
|
22
|
+
description: 'Must be true to confirm deletion. This is a safety measure.',
|
|
23
|
+
},
|
|
24
|
+
trashFiles: {
|
|
25
|
+
type: 'boolean',
|
|
26
|
+
description: 'Move site files to trash instead of permanent deletion (default: true)',
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
required: ['site', 'confirm'],
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
async function deleteSite(args, services) {
|
|
33
|
+
const { site: siteQuery, confirm, trashFiles = true } = args;
|
|
34
|
+
const paramError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
|
|
35
|
+
if (paramError)
|
|
36
|
+
return paramError;
|
|
37
|
+
if (confirm !== true) {
|
|
38
|
+
return (0, helpers_1.createErrorResult)('Error: Deletion not confirmed. You must set confirm=true to delete a site. This is a safety measure to prevent accidental deletion.');
|
|
39
|
+
}
|
|
40
|
+
const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
|
|
41
|
+
if ('error' in siteResult)
|
|
42
|
+
return siteResult.error;
|
|
43
|
+
const { site } = siteResult;
|
|
44
|
+
try {
|
|
45
|
+
// Stop the site if it's running
|
|
46
|
+
const currentStatus = await services.siteProcessManager.getSiteStatus(site);
|
|
47
|
+
if (currentStatus === 'running') {
|
|
48
|
+
await services.siteProcessManager.stop(site);
|
|
49
|
+
}
|
|
50
|
+
// Delete the site
|
|
51
|
+
await services.deleteSite.deleteSite({
|
|
52
|
+
site,
|
|
53
|
+
trashFiles,
|
|
54
|
+
updateHosts: true,
|
|
55
|
+
});
|
|
56
|
+
const result = {
|
|
57
|
+
success: true,
|
|
58
|
+
message: `Site "${site.name}" deleted successfully`,
|
|
59
|
+
trashFiles,
|
|
60
|
+
};
|
|
61
|
+
return {
|
|
62
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
return {
|
|
67
|
+
content: [{ type: 'text', text: `Failed to delete site: ${error.message}` }],
|
|
68
|
+
isError: true,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsZXRlU2l0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWluL21jcC90b29scy9kZWxldGVTaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQWtDSCxnQ0FnREM7QUEvRUQsdUNBQXNGO0FBRXpFLFFBQUEsb0JBQW9CLEdBQXNCO0lBQ3JELElBQUksRUFBRSxhQUFhO0lBQ25CLFdBQVcsRUFBRSxnRkFBZ0Y7SUFDN0YsV0FBVyxFQUFFO1FBQ1gsSUFBSSxFQUFFLFFBQVE7UUFDZCxVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLHNDQUFzQzthQUNwRDtZQUNELE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsU0FBUztnQkFDZixXQUFXLEVBQUUsNkRBQTZEO2FBQzNFO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLElBQUksRUFBRSxTQUFTO2dCQUNmLFdBQVcsRUFBRSx3RUFBd0U7YUFDdEY7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUM7S0FDOUI7Q0FDRixDQUFDO0FBUUssS0FBSyxVQUFVLFVBQVUsQ0FDOUIsSUFBNkIsRUFDN0IsUUFBdUI7SUFFdkIsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFVBQVUsR0FBRyxJQUFJLEVBQUUsR0FBRyxJQUFpQyxDQUFDO0lBRTFGLE1BQU0sVUFBVSxHQUFHLElBQUEsK0JBQXFCLEVBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVELElBQUksVUFBVTtRQUFFLE9BQU8sVUFBVSxDQUFDO0lBRWxDLElBQUksT0FBTyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3JCLE9BQU8sSUFBQSwyQkFBaUIsRUFDdEIscUlBQXFJLENBQ3RJLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxVQUFVLEdBQUcsSUFBQSx5QkFBZSxFQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsSUFBSSxPQUFPLElBQUksVUFBVTtRQUFFLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQztJQUNuRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDO0lBRTVCLElBQUksQ0FBQztRQUNILGdDQUFnQztRQUNoQyxNQUFNLGFBQWEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUUsSUFBSSxhQUFhLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDaEMsTUFBTSxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxrQkFBa0I7UUFDbEIsTUFBTSxRQUFRLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQztZQUNuQyxJQUFJO1lBQ0osVUFBVTtZQUNWLFdBQVcsRUFBRSxJQUFJO1NBQ2xCLENBQUMsQ0FBQztRQUVILE1BQU0sTUFBTSxHQUFHO1lBQ2IsT0FBTyxFQUFFLElBQUk7WUFDYixPQUFPLEVBQUUsU0FBUyxJQUFJLENBQUMsSUFBSSx3QkFBd0I7WUFDbkQsVUFBVTtTQUNYLENBQUM7UUFFRixPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNuRSxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsMEJBQTBCLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzVFLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBkZWxldGVfc2l0ZSBUb29sXG4gKiBEZWxldGUgYSBXb3JkUHJlc3Mgc2l0ZSAocmVxdWlyZXMgY29uZmlybWF0aW9uKVxuICovXG5cbmltcG9ydCB7IE1jcFRvb2xEZWZpbml0aW9uLCBNY3BUb29sUmVzdWx0LCBMb2NhbFNlcnZpY2VzIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHZhbGlkYXRlUmVxdWlyZWRQYXJhbSwgZmluZFNpdGVPckVycm9yLCBjcmVhdGVFcnJvclJlc3VsdCB9IGZyb20gJy4vaGVscGVycyc7XG5cbmV4cG9ydCBjb25zdCBkZWxldGVTaXRlRGVmaW5pdGlvbjogTWNwVG9vbERlZmluaXRpb24gPSB7XG4gIG5hbWU6ICdkZWxldGVfc2l0ZScsXG4gIGRlc2NyaXB0aW9uOiAnRGVsZXRlIGEgV29yZFByZXNzIHNpdGUuIFJlcXVpcmVzIGNvbmZpcm09dHJ1ZSB0byBwcmV2ZW50IGFjY2lkZW50YWwgZGVsZXRpb24uJyxcbiAgaW5wdXRTY2hlbWE6IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBzaXRlOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1NpdGUgbmFtZSBvciBJRCAocGFydGlhbCBuYW1lcyB3b3JrKScsXG4gICAgICB9LFxuICAgICAgY29uZmlybToge1xuICAgICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnTXVzdCBiZSB0cnVlIHRvIGNvbmZpcm0gZGVsZXRpb24uIFRoaXMgaXMgYSBzYWZldHkgbWVhc3VyZS4nLFxuICAgICAgfSxcbiAgICAgIHRyYXNoRmlsZXM6IHtcbiAgICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ01vdmUgc2l0ZSBmaWxlcyB0byB0cmFzaCBpbnN0ZWFkIG9mIHBlcm1hbmVudCBkZWxldGlvbiAoZGVmYXVsdDogdHJ1ZSknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ3NpdGUnLCAnY29uZmlybSddLFxuICB9LFxufTtcblxuaW50ZXJmYWNlIERlbGV0ZVNpdGVBcmdzIHtcbiAgc2l0ZTogc3RyaW5nO1xuICBjb25maXJtOiBib29sZWFuO1xuICB0cmFzaEZpbGVzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVNpdGUoXG4gIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzZXJ2aWNlczogTG9jYWxTZXJ2aWNlc1xuKTogUHJvbWlzZTxNY3BUb29sUmVzdWx0PiB7XG4gIGNvbnN0IHsgc2l0ZTogc2l0ZVF1ZXJ5LCBjb25maXJtLCB0cmFzaEZpbGVzID0gdHJ1ZSB9ID0gYXJncyBhcyB1bmtub3duIGFzIERlbGV0ZVNpdGVBcmdzO1xuXG4gIGNvbnN0IHBhcmFtRXJyb3IgPSB2YWxpZGF0ZVJlcXVpcmVkUGFyYW0oc2l0ZVF1ZXJ5LCAnc2l0ZScpO1xuICBpZiAocGFyYW1FcnJvcikgcmV0dXJuIHBhcmFtRXJyb3I7XG5cbiAgaWYgKGNvbmZpcm0gIT09IHRydWUpIHtcbiAgICByZXR1cm4gY3JlYXRlRXJyb3JSZXN1bHQoXG4gICAgICAnRXJyb3I6IERlbGV0aW9uIG5vdCBjb25maXJtZWQuIFlvdSBtdXN0IHNldCBjb25maXJtPXRydWUgdG8gZGVsZXRlIGEgc2l0ZS4gVGhpcyBpcyBhIHNhZmV0eSBtZWFzdXJlIHRvIHByZXZlbnQgYWNjaWRlbnRhbCBkZWxldGlvbi4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHNpdGVSZXN1bHQgPSBmaW5kU2l0ZU9yRXJyb3Ioc2l0ZVF1ZXJ5LCBzZXJ2aWNlcy5zaXRlRGF0YSk7XG4gIGlmICgnZXJyb3InIGluIHNpdGVSZXN1bHQpIHJldHVybiBzaXRlUmVzdWx0LmVycm9yO1xuICBjb25zdCB7IHNpdGUgfSA9IHNpdGVSZXN1bHQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBTdG9wIHRoZSBzaXRlIGlmIGl0J3MgcnVubmluZ1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0dXMgPSBhd2FpdCBzZXJ2aWNlcy5zaXRlUHJvY2Vzc01hbmFnZXIuZ2V0U2l0ZVN0YXR1cyhzaXRlKTtcbiAgICBpZiAoY3VycmVudFN0YXR1cyA9PT0gJ3J1bm5pbmcnKSB7XG4gICAgICBhd2FpdCBzZXJ2aWNlcy5zaXRlUHJvY2Vzc01hbmFnZXIuc3RvcChzaXRlKTtcbiAgICB9XG5cbiAgICAvLyBEZWxldGUgdGhlIHNpdGVcbiAgICBhd2FpdCBzZXJ2aWNlcy5kZWxldGVTaXRlLmRlbGV0ZVNpdGUoe1xuICAgICAgc2l0ZSxcbiAgICAgIHRyYXNoRmlsZXMsXG4gICAgICB1cGRhdGVIb3N0czogdHJ1ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICBtZXNzYWdlOiBgU2l0ZSBcIiR7c2l0ZS5uYW1lfVwiIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5YCxcbiAgICAgIHRyYXNoRmlsZXMsXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikgfV0sXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IGBGYWlsZWQgdG8gZGVsZXRlIHNpdGU6ICR7ZXJyb3IubWVzc2FnZX1gIH1dLFxuICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* export_database Tool
|
|
3
|
+
* Export site database to SQL file using WP-CLI
|
|
4
|
+
*/
|
|
5
|
+
import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
|
|
6
|
+
export declare const exportDatabaseDefinition: McpToolDefinition;
|
|
7
|
+
export declare function exportDatabase(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* export_database Tool
|
|
4
|
+
* Export site database to SQL file using WP-CLI
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.exportDatabaseDefinition = void 0;
|
|
8
|
+
exports.exportDatabase = exportDatabase;
|
|
9
|
+
const helpers_1 = require("./helpers");
|
|
10
|
+
exports.exportDatabaseDefinition = {
|
|
11
|
+
name: 'export_database',
|
|
12
|
+
description: 'Export a site database to a SQL file',
|
|
13
|
+
inputSchema: {
|
|
14
|
+
type: 'object',
|
|
15
|
+
properties: {
|
|
16
|
+
site: {
|
|
17
|
+
type: 'string',
|
|
18
|
+
description: 'Site name or ID',
|
|
19
|
+
},
|
|
20
|
+
outputPath: {
|
|
21
|
+
type: 'string',
|
|
22
|
+
description: 'Output file path (optional, defaults to ~/Downloads/<site-name>.sql)',
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
required: ['site'],
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
async function exportDatabase(args, services) {
|
|
29
|
+
const { site: siteQuery, outputPath } = args;
|
|
30
|
+
// Validate required parameter
|
|
31
|
+
const siteError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
|
|
32
|
+
if (siteError)
|
|
33
|
+
return siteError;
|
|
34
|
+
// Find site or return error
|
|
35
|
+
const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
|
|
36
|
+
if ('error' in siteResult)
|
|
37
|
+
return siteResult.error;
|
|
38
|
+
const { site } = siteResult;
|
|
39
|
+
try {
|
|
40
|
+
// Determine output path
|
|
41
|
+
const homeDir = process.env.HOME || process.env.USERPROFILE || '';
|
|
42
|
+
const defaultPath = `${homeDir}/Downloads/${site.name.replace(/[^a-zA-Z0-9-_]/g, '-')}.sql`;
|
|
43
|
+
const finalPath = outputPath || defaultPath;
|
|
44
|
+
// Security: Validate output path is safe (no path traversal attacks)
|
|
45
|
+
if (!(0, helpers_1.isValidFilePath)(finalPath)) {
|
|
46
|
+
return (0, helpers_1.createErrorResult)('Error: Invalid output path. Path must be within allowed directories (home, tmp).');
|
|
47
|
+
}
|
|
48
|
+
// Run WP-CLI db export
|
|
49
|
+
const result = await services.wpCli.run(site, ['db', 'export', finalPath]);
|
|
50
|
+
if (result === null) {
|
|
51
|
+
return {
|
|
52
|
+
content: [{ type: 'text', text: `Failed to export database for "${site.name}"` }],
|
|
53
|
+
isError: true,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
content: [
|
|
58
|
+
{
|
|
59
|
+
type: 'text',
|
|
60
|
+
text: `Successfully exported database for "${site.name}" to: ${finalPath}`,
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
return {
|
|
67
|
+
content: [{ type: 'text', text: `Failed to export database: ${error.message}` }],
|
|
68
|
+
isError: true,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0RGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbWFpbi9tY3AvdG9vbHMvZXhwb3J0RGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7O0FBNkJILHdDQW9EQztBQTlFRCx1Q0FBdUc7QUFFMUYsUUFBQSx3QkFBd0IsR0FBc0I7SUFDekQsSUFBSSxFQUFFLGlCQUFpQjtJQUN2QixXQUFXLEVBQUUsc0NBQXNDO0lBQ25ELFdBQVcsRUFBRTtRQUNYLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1YsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxpQkFBaUI7YUFDL0I7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLHNFQUFzRTthQUNwRjtTQUNGO1FBQ0QsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDO0tBQ25CO0NBQ0YsQ0FBQztBQU9LLEtBQUssVUFBVSxjQUFjLENBQ2xDLElBQTZCLEVBQzdCLFFBQXVCO0lBRXZCLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxHQUFHLElBQXFDLENBQUM7SUFFOUUsOEJBQThCO0lBQzlCLE1BQU0sU0FBUyxHQUFHLElBQUEsK0JBQXFCLEVBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNELElBQUksU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRWhDLDRCQUE0QjtJQUM1QixNQUFNLFVBQVUsR0FBRyxJQUFBLHlCQUFlLEVBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqRSxJQUFJLE9BQU8sSUFBSSxVQUFVO1FBQUUsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDO0lBQ25ELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxVQUFVLENBQUM7SUFFNUIsSUFBSSxDQUFDO1FBQ0gsd0JBQXdCO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUNsRSxNQUFNLFdBQVcsR0FBRyxHQUFHLE9BQU8sY0FBYyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQzVGLE1BQU0sU0FBUyxHQUFHLFVBQVUsSUFBSSxXQUFXLENBQUM7UUFFNUMscUVBQXFFO1FBQ3JFLElBQUksQ0FBQyxJQUFBLHlCQUFlLEVBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxPQUFPLElBQUEsMkJBQWlCLEVBQ3RCLGtGQUFrRixDQUNuRixDQUFDO1FBQ0osQ0FBQztRQUVELHVCQUF1QjtRQUN2QixNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUUzRSxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNwQixPQUFPO2dCQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsa0NBQWtDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNqRixPQUFPLEVBQUUsSUFBSTthQUNkLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsdUNBQXVDLElBQUksQ0FBQyxJQUFJLFNBQVMsU0FBUyxFQUFFO2lCQUMzRTthQUNGO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLE9BQU87WUFDTCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLDhCQUE4QixLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNoRixPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZXhwb3J0X2RhdGFiYXNlIFRvb2xcbiAqIEV4cG9ydCBzaXRlIGRhdGFiYXNlIHRvIFNRTCBmaWxlIHVzaW5nIFdQLUNMSVxuICovXG5cbmltcG9ydCB7IE1jcFRvb2xEZWZpbml0aW9uLCBNY3BUb29sUmVzdWx0LCBMb2NhbFNlcnZpY2VzIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHZhbGlkYXRlUmVxdWlyZWRQYXJhbSwgZmluZFNpdGVPckVycm9yLCBpc1ZhbGlkRmlsZVBhdGgsIGNyZWF0ZUVycm9yUmVzdWx0IH0gZnJvbSAnLi9oZWxwZXJzJztcblxuZXhwb3J0IGNvbnN0IGV4cG9ydERhdGFiYXNlRGVmaW5pdGlvbjogTWNwVG9vbERlZmluaXRpb24gPSB7XG4gIG5hbWU6ICdleHBvcnRfZGF0YWJhc2UnLFxuICBkZXNjcmlwdGlvbjogJ0V4cG9ydCBhIHNpdGUgZGF0YWJhc2UgdG8gYSBTUUwgZmlsZScsXG4gIGlucHV0U2NoZW1hOiB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgc2l0ZToge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdTaXRlIG5hbWUgb3IgSUQnLFxuICAgICAgfSxcbiAgICAgIG91dHB1dFBhdGg6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IGZpbGUgcGF0aCAob3B0aW9uYWwsIGRlZmF1bHRzIHRvIH4vRG93bmxvYWRzLzxzaXRlLW5hbWU+LnNxbCknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ3NpdGUnXSxcbiAgfSxcbn07XG5cbmludGVyZmFjZSBFeHBvcnREYXRhYmFzZUFyZ3Mge1xuICBzaXRlOiBzdHJpbmc7XG4gIG91dHB1dFBhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBvcnREYXRhYmFzZShcbiAgYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNlcnZpY2VzOiBMb2NhbFNlcnZpY2VzXG4pOiBQcm9taXNlPE1jcFRvb2xSZXN1bHQ+IHtcbiAgY29uc3QgeyBzaXRlOiBzaXRlUXVlcnksIG91dHB1dFBhdGggfSA9IGFyZ3MgYXMgdW5rbm93biBhcyBFeHBvcnREYXRhYmFzZUFyZ3M7XG5cbiAgLy8gVmFsaWRhdGUgcmVxdWlyZWQgcGFyYW1ldGVyXG4gIGNvbnN0IHNpdGVFcnJvciA9IHZhbGlkYXRlUmVxdWlyZWRQYXJhbShzaXRlUXVlcnksICdzaXRlJyk7XG4gIGlmIChzaXRlRXJyb3IpIHJldHVybiBzaXRlRXJyb3I7XG5cbiAgLy8gRmluZCBzaXRlIG9yIHJldHVybiBlcnJvclxuICBjb25zdCBzaXRlUmVzdWx0ID0gZmluZFNpdGVPckVycm9yKHNpdGVRdWVyeSwgc2VydmljZXMuc2l0ZURhdGEpO1xuICBpZiAoJ2Vycm9yJyBpbiBzaXRlUmVzdWx0KSByZXR1cm4gc2l0ZVJlc3VsdC5lcnJvcjtcbiAgY29uc3QgeyBzaXRlIH0gPSBzaXRlUmVzdWx0O1xuXG4gIHRyeSB7XG4gICAgLy8gRGV0ZXJtaW5lIG91dHB1dCBwYXRoXG4gICAgY29uc3QgaG9tZURpciA9IHByb2Nlc3MuZW52LkhPTUUgfHwgcHJvY2Vzcy5lbnYuVVNFUlBST0ZJTEUgfHwgJyc7XG4gICAgY29uc3QgZGVmYXVsdFBhdGggPSBgJHtob21lRGlyfS9Eb3dubG9hZHMvJHtzaXRlLm5hbWUucmVwbGFjZSgvW15hLXpBLVowLTktX10vZywgJy0nKX0uc3FsYDtcbiAgICBjb25zdCBmaW5hbFBhdGggPSBvdXRwdXRQYXRoIHx8IGRlZmF1bHRQYXRoO1xuXG4gICAgLy8gU2VjdXJpdHk6IFZhbGlkYXRlIG91dHB1dCBwYXRoIGlzIHNhZmUgKG5vIHBhdGggdHJhdmVyc2FsIGF0dGFja3MpXG4gICAgaWYgKCFpc1ZhbGlkRmlsZVBhdGgoZmluYWxQYXRoKSkge1xuICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yUmVzdWx0KFxuICAgICAgICAnRXJyb3I6IEludmFsaWQgb3V0cHV0IHBhdGguIFBhdGggbXVzdCBiZSB3aXRoaW4gYWxsb3dlZCBkaXJlY3RvcmllcyAoaG9tZSwgdG1wKS4nXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFJ1biBXUC1DTEkgZGIgZXhwb3J0XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZXMud3BDbGkucnVuKHNpdGUsIFsnZGInLCAnZXhwb3J0JywgZmluYWxQYXRoXSk7XG5cbiAgICBpZiAocmVzdWx0ID09PSBudWxsKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IGBGYWlsZWQgdG8gZXhwb3J0IGRhdGFiYXNlIGZvciBcIiR7c2l0ZS5uYW1lfVwiYCB9XSxcbiAgICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICB0ZXh0OiBgU3VjY2Vzc2Z1bGx5IGV4cG9ydGVkIGRhdGFiYXNlIGZvciBcIiR7c2l0ZS5uYW1lfVwiIHRvOiAke2ZpbmFsUGF0aH1gLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogYEZhaWxlZCB0byBleHBvcnQgZGF0YWJhc2U6ICR7ZXJyb3IubWVzc2FnZX1gIH1dLFxuICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICB9O1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* export_site Tool
|
|
3
|
+
* Export a WordPress site to a zip file
|
|
4
|
+
*/
|
|
5
|
+
import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
|
|
6
|
+
export declare const exportSiteDefinition: McpToolDefinition;
|
|
7
|
+
export declare function exportSite(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* export_site Tool
|
|
4
|
+
* Export a WordPress site to a zip file
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.exportSiteDefinition = void 0;
|
|
41
|
+
exports.exportSite = exportSite;
|
|
42
|
+
const helpers_1 = require("./helpers");
|
|
43
|
+
const os = __importStar(require("os"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
exports.exportSiteDefinition = {
|
|
46
|
+
name: 'export_site',
|
|
47
|
+
description: 'Export a WordPress site to a zip file',
|
|
48
|
+
inputSchema: {
|
|
49
|
+
type: 'object',
|
|
50
|
+
properties: {
|
|
51
|
+
site: {
|
|
52
|
+
type: 'string',
|
|
53
|
+
description: 'Site name or ID to export',
|
|
54
|
+
},
|
|
55
|
+
output_path: {
|
|
56
|
+
type: 'string',
|
|
57
|
+
description: 'Output directory path (default: ~/Downloads)',
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
required: ['site'],
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
async function exportSite(args, services) {
|
|
64
|
+
const { site: siteQuery, output_path } = args;
|
|
65
|
+
const paramError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
|
|
66
|
+
if (paramError)
|
|
67
|
+
return paramError;
|
|
68
|
+
const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
|
|
69
|
+
if ('error' in siteResult)
|
|
70
|
+
return siteResult.error;
|
|
71
|
+
const { site } = siteResult;
|
|
72
|
+
try {
|
|
73
|
+
// Check if exportSite service exists
|
|
74
|
+
if (!services.exportSite) {
|
|
75
|
+
return {
|
|
76
|
+
content: [{ type: 'text', text: 'Export site service not available' }],
|
|
77
|
+
isError: true,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// Default output path to Downloads folder
|
|
81
|
+
const outputDir = output_path || path.join(os.homedir(), 'Downloads');
|
|
82
|
+
const timestamp = new Date().toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
83
|
+
const filename = `${site.name}-${timestamp}.zip`;
|
|
84
|
+
const outputPath = path.join(outputDir, filename);
|
|
85
|
+
// Export the site
|
|
86
|
+
await services.exportSite(site, outputPath);
|
|
87
|
+
return {
|
|
88
|
+
content: [
|
|
89
|
+
{
|
|
90
|
+
type: 'text',
|
|
91
|
+
text: `Successfully exported "${site.name}" to ${outputPath}`,
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
return {
|
|
98
|
+
content: [{ type: 'text', text: `Failed to export site: ${error.message}` }],
|
|
99
|
+
isError: true,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0U2l0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWluL21jcC90b29scy9leHBvcnRTaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStCSCxnQ0E2Q0M7QUF6RUQsdUNBQW1FO0FBQ25FLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFFaEIsUUFBQSxvQkFBb0IsR0FBc0I7SUFDckQsSUFBSSxFQUFFLGFBQWE7SUFDbkIsV0FBVyxFQUFFLHVDQUF1QztJQUNwRCxXQUFXLEVBQUU7UUFDWCxJQUFJLEVBQUUsUUFBUTtRQUNkLFVBQVUsRUFBRTtZQUNWLElBQUksRUFBRTtnQkFDSixJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsMkJBQTJCO2FBQ3pDO1lBQ0QsV0FBVyxFQUFFO2dCQUNYLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSw4Q0FBOEM7YUFDNUQ7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQztLQUNuQjtDQUNGLENBQUM7QUFPSyxLQUFLLFVBQVUsVUFBVSxDQUM5QixJQUE2QixFQUM3QixRQUF1QjtJQUV2QixNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsR0FBRyxJQUFpQyxDQUFDO0lBRTNFLE1BQU0sVUFBVSxHQUFHLElBQUEsK0JBQXFCLEVBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVELElBQUksVUFBVTtRQUFFLE9BQU8sVUFBVSxDQUFDO0lBRWxDLE1BQU0sVUFBVSxHQUFHLElBQUEseUJBQWUsRUFBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLElBQUksT0FBTyxJQUFJLFVBQVU7UUFBRSxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDbkQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQztJQUU1QixJQUFJLENBQUM7UUFDSCxxQ0FBcUM7UUFDckMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN6QixPQUFPO2dCQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsbUNBQW1DLEVBQUUsQ0FBQztnQkFDdEUsT0FBTyxFQUFFLElBQUk7YUFDZCxDQUFDO1FBQ0osQ0FBQztRQUVELDBDQUEwQztRQUMxQyxNQUFNLFNBQVMsR0FBRyxXQUFXLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUUsTUFBTSxRQUFRLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxJQUFJLFNBQVMsTUFBTSxDQUFDO1FBQ2pELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWxELGtCQUFrQjtRQUNsQixNQUFNLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRTVDLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLDBCQUEwQixJQUFJLENBQUMsSUFBSSxRQUFRLFVBQVUsRUFBRTtpQkFDOUQ7YUFDRjtTQUNGLENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFVLEVBQUUsQ0FBQztRQUNwQixPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSwwQkFBMEIsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDNUUsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIGV4cG9ydF9zaXRlIFRvb2xcbiAqIEV4cG9ydCBhIFdvcmRQcmVzcyBzaXRlIHRvIGEgemlwIGZpbGVcbiAqL1xuXG5pbXBvcnQgeyBNY3BUb29sRGVmaW5pdGlvbiwgTWNwVG9vbFJlc3VsdCwgTG9jYWxTZXJ2aWNlcyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVJlcXVpcmVkUGFyYW0sIGZpbmRTaXRlT3JFcnJvciB9IGZyb20gJy4vaGVscGVycyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgY29uc3QgZXhwb3J0U2l0ZURlZmluaXRpb246IE1jcFRvb2xEZWZpbml0aW9uID0ge1xuICBuYW1lOiAnZXhwb3J0X3NpdGUnLFxuICBkZXNjcmlwdGlvbjogJ0V4cG9ydCBhIFdvcmRQcmVzcyBzaXRlIHRvIGEgemlwIGZpbGUnLFxuICBpbnB1dFNjaGVtYToge1xuICAgIHR5cGU6ICdvYmplY3QnLFxuICAgIHByb3BlcnRpZXM6IHtcbiAgICAgIHNpdGU6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnU2l0ZSBuYW1lIG9yIElEIHRvIGV4cG9ydCcsXG4gICAgICB9LFxuICAgICAgb3V0cHV0X3BhdGg6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnT3V0cHV0IGRpcmVjdG9yeSBwYXRoIChkZWZhdWx0OiB+L0Rvd25sb2FkcyknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ3NpdGUnXSxcbiAgfSxcbn07XG5cbmludGVyZmFjZSBFeHBvcnRTaXRlQXJncyB7XG4gIHNpdGU6IHN0cmluZztcbiAgb3V0cHV0X3BhdGg/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleHBvcnRTaXRlKFxuICBhcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc2VydmljZXM6IExvY2FsU2VydmljZXNcbik6IFByb21pc2U8TWNwVG9vbFJlc3VsdD4ge1xuICBjb25zdCB7IHNpdGU6IHNpdGVRdWVyeSwgb3V0cHV0X3BhdGggfSA9IGFyZ3MgYXMgdW5rbm93biBhcyBFeHBvcnRTaXRlQXJncztcblxuICBjb25zdCBwYXJhbUVycm9yID0gdmFsaWRhdGVSZXF1aXJlZFBhcmFtKHNpdGVRdWVyeSwgJ3NpdGUnKTtcbiAgaWYgKHBhcmFtRXJyb3IpIHJldHVybiBwYXJhbUVycm9yO1xuXG4gIGNvbnN0IHNpdGVSZXN1bHQgPSBmaW5kU2l0ZU9yRXJyb3Ioc2l0ZVF1ZXJ5LCBzZXJ2aWNlcy5zaXRlRGF0YSk7XG4gIGlmICgnZXJyb3InIGluIHNpdGVSZXN1bHQpIHJldHVybiBzaXRlUmVzdWx0LmVycm9yO1xuICBjb25zdCB7IHNpdGUgfSA9IHNpdGVSZXN1bHQ7XG5cbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiBleHBvcnRTaXRlIHNlcnZpY2UgZXhpc3RzXG4gICAgaWYgKCFzZXJ2aWNlcy5leHBvcnRTaXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6ICdFeHBvcnQgc2l0ZSBzZXJ2aWNlIG5vdCBhdmFpbGFibGUnIH1dLFxuICAgICAgICBpc0Vycm9yOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0IG91dHB1dCBwYXRoIHRvIERvd25sb2FkcyBmb2xkZXJcbiAgICBjb25zdCBvdXRwdXREaXIgPSBvdXRwdXRfcGF0aCB8fCBwYXRoLmpvaW4ob3MuaG9tZWRpcigpLCAnRG93bmxvYWRzJyk7XG4gICAgY29uc3QgdGltZXN0YW1wID0gbmV3IERhdGUoKS50b0lTT1N0cmluZygpLnJlcGxhY2UoL1s6Ll0vZywgJy0nKS5zbGljZSgwLCAxOSk7XG4gICAgY29uc3QgZmlsZW5hbWUgPSBgJHtzaXRlLm5hbWV9LSR7dGltZXN0YW1wfS56aXBgO1xuICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLmpvaW4ob3V0cHV0RGlyLCBmaWxlbmFtZSk7XG5cbiAgICAvLyBFeHBvcnQgdGhlIHNpdGVcbiAgICBhd2FpdCBzZXJ2aWNlcy5leHBvcnRTaXRlKHNpdGUsIG91dHB1dFBhdGgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICB0ZXh0OiBgU3VjY2Vzc2Z1bGx5IGV4cG9ydGVkIFwiJHtzaXRlLm5hbWV9XCIgdG8gJHtvdXRwdXRQYXRofWAsXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogJ3RleHQnLCB0ZXh0OiBgRmFpbGVkIHRvIGV4cG9ydCBzaXRlOiAke2Vycm9yLm1lc3NhZ2V9YCB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuIl19
|