@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.
Files changed (86) hide show
  1. package/addon-dist/bin/mcp-stdio.js +2808 -0
  2. package/addon-dist/lib/common/constants.d.ts +22 -0
  3. package/addon-dist/lib/common/constants.js +26 -0
  4. package/addon-dist/lib/common/theme.d.ts +68 -0
  5. package/addon-dist/lib/common/theme.js +126 -0
  6. package/addon-dist/lib/common/types.d.ts +298 -0
  7. package/addon-dist/lib/common/types.js +6 -0
  8. package/addon-dist/lib/main/config/ConnectionInfo.d.ts +25 -0
  9. package/addon-dist/lib/main/config/ConnectionInfo.js +82 -0
  10. package/addon-dist/lib/main/index.d.ts +12 -0
  11. package/addon-dist/lib/main/index.js +3322 -0
  12. package/addon-dist/lib/main/mcp/McpAuth.d.ts +37 -0
  13. package/addon-dist/lib/main/mcp/McpAuth.js +87 -0
  14. package/addon-dist/lib/main/mcp/McpServer.d.ts +67 -0
  15. package/addon-dist/lib/main/mcp/McpServer.js +343 -0
  16. package/addon-dist/lib/main/mcp/tools/changePhpVersion.d.ts +7 -0
  17. package/addon-dist/lib/main/mcp/tools/changePhpVersion.js +81 -0
  18. package/addon-dist/lib/main/mcp/tools/cloneSite.d.ts +7 -0
  19. package/addon-dist/lib/main/mcp/tools/cloneSite.js +66 -0
  20. package/addon-dist/lib/main/mcp/tools/createSite.d.ts +7 -0
  21. package/addon-dist/lib/main/mcp/tools/createSite.js +137 -0
  22. package/addon-dist/lib/main/mcp/tools/deleteSite.d.ts +7 -0
  23. package/addon-dist/lib/main/mcp/tools/deleteSite.js +72 -0
  24. package/addon-dist/lib/main/mcp/tools/exportDatabase.d.ts +7 -0
  25. package/addon-dist/lib/main/mcp/tools/exportDatabase.js +72 -0
  26. package/addon-dist/lib/main/mcp/tools/exportSite.d.ts +7 -0
  27. package/addon-dist/lib/main/mcp/tools/exportSite.js +103 -0
  28. package/addon-dist/lib/main/mcp/tools/getLocalInfo.d.ts +7 -0
  29. package/addon-dist/lib/main/mcp/tools/getLocalInfo.js +72 -0
  30. package/addon-dist/lib/main/mcp/tools/getSite.d.ts +7 -0
  31. package/addon-dist/lib/main/mcp/tools/getSite.js +68 -0
  32. package/addon-dist/lib/main/mcp/tools/getSiteLogs.d.ts +7 -0
  33. package/addon-dist/lib/main/mcp/tools/getSiteLogs.js +149 -0
  34. package/addon-dist/lib/main/mcp/tools/helpers.d.ts +59 -0
  35. package/addon-dist/lib/main/mcp/tools/helpers.js +179 -0
  36. package/addon-dist/lib/main/mcp/tools/importDatabase.d.ts +7 -0
  37. package/addon-dist/lib/main/mcp/tools/importDatabase.js +109 -0
  38. package/addon-dist/lib/main/mcp/tools/importSite.d.ts +7 -0
  39. package/addon-dist/lib/main/mcp/tools/importSite.js +149 -0
  40. package/addon-dist/lib/main/mcp/tools/index.d.ts +26 -0
  41. package/addon-dist/lib/main/mcp/tools/index.js +117 -0
  42. package/addon-dist/lib/main/mcp/tools/listBlueprints.d.ts +7 -0
  43. package/addon-dist/lib/main/mcp/tools/listBlueprints.js +54 -0
  44. package/addon-dist/lib/main/mcp/tools/listServices.d.ts +7 -0
  45. package/addon-dist/lib/main/mcp/tools/listServices.js +112 -0
  46. package/addon-dist/lib/main/mcp/tools/listSites.d.ts +7 -0
  47. package/addon-dist/lib/main/mcp/tools/listSites.js +62 -0
  48. package/addon-dist/lib/main/mcp/tools/openAdminer.d.ts +7 -0
  49. package/addon-dist/lib/main/mcp/tools/openAdminer.js +59 -0
  50. package/addon-dist/lib/main/mcp/tools/openSite.d.ts +7 -0
  51. package/addon-dist/lib/main/mcp/tools/openSite.js +62 -0
  52. package/addon-dist/lib/main/mcp/tools/renameSite.d.ts +7 -0
  53. package/addon-dist/lib/main/mcp/tools/renameSite.js +70 -0
  54. package/addon-dist/lib/main/mcp/tools/restartSite.d.ts +7 -0
  55. package/addon-dist/lib/main/mcp/tools/restartSite.js +56 -0
  56. package/addon-dist/lib/main/mcp/tools/saveBlueprint.d.ts +7 -0
  57. package/addon-dist/lib/main/mcp/tools/saveBlueprint.js +89 -0
  58. package/addon-dist/lib/main/mcp/tools/startSite.d.ts +7 -0
  59. package/addon-dist/lib/main/mcp/tools/startSite.js +54 -0
  60. package/addon-dist/lib/main/mcp/tools/stopSite.d.ts +7 -0
  61. package/addon-dist/lib/main/mcp/tools/stopSite.js +54 -0
  62. package/addon-dist/lib/main/mcp/tools/toggleXdebug.d.ts +7 -0
  63. package/addon-dist/lib/main/mcp/tools/toggleXdebug.js +69 -0
  64. package/addon-dist/lib/main/mcp/tools/trustSsl.d.ts +7 -0
  65. package/addon-dist/lib/main/mcp/tools/trustSsl.js +59 -0
  66. package/addon-dist/lib/main/mcp/tools/wpCli.d.ts +7 -0
  67. package/addon-dist/lib/main/mcp/tools/wpCli.js +110 -0
  68. package/addon-dist/lib/main.d.ts +1 -0
  69. package/addon-dist/lib/main.js +10 -0
  70. package/addon-dist/lib/renderer/index.d.ts +7 -0
  71. package/addon-dist/lib/renderer/index.js +479 -0
  72. package/addon-dist/package.json +73 -0
  73. package/bin/lwp.js +10 -0
  74. package/lib/bootstrap/index.d.ts +98 -0
  75. package/lib/bootstrap/index.js +493 -0
  76. package/lib/bootstrap/paths.d.ts +28 -0
  77. package/lib/bootstrap/paths.js +96 -0
  78. package/lib/client/GraphQLClient.d.ts +38 -0
  79. package/lib/client/GraphQLClient.js +71 -0
  80. package/lib/client/index.d.ts +4 -0
  81. package/lib/client/index.js +10 -0
  82. package/lib/formatters/index.d.ts +75 -0
  83. package/lib/formatters/index.js +139 -0
  84. package/lib/index.d.ts +8 -0
  85. package/lib/index.js +1173 -0
  86. package/package.json +72 -0
