@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,109 @@
1
+ "use strict";
2
+ /**
3
+ * import_database Tool
4
+ * Import SQL file into site database using WP-CLI
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.importDatabaseDefinition = void 0;
41
+ exports.importDatabase = importDatabase;
42
+ const helpers_1 = require("./helpers");
43
+ const fs = __importStar(require("fs"));
44
+ exports.importDatabaseDefinition = {
45
+ name: 'import_database',
46
+ description: 'Import a SQL file into a site database',
47
+ inputSchema: {
48
+ type: 'object',
49
+ properties: {
50
+ site: {
51
+ type: 'string',
52
+ description: 'Site name or ID',
53
+ },
54
+ sqlPath: {
55
+ type: 'string',
56
+ description: 'Path to the SQL file to import',
57
+ },
58
+ },
59
+ required: ['site', 'sqlPath'],
60
+ },
61
+ };
62
+ async function importDatabase(args, services) {
63
+ const { site: siteQuery, sqlPath } = args;
64
+ // Validate required parameters
65
+ const siteError = (0, helpers_1.validateRequiredParam)(siteQuery, 'site');
66
+ if (siteError)
67
+ return siteError;
68
+ const pathError = (0, helpers_1.validateRequiredParam)(sqlPath, 'sqlPath');
69
+ if (pathError)
70
+ return pathError;
71
+ // Security: Validate path is safe (no path traversal attacks)
72
+ if (!(0, helpers_1.isValidSqlPath)(sqlPath)) {
73
+ return (0, helpers_1.createErrorResult)('Error: Invalid SQL file path. Path must end in .sql and be within allowed directories (home, tmp).');
74
+ }
75
+ // Verify file exists
76
+ if (!fs.existsSync(sqlPath)) {
77
+ return (0, helpers_1.createErrorResult)(`SQL file not found: ${sqlPath}`);
78
+ }
79
+ // Find site or return error
80
+ const siteResult = (0, helpers_1.findSiteOrError)(siteQuery, services.siteData);
81
+ if ('error' in siteResult)
82
+ return siteResult.error;
83
+ const { site } = siteResult;
84
+ try {
85
+ // Run WP-CLI db import
86
+ const result = await services.wpCli.run(site, ['db', 'import', sqlPath]);
87
+ if (result === null) {
88
+ return {
89
+ content: [{ type: 'text', text: `Failed to import database for "${site.name}"` }],
90
+ isError: true,
91
+ };
92
+ }
93
+ return {
94
+ content: [
95
+ {
96
+ type: 'text',
97
+ text: `Successfully imported "${sqlPath}" into database for "${site.name}"`,
98
+ },
99
+ ],
100
+ };
101
+ }
102
+ catch (error) {
103
+ return {
104
+ content: [{ type: 'text', text: `Failed to import database: ${error.message}` }],
105
+ isError: true,
106
+ };
107
+ }
108
+ }
109
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0RGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbWFpbi9tY3AvdG9vbHMvaW1wb3J0RGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBOEJILHdDQXVEQztBQWxGRCx1Q0FBc0c7QUFDdEcsdUNBQXlCO0FBRVosUUFBQSx3QkFBd0IsR0FBc0I7SUFDekQsSUFBSSxFQUFFLGlCQUFpQjtJQUN2QixXQUFXLEVBQUUsd0NBQXdDO0lBQ3JELFdBQVcsRUFBRTtRQUNYLElBQUksRUFBRSxRQUFRO1FBQ2QsVUFBVSxFQUFFO1lBQ1YsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSxpQkFBaUI7YUFDL0I7WUFDRCxPQUFPLEVBQUU7Z0JBQ1AsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsV0FBVyxFQUFFLGdDQUFnQzthQUM5QztTQUNGO1FBQ0QsUUFBUSxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQztLQUM5QjtDQUNGLENBQUM7QUFPSyxLQUFLLFVBQVUsY0FBYyxDQUNsQyxJQUE2QixFQUM3QixRQUF1QjtJQUV2QixNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxJQUFxQyxDQUFDO0lBRTNFLCtCQUErQjtJQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFBLCtCQUFxQixFQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzRCxJQUFJLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUVoQyxNQUFNLFNBQVMsR0FBRyxJQUFBLCtCQUFxQixFQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUM1RCxJQUFJLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUVoQyw4REFBOEQ7SUFDOUQsSUFBSSxDQUFDLElBQUEsd0JBQWMsRUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzdCLE9BQU8sSUFBQSwyQkFBaUIsRUFDdEIsb0dBQW9HLENBQ3JHLENBQUM7SUFDSixDQUFDO0lBRUQscUJBQXFCO0lBQ3JCLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFDNUIsT0FBTyxJQUFBLDJCQUFpQixFQUFDLHVCQUF1QixPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRCw0QkFBNEI7SUFDNUIsTUFBTSxVQUFVLEdBQUcsSUFBQSx5QkFBZSxFQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDakUsSUFBSSxPQUFPLElBQUksVUFBVTtRQUFFLE9BQU8sVUFBVSxDQUFDLEtBQUssQ0FBQztJQUNuRCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsVUFBVSxDQUFDO0lBRTVCLElBQUksQ0FBQztRQUNILHVCQUF1QjtRQUN2QixNQUFNLE1BQU0sR0FBRyxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUV6RSxJQUFJLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNwQixPQUFPO2dCQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsa0NBQWtDLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNqRixPQUFPLEVBQUUsSUFBSTthQUNkLENBQUM7UUFDSixDQUFDO1FBRUQsT0FBTztZQUNMLE9BQU8sRUFBRTtnQkFDUDtvQkFDRSxJQUFJLEVBQUUsTUFBTTtvQkFDWixJQUFJLEVBQUUsMEJBQTBCLE9BQU8sd0JBQXdCLElBQUksQ0FBQyxJQUFJLEdBQUc7aUJBQzVFO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsOEJBQThCLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ2hGLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBpbXBvcnRfZGF0YWJhc2UgVG9vbFxuICogSW1wb3J0IFNRTCBmaWxlIGludG8gc2l0ZSBkYXRhYmFzZSB1c2luZyBXUC1DTElcbiAqL1xuXG5pbXBvcnQgeyBNY3BUb29sRGVmaW5pdGlvbiwgTWNwVG9vbFJlc3VsdCwgTG9jYWxTZXJ2aWNlcyB9IGZyb20gJy4uLy4uLy4uL2NvbW1vbi90eXBlcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZVJlcXVpcmVkUGFyYW0sIGZpbmRTaXRlT3JFcnJvciwgaXNWYWxpZFNxbFBhdGgsIGNyZWF0ZUVycm9yUmVzdWx0IH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcblxuZXhwb3J0IGNvbnN0IGltcG9ydERhdGFiYXNlRGVmaW5pdGlvbjogTWNwVG9vbERlZmluaXRpb24gPSB7XG4gIG5hbWU6ICdpbXBvcnRfZGF0YWJhc2UnLFxuICBkZXNjcmlwdGlvbjogJ0ltcG9ydCBhIFNRTCBmaWxlIGludG8gYSBzaXRlIGRhdGFiYXNlJyxcbiAgaW5wdXRTY2hlbWE6IHtcbiAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICBzaXRlOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1NpdGUgbmFtZSBvciBJRCcsXG4gICAgICB9LFxuICAgICAgc3FsUGF0aDoge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIHRoZSBTUUwgZmlsZSB0byBpbXBvcnQnLFxuICAgICAgfSxcbiAgICB9LFxuICAgIHJlcXVpcmVkOiBbJ3NpdGUnLCAnc3FsUGF0aCddLFxuICB9LFxufTtcblxuaW50ZXJmYWNlIEltcG9ydERhdGFiYXNlQXJncyB7XG4gIHNpdGU6IHN0cmluZztcbiAgc3FsUGF0aDogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0RGF0YWJhc2UoXG4gIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzZXJ2aWNlczogTG9jYWxTZXJ2aWNlc1xuKTogUHJvbWlzZTxNY3BUb29sUmVzdWx0PiB7XG4gIGNvbnN0IHsgc2l0ZTogc2l0ZVF1ZXJ5LCBzcWxQYXRoIH0gPSBhcmdzIGFzIHVua25vd24gYXMgSW1wb3J0RGF0YWJhc2VBcmdzO1xuXG4gIC8vIFZhbGlkYXRlIHJlcXVpcmVkIHBhcmFtZXRlcnNcbiAgY29uc3Qgc2l0ZUVycm9yID0gdmFsaWRhdGVSZXF1aXJlZFBhcmFtKHNpdGVRdWVyeSwgJ3NpdGUnKTtcbiAgaWYgKHNpdGVFcnJvcikgcmV0dXJuIHNpdGVFcnJvcjtcblxuICBjb25zdCBwYXRoRXJyb3IgPSB2YWxpZGF0ZVJlcXVpcmVkUGFyYW0oc3FsUGF0aCwgJ3NxbFBhdGgnKTtcbiAgaWYgKHBhdGhFcnJvcikgcmV0dXJuIHBhdGhFcnJvcjtcblxuICAvLyBTZWN1cml0eTogVmFsaWRhdGUgcGF0aCBpcyBzYWZlIChubyBwYXRoIHRyYXZlcnNhbCBhdHRhY2tzKVxuICBpZiAoIWlzVmFsaWRTcWxQYXRoKHNxbFBhdGgpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVycm9yUmVzdWx0KFxuICAgICAgJ0Vycm9yOiBJbnZhbGlkIFNRTCBmaWxlIHBhdGguIFBhdGggbXVzdCBlbmQgaW4gLnNxbCBhbmQgYmUgd2l0aGluIGFsbG93ZWQgZGlyZWN0b3JpZXMgKGhvbWUsIHRtcCkuJ1xuICAgICk7XG4gIH1cblxuICAvLyBWZXJpZnkgZmlsZSBleGlzdHNcbiAgaWYgKCFmcy5leGlzdHNTeW5jKHNxbFBhdGgpKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUVycm9yUmVzdWx0KGBTUUwgZmlsZSBub3QgZm91bmQ6ICR7c3FsUGF0aH1gKTtcbiAgfVxuXG4gIC8vIEZpbmQgc2l0ZSBvciByZXR1cm4gZXJyb3JcbiAgY29uc3Qgc2l0ZVJlc3VsdCA9IGZpbmRTaXRlT3JFcnJvcihzaXRlUXVlcnksIHNlcnZpY2VzLnNpdGVEYXRhKTtcbiAgaWYgKCdlcnJvcicgaW4gc2l0ZVJlc3VsdCkgcmV0dXJuIHNpdGVSZXN1bHQuZXJyb3I7XG4gIGNvbnN0IHsgc2l0ZSB9ID0gc2l0ZVJlc3VsdDtcblxuICB0cnkge1xuICAgIC8vIFJ1biBXUC1DTEkgZGIgaW1wb3J0XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZXMud3BDbGkucnVuKHNpdGUsIFsnZGInLCAnaW1wb3J0Jywgc3FsUGF0aF0pO1xuXG4gICAgaWYgKHJlc3VsdCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3sgdHlwZTogJ3RleHQnLCB0ZXh0OiBgRmFpbGVkIHRvIGltcG9ydCBkYXRhYmFzZSBmb3IgXCIke3NpdGUubmFtZX1cImAgfV0sXG4gICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgdGV4dDogYFN1Y2Nlc3NmdWxseSBpbXBvcnRlZCBcIiR7c3FsUGF0aH1cIiBpbnRvIGRhdGFiYXNlIGZvciBcIiR7c2l0ZS5uYW1lfVwiYCxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IGBGYWlsZWQgdG8gaW1wb3J0IGRhdGFiYXNlOiAke2Vycm9yLm1lc3NhZ2V9YCB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,7 @@
1
+ /**
2
+ * import_site Tool
3
+ * Import a site from a zip file
4
+ */
5
+ import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
6
+ export declare const importSiteDefinition: McpToolDefinition;
7
+ export declare function importSite(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * import_site Tool
4
+ * Import a site from 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.importSiteDefinition = void 0;
41
+ exports.importSite = importSite;
42
+ const helpers_1 = require("./helpers");
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ exports.importSiteDefinition = {
46
+ name: 'import_site',
47
+ description: 'Import a WordPress site from a zip file (Local export, generic archive, or backup)',
48
+ inputSchema: {
49
+ type: 'object',
50
+ properties: {
51
+ zipPath: {
52
+ type: 'string',
53
+ description: 'Path to the zip file to import',
54
+ },
55
+ siteName: {
56
+ type: 'string',
57
+ description: 'Name for the imported site (optional, derived from zip if not provided)',
58
+ },
59
+ },
60
+ required: ['zipPath'],
61
+ },
62
+ };
63
+ async function importSite(args, services) {
64
+ const { zipPath, siteName } = args;
65
+ if (!zipPath) {
66
+ return {
67
+ content: [{ type: 'text', text: 'Error: zipPath parameter is required' }],
68
+ isError: true,
69
+ };
70
+ }
71
+ // Security: Validate path is safe (no path traversal attacks)
72
+ if (!(0, helpers_1.isValidFilePath)(zipPath)) {
73
+ return {
74
+ content: [
75
+ {
76
+ type: 'text',
77
+ text: 'Error: Invalid zip file path. Path must be within allowed directories (home, tmp).',
78
+ },
79
+ ],
80
+ isError: true,
81
+ };
82
+ }
83
+ try {
84
+ // Verify file exists
85
+ if (!fs.existsSync(zipPath)) {
86
+ return {
87
+ content: [{ type: 'text', text: `Zip file not found: ${zipPath}` }],
88
+ isError: true,
89
+ };
90
+ }
91
+ // Verify it's a zip file
92
+ if (!zipPath.toLowerCase().endsWith('.zip')) {
93
+ return {
94
+ content: [{ type: 'text', text: 'Error: File must be a .zip archive' }],
95
+ isError: true,
96
+ };
97
+ }
98
+ // Check if importSite service exists
99
+ if (!services.importSite) {
100
+ return {
101
+ content: [{ type: 'text', text: 'Import site service not available' }],
102
+ isError: true,
103
+ };
104
+ }
105
+ // Derive site name from zip filename if not provided
106
+ const derivedName = siteName || path.basename(zipPath, '.zip').replace(/[^a-zA-Z0-9-_]/g, '-');
107
+ // Import the site
108
+ // The import service expects settings object
109
+ const importSettings = {
110
+ importType: 'localExport', // Default to Local export format
111
+ zipPath: zipPath,
112
+ siteName: derivedName,
113
+ };
114
+ const result = await services.importSite.run(importSettings);
115
+ if (!result) {
116
+ return {
117
+ content: [{ type: 'text', text: 'Import completed but no result returned' }],
118
+ isError: true,
119
+ };
120
+ }
121
+ return {
122
+ content: [
123
+ {
124
+ type: 'text',
125
+ text: `Successfully imported site "${derivedName}" from ${path.basename(zipPath)}. Site ID: ${result.id || 'unknown'}`,
126
+ },
127
+ ],
128
+ };
129
+ }
130
+ catch (error) {
131
+ // Provide helpful error messages
132
+ if (error.message?.includes('not a valid')) {
133
+ return {
134
+ content: [
135
+ {
136
+ type: 'text',
137
+ text: `The zip file does not appear to be a valid Local export or WordPress backup. Error: ${error.message}`,
138
+ },
139
+ ],
140
+ isError: true,
141
+ };
142
+ }
143
+ return {
144
+ content: [{ type: 'text', text: `Failed to import site: ${error.message}` }],
145
+ isError: true,
146
+ };
147
+ }
148
+ }
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0U2l0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9tYWluL21jcC90b29scy9pbXBvcnRTaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7O0dBR0c7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQStCSCxnQ0FpR0M7QUE3SEQsdUNBQTRDO0FBQzVDLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFFaEIsUUFBQSxvQkFBb0IsR0FBc0I7SUFDckQsSUFBSSxFQUFFLGFBQWE7SUFDbkIsV0FBVyxFQUFFLG9GQUFvRjtJQUNqRyxXQUFXLEVBQUU7UUFDWCxJQUFJLEVBQUUsUUFBUTtRQUNkLFVBQVUsRUFBRTtZQUNWLE9BQU8sRUFBRTtnQkFDUCxJQUFJLEVBQUUsUUFBUTtnQkFDZCxXQUFXLEVBQUUsZ0NBQWdDO2FBQzlDO1lBQ0QsUUFBUSxFQUFFO2dCQUNSLElBQUksRUFBRSxRQUFRO2dCQUNkLFdBQVcsRUFBRSx5RUFBeUU7YUFDdkY7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLFNBQVMsQ0FBQztLQUN0QjtDQUNGLENBQUM7QUFPSyxLQUFLLFVBQVUsVUFBVSxDQUM5QixJQUE2QixFQUM3QixRQUF1QjtJQUV2QixNQUFNLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQWlDLENBQUM7SUFFaEUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2IsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsc0NBQXNDLEVBQUUsQ0FBQztZQUN6RSxPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUM7SUFDSixDQUFDO0lBRUQsOERBQThEO0lBQzlELElBQUksQ0FBQyxJQUFBLHlCQUFlLEVBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUM5QixPQUFPO1lBQ0wsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxNQUFN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IEltcG9ydCBhIHNpdGUgZnJvbSBhIHppcCBmaWxlXG4gKi9cblxuaW1wb3J0IHsgTWNwVG9vbERlZmluaXRpb24sIE1jcFRvb2xSZXN1bHQsIExvY2FsU2VydmljZXMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgaXNWYWxpZEZpbGVQYXRoIH0gZnJvbSAnLi9oZWxwZXJzJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmV4cG9ydCBjb25zdCBpbXBvcnRTaXRlRGVmaW5pdGlvbjogTWNwVG9vbERlZmluaXRpb24gPSB7XG4gIG5hbWU6ICdpbXBvcnRfc2l0ZScsXG4gIGRlc2NyaXB0aW9uOiAnSW1wb3J0IGEgV29yZFByZXNzIHNpdGUgZnJvbSBhIHppcCBmaWxlIChMb2NhbCBleHBvcnQsIGdlbmVyaWMgYXJjaGl2ZSwgb3IgYmFja3VwKScsXG4gIGlucHV0U2NoZW1hOiB7XG4gICAgdHlwZTogJ29iamVjdCcsXG4gICAgcHJvcGVydGllczoge1xuICAgICAgemlwUGF0aDoge1xuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIHRoZSB6aXAgZmlsZSB0byBpbXBvcnQnLFxuICAgICAgfSxcbiAgICAgIHNpdGVOYW1lOiB7XG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ05hbWUgZm9yIHRoZSBpbXBvcnRlZCBzaXRlIChvcHRpb25hbCwgZGVyaXZlZCBmcm9tIHppcCBpZiBub3QgcHJvdmlkZWQpJyxcbiAgICAgIH0sXG4gICAgfSxcbiAgICByZXF1aXJlZDogWyd6aXBQYXRoJ10sXG4gIH0sXG59O1xuXG5pbnRlcmZhY2UgSW1wb3J0U2l0ZUFyZ3Mge1xuICB6aXBQYXRoOiBzdHJpbmc7XG4gIHNpdGVOYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW1wb3J0U2l0ZShcbiAgYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNlcnZpY2VzOiBMb2NhbFNlcnZpY2VzXG4pOiBQcm9taXNlPE1jcFRvb2xSZXN1bHQ+IHtcbiAgY29uc3QgeyB6aXBQYXRoLCBzaXRlTmFtZSB9ID0gYXJncyBhcyB1bmtub3duIGFzIEltcG9ydFNpdGVBcmdzO1xuXG4gIGlmICghemlwUGF0aCkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6ICdFcnJvcjogemlwUGF0aCBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQnIH1dLFxuICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICB9O1xuICB9XG5cbiAgLy8gU2VjdXJpdHk6IFZhbGlkYXRlIHBhdGggaXMgc2FmZSAobm8gcGF0aCB0cmF2ZXJzYWwgYXR0YWNrcylcbiAgaWYgKCFpc1ZhbGlkRmlsZVBhdGgoemlwUGF0aCkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgIHRleHQ6ICdFcnJvcjogSW52YWxpZCB6aXAgZmlsZSBwYXRoLiBQYXRoIG11c3QgYmUgd2l0aGluIGFsbG93ZWQgZGlyZWN0b3JpZXMgKGhvbWUsIHRtcCkuJyxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBpc0Vycm9yOiB0cnVlLFxuICAgIH07XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFZlcmlmeSBmaWxlIGV4aXN0c1xuICAgIGlmICghZnMuZXhpc3RzU3luYyh6aXBQYXRoKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3sgdHlwZTogJ3RleHQnLCB0ZXh0OiBgWmlwIGZpbGUgbm90IGZvdW5kOiAke3ppcFBhdGh9YCB9XSxcbiAgICAgICAgaXNFcnJvcjogdHJ1ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gVmVyaWZ5IGl0J3MgYSB6aXAgZmlsZVxuICAgIGlmICghemlwUGF0aC50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCcuemlwJykpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogJ0Vycm9yOiBGaWxlIG11c3QgYmUgYSAuemlwIGFyY2hpdmUnIH1dLFxuICAgICAgICBpc0Vycm9yOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiBpbXBvcnRTaXRlIHNlcnZpY2UgZXhpc3RzXG4gICAgaWYgKCFzZXJ2aWNlcy5pbXBvcnRTaXRlKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6ICdJbXBvcnQgc2l0ZSBzZXJ2aWNlIG5vdCBhdmFpbGFibGUnIH1dLFxuICAgICAgICBpc0Vycm9yOiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBEZXJpdmUgc2l0ZSBuYW1lIGZyb20gemlwIGZpbGVuYW1lIGlmIG5vdCBwcm92aWRlZFxuICAgIGNvbnN0IGRlcml2ZWROYW1lID0gc2l0ZU5hbWUgfHwgcGF0aC5iYXNlbmFtZSh6aXBQYXRoLCAnLnppcCcpLnJlcGxhY2UoL1teYS16QS1aMC05LV9dL2csICctJyk7XG5cbiAgICAvLyBJbXBvcnQgdGhlIHNpdGVcbiAgICAvLyBUaGUgaW1wb3J0IHNlcnZpY2UgZXhwZWN0cyBzZXR0aW5ncyBvYmplY3RcbiAgICBjb25zdCBpbXBvcnRTZXR0aW5ncyA9IHtcbiAgICAgIGltcG9ydFR5cGU6ICdsb2NhbEV4cG9ydCcsIC8vIERlZmF1bHQgdG8gTG9jYWwgZXhwb3J0IGZvcm1hdFxuICAgICAgemlwUGF0aDogemlwUGF0aCxcbiAgICAgIHNpdGVOYW1lOiBkZXJpdmVkTmFtZSxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc2VydmljZXMuaW1wb3J0U2l0ZS5ydW4oaW1wb3J0U2V0dGluZ3MpO1xuXG4gICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbnRlbnQ6IFt7IHR5cGU6ICd0ZXh0JywgdGV4dDogJ0ltcG9ydCBjb21wbGV0ZWQgYnV0IG5vIHJlc3VsdCByZXR1cm5lZCcgfV0sXG4gICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgICAgdGV4dDogYFN1Y2Nlc3NmdWxseSBpbXBvcnRlZCBzaXRlIFwiJHtkZXJpdmVkTmFtZX1cIiBmcm9tICR7cGF0aC5iYXNlbmFtZSh6aXBQYXRoKX0uIFNpdGUgSUQ6ICR7cmVzdWx0LmlkIHx8ICd1bmtub3duJ31gLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgLy8gUHJvdmlkZSBoZWxwZnVsIGVycm9yIG1lc3NhZ2VzXG4gICAgaWYgKGVycm9yLm1lc3NhZ2U/LmluY2x1ZGVzKCdub3QgYSB2YWxpZCcpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgICAgICAgdGV4dDogYFRoZSB6aXAgZmlsZSBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgYSB2YWxpZCBMb2NhbCBleHBvcnQgb3IgV29yZFByZXNzIGJhY2t1cC4gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogJ3RleHQnLCB0ZXh0OiBgRmFpbGVkIHRvIGltcG9ydCBzaXRlOiAke2Vycm9yLm1lc3NhZ2V9YCB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,26 @@
1
+ /**
2
+ * MCP Tools Registry
3
+ * Central registry for all available MCP tools
4
+ */
5
+ import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
6
+ export type ToolHandler = (args: Record<string, unknown>, services: LocalServices) => Promise<McpToolResult>;
7
+ /**
8
+ * Register all available tools
9
+ */
10
+ export declare function registerTools(): void;
11
+ /**
12
+ * Get all tool definitions (for MCP tools/list response)
13
+ */
14
+ export declare function getToolDefinitions(): McpToolDefinition[];
15
+ /**
16
+ * Get tool names
17
+ */
18
+ export declare function getToolNames(): string[];
19
+ /**
20
+ * Execute a tool by name
21
+ */
22
+ export declare function executeTool(name: string, args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
23
+ /**
24
+ * Check if a tool exists
25
+ */
26
+ export declare function hasTool(name: string): boolean;
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ /**
3
+ * MCP Tools Registry
4
+ * Central registry for all available MCP tools
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.registerTools = registerTools;
8
+ exports.getToolDefinitions = getToolDefinitions;
9
+ exports.getToolNames = getToolNames;
10
+ exports.executeTool = executeTool;
11
+ exports.hasTool = hasTool;
12
+ const listSites_1 = require("./listSites");
13
+ const startSite_1 = require("./startSite");
14
+ const stopSite_1 = require("./stopSite");
15
+ const restartSite_1 = require("./restartSite");
16
+ const wpCli_1 = require("./wpCli");
17
+ const getSite_1 = require("./getSite");
18
+ const createSite_1 = require("./createSite");
19
+ const deleteSite_1 = require("./deleteSite");
20
+ const getLocalInfo_1 = require("./getLocalInfo");
21
+ const openSite_1 = require("./openSite");
22
+ const cloneSite_1 = require("./cloneSite");
23
+ const exportSite_1 = require("./exportSite");
24
+ const listBlueprints_1 = require("./listBlueprints");
25
+ const saveBlueprint_1 = require("./saveBlueprint");
26
+ // Phase 8: WordPress Development Tools
27
+ const exportDatabase_1 = require("./exportDatabase");
28
+ const importDatabase_1 = require("./importDatabase");
29
+ const openAdminer_1 = require("./openAdminer");
30
+ const trustSsl_1 = require("./trustSsl");
31
+ const renameSite_1 = require("./renameSite");
32
+ const changePhpVersion_1 = require("./changePhpVersion");
33
+ const importSite_1 = require("./importSite");
34
+ // Phase 9: Site Configuration & Dev Tools
35
+ const toggleXdebug_1 = require("./toggleXdebug");
36
+ const getSiteLogs_1 = require("./getSiteLogs");
37
+ const listServices_1 = require("./listServices");
38
+ const tools = new Map();
39
+ /**
40
+ * Register all available tools
41
+ */
42
+ function registerTools() {
43
+ // Core site management
44
+ tools.set('list_sites', { definition: listSites_1.listSitesDefinition, handler: listSites_1.listSites });
45
+ tools.set('get_site', { definition: getSite_1.getSiteDefinition, handler: getSite_1.getSite });
46
+ tools.set('start_site', { definition: startSite_1.startSiteDefinition, handler: startSite_1.startSite });
47
+ tools.set('stop_site', { definition: stopSite_1.stopSiteDefinition, handler: stopSite_1.stopSite });
48
+ tools.set('restart_site', { definition: restartSite_1.restartSiteDefinition, handler: restartSite_1.restartSite });
49
+ // Site operations
50
+ tools.set('create_site', { definition: createSite_1.createSiteDefinition, handler: createSite_1.createSite });
51
+ tools.set('delete_site', { definition: deleteSite_1.deleteSiteDefinition, handler: deleteSite_1.deleteSite });
52
+ tools.set('clone_site', { definition: cloneSite_1.cloneSiteDefinition, handler: cloneSite_1.cloneSite });
53
+ tools.set('export_site', { definition: exportSite_1.exportSiteDefinition, handler: exportSite_1.exportSite });
54
+ tools.set('open_site', { definition: openSite_1.openSiteDefinition, handler: openSite_1.openSite });
55
+ // WordPress CLI
56
+ tools.set('wp_cli', { definition: wpCli_1.wpCliDefinition, handler: wpCli_1.wpCli });
57
+ // Blueprints
58
+ tools.set('list_blueprints', { definition: listBlueprints_1.listBlueprintsDefinition, handler: listBlueprints_1.listBlueprints });
59
+ tools.set('save_blueprint', { definition: saveBlueprint_1.saveBlueprintDefinition, handler: saveBlueprint_1.saveBlueprint });
60
+ // System info
61
+ tools.set('get_local_info', { definition: getLocalInfo_1.getLocalInfoDefinition, handler: getLocalInfo_1.getLocalInfo });
62
+ // Phase 8: WordPress Development Tools
63
+ tools.set('export_database', { definition: exportDatabase_1.exportDatabaseDefinition, handler: exportDatabase_1.exportDatabase });
64
+ tools.set('import_database', { definition: importDatabase_1.importDatabaseDefinition, handler: importDatabase_1.importDatabase });
65
+ tools.set('open_adminer', { definition: openAdminer_1.openAdminerDefinition, handler: openAdminer_1.openAdminer });
66
+ tools.set('trust_ssl', { definition: trustSsl_1.trustSslDefinition, handler: trustSsl_1.trustSsl });
67
+ tools.set('rename_site', { definition: renameSite_1.renameSiteDefinition, handler: renameSite_1.renameSite });
68
+ tools.set('change_php_version', {
69
+ definition: changePhpVersion_1.changePhpVersionDefinition,
70
+ handler: changePhpVersion_1.changePhpVersion,
71
+ });
72
+ tools.set('import_site', { definition: importSite_1.importSiteDefinition, handler: importSite_1.importSite });
73
+ // Phase 9: Site Configuration & Dev Tools
74
+ tools.set('toggle_xdebug', { definition: toggleXdebug_1.toggleXdebugDefinition, handler: toggleXdebug_1.toggleXdebug });
75
+ tools.set('get_site_logs', { definition: getSiteLogs_1.getSiteLogsDefinition, handler: getSiteLogs_1.getSiteLogs });
76
+ tools.set('list_services', { definition: listServices_1.listServicesDefinition, handler: listServices_1.listServices });
77
+ }
78
+ /**
79
+ * Get all tool definitions (for MCP tools/list response)
80
+ */
81
+ function getToolDefinitions() {
82
+ return Array.from(tools.values()).map((t) => t.definition);
83
+ }
84
+ /**
85
+ * Get tool names
86
+ */
87
+ function getToolNames() {
88
+ return Array.from(tools.keys());
89
+ }
90
+ /**
91
+ * Execute a tool by name
92
+ */
93
+ async function executeTool(name, args, services) {
94
+ const tool = tools.get(name);
95
+ if (!tool) {
96
+ return {
97
+ content: [{ type: 'text', text: `Unknown tool: ${name}` }],
98
+ isError: true,
99
+ };
100
+ }
101
+ try {
102
+ return await tool.handler(args, services);
103
+ }
104
+ catch (error) {
105
+ return {
106
+ content: [{ type: 'text', text: `Tool error: ${error.message}` }],
107
+ isError: true,
108
+ };
109
+ }
110
+ }
111
+ /**
112
+ * Check if a tool exists
113
+ */
114
+ function hasTool(name) {
115
+ return tools.has(name);
116
+ }
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbWFpbi9tY3AvdG9vbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7QUE2Q0gsc0NBeUNDO0FBS0QsZ0RBRUM7QUFLRCxvQ0FFQztBQUtELGtDQXNCQztBQUtELDBCQUVDO0FBbklELDJDQUE2RDtBQUM3RCwyQ0FBNkQ7QUFDN0QseUNBQTBEO0FBQzFELCtDQUFtRTtBQUNuRSxtQ0FBaUQ7QUFDakQsdUNBQXVEO0FBQ3ZELDZDQUFnRTtBQUNoRSw2Q0FBZ0U7QUFDaEUsaURBQXNFO0FBQ3RFLHlDQUEwRDtBQUMxRCwyQ0FBNkQ7QUFDN0QsNkNBQWdFO0FBQ2hFLHFEQUE0RTtBQUM1RSxtREFBeUU7QUFDekUsdUNBQXVDO0FBQ3ZDLHFEQUE0RTtBQUM1RSxxREFBNEU7QUFDNUUsK0NBQW1FO0FBQ25FLHlDQUEwRDtBQUMxRCw2Q0FBZ0U7QUFDaEUseURBQWtGO0FBQ2xGLDZDQUFnRTtBQUNoRSwwQ0FBMEM7QUFDMUMsaURBQXNFO0FBQ3RFLCtDQUFtRTtBQUNuRSxpREFBc0U7QUFZdEUsTUFBTSxLQUFLLEdBQWtDLElBQUksR0FBRyxFQUFFLENBQUM7QUFFdkQ7O0dBRUc7QUFDSCxTQUFnQixhQUFhO0lBQzNCLHVCQUF1QjtJQUN2QixLQUFLLENBQUMsR0FBRyxDQUFDLFlBQVksRUFBRSxFQUFFLFVBQVUsRUFBRSwrQkFBbUIsRUFBRSxPQUFPLEVBQUUscUJBQVMsRUFBRSxDQUFDLENBQUM7SUFDakYsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsMkJBQWlCLEVBQUUsT0FBTyxFQUFFLGlCQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLEtBQUssQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLEVBQUUsVUFBVSxFQUFFLCtCQUFtQixFQUFFLE9BQU8sRUFBRSxxQkFBUyxFQUFFLENBQUMsQ0FBQztJ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SUFBQyxPQUFPLEtBQVUsRUFBRSxDQUFDO1FBQ3BCLE9BQU87WUFDTCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGVBQWUsS0FBSyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDakUsT0FBTyxFQUFFLElBQUk7U0FDZCxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQWdCLE9BQU8sQ0FBQyxJQUFZO0lBQ2xDLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN6QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNQ1AgVG9vbHMgUmVnaXN0cnlcbiAqIENlbnRyYWwgcmVnaXN0cnkgZm9yIGFsbCBhdmFpbGFibGUgTUNQIHRvb2xzXG4gKi9cblxuaW1wb3J0IHsgTWNwVG9vbERlZmluaXRpb24sIE1jcFRvb2xSZXN1bHQsIExvY2FsU2VydmljZXMgfSBmcm9tICcuLi8uLi8uLi9jb21tb24vdHlwZXMnO1xuaW1wb3J0IHsgbGlzdFNpdGVzLCBsaXN0U2l0ZXNEZWZpbml0aW9uIH0gZnJvbSAnLi9saXN0U2l0ZXMnO1xuaW1wb3J0IHsgc3RhcnRTaXRlLCBzdGFydFNpdGVEZWZpbml0aW9uIH0gZnJvbSAnLi9zdGFydFNpdGUnO1xuaW1wb3J0IHsgc3RvcFNpdGUsIHN0b3BTaXRlRGVmaW5pdGlvbiB9IGZyb20gJy4vc3RvcFNpdGUnO1xuaW1wb3J0IHsgcmVzdGFydFNpdGUsIHJlc3RhcnRTaXRlRGVmaW5pdGlvbiB9IGZyb20gJy4vcmVzdGFydFNpdGUnO1xuaW1wb3J0IHsgd3BDbGksIHdwQ2xpRGVmaW5pdGlvbiB9IGZyb20gJy4vd3BDbGknO1xuaW1wb3J0IHsgZ2V0U2l0ZSwgZ2V0U2l0ZURlZmluaXRpb24gfSBmcm9tICcuL2dldFNpdGUnO1xuaW1wb3J0IHsgY3JlYXRlU2l0ZSwgY3JlYXRlU2l0ZURlZmluaXRpb24gfSBmcm9tICcuL2NyZWF0ZVNpdGUnO1xuaW1wb3J0IHsgZGVsZXRlU2l0ZSwgZGVsZXRlU2l0ZURlZmluaXRpb24gfSBmcm9tICcuL2RlbGV0ZVNpdGUnO1xuaW1wb3J0IHsgZ2V0TG9jYWxJbmZvLCBnZXRMb2NhbEluZm9EZWZpbml0aW9uIH0gZnJvbSAnLi9nZXRMb2NhbEluZm8nO1xuaW1wb3J0IHsgb3BlblNpdGUsIG9wZW5TaXRlRGVmaW5pdGlvbiB9IGZyb20gJy4vb3BlblNpdGUnO1xuaW1wb3J0IHsgY2xvbmVTaXRlLCBjbG9uZVNpdGVEZWZpbml0aW9uIH0gZnJvbSAnLi9jbG9uZVNpdGUnO1xuaW1wb3J0IHsgZXhwb3J0U2l0ZSwgZXhwb3J0U2l0ZURlZmluaXRpb24gfSBmcm9tICcuL2V4cG9ydFNpdGUnO1xuaW1wb3J0IHsgbGlzdEJsdWVwcmludHMsIGxpc3RCbHVlcHJpbnRzRGVmaW5pdGlvbiB9IGZyb20gJy4vbGlzdEJsdWVwcmludHMnO1xuaW1wb3J0IHsgc2F2ZUJsdWVwcmludCwgc2F2ZUJsdWVwcmludERlZmluaXRpb24gfSBmcm9tICcuL3NhdmVCbHVlcHJpbnQnO1xuLy8gUGhhc2UgODogV29yZFByZXNzIERldmVsb3BtZW50IFRvb2xzXG5pbXBvcnQgeyBleHBvcnREYXRhYmFzZSwgZXhwb3J0RGF0YWJhc2VEZWZpbml0aW9uIH0gZnJvbSAnLi9leHBvcnREYXRhYmFzZSc7XG5pbXBvcnQgeyBpbXBvcnREYXRhYmFzZSwgaW1wb3J0RGF0YWJhc2VEZWZpbml0aW9uIH0gZnJvbSAnLi9pbXBvcnREYXRhYmFzZSc7XG5pbXBvcnQgeyBvcGVuQWRtaW5lciwgb3BlbkFkbWluZXJEZWZpbml0aW9uIH0gZnJvbSAnLi9vcGVuQWRtaW5lcic7XG5pbXBvcnQgeyB0cnVzdFNzbCwgdHJ1c3RTc2xEZWZpbml0aW9uIH0gZnJvbSAnLi90cnVzdFNzbCc7XG5pbXBvcnQgeyByZW5hbWVTaXRlLCByZW5hbWVTaXRlRGVmaW5pdGlvbiB9IGZyb20gJy4vcmVuYW1lU2l0ZSc7XG5pbXBvcnQgeyBjaGFuZ2VQaHBWZXJzaW9uLCBjaGFuZ2VQaHBWZXJzaW9uRGVmaW5pdGlvbiB9IGZyb20gJy4vY2hhbmdlUGhwVmVyc2lvbic7XG5pbXBvcnQgeyBpbXBvcnRTaXRlLCBpbXBvcnRTaXRlRGVmaW5pdGlvbiB9IGZyb20gJy4vaW1wb3J0U2l0ZSc7XG4vLyBQaGFzZSA5OiBTaXRlIENvbmZpZ3VyYXRpb24gJiBEZXYgVG9vbHNcbmltcG9ydCB7IHRvZ2dsZVhkZWJ1ZywgdG9nZ2xlWGRlYnVnRGVmaW5pdGlvbiB9IGZyb20gJy4vdG9nZ2xlWGRlYnVnJztcbmltcG9ydCB7IGdldFNpdGVMb2dzLCBnZXRTaXRlTG9nc0RlZmluaXRpb24gfSBmcm9tICcuL2dldFNpdGVMb2dzJztcbmltcG9ydCB7IGxpc3RTZXJ2aWNlcywgbGlzdFNlcnZpY2VzRGVmaW5pdGlvbiB9IGZyb20gJy4vbGlzdFNlcnZpY2VzJztcblxuZXhwb3J0IHR5cGUgVG9vbEhhbmRsZXIgPSAoXG4gIGFyZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBzZXJ2aWNlczogTG9jYWxTZXJ2aWNlc1xuKSA9PiBQcm9taXNlPE1jcFRvb2xSZXN1bHQ+O1xuXG5pbnRlcmZhY2UgVG9vbFJlZ2lzdHJhdGlvbiB7XG4gIGRlZmluaXRpb246IE1jcFRvb2xEZWZpbml0aW9uO1xuICBoYW5kbGVyOiBUb29sSGFuZGxlcjtcbn1cblxuY29uc3QgdG9vbHM6IE1hcDxzdHJpbmcsIFRvb2xSZWdpc3RyYXRpb24+ID0gbmV3IE1hcCgpO1xuXG4vKipcbiAqIFJlZ2lzdGVyIGFsbCBhdmFpbGFibGUgdG9vbHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyVG9vbHMoKTogdm9pZCB7XG4gIC8vIENvcmUgc2l0ZSBtYW5hZ2VtZW50XG4gIHRvb2xzLnNldCgnbGlzdF9zaXRlcycsIHsgZGVmaW5pdGlvbjogbGlzdFNpdGVzRGVmaW5pdGlvbiwgaGFuZGxlcjogbGlzdFNpdGVzIH0pO1xuICB0b29scy5zZXQoJ2dldF9zaXRlJywgeyBkZWZpbml0aW9uOiBnZXRTaXRlRGVmaW5pdGlvbiwgaGFuZGxlcjogZ2V0U2l0ZSB9KTtcbiAgdG9vbHMuc2V0KCdzdGFydF9zaXRlJywgeyBkZWZpbml0aW9uOiBzdGFydFNpdGVEZWZpbml0aW9uLCBoYW5kbGVyOiBzdGFydFNpdGUgfSk7XG4gIHRvb2xzLnNldCgnc3RvcF9zaXRlJywgeyBkZWZpbml0aW9uOiBzdG9wU2l0ZURlZmluaXRpb24sIGhhbmRsZXI6IHN0b3BTaXRlIH0pO1xuICB0b29scy5zZXQoJ3Jlc3RhcnRfc2l0ZScsIHsgZGVmaW5pdGlvbjogcmVzdGFydFNpdGVEZWZpbml0aW9uLCBoYW5kbGVyOiByZXN0YXJ0U2l0ZSB9KTtcblxuICAvLyBTaXRlIG9wZXJhdGlvbnNcbiAgdG9vbHMuc2V0KCdjcmVhdGVfc2l0ZScsIHsgZGVmaW5pdGlvbjogY3JlYXRlU2l0ZURlZmluaXRpb24sIGhhbmRsZXI6IGNyZWF0ZVNpdGUgfSk7XG4gIHRvb2xzLnNldCgnZGVsZXRlX3NpdGUnLCB7IGRlZmluaXRpb246IGRlbGV0ZVNpdGVEZWZpbml0aW9uLCBoYW5kbGVyOiBkZWxldGVTaXRlIH0pO1xuICB0b29scy5zZXQoJ2Nsb25lX3NpdGUnLCB7IGRlZmluaXRpb246IGNsb25lU2l0ZURlZmluaXRpb24sIGhhbmRsZXI6IGNsb25lU2l0ZSB9KTtcbiAgdG9vbHMuc2V0KCdleHBvcnRfc2l0ZScsIHsgZGVmaW5pdGlvbjogZXhwb3J0U2l0ZURlZmluaXRpb24sIGhhbmRsZXI6IGV4cG9ydFNpdGUgfSk7XG4gIHRvb2xzLnNldCgnb3Blbl9zaXRlJywgeyBkZWZpbml0aW9uOiBvcGVuU2l0ZURlZmluaXRpb24sIGhhbmRsZXI6IG9wZW5TaXRlIH0pO1xuXG4gIC8vIFdvcmRQcmVzcyBDTElcbiAgdG9vbHMuc2V0KCd3cF9jbGknLCB7IGRlZmluaXRpb246IHdwQ2xpRGVmaW5pdGlvbiwgaGFuZGxlcjogd3BDbGkgfSk7XG5cbiAgLy8gQmx1ZXByaW50c1xuICB0b29scy5zZXQoJ2xpc3RfYmx1ZXByaW50cycsIHsgZGVmaW5pdGlvbjogbGlzdEJsdWVwcmludHNEZWZpbml0aW9uLCBoYW5kbGVyOiBsaXN0Qmx1ZXByaW50cyB9KTtcbiAgdG9vbHMuc2V0KCdzYXZlX2JsdWVwcmludCcsIHsgZGVmaW5pdGlvbjogc2F2ZUJsdWVwcmludERlZmluaXRpb24sIGhhbmRsZXI6IHNhdmVCbHVlcHJpbnQgfSk7XG5cbiAgLy8gU3lzdGVtIGluZm9cbiAgdG9vbHMuc2V0KCdnZXRfbG9jYWxfaW5mbycsIHsgZGVmaW5pdGlvbjogZ2V0TG9jYWxJbmZvRGVmaW5pdGlvbiwgaGFuZGxlcjogZ2V0TG9jYWxJbmZvIH0pO1xuXG4gIC8vIFBoYXNlIDg6IFdvcmRQcmVzcyBEZXZlbG9wbWVudCBUb29sc1xuICB0b29scy5zZXQoJ2V4cG9ydF9kYXRhYmFzZScsIHsgZGVmaW5pdGlvbjogZXhwb3J0RGF0YWJhc2VEZWZpbml0aW9uLCBoYW5kbGVyOiBleHBvcnREYXRhYmFzZSB9KTtcbiAgdG9vbHMuc2V0KCdpbXBvcnRfZGF0YWJhc2UnLCB7IGRlZmluaXRpb246IGltcG9ydERhdGFiYXNlRGVmaW5pdGlvbiwgaGFuZGxlcjogaW1wb3J0RGF0YWJhc2UgfSk7XG4gIHRvb2xzLnNldCgnb3Blbl9hZG1pbmVyJywgeyBkZWZpbml0aW9uOiBvcGVuQWRtaW5lckRlZmluaXRpb24sIGhhbmRsZXI6IG9wZW5BZG1pbmVyIH0pO1xuICB0b29scy5zZXQoJ3RydXN0X3NzbCcsIHsgZGVmaW5pdGlvbjogdHJ1c3RTc2xEZWZpbml0aW9uLCBoYW5kbGVyOiB0cnVzdFNzbCB9KTtcbiAgdG9vbHMuc2V0KCdyZW5hbWVfc2l0ZScsIHsgZGVmaW5pdGlvbjogcmVuYW1lU2l0ZURlZmluaXRpb24sIGhhbmRsZXI6IHJlbmFtZVNpdGUgfSk7XG4gIHRvb2xzLnNldCgnY2hhbmdlX3BocF92ZXJzaW9uJywge1xuICAgIGRlZmluaXRpb246IGNoYW5nZVBocFZlcnNpb25EZWZpbml0aW9uLFxuICAgIGhhbmRsZXI6IGNoYW5nZVBocFZlcnNpb24sXG4gIH0pO1xuICB0b29scy5zZXQoJ2ltcG9ydF9zaXRlJywgeyBkZWZpbml0aW9uOiBpbXBvcnRTaXRlRGVmaW5pdGlvbiwgaGFuZGxlcjogaW1wb3J0U2l0ZSB9KTtcblxuICAvLyBQaGFzZSA5OiBTaXRlIENvbmZpZ3VyYXRpb24gJiBEZXYgVG9vbHNcbiAgdG9vbHMuc2V0KCd0b2dnbGVfeGRlYnVnJywgeyBkZWZpbml0aW9uOiB0b2dnbGVYZGVidWdEZWZpbml0aW9uLCBoYW5kbGVyOiB0b2dnbGVYZGVidWcgfSk7XG4gIHRvb2xzLnNldCgnZ2V0X3NpdGVfbG9ncycsIHsgZGVmaW5pdGlvbjogZ2V0U2l0ZUxvZ3NEZWZpbml0aW9uLCBoYW5kbGVyOiBnZXRTaXRlTG9ncyB9KTtcbiAgdG9vbHMuc2V0KCdsaXN0X3NlcnZpY2VzJywgeyBkZWZpbml0aW9uOiBsaXN0U2VydmljZXNEZWZpbml0aW9uLCBoYW5kbGVyOiBsaXN0U2VydmljZXMgfSk7XG59XG5cbi8qKlxuICogR2V0IGFsbCB0b29sIGRlZmluaXRpb25zIChmb3IgTUNQIHRvb2xzL2xpc3QgcmVzcG9uc2UpXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUb29sRGVmaW5pdGlvbnMoKTogTWNwVG9vbERlZmluaXRpb25bXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRvb2xzLnZhbHVlcygpKS5tYXAoKHQpID0+IHQuZGVmaW5pdGlvbik7XG59XG5cbi8qKlxuICogR2V0IHRvb2wgbmFtZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRvb2xOYW1lcygpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBBcnJheS5mcm9tKHRvb2xzLmtleXMoKSk7XG59XG5cbi8qKlxuICogRXhlY3V0ZSBhIHRvb2wgYnkgbmFtZVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVRvb2woXG4gIG5hbWU6IHN0cmluZyxcbiAgYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNlcnZpY2VzOiBMb2NhbFNlcnZpY2VzXG4pOiBQcm9taXNlPE1jcFRvb2xSZXN1bHQ+IHtcbiAgY29uc3QgdG9vbCA9IHRvb2xzLmdldChuYW1lKTtcblxuICBpZiAoIXRvb2wpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogJ3RleHQnLCB0ZXh0OiBgVW5rbm93biB0b29sOiAke25hbWV9YCB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRvb2wuaGFuZGxlcihhcmdzLCBzZXJ2aWNlcyk7XG4gIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgY29udGVudDogW3sgdHlwZTogJ3RleHQnLCB0ZXh0OiBgVG9vbCBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAgfV0sXG4gICAgICBpc0Vycm9yOiB0cnVlLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHRvb2wgZXhpc3RzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNUb29sKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9vbHMuaGFzKG5hbWUpO1xufVxuIl19
@@ -0,0 +1,7 @@
1
+ /**
2
+ * list_blueprints Tool
3
+ * List all available site blueprints
4
+ */
5
+ import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
6
+ export declare const listBlueprintsDefinition: McpToolDefinition;
7
+ export declare function listBlueprints(_args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ /**
3
+ * list_blueprints Tool
4
+ * List all available site blueprints
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.listBlueprintsDefinition = void 0;
8
+ exports.listBlueprints = listBlueprints;
9
+ exports.listBlueprintsDefinition = {
10
+ name: 'list_blueprints',
11
+ description: 'List all available site blueprints (templates)',
12
+ inputSchema: {
13
+ type: 'object',
14
+ properties: {},
15
+ },
16
+ };
17
+ async function listBlueprints(_args, services) {
18
+ try {
19
+ // Check if blueprints service exists
20
+ if (!services.blueprints) {
21
+ return {
22
+ content: [{ type: 'text', text: 'Blueprints service not available' }],
23
+ isError: true,
24
+ };
25
+ }
26
+ const blueprints = await services.blueprints.getBlueprints();
27
+ if (!blueprints || blueprints.length === 0) {
28
+ return {
29
+ content: [{ type: 'text', text: 'No blueprints found. Create one using save_blueprint.' }],
30
+ };
31
+ }
32
+ const blueprintList = blueprints.map((bp) => ({
33
+ id: bp.id,
34
+ name: bp.name,
35
+ description: bp.description || '',
36
+ createdAt: bp.createdAt,
37
+ }));
38
+ return {
39
+ content: [
40
+ {
41
+ type: 'text',
42
+ text: JSON.stringify(blueprintList, null, 2),
43
+ },
44
+ ],
45
+ };
46
+ }
47
+ catch (error) {
48
+ return {
49
+ content: [{ type: 'text', text: `Failed to list blueprints: ${error.message}` }],
50
+ isError: true,
51
+ };
52
+ }
53
+ }
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdEJsdWVwcmludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbWFpbi9tY3AvdG9vbHMvbGlzdEJsdWVwcmludHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRzs7O0FBYUgsd0NBMENDO0FBbkRZLFFBQUEsd0JBQXdCLEdBQXNCO0lBQ3pELElBQUksRUFBRSxpQkFBaUI7SUFDdkIsV0FBVyxFQUFFLGdEQUFnRDtJQUM3RCxXQUFXLEVBQUU7UUFDWCxJQUFJLEVBQUUsUUFBUTtRQUNkLFVBQVUsRUFBRSxFQUFFO0tBQ2Y7Q0FDRixDQUFDO0FBRUssS0FBSyxVQUFVLGNBQWMsQ0FDbEMsS0FBOEIsRUFDOUIsUUFBdUI7SUFFdkIsSUFBSSxDQUFDO1FBQ0gscUNBQXFDO1FBQ3JDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDekIsT0FBTztnQkFDTCxPQUFPLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGtDQUFrQyxFQUFFLENBQUM7Z0JBQ3JFLE9BQU8sRUFBRSxJQUFJO2FBQ2QsQ0FBQztRQUNKLENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxNQUFNLFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLENBQUM7UUFFN0QsSUFBSSxDQUFDLFVBQVUsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzNDLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSx1REFBdUQsRUFBRSxDQUFDO2FBQzNGLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNqRCxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDVCxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUk7WUFDYixXQUFXLEVBQUUsRUFBRSxDQUFDLFdBQVcsSUFBSSxFQUFFO1lBQ2pDLFNBQVMsRUFBRSxFQUFFLENBQUMsU0FBUztTQUN4QixDQUFDLENBQUMsQ0FBQztRQUVKLE9BQU87WUFDTCxPQUFPLEVBQUU7Z0JBQ1A7b0JBQ0UsSUFBSSxFQUFFLE1BQU07b0JBQ1osSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQzdDO2FBQ0Y7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsT0FBTztZQUNMLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsOEJBQThCLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ2hGLE9BQU8sRUFBRSxJQUFJO1NBQ2QsQ0FBQztJQUNKLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBsaXN0X2JsdWVwcmludHMgVG9vbFxuICogTGlzdCBhbGwgYXZhaWxhYmxlIHNpdGUgYmx1ZXByaW50c1xuICovXG5cbmltcG9ydCB7IE1jcFRvb2xEZWZpbml0aW9uLCBNY3BUb29sUmVzdWx0LCBMb2NhbFNlcnZpY2VzIH0gZnJvbSAnLi4vLi4vLi4vY29tbW9uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGxpc3RCbHVlcHJpbnRzRGVmaW5pdGlvbjogTWNwVG9vbERlZmluaXRpb24gPSB7XG4gIG5hbWU6ICdsaXN0X2JsdWVwcmludHMnLFxuICBkZXNjcmlwdGlvbjogJ0xpc3QgYWxsIGF2YWlsYWJsZSBzaXRlIGJsdWVwcmludHMgKHRlbXBsYXRlcyknLFxuICBpbnB1dFNjaGVtYToge1xuICAgIHR5cGU6ICdvYmplY3QnLFxuICAgIHByb3BlcnRpZXM6IHt9LFxuICB9LFxufTtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxpc3RCbHVlcHJpbnRzKFxuICBfYXJnczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHNlcnZpY2VzOiBMb2NhbFNlcnZpY2VzXG4pOiBQcm9taXNlPE1jcFRvb2xSZXN1bHQ+IHtcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiBibHVlcHJpbnRzIHNlcnZpY2UgZXhpc3RzXG4gICAgaWYgKCFzZXJ2aWNlcy5ibHVlcHJpbnRzKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6ICdCbHVlcHJpbnRzIHNlcnZpY2Ugbm90IGF2YWlsYWJsZScgfV0sXG4gICAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGJsdWVwcmludHMgPSBhd2FpdCBzZXJ2aWNlcy5ibHVlcHJpbnRzLmdldEJsdWVwcmludHMoKTtcblxuICAgIGlmICghYmx1ZXByaW50cyB8fCBibHVlcHJpbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29udGVudDogW3sgdHlwZTogJ3RleHQnLCB0ZXh0OiAnTm8gYmx1ZXByaW50cyBmb3VuZC4gQ3JlYXRlIG9uZSB1c2luZyBzYXZlX2JsdWVwcmludC4nIH1dLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBibHVlcHJpbnRMaXN0ID0gYmx1ZXByaW50cy5tYXAoKGJwOiBhbnkpID0+ICh7XG4gICAgICBpZDogYnAuaWQsXG4gICAgICBuYW1lOiBicC5uYW1lLFxuICAgICAgZGVzY3JpcHRpb246IGJwLmRlc2NyaXB0aW9uIHx8ICcnLFxuICAgICAgY3JlYXRlZEF0OiBicC5jcmVhdGVkQXQsXG4gICAgfSkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRlbnQ6IFtcbiAgICAgICAge1xuICAgICAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgICAgICB0ZXh0OiBKU09OLnN0cmluZ2lmeShibHVlcHJpbnRMaXN0LCBudWxsLCAyKSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3I6IGFueSkge1xuICAgIHJldHVybiB7XG4gICAgICBjb250ZW50OiBbeyB0eXBlOiAndGV4dCcsIHRleHQ6IGBGYWlsZWQgdG8gbGlzdCBibHVlcHJpbnRzOiAke2Vycm9yLm1lc3NhZ2V9YCB9XSxcbiAgICAgIGlzRXJyb3I6IHRydWUsXG4gICAgfTtcbiAgfVxufVxuIl19
@@ -0,0 +1,7 @@
1
+ /**
2
+ * list_services Tool
3
+ * List available Lightning Services (PHP, MySQL, Nginx versions)
4
+ */
5
+ import { McpToolDefinition, McpToolResult, LocalServices } from '../../../common/types';
6
+ export declare const listServicesDefinition: McpToolDefinition;
7
+ export declare function listServices(args: Record<string, unknown>, services: LocalServices): Promise<McpToolResult>;