@@ -0,0 +1,7 @@
1
+ /**
2
+ * get_local_info Tool
3
+ * Get information about the Local application
4
+ */
5
+ import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
6
+ export declare const getLocalInfoDefinition: McpToolDefinition;
7
+ export declare function getLocalInfo(_args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ /**
3
+ * get_local_info Tool
4
+ * Get information about the Local application
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.getLocalInfoDefinition = void 0;
11
+ exports.getLocalInfo = getLocalInfo;
12
+ const os_1 = __importDefault(require("os"));
13
+ const constants_1 = require("../../../common/constants");
14
+ const index_1 = require("./index");
15
+ exports.getLocalInfoDefinition = {
16
+ name: 'get_local_info',
17
+ description: 'Get information about the Local application including version, platform, MCP server status, and available tools',
18
+ inputSchema: {
19
+ type: 'object',
20
+ properties: {},
21
+ },
22
+ };
23
+ async function getLocalInfo(_args, services) {
24
+ try {
25
+ const sitesMap = services.siteData.getSites();
26
+ const allSites = Object.values(sitesMap);
27
+ // Count sites by status
28
+ let runningSites = 0;
29
+ let stoppedSites = 0;
30
+ for (const site of allSites) {
31
+ const status = await services.siteProcessManager.getSiteStatus(site);
32
+ if (status === 'running') {
33
+ runningSites++;
34
+ }
35
+ else {
36
+ stoppedSites++;
37
+ }
38
+ }
39
+ const info = {
40
+ local: {
41
+ version: process.env.LOCAL_VERSION || 'unknown',
42
+ platform: os_1.default.platform(),
43
+ arch: os_1.default.arch(),
44
+ },
45
+ mcp: {
46
+ version: constants_1.MCP_SERVER.VERSION,
47
+ name: constants_1.MCP_SERVER.NAME,
48
+ tools: (0, index_1.getToolNames)(),
49
+ },
50
+ sites: {
51
+ total: allSites.length,
52
+ running: runningSites,
53
+ stopped: stoppedSites,
54
+ },
55
+ system: {
56
+ nodeVersion: process.version,
57
+ hostname: os_1.default.hostname(),
58
+ homeDir: os_1.default.homedir(),
59
+ },
60
+ };
61
+ return {
62
+ content: [{ type: 'text', text: JSON.stringify(info, null, 2) }],
63
+ };
64
+ }
65
+ catch (error) {
66
+ return {
67
+ content: [{ type: 'text', text: `Failed to get Local info: ${error.message}` }],
68
+ isError: true,
69
+ };
70
+ }
71
+ }
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0TG9jYWxJbmZvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL21haW4vbWNwL3Rvb2xzL2dldExvY2FsSW5mby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7OztHQUdHOzs7Ozs7QUFpQkgsb0NBb0RDO0FBbkVELDRDQUFvQjtBQUVwQix5REFBdUQ7QUFDdkQsbUNBQXVDO0FBRTFCLFFBQUEsc0JBQXNCLEdBQXNCO0lBQ3ZELElBQUksRUFBRSxnQkFBZ0I7SUFDdEIsV0FBVyxFQUNULGlIQUFpSDtJQUNuSCxXQUFXLEVBQUU7UUFDWCxJQUFJLEVBQUUsUUFBUTtRQUNkLFVBQVUsRUFBRSxFQUFFO0tBQ2Y7Q0FDRixDQUFDO0FBRUssS0FBSyxVQUFVLFlBQVksQ0FDaEMsS0FBOEIsRUFDOUIsUUFBdUI7SUFFdkIsSUFBSSxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUM5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBVSxDQUFDO1FBRWxELHdCQUF3QjtRQUN4QixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7WUFDNUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsa0JBQWtCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3JFLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN6QixZQUFZLEVBQUUsQ0FBQztZQUNqQixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sWUFBWSxFQUFFLENBQUM7WUFDakIsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLElBQUksR0FBRztZQUNYLEtBQUssRUFBRTtnQkFDTCxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLElBQUksU0FBUztnQkFDL0MsUUFBUSxFQUFFLFlBQUUsQ0FBQyxRQUFRLEVBQUU7Z0JBQ3ZCLElBQUksRUFBRSxZQUFFLENBQUMsSUFBSSxFQUFFO2FBQ2hCO1lBQ0QsR0FBRyxFQUFFO2dCQUNILE9BQU8sRUFBRSxzQkFBVSxDQUFDLE9BQU87Z0JBQzNCLElBQUksRUFBRSxzQkFBVSxDQUFDLElBQUk7Z0JBQ3JCLEtBQUssRUFBRSxJQUFBLG9CQUFZLEdBQUU7YUFDdEI7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLFFBQVEsQ0FBQyxNQUFNO2dCQUN0QixPQUFPLEVBQUUsWUFBWTtnQkFDckIsT0FBTyxFQUFFLFlBQVk7YUFDdEI7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sV0FBVyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2dCQUM1QixRQUFRLEVBQUUsWUFBRSxDQUFDLFFBQVEsRUFBRTtnQkFDdkIsT0FBTyxFQUFFLFlBQUUsQ0FBQyxPQUFPLEVBQUU7YUFDdEI7U0FDRixDQUFDO1FBRUYsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDakUsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLE9BQU87WUFDTCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLDZCQUE2QixLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUMvRSxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUM7SUFDSixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZ2V0X2xvY2FsX2luZm8gVG9vbFxuICogR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBMb2NhbCBhcHBsaWNhdGlvblxuICovXG5cbmltcG9ydCBvcyBmcm9tICdvcyc7XG5pbXBvcnQgeyBNY3BUb29sRGVmaW5pdGlvbiwgTWNwVG9vbFJlc3VsdCwgTG9jYWxTZXJ2aWNlcyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyBNQ1BfU0VSVkVSIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBnZXRUb29sTmFtZXMgfSBmcm9tICcuL2luZGV4JztcblxuZXhwb3J0IGNvbnN0IGdldExvY2FsSW5mb0RlZmluaXRpb246IE1jcFRvb2xEZWZpbml0aW9uID0ge1xuICBuYW1lOiAnZ2V0X2xvY2FsX2luZm8nLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBMb2NhbCBhcHBsaWNhdGlvbiBpbmNsdWRpbmcgdmVyc2lvbiwgcGxhdGZvcm0sIE1DUCBzZXJ2ZXIgc3RhdHVzLCBhbmQgYXZhaWxhYmxlIHRvb2xzJyxcbiAgaW5wdXRTY2hlbWE6IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7fSxcbiAgfSxcbn07XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMb2NhbEluZm8oXG4gIF9hcmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgc2VydmljZXM6IExvY2FsU2VydmljZXNcbik6IFByb21pc2U8TWNwVG9vbFJlc3VsdD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHNpdGVzTWFwID0gc2VydmljZXMuc2l0ZURhdGEuZ2V0U2l0ZXMoKTtcbiAgICBjb25zdCBhbGxTaXRlcyA9IE9iamVjdC52YWx1ZXMoc2l0ZXNNYXApIGFzIGFueVtdO1xuXG4gICAgLy8gQ291bnQgc2l0ZXMgYnkgc3RhdHVzXG4gICAgbGV0IHJ1bm5pbmdTaXRlcyA9IDA7XG4gICAgbGV0IHN0b3BwZWRTaXRlcyA9IDA7XG4gICAgZm9yIChjb25zdCBzaXRlIG9mIGFsbFNpdGVzKSB7XG4gICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBzZXJ2aWNlcy5zaXRlUHJvY2Vzc01hbmFnZXIuZ2V0U2l0ZVN0YXR1cyhzaXRlKTtcbiAgICAgIGlmIChzdGF0dXMgPT09ICdydW5uaW5nJykge1xuICAgICAgICBydW5uaW5nU2l0ZXMrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0b3BwZWRTaXRlcysrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluZm8gPSB7XG4gICAgICBsb2NhbDoge1xuICAgICAgICB2ZXJzaW9uOiBwcm9jZXNzLmVudi5MT0NBTF9WRVJTSU9OIHx8ICd1bmtub3duJyxcbiAgICAgICAgcGxhdGZvcm06IG9zLnBsYXRmb3JtKCksXG4gICAgICAgIGFyY2g6IG9zLmFyY2goKSxcbiAgICAgIH0sXG4gICAgICBtY3A6IHtcbiAgICAgICAgdmVyc2lvbjogTUNQX1NFUlZFUi5WRVJTSU9OLFxuICAgICAgICBuYW1lOiBNQ1BfU0VSVkVSLk5BTUUsXG4gICAgICAgIHRvb2xzOiBnZXRUb29sTmFtZXMoKSxcbiAgICAgIH0sXG4gICAgICBzaXRlczoge1xuICAgICAgICB0b3RhbDogYWxsU2l0ZXMubGVuZ3RoLFxuICAgICAgICBydW5uaW5nOiBydW5uaW5nU2l0ZXMsXG4gICAgICAgIHN0b3BwZWQ6IHN0b3BwZWRTaXRlcyxcbiAgICAgIH0sXG4gICAgICBzeXN0ZW06IHtcbiAgICAgICAgbm9kZVZlcnNpb246IHByb2Nlc3MudmVyc2lvbixcbiAgICAgICAgaG9zdG5hbWU6IG9zLmhvc3RuYW1lKCksXG4gICAgICAgIGhvbWVEaXI6IG9zLmhvbWVkaXIoKSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IEpTT04uc3RyaW5naWZ5KGluZm8sIG51bGwsIDIpIH1dLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogJ3RleHQnLCB0ZXh0OiBgRmFpbGVkIHRvIGdldCBMb2NhbCBpbmZvOiAke2Vycm9yLm1lc3NhZ2V9YCB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,7 @@
1
+ /**
2
+ * get_site Tool
3
+ * Get detailed information about a specific site
4
+ */
5
+ import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
6
+ export declare const getSiteDefinition: McpToolDefinition;
7
+ export declare function getSite(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ /**
3
+ * get_site Tool
4
+ * Get detailed information about a specific site
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.getSiteDefinition = void 0;
8
+ exports.getSite = getSite;
9
+ const helpers_1 = require("./helpers");
10
+ exports.getSiteDefinition = {
11
+ name: 'get_site',
12
+ description: 'Get detailed information about a WordPress site including PHP version, web server, database, and WordPress version',
13
+ inputSchema: {
14
+ type: 'object',
15
+ properties: {
16
+ site: {
17
+ type: 'string',
18
+ description: 'Site name or ID (partial names work)',
19
+ },
20
+ },
21
+ required: ['site'],
22
+ },
23
+ };
24
+ async function getSite(args, services) {
25
+ const { site: siteQuery } = args;
26
+ // Validate required parameter
27
+ const paramError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
28
+ if (paramError)
29
+ return paramError;
30
+ // Find site or return error
31
+ const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
32
+ if ('error' in siteResult)
33
+ return siteResult.error;
34
+ const { site } = siteResult;
35
+ try {
36
+ const currentStatus = await services.siteProcessManager.getSiteStatus(site);
37
+ const siteInfo = {
38
+ id: site.id,
39
+ name: site.name,
40
+ status: currentStatus,
41
+ domain: site.domain,
42
+ path: site.path,
43
+ url: `https://${site.domain}`,
44
+ adminUrl: `https://${site.domain}/wp-admin`,
45
+ environment: site.environment,
46
+ services: {
47
+ php: site.phpVersion || site.services?.php?.version,
48
+ webServer: site.webServer || site.services?.nginx?.version || site.services?.apache?.version,
49
+ database: site.mysql || site.services?.mysql?.version,
50
+ },
51
+ wordpress: {
52
+ version: site.wordPressVersion,
53
+ multisite: site.multisite || false,
54
+ },
55
+ hostConnections: site.hostConnections || [],
56
+ };
57
+ return {
58
+ content: [{ type: 'text', text: JSON.stringify(siteInfo, null, 2) }],
59
+ };
60
+ }
61
+ catch (error) {
62
+ return {
63
+ content: [{ type: 'text', text: `Failed to get site info: ${error.message}` }],
64
+ isError: true,
65
+ };
66
+ }
67
+ }
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0U2l0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWluL21jcC90b29scy9nZXRTaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7OztBQXlCSCwwQkFpREM7QUF2RUQsdUNBQW1FO0FBRXRELFFBQUEsaUJBQWlCLEdBQXNCO0lBQ2xELElBQUksRUFBRSxVQUFVO0lBQ2hCLFdBQVcsRUFDVCxvSEFBb0g7SUFDdEgsV0FBVyxFQUFFO1FBQ1gsSUFBSSxFQUFFLFFBQVE7UUFDZCxVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLHNDQUFzQzthQUNwRDtTQUNGO1FBQ0QsUUFBUSxFQUFFLENBQUMsTUFBTSxDQUFDO0tBQ25CO0NBQ0YsQ0FBQztBQU1LLEtBQUssVUFBVSxPQUFPLENBQzNCLElBQTZCLEVBQzdCLFFBQXVCO0lBRXZCLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLEdBQUcsSUFBOEIsQ0FBQztJQUUzRCw4QkFBOEI7SUFDOUIsTUFBTSxVQUFVLEdBQUcsSUFBQSwrQkFBcUIsRUFBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDNUQsSUFBSSxVQUFVO1FBQUUsT0FBTyxVQUFVLENBQUM7SUFFbEMsNEJBQTRCO0lBQzVCLE1BQU0sVUFBVSxHQUFHLElBQUEseUJBQWUsRUFBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pFLElBQUksT0FBTyxJQUFJLFVBQVU7UUFBRSxPQUFPLFVBQVUsQ0FBQyxLQUFLLENBQUM7SUFDbkQsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLFVBQVUsQ0FBQztJQUU1QixJQUFJLENBQUM7UUFDSCxNQUFNLGFBQWEsR0FBRyxNQUFNLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFNUUsTUFBTSxRQUFRLEdBQUc7WUFDZixFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUU7WUFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixNQUFNLEVBQUUsYUFBYTtZQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsR0FBRyxFQUFFLFdBQVcsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUM3QixRQUFRLEVBQUUsV0FBVyxJQUFJLENBQUMsTUFBTSxXQUFXO1lBQzNDLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixRQUFRLEVBQUU7Z0JBQ1IsR0FBRyxFQUFFLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsT0FBTztnQkFDbkQsU0FBUyxFQUNQLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU87Z0JBQ25GLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE9BQU87YUFDdEQ7WUFDRCxTQUFTLEVBQUU7Z0JBQ1QsT0FBTyxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQzlCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUs7YUFDbkM7WUFDRCxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsSUFBSSxFQUFFO1NBQzVDLENBQUM7UUFFRixPQUFPO1lBQ0wsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNyRSxDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsNEJBQTRCLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQzlFLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBnZXRfc2l0ZSBUb29sXG4gKiBHZXQgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYSBzcGVjaWZpYyBzaXRlXG4gKi9cblxuaW1wb3J0IHsgTWNwVG9vbERlZmluaXRpb24sIE1jcFRvb2xSZXN1bHQsIExvY2FsU2VydmljZXMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgdmFsaWRhdGVSZXF1aXJlZFBhcmFtLCBmaW5kU2l0ZU9yRXJyb3IgfSBmcm9tICcuL2hlbHBlcnMnO1xuXG5leHBvcnQgY29uc3QgZ2V0U2l0ZURlZmluaXRpb246IE1jcFRvb2xEZWZpbml0aW9uID0ge1xuICBuYW1lOiAnZ2V0X3NpdGUnLFxuICBkZXNjcmlwdGlvbjpcbiAgICAnR2V0IGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IGEgV29yZFByZXNzIHNpdGUgaW5jbHVkaW5nIFBIUCB2ZXJzaW9uLCB3ZWIgc2VydmVyLCBkYXRhYmFzZSwgYW5kIFdvcmRQcmVzcyB2ZXJzaW9uJyxcbiAgaW5wdXRTY2hlbWE6IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBzaXRlOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1NpdGUgbmFtZSBvciBJRCAocGFydGlhbCBuYW1lcyB3b3JrKScsXG4gICAgICB9LFxuICAgIH0sXG4gICAgcmVxdWlyZWQ6IFsnc2l0ZSddLFxuICB9LFxufTtcblxuaW50ZXJmYWNlIEdldFNpdGVBcmdzIHtcbiAgc2l0ZTogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0U2l0ZShcbiAgYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNlcnZpY2VzOiBMb2NhbFNlcnZpY2VzXG4pOiBQcm9taXNlPE1jcFRvb2xSZXN1bHQ+IHtcbiAgY29uc3QgeyBzaXRlOiBzaXRlUXVlcnkgfSA9IGFyZ3MgYXMgdW5rbm93biBhcyBHZXRTaXRlQXJncztcblxuICAvLyBWYWxpZGF0ZSByZXF1aXJlZCBwYXJhbWV0ZXJcbiAgY29uc3QgcGFyYW1FcnJvciA9IHZhbGlkYXRlUmVxdWlyZWRQYXJhbShzaXRlUXVlcnksICdzaXRlJyk7XG4gIGlmIChwYXJhbUVycm9yKSByZXR1cm4gcGFyYW1FcnJvcjtcblxuICAvLyBGaW5kIHNpdGUgb3IgcmV0dXJuIGVycm9yXG4gIGNvbnN0IHNpdGVSZXN1bHQgPSBmaW5kU2l0ZU9yRXJyb3Ioc2l0ZVF1ZXJ5LCBzZXJ2aWNlcy5zaXRlRGF0YSk7XG4gIGlmICgnZXJyb3InIGluIHNpdGVSZXN1bHQpIHJldHVybiBzaXRlUmVzdWx0LmVycm9yO1xuICBjb25zdCB7IHNpdGUgfSA9IHNpdGVSZXN1bHQ7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBjdXJyZW50U3RhdHVzID0gYXdhaXQgc2VydmljZXMuc2l0ZVByb2Nlc3NNYW5hZ2VyLmdldFNpdGVTdGF0dXMoc2l0ZSk7XG5cbiAgICBjb25zdCBzaXRlSW5mbyA9IHtcbiAgICAgIGlkOiBzaXRlLmlkLFxuICAgICAgbmFtZTogc2l0ZS5uYW1lLFxuICAgICAgc3RhdHVzOiBjdXJyZW50U3RhdHVzLFxuICAgICAgZG9tYWluOiBzaXRlLmRvbWFpbixcbiAgICAgIHBhdGg6IHNpdGUucGF0aCxcbiAgICAgIHVybDogYGh0dHBzOi8vJHtzaXRlLmRvbWFpbn1gLFxuICAgICAgYWRtaW5Vcmw6IGBodHRwczovLyR7c2l0ZS5kb21haW59L3dwLWFkbWluYCxcbiAgICAgIGVudmlyb25tZW50OiBzaXRlLmVudmlyb25tZW50LFxuICAgICAgc2VydmljZXM6IHtcbiAgICAgICAgcGhwOiBzaXRlLnBocFZlcnNpb24gfHwgc2l0ZS5zZXJ2aWNlcz8ucGhwPy52ZXJzaW9uLFxuICAgICAgICB3ZWJTZXJ2ZXI6XG4gICAgICAgICAgc2l0ZS53ZWJTZXJ2ZXIgfHwgc2l0ZS5zZXJ2aWNlcz8ubmdpbng/LnZlcnNpb24gfHwgc2l0ZS5zZXJ2aWNlcz8uYXBhY2hlPy52ZXJzaW9uLFxuICAgICAgICBkYXRhYmFzZTogc2l0ZS5teXNxbCB8fCBzaXRlLnNlcnZpY2VzPy5teXNxbD8udmVyc2lvbixcbiAgICAgIH0sXG4gICAgICB3b3JkcHJlc3M6IHtcbiAgICAgICAgdmVyc2lvbjogc2l0ZS53b3JkUHJlc3NWZXJzaW9uLFxuICAgICAgICBtdWx0aXNpdGU6IHNpdGUubXVsdGlzaXRlIHx8IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIGhvc3RDb25uZWN0aW9uczogc2l0ZS5ob3N0Q29ubmVjdGlvbnMgfHwgW10sXG4gICAgfTtcblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IEpTT04uc3RyaW5naWZ5KHNpdGVJbmZvLCBudWxsLCAyKSB9XSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogYEZhaWxlZCB0byBnZXQgc2l0ZSBpbmZvOiAke2Vycm9yLm1lc3NhZ2V9YCB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,7 @@
1
+ /**
2
+ * get_site_logs Tool
3
+ * Retrieve log files for a site
4
+ */
5
+ import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
6
+ export declare const getSiteLogsDefinition: McpToolDefinition;
7
+ export declare function getSiteLogs(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * get_site_logs Tool
4
+ * Retrieve log files for a site
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.getSiteLogsDefinition = void 0;
41
+ exports.getSiteLogs = getSiteLogs;
42
+ const helpers_1 = require("./helpers");
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ exports.getSiteLogsDefinition = {
46
+ name: 'get_site_logs',
47
+ description: 'Get log file contents for a site (PHP errors, access logs, etc.)',
48
+ inputSchema: {
49
+ type: 'object',
50
+ properties: {
51
+ site: {
52
+ type: 'string',
53
+ description: 'Site name or ID',
54
+ },
55
+ logType: {
56
+ type: 'string',
57
+ enum: ['php', 'nginx', 'mysql', 'all'],
58
+ description: 'Type of logs to retrieve (default: php)',
59
+ },
60
+ lines: {
61
+ type: 'number',
62
+ description: 'Number of lines to return from end of log (default: 100)',
63
+ },
64
+ },
65
+ required: ['site'],
66
+ },
67
+ };
68
+ function readLastLines(filePath, numLines) {
69
+ try {
70
+ if (!fs.existsSync(filePath)) {
71
+ return `[Log file not found: ${path.basename(filePath)}]`;
72
+ }
73
+ const content = fs.readFileSync(filePath, 'utf-8');
74
+ const lines = content.split('\n');
75
+ const lastLines = lines.slice(-numLines).join('\n');
76
+ return lastLines || '[Log file is empty]';
77
+ }
78
+ catch (error) {
79
+ return `[Error reading log: ${error.message}]`;
80
+ }
81
+ }
82
+ function findLogFiles(logsDir, serviceType) {
83
+ const servicePath = path.join(logsDir, serviceType);
84
+ const logFiles = [];
85
+ try {
86
+ if (fs.existsSync(servicePath) && fs.statSync(servicePath).isDirectory()) {
87
+ const files = fs.readdirSync(servicePath);
88
+ for (const file of files) {
89
+ if (file.endsWith('.log')) {
90
+ logFiles.push(path.join(servicePath, file));
91
+ }
92
+ }
93
+ }
94
+ }
95
+ catch {
96
+ // Directory doesn't exist or can't be read
97
+ }
98
+ return logFiles;
99
+ }
100
+ async function getSiteLogs(args, services) {
101
+ const { site: siteQuery, logType = 'php', lines = 100 } = args;
102
+ const paramError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
103
+ if (paramError)
104
+ return paramError;
105
+ const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
106
+ if ('error' in siteResult)
107
+ return siteResult.error;
108
+ const { site } = siteResult;
109
+ try {
110
+ // Get logs directory from site paths
111
+ const logsDir = site.paths?.logs || path.join(site.path, 'logs');
112
+ if (!fs.existsSync(logsDir)) {
113
+ return {
114
+ content: [{ type: 'text', text: `Logs directory not found: ${logsDir}` }],
115
+ isError: true,
116
+ };
117
+ }
118
+ const results = [];
119
+ const numLines = Math.min(Math.max(lines, 10), 1000); // Clamp between 10 and 1000
120
+ const serviceTypes = logType === 'all' ? ['php', 'nginx', 'mysql'] : [logType];
121
+ for (const serviceType of serviceTypes) {
122
+ const logFiles = findLogFiles(logsDir, serviceType);
123
+ if (logFiles.length === 0) {
124
+ results.push(`=== ${serviceType.toUpperCase()} ===\n[No log files found]`);
125
+ continue;
126
+ }
127
+ for (const logFile of logFiles) {
128
+ const fileName = path.basename(logFile);
129
+ const content = readLastLines(logFile, numLines);
130
+ results.push(`=== ${serviceType.toUpperCase()}: ${fileName} ===\n${content}`);
131
+ }
132
+ }
133
+ return {
134
+ content: [
135
+ {
136
+ type: 'text',
137
+ text: `Logs for "${site.name}" (last ${numLines} lines):\n\n${results.join('\n\n')}`,
138
+ },
139
+ ],
140
+ };
141
+ }
142
+ catch (error) {
143
+ return {
144
+ content: [{ type: 'text', text: `Failed to get site logs: ${error.message}` }],
145
+ isError: true,
146
+ };
147
+ }
148
+ }
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0U2l0ZUxvZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbWFpbi9tY3AvdG9vbHMvZ2V0U2l0ZUxvZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBd0VILGtDQTBEQztBQS9IRCx1Q0FBbUU7QUFDbkUsdUNBQXlCO0FBQ3pCLDJDQUE2QjtBQUVoQixRQUFBLHFCQUFxQixHQUFzQjtJQUN0RCxJQUFJLEVBQUUsZUFBZTtJQUNyQixXQUFXLEVBQUUsa0VBQWtFO0lBQy9FLFdBQVcsRUFBRTtRQUNYLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1YsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxpQkFBaUI7YUFDL0I7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDO2dCQUN0QyxXQUFXLEVBQUUseUNBQXlDO2FBQ3ZEO1lBQ0QsS0FBSyxFQUFFO2dCQUNMLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSwwREFBMEQ7YUFDeEU7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQztLQUNuQjtDQUNGLENBQUM7QUFRRixTQUFTLGFBQWEsQ0FBQyxRQUFnQixFQUFFLFFBQWdCO0lBQ3ZELElBQUksQ0FBQztRQUNILElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyx3QkFBd0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1FBQzVELENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMs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Q0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogZ2V0X3NpdGVfbG9ncyBUb29sXG4gKiBSZXRyaWV2ZSBsb2cgZmlsZXMgZm9yIGEgc2l0ZVxuICovXG5cbmltcG9ydCB7IE1jcFRvb2xEZWZpbml0aW9uLCBNY3BUb29sUmVzdWx0LCBMb2NhbFNlcnZpY2VzIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcbmltcG9ydCB7IHZhbGlkYXRlUmVxdWlyZWRQYXJhbSwgZmluZFNpdGVPckVycm9yIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBjb25zdCBnZXRTaXRlTG9nc0RlZmluaXRpb246IE1jcFRvb2xEZWZpbml0aW9uID0ge1xuICBuYW1lOiAnZ2V0X3NpdGVfbG9ncycsXG4gIGRlc2NyaXB0aW9uOiAnR2V0IGxvZyBmaWxlIGNvbnRlbnRzIGZvciBhIHNpdGUgKFBIUCBlcnJvcnMsIGFjY2VzcyBsb2dzLCBldGMuKScsXG4gIGlucHV0U2NoZW1hOiB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgc2l0ZToge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdTaXRlIG5hbWUgb3IgSUQnLFxuICAgICAgfSxcbiAgICAgIGxvZ1R5cGU6IHtcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGVudW06IFsncGhwJywgJ25naW54JywgJ215c3FsJywgJ2FsbCddLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1R5cGUgb2YgbG9ncyB0byByZXRyaWV2ZSAoZGVmYXVsdDogcGhwKScsXG4gICAgICB9LFxuICAgICAgbGluZXM6IHtcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnTnVtYmVyIG9mIGxpbmVzIHRvIHJldHVybiBmcm9tIGVuZCBvZiBsb2cgKGRlZmF1bHQ6IDEwMCknLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ3NpdGUnXSxcbiAgfSxcbn07XG5cbmludGVyZmFjZSBHZXRTaXRlTG9nc0FyZ3Mge1xuICBzaXRlOiBzdHJpbmc7XG4gIGxvZ1R5cGU/OiAncGhwJyB8ICduZ2lueCcgfCAnbXlzcWwnIHwgJ2FsbCc7XG4gIGxpbmVzPzogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiByZWFkTGFzdExpbmVzKGZpbGVQYXRoOiBzdHJpbmcsIG51bUxpbmVzOiBudW1iZXIpOiBzdHJpbmcge1xuICB0cnkge1xuICAgIGlmICghZnMuZXhpc3RzU3luYyhmaWxlUGF0aCkpIHtcbiAgICAgIHJldHVybiBgW0xvZyBmaWxlIG5vdCBmb3VuZDogJHtwYXRoLmJhc2VuYW1lKGZpbGVQYXRoKX1dYDtcbiAgICB9XG5cbiAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuICAgIGNvbnN0IGxhc3RMaW5lcyA9IGxpbmVzLnNsaWNlKC1udW1MaW5lcykuam9pbignXFxuJyk7XG4gICAgcmV0dXJuIGxhc3RMaW5lcyB8fCAnW0xvZyBmaWxlIGlzIGVtcHR5XSc7XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICByZXR1cm4gYFtFcnJvciByZWFkaW5nIGxvZzogJHtlcnJvci5tZXNzYWdlfV1gO1xuICB9XG59XG5cbmZ1bmN0aW9uIGZpbmRMb2dGaWxlcyhsb2dzRGlyOiBzdHJpbmcsIHNlcnZpY2VUeXBlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHNlcnZpY2VQYXRoID0gcGF0aC5qb2luKGxvZ3NEaXIsIHNlcnZpY2VUeXBlKTtcbiAgY29uc3QgbG9nRmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgdHJ5IHtcbiAgICBpZiAoZnMuZXhpc3RzU3luYyhzZXJ2aWNlUGF0aCkgJiYgZnMuc3RhdFN5bmMoc2VydmljZVBhdGgpLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoc2VydmljZVBhdGgpO1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGZpbGVzKSB7XG4gICAgICAgIGlmIChmaWxlLmVuZHNXaXRoKCcubG9nJykpIHtcbiAgICAgICAgICBsb2dGaWxlcy5wdXNoKHBhdGguam9pbihzZXJ2aWNlUGF0aCwgZmlsZSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBEaXJlY3RvcnkgZG9lc24ndCBleGlzdCBvciBjYW4ndCBiZSByZWFkXG4gIH1cblxuICByZXR1cm4gbG9nRmlsZXM7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRTaXRlTG9ncyhcbiAgYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNlcnZpY2VzOiBMb2NhbFNlcnZpY2VzXG4pOiBQcm9taXNlPE1jcFRvb2xSZXN1bHQ+IHtcbiAgY29uc3QgeyBzaXRlOiBzaXRlUXVlcnksIGxvZ1R5cGUgPSAncGhwJywgbGluZXMgPSAxMDAgfSA9IGFyZ3MgYXMgdW5rbm93biBhcyBHZXRTaXRlTG9nc0FyZ3M7XG5cbiAgY29uc3QgcGFyYW1FcnJvciA9IHZhbGlkYXRlUmVxdWlyZWRQYXJhbShzaXRlUXVlcnksICdzaXRlJyk7XG4gIGlmIChwYXJhbUVycm9yKSByZXR1cm4gcGFyYW1FcnJvcjtcblxuICBjb25zdCBzaXRlUmVzdWx0ID0gZmluZFNpdGVPckVycm9yKHNpdGVRdWVyeSwgc2VydmljZXMuc2l0ZURhdGEpO1xuICBpZiAoJ2Vycm9yJyBpbiBzaXRlUmVzdWx0KSByZXR1cm4gc2l0ZVJlc3VsdC5lcnJvcjtcbiAgY29uc3QgeyBzaXRlIH0gPSBzaXRlUmVzdWx0O1xuXG4gIHRyeSB7XG4gICAgLy8gR2V0IGxvZ3MgZGlyZWN0b3J5IGZyb20gc2l0ZSBwYXRoc1xuICAgIGNvbnN0IGxvZ3NEaXIgPSBzaXRlLnBhdGhzPy5sb2dzIHx8IHBhdGguam9pbihzaXRlLnBhdGgsICdsb2dzJyk7XG5cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMobG9nc0RpcikpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogYExvZ3MgZGlyZWN0b3J5IG5vdCBmb3VuZDogJHtsb2dzRGlyfWAgfV0sXG4gICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgbnVtTGluZXMgPSBNYXRoLm1pbihNYXRoLm1heChsaW5lcywgMTApLCAxMDAwKTsgLy8gQ2xhbXAgYmV0d2VlbiAxMCBhbmQgMTAwMFxuXG4gICAgY29uc3Qgc2VydmljZVR5cGVzID0gbG9nVHlwZSA9PT0gJ2FsbCcgPyBbJ3BocCcsICduZ2lueCcsICdteXNxbCddIDogW2xvZ1R5cGVdO1xuXG4gICAgZm9yIChjb25zdCBzZXJ2aWNlVHlwZSBvZiBzZXJ2aWNlVHlwZXMpIHtcbiAgICAgIGNvbnN0IGxvZ0ZpbGVzID0gZmluZExvZ0ZpbGVzKGxvZ3NEaXIsIHNlcnZpY2VUeXBlKTtcblxuICAgICAgaWYgKGxvZ0ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXN1bHRzLnB1c2goYD09PSAke3NlcnZpY2VUeXBlLnRvVXBwZXJDYXNlKCl9ID09PVxcbltObyBsb2cgZmlsZXMgZm91bmRdYCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGxvZ0ZpbGUgb2YgbG9nRmlsZXMpIHtcbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPSBwYXRoLmJhc2VuYW1lKGxvZ0ZpbGUpO1xuICAgICAgICBjb25zdCBjb250ZW50ID0gcmVhZExhc3RMaW5lcyhsb2dGaWxlLCBudW1MaW5lcyk7XG4gICAgICAgIHJlc3VsdHMucHVzaChgPT09ICR7c2VydmljZVR5cGUudG9VcHBlckNhc2UoKX06ICR7ZmlsZU5hbWV9ID09PVxcbiR7Y29udGVudH1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgIHRleHQ6IGBMb2dzIGZvciBcIiR7c2l0ZS5uYW1lfVwiIChsYXN0ICR7bnVtTGluZXN9IGxpbmVzKTpcXG5cXG4ke3Jlc3VsdHMuam9pbignXFxuXFxuJyl9YCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IGBGYWlsZWQgdG8gZ2V0IHNpdGUgbG9nczogJHtlcnJvci5tZXNzYWdlfWAgfV0sXG4gICAgICBpc0Vycm9yOiB0cnVlLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Tool Helper Functions
3
+ */
4
+ /**
5
+ * Blocked WP-CLI commands that could allow arbitrary code execution
6
+ */
7
+ export declare const BLOCKED_WP_COMMANDS: string[];
8
+ /**
9
+ * Check if a WP-CLI command is blocked for security reasons
10
+ * Returns the blocked command name if blocked, null if safe
11
+ */
12
+ export declare function isBlockedWpCommand(command: string[]): string | null;
13
+ /**
14
+ * Validate that a file path is safe (no path traversal)
15
+ * Returns true if the path is within allowed directories
16
+ */
17
+ export declare function isValidFilePath(filePath: string, allowedDirs?: string[]): boolean;
18
+ /**
19
+ * Validate that a SQL file path is safe
20
+ * Must end in .sql and be in an allowed directory
21
+ */
22
+ export declare function isValidSqlPath(sqlPath: unknown): boolean;
23
+ /**
24
+ * MCP Tool Result type for error responses
25
+ */
26
+ export interface McpErrorResult {
27
+ content: Array<{
28
+ type: 'text';
29
+ text: string;
30
+ }>;
31
+ isError: true;
32
+ }
33
+ /**
34
+ * Create a standardized error result for MCP tools
35
+ */
36
+ export declare function createErrorResult(message: string): McpErrorResult;
37
+ /**
38
+ * Validate that a required parameter is present
39
+ * Returns an error result if missing, null if valid
40
+ */
41
+ export declare function validateRequiredParam(value: unknown, paramName: string): McpErrorResult | null;
42
+ /**
43
+ * Find a site by name or ID
44
+ * Supports partial name matching (case-insensitive)
45
+ */
46
+ export declare function findSite(query: string, siteData: any): any | undefined;
47
+ /**
48
+ * Get all site names as a comma-separated string
49
+ */
50
+ export declare function getAllSiteNames(siteData: any): string;
51
+ /**
52
+ * Find a site or return an error result
53
+ * Combines site lookup with standardized error handling
54
+ */
55
+ export declare function findSiteOrError(query: string, siteData: any): {
56
+ site: any;
57
+ } | {
58
+ error: McpErrorResult;
59
+ };
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+ /**
3
+ * Tool Helper Functions
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || (function () {
22
+ var ownKeys = function(o) {
23
+ ownKeys = Object.getOwnPropertyNames || function (o) {
24
+ var ar = [];
25
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
26
+ return ar;
27
+ };
28
+ return ownKeys(o);
29
+ };
30
+ return function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ })();
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.BLOCKED_WP_COMMANDS = void 0;
40
+ exports.isBlockedWpCommand = isBlockedWpCommand;
41
+ exports.isValidFilePath = isValidFilePath;
42
+ exports.isValidSqlPath = isValidSqlPath;
43
+ exports.createErrorResult = createErrorResult;
44
+ exports.validateRequiredParam = validateRequiredParam;
45
+ exports.findSite = findSite;
46
+ exports.getAllSiteNames = getAllSiteNames;
47
+ exports.findSiteOrError = findSiteOrError;
48
+ const path = __importStar(require("path"));
49
+ const os = __importStar(require("os"));
50
+ /**
51
+ * Blocked WP-CLI commands that could allow arbitrary code execution
52
+ */
53
+ exports.BLOCKED_WP_COMMANDS = [
54
+ 'eval', // Execute arbitrary PHP code
55
+ 'eval-file', // Execute PHP from file
56
+ 'shell', // Interactive PHP shell
57
+ 'db query', // Raw SQL execution
58
+ 'db cli', // MySQL CLI access
59
+ ];
60
+ /**
61
+ * Check if a WP-CLI command is blocked for security reasons
62
+ * Returns the blocked command name if blocked, null if safe
63
+ */
64
+ function isBlockedWpCommand(command) {
65
+ const commandStr = command.join(' ').toLowerCase();
66
+ for (const blocked of exports.BLOCKED_WP_COMMANDS) {
67
+ if (commandStr.includes(blocked)) {
68
+ return blocked;
69
+ }
70
+ }
71
+ return null;
72
+ }
73
+ /**
74
+ * Validate that a file path is safe (no path traversal)
75
+ * Returns true if the path is within allowed directories
76
+ */
77
+ function isValidFilePath(filePath, allowedDirs) {
78
+ // Resolve to absolute path
79
+ const resolvedPath = path.resolve(filePath);
80
+ // Default allowed directories: home, tmp, and common paths
81
+ const homeDir = os.homedir();
82
+ const defaultAllowed = [
83
+ homeDir,
84
+ os.tmpdir(),
85
+ '/tmp',
86
+ '/var/tmp',
87
+ ];
88
+ const allowedDirectories = allowedDirs || defaultAllowed;
89
+ // Check if path is within any allowed directory
90
+ for (const allowedDir of allowedDirectories) {
91
+ const resolvedAllowed = path.resolve(allowedDir);
92
+ if (resolvedPath.startsWith(resolvedAllowed + path.sep) || resolvedPath === resolvedAllowed) {
93
+ return true;
94
+ }
95
+ }
96
+ return false;
97
+ }
98
+ /**
99
+ * Validate that a SQL file path is safe
100
+ * Must end in .sql and be in an allowed directory
101
+ */
102
+ function isValidSqlPath(sqlPath) {
103
+ if (typeof sqlPath !== 'string' || !sqlPath) {
104
+ return false;
105
+ }
106
+ // Must end in .sql
107
+ if (!sqlPath.toLowerCase().endsWith('.sql')) {
108
+ return false;
109
+ }
110
+ // Must be in an allowed directory
111
+ return isValidFilePath(sqlPath);
112
+ }
113
+ /**
114
+ * Create a standardized error result for MCP tools
115
+ */
116
+ function createErrorResult(message) {
117
+ return {
118
+ content: [{ type: 'text', text: message }],
119
+ isError: true,
120
+ };
121
+ }
122
+ /**
123
+ * Validate that a required parameter is present
124
+ * Returns an error result if missing, null if valid
125
+ */
126
+ function validateRequiredParam(value, paramName) {
127
+ if (!value) {
128
+ return createErrorResult(`Error: ${paramName} parameter is required`);
129
+ }
130
+ return null;
131
+ }
132
+ /**
133
+ * Find a site by name or ID
134
+ * Supports partial name matching (case-insensitive)
135
+ */
136
+ function findSite(query, siteData) {
137
+ const sitesMap = siteData.getSites();
138
+ const sites = Object.values(sitesMap);
139
+ // Try exact ID match first
140
+ const byId = sites.find((s) => s.id === query);
141
+ if (byId)
142
+ return byId;
143
+ // Try exact name match (case-insensitive)
144
+ const byExactName = sites.find((s) => s.name.toLowerCase() === query.toLowerCase());
145
+ if (byExactName)
146
+ return byExactName;
147
+ // Try partial name match (case-insensitive)
148
+ const byPartialName = sites.find((s) => s.name.toLowerCase().includes(query.toLowerCase()));
149
+ if (byPartialName)
150
+ return byPartialName;
151
+ // Try domain match
152
+ const byDomain = sites.find((s) => s.domain?.toLowerCase() === query.toLowerCase());
153
+ if (byDomain)
154
+ return byDomain;
155
+ return undefined;
156
+ }
157
+ /**
158
+ * Get all site names as a comma-separated string
159
+ */
160
+ function getAllSiteNames(siteData) {
161
+ const sitesMap = siteData.getSites();
162
+ const sites = Object.values(sitesMap);
163
+ return sites.map((s) => s.name).join(', ') || 'none';
164
+ }
165
+ /**
166
+ * Find a site or return an error result
167
+ * Combines site lookup with standardized error handling
168
+ */
169
+ function findSiteOrError(query, siteData) {
170
+ const site = findSite(query, siteData);
171
+ if (!site) {
172
+ const siteNames = getAllSiteNames(siteData);
173
+ return {
174
+ error: createErrorResult(`Site not found: "${query}". Available sites: ${siteNames}`),
175
+ };
176
+ }
177
+ return { site };
178
+ }
179
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWluL21jcC90b29scy9oZWxwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBb0JILGdEQVFDO0FBTUQsMENBd0JDO0FBTUQsd0NBWUM7QUFhRCw4Q0FLQztBQU1ELHNEQVFDO0FBTUQsNEJBcUJDO0FBS0QsMENBSUM7QUFNRCwwQ0FjQztBQWxLRCwyQ0FBNkI7QUFDN0IsdUNBQXlCO0FBRXpCOztHQUVHO0FBQ1UsUUFBQSxtQkFBbUIsR0FBRztJQUNqQyxNQUFNLEVBQVMsNkJBQTZCO0lBQzVDLFdBQVcsRUFBSSx3QkFBd0I7SUFDdkMsT0FBTyxFQUFRLHdCQUF3QjtJQUN2QyxVQUFVLEVBQUssb0JBQW9CO0lBQ25DLFFBQVEsRUFBTyxtQkFBbUI7Q0FDbkMsQ0FBQztBQUVGOzs7R0FHRztBQUNILFNBQWdCLGtCQUFrQixDQUFDLE9BQWlCO0lBQ2xELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkQsS0FBSyxNQUFNLE9BQU8sSUFBSSwyQkFBbUIsRUFBRSxDQUFDO1FBQzFDLElBQUksVUFBVSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLFFBQWdCLEVBQUUsV0FBc0I7SUFDdEUsMkJBQTJCO0lBQzNCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFNUMsMkRBQTJEO0lBQzNELE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVB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QUMsQ0FBQyxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDekYsSUFBSSxRQUFRO1FBQUUsT0FBTyxRQUFRLENBQUM7SUFFOUIsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLFFBQWE7SUFDM0MsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFVLENBQUM7SUFDL0MsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQztBQUM1RCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsU0FBZ0IsZUFBZSxDQUM3QixLQUFhLEVBQ2IsUUFBYTtJQUViLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdkMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLE9BQU87WUFDTCxLQUFLLEVBQUUsaUJBQWlCLENBQ3RCLG9CQUFvQixLQUFLLHVCQUF1QixTQUFTLEVBQUUsQ0FDNUQ7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUNELE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUb29sIEhlbHBlciBGdW5jdGlvbnNcbiAqL1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgb3MgZnJvbSAnb3MnO1xuXG4vKipcbiAqIEJsb2NrZWQgV1AtQ0xJIGNvbW1hbmRzIHRoYXQgY291bGQgYWxsb3cgYXJiaXRyYXJ5IGNvZGUgZXhlY3V0aW9uXG4gKi9cbmV4cG9ydCBjb25zdCBCTE9DS0VEX1dQX0NPTU1BTkRTID0gW1xuICAnZXZhbCcsICAgICAgICAvLyBFeGVjdXRlIGFyYml0cmFyeSBQSFAgY29kZVxuICAnZXZhbC1maWxlJywgICAvLyBFeGVjdXRlIFBIUCBmcm9tIGZpbGVcbiAgJ3NoZWxsJywgICAgICAgLy8gSW50ZXJhY3RpdmUgUEhQIHNoZWxsXG4gICdkYiBxdWVyeScsICAgIC8vIFJhdyBTUUwgZXhlY3V0aW9uXG4gICdkYiBjbGknLCAgICAgIC8vIE15U1FMIENMSSBhY2Nlc3Ncbl07XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBXUC1DTEkgY29tbWFuZCBpcyBibG9ja2VkIGZvciBzZWN1cml0eSByZWFzb25zXG4gKiBSZXR1cm5zIHRoZSBibG9ja2VkIGNvbW1hbmQgbmFtZSBpZiBibG9ja2VkLCBudWxsIGlmIHNhZmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQmxvY2tlZFdwQ29tbWFuZChjb21tYW5kOiBzdHJpbmdbXSk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBjb21tYW5kU3RyID0gY29tbWFuZC5qb2luKCcgJykudG9Mb3dlckNhc2UoKTtcbiAgZm9yIChjb25zdCBibG9ja2VkIG9mIEJMT0NLRURfV1BfQ09NTUFORFMpIHtcbiAgICBpZiAoY29tbWFuZFN0ci5pbmNsdWRlcyhibG9ja2VkKSkge1xuICAgICAgcmV0dXJuIGJsb2NrZWQ7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBmaWxlIHBhdGggaXMgc2FmZSAobm8gcGF0aCB0cmF2ZXJzYWwpXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdGggaXMgd2l0aGluIGFsbG93ZWQgZGlyZWN0b3JpZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWRGaWxlUGF0aChmaWxlUGF0aDogc3RyaW5nLCBhbGxvd2VkRGlycz86IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIC8vIFJlc29sdmUgdG8gYWJzb2x1dGUgcGF0aFxuICBjb25zdCByZXNvbHZlZFBhdGggPSBwYXRoLnJlc29sdmUoZmlsZVBhdGgpO1xuXG4gIC8vIERlZmF1bHQgYWxsb3dlZCBkaXJlY3RvcmllczogaG9tZSwgdG1wLCBhbmQgY29tbW9uIHBhdGhzXG4gIGNvbnN0IGhvbWVEaXIgPSBvcy5ob21lZGlyKCk7XG4gIGNvbnN0IGRlZmF1bHRBbGxvd2VkID0gW1xuICAgIGhvbWVEaXIsXG4gICAgb3MudG1wZGlyKCksXG4gICAgJy90bXAnLFxuICAgICcvdmFyL3RtcCcsXG4gIF07XG5cbiAgY29uc3QgYWxsb3dlZERpcmVjdG9yaWVzID0gYWxsb3dlZERpcnMgfHwgZGVmYXVsdEFsbG93ZWQ7XG5cbiAgLy8gQ2hlY2sgaWYgcGF0aCBpcyB3aXRoaW4gYW55IGFsbG93ZWQgZGlyZWN0b3J5XG4gIGZvciAoY29uc3QgYWxsb3dlZERpciBvZiBhbGxvd2VkRGlyZWN0b3JpZXMpIHtcbiAgICBjb25zdCByZXNvbHZlZEFsbG93ZWQgPSBwYXRoLnJlc29sdmUoYWxsb3dlZERpcik7XG4gICAgaWYgKHJlc29sdmVkUGF0aC5zdGFydHNXaXRoKHJlc29sdmVkQWxsb3dlZCArIHBhdGguc2VwKSB8fCByZXNvbHZlZFBhdGggPT09IHJlc29sdmVkQWxsb3dlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgYSBTUUwgZmlsZSBwYXRoIGlzIHNhZmVcbiAqIE11c3QgZW5kIGluIC5zcWwgYW5kIGJlIGluIGFuIGFsbG93ZWQgZGlyZWN0b3J5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkU3FsUGF0aChzcWxQYXRoOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2Ygc3FsUGF0aCAhPT0gJ3N0cmluZycgfHwgIXNxbFBhdGgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBNdXN0IGVuZCBpbiAuc3FsXG4gIGlmICghc3FsUGF0aC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcuc3FsJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBNdXN0IGJlIGluIGFuIGFsbG93ZWQgZGlyZWN0b3J5XG4gIHJldHVybiBpc1ZhbGlkRmlsZVBhdGgoc3FsUGF0aCk7XG59XG5cbi8qKlxuICogTUNQIFRvb2wgUmVzdWx0IHR5cGUgZm9yIGVycm9yIHJlc3BvbnNlc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE1jcEVycm9yUmVzdWx0IHtcbiAgY29udGVudDogQXJyYXk8eyB0eXBlOiAndGV4dCc7IHRleHQ6IHN0cmluZyB9PjtcbiAgaXNFcnJvcjogdHJ1ZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBzdGFuZGFyZGl6ZWQgZXJyb3IgcmVzdWx0IGZvciBNQ1AgdG9vbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUVycm9yUmVzdWx0KG1lc3NhZ2U6IHN0cmluZyk6IE1jcEVycm9yUmVzdWx0IHtcbiAgcmV0dXJuIHtcbiAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IG1lc3NhZ2UgfV0sXG4gICAgaXNFcnJvcjogdHJ1ZSxcbiAgfTtcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZSB0aGF0IGEgcmVxdWlyZWQgcGFyYW1ldGVyIGlzIHByZXNlbnRcbiAqIFJldHVybnMgYW4gZXJyb3IgcmVzdWx0IGlmIG1pc3NpbmcsIG51bGwgaWYgdmFsaWRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUmVxdWlyZWRQYXJhbShcbiAgdmFsdWU6IHVua25vd24sXG4gIHBhcmFtTmFtZTogc3RyaW5nXG4pOiBNY3BFcnJvclJlc3VsdCB8IG51bGwge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVycm9yUmVzdWx0KGBFcnJvcjogJHtwYXJhbU5hbWV9IHBhcmFtZXRlciBpcyByZXF1aXJlZGApO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIEZpbmQgYSBzaXRlIGJ5IG5hbWUgb3IgSURcbiAqIFN1cHBvcnRzIHBhcnRpYWwgbmFtZSBtYXRjaGluZyAoY2FzZS1pbnNlbnNpdGl2ZSlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRTaXRlKHF1ZXJ5OiBzdHJpbmcsIHNpdGVEYXRhOiBhbnkpOiBhbnkgfCB1bmRlZmluZWQge1xuICBjb25zdCBzaXRlc01hcCA9IHNpdGVEYXRhLmdldFNpdGVzKCk7XG4gIGNvbnN0IHNpdGVzID0gT2JqZWN0LnZhbHVlcyhzaXRlc01hcCkgYXMgYW55W107XG5cbiAgLy8gVHJ5IGV4YWN0IElEIG1hdGNoIGZpcnN0XG4gIGNvbnN0IGJ5SWQgPSBzaXRlcy5maW5kKChzOiBhbnkpID0+IHMuaWQgPT09IHF1ZXJ5KTtcbiAgaWYgKGJ5SWQpIHJldHVybiBieUlkO1xuXG4gIC8vIFRyeSBleGFjdCBuYW1lIG1hdGNoIChjYXNlLWluc2Vuc2l0aXZlKVxuICBjb25zdCBieUV4YWN0TmFtZSA9IHNpdGVzLmZpbmQoKHM6IGFueSkgPT4gcy5uYW1lLnRvTG93ZXJDYXNlKCkgPT09IHF1ZXJ5LnRvTG93ZXJDYXNlKCkpO1xuICBpZiAoYnlFeGFjdE5hbWUpIHJldHVybiBieUV4YWN0TmFtZTtcblxuICAvLyBUcnkgcGFydGlhbCBuYW1lIG1hdGNoIChjYXNlLWluc2Vuc2l0aXZlKVxuICBjb25zdCBieVBhcnRpYWxOYW1lID0gc2l0ZXMuZmluZCgoczogYW55KSA9PiBzLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeS50b0xvd2VyQ2FzZSgpKSk7XG4gIGlmIChieVBhcnRpYWxOYW1lKSByZXR1cm4gYnlQYXJ0aWFsTmFtZTtcblxuICAvLyBUcnkgZG9tYWluIG1hdGNoXG4gIGNvbnN0IGJ5RG9tYWluID0gc2l0ZXMuZmluZCgoczogYW55KSA9PiBzLmRvbWFpbj8udG9Mb3dlckNhc2UoKSA9PT0gcXVlcnkudG9Mb3dlckNhc2UoKSk7XG4gIGlmIChieURvbWFpbikgcmV0dXJuIGJ5RG9tYWluO1xuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogR2V0IGFsbCBzaXRlIG5hbWVzIGFzIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWxsU2l0ZU5hbWVzKHNpdGVEYXRhOiBhbnkpOiBzdHJpbmcge1xuICBjb25zdCBzaXRlc01hcCA9IHNpdGVEYXRhLmdldFNpdGVzKCk7XG4gIGNvbnN0IHNpdGVzID0gT2JqZWN0LnZhbHVlcyhzaXRlc01hcCkgYXMgYW55W107XG4gIHJldHVybiBzaXRlcy5tYXAoKHM6IGFueSkgPT4gcy5uYW1lKS5qb2luKCcsICcpIHx8ICdub25lJztcbn1cblxuLyoqXG4gKiBGaW5kIGEgc2l0ZSBvciByZXR1cm4gYW4gZXJyb3IgcmVzdWx0XG4gKiBDb21iaW5lcyBzaXRlIGxvb2t1cCB3aXRoIHN0YW5kYXJkaXplZCBlcnJvciBoYW5kbGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZFNpdGVPckVycm9yKFxuICBxdWVyeTogc3RyaW5nLFxuICBzaXRlRGF0YTogYW55XG4pOiB7IHNpdGU6IGFueSB9IHwgeyBlcnJvcjogTWNwRXJyb3JSZXN1bHQgfSB7XG4gIGNvbnN0IHNpdGUgPSBmaW5kU2l0ZShxdWVyeSwgc2l0ZURhdGEpO1xuICBpZiAoIXNpdGUpIHtcbiAgICBjb25zdCBzaXRlTmFtZXMgPSBnZXRBbGxTaXRlTmFtZXMoc2l0ZURhdGEpO1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjogY3JlYXRlRXJyb3JSZXN1bHQoXG4gICAgICAgIGBTaXRlIG5vdCBmb3VuZDogXCIke3F1ZXJ5fVwiLiBBdmFpbGFibGUgc2l0ZXM6ICR7c2l0ZU5hbWVzfWBcbiAgICAgICksXG4gICAgfTtcbiAgfVxuICByZXR1cm4geyBzaXRlIH07XG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ /**
2
+ * import_database Tool
3
+ * Import SQL file into site database using WP-CLI
4
+ */
5
+ import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
6
+ export declare const importDatabaseDefinition: McpToolDefinition;
7
+ export declare function importDatabase(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